diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchVkmService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchVkmService.java new file mode 100644 index 0000000..4e9ad27 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchVkmService.java @@ -0,0 +1,131 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPartPackageRule; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.repository.IMesPartPackageRuleDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.IMesPartPackageRuleRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** + * @Description : 通用包装组零件校验(VKM) + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/9/20 16:54 + * @Modify: + **/ +@Slf4j +@Service +public class MesNumberRuleMatchVkmService implements IMesNumberRuleMatchDispatchService { + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesPartPackageRuleRepository mesPartPackageRuleRepository; + + @Autowired + private IMesPartPackageRuleDetailRepository mesPartPackageRuleDetailRepository; + + @Override + public Map matchNumberRule(String organizeCode, String sn, Object... params) { + // 校验正则表达式 + Map result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass())).matchNumberRule(organizeCode, sn, params); + + if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { + return result; + } + //当前装配件清单信息 + MesProductionAssemblyContext context = (MesProductionAssemblyContext) params[0]; + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(new StationRequestBean(organizeCode, context.getWorkCenterCode(), context.getWorkCellCode())); + if (CollectionUtils.isEmpty(prodRuleContextList)) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "当前不存在非排序加工规则数据,请重置工序!"); + return result; + } + //获取加工规则 + Optional contextOptional = prodRuleContextList.stream().filter(t -> Objects.equals(t.getForeignKey(), context.getForeignKey())).findFirst(); + if (!contextOptional.isPresent()) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "当前不存在非排序加工规则数据,请重置工序!"); + return result; + } + //装配件清单 + List assemblyNosortContextList = contextOptional.get().getNosortAssemblyDataContext(); + if (CollectionUtils.isEmpty(assemblyNosortContextList)) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "当前不存在已装配的数据!"); + return result; + } + //装配件条码字段的长度等于60(固定)为VKM包条码 + Optional assemblyNosortContext = assemblyNosortContextList.stream().filter(t -> MesPcnExtConstWords.SIXTY == t.getAssemblySn().length()).findFirst(); + if (!assemblyNosortContext.isPresent()) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "不存在主零件!"); + return result; + } + //通用包装组零件规则 + MesPartPackageRule mesPartPackageRule = getMesPartPackageRule(organizeCode, assemblyNosortContext.get().getAssemblyPartNo()); + if (Objects.isNull(mesPartPackageRule)) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "通用包装组零件规则不存在!"); + return result; + } + //通用包装组零件规则明细 + if (!isExitMesPartPackageRuleDetail(organizeCode, context.getAssemblyPartNo(), mesPartPackageRule.getId())) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "通用包装组零件规则明细不存在!"); + return result; + } + //获取大包装流水最后十四位数(固定) + String seq = assemblyNosortContext.get().getAssemblySn().substring(assemblyNosortContext.get().getAssemblySn().length() - MesPcnExtConstWords.FOURTEEN); + //如果seq(22810138101376)的前四位(固定)与当前扫描的装配件条码的(26502271 8211001000000X 654406818 2123198103002281)后4位一致,则代表匹配成功,否则失败则提示:"流水号不一致" + if (!sn.endsWith(seq.substring(MesPcnExtConstWords.ZERO, MesPcnExtConstWords.FOUR))) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, "流水号不一致!"); + return result; + } + + return result; + } + + private MesPartPackageRule getMesPartPackageRule(String organizeCode, String assemblyPartNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(assemblyPartNo)) { + return null; + } + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(assemblyPartNo, MesPcnExtConstWords.PACKAGE_PART_NO, packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PACKAGE_RULE_TYPE.PACKAGE_RULE_TYPE_10.getValue(), MesPcnExtConstWords.RULE_TYPE, packBean); + return mesPartPackageRuleRepository.getByProperty(packBean); + } + + private boolean isExitMesPartPackageRuleDetail(String organizeCode, String assemblyPartNo, long id) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(assemblyPartNo)) { + return false; + } + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(id, MesPcnExtConstWords.PID, packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PACKAGE_RULE_MATCH_TYPE.PACKAGE_RULE_MATCH_TYPE_10.getValue(), MesPcnExtConstWords.MATCH_TYPE, packBean); + DdlPreparedPack.getStringEqualPack(assemblyPartNo, MesPcnExtConstWords.PART_NO, packBean); + return mesPartPackageRuleDetailRepository.isExitByHql(packBean); + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 4fda132..1618bd1 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -311,6 +311,12 @@ public class MesPcnExtConstWords { public static final Integer ONE = 1; // 3 public static final Integer THREE = 3; + //4 + public static final Integer FOUR = 4; + //14 + public static final Integer FOURTEEN = 14; + //60 + public static final Integer SIXTY = 60; // 中括号 public static final String SQUARE_BRACKETS = "[]"; // & @@ -536,4 +542,8 @@ public class MesPcnExtConstWords { public static final String PRINT_TIME = "printTime"; // 裁片名称 public static final String CUT_NAME = "cutName"; + //包覆零件号 + public static final String PACKAGE_PART_NO = "packagePartNo"; + //规则类型 + public static final String RULE_TYPE = "ruleType"; }