diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java index ba16efb..4c73142 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java @@ -84,9 +84,6 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { //未知腔数[工位参数] String cavityUnknownCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG); - //计算实际需要的腔数 -// Integer needCavity = getNeedCavity(productionPartContextList, productionPsInContextList, cellEquipContext); - if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) //存在产出零件 存在进料主条码 doMatchAssemblyHasPpAndPs(reqBean, resultBean, stepResult, productionPartContextList, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList); else if (!CollectionUtils.isEmpty(productionPartContextList)) //存在产出零件 不存在进料主条码 @@ -102,19 +99,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { } -// //计算实际需要的腔数 -// private Integer getNeedCavity(List productionPartContextList, List productionPsInContextList, MesCellEquipContext cellEquipContext) { -// -// List ppList = CollectionUtils.isEmpty(productionPartContextList) ? null : productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); -// List psList = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); -// -// Integer ppSize = CollectionUtils.isEmpty(ppList) ? MesPcnExtConstWords.ZERO : ppList.size(); -// Integer psSize = CollectionUtils.isEmpty(psList) ? MesPcnExtConstWords.ZERO : psList.size(); -// -// if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) return (productionPartContextList.size() == productionPsInContextList.size()) ? psSize -// -// -// } + //存在产出零件 存在进料主条码 private StepResult doMatchAssemblyHasPpAndPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, @@ -180,9 +165,15 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { } List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filterList)) { + + Boolean hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList); + if ((!hasUnBindAssembly && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) == 0) || equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0) + productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList); + String msg = String.format("当前上下文中的装配件条码%s匹配完成", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString()); - return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) : + return hasUnBindAssembly ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) : (productionPartContextList.size() == productionPsInContextList.size() ? stepResult.msg(msg) : stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg( String.format("%s,请扫描第[%s]腔主条码,共[%s]腔!", msg, productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size()))); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepServiceBak.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepServiceBak.java new file mode 100644 index 0000000..6e3d019 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepServiceBak.java @@ -0,0 +1,200 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPojoVersionService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.bean.MesPojoVersion; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.hutool.core.date.DateUtil; +import com.google.common.base.Objects; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description : 生成零件条码 + * @Author : wangjie + **/ +@Slf4j +@Service +public class MesProductSnGenerateStepService extends BaseStepService { + @Autowired + private SnowflakeIdMaker snowflakeIdMaker; + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private MesPartRepository mesPartRepository; + + @Autowired + private MesProduceSnRepository mesProduceSnRepository; + + @Autowired + private ISyncFuncService syncFuncService; + + public static final String ORDER_NO_JIS_SORT = "ORDER_NO_JIS_SORT"; + + @Autowired + private IMesProductionDispatchContextStepService mesProductionDispatchContextStepService; + + @Autowired + private IMesPojoVersionService mesPojoVersionService; + + /**todo 有产成无进料场景 + * todo 根据装配件条码没有找到加工规则,如果需要跳过装配件绑定,直接生成条码,就需要不看加工规则,直接根据产成零件生成条码,当前设计方式就需要变更。 + * @param reqBean + * @return + */ + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean); + // 获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue()); + MesWorkCell mesWorkCell = productionProcessContext.getWorkCell(); + // 获取产出零件信息 + List productionPartContextList = mesProductionDispatchContextStepService.getProductionPartContext(reqBean); + if (CollectionUtils.isEmpty(productionPartContextList)) { + foundExThrow(reqBean, "必过工步不允许跳过"); + } + // 获取零件号,可能存在多个 + List partNoList = productionPartContextList.stream().map(MesProductionPartContext::getPartNo).collect(Collectors.toList()); + // 根据零件号组装产品条码信息 + List mesProduceSns = generateSn(reqBean, productionProcessContext, mesWorkCell, partNoList, result); + // 保存条码信息 + mesProduceSnRepository.saveAll(mesProduceSns); + + savePojoVersion(mesProduceSns); + + List mesProductionPsOutContexts = new ArrayList<>(); + for (MesProduceSn mesProduceSn : mesProduceSns) { + MesProductionPsOutContext mesProductionPsOutContext = new MesProductionPsOutContext(); + BeanUtils.copyProperties(mesProduceSn, mesProductionPsOutContext); + mesProductionPsOutContexts.add(mesProductionPsOutContext); + } + // 放到上下文 + mesProductionDispatchContextStepService.saveProductionPsOutContext(reqBean, mesProductionPsOutContexts); + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "生成零件条码成功"); + } + + private void savePojoVersion(List mesProduceSns) { + mesProduceSns.forEach(mesProduceSn -> { + MesPojoVersion version = new MesPojoVersion(); + version.setRefId(mesProduceSn.getId()); + version.setRefClass(mesProduceSn.getClass().getName()); + version.setBean(JsonUtilTool.encode(mesProduceSn)); + version.setCreateUser(version.getCreateUser()); + version.setModifyUser(version.getModifyUser()); + version.setVersionMethodName("insert"); + version.setOrganizeCode(mesProduceSn.getOrganizeCode()); + mesPojoVersionService.recordPojoVersion(version); + }); + } + + /** + * 根据零件号组装产品条码信息 + * @param reqBean + * @param productionProcessContext + * @param mesWorkCell + * @param partNoList + * @return + */ + private List generateSn(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesWorkCell mesWorkCell, List partNoList, String result) { + List mesProduceSns = new ArrayList<>(); + for (String partNo : partNoList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean); + MesPart mesPart = mesPartRepository.getByProperty(packBean); + if (mesPart == null) { + MesPcnException.throwFlowException("零件号不存在"); + } + // 根据条码规则生成条码 + String sn = generateByRule(mesPart); + // 组装条码信息 + MesProduceSn mesProduceSn = generateMesProduceSn(mesPart, sn, mesWorkCell, productionProcessContext, reqBean, result); + ConvertBean.serviceModelInitialize(mesProduceSn, reqBean.getUserInfo()); + mesProduceSns.add(mesProduceSn); + } + return mesProduceSns; + } + + /** + * 生成条码 + * @param mesPart + * @return + */ + private String generateByRule(MesPart mesPart) { + //生成工单号 + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(ORDER_NO_JIS_SORT); + genSerialNoModel.setPartNo(mesPart.getPartNo()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesPart.getCreateUser(), mesPart.getOrganizeCode(), 1).getResultList(); + return resultList.get(0); + } + + private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, MesWorkCell mesWorkCell,MesProductionProcessContext productionProcessContext, StationRequestBean reqBean, String result) { + long serialNum = snowflakeIdMaker.nextId(); + + MesProduceSn mesProduceSn = new MesProduceSn(); + mesProduceSn.setSerialNumber(serialNum + ""); + mesProduceSn.setProductSn(sn); + mesProduceSn.setCustSn(sn); + mesProduceSn.setPartNo(mesPart.getPartNo()); + mesProduceSn.setPartName(mesPart.getPartName()); + mesProduceSn.setAreaCode(mesWorkCell.getAreaCode()); + mesProduceSn.setWorkCenterCode(mesWorkCell.getWorkCenterCode()); + mesProduceSn.setWorkCellCode(mesWorkCell.getWorkCellCode()); + mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate()); + mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate()); + mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate()); + mesProduceSn.setQty(1d); + mesProduceSn.setSnStatus(10); + Integer qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue(); + if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), result)) { + qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue(); + } else if (Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue(), result)) { + qcStatus = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue(); + } + mesProduceSn.setQcStatus(qcStatus); + mesProduceSn.setLotNo(DateUtil.format(new Date(), "YYYYMMDD")); + mesProduceSn.setRouteCode(reqBean.getRouteCode()); + mesProduceSn.setProcessCode(productionProcessContext.getProcessCode()); + mesProduceSn.setCraftCode(productionProcessContext.getCraftCode()); + mesProduceSn.setPrintCount(0); + mesProduceSn.setPrintStatus(10); + mesProduceSn.setOrganizeCode(reqBean.getOrganizeCode()); + + return mesProduceSn; + } +}