|
|
|
@ -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<MesPackageDetail> 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<MesPackingDefineDetails> getMesPackingDefineDetailsNew(String organizeCode, String packCode,String partNo) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(packCode, "packCode", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
|
|
|
|
|
List<MesPackingDefineDetails> 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<MesPackingDefineDetails> 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<MesProductionRecord> 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<MesProductionRecord> 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<MesPackingDefineDetails> defineDetails) {
|
|
|
|
|
String packageBarcodeRule;
|
|
|
|
|
String partNo = null;
|
|
|
|
|