diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java index 3948785..6acd2ff 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Map; public interface IMesProduceSnExtService { + @ApiOperation(value = "装箱防错获取正常的条码") + MesProduceSn getProduceSnForBox(String produceSn ,String PartNo,String organizeCode); @ApiOperation(value = "根据零件条码查询零件条码信息") List getProduceSnList(String organizeCode, List productSnList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java index 3c6dba2..0ebf7d2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesBoxingErrorProofingService.java @@ -121,7 +121,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer if (StringUtils.isEmpty(packingDefine.getSplitChar())) { MesPcnException.throwMesBusiException("箱类别代号[%s]分隔符不能为空,请检查数据!", packingDefine.getPackCode()); } - String[] split = mesPackageDetail.getPackageNo().split("\\\\" + packingDefine.getSplitChar()); + String[] split = mesPackageDetail.getPackageNo().split("\\" + packingDefine.getSplitChar()); //获取序列号 checkSerial(packingDefine, split); //工厂校验 @@ -147,7 +147,7 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer MesPcnException.throwMesBusiException("箱条码已封箱,不允许扫描零件条码,请检查数据!"); } //校验条码规则 - MesPart mesPart = getMesPart(mesPackageDetail, mesPackage, packingDefine); + MesPart mesPart = getMesPartNew(mesPackageDetail, mesPackage, packingDefine); //包装规格明细 MesPackageDetail saveMesPackageDetail = getPackageDetail(mesPackageDetail, mesPart); if (mesPackageDetail.getIsMemoryBoolean()) { @@ -232,7 +232,9 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer //校验是否重复扫描 List mesPackageDetails = getMesPackageDetailList(mesPackageDetail); //校验条码是否符合规则 - MesPart mesPart = getMesPart(mesPackageDetail, mesPackageDb, null); + //获取包装定义 + MesPackingDefine packingDefine = getMesPackingDefine(mesPackageDetail); + MesPart mesPart = getMesPartNew(mesPackageDetail, mesPackageDb, packingDefine); boolean exist = false; for (MesPackageDetail packageDetail : mesPackageDetails) { //替换条码是否已经存在 @@ -288,6 +290,15 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer return getPart(mesPackageDetail.getOrganizeCode(), partNo); } + private MesPart getMesPartNew(MesPackageDetail mesPackageDetail, MesPackage mesPackage, MesPackingDefine packingDefine) { + //校验是否重复扫描 + checkSerialNumber(mesPackageDetail); + //校验条码信息 + String partNo = checkSnNew(mesPackageDetail, packingDefine, mesPackage); + //物料信息 + return getPart(mesPackageDetail.getOrganizeCode(), partNo); + } + private void checkSerialNumber(MesPackageDetail mesPackageDetail) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(mesPackageDetail.getSerialNumber(), MesPcnExtConstWords.SERIAL_NUMBER, ddlPackBean); @@ -306,6 +317,17 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer return defineDetails; } + private List getMesPackingDefineDetailsNew(String organizeCode, String packCode,String partNo) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(packCode, "packCode", ddlPackBean); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + List defineDetails = mesPackingDefineDetailsRDao.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(defineDetails)) { + MesPcnException.throwMesBusiException("箱类别代号【%s】包装定义明细未维护,请检查数据!", packCode); + } + return defineDetails; + } + private void unboxing(MesPackage mesPackage, String userName, MesPackage mesPackageDb) { //更新包装表 mesPackageDb.setQty(0d); @@ -455,6 +477,100 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer return partNo; } + /** + * 2024/12/19 10:50 by castle fix bug 44247 + * 装箱防错逻辑优化: + * 1.箱条码会包含零件号(客户零件号),取箱条码中的零件号,作为扫描条码的零件号 + * 2.自制件 & 外协件 + * + * 2.1 自制件 + * + * 2.2.1 首先查询包装明细中包含此零件 且 规则为空 --- 确定为自制件 + * + * 2.2.2 根据零件号和扫描的条码,查询条码表是否存在,存在即自制件,不需要校验规则 (需要校验条码状态 qcStatus=10合格 15 可疑转正常 snStatus = 10 或 20) + * + * 2.2 外协件 + * + * 根据零件号 查询包装明细的规则,校验规则是否符合扫描的箱条码 + * @param mesPackageDetail + * @param packingDefine + * @param mesPackage + * @return + */ + private String checkSnNew(MesPackageDetail mesPackageDetail, MesPackingDefine packingDefine,MesPackage mesPackage ) { + String partNo = mesPackage.getPartNo(); + //1.查询包装明细是否包含此零件 + List defineDetails = getMesPackingDefineDetailsNew(mesPackageDetail.getOrganizeCode(), mesPackage.getPackageSn(), partNo); + if (defineDetails.isEmpty()) { + MesPcnException.throwMesBusiException("箱类别代号【%s】零件号【%s】未维护,请检查数据!", mesPackage.getPackageSn(), partNo); + } + MesPackingDefineDetails mesPackingDefineDetails = defineDetails.get(0); + if (StringUtils.isEmpty(mesPackingDefineDetails.getPackageBarcodeRule())){ + //是自制件 + MesProduceSn produceSn = mesProduceSnExtService.getProduceSnForBox(mesPackageDetail.getSerialNumber(), partNo, mesPackageDetail.getOrganizeCode()); + if (produceSn == null){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】在条码表不存在,请检查数据!", mesPackage.getPackageSn(), partNo); + } + //QC 检查 + if (produceSn.getQcStatus() == MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,QC可疑状态,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + if (produceSn.getQcStatus() == MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,QC为报废状态,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + //SN 条码状态 + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为未知,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为加工中,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_BACK.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为已拆解,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为已装配,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.CHECKED.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为已校验,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为已发运,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + if (produceSn.getSnStatus() == MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_DISASSEMBLY.getValue()){ + MesPcnException.throwMesBusiException("扫描条码【%s】零件号【%s】,条码状态为已总成拆解,不能包装此零件!", mesPackage.getPackageSn(), partNo); + } + }else{ + //外协件 + String packageBarcodeRule = mesPackingDefineDetails.getPackageBarcodeRule().replace("*", ""); + boolean checkResult = mesPackageDetail.getSerialNumber().contains(packageBarcodeRule); + if (!checkResult){ + MesPcnException.throwMesBusiException("零件条码【%s】未匹配到符合条码规则的数据,请检查数据!", mesPackageDetail.getSerialNumber()); + } + } + + //工艺校验 + if(!Objects.isNull(packingDefine) && !Objects.isNull(packingDefine.getCheckCraftFlag()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == packingDefine.getCheckCraftFlag()){ + //查询加工记录 + List productionRecordList = mesProductionRecordService.findProductionRecordList(mesPackageDetail.getOrganizeCode(), mesPackageDetail.getSerialNumber()); + if(CollectionUtils.isEmpty(productionRecordList)){ + MesPcnException.throwMesBusiException("条码【%s】校验装箱防错对应工艺失败,加工记录信息不存在,请检查数据!", mesPackageDetail.getSerialNumber()); + } + if(StringUtils.isEmpty(packingDefine.getCraft())){ + MesPcnException.throwMesBusiException("条码【%s】校验装箱防错对应工艺为空,请检查数据!", mesPackageDetail.getSerialNumber()); + } + //校验条码是否经过该工艺 + Optional productionRecordOptional = productionRecordList.stream().filter(t -> !StringUtils.isEmpty(t.getCraftCode()) && packingDefine.getCraft().equals(t.getCraftCode())).findFirst(); + if(!productionRecordOptional.isPresent()){ + MesPcnException.throwMesBusiException("条码【%s】校验装箱防错对应工艺【%s】失败,请检查数据!", mesPackageDetail.getSerialNumber(),packingDefine.getCraft()); + } + } + + return partNo; + } + private String getPartNo(MesPackageDetail mesPackageDetail, MesPackage mesPackage, List defineDetails) { String packageBarcodeRule; String partNo = null; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java index 724d978..751a1ff 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java @@ -35,6 +35,15 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { @Autowired private MesQueueOrderRepository queueOrderRepository; + @Override + public MesProduceSn getProduceSnForBox(String produceSn, String partNo,String organizeCode) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(produceSn,"productSn",ddlPackBean); + DdlPreparedPack.getStringEqualPack(partNo,"partNo",ddlPackBean); + List produceSnList = produceSnRepository.findByHqlWhere(ddlPackBean); + return produceSnList.isEmpty() ? null : produceSnList.get(0); + } + //根据零件条码查询零件条码信息 @Override public List getProduceSnList(String organizeCode, List productSnList) {