forked from I3-YF/i3plus-mes-yfai
修复产线班次固定作业内容信息时间重复校验逻辑有误
parent
d59e25ada9
commit
34b5108144
@ -0,0 +1,22 @@
|
||||
package cn.estsh.i3plus.ext.mes.api.busi;
|
||||
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: wangjie
|
||||
* @CreateDate: 2021/01/19 15:06 下午
|
||||
* @Description: 根据编码规则校验编码是否有效
|
||||
**/
|
||||
public interface ISxNumberRuleCheckAttributeService {
|
||||
|
||||
/**
|
||||
* 根据编码规则校验编码是否有效
|
||||
* @param map 属性
|
||||
* @return 校验结果
|
||||
*/
|
||||
@ApiOperation(value = "根据编码规则校验编码是否有效", notes = "根据编码规则校验编码是否有效")
|
||||
Map<String, Object> doCheckNumberRule(Map<String, Object> map);
|
||||
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package cn.estsh.i3plus.ext.mes.api.busi.jx;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt;
|
||||
|
||||
public interface IJxProduceSnService {
|
||||
|
||||
MesProduceSnExt getProduceSn(String organizeCode, String productSn);
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package cn.estsh.i3plus.ext.mes.apiservice.dao.jx;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.model.jx.OqcLastCheckModel;
|
||||
import cn.estsh.i3plus.pojo.base.common.Pager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: wangjie
|
||||
* @CreateDate: 2019/11/21 11:28 上午
|
||||
* @Description:
|
||||
**/
|
||||
public interface IJxProduceSnDao {
|
||||
|
||||
/**
|
||||
* 查询产品条码数量
|
||||
* @param model 查询信息
|
||||
* @return 总检验结果数量
|
||||
*/
|
||||
int queryProduceSnByPagerCount(OqcLastCheckModel model);
|
||||
|
||||
/**
|
||||
* 查询产品条码信息集合
|
||||
* @param model 查询信息
|
||||
* @param pager 分页条件
|
||||
* @return SOP信息集合
|
||||
*/
|
||||
List<MesProduceSnExt> queryProduceSnByPager(OqcLastCheckModel model, Pager pager);
|
||||
}
|
@ -0,0 +1,344 @@
|
||||
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.api.busi.ISxNumberRuleCheckAttributeService;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.bean.MesNumberRuleExt;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.bean.MesPartExt;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
|
||||
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author: wangjie
|
||||
* @CreateDate: 2019/8/23 1:16 PM
|
||||
* @Description: 根据编码规则校验编码是否有效
|
||||
**/
|
||||
|
||||
@Service
|
||||
public class SxNumberRuleCheckAttributeService implements ISxNumberRuleCheckAttributeService {
|
||||
|
||||
@Override
|
||||
public Map<String, Object> doCheckNumberRule(Map<String, Object> map) {
|
||||
|
||||
MesNumberRuleExt numberRuleDb = (MesNumberRuleExt) map.get(MesExtConstWords.NUMBER_RULE_EXT);
|
||||
|
||||
try {
|
||||
return doCheck(map, numberRuleDb);
|
||||
} catch (Exception e) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
resultMap.put(MesExtConstWords.RESULT, false);
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> doCheck(Map<String, Object> map, MesNumberRuleExt numberRuleDb) throws Exception {
|
||||
Method method = this.getClass().getDeclaredMethod(numberRuleDb.getMethodName(), Map.class, MesNumberRuleExt.class);
|
||||
method.setAccessible(true);
|
||||
return (Map<String, Object>) method.invoke(this, map, numberRuleDb);
|
||||
}
|
||||
|
||||
private List<String> getSerialNumberList(String serialNumber, List<String> ruleLengthListStr, List<Integer> ruleLengthList) {
|
||||
List<String> serialNumberList = new ArrayList<>();
|
||||
Integer begin = 0;
|
||||
Integer end;
|
||||
if (!CollectionUtils.isEmpty(ruleLengthList)) {
|
||||
for (Integer length : ruleLengthList) {
|
||||
end = begin + length;
|
||||
serialNumberList.add(serialNumber.substring(begin, end));
|
||||
begin = end;
|
||||
}
|
||||
} else {
|
||||
for (String length : ruleLengthListStr) {
|
||||
if (length.equals(MesExtConstWords.J)) {
|
||||
String serialFormJStart = serialNumber.substring(begin);
|
||||
Integer indexOneSpace = serialFormJStart.indexOf(MesExtConstWords.ONE_SPACE);
|
||||
if (indexOneSpace == -1) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
end = begin + indexOneSpace;
|
||||
serialNumberList.add(serialFormJStart.substring(0, indexOneSpace));
|
||||
ruleLengthList.add(indexOneSpace);
|
||||
begin = end;
|
||||
} else {
|
||||
end = begin + Integer.valueOf(length);
|
||||
if (serialNumber.length() < end) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
serialNumberList.add(serialNumber.substring(begin, end));
|
||||
ruleLengthList.add(Integer.valueOf(length));
|
||||
begin = end;
|
||||
}
|
||||
}
|
||||
}
|
||||
return serialNumberList;
|
||||
}
|
||||
|
||||
private Map<String, Object> commonCheck(Map<String, Object> map, MesNumberRuleExt numberRuleDb, List<String> dynamicRuleList) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
resultMap.put(MesExtConstWords.RESULT, false);
|
||||
String serialNumber = (String) map.get(MesExtConstWords.SERIAL_NUMBER);
|
||||
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
|
||||
|
||||
List<String> numberRuleList = Arrays.asList(
|
||||
numberRuleDb.getNumberRule().replace(MesExtConstWords.LEFT_BRACE, MesExtConstWords.EMPTY).split(MesExtConstWords.RIGHT_BRACE));
|
||||
numberRuleList = numberRuleList.stream().map(o -> o.toUpperCase()).collect(Collectors.toList());
|
||||
|
||||
String ruleLengthSpilt = numberRuleDb.getRuleLengthSpilt();
|
||||
if (ruleLengthSpilt.contains(MesExtConstWords.P)) {
|
||||
ruleLengthSpilt = ruleLengthSpilt.replaceAll(MesExtConstWords.P, String.valueOf(partExt.getPartNo().length()));
|
||||
}
|
||||
if (ruleLengthSpilt.contains(MesExtConstWords.L)) {
|
||||
ruleLengthSpilt = ruleLengthSpilt.replaceAll(MesExtConstWords.L, StringUtils.isEmpty(partExt.getPartLotNoLength()) ? "0" : String.valueOf(partExt.getPartLotNoLength()));
|
||||
}
|
||||
|
||||
List<String> ruleLengthListStr = Arrays.asList(ruleLengthSpilt.split(MesExtConstWords.COMMA));
|
||||
List<Integer> ruleLengthList = new ArrayList<>();
|
||||
|
||||
List<String> spiltRuleList = StringUtils.isEmpty(numberRuleDb.getSpiltRule()) ? null :
|
||||
new ArrayList<>(Arrays.asList(numberRuleDb.getSpiltRule().split(MesExtConstWords.COMMA)));
|
||||
|
||||
if (!ruleLengthSpilt.contains(MesExtConstWords.J)) {
|
||||
|
||||
ruleLengthList = ruleLengthListStr.stream().map(Integer::valueOf).collect(Collectors.toList());
|
||||
|
||||
Integer length = ruleLengthList.stream().reduce(Integer::sum).orElse(0);
|
||||
|
||||
if (Integer.valueOf(serialNumber.length()).compareTo(length) != 0) {
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
List<String> serialNumberList = getSerialNumberList(serialNumber, ruleLengthListStr, ruleLengthList);
|
||||
|
||||
if (ruleLengthSpilt.contains(MesExtConstWords.J)) {
|
||||
|
||||
Integer length = ruleLengthList.stream().reduce(Integer::sum).orElse(0);
|
||||
|
||||
if (Integer.valueOf(serialNumber.length()).compareTo(length) != 0) {
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int snIndex = 0;
|
||||
for (String s : numberRuleList) {
|
||||
switch (s) {
|
||||
case MesExtConstWords.PREFIX_BIG:
|
||||
if (!serialNumberList.get(0).equals(numberRuleDb.getPrefix()) ||
|
||||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.PARTNO:
|
||||
if (null == partExt || !serialNumberList.get(0).equals(partExt.getPartNo()) ||
|
||||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.YEAR:
|
||||
case MesExtConstWords.MONTH_UPPER_CASE:
|
||||
case MesExtConstWords.DAY_UPPER_CASE:
|
||||
case MesExtConstWords.HOUR:
|
||||
case MesExtConstWords.MINUTE:
|
||||
case MesExtConstWords.SECOND:
|
||||
//---兼容EP----
|
||||
case MesExtConstWords.J://日文
|
||||
case MesExtConstWords.SUPPLIERRULE:
|
||||
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.L: //变更号
|
||||
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
resultMap.put(MesExtConstWords.L, serialNumberList.get(0));
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.N: //数量
|
||||
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
resultMap.put(MesExtConstWords.N, serialNumberList.get(0));
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.SERIALNO:
|
||||
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
resultMap.put(MesExtConstWords.SEQNO, serialNumberList.get(0));
|
||||
StringBuffer snWithoutSeqNoBuffer = new StringBuffer(serialNumber);
|
||||
if(resultMap.containsKey(MesExtConstWords.SN_WITHOUT_SEQNO)){
|
||||
String snWithoutSeqNo = String.valueOf(resultMap.get(MesExtConstWords.SN_WITHOUT_SEQNO));
|
||||
snWithoutSeqNoBuffer = new StringBuffer(snWithoutSeqNo);
|
||||
}
|
||||
|
||||
resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, snWithoutSeqNoBuffer.replace(snIndex, snIndex + ruleLengthList.get(0), MesExtConstWords.SEQNO));
|
||||
|
||||
snIndex += ruleLengthList.get(0);
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.SERIALNO2:
|
||||
if (Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
resultMap.put(MesExtConstWords.SEQNO2, serialNumberList.get(0));
|
||||
if(resultMap.containsKey(MesExtConstWords.SN_WITHOUT_SEQNO)){
|
||||
String snWithoutSeqNo = String.valueOf(resultMap.get(MesExtConstWords.SN_WITHOUT_SEQNO));
|
||||
resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, snWithoutSeqNo.replaceFirst(serialNumberList.get(0), MesExtConstWords.SEQNO2));
|
||||
}else{
|
||||
resultMap.put(MesExtConstWords.SN_WITHOUT_SEQNO, serialNumber.replaceFirst(serialNumberList.get(0), MesExtConstWords.SEQNO2));
|
||||
}
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
break;
|
||||
//---兼容EP----
|
||||
case MesExtConstWords.SPILTRULE:
|
||||
//配置空格使用"/u0020"
|
||||
if (CollectionUtils.isEmpty(spiltRuleList) || !serialNumberList.get(0).equals(spiltRuleList.get(0)) ||
|
||||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
spiltRuleList.remove(0);
|
||||
break;
|
||||
case MesExtConstWords.DYNAMICRULE:
|
||||
if (CollectionUtils.isEmpty(dynamicRuleList) || !serialNumberList.get(0).equals(dynamicRuleList.get(0)) ||
|
||||
Integer.valueOf(serialNumberList.get(0).length()).compareTo(ruleLengthList.get(0)) != 0) {
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
snIndex += ruleLengthList.get(0);
|
||||
serialNumberList.remove(0);
|
||||
ruleLengthList.remove(0);
|
||||
dynamicRuleList.remove(0);
|
||||
break;
|
||||
default:
|
||||
throw new ImppBusiException();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (ImppBusiException e) {
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
resultMap.put(MesExtConstWords.RESULT, true);
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态字符包含 物料识别码,条码末尾数
|
||||
* 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 配置
|
||||
*/
|
||||
private Map<String, Object> method1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
|
||||
|
||||
List<String> dynamicRuleList = new ArrayList<>();
|
||||
dynamicRuleList.add(partExt.getIdentifyCode());
|
||||
dynamicRuleList.add(partExt.getSnLastCode());
|
||||
|
||||
return commonCheck(map, numberRuleDb, dynamicRuleList);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 动态字符包含 颜色代码
|
||||
* 年月日默认使用工单计划开始时间
|
||||
* 年:取年份最后一位数
|
||||
* 月份:10月使用大写字母O,11月使用大写字母N,12月使用大写字母D
|
||||
* 编码规则可增加 日 时 分 秒 前缀 流水号 配置
|
||||
*/
|
||||
private Map<String, Object> method2(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
|
||||
|
||||
List<String> dynamicRuleList = new ArrayList<>();
|
||||
dynamicRuleList.add(partExt.getColorCode());
|
||||
|
||||
return commonCheck(map, numberRuleDb, dynamicRuleList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态字符包含 物料识别码
|
||||
* 年月日默认使用工单计划开始时间
|
||||
* 年:取年份最后两位数
|
||||
* 编码规则可增加 月 日 时 分 秒 前缀 流水号 配置
|
||||
*/
|
||||
private Map<String, Object> method3(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
MesPartExt partExt = (MesPartExt) map.get(MesExtConstWords.PART_EXT);
|
||||
|
||||
List<String> dynamicRuleList = new ArrayList<>();
|
||||
dynamicRuleList.add(partExt.getIdentifyCode());
|
||||
|
||||
return commonCheck(map, numberRuleDb, dynamicRuleList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态字符包含 物料识别码
|
||||
* 年月日默认使用工单计划开始时间
|
||||
* 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 配置
|
||||
*/
|
||||
private Map<String, Object> method4(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
return method3(map, numberRuleDb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态字符包含 颜色代码
|
||||
* 年月日默认使用工单计划开始时间
|
||||
* 年:取年份最后两位数
|
||||
* 月份:10月使用大写字母O,11月使用大写字母N,12月使用大写字母D
|
||||
* 编码规则可增加 日 时 分 秒 前缀 流水号 配置
|
||||
*/
|
||||
private Map<String, Object> method5(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
return method2(map, numberRuleDb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态字符包含 物料识别码
|
||||
* 年月日默认使用工单计划开始时间
|
||||
* 年:取年份最后两位数
|
||||
* 月份:10月使用大写字母O,11月使用大写字母N,12月使用大写字母D
|
||||
* 编码规则可增加 日 时 分 秒 前缀 流水号 配置
|
||||
*/
|
||||
private Map<String, Object> method6(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
return method3(map, numberRuleDb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 物料号 供应商定制代码 固定拼接字符 配置
|
||||
*/
|
||||
private Map<String, Object> epmethod1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
return commonCheck(map, numberRuleDb, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编码规则可增加 年 月 日 时 分 秒 前缀 流水号 物料号 供应商定制代码 固定拼接字符 配置
|
||||
*/
|
||||
private Map<String, Object> jxmethod1(Map<String, Object> map, MesNumberRuleExt numberRuleDb){
|
||||
return commonCheck(map, numberRuleDb, null);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxProduceSnService;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProduceSnExt;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.repository.MesProduceSnExtRepository;
|
||||
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
|
||||
import cn.estsh.i3plus.platform.common.util.MesConstWords;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* @PROJECT_NAME: i3plus-mes-panasonic-jx
|
||||
* @DESCRIPTION:
|
||||
* @USER: xinwang.yi
|
||||
* @DATE: 2023-11-29 11:39
|
||||
*/
|
||||
@Service
|
||||
public class JxProduceSnService implements IJxProduceSnService {
|
||||
|
||||
@Autowired
|
||||
private MesProduceSnExtRepository produceSnExtRepository;
|
||||
|
||||
@Override
|
||||
public MesProduceSnExt getProduceSn(String organizeCode, String productSn) {
|
||||
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null;
|
||||
|
||||
return produceSnExtRepository.getByProperty(
|
||||
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, MesExtConstWords.PRODUCT_SN},
|
||||
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue