Commit 95f678b7 sunke

修改条码规则,读取数量时读取字符串中连在一起的最大的数

1 个父辈 61fd6d18
......@@ -369,14 +369,14 @@ public class BarcodeRule {
}
if(!Strings.isNullOrEmpty(contains)){
//不是以endWith结尾
//不包含contains
if(!codeValue.contains(contains)){
return null;
}
}
if(!Strings.isNullOrEmpty(endWith)){
//不包含contains
//不是以endWith结尾
if(!codeValue.endsWith(endWith)){
return null;
}
......@@ -426,6 +426,33 @@ public class BarcodeRule {
return -1;
}
/**
* 从字符串中获取连续的最大整数, 如7460S54Q3250将返回7460
*/
private int getMaxIntValue(String[] codeArr){
String valueStr = getStrValue(codeArr);
if(!Strings.isNullOrEmpty(valueStr)){
Integer maxInt = 0;
String tempMaxDigitStr = "";
for (int i = 0; i < valueStr.length(); i++) {
char c = valueStr.charAt(i);
if(Character.isDigit(c)){
tempMaxDigitStr = tempMaxDigitStr + c;
if(tempMaxDigitStr.length() >= maxInt.toString().length()){
int tempInt = Integer.valueOf(tempMaxDigitStr);
if(tempInt > maxInt){
maxInt = tempInt;
}
}
}else{
tempMaxDigitStr = "";
}
}
return maxInt;
}
return -1;
}
private Date getDateValue(String[] codeArr){
String value = getStrValue(codeArr);
if(!Strings.isNullOrEmpty(value)){
......@@ -449,8 +476,15 @@ public class BarcodeRule {
}
}
public CodeBean toCodeBean(String codeStr){
log.info("开始解析条码["+codeStr+"]");
public static void toRule(String codeStr){
String[] codeArr = new String[]{codeStr};
}
/**
* 从条码中解析尺寸和条码
*/
public static CodeBean splitCodeAndSize(String codeStr){
CodeBean codeBean = new CodeBean();
codeBean.setCodeStr(codeStr);
//是否带有位置信息
......@@ -499,10 +533,66 @@ public class BarcodeRule {
}
codeBean.setCodeStr(codeStr);
return codeBean;
}
public CodeBean toCodeBean(String codeStr){
log.info("开始解析条码["+codeStr+"]");
CodeBean codeBean = splitCodeAndSize(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("smfcore.error.barcode.noRule","解析规则未定义");
return codeBean;
}
codeStr = codeBean.getCodeStr();
String[] codeArr = new String[]{codeStr};
if(!Strings.isNullOrEmpty(separator)){
codeArr = codeStr.split(separator,-1);
......@@ -542,13 +632,18 @@ public class BarcodeRule {
if(batch_item.hasThisField()){
String batch = batch_item.getStrValue(codeArr);
b.setBatch(batch);
if(Strings.isNullOrEmpty(batch)){
log.info("BATCH解析失败");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"BATCH"}, "BATCH解析失败");
return codeBean;
}
}
int quantity = 1;
if(quantity_item.hasThisField()){
quantity = quantity_item.getIntValue(codeArr);
quantity = quantity_item.getMaxIntValue(codeArr);
if(quantity == -1){
log.info("条码解析失败,未找到QTY 字段");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"QTY"},"条码解析失败,未找到{0}字段");
log.info("QTY解析失败");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"QTY"},"QTY解析失败");
return codeBean;
}
}
......@@ -556,7 +651,7 @@ public class BarcodeRule {
Date produceDate= produceDate_item.getDateValue(codeArr);
if(produceDate_item.hasThisField() && produceDate == null){
log.info("条码解析失败,PRODATE字段不合规则");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"PRODATE"},"条码解析失败,未找到{0}字段");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"PRODATE"},"PRODATE字段不合规则");
return codeBean;
}
Date expireDate= expireDate_item.getDateValue(codeArr);
......@@ -582,7 +677,15 @@ public class BarcodeRule {
expireDate = c.getTime();
}
}
String supplier = supplier_item.getStrValue(codeArr);
if(supplier_item.hasThisField()){
String supplier = supplier_item.getStrValue(codeArr);
b.setProvider(supplier);
if(Strings.isNullOrEmpty(supplier)){
log.info("SP解析失败");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"SP"}, "SP解析失败");
return codeBean;
}
}
String msl = msl_item.getStrValue(codeArr);
if(memo_item.hasThisField()){
......@@ -596,9 +699,8 @@ public class BarcodeRule {
b.setAmount(quantity);
b.setProduceDate(produceDate);
b.setExpireDate(expireDate);
b.setProvider(supplier);
b.setPlateSize(reelWidth);
b.setHeight(reelHeight);
b.setPlateSize(codeBean.getReelWidth());
b.setHeight(codeBean.getReelHeight());
b.setMsl(msl);
codeBean.setBarcode(b);
......@@ -673,8 +775,8 @@ public class BarcodeRule {
//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]";
// 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>";
......@@ -684,35 +786,35 @@ public class BarcodeRule {
//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 ";
codeStr = "[)>@06@12S0002@P791.704-06@1PGCJ21BR71H105KA01L@31P791.704-06@12V100@10VJPN-IA@2P@20P@6D20210727@14D20220727@30PY@Z1@K0@16K0@V48200085@3SSIA1715LS0N1S@Q3000NAR000@20T1@1TIA1715LS0@2T@1Z@@";
rule = "1@2@3@PN[1:0:-1]@5@6@7@8@9@10@11@12@13@14@15@16@RI[1:0:-1]@18@QTY[1:4:-1]@20@21@22@23@@";
codeStr = "792.664-0001000aq0fK792.664-00";
rule = "PN[-1:10:-1]QTY[10:5:-1]RI[15:5:-1]";
codeStr = "327203324369301963";
rule = "PN[-1_32:0:-1_3]RI[-1:0:-1]";
// 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="TJM210215000771&10446507326&15000&2021-01-18&NAUK11263MAB&&10446&&R107920210124A13OG";
rule="RI&PN&QTY&PRODATEyyyy-MM-dd&5&6&7&8&9";
// codeStr = "=7x8=140032005 18B030918B 200.000 614A 0001045024 0001 20200414-141329";
// rule = "PN BATCH QTY[-1:0:1] RI ";
codeStr="=7x8=TJM210308001935&10446500253&10000&2021-01-01&Z573226594&&10446&&R05242021030201596";
rule="RI&PN&QTY&PRODATEyyyy-MM-dd&5&&6&&7";
// codeStr = "[)>@06@12S0002@P791.704-06@1PGCJ21BR71H105KA01L@31P791.704-06@12V100@10VJPN-IA@2P@20P@6D20210727@14D20220727@30PY@Z1@K0@16K0@V48200085@3SSIA1715LS0N1S@Q3000NAR000@20T1@1TIA1715LS0@2T@1Z@@";
// rule = "1@2@3@PN[1:0:-1]@5@6@7@8@9@10@11@12@13@14@15@16@RI[1:0:-1]@18@QTY[1:4:-1]@20@21@22@23@@";
codeStr = "2720332436";
rule = "PN[0_2:10:0]RI[0_2:10:0]";
// codeStr = "792.664-0001000aq0fK792.664-00";
// rule = "PN[-1:10:-1]QTY[10:5:-1]RI[15:5:-1]";
//
// codeStr = "327203324369301963";
// rule = "PN[-1_32:0:-1_3]RI[-1:0:-1]";
//
//
// codeStr="TJM210215000771&10446507326&15000&2021-01-18&NAUK11263MAB&&10446&&R107920210124A13OG";
// rule="RI&PN&QTY&PRODATEyyyy-MM-dd&5&6&7&8&9";
//
// codeStr="=7x8=TJM210308001935&10446500253&10000&2021-01-01&Z573226594&&10446&&R05242021030201596";
// rule="RI&PN&QTY&PRODATEyyyy-MM-dd&5&&6&&7";
//
// codeStr = "2720332436";
// rule = "PN[0_2:10:0]RI[0_2:10:0]";
//大陆科技
//条码截取规则:
......@@ -720,17 +822,51 @@ public class BarcodeRule {
//截取补全后条码:00000A2C7363430200@0702043942@SX00010346575 (料号补全至18位,供应商代码补全至10位,Package 13位不变)
//PN:PA2C7363430200,SP:V702043942,RI:3SSX00010346575,QTY:Q30NAR000
//截取补全后条码:00000A2C7363430200@0702043942@SX00010346575 (料号补全至18位,供应商代码补全至10位,Package 13位不变)
codeStr = "[)>@06@12S0002@PA2C4000670322@1P700042761@31PCGA4F2X7R2A103KT5Y2A@12V700042761@10VJPN-AKITA@2P1@20P25gsm@6D20210826@14D20220314@30PN@ZN@K0@16K0@V000000000@3SS100000000068@Q1KGM000@20T1@1T1@2T@1Z1@@";
codeStr = "[)>@06@12S0002@PA2C7363430200@1P28.5823-0813.1@31P2858230813100@12VC11001844@10VCHN-KUNSHAN@2P@20P@6D20220208@14D20220916@30PY@ZN@K5100012719@16K0@V702043942@3SSX00010346575@Q30NAR000@20T2@1TPEax98-02@2T2204-002@1ZOrigin: CN215300@@";
codeStr = "[)>@06@12S0002@PA2C4000670322@1P700042761@31PCGA4F2X7R2A103KT5Y2A@12V700042761@10VJPN-AKITA@2P1@20P25gsm@6D20210826@14D20220314@30PN@ZN@K0@16K0@V000000000@3SS100000000068@Q1KGM000@20T1@1T1@2T@1Z1@@";
rule = "1@2@3@PPN@5@6@7@8@9@10@6DPRODATEyyyyMMdd@14DEXPDATEyyyyMMdd@13@14@15@16@VSP@3SRI@QQTYKGM000@20@1TBATCH@22@23@24@25";
// codeStr = "[)>@06@12S0002@PA2C4000670322@1P700042761@31PCGA4F2X7R2A103KT5Y2A@12V700042761@10VJPN-AKITA@2P1@20P25gsm@6D20210826@14D20220314@30PN@ZN@K0@16K0@V000000000@3SS100000000068@Q1KGM000@20T1@1T1@2T@1Z1@@";
// codeStr = "[)>@06@12S0002@PA2C7363430200@1P28.5823-0813.1@31P2858230813100@12VC11001844@10VCHN-KUNSHAN@2P@20P@6D20220208@14D20220916@30PY@ZN@K5100012719@16K0@V702043942@3SSX00010346575@Q30NAR000@20T2@1TPEax98-02@2T2204-002@1ZOrigin: CN215300@@";
// codeStr = "[)>@06@12S0002@PA2C4000670322@1P700042761@31PCGA4F2X7R2A103KT5Y2A@12V700042761@10VJPN-AKITA@2P1@20P25gsm@6D20210826@14D20220314@30PN@ZN@K0@16K0@V000000000@3SS100000000068@Q1KGM000@20T1@1T1@2T@1Z1@@";
// rule = "1@2@3@PPN@5@6@7@8@9@10@6DPRODATEyyyyMMdd@14DEXPDATEyyyyMMdd@13@14@15@16@VSP@3SRI@QQTYKGM000@20@1TBATCH@22@23@24@25";
//菲律宾料仓Reel ID : B11111Y934
//
//Part Number : GDM0300013451T
//
//Lot Number: PC7N22AF1
//
//Vendor: MURATA
//
//Quantity: 10000
//codeStr = "B11111Y9341PGDM0300013451T1TPC7N22AF11VMURATA1DNA1Q10000";
//codeStr = "B11111Y9341PGDM03000";
//rule = "RI[-1:10:-1]PN[12:-14:-1]BATCH[28:9:-1]SP[39:6:-1]QTY[-1:-5:-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";
// Map<String,String> filedMap = new HashMap<>();
// filedMap.put("RI","R506072019102200356");
// filedMap.put("PN","8C.R2003.V81");
// filedMap.put("BATCH","L00002019090199951797");
// filedMap.put("SP","50607");
// filedMap.put("QTY","3000");
// filedMap.put("PRODATEyyyy-MM-dd","2019-09-01");
// filedMap.put("EXPD","0365");
// System.out.println("====="+toCodeRule(codeStr,filedMap));
// codeStr = "=1+0x0-13x12=SU100PM0JPR";
// rule = "PN[-1_SU:2:-1][RI]";
//镁光
codeStr = "P550-502752A|1P3242-10-01-B|1TA201223F|7Q100+EA|SM19976138|21PSIMMTech|2D01-03-2023|4LKR|Q25|1Q4";
rule = "PN[5:0:-1]|BATCH[2:0:-1]|LOT|QTY[2:0:-1]|RI|SP[5:0:-1]|EXPDATEdd-MM-yyyy[2:0:-1]|xxx|xxx|xxx";
rule = "PN[5:0:-1]|BATCH[2:0:-1]|LOT|QTY[2_7Q:0:-1]|RI|SP[5:0:-1]|EXPDATEdd-MM-yyyy[2:0:-1]|xxx|xxx|xxx";
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("QTY:"+b.getAmount());
System.out.println("BATCH:"+b.getBatch());
System.out.println("MSL:"+b.getMsl());
System.out.println("PRODATE:"+b.getProduceDate());
......@@ -763,4 +899,72 @@ public class BarcodeRule {
}
private static String toCodeRule(String codeStr, Map<String,String> fieldValueMap){
String separator = findSeparator(codeStr);
String[] codeArr = new String[]{codeStr};
if(!Strings.isNullOrEmpty(separator)){
codeArr = codeStr.split(separator);
}
String[] ruleArr = new String[codeArr.length];
for (String fieldName : fieldValueMap.keySet()) {
String fieldValue = fieldValueMap.get(fieldName);
for (int i = 0; i < codeArr.length; i++) {
String code = codeArr[i];
int index = code.indexOf(fieldValue);
if(index >=0){
//包含字段值,
String oldRule = ruleArr[i];
if(oldRule == null){
oldRule = "";
}
oldRule = oldRule+ fieldName;
if(!code.equals(fieldValue)){
oldRule = oldRule + "["+index+":"+fieldValue.length()+":-1]";
}
ruleArr[i] = oldRule;
break;
}
}
}
String result = "";
for (int i = 0; i < ruleArr.length; i++) {
String ruleItem = ruleArr[i];
if(ruleItem == null){
ruleItem = "" + (i+1);
}
result = result + ruleItem;
if(i < ruleArr.length - 1){
result = result + separator;
}
}
System.out.println("=====" + result);
return result;
}
private static String findSeparator(String str){
//先找分割符,分割出来数组数量最多的放第一个
String trySeparator = "";
String result = "";
//找最多的字符
String[] tempArr = new String[]{};
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(!Character.isLetterOrDigit(c)){
//不是字母和数字才可以作为分割符
String separator = toRegexStr(c + "");
if(trySeparator.indexOf(c) == -1){
String[] ss = str.split(separator,-1);
if(ss.length > tempArr.length){
trySeparator = c + trySeparator;
result =separator;
tempArr = ss;
}else{
trySeparator = trySeparator + c;
}
};
}
}
return result;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!