Commit 38fdd1d2 sunke

架构调整

1 个父辈 78b0f051
正在显示 30 个修改的文件 包含 1435 行增加456 行删除
package com.neotel.smfcore.common.base;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
......@@ -54,5 +55,7 @@ public interface IBaseDao {
void updateFirst(Query query, Update update);
MongoTemplate getMongoTemplate();
}
......@@ -209,56 +209,6 @@ public class StorageConstants {
EFFICIENCY,FIFO,USED_FIRST,EXPIRE_FIRST,PRODUCE_DATE;
}
/**
* 物料类型
*/
public static class COMPONENT_TYPE{
public static final int COMPONENT = 0;
/** 锡膏 */
public static final int SOLDERPASTE = 1;
/** PCB板 */
public static final int PCB = 2;
/** 其他物料*/
public static final int OTHERS = 3;
/** 夹具 */
public static final int FIXTURE = 4;
}
/**
* 二维码类型,用于在界面上展示对应的图片
*/
public static enum CODE_TYPE{
COMPONENT,
PCB,
OTHERS,
PCB_FIXTURE,
SOLDER_FIXTURE,
FIXTURE,
/**
* 管装锡膏
*/
TUBE_SOLDER,
/**
* 罐装锡膏
*/
CAN_SOLDER;
public static CODE_TYPE fromComponentType(int type){
switch (type){
case COMPONENT_TYPE.COMPONENT:
return COMPONENT;
case COMPONENT_TYPE.FIXTURE:
return FIXTURE;
case COMPONENT_TYPE.OTHERS:
return OTHERS;
case COMPONENT_TYPE.PCB:
return PCB;
}
return null;
}
}
/**
* 图表展示方式
*/
......
package com.neotel.smfcore.core.barcode.bean;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Calendar;
import java.util.Date;
/**
*
* 条码规则,可用字段有:
* PN为物料编号即 PartNumber
* RI 为唯一码即ReelId,[RI]为所有字符串作为一个唯一码
* QTY 为数量
* PRODATE为生产日期xxPRODATEyyyyMMdd
* EXPDATE为过期日期xxxEXPDATEyyyyMMdd
* SP 为供应商,
* BATCH 为批次
* MSL 为MSL等级
* MEMO 备注信息
*
*
*
*条码规则,可用字段有:
* PN为物料编号即 PartNumber
* RI 为唯一码即ReelId,[RI]为所有字符串作为一个唯一码
* QTY 为数量
* PRODATE为生产日期xxPRODATEyyyyMMdd
* EXPDATE为过期日期xxxEXPDATEyyyyMMdd
* SP 为供应商,
* BATCH 为批次
* MSL 为MSL等级
* 其中必须含有PN和 RI, QTY为空时使用产品档案的封装数量
*
* 前面一位数字大于0表示去除前面第n位, -1表示不去除,并且对字段长数不做限制, 等于0表示不去除,但对字段长度做限制
* 中间一位数字0表示为变长,正值表示从前面截取,负值表示从后面开始截取,前缀和后缀及长度都有效时,需要验证字串总长度
* 后面一位数字大于0表示去除后面第n位, -1表示不去除,并且对字段长数不做限制, 等于0表示不去除,但对字段长度做限制
*
* 例一: QTY[-1:5:-1]取前5位作为数量
* 例二: QTY[-1:-5:-1]取后5位作为数量
* 例三: QTY[1:5:-1]去除前面第1位后,取前5位作为数量
* 例四: QTY[-1:-5:1]去除后面第1位后,取后5位作为数量
* 例五: QTY[1:0:-1]去除前面1位后,剩余的作为数量
* 例六: QTY[0:5:3]去除前面0位和后面3位,剩余的5位作为数量,也就是说只能为8位
*
* 示例:
* 规则为: [RI]_PN_PRODATEyyMMdd_QTY[0:5:4]
* 条码: 4500065747_CS000069_180101_030000041
* 解析后: RI=4500065747_CS000069_180101_030000041
* PN=CS000069
* 生产日期为: 2018年1月1日
* 数量为:去掉前面0位,去掉后面4位,剩下03000正好为5位,所以数量是3000,
* 如果条码变为4500065747_CS000069_180101_0300000410则会提示不合规则,因为去掉前面0位,去掉后面4位,剩下的030004是6位,不是5位
*
* 示例:
* 规则为: BATCH;PRODATEyyyyMMdd[1:8:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI
* 条码为: L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356
* 解析后: PN=8C.R2003.V81
* RI=R506072019102200356
* QTY=3000
* BATCH=L00002019090199951797
* PRODATE=2019年9月1日
* 供应商=50607
*
*
*
* 1@2@3@PN@5@6@7@8@9@10@11@12@13@14@15@16@RI@18@19@20@21@22@23@24
* [)>@06@12S0002@P5292001000@1P1690215@31P1690215@12V527973628@10VCHN-YANTAI@2P@20P@6D20170626@14D20171223@30PY@ZN@K0@16K0@V815@3SB370000000EZZ@Q500GRM000@20T1@1TMT72543954@2T@1Z@@
*
* [@xx@xx@partNO.@xx@xx@xx@xx@xx@生产日期@过期日期@xx@xx@xx@xx@xx@psckid唯一码@重量@xx@xx@xx@xc@@' 
*
* 零包
* [)>@06@12S0002@P8638516895@1P08EFP2285A@31P8638516895@12V315754465@10VCHN-KUNSHAN@2P@20P1-K-PR77-XD7179#QX0#@6D20180216@14D20180816@30PY@ZN@K0@16K0@V97219759@3SS000200062918@Q20NAR000@20T1@1T8021___0718@2T@1Z08EFP2285A@@
* 整包
* [)>@06@12S0002@P8638516895@1P08EFP2285A@31P8638516895@12V315754465@10VCHN-KUNSHAN@2P@20P1-K-PR77-XD7179#QX0#@6D20180216@14D20180816@30PY@ZN@K0@16K0@V97219759@3SS000200062909@Q15NAR000@20T1@1T@2T@1Z08EFP2285A@@
*
* Created by sunke on 2017/3/25.
*/
public class BarcodeRule {
protected final static Logger log = LogManager.getLogger(BarcodeRule.class);
private BarcodeRule() {
}
public static BarcodeRule newRule(String ruleStr){
BarcodeRule newRule = new BarcodeRule();
newRule.ruleStr = ruleStr;
log.info("开始解析二维码规则:" + ruleStr);
if(!Strings.isNullOrEmpty(ruleStr)){
//先去除[prefix,length,suffix]这样的配置字段
String canSplitStr =ruleStr.replaceAll("DATE.*?\\]","");
canSplitStr = canSplitStr.replaceAll("\\[[^\\]]*?\\]","");
//先找分割符,分割出来数组数量最多的放第一个
String trySeparator = "";
//找最多的字符
String[] tempArr = new String[]{};
for (int i = 0; i < canSplitStr.length(); i++) {
char c = canSplitStr.charAt(i);
if(!Character.isLetterOrDigit(c)){
//不是字母和数字才可以作为分割符
String separator = toRegexStr(c + "");
if(trySeparator.indexOf(c) == -1){
String[] ss = ruleStr.split(separator,-1);
if(ss.length > tempArr.length){
trySeparator = c + trySeparator;
newRule.separator = separator;
tempArr = ss;
}else{
trySeparator = trySeparator + c;
}
};
}
}
log.info("分割符为:"+newRule.separator+"长度为:"+tempArr.length);
if(tempArr.length == 0){
tempArr = new String[]{ruleStr};
}
for (int i=0; i<tempArr.length; i++) {
String fieldValue = tempArr[i];
if(!newRule.partNumber_item.hasThisField()){
if(newRule.partNumber_item.matchRule(fieldValue, i)){
log.info("partNumber: 为" + newRule.partNumber_item.toString());
}
}
if(!newRule.whole_reelId_item.hasThisField() && !newRule.reelId_item.hasThisField()){
if(newRule.whole_reelId_item.matchRule(fieldValue, i)){
log.info("whole reelId: 为" + newRule.whole_reelId_item.toString());
}else if(newRule.reelId_item.matchRule(fieldValue, i)){
log.info("reelId: 为" + newRule.reelId_item.toString());
}
}
if(!newRule.batch_item.hasThisField()){
if(newRule.batch_item.matchRule(fieldValue, i)){
log.info("batch: 为" + newRule.batch_item.toString());
}
}
if(!newRule.quantity_item.hasThisField()){
if(newRule.quantity_item.matchRule(fieldValue, i)){
log.info("quantity: 为" + newRule.quantity_item.toString());
}
}
if(!newRule.supplier_item.hasThisField()){
if(newRule.supplier_item.matchRule(fieldValue, i)){
log.info("supplier: 为" + newRule.supplier_item.toString());
}
}
if(!newRule.msl_item.hasThisField()){
if(newRule.msl_item.matchRule(fieldValue, i)){
log.info("MSL: 为" + newRule.msl_item.toString());
}
}
if(!newRule.memo_item.hasThisField()){
if(newRule.memo_item.matchRule(fieldValue, i)){
log.info("MEMO: 为" + newRule.memo_item.toString());
}
}
if(!newRule.produceDate_item.hasThisField()){
if(newRule.produceDate_item.matchRule(fieldValue,i)){
log.info("produceDate: 为" + newRule.produceDate_item.toString());
}
}
if(!newRule.expireDate_item.matchRule(fieldValue,i)){
if(newRule.expireDate_item.matchRule(fieldValue,i)){
log.info("expireDate: 为" + newRule.expireDate_item.toString());
}
}
if(!newRule.expireYear_item.hasThisField() && !newRule.expireMonth_item.hasThisField() && !newRule.expireDay_item.hasThisField()){
if(newRule.expireYear_item.matchRule(fieldValue,i)){
log.info("expireYear: 为" + newRule.expireYear_item.toString());
}else if(newRule.expireMonth_item.matchRule(fieldValue,i)){
log.info("expireMonth: 为" + newRule.expireMonth_item.toString());
}else if(newRule.expireDay_item.matchRule(fieldValue,i)){
log.info("expireDay: 为" + newRule.expireDay_item.toString());
}
}
}
boolean validRule = false;
if(newRule.partNumber_item.hasThisField()){
if(newRule.reelId_item.hasThisField() || newRule.whole_reelId_item.hasThisField()){
validRule = true;
}
}
if(validRule){
newRule.length = tempArr.length;
}else{
log.warn("编码规则中必须包含 RI 和 PN");
}
}
return newRule;
}
private String ruleStr;
private String separator;
private int length = 0;
//private String[] ruleArr = new String[]{};
private RuleItem partNumber_item = new RuleItem("PN");
private RuleItem reelId_item = new RuleItem("RI");
private RuleItem whole_reelId_item = new RuleItem("[RI]");
private RuleItem quantity_item = new RuleItem("QTY");
private RuleItem produceDate_item = new RuleItem("PRODATE");
private RuleItem expireDate_item = new RuleItem("EXPDATE");
private RuleItem expireYear_item = new RuleItem("EXPYEAR");
private RuleItem expireMonth_item = new RuleItem("EXPMONTH");
private RuleItem expireDay_item = new RuleItem("EXPDAY");
private RuleItem supplier_item = new RuleItem("SP");
private RuleItem batch_item = new RuleItem("BATCH");
private RuleItem msl_item = new RuleItem("MSL");
private RuleItem memo_item = new RuleItem("MEMO");
private class RuleItem{
private RuleItem(String ruleName) {
this.name = ruleName;
}
//名称
private String name;
//位置
private int index = -1;
//前缀(-1时表示没有前缀)如果要验证总长度,可设置为0
private int prefix = -1;
private int length = 0;
//后缀(-1时表示没有前缀)如果要验证总长度,可设置为0
private int suffix = -1;
//日期格式
private String formatStr = "";
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", index=" + index +
", prefix='" + prefix + '\'' +
", length='" + length + '\'' +
", suffix='" + suffix + '\'' +
'}';
}
/**
* 解析规则中是否包含本字段
*/
private boolean hasThisField(){
return index != -1;
}
private boolean matchRule(String ruleValue, int ruleIndex){
int nameIndex = ruleValue.indexOf(name);
if(nameIndex >= 0){
int startIndex = ruleValue.indexOf("[",nameIndex + 1 );
if(startIndex > 0){
int endIndex = ruleValue.indexOf("]",nameIndex);
if(endIndex > startIndex){
index = ruleIndex;
String limitStr = ruleValue.substring(startIndex+1,endIndex);
String[] limitInfo = limitStr.split(":");
prefix = Integer.valueOf(limitInfo[0]);
length = Integer.valueOf(limitInfo[1]);
suffix = Integer.valueOf(limitInfo[2]);
if(isDateField()){
//取日期格式
formatStr = ruleValue.substring(nameIndex+name.length(),startIndex);
}
}
}else{
prefix = ruleValue.substring(0,nameIndex).length();
if(isDateField()){
suffix = 0;
formatStr = ruleValue.substring(nameIndex + name.length());
}else{
suffix = ruleValue.substring(nameIndex + name.length()).length();
}
if(prefix == 0){
prefix = -1;
}
if(suffix == 0){
suffix = -1;
}
index = ruleIndex;
}
return true;
}
return false;
}
private boolean isDateField(){
return name.contains("DATE");
}
private String getStrValue(String[] codeArr){
try{
if(index != -1){
String codeValue = codeArr[index];
if(codeValue.length() < prefix + suffix){
return null;
}
//如果有前缀和后缀
if(prefix > 0){
codeValue = codeValue.substring(prefix);
}
if(suffix > 0){
codeValue = codeValue.substring(0, codeValue.length() - suffix);
}
if(length > 0){
if(prefix >=0 && suffix >=0){
if(codeValue.length() != length){
log.info(codeValue + "的长度不是" + length);
return null;
}
}
//从前面取length位
if (codeValue.length() >= length){
return codeValue.substring(0, length);
}
}else if(length < 0){
return codeValue.substring(codeValue.length()+length, codeValue.length());
}
//是否是日期
// if(!isDateField()){
// if(codeValue.length() < suffix){
// return null;
// }
// codeValue = codeValue.substring(0,codeValue.length() - suffix);
// }
return codeValue;
}
}catch (Exception e){
log.error("解析出错:",e);
}
return null;
}
private int getIntValue(String[] codeArr){
String value = getStrValue(codeArr);
if(!Strings.isNullOrEmpty(value)){
try{
return Float.valueOf(value).intValue();
}catch (Exception ex){
log.warn(value + " is not a validate int");
}
}
return -1;
}
private Date getDateValue(String[] codeArr){
String value = getStrValue(codeArr);
if(!Strings.isNullOrEmpty(value)){
try{
//阳光电源有可能是年周,需要转换一下
if(value.endsWith("00")){
log.info("转换日期");
Date time = DateUtil.toDate(value.substring(0,2),"yy");
Calendar c = Calendar.getInstance();
c.setTime(time);
int weekOfYear = Integer.valueOf(value.substring(2,4));
c.set(Calendar.WEEK_OF_YEAR,weekOfYear);
return c.getTime();
}
return DateUtil.toDate(value,formatStr);
}catch (Exception ex){
log.warn(value + " is not a validate date");
}
}
return null;
}
}
public CodeBean toCodeBean(String codeStr){
log.info("开始解析条码["+codeStr+"]");
CodeBean codeBean = new CodeBean();
codeBean.setCodeStr(codeStr);
//是否带有位置信息
float locationX = -1f;
float locationY = -1f;
int reelWidth = -1;
int reelHeight = -1;
//=摄像头编号+条码X坐标x条码Y坐标-料盘尺寸=CODE
//=1+123.4x100.5-7x12=CODE或者7x12=CODE
if(codeStr.startsWith("=") && codeStr.contains("x")){
codeStr = codeStr.substring(1);
String[] arr = codeStr.split("=", 2);
String sizeStr = arr[0];
if(sizeStr.contains("+") && sizeStr.contains("-")){
String[] locationSizeArr = sizeStr.split("-",2);
//尺寸信息
sizeStr = locationSizeArr[1];
String[] locationInfoArr = locationSizeArr[0].split("\\+");
String cameraIndexStr = locationInfoArr[0];
//摄像头编号信息
int cameraIndex = Integer.valueOf(cameraIndexStr);
codeBean.setCameraIndex(cameraIndex);
String locationStr = locationInfoArr[1];
//带有位置信息
String[] locationArr = locationStr.split("x");
locationX = Float.valueOf(locationArr[0].trim());
locationY = Float.valueOf(locationArr[1].trim());
}
//带有料盘宽高信息
if(!Strings.isNullOrEmpty(sizeStr)){
String[] sizeInfoArr = sizeStr.split("x",2);
reelWidth = Integer.parseInt(sizeInfoArr[0].trim());
reelHeight = Integer.parseInt(sizeInfoArr[1].trim());
}
codeBean.setLocationX(locationX);
codeBean.setLocationY(locationY);
codeBean.setReelWidth(reelWidth);
codeBean.setReelHeight(reelHeight);
codeStr = arr[1];
}
codeBean.setCodeStr(codeStr);
if(!isValidRule()){
codeBean.setError("error.barcode.noRule","解析规则未定义");
return codeBean;
}
String[] codeArr = new String[]{codeStr};
if(!Strings.isNullOrEmpty(separator)){
codeArr = codeStr.split(separator,-1);
//条码与规则长度对应不上
if(codeArr.length != length){
log.info("条码["+codeStr+"]与规则【"+ruleStr+"】长度不同");
codeBean.setError("error.barcode.wrongLength",new String[]{}, "条码["+codeStr+"]长度错误");
return codeBean;
}else{
codeArr = codeStr.split(separator,length);
}
}
Barcode b = new Barcode();
String reelId = "";
if(whole_reelId_item.hasThisField()){
reelId = codeStr;
}else{
reelId = reelId_item.getStrValue(codeArr);
}
if(Strings.isNullOrEmpty(reelId)){
log.info("条码解析失败,未找到RI字段");
codeBean.setError("error.barcode.noField",new String[]{"RI"},"条码解析失败,未找到RI字段");
return codeBean;
}
String partNumber = partNumber_item.getStrValue(codeArr);
if(Strings.isNullOrEmpty(partNumber)){
log.info("条码解析失败,未找到PN字段");
codeBean.setError("error.barcode.noField",new String[]{"PN"}, "条码解析失败,未找到PN字段");
return codeBean;
}
if(batch_item.hasThisField()){
String batch = batch_item.getStrValue(codeArr);
b.setBatch(batch);
}
int quantity = 1;
if(quantity_item.hasThisField()){
quantity = quantity_item.getIntValue(codeArr);
if(quantity == -1){
log.info("条码解析失败,未找到QTY 字段");
codeBean.setError("error.barcode.noField",new String[]{"QTY"},"条码解析失败,未找到QTY 字段");
return codeBean;
}
}
Date produceDate= produceDate_item.getDateValue(codeArr);
if(produceDate_item.hasThisField() && produceDate == null){
log.info("条码解析失败,PRODATE字段不合规则");
codeBean.setError("error.barcode.noField",new String[]{"PRODATE"},"条码解析失败,未找到PRODATE字段");
return codeBean;
}
Date expireDate= expireDate_item.getDateValue(codeArr);
if(produceDate != null && expireDate == null){
Calendar c = Calendar.getInstance();
c.setTime(produceDate);
int expYear = expireYear_item.getIntValue(codeArr);
int expMonth = expireMonth_item.getIntValue(codeArr);
int expDay = expireDay_item.getIntValue(codeArr);
boolean hasExpire = false;
if(expYear != -1){
c.add(Calendar.YEAR, expYear);
hasExpire = true;
}else if(expMonth != -1){
c.add(Calendar.MONTH, expMonth);
hasExpire = true;
}else if(expDay != -1){
c.add(Calendar.DAY_OF_YEAR, expDay);
hasExpire = true;
}
if(hasExpire){
expireDate = c.getTime();
}
}
String supplier = supplier_item.getStrValue(codeArr);
String msl = msl_item.getStrValue(codeArr);
if(memo_item.hasThisField()){
String memo = memo_item.getStrValue(codeArr);
b.setMemo(memo);
}
b.setBarcode(reelId);
codeBean.setCodeStr(reelId);
b.setPartNumber(partNumber);
b.setAmount(quantity);
b.setProduceDate(produceDate);
b.setExpireDate(expireDate);
b.setProvider(supplier);
b.setPlateSize(reelWidth);
b.setHeight(reelHeight);
b.setMsl(msl);
codeBean.setBarcode(b);
return codeBean;
}
/**
* 转义正则特殊字符 ($()*+.[]?\^{}
* @return
*/
private static String toRegexStr(String separator){
//转义正则特殊字符 ($()*+.[]?\^{}
return separator.replace("\\", "\\\\").replace("*", "\\*")
.replace("+", "\\+").replace("|", "\\|")
.replace("{", "\\{").replace("}", "\\}")
.replace("(", "\\(").replace(")", "\\)")
.replace("^", "\\^").replace("$", "\\$")
.replace("[", "\\[").replace("]", "\\]")
.replace("?", "\\?").replace(",", "\\,")
.replace(".", "\\.").replace("&", "\\&");
}
/**
* 是否是有效的规则
*/
public boolean isValidRule(){
return length > 0;
}
public static void main(String args[]) throws Exception{
//[)>@06@12S001@P8909000244@1P@31P@10V@2P@20P@6D@14D@30PY@Z @K@16K@V000000@3SA20180913-01554@Q03000NAR000@20T1@1TH000000000B172621166@Q03000@2T@1Z@@
//1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@17@xxRI@xQTYxxxxxx@20@21@22@23@@
String rule = "1@2@3@PN@5@6@7@8@9@10@xxPRODATEyyyyMMdd@xxxEXPDATEyyyyMMdd@13@14@15@16@17@RI@xQTYxxxxxx@20@21@22@23";
rule = "1@2@3@PPN@5@6@7@8@9@10@xxPRODATEyyyyMMdd@xxxEXPDATEyyyyMMdd@13@14@15@16@17@RI@xQTYxxxxxx@20@21@22@23";
rule = "1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@17@xxRI@xQTYxxxxxx@20@21@22@23";
rule = "1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@xxRI@xxQTYxxxxxx@19@20@21@22@23@@";
rule = "1;2;3;PN;QTY;6";
rule = "PN|RI|3|4|5|6|7|8|9|10|11|12|13|14|15|QTYxxx|17";
rule="1@2@3@PPN@5@6@7@8@9@10@xxPRODATEyyMMdd@xxxEXPDATEyyMMdd@13@14@15@16@VSP@3S[RI]@xQTYxxxxxx@20@21@22@23";
//String codeStr = "[)>@06@12S0002@P5292001000@1P1690215@31P1690215@12V527973628@10VCHN-YANTAI@2P@20P@6D20170626@14D20171223@30PY@ZN@K0@16K0@V815@3SB370000000EZZ@Q500GRM000@20T1@1TMT72543954@2T@1Z@@";
String codeStr = "[)>@06@12S001@P8909000244@1P@31P@10V@2P@20P@6D@14D@30PY@Z @K@16K@V000000@3SA20180913-01554@Q03000NAR000@20T1@1TH000000000B172621166@Q03000@2T@1Z@@\n" +
"\n" +
"1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@17@xxRI@xQTYxxxxxx@20@21@22@23@@";
//codeStr = "[)>@06@12S0002@P8638516894@1PB025008SS5107-04@31P8638516894@12V865379333@10VCHN-WUXI@2PV01@20P#QX0#PROBIMER77MA-1@6D20180214@14D20180805@30PY@ZN@K55158066@16K0@V97198306@3SS500000570451@Q20NAR000@20T1@1T35H-0618@2T@1ZTRIPOD@@";
codeStr = "[)>@06@12S001@P8909000244@1P@31P@10V@2P@20P@6D@14D@30PY@Z @K@16K@V000000@3SA20180913-01554@Q03000NAR000@20T1@1TH000000000B172621166@Q03000@2T@1Z@@";
codeStr = ")》@06@120S002@P8908018028@1PBLM18PG121SH1D@31PBLM18PG121SH1D@12V690588124@10VJPN-AM@2P@20P@6D192400@14D210205@30PY@Z1@K0@16K0@V97294419@3SS191908055X1Z@Q4000NAR000@20T1@1TAM961458E@2T@1Z@@";
// codeStr = "=1+0x0-0x0=A0002";
//阳光电源
rule = "[RI]_PN_3_QTYxxxx";
rule = "[RI]_PN_PRODATEyyMMdd_QTY[0:5:4]";
codeStr = "4500065747_CS000069_180101_030000041";
codeStr = "4500089600_DC000045_190528_003000006";
//博郎 QR = [VEE PN] + [Quantity] + [UID] + [Expire date] + [MSD level] + [Light class] + [Color class] + [Forward voltage] + [00000000]
// codeStr = "001967370080049250852020112000010P130BT200MH00000000";
//
// rule = "PN[0:8:-1]QTY[8:5:-1]RI[13:7:-1]EXPDATEyyyyMMdd[20:8:-1]MSL[28:4:-1]BATCH[32:4:-1]SP[36:4:-1]";
// //佳世达
rule ="BATCH;PRODATEyyyy-MM-dd[1:10:-1]EXPD[-1:-4:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI";
codeStr = "L00002019090199951797;E2019-09-01 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
//rule = "1;PN;BATCH;PRODATEyyyyMMdd;EXPDATEyyyyMMdd;QTY;RI";
//codeStr = ";RMK1608-K-B-10300;7B16081217B0;20200506;20250203;5000;000";
//rule = "1;2;PN;BATCH[2:0:-1];5;6;EXPDATEyyyy/MM/dd[2:0:8];QTY[2:0:-1];8;9;10;RI[2:0:-1]";
//codeStr = "锘緿M;IN13浠跺\uE69C缁勮灪涓濇壒09913涓栬揪;BM;PH11A-ZZG02;DDDDMO180525;GG624-71;SX2019/8/25 0:00:00;SL2;HG;DL;ZP;QT90CECB112D1448DA91F485D0AA984B08";
codeStr = "??M8431CZ8133ZHMJQ21EJ3545-2016;IN?????BM6005K01;PH20012005;SC;CJ;LH;DDMO20072200041;CB;SX2023-2-27 0:00:00;SL1;JL;KG;HG;DL;ZP;QT;XT1001AS10000000517DT2;";
rule = "1;2;PN[-1:0:-1];BATCH[-1:0:-1];5;6;7;8;9;EXPDATEyyyy-MM-dd[2:0:8];QTY[2:0:-1];12;13;14;15;16;17;RI[-1:0:-1]";
//rule = "1>PN[-1:0:6]>3>RI[-1:0:6]";
//codeStr = "<ckdh>CC200612000194</ckdh><jybh>ADK20-\n" +"JY19060012~/jybh>";
//rule = "1;2;PN[-1:0:-1];BATCH[-1:0:-1];5;6;7;8;9;EXPDATEyyyy-MM-dd[2:0:8];QTY[2:0:-1];12;13;14;15;16;17;RI[-1:0:-1]";
//codeStr = "DM8431CZ8133ZHMJQ21EJ3545-2016;IN;BM6005K01;PH20012005;SC;CJ;LH;DDMO20072200041;CB;SX2023-2-27 00:10:00;SL1;JL;KG;HG;DL;ZP;QT;XT1001AS10000000517DT2;";
//803
//rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI";
//codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002";
codeStr = "IAC;6013A0073981;20200810;R2032E1128;10000;MI020A600568;";
//codeStr = "IAC;B23D45;20200204;DCRFFD;45;WER23;";
rule = "SP;PN;PRODATEyyw[0:4:0];BATCH;QTY;RI;";
//rule = "SP;PN;PRODATEyyyyMMdd[0:8:0];BATCH;QTY;RI;";
codeStr = "IAC;6014A0489701;HI1206T161R-10;2047;AC20NKA0448KA;2000;VBG204768056";
rule = "SP;PN;3;PRODATEyyw;BATCH;QTY;RI";
codeStr = "=7x8=140032005 18B030918B 200.000 614A 0001045024 0001 20200414-141329";
rule = "PN BATCH QTY[-1:0:1] RI ";
BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode();
if(b != null){
System.out.println("PN:"+b.getPartNumber());
System.out.println("RI:"+b.getBarcode());
System.out.println("Amount:"+b.getAmount());
System.out.println("BATCH:"+b.getBatch());
System.out.println("MSL:"+b.getMsl());
System.out.println("PRODATE:"+b.getProduceDate());
System.out.println("EXPDATE:"+b.getExpireDate());
System.out.println("Supllier:"+b.getProvider());
System.out.println("Memo:"+b.getMemo());
}else{
log.info("解析失败");
}
// URI uri = new URI("smb://materialtower:Flextronics1@10.222.42.48/materialtower/re20190822161258_result.txt");
// String smbFileName = uri.getScheme() + "://" + uri.getHost() + "" + uri.getPath() + "abc.txt";
// System.out.println(smbFileName);
//System.out.println("host : "+SmbUtil.getDomainFromUrl("\\\\192.168.1.100\\materialtower\\"));
}
}
package com.neotel.smfcore.core.barcode.bean;
import com.neotel.smfcore.core.barcode.enums.CODE_TYPE;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
/**
* 用于解析条码
* Created by sunke on 2017/10/10.
*/
public class CodeBean {
/**
* 码类型
*/
private CODE_TYPE codeType;
/**
* 摄像头位置信息
*/
private int cameraIndex = 0;
//扫描到的二维码的位置信息
private float locationX = -1.0f;
private float locationY = -1.0f;
/**
* 用于显示的照片信息
*/
private String showImg = "";
/**
* 料盘宽度
*/
private int reelWidth = -1;
/**
* 料盘高度
*/
private int reelHeight = -1;
private String codeStr = "";
/**
* 错误消息,正常时为空
*/
private String error;
private String errorCode;
private String[] params;
private Barcode barcode;
public String getError() {
return error;
}
public void setError(String errorCode, String[] params,String error) {
this.error = error;
this.errorCode = errorCode;
this.params = params;
}
public void setError(String errorCode, String error) {
this.error = error;
this.errorCode = errorCode;
this.params = null;
}
public Barcode getBarcode() {
return barcode;
}
public void setBarcode(Barcode barcode) {
this.barcode = barcode;
}
public boolean isValid(){
return error == null && barcode != null;
}
/**
* 是否是夹具条码
*/
public boolean isFixtureCode(){
if(isValid()){
return COMPONENT_TYPE.FIXTURE == barcode.getType();
}
return false;
}
public float getLocationX() {
return locationX;
}
public void setLocationX(float locationX) {
this.locationX = locationX;
}
public float getLocationY() {
return locationY;
}
public void setLocationY(float locationY) {
this.locationY = locationY;
}
public CODE_TYPE getCodeType() {
return codeType;
}
public void setCodeType(CODE_TYPE codeType) {
this.codeType = codeType;
}
public String getCodeStr() {
return codeStr;
}
public void setCodeStr(String codeStr) {
this.codeStr = codeStr;
}
public int getCameraIndex() {
return cameraIndex;
}
public void setCameraIndex(int cameraIndex) {
this.cameraIndex = cameraIndex;
}
public int getReelWidth() {
return reelWidth;
}
public void setReelWidth(int reelWidth) {
this.reelWidth = reelWidth;
}
public int getReelHeight() {
return reelHeight;
}
public void setReelHeight(int reelHeight) {
this.reelHeight = reelHeight;
}
public boolean hasReelSizeInfo() {
return reelWidth > 0 && reelHeight > 0;
}
public String getShowImg() {
return showImg;
}
public void setShowImg(String showImg) {
this.showImg = showImg;
}
public void setError(String error) {
this.error = error;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String[] getParams() {
return params;
}
public void setParams(String[] params) {
this.params = params;
}
}
package com.neotel.smfcore.core.service.data;
package com.neotel.smfcore.core.barcode.bean;
import com.neotel.smfcore.common.utils.PLATE_SIZE;
import lombok.Getter;
......
package com.neotel.smfcore.core.barcode.enums;
import com.neotel.smfcore.common.utils.StorageConstants;
/**
* 二维码类型,用于在界面上展示对应的图片
* Created by sunke on 2021/7/13.
*/
public enum CODE_TYPE {
COMPONENT,
PCB,
OTHERS,
PCB_FIXTURE,
SOLDER_FIXTURE,
FIXTURE,
/**
* 管装锡膏
*/
TUBE_SOLDER,
/**
* 罐装锡膏
*/
CAN_SOLDER;
public static CODE_TYPE fromComponentType(int type){
switch (type){
case COMPONENT_TYPE.COMPONENT:
return COMPONENT;
case COMPONENT_TYPE.FIXTURE:
return FIXTURE;
case COMPONENT_TYPE.OTHERS:
return OTHERS;
case COMPONENT_TYPE.PCB:
return PCB;
}
return null;
}
}
package com.neotel.smfcore.core.barcode.enums;
/**
* 物料类型
* Created by sunke on 2021/7/13.
*/
public class COMPONENT_TYPE {
public static final int COMPONENT = 0;
/** 锡膏 */
public static final int SOLDERPASTE = 1;
/** PCB板 */
public static final int PCB = 2;
/** 其他物料*/
public static final int OTHERS = 3;
/** 夹具 */
public static final int FIXTURE = 4;
}
......@@ -3,7 +3,9 @@ package com.neotel.smfcore.core.barcode.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import org.springframework.stereotype.Service;
@Service
public class BarcodeDaoImpl extends AbstractBaseDao implements IBarcodeDao {
@Override
public Class getEntityClass() {
......
......@@ -5,9 +5,11 @@ import com.neotel.smfcore.core.barcode.service.dao.IComponentDao;
import com.neotel.smfcore.core.barcode.service.po.Component;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ComponentDaoImpl extends AbstractBaseDao implements IComponentDao {
@Override
public Class getEntityClass() {
......
......@@ -4,4 +4,7 @@ import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
public interface IBarcodeManager extends IBaseManager<Barcode> {
Barcode findByBarcode(String reelId);
}
......@@ -4,4 +4,5 @@ import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.barcode.service.po.Component;
public interface IComponentManager extends IBaseManager<Component> {
Component findByPartNumberAndProvider(String partNumber, String provider);
}
package com.neotel.smfcore.core.barcode.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
@Service
public class BarcodeManagerImpl implements IBarcodeManager {
@Autowired
private IBarcodeDao barcodeDao;
@Override
public Barcode get(String id) {
return null;
......@@ -33,4 +42,9 @@ public class BarcodeManagerImpl implements IBarcodeManager {
public List<Barcode> findByQuery(Query query) {
return null;
}
@Override
public Barcode findByBarcode(String reelId) {
return barcodeDao.findOneByCondition(new String[]{"barcode"}, new String[]{reelId});
}
}
package com.neotel.smfcore.core.barcode.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.dao.IComponentDao;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Component;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ComponentManagerImpl implements IComponentManager {
@Autowired
private IComponentDao componentDao;
@Override
public Component get(String id) {
return null;
return componentDao.findOneById(id);
}
@Override
public Component save(Component object) throws ValidateException {
return null;
return componentDao.save(object);
}
@Override
......@@ -26,11 +35,28 @@ public class ComponentManagerImpl implements IComponentManager {
@Override
public List<Component> findByPage(Query query, Pageable pageable) {
return null;
return componentDao.findByQuery(query,pageable);
}
@Override
public List<Component> findByQuery(Query query) {
return null;
return componentDao.findOne(query);
}
@Override
public Component findByPartNumberAndProvider(String partNumber, String provider) {
if (StringUtils.isEmpty(partNumber))
return null;
else {
Component component = componentDao.findOneByCondition(new String[] {"partNumber","provider"}, new String[] {partNumber,provider});
if(component == null){
component = componentDao.findOneByCondition(new String[] {"partNumber","provider"}, new String[] {partNumber,null});
if(component != null){
component.setProvider(provider);
component = componentDao.save(component);
}
}
return component;
}
}
}
......@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import lombok.Data;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -19,7 +20,7 @@ public class Barcode extends BasePo implements Serializable {
/**
* 物料类型:PCB,锡膏,或其他
*/
private int type = StorageConstants.COMPONENT_TYPE.COMPONENT;
private int type = COMPONENT_TYPE.COMPONENT;
//锡膏回温时间,小于回温时间不可出库
private int warmTime = 0;
......@@ -140,7 +141,7 @@ public class Barcode extends BasePo implements Serializable {
* 是否是锡膏
*/
public boolean isSolder(){
return type == StorageConstants.COMPONENT_TYPE.SOLDERPASTE;
return type == COMPONENT_TYPE.SOLDERPASTE;
}
public List<String> getRelationCodes() {
if (relationCodes == null) {
......@@ -227,7 +228,7 @@ public class Barcode extends BasePo implements Serializable {
*/
public long getReachWarmTime(){
long reachWarmTime = System.currentTimeMillis();
if(StorageConstants.COMPONENT_TYPE.SOLDERPASTE == type && putInTime != -1){
if(COMPONENT_TYPE.SOLDERPASTE == type && putInTime != -1){
reachWarmTime = putInTime + warmTime * 60 * 60 * 1000;
}
return reachWarmTime;
......
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.barcode.service.po;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.sun.istack.internal.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -16,7 +17,7 @@ public class Component extends BasePo implements Serializable {
/**
* 产品类型:0元器件,1锡膏2PCB3其他4夹具
*/
private int type = StorageConstants.COMPONENT_TYPE.COMPONENT;
private int type = COMPONENT_TYPE.COMPONENT;
/**
* 产品型号
......@@ -142,7 +143,7 @@ public class Component extends BasePo implements Serializable {
if(plateSize == 0 || height == 0){
return "";
}
if(type == StorageConstants.COMPONENT_TYPE.FIXTURE){
if(type == COMPONENT_TYPE.FIXTURE){
return plateSize + "x" +height+"x" + partNumber;
}
......@@ -160,6 +161,6 @@ public class Component extends BasePo implements Serializable {
* 是否是锡膏
*/
public boolean isSolder(){
return type == StorageConstants.COMPONENT_TYPE.SOLDERPASTE;
return type == COMPONENT_TYPE.SOLDERPASTE;
}
}
package com.neotel.smfcore.core.barcode.utils;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.barcode.bean.BarcodeRule;
import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* Created by sunke on 2021/7/13.
*/
@Slf4j
@Service
public class CodeResolve {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IComponentManager componentManager;
private List<BarcodeRule> barcodeRuleList;
public void updateBarcodeRuleList(List<String> ruleList){
barcodeRuleList = Lists.newArrayList();
for(String codeRule : ruleList){
if(!Strings.isNullOrEmpty(codeRule)){
barcodeRuleList.add(BarcodeRule.newRule(codeRule));
}
}
}
/**
* 解析条码为单个 Barcode
*/
public CodeBean resolveSingleCode(String barcodeItemStr){
if(barcodeRuleList == null || barcodeRuleList.isEmpty()){
CodeBean codeBean = new CodeBean();
codeBean.setBarcode(null);
codeBean.setError("error.barcode.noRules", "解析规则未定义");
codeBean.setCodeStr(barcodeItemStr);
return codeBean;
}
CodeBean codeBeanFromRule = null;
Barcode barcode = null;
if(barcodeRuleList.isEmpty()){
//没有配置规则的话,直接从数据库中查询
barcode = barcodeManager.findByBarcode(barcodeItemStr);
if(barcode != null) {
codeBeanFromRule = new CodeBean();
codeBeanFromRule.setError(null,null);
codeBeanFromRule.setCodeStr(barcode.getBarcode());
codeBeanFromRule.setBarcode(barcode);
// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
// codeBeanFromRule.setShowImg(component.getShowImg());
return codeBeanFromRule;
}
}
//每个规则尝试解析一次
for (BarcodeRule codeRule : barcodeRuleList){
codeBeanFromRule = codeRule.toCodeBean(barcodeItemStr);
//查看数据库中是否已存在
String codeStr = codeBeanFromRule.getCodeStr();
barcode = barcodeManager.findByBarcode(codeStr);
if(barcode != null) {//数据库中已存在
if(codeBeanFromRule.hasReelSizeInfo()){
//如果客户端传入的有尺寸,但尺寸不一致,使用上传上来的尺寸
if(barcode.getHeight() != codeBeanFromRule.getReelHeight() || barcode.getPlateSize() != codeBeanFromRule.getReelWidth()){
try{
log.warn("重新设置尺寸["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
barcode.setPlateSize(codeBeanFromRule.getReelWidth());
barcode.setHeight(codeBeanFromRule.getReelHeight());
barcode = barcodeManager.save(barcode);
}catch (Exception ve){
log.error("重设尺寸出错",ve);
}
}
}
Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider());
int validDay = 0;
if(component != null){
validDay = component.getValidDay();
codeBeanFromRule.setShowImg(component.getShowImg());
}
Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
if(barcodeFromRule != null){
boolean needUpdate = false;
int lastLabelAmount = barcode.getLabelAmount();
int currentLabelAmount = barcodeFromRule.getAmount();
if(currentLabelAmount != lastLabelAmount){
//本次解析出来的数量与上次条码解析出来的数量不一样,重新设置数量
log.info("重新设置"+codeBeanFromRule.getCodeStr()+"数量为:"+currentLabelAmount);
barcode.setAmount(currentLabelAmount);
barcode.setLabelAmount(currentLabelAmount);
needUpdate = true;
}
// Date produceDate = barcodeFromRule.getProduceDate();
// if(produceDate != null){
// //抓取到了生产日期,未抓取到过期日期,重新设置过期日期
// if(barcode.getExpireDate() == null){
// if(validDay > 0){
// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期和过期日期");
// Date expireDate = DateUtil.addDays(produceDate, validDay);
// barcode.setExpireDate(expireDate);
// barcode.setProduceDate(produceDate);
// needUpdate = true;
// }
// }
// }
if(needUpdate){
try {
barcodeManager.save(barcode);
}catch (Exception e){
log.error("",e);
}
}
}
codeBeanFromRule.setError(null,null);
codeBeanFromRule.setCodeStr(barcode.getBarcode());
codeBeanFromRule.setBarcode(barcode);
return codeBeanFromRule;
}else if(codeBeanFromRule.isValid()){//数据库中不存在,但解析成功
Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
try{
//如果有料盘尺寸,重新设置料盘尺寸信息,没有档案时自动添加档案
if(codeBeanFromRule.hasReelSizeInfo()){
//log.info("料盘["+barcode.getBarcode()+"]的尺寸信息从["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]设置为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
if(component == null){
log.info("自动添加["+barcodeFromRule.getPartNumber()+"]["+barcodeFromRule.getProvider()+"]的档案信息["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
component = new Component();
component.setPartNumber(barcodeFromRule.getPartNumber());
component.setAmount(barcodeFromRule.getAmount());
component.setPlateSize(barcodeFromRule.getPlateSize());
component.setHeight(barcodeFromRule.getHeight());
component.setName(barcodeFromRule.getPartNumber());
component.setProvider(barcodeFromRule.getProvider());
componentManager.save(component);
}else{
//如果 barcode 里的料盘信息比 Component 中的大,使用比较大的,防止放不进去撞击
if(codeBeanFromRule.getReelHeight() > component.getHeight() || codeBeanFromRule.getReelWidth() > component.getPlateSize()){
log.info("更新物料["+component.getPartNumber()+"]档案尺寸["+component.getPlateSize()+"x"+component.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
component.setPlateSize(barcodeFromRule.getPlateSize());
component.setHeight(barcodeFromRule.getHeight());
componentManager.save(component);
}
codeBeanFromRule.setShowImg(component.getShowImg());
}
}
boolean needAddNew = true;
if(needAddNew){
log.info("自动添加条码"+barcodeItemStr+"到数据库中");
Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
if(component == null){
log.info("档案["+barcodeFromRule.getPartNumber()+"]不存在");
throw new ValidateException("component.error.notExist",new String[]{barcodeFromRule.getPartNumber()});
}
codeBeanFromRule.setShowImg(component.getShowImg());
Date produceDate = barcodeFromRule.getProduceDate();
if(produceDate != null && barcodeFromRule.getExpireDate() == null){
int validDay = component.getValidDay();
if( validDay > 0){
log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
Date expireDate = DateUtil.addDays(produceDate, validDay);
barcodeFromRule.setExpireDate(expireDate);
barcodeManager.save(barcodeFromRule);
}
}
barcode = barcodeManager.save(barcodeFromRule);
codeBeanFromRule.setCodeStr(barcode.getBarcode());
codeBeanFromRule.setBarcode(barcode);
codeBeanFromRule.setError(null,null);
}
}catch (ValidateException ve){
//档案不存在
codeBeanFromRule.setError("error.barcode.pnNotExist",new String[]{barcodeFromRule.getPartNumber()},"x档案 "+barcodeFromRule.getPartNumber()+" 不存在");
log.warn("x档案"+barcodeFromRule.getPartNumber()+"不存在");
}
//解析成功了,直接返回
return codeBeanFromRule;
}else{
//在数据库中不存在,且未解析成功,用其他规则再解析
codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
}
}
if(codeBeanFromRule == null){
codeBeanFromRule = new CodeBean();
codeBeanFromRule.setBarcode(null);
codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
codeBeanFromRule.setCodeStr(barcodeItemStr);
return codeBeanFromRule;
}
return codeBeanFromRule;
}
public Collection<CodeBean> resolveCodeStr(String codeStr){
List<CodeBean> codeBeans = Lists.newArrayList();
//Map<String, CodeBean> codeBeanMap = Maps.newHashMap();
if(!Strings.isNullOrEmpty(codeStr)){
//双##号分割多个二维码
String[] barcodeItemStrs = codeStr.split("##");
//需要检查partNumber 是否一致
//Multiset<String> partNumberMultiset = HashMultiset.create();
//含有最多的 partNumber
//String mostPartNumber = "";
for (String barcodeItemStr : barcodeItemStrs){
CodeBean codeBean = resolveSingleCode(barcodeItemStr);
if(codeBean == null){
continue;
}
boolean hasSameCode = false;
if(codeBean.isValid()){
//过滤唯一码重复的,防止即扫到二维码也扫到一维码会有多个条码的问题
for (CodeBean bean : codeBeans) {
if(bean.isValid()){
String reelId = codeBean.getBarcode().getBarcode();
if(reelId.equals(bean.getBarcode().getBarcode())){
hasSameCode = true;
log.info(reelId + "与已有效条码一样,忽略");
break;
}
}
}
}
if(!hasSameCode){
codeBeans.add(codeBean);
}
//统计非夹具的 partNubmer
// if(codeBean.isValid() && !codeBean.isFixtureCode()){
// String partNumber = codeBean.getBarcode().getPartNumber();
// partNumberMultiset.add(partNumber);
// if(partNumberMultiset.count(partNumber) > partNumberMultiset.count(mostPartNumber) ){
// mostPartNumber = partNumber;
// }
// }
}
// for (CodeBean codeBean : codeBeans) {
// if(codeBean.isValid() && !codeBean.isFixtureCode()){
// //非夹具的 partNumber 不一致
// if(!mostPartNumber.equals(codeBean.getBarcode().getPartNumber())){
// codeBean.setError("error.barcode.wrongPn", "PartNumber不一致");
// }
// }
// codeBeanMap.put(codeBean.getCodeStr(), codeBean);
// }
}
//return codeBeanMap.values();
return codeBeans;
}
/**
* 从条码信息中解析出一个有效条码
* @param codeStr
* @return
*/
public Barcode resolveOneValideBarcode(String codeStr) throws ValidateException{
if(org.apache.logging.log4j.util.Strings.isBlank(codeStr)){
throw new ValidateException("error.barcode.empty","未扫到条码");
}
Collection<CodeBean> codeBeans = resolveCodeStr(codeStr);
Barcode barcode = null;
String errorMsg = "";
for (CodeBean codeBean : codeBeans) {
if(codeBean.isValid()){
Barcode barcodeFromRule = codeBean.getBarcode();
if(barcode == null){
barcode = barcodeFromRule;
}else{
throw new ValidateException("error.barcode.many",new String[]{codeStr},"找到多个有效的条码");
}
}else{
errorMsg = codeBean.getError();
}
}
if(barcode == null){
throw new ValidateException("error.barcode.noValidCode",new String[]{codeBeans.size()+"",codeStr}, "无效的条码");
}
return barcode;
}
}
......@@ -6,7 +6,7 @@ import com.neotel.smfcore.common.enums.DeviceType;
import com.neotel.smfcore.core.device.handler.IDeviceHandler;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.Storage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
......
package com.neotel.smfcore.core.device.util;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.service.dao.ISettingsDao;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.service.manager.IDataLogManager;
import com.neotel.smfcore.core.service.manager.IStorageManager;
import com.neotel.smfcore.core.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.service.po.Settings;
import com.neotel.smfcore.core.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.Storage;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
......@@ -36,8 +37,11 @@ public class DataCache {
@Autowired
private IDataLogManager dataLogManager;
// @Autowired
// private ISettingsDao settingsDao;
@Autowired
private ISettingsDao settingsDao;
@Autowired
private CodeResolve codeResolve;
//
// @Autowired
// private IBarcodeManager barcodeManager;
......@@ -50,10 +54,16 @@ public class DataCache {
// */
// public static Map<String, Boolean> needUpdateHumidityMap = new ConcurrentHashMap<>();
//
// /**
// * 出库方式
// */
// private static Settings settings;
/**
* 出库方式
*/
private static Settings settings;
@PostConstruct
public void initialize() {
settings = getSettings();
}
//
// private static List<BarcodeRule> barcodeRuleList;
//
......@@ -70,309 +80,23 @@ public class DataCache {
// }
//
//
// public Settings getSettings(){
// if(settings == null){
// List<Settings> allSettings = settingsDao.findAll();
// if(allSettings == null || allSettings.isEmpty()){
// settings = new Settings();
// settings.setOutType(StorageConstants.CHECKOUT_TYPE.EFFICIENCY.name());
// settings = settingsDao.save(settings);
// }else{
// settings = allSettings.get(0);
// }
//
// barcodeRuleList = Lists.newArrayList();
// List<String> ruleList = settings.getCodeRuleList();
// String oldCodeRule = settings.getCodeRule();
// if(!Strings.isNullOrEmpty(oldCodeRule)){
// ruleList.add(oldCodeRule);
// settings.setCodeRule("");
// settings.setCodeRuleList(ruleList);
// updateSettings(settings);
// }
//
// for(String codeRule : ruleList){
// if(!Strings.isNullOrEmpty(codeRule)){
// barcodeRuleList.add(BarcodeRule.newRule(codeRule));
// }
// }
// }
// return settings;
// }
//
// /**
// * 解析条码为单个 Barcode
// */
// public CodeBean resolveSingleCode(String barcodeItemStr){
// //防止规则未初始化
// if(barcodeRuleList == null){
// getSettings();
// }
//
// CodeBean codeBeanFromRule = null;
// Barcode barcode = null;
// if(barcodeRuleList.isEmpty()){
// //没有配置规则的话,直接从数据库中查询
// barcode = barcodeManager.findByBarcode(barcodeItemStr);
// if(barcode != null) {
// codeBeanFromRule = new CodeBean();
// codeBeanFromRule.setError(null,null);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
//// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
//// codeBeanFromRule.setShowImg(component.getShowImg());
//
// return codeBeanFromRule;
// }
// }
//
// //每个规则尝试解析一次
// for (BarcodeRule codeRule : barcodeRuleList){
// codeBeanFromRule = codeRule.toCodeBean(barcodeItemStr);
// //查看数据库中是否已存在
// String codeStr = codeBeanFromRule.getCodeStr();
// barcode = barcodeManager.findByBarcode(codeStr);
// if(barcode != null) {//数据库中已存在
// if(codeBeanFromRule.hasReelSizeInfo()){
// //如果客户端传入的有尺寸,但尺寸不一致,使用上传上来的尺寸
// if(barcode.getHeight() != codeBeanFromRule.getReelHeight() || barcode.getPlateSize() != codeBeanFromRule.getReelWidth()){
// try{
// log.warn("重新设置尺寸["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
//
// barcode.setPlateSize(codeBeanFromRule.getReelWidth());
// barcode.setHeight(codeBeanFromRule.getReelHeight());
// barcode = barcodeManager.save(barcode);
// }catch (Exception ve){
// log.error("重设尺寸出错",ve);
// }
// }
// }
// Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider());
// int validDay = 0;
// if(component != null){
// validDay = component.getValidDay();
// codeBeanFromRule.setShowImg(component.getShowImg());
// }
//
// Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
// if(barcodeFromRule != null){
// boolean needUpdate = false;
// int lastLabelAmount = barcode.getLabelAmount();
// int currentLabelAmount = barcodeFromRule.getAmount();
// if(currentLabelAmount != lastLabelAmount){
// //本次解析出来的数量与上次条码解析出来的数量不一样,重新设置数量
// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"数量为:"+currentLabelAmount);
// barcode.setAmount(currentLabelAmount);
// barcode.setLabelAmount(currentLabelAmount);
// needUpdate = true;
// }
//// Date produceDate = barcodeFromRule.getProduceDate();
//// if(produceDate != null){
//// //抓取到了生产日期,未抓取到过期日期,重新设置过期日期
//// if(barcode.getExpireDate() == null){
//// if(validDay > 0){
//// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期和过期日期");
//// Date expireDate = DateUtil.addDays(produceDate, validDay);
//// barcode.setExpireDate(expireDate);
//// barcode.setProduceDate(produceDate);
//// needUpdate = true;
//// }
//// }
//// }
//
// if(needUpdate){
// try {
// barcodeManager.save(barcode);
// }catch (Exception e){
// log.error(e);
// }
// }
// }
//
// codeBeanFromRule.setError(null,null);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
// return codeBeanFromRule;
// }else if(codeBeanFromRule.isValid()){//数据库中不存在,但解析成功
// Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
// try{
// //如果有料盘尺寸,重新设置料盘尺寸信息,没有档案时自动添加档案
// if(codeBeanFromRule.hasReelSizeInfo()){
// //log.info("料盘["+barcode.getBarcode()+"]的尺寸信息从["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]设置为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
//
// if(component == null){
// log.info("自动添加["+barcodeFromRule.getPartNumber()+"]["+barcodeFromRule.getProvider()+"]的档案信息["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// component = new Component();
// component.setPartNumber(barcodeFromRule.getPartNumber());
// component.setAmount(barcodeFromRule.getAmount());
// component.setPlateSize(barcodeFromRule.getPlateSize());
// component.setHeight(barcodeFromRule.getHeight());
// component.setName(barcodeFromRule.getPartNumber());
// component.setProvider(barcodeFromRule.getProvider());
// componentManager.save(component);
// }else{
// //如果 barcode 里的料盘信息比 Component 中的大,使用比较大的,防止放不进去撞击
// if(codeBeanFromRule.getReelHeight() > component.getHeight() || codeBeanFromRule.getReelWidth() > component.getPlateSize()){
// log.info("更新物料["+component.getPartNumber()+"]档案尺寸["+component.getPlateSize()+"x"+component.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// component.setPlateSize(barcodeFromRule.getPlateSize());
// component.setHeight(barcodeFromRule.getHeight());
// componentManager.save(component);
// }
// codeBeanFromRule.setShowImg(component.getShowImg());
// }
//
// }
//
// boolean needAddNew = true;
// if(isProductionFor(CUSTOMER.LIAN_DIAN)){
// //联电的唯一码中必须带有-,否则无效
// if(!barcodeFromRule.getBarcode().contains("-")){
// needAddNew = false;
// log.info("唯一码["+barcodeFromRule.getBarcode()+"]中不带符号-,忽略");
// return null;
// }
// }
// if(needAddNew){
// log.info("自动添加条码"+barcodeItemStr+"到数据库中");
// Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
// if(component == null){
// log.info("档案["+barcodeFromRule.getPartNumber()+"]不存在");
// throw new ValidateException("component.error.notExist",new String[]{barcodeFromRule.getPartNumber()});
// }
//
// codeBeanFromRule.setShowImg(component.getShowImg());
// Date produceDate = barcodeFromRule.getProduceDate();
// if(produceDate != null && barcodeFromRule.getExpireDate() == null){
// int validDay = component.getValidDay();
// if( validDay > 0){
// log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
// Date expireDate = DateUtil.addDays(produceDate, validDay);
// barcodeFromRule.setExpireDate(expireDate);
// barcodeManager.save(barcodeFromRule);
// }
// }
//
// barcode = barcodeManager.save(barcodeFromRule);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
// codeBeanFromRule.setError(null,null);
// }
// }catch (ValidateException ve){
// //档案不存在
// codeBeanFromRule.setError("error.barcode.pnNotExist",new String[]{barcodeFromRule.getPartNumber()},"x档案 "+barcodeFromRule.getPartNumber()+" 不存在");
// log.warn("x档案"+barcodeFromRule.getPartNumber()+"不存在");
// }
// //解析成功了,直接返回
// return codeBeanFromRule;
// }else{
// //在数据库中不存在,且未解析成功,用其他规则再解析
// codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
// }
// }
//
// if(codeBeanFromRule == null){
// codeBeanFromRule = new CodeBean();
// codeBeanFromRule.setBarcode(null);
// codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
// codeBeanFromRule.setCodeStr(barcodeItemStr);
// return codeBeanFromRule;
// }
// return codeBeanFromRule;
// }
//
// public Collection<CodeBean> resolveCodeStr(String codeStr){
// List<CodeBean> codeBeans = Lists.newArrayList();
// //Map<String, CodeBean> codeBeanMap = Maps.newHashMap();
// if(!Strings.isNullOrEmpty(codeStr)){
// //双##号分割多个二维码
// String[] barcodeItemStrs = codeStr.split("##");
//
// //需要检查partNumber 是否一致
// //Multiset<String> partNumberMultiset = HashMultiset.create();
// //含有最多的 partNumber
// //String mostPartNumber = "";
//
//
// for (String barcodeItemStr : barcodeItemStrs){
// CodeBean codeBean = resolveSingleCode(barcodeItemStr);
// if(codeBean == null){
// continue;
// }
// boolean hasSameCode = false;
// if(codeBean.isValid()){
// //过滤唯一码重复的,防止即扫到二维码也扫到一维码会有多个条码的问题
// for (CodeBean bean : codeBeans) {
// if(bean.isValid()){
// String reelId = codeBean.getBarcode().getBarcode();
// if(reelId.equals(bean.getBarcode().getBarcode())){
// hasSameCode = true;
// log.info(reelId + "与已有效条码一样,忽略");
// break;
// }
// }
// }
// }
//
// if(!hasSameCode){
// codeBeans.add(codeBean);
// }
//
// //统计非夹具的 partNubmer
//// if(codeBean.isValid() && !codeBean.isFixtureCode()){
//// String partNumber = codeBean.getBarcode().getPartNumber();
//// partNumberMultiset.add(partNumber);
//// if(partNumberMultiset.count(partNumber) > partNumberMultiset.count(mostPartNumber) ){
//// mostPartNumber = partNumber;
//// }
//// }
// }
//
//
//// for (CodeBean codeBean : codeBeans) {
//// if(codeBean.isValid() && !codeBean.isFixtureCode()){
//// //非夹具的 partNumber 不一致
//// if(!mostPartNumber.equals(codeBean.getBarcode().getPartNumber())){
//// codeBean.setError("error.barcode.wrongPn", "PartNumber不一致");
//// }
//// }
//// codeBeanMap.put(codeBean.getCodeStr(), codeBean);
//// }
// }
// //return codeBeanMap.values();
// return codeBeans;
// }
//
// /**
// * 从条码信息中解析出一个有效条码
// * @param codeStr
// * @return
// */
// public Barcode resolveOneValideBarcode(String codeStr) throws ValidateException{
// if(org.apache.logging.log4j.util.Strings.isBlank(codeStr)){
// throw new ValidateException("error.barcode.empty","未扫到条码");
// }
// Collection<CodeBean> codeBeans = resolveCodeStr(codeStr);
// Barcode barcode = null;
// String errorMsg = "";
// for (CodeBean codeBean : codeBeans) {
// if(codeBean.isValid()){
// Barcode barcodeFromRule = codeBean.getBarcode();
// if(barcode == null){
// barcode = barcodeFromRule;
// }else{
// throw new ValidateException("error.barcode.many",new String[]{codeStr},"找到多个有效的条码");
// }
// }else{
// errorMsg = codeBean.getError();
// }
// }
//
// if(barcode == null){
// throw new ValidateException("error.barcode.noValidCode",new String[]{codeBeans.size()+"",codeStr}, "无效的条码");
// }
// return barcode;
// }
public Settings getSettings(){
if(settings == null){
List<Settings> allSettings = settingsDao.findAll();
if(allSettings == null || allSettings.isEmpty()){
settings = new Settings();
settings.setOutType(StorageConstants.CHECKOUT_TYPE.EFFICIENCY.name());
settings = settingsDao.save(settings);
}else{
settings = allSettings.get(0);
}
List<String> ruleList = settings.getCodeRuleList();
codeResolve.updateBarcodeRuleList(ruleList);
}
return settings;
}
//
// /**
// * 出库方式
......@@ -382,18 +106,13 @@ public class DataCache {
// return StorageConstants.CHECKOUT_TYPE.valueOf(outType);
// }
//
// public Settings updateSettings(Settings newSetting){
// settings = settingsDao.save(newSetting);
// List<String> ruleItems = settings.getCodeRuleList();
// barcodeRuleList = Lists.newArrayList();
// for(String codeRule : ruleItems){
// if(!Strings.isNullOrEmpty(codeRule)){
// barcodeRuleList.add(BarcodeRule.newRule(codeRule));
// }
// }
public Settings updateSettings(Settings newSetting){
settings = settingsDao.save(newSetting);
List<String> ruleItems = settings.getCodeRuleList();
codeResolve.updateBarcodeRuleList(ruleItems);
// needUpdateHumidityMap = new ConcurrentHashMap<>();
// return settings;
// }
return settings;
}
// public List<String> getCids(){
// List<String> cids = new ArrayList<>();
......@@ -440,10 +159,10 @@ public class DataCache {
//
//
//
// /**
// * 所有的料仓 key 为 cid, value 为 Storage
// */
// private static Map<String, Storage> allStorage = new ConcurrentHashMap<>();
/**
* 所有的料仓 key 为 cid, value 为 Storage
*/
private static Map<String, Storage> allStorage = new ConcurrentHashMap<>();
//
//
// /**
......@@ -460,30 +179,30 @@ public class DataCache {
// return storageIds;
// }
//
// public Map<String, Storage> getAllStorage(){
// if(allStorage.isEmpty()){
// synchronized (allStorage){
// if(allStorage.isEmpty()){
// List<Storage> all = storageManager.findAll();
// if(all != null){
// Map<String, Storage> map = new ConcurrentHashMap<>();
// for(Storage storage : all){
//
// List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
// storage.initUsage(plateSizeBeanList);
//
// map.put(storage.getCid(), storage);
//
//
// }
// allStorage = map;
// log.info("加载所有料仓["+all.size()+"]信息到缓存");
// }
// }
// }
// }
// return allStorage;
// }
public Map<String, Storage> getAllStorage(){
if(allStorage.isEmpty()){
synchronized (allStorage){
if(allStorage.isEmpty()){
List<Storage> all = storageManager.findAll();
if(all != null){
Map<String, Storage> map = new ConcurrentHashMap<>();
for(Storage storage : all){
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
storage.initUsage(plateSizeBeanList);
map.put(storage.getCid(), storage);
}
allStorage = map;
log.info("加载所有料仓["+all.size()+"]信息到缓存");
}
}
}
}
return allStorage;
}
//
//
// /**
......@@ -496,16 +215,16 @@ public class DataCache {
// }
// return storageList;
// }
//
// /**
// * 根据 cid 获取料仓信息
// */
// public Storage getStorage(String cid){
// if(Strings.isNullOrEmpty(cid)){
// return null;
// }
// return getAllStorage().get(cid);
// }
/**
* 根据 cid 获取料仓信息
*/
public Storage getStorage(String cid){
if(Strings.isNullOrEmpty(cid)){
return null;
}
return getAllStorage().get(cid);
}
//
// /**
// * 根据 Id 获取料仓信息
......
package com.neotel.smfcore.core.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.service.po.StoragePos;
public interface IStoragePosManager extends IBaseManager<StoragePos> {
}
package com.neotel.smfcore.core.service.data;
package com.neotel.smfcore.core.storage.bean;
import lombok.Data;
......
package com.neotel.smfcore.core.service.dao;
package com.neotel.smfcore.core.storage.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.core.service.dao;
package com.neotel.smfcore.core.storage.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.core.service.dao.impl;
package com.neotel.smfcore.core.storage.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.service.dao.IStorageDao;
import com.neotel.smfcore.core.service.po.Storage;
import com.neotel.smfcore.core.storage.service.dao.IStorageDao;
import com.neotel.smfcore.core.storage.service.po.Storage;
import org.springframework.stereotype.Service;
@Service
......
package com.neotel.smfcore.core.storage.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.storage.service.dao.IStorageDao;
import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import org.springframework.stereotype.Service;
@Service
public class StoragePosDaoImpl extends AbstractBaseDao implements IStoragePosDao {
@Override
public Class getEntityClass() {
return StoragePos.class;
}
}
package com.neotel.smfcore.core.service.manager;
package com.neotel.smfcore.core.storage.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.Storage;
import java.util.List;
......
package com.neotel.smfcore.core.storage.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import java.util.List;
public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<PlateSizeBean> getStoragePosUsage(String storageId);
}
package com.neotel.smfcore.core.service.manager.impl;
package com.neotel.smfcore.core.storage.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.service.dao.IStorageDao;
import com.neotel.smfcore.core.service.manager.IStorageManager;
import com.neotel.smfcore.core.service.po.Storage;
import com.neotel.smfcore.core.storage.service.dao.IStorageDao;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
......
package com.neotel.smfcore.core.service.manager.impl;
package com.neotel.smfcore.core.storage.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.service.po.StoragePos;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StoragePosManagerImpl implements IStoragePosManager {
@Autowired
private IStoragePosDao storagePosDao;
@Override
public List<PlateSizeBean> getStoragePosUsage(String storageId){
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("storageId").is(storageId).and("enabled").is(true)),
Aggregation.group("w","h","used").count().as("count"),
Aggregation.project("count").and("plateSize").previousOperation()
);
AggregationResults<PlateSizeBean> results = storagePosDao.getMongoTemplate().aggregate(agg, StoragePos.class, PlateSizeBean.class);
List<PlateSizeBean> beans = results.getMappedResults();
return beans;
}
@Override
public StoragePos get(String id) {
return null;
return storagePosDao.findOneById(id);
}
@Override
public StoragePos save(StoragePos object) throws ValidateException {
return null;
return storagePosDao.save(object);
}
@Override
......@@ -26,11 +50,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public List<StoragePos> findByPage(Query query, Pageable pageable) {
return null;
return storagePosDao.findByQuery(query,pageable);
}
@Override
public List<StoragePos> findByQuery(Query query) {
return null;
return storagePosDao.findOne(query);
}
}
package com.neotel.smfcore.core.service.po;
package com.neotel.smfcore.core.storage.service.po;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.enums.DeviceType;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.service.data.PlateSizeBean;
import com.neotel.smfcore.core.service.data.UsageItem;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.storage.bean.UsageItem;
import com.sun.istack.internal.NotNull;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
......
package com.neotel.smfcore.core.service.po;
package com.neotel.smfcore.core.storage.service.po;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.base.BasePo;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!