From b416e13e415648ca9e9d26b128434400b214d46e Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Fri, 28 Jun 2024 08:49:50 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E5=89=8D=E9=81=93=E9=98=B2=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcn/api/busi/IMesProductionRecordService.java | 8 + .../busi/MesProductionRecordService.java | 24 +- .../step/MesFirstMouldNoReadStepService.java | 3 - .../step/MesProdCraftRouteCheckStepService.java | 271 +++++++++++++++------ .../step/MesProductSnReadStepService.java | 2 +- .../step/MesProductSnScanNosortStepService.java | 22 +- .../step/MesProductSnScanSortStepService.java | 16 +- .../step/MesWorkOrderCheckSortStepService.java | 4 +- .../step/MesWorkOrderCheckStepService.java | 2 +- .../step/MesWorkOrderReadStepService.java | 2 +- .../MesProductionProcessMonitorService.java | 8 + .../pcn/pojo/context/MesProductionPartContext.java | 22 ++ .../pcn/pojo/context/MesProductionPsInContext.java | 16 +- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 6 +- 14 files changed, 278 insertions(+), 128 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java index 042ad6c..8b13ad0 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java @@ -1,5 +1,9 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import io.swagger.annotations.ApiOperation; + +import java.util.List; import java.util.Map; /** @@ -24,4 +28,8 @@ public interface IMesProductionRecordService { * */ Map checkSnTimeliness(String organizeCode, String serialNo, Long sourceId, Integer dataSource, Boolean isAssembly); + + @ApiOperation(value = "根据零件条码,物料编码,工序代码,工艺代码查询加工记录信息") + List findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode); + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java index 58b9497..af90bc1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionRecordService; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; @@ -29,14 +30,15 @@ import java.util.stream.Collectors; **/ @Service public class MesProductionRecordService implements IMesProductionRecordService { + @Autowired - private MesTimeEfficientCfgRepository mesTimeEfficientCfgRao; + private MesTimeEfficientCfgRepository timeEfficientCfgRepository; @Autowired - private MesProductionRecordRepository mesProductionRecordRao; + private MesProductionRecordRepository productionRecordRepository; @Autowired - private MesProductionAssemblyRepository mesProductionAssemblyRao; + private MesProductionAssemblyRepository productionAssemblyRepository; /** * 逻辑: @@ -70,7 +72,7 @@ public class MesProductionRecordService implements IMesProductionRecordService { //1.根据prodRuleNoSortId 获取 非排序加工规则的 时效性数据 --- 当前的条码需要完全匹配查询的规则 DdlPackBean timelinessPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getNumEqualPack(sourceId, MesPcnExtConstWords.SOURCE_ID, timelinessPackBean); - List timelinessList = mesTimeEfficientCfgRao.findByHqlWhere(timelinessPackBean); + List timelinessList = timeEfficientCfgRepository.findByHqlWhere(timelinessPackBean); //2.如果timelinessList为空 且 非装配件校验 直接返回true if (timelinessList.isEmpty() && !isAssembly){ @@ -81,7 +83,7 @@ public class MesProductionRecordService implements IMesProductionRecordService { //3.根据条码获取生产加工记录结果 DdlPackBean recordPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(serialNo, MesPcnExtConstWords.PRODUCT_SN, recordPackBean); - List recordList = mesProductionRecordRao.findByHqlWhere(recordPackBean); + List recordList = productionRecordRepository.findByHqlWhere(recordPackBean); boolean checkedResult = checkProductSn(recordList, timelinessList); if (!checkedResult){ resultMap.put(MesPcnExtConstWords.RESULT, false); @@ -92,11 +94,11 @@ public class MesProductionRecordService implements IMesProductionRecordService { if (isAssembly){ Date now = new Date(); for (MesTimeEfficientCfg timeliness : timelinessList) { - //需要查询装配件记录表 production_assembly mesProductionAssemblyRao + //需要查询装配件记录表 production_assembly productionAssemblyRepository DdlPackBean assemblyPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(serialNo,"assemblySn",assemblyPackBean); DdlPreparedPack.getStringEqualPack(timeliness.getCraftCode(),"craftCode",assemblyPackBean); - List productionAssemblyList = mesProductionAssemblyRao.findByHqlWhere(assemblyPackBean); + List productionAssemblyList = productionAssemblyRepository.findByHqlWhere(assemblyPackBean); MesProductionAssembly mesProductionAssembly = productionAssemblyList.get(0); String productDateTimeStr = mesProductionAssembly.getCreateDatetime(); @@ -188,4 +190,12 @@ public class MesProductionRecordService implements IMesProductionRecordService { return true; } + + @Override + public List findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode) { + return productionRecordRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PRODUCT_SN, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.CRAFT_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn, partNo, processCode, craftCode}); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java index e3fbded..32b4fc6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java @@ -83,9 +83,6 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); - //当前工序已存在头道模具号跟产出零件信息 - if (productionDispatchContextStepService.checkFirstMouldNoIsExistContext(reqBean) && productionDispatchContextStepService.checkProductionPartIsExistContext(reqBean)) return stepResult; - //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java index 4d92abd..cb34b16 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java @@ -1,75 +1,196 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; - -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService; -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.pojo.context.MesProductionProcessContext; -import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; -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 lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * @Description : 工艺路线验证工步 - * @Author : wangjie - **/ -@Slf4j -@Service("mesProdCraftRouteCheckStepService") -public class MesProdCraftRouteCheckStepService extends BaseStepService { - - @Autowired - private IMesProductionProcessContextStepService productionProcessContextStepService; - - @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; - - @Autowired - private IMesProduceSnExtService produceSnExtService; - - @Override - public StepResult execute(StationRequestBean reqBean) { - - StationResultBean resultBean = new StationResultBean(); - - StepResult stepResult = StepResult.getSuccessComplete(); - - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); - - //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); - - //存储生产过程上下文对象 - productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); - - //从上下文中取出生产线对象 - MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - - //从上下文中取出工位对象 - MesWorkCell workCell = productionProcessContext.getWorkCell(); - - - - - - - - - - - - - - - - - return stepResult; - - } - -} +//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +// +//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.api.busi.IMesProductionRecordService; +//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +//import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +//import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +//import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail; +//import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +//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 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.*; +//import java.util.stream.Collectors; +// +///** +// * @Description : 前道工艺防错工步 +// * @Author : wangjie +// **/ +//@Slf4j +//@Service("mesProdCraftRouteCheckStepService") +//public class MesProdCraftRouteCheckStepService extends BaseStepService { +// +// @Autowired +// private IMesProductionProcessContextStepService productionProcessContextStepService; +// +// @Autowired +// private IMesProductionDispatchContextStepService productionDispatchContextStepService; +// +// @Autowired +// private IMesProductionRecordService productionRecordService; +// +// @Autowired +// private IFsmRouteDataService fsmRouteDataService; +// +// @Override +// public StepResult execute(StationRequestBean reqBean) { +// +// StationResultBean resultBean = new StationResultBean(); +// +// StepResult stepResult = StepResult.getSuccessComplete(); +// +// //获取上下文信息 +// MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); +// +// //获取生产过程上下文对象有异常信息 抛出异常 +// if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); +// +// //存储生产过程上下文对象 +// productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); +// +// //获取进料主条码数据信息 +// List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); +// +// if (CollectionUtils.isEmpty(productionPsInContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无主条码信息,无需进行前道工艺防错验证!"); +// +// Optional optional = productionPsInContextList.stream().filter(o -> (null != o && +// o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getIsCheckCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst(); +// if (null == optional || !optional.isPresent()) +// return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("生产线[%s]工位[%s]未设置前道工艺防错,无需进行前道工艺防错验证!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); +// +// //验证是否存在工艺强过码 +// List productSnList2Jump = doHandleCraftJumpCode(reqBean, productionPsInContextList); +// if (!CollectionUtils.isEmpty(productSnList2Jump)) +// return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("主条码%s跳过前道工艺防错验证成功!", productSnList2Jump.toString())); +// +// List partNoList = (productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()) && +// o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); +// if (CollectionUtils.isEmpty(partNoList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "主条码均已通过前道工艺防错验证!"); +// +// //查询工艺路线数据 +// Map> craftRouteDataMap = new HashMap<>(); +// partNoList.forEach(o -> doHandleProdCraftData(reqBean, o, craftRouteDataMap)); +// +// if (CollectionUtils.isEmpty(craftRouteDataMap) || craftRouteDataMap.size() != partNoList.size()) +// return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件编码%s未匹配到产品工艺路线!", +// CollectionUtils.isEmpty(craftRouteDataMap) ? partNoList.toString() : partNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !craftRouteDataMap.containsKey(o))).collect(Collectors.toList()).toString())); +// +// //前道工艺防错验证处理 +// doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, productionPsInContextList, craftRouteDataMap); +// +// return stepResult; +// +// } +// +// //查询工艺路线数据 +// private void doHandleProdCraftData(StationRequestBean reqBean, String o, Map> craftRouteDataMap) { +// List craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, o); +// if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList); +// } +// +// //验证是否存在工艺强过码, 存在则保存 获取进料主条码数据信息,并返回强过的主条码 +// private List doHandleCraftJumpCode(StationRequestBean reqBean, List productionPsInContextList) { +// +// List productSnList2Jump = null; +// +// for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { +// +// if (null == productionPsInContext || productionPsInContext.getIsCheckCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 || StringUtils.isEmpty(productionPsInContext.getCraftJumpCode())) continue; +// +// if (CollectionUtils.isEmpty(productSnList2Jump)) productSnList2Jump = new ArrayList<>(); +// +// productSnList2Jump.add(productionPsInContext.getProductSn()); +// +// productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); +// +// } +// +// //保存进料主条码数据 +// if (!CollectionUtils.isEmpty(productSnList2Jump)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); +// +// return productSnList2Jump; +// +// } +// +// //前道工艺防错验证处理 +// private void doHandleProdCraftRouteCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, +// List productionPsInContextList, Map> craftRouteDataMap) { +// +// for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { +// +// if (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getPartNo()) || productionPsInContext.getIsCheckCraft().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; +// +// //前道工艺防错验证 +// Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo())); +// +// if (!result) productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); +// else productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); +// +// } +// +// //保存进料主条码数据 +// productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); +// +// if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean.writeDbLog(), "主条码前道工艺防错验证成功!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); +// else this.sendMessage(reqBean, resultBean.writeDbLog(), stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); +// +// } +// +// //前道工艺防错验证 +// private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { +// +// String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; +// +// //判断主条码的当前工艺是否包含在产品工艺路线中 +// Optional optionalPs = StringUtils.isEmpty(productionPsInContext.getCraftCode()) ? null : craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionPsInContext.getCraftCode()))).findFirst(); +// if (!StringUtils.isEmpty(productionPsInContext.getCraftCode()) && (null == optionalPs || !optionalPs.isPresent())) +// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]对应的工艺代码[%s]不匹配零件[%s]对应的产品工艺路线[%s]", +// message, productionPsInContext.getProductSn(), productionPsInContext.getCraftCode(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode())).isCompleted(); +// +// //判断当前工位的工序对应的工艺是否包含在产品工艺路线中 +// Optional optionalCell = craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).findFirst(); +// if (null == optionalCell || !optionalCell.isPresent()) +// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]零件[%s]对应的产品工艺路线[%s]不包含当前工位[%s]对应的工艺[%s]工序[%s]", +// message, productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())).isCompleted(); +// +// //验证工艺对应工序最多经过1个: 当前主条码的工艺字段有值, 对应的工艺路线明细信息设置了【true】, 当前工位的工艺与主条码的当前工艺相同, 当前工位的工序与主条码的当前工序不相同 +// if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getAtMostProcess().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode()) && !reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) +// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]相同工艺对应工序最多经过1个,上道工艺[%s]当前工位工艺[%s]", +// message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); +// +// //验证是否捆绑后道工艺: 如果当前工位的工艺与主条码的当前工艺不一致的情况下, 根据主条码的当前工艺获取在工艺路线明细的下一个工艺, 判断当前工位的工艺与下个工艺是否一致 +// if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getIsBindNextCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode())) { +// Optional optional = craftRouteDetailList.stream().filter(o -> (null != o && o.getSeq().compareTo(optionalPs.get().getSeq()) > 0)).findFirst(); +// if (null != optionalCell && optionalCell.isPresent() && !productionProcessContext.getCraftCode().equals(optional.get().getCraftCode())) +// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]捆绑后道工艺,上道工艺[%s]下道工艺[%s]当前工位工艺[%s]", +// message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), optional.get().getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); +// } +// +// //验证已完成工序最大重复次数: 如果当前工位的工序与主条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数 +// if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0) { +// List productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()); +// if (!CollectionUtils.isEmpty(productionRecordList) && productionRecordList.size() >= optionalPs.get().getRepeatTimes()) +// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]", +// message, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted(); +// } +// +// //验证首工艺 +// +// +// +// +// } +// +//} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java index ea91d23..389adf2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java @@ -78,7 +78,7 @@ public class MesProductSnReadStepService extends BaseStepService { //当前工序已存在读取待验证的主条码信息 if (productionDispatchContextStepService.checkScanProductSnIsExistContext(reqBean)) return stepResult; - //TODO 后面增加工艺跳过码 通过按钮触发 判断是否存在已验证主条码 且 存在工艺验证错误的数据 进行标记后放行 + //TODO 后面增加工艺强过码 通过按钮触发 判断是否存在已验证主条码 且 存在工艺验证错误的数据 进行标记后放行 //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java index 1369ca0..683e43b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java @@ -90,10 +90,10 @@ public class MesProductSnScanNosortStepService extends BaseStepService { //获取进料主条码数据信息 List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - //验证扫描信息是否属于工艺跳过码 + //验证扫描信息是否属于工艺强过码 Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo); - //不属于工艺跳过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 + //不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo) && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = updateProductionPsInContextList(reqBean, productionPsInContextList); //先判断前期扫描数量 @@ -109,11 +109,11 @@ public class MesProductSnScanNosortStepService extends BaseStepService { Boolean isAllowJump = checkIsAllowJump(productionPsInContextList); //当前不允许跳过 - if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo)); + if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺强过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo)); //允许跳过,先更新数据 if (isCraftJumpCode && isAllowJump) updateProductionPsInContextList(reqBean, productionPsInContextList, scanInfo); - if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", scanInfo)); + if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺强过码[%s]!", scanInfo)); //扫描信息为空 并且 判断当前是否必须要扫描 if (StringUtils.isEmpty(scanInfo) && (scanedQty.compareTo(needQty) < 0 || isAllowJump)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!"); @@ -162,10 +162,10 @@ public class MesProductSnScanNosortStepService extends BaseStepService { return (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()); } - //不属于工艺跳过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 + //不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 private List updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { Integer sourceSize = productionPsInContextList.size(); - productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()); + productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() == sourceSize) return productionPsInContextList; //保存进料主条码数据 productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); @@ -184,23 +184,21 @@ public class MesProductSnScanNosortStepService extends BaseStepService { //验证是否支持跳过 private Boolean checkIsAllowJump(List productionPsInContextList) { Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst(); + productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); return (null != optional && optional.isPresent()) ? true : false; } - //验证扫描信息属于工艺跳过码 并且支持跳过,进行数据变更 + //验证扫描信息属于工艺强过码 并且支持跳过,进行数据变更 private List updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList, String craftJumpCode) { productionPsInContextList.forEach(o -> { - if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) { - o.setCraftJumpCode(craftJumpCode); - } + if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) o.setCraftJumpCode(craftJumpCode); }); //保存进料主条码数据 productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); return productionPsInContextList; } - //验证扫描信息是否属于工艺跳过码 + //验证扫描信息是否属于工艺强过码 private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) { if (StringUtils.isEmpty(scanInfo)) return false; String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java index 755526f..e48c339 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java @@ -95,7 +95,7 @@ public class MesProductSnScanSortStepService extends BaseStepService { //保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】 if (CollectionUtils.isEmpty(productionPsInContextList)) return saveScanProductSnContextSort(reqBean, resultBean, stepResult, productionPartContextList); - //获取上下文扫/读信息:主条码 【工艺跳过码场景】 + //获取上下文扫/读信息:主条码 【工艺强过码场景】 List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中没有待验证的主条码信息!"); @@ -103,13 +103,13 @@ public class MesProductSnScanSortStepService extends BaseStepService { //删除上下文扫/读信息:主条码 if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanProductSnContext(reqBean); - //验证是否匹配工艺跳过码 + //验证是否匹配工艺强过码 if (equipVariableCollectContextList.size() != 1 || checkScanInfoMatchCraftJumpCode(reqBean, equipVariableCollectContextList.get(0).getEquipVariableValue())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前上下文中待验证的主条码%s无效!", equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString())); //验证是否支持跳过 - if (!checkIsAllowJump(productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前不支持通过工艺跳过码[%s]执行跳过!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + if (!checkIsAllowJump(productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前不支持通过工艺强过码[%s]执行跳过!", equipVariableCollectContextList.get(0).getEquipVariableValue())); return updateProductionPsInContextList(reqBean, resultBean, stepResult, productionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue()); @@ -137,7 +137,7 @@ public class MesProductSnScanSortStepService extends BaseStepService { return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "根据加工单生成待验证主条码信息执行成功!"); } - //验证扫描信息是否属于工艺跳过码 + //验证扫描信息是否属于工艺强过码 private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) { if (StringUtils.isEmpty(scanInfo)) return false; String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); @@ -148,16 +148,14 @@ public class MesProductSnScanSortStepService extends BaseStepService { //验证是否支持跳过 private Boolean checkIsAllowJump(List productionPsInContextList) { Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst(); + productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); return (null != optional && optional.isPresent()) ? true : false; } - //验证扫描信息属于工艺跳过码 并且支持跳过,进行数据变更 + //验证扫描信息属于工艺强过码 并且支持跳过,进行数据变更 private StepResult updateProductionPsInContextList(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List productionPsInContextList, String craftJumpCode) { productionPsInContextList.forEach(o -> { - if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) { - o.setCraftJumpCode(craftJumpCode); - } + if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) o.setCraftJumpCode(craftJumpCode); }); //保存进料主条码数据 productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java index 56b1791..5f2c838 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java @@ -73,9 +73,9 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi //从上下文中取出生产线对象 MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //排序线: 存在已验证的主条码信息时, 验证扫描信息是否属于工艺跳过码, 保存到读/扫主条码上下文中 + //排序线: 存在已验证的主条码信息时, 验证扫描信息是否属于工艺强过码, 保存到读/扫主条码上下文中 if (productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean) && doMatchCraftJumpCode(reqBean, equipVariableCollectContextList)) - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺强过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue())); //获取上下文产出零件信息 List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java index 04271d8..99b4697 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java @@ -92,7 +92,7 @@ public class MesWorkOrderCheckStepService extends BaseStepService { return null; } - //验证扫描信息是否属于工艺跳过码 + //验证扫描信息是否属于工艺强过码 public Boolean doMatchCraftJumpCode(StationRequestBean reqBean, List equipVariableCollectContextList) { if (equipVariableCollectContextList.size() != 1 || MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return false; String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java index 65b448e..c7704a3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java @@ -75,7 +75,7 @@ public class MesWorkOrderReadStepService extends BaseStepService { //当前工序已存在读取待验证的加工单信息 if (productionDispatchContextStepService.checkScanWorkOrderNoIsExistContext(reqBean)) return stepResult; - //TODO 后面增加工艺跳过码 通过按钮触发 写入 ScanWorkOrderNoContext 数据类型:扫描信息 直接放行 + //TODO 后面增加工艺强过码 通过按钮触发 写入 ScanWorkOrderNoContext 数据类型:扫描信息 直接放行 //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessMonitorService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessMonitorService.java index f04a83d..fbf2956 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessMonitorService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessMonitorService.java @@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; 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.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.process.BaseProcessMonitorService; import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; @@ -17,6 +18,9 @@ import org.springframework.stereotype.Service; public class MesProductionProcessMonitorService extends BaseProcessMonitorService { @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired @@ -54,6 +58,10 @@ public class MesProductionProcessMonitorService extends BaseProcessMonitorServic productionDispatchContextStepService.doFlushProductionDispatchContext(requestBean); //清除工步客制化区域数据【装配件清单】 this.sendMessage(requestBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue())); + + //清除上下文中的所有基础数据 //TODO 临时增加 后面删掉 + productionProcessContextStepService.doFlushProductionProcessContext(requestBean); + return true; } } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java index b0ca435..01703e7 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesMouldMultiCavity; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import io.swagger.annotations.ApiParam; @@ -71,6 +72,17 @@ public class MesProductionPartContext implements Serializable { @ApiParam("工单序号【用于发送设备加工参数】") private String workOrderSeq; + @ApiParam("工艺强过码") + private String craftJumpCode; + + //默认否 + @ApiParam("是否顺序防错") + private Integer isCheckSeq = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(); + + //默认未验证 + @ApiParam("顺序防错结果") + private Integer checkSeqResult = MesPcnExtConstWords.ZERO; + //默认否 @ApiParam("业务验证之后需要清除的数据标志") private Integer busiCheckToDelete = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(); @@ -111,4 +123,14 @@ public class MesProductionPartContext implements Serializable { return this; } + public MesProductionPartContext isCheck(MesWorkCell workCell) { + this.isCheckSeq = workCell.getIsCheckSeq(); + return this; + } + + public MesProductionPartContext checkSeqResult(Integer checkSeqResult) { + this.checkSeqResult = checkSeqResult; + return this; + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java index 788233d..d7ffb9b 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java @@ -60,7 +60,7 @@ public class MesProductionPsInContext implements Serializable { @ApiParam(value ="工艺代码") private String craftCode; - @ApiParam("工艺跳过码") + @ApiParam("工艺强过码") private String craftJumpCode; @ApiParam("信息来源") @@ -71,18 +71,10 @@ public class MesProductionPsInContext implements Serializable { private Integer isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(); //默认否 - @ApiParam("是否顺序防错") - private Integer isCheckSeq = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(); - - //默认否 @ApiParam(name = "是否前道工艺防错") private Integer isCheckCraft = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(); //默认未验证 - @ApiParam("顺序防错结果") - private Integer checkSeqResult = MesPcnExtConstWords.ZERO; - - //默认未验证 @ApiParam(name = "前道工艺防错结果") private Integer checkCraftResult = MesPcnExtConstWords.ZERO; @@ -98,16 +90,10 @@ public class MesProductionPsInContext implements Serializable { } public MesProductionPsInContext isCheck(MesWorkCell workCell) { - this.isCheckSeq = workCell.getIsCheckSeq(); this.isCheckCraft = workCell.getIsCheckCraft(); return this; } - public MesProductionPsInContext checkSeqResult(Integer checkSeqResult) { - this.checkSeqResult = checkSeqResult; - return this; - } - public MesProductionPsInContext checkCraftResult(Integer checkCraftResult) { this.checkCraftResult = checkCraftResult; return this; 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 99977de..f7ac860 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 @@ -87,6 +87,8 @@ public class MesPcnExtConstWords { public static final String SHIFT_GROUP = "shiftGroup"; // 工序代码 public static final String PROCESS_CODE = "processCode"; + // 工艺代码 + public static final String CRAFT_CODE = "craftCode"; // 生产工单号 public static final String WORK_ORDER_NO = "workOrderNo"; // 数据来源 @@ -159,7 +161,7 @@ public class MesPcnExtConstWords { // 读取失败睡眠毫秒数[工步参数] public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP"; // 读取失败睡眠默认毫秒数 - public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 500L; + public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 1000L; // 最大重试次数[工步参数] public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES"; // 最大重试次数[工步参数] @@ -167,7 +169,7 @@ public class MesPcnExtConstWords { // 排序需要扫描主条码配置[工步参数] public static final String SORT_NEED_SCAN_PS = "SORT_NEED_SCAN_PS"; - // 工艺跳过码(前后防错/顺序防错)[工位参数] + // 工艺强过码(前后防错/顺序防错)[工位参数] public static final String CRAFT_JUMP_CODE = "CRAFT_JUMP_CODE"; // 未知腔数[工位参数] public static final String CAVITY_UNKNOWN_CFG = "CAVITY_UNKNOWN_CFG"; From 9584c2d05e159c00eeda88c8336a55ba2420612d Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Fri, 28 Jun 2024 13:08:17 +0800 Subject: [PATCH 02/12] step --- .../step/MesProdCraftRouteCheckStepService.java | 423 +++++++++++---------- .../step/MesProductionDataSaveStepService.java | 2 +- 2 files changed, 228 insertions(+), 197 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java index cb34b16..2fa786e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java @@ -1,196 +1,227 @@ -//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -// -//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.api.busi.IMesProductionRecordService; -//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; -//import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; -//import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; -//import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; -//import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -//import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -//import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail; -//import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; -//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 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.*; -//import java.util.stream.Collectors; -// -///** -// * @Description : 前道工艺防错工步 -// * @Author : wangjie -// **/ -//@Slf4j -//@Service("mesProdCraftRouteCheckStepService") -//public class MesProdCraftRouteCheckStepService extends BaseStepService { -// -// @Autowired -// private IMesProductionProcessContextStepService productionProcessContextStepService; -// -// @Autowired -// private IMesProductionDispatchContextStepService productionDispatchContextStepService; -// -// @Autowired -// private IMesProductionRecordService productionRecordService; -// -// @Autowired -// private IFsmRouteDataService fsmRouteDataService; -// -// @Override -// public StepResult execute(StationRequestBean reqBean) { -// -// StationResultBean resultBean = new StationResultBean(); -// -// StepResult stepResult = StepResult.getSuccessComplete(); -// -// //获取上下文信息 -// MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); -// -// //获取生产过程上下文对象有异常信息 抛出异常 -// if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); -// -// //存储生产过程上下文对象 -// productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); -// -// //获取进料主条码数据信息 -// List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); -// -// if (CollectionUtils.isEmpty(productionPsInContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无主条码信息,无需进行前道工艺防错验证!"); -// -// Optional optional = productionPsInContextList.stream().filter(o -> (null != o && -// o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getIsCheckCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst(); -// if (null == optional || !optional.isPresent()) -// return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("生产线[%s]工位[%s]未设置前道工艺防错,无需进行前道工艺防错验证!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); -// -// //验证是否存在工艺强过码 -// List productSnList2Jump = doHandleCraftJumpCode(reqBean, productionPsInContextList); -// if (!CollectionUtils.isEmpty(productSnList2Jump)) -// return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("主条码%s跳过前道工艺防错验证成功!", productSnList2Jump.toString())); -// -// List partNoList = (productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()) && -// o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); -// if (CollectionUtils.isEmpty(partNoList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "主条码均已通过前道工艺防错验证!"); -// -// //查询工艺路线数据 -// Map> craftRouteDataMap = new HashMap<>(); -// partNoList.forEach(o -> doHandleProdCraftData(reqBean, o, craftRouteDataMap)); -// -// if (CollectionUtils.isEmpty(craftRouteDataMap) || craftRouteDataMap.size() != partNoList.size()) -// return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件编码%s未匹配到产品工艺路线!", -// CollectionUtils.isEmpty(craftRouteDataMap) ? partNoList.toString() : partNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !craftRouteDataMap.containsKey(o))).collect(Collectors.toList()).toString())); -// -// //前道工艺防错验证处理 -// doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, productionPsInContextList, craftRouteDataMap); -// -// return stepResult; -// -// } -// -// //查询工艺路线数据 -// private void doHandleProdCraftData(StationRequestBean reqBean, String o, Map> craftRouteDataMap) { -// List craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, o); -// if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList); -// } -// -// //验证是否存在工艺强过码, 存在则保存 获取进料主条码数据信息,并返回强过的主条码 -// private List doHandleCraftJumpCode(StationRequestBean reqBean, List productionPsInContextList) { -// -// List productSnList2Jump = null; -// -// for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { -// -// if (null == productionPsInContext || productionPsInContext.getIsCheckCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 || StringUtils.isEmpty(productionPsInContext.getCraftJumpCode())) continue; -// -// if (CollectionUtils.isEmpty(productSnList2Jump)) productSnList2Jump = new ArrayList<>(); -// -// productSnList2Jump.add(productionPsInContext.getProductSn()); -// -// productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); -// -// } -// -// //保存进料主条码数据 -// if (!CollectionUtils.isEmpty(productSnList2Jump)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); -// -// return productSnList2Jump; -// -// } -// -// //前道工艺防错验证处理 -// private void doHandleProdCraftRouteCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, -// List productionPsInContextList, Map> craftRouteDataMap) { -// -// for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { -// -// if (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getPartNo()) || productionPsInContext.getIsCheckCraft().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; -// -// //前道工艺防错验证 -// Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo())); -// -// if (!result) productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); -// else productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); -// -// } -// -// //保存进料主条码数据 -// productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); -// -// if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean.writeDbLog(), "主条码前道工艺防错验证成功!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); -// else this.sendMessage(reqBean, resultBean.writeDbLog(), stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); -// -// } -// -// //前道工艺防错验证 -// private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { -// -// String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; -// -// //判断主条码的当前工艺是否包含在产品工艺路线中 -// Optional optionalPs = StringUtils.isEmpty(productionPsInContext.getCraftCode()) ? null : craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionPsInContext.getCraftCode()))).findFirst(); -// if (!StringUtils.isEmpty(productionPsInContext.getCraftCode()) && (null == optionalPs || !optionalPs.isPresent())) -// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]对应的工艺代码[%s]不匹配零件[%s]对应的产品工艺路线[%s]", -// message, productionPsInContext.getProductSn(), productionPsInContext.getCraftCode(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode())).isCompleted(); -// -// //判断当前工位的工序对应的工艺是否包含在产品工艺路线中 -// Optional optionalCell = craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).findFirst(); -// if (null == optionalCell || !optionalCell.isPresent()) -// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]零件[%s]对应的产品工艺路线[%s]不包含当前工位[%s]对应的工艺[%s]工序[%s]", -// message, productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())).isCompleted(); -// -// //验证工艺对应工序最多经过1个: 当前主条码的工艺字段有值, 对应的工艺路线明细信息设置了【true】, 当前工位的工艺与主条码的当前工艺相同, 当前工位的工序与主条码的当前工序不相同 -// if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getAtMostProcess().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode()) && !reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) -// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]相同工艺对应工序最多经过1个,上道工艺[%s]当前工位工艺[%s]", -// message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); -// -// //验证是否捆绑后道工艺: 如果当前工位的工艺与主条码的当前工艺不一致的情况下, 根据主条码的当前工艺获取在工艺路线明细的下一个工艺, 判断当前工位的工艺与下个工艺是否一致 -// if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getIsBindNextCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode())) { -// Optional optional = craftRouteDetailList.stream().filter(o -> (null != o && o.getSeq().compareTo(optionalPs.get().getSeq()) > 0)).findFirst(); -// if (null != optionalCell && optionalCell.isPresent() && !productionProcessContext.getCraftCode().equals(optional.get().getCraftCode())) -// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]捆绑后道工艺,上道工艺[%s]下道工艺[%s]当前工位工艺[%s]", -// message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), optional.get().getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); -// } -// -// //验证已完成工序最大重复次数: 如果当前工位的工序与主条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数 -// if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0) { -// List productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()); -// if (!CollectionUtils.isEmpty(productionRecordList) && productionRecordList.size() >= optionalPs.get().getRepeatTimes()) -// return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]", -// message, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted(); -// } -// -// //验证首工艺 -// -// -// -// -// } -// -//} +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +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.api.busi.IMesProductionRecordService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +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 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.*; +import java.util.stream.Collectors; + +/** + * @Description : 前道工艺防错工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProdCraftRouteCheckStepService") +public class MesProdCraftRouteCheckStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionRecordService productionRecordService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //获取进料主条码数据信息 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + if (CollectionUtils.isEmpty(productionPsInContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无主条码信息,无需进行前道工艺防错验证!"); + + Optional optional = productionPsInContextList.stream().filter(o -> (null != o && + o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getIsCheckCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst(); + if (null == optional || !optional.isPresent()) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("生产线[%s]工位[%s]未设置前道工艺防错,无需进行前道工艺防错验证!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + //验证是否存在工艺强过码 + List productSnList2Jump = doHandleCraftJumpCode(reqBean, productionPsInContextList); + if (!CollectionUtils.isEmpty(productSnList2Jump)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("主条码%s跳过前道工艺防错验证成功!", productSnList2Jump.toString())); + + List partNoList = (productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()) && + o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(partNoList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "主条码均已通过前道工艺防错验证!"); + + //查询工艺路线数据 + Map> craftRouteDataMap = new HashMap<>(); + partNoList.forEach(o -> doHandleProdCraftData(reqBean, o, craftRouteDataMap)); + + if (CollectionUtils.isEmpty(craftRouteDataMap) || craftRouteDataMap.size() != partNoList.size()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件编码%s未匹配到产品工艺路线!", + CollectionUtils.isEmpty(craftRouteDataMap) ? partNoList.toString() : partNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !craftRouteDataMap.containsKey(o))).collect(Collectors.toList()).toString())); + + //前道工艺防错验证处理 + doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, productionPsInContextList, craftRouteDataMap); + + return stepResult; + + } + + //查询工艺路线数据 + private void doHandleProdCraftData(StationRequestBean reqBean, String o, Map> craftRouteDataMap) { + List craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, o); + if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList); + } + + //验证是否存在工艺强过码, 存在则保存 获取进料主条码数据信息,并返回强过的主条码 + private List doHandleCraftJumpCode(StationRequestBean reqBean, List productionPsInContextList) { + + List productSnList2Jump = null; + + for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { + + if (null == productionPsInContext || productionPsInContext.getIsCheckCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 || StringUtils.isEmpty(productionPsInContext.getCraftJumpCode())) continue; + + if (CollectionUtils.isEmpty(productSnList2Jump)) productSnList2Jump = new ArrayList<>(); + + productSnList2Jump.add(productionPsInContext.getProductSn()); + + productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + + } + + //保存进料主条码数据 + if (!CollectionUtils.isEmpty(productSnList2Jump)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + + return productSnList2Jump; + + } + + //前道工艺防错验证处理 + private void doHandleProdCraftRouteCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, + List productionPsInContextList, Map> craftRouteDataMap) { + + for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { + + if (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getPartNo()) || productionPsInContext.getIsCheckCraft().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; + + //前道工艺防错验证 + Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo())); + + if (!result) productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + else productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + + } + + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + + if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean.writeDbLog(), "主条码前道工艺防错验证成功!", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + else this.sendMessage(reqBean, resultBean.writeDbLog(), stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + + } + + //前道工艺防错验证 + private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { + + String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; + + //判断主条码的当前工艺是否包含在产品工艺路线中 + Optional optionalPs = StringUtils.isEmpty(productionPsInContext.getCraftCode()) ? null : craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionPsInContext.getCraftCode()))).findFirst(); + if (!StringUtils.isEmpty(productionPsInContext.getCraftCode()) && (null == optionalPs || !optionalPs.isPresent())) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]对应的工艺代码[%s]不匹配零件[%s]对应的产品工艺路线[%s]", + message, productionPsInContext.getProductSn(), productionPsInContext.getCraftCode(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode())).isCompleted(); + + //判断当前工位的工序对应的工艺是否包含在产品工艺路线中 + Optional optionalCell = craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).findFirst(); + if (null == optionalCell || !optionalCell.isPresent()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]零件[%s]对应的产品工艺路线[%s]不包含当前工位[%s]对应的工艺[%s]工序[%s]", + message, productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())).isCompleted(); + + //验证工艺对应工序最多经过1个: 当前主条码的工艺字段有值, 对应的工艺路线明细信息设置了【true】, 当前工位的工艺与主条码的当前工艺相同, 当前工位的工序与主条码的当前工序不相同 + if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getAtMostProcess().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode()) && !reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]相同工艺对应工序最多经过1个,上道工艺[%s]当前工位工艺[%s]", + message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); + + //验证是否捆绑后道工艺: 如果当前工位的工艺与主条码的当前工艺不一致的情况下, 根据主条码的当前工艺获取在工艺路线明细的下一个工艺, 判断当前工位的工艺与下个工艺是否一致 + if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getIsBindNextCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode())) { + Optional optional = craftRouteDetailList.stream().filter(o -> (null != o && o.getSeq().compareTo(optionalPs.get().getSeq()) > 0)).findFirst(); + if (null != optionalCell && optionalCell.isPresent() && !productionProcessContext.getCraftCode().equals(optional.get().getCraftCode())) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]捆绑后道工艺,上道工艺[%s]下道工艺[%s]当前工位工艺[%s]", + message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), optional.get().getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); + } + + //验证已完成工序最大重复次数: 如果当前工位的工序与主条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数 + if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) { + List productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()); + if (!CollectionUtils.isEmpty(productionRecordList) && productionRecordList.size() >= optionalPs.get().getRepeatTimes()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]", + message, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted(); + } + + //根据当前工位对应的工艺 获取 所有前道工艺 + List beforeCellCraftList = craftRouteDetailList.stream().filter(o -> (null != o && o.getSeq().compareTo(optionalCell.get().getSeq()) < 0)).collect(Collectors.toList()); + + //验证首工艺: 当前主条码的工艺字段有值,并且当前工位的工艺不等于主条码的当前工艺。 如果等于已经在【验证工艺对应工序最多经过1个】与【 验证已完成工序最大重复次数】 中验证通过,所以这边只考虑不相等 + if (CollectionUtils.isEmpty(beforeCellCraftList) && !StringUtils.isEmpty(productionPsInContext.getCraftCode()) && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode())) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]已经过首道工艺[%s]", message, productionPsInContext.getProductSn(), productionProcessContext.getCraftCode())).isCompleted(); + + //执行首道工艺 【非工位扫描直接生成的自制件条码】 当前主条码验证通过 + if (CollectionUtils.isEmpty(beforeCellCraftList)) return true; + + //当前主条码的工艺字段为空【非工位扫描直接生成的自制件条码】 + if (StringUtils.isEmpty(productionPsInContext.getCraftCode()) && craftRouteDetailList.get(0).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过首道工艺[%s]", message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftCode())).isCompleted(); + + //搜集主条码当前工艺于当前工位对应工艺之间的未完成的工艺集合 + List unCompleteCraftList; + if (StringUtils.isEmpty(productionPsInContext.getCraftCode())) unCompleteCraftList = beforeCellCraftList; + else { + Optional optional = beforeCellCraftList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionPsInContext.getCraftCode()))).findFirst(); + if (null == optional || !optional.isPresent()) //在工位对应的工艺之前的所有前道工艺中未找到主条码的当前工艺则表示主条码已经过当前工艺 + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]已经过当前工艺[%s]", message, productionPsInContext.getProductSn(), productionProcessContext.getCraftCode())).isCompleted(); + unCompleteCraftList = beforeCellCraftList.stream().filter(o -> (null != o && o.getSeq().compareTo(optional.get().getSeq()) > 0)).collect(Collectors.toList()); + } + + //如果没有未完成的工艺, 则代表当前工位可操作 + if (CollectionUtils.isEmpty(unCompleteCraftList)) return true; + + //未完成工艺重新正序 + unCompleteCraftList = unCompleteCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq)).collect(Collectors.toList()); + + Optional optional = unCompleteCraftList.stream().filter(o -> (null != o && o.getIsChoose() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue())).findFirst(); + if (null != optional && optional.isPresent()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), optional.get().getCraftCode())).isCompleted(); + + return true; + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java index 30b3ccd..4685bf2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java @@ -40,7 +40,7 @@ public class MesProductionDataSaveStepService extends BaseStepService { ((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).execute(reqBean); //生产汇报工步 【此工步未整改】 - ((IStepService) SpringContextsUtil.getBean("mesReportGenerateStepService")).execute(reqBean); + //((IStepService) SpringContextsUtil.getBean("mesReportGenerateStepService")).execute(reqBean); //保存工单信息工步 ((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).execute(reqBean); From f416fe94ce81fe0515317bbe3c7e9e54a670e576 Mon Sep 17 00:00:00 2001 From: gsz Date: Fri, 28 Jun 2024 15:13:57 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=89=8D=E4=B8=80?= =?UTF-8?q?=E5=A4=A9=E5=BE=85=E6=8A=A5=E5=B7=A5=E8=AE=B0=E5=BD=95=E6=95=B0?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E5=B7=A5=E5=8D=95=E5=B9=B6=E6=8A=A5=E5=B7=A5?= =?UTF-8?q?job=E5=B7=A5=E4=BD=9C=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index ae83ec3..38faf05 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -832,7 +832,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { String[] split = stringListEntry.getKey().split("="); String workCenterCode = split[0]; String partNo = split[1]; - + //查询工作中心 DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); @@ -842,6 +842,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { MesWorkOrder item=new MesWorkOrder(); item.setOrganizeCode(organizeCode); item.setWorkCenterCode(workCenterCode); + item.setErpWorkCenter(mesWorkCenter.getErpWorkCenter()); item.setPartNo(partNo); item.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()); item.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue()); From 7574dfe69822c9ff3f8c6230039f87b11aae7452 Mon Sep 17 00:00:00 2001 From: jun Date: Fri, 28 Jun 2024 18:49:14 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E5=BC=80=E6=A8=A1?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE=E5=8F=91=E9=80=81=20?= =?UTF-8?q?=E8=BF=BD=E6=BA=AF=E6=8A=A5=E8=A1=A8=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/busi/IMesProdMouldStatisticsService.java | 4 ++ .../schedulejob/MesProdMouldStatisticsJob.java | 23 +++++-- .../busi/MesProdMouldStatisticsServiceImpl.java | 77 ++++++++++++++++++++-- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 9 +-- 4 files changed, 101 insertions(+), 12 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java index 502cd5f..31cc201 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java @@ -13,4 +13,8 @@ public interface IMesProdMouldStatisticsService { @ApiOperation("汇总生产开模统计") void doSumMesProdMouldStatistics(String organizeCode, Integer pageSize, String userName); + + + @ApiOperation("发送生产开模统计数据") + void doSendMesProdMouldStatistics(String organizeCode,String userName); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java index 95de35d..752c0b6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java @@ -40,10 +40,25 @@ public class MesProdMouldStatisticsJob extends BaseMesScheduleJob { List wmsJobParamModelList = JsonUtilTool.toList(this.getJobParam(), WmsJobParamModel.class); if (!CollectionUtils.isEmpty(wmsJobParamModelList)) { for (WmsJobParamModel wmsJobParamModel : wmsJobParamModelList) { - long startTime = System.currentTimeMillis(); - mesProdMouldStatisticsService.doSumMesProdMouldStatistics(wmsJobParamModel.getOrganizeCode(), wmsJobParamModel.getPageSize(), "job"); - long endTime = System.currentTimeMillis(); - log.info("工厂{}生产开模统计job --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime); + //统计数据 + try { + long startTime = System.currentTimeMillis(); + mesProdMouldStatisticsService.doSumMesProdMouldStatistics(wmsJobParamModel.getOrganizeCode(), wmsJobParamModel.getPageSize(), "job"); + long endTime = System.currentTimeMillis(); + log.info("工厂{}生产开模统计job --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime); + } catch (Exception e) { + log.info("工厂{}生产开模统计job 执行失败{}", wmsJobParamModel.getOrganizeCode(), e); + } + //发送数据 + try { + long startTime = System.currentTimeMillis(); + mesProdMouldStatisticsService.doSendMesProdMouldStatistics(wmsJobParamModel.getOrganizeCode(), "job"); + long endTime = System.currentTimeMillis(); + log.info("工厂{}生产开模统计发送数据 --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime); + } catch (Exception e) { + log.info("工厂{}生产开模统计发送数据 执行失败{}", wmsJobParamModel.getOrganizeCode(), e); + + } } } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java index 1b1a661..08d91e4 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java @@ -2,25 +2,26 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdMouldStatisticsService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProdMouldStatisticsDao; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService; import cn.estsh.i3plus.mes.pcn.util.DateUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesMouldMappingCfg; -import cn.estsh.i3plus.pojo.mes.bean.MesProdMouldRecord; -import cn.estsh.i3plus.pojo.mes.bean.MesProdMouldStatistics; -import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.repository.IMesMouldMappingCfgRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProdMouldRecordRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProdMouldStatisticsRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.hutool.http.HttpRequest; 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.ArrayList; import java.util.List; @@ -54,6 +55,9 @@ public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatistic @Autowired private MesProdMouldStatisticsRepository mesProdMouldStatisticsRDao; + @Autowired + private IConfigService configService; + @Override public void doSumMesProdMouldStatistics(String organizeCode, Integer pageSize, String userName) { //查询未统计的开模记录数据 @@ -80,6 +84,52 @@ public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatistic updateMesProductionRecord(organizeCode, userName, undStatisticsMesProdMouldRecordList.stream().map(MesProdMouldRecord::getId).collect(Collectors.toList())); } + @Override + public void doSendMesProdMouldStatistics(String organizeCode, String userName) { + Map mesConfigMap = getMesConfigMap(organizeCode); + if (mesConfigMap == null) { + return; + } + //发送URL + String sendUrl = getConfigValue(mesConfigMap, MesPcnExtConstWords.SEND_URL); + //发送data + String sendData = getConfigValue(mesConfigMap, MesPcnExtConstWords.SEND_DATA); + //发送item + String sendItemData = getConfigValue(mesConfigMap, MesPcnExtConstWords.SEND_ITEM_DATA); + if (Objects.isNull(sendUrl) || Objects.isNull(sendData) || Objects.isNull(sendItemData)) { + return; + } + //查询未发送数据 + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(CommonEnumUtil.FALSE, "systemSyncStatus", packBean); + DdlPreparedPack.getStringSmallerNotEqualPack(TimeTool.getToday(), "createDatetime", packBean); + DdlPreparedPack.getOrderBy("modifyDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), packBean); + List mesProdMouldStatisticsList = mesProdMouldStatisticsRDao.findByHqlWhere(packBean); + if (CollectionUtils.isEmpty(mesProdMouldStatisticsList)) { + log.info("不存在未发送的数据"); + return; + } + //发送数据 + StringBuilder itemData = new StringBuilder(); + for (MesProdMouldStatistics statistics : mesProdMouldStatisticsList) { + String time = TimeTool.parseStringFormat(statistics.getCreateDatetime(), "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ss"); + itemData.append(String.format(sendItemData, statistics.getAssetNum(), statistics.getEquipmentCode(), statistics.getQty(), time, "1117")); + } + String body = HttpRequest.post(sendUrl).header("Content-Type", "text/xml").body(String.format(sendData, itemData)).execute().body(); + //发送成功更新同步状态 + mesProdMouldStatisticsList.forEach(t -> { + if (!body.contains("messageID")) { + t.setSystemSyncStatus(CommonEnumUtil.FALSE); + t.setDescription(body); + } else { + t.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + } + ConvertBean.serviceModelUpdate(t, userName); + }); + mesProdMouldStatisticsRDao.saveAll(mesProdMouldStatisticsList); + + } + private void updateMesProductionRecord(String organizeCode, String userName, List idList) { //查询加工记录表 List mesProductionRecordList = getProductionRecordList(organizeCode, idList); @@ -105,6 +155,7 @@ public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatistic mesProdMouldStatistic.setWorkDate(mesProdMouldRecordEntry.getKey()); mesProdMouldStatistic.setAssetNum(mesMouldMappingCfg.getAssetNum()); mesProdMouldStatistic.setMeterName(mesMouldMappingCfg.getMeterName()); + mesProdMouldStatistic.setEquipmentCode(mesMouldMappingCfg.getEquipmentCode()); mesProdMouldStatistic.setQty(mesProdMouldRecordEntry.getValue().size()); mesProdMouldStatistic.setOrganizeCode(organizeCode); ConvertBean.serviceModelInitialize(mesProdMouldStatistic, userName); @@ -141,4 +192,22 @@ public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatistic DdlPreparedPack.getInPackList(idList, "mouldRecordId", packBean); return mesProductionRecordRDao.findByHqlWhere(packBean); } + + private String getConfigValue(Map mesConfigMap, String key) { + MesConfig mesConfig = mesConfigMap.get(key); + if (Objects.isNull(mesConfig) || StringUtils.isEmpty(mesConfig.getCfgValue())) { + log.info("参数【{}】未维护", key); + return null; + } + return mesConfig.getCfgValue(); + } + + private Map getMesConfigMap(String organizeCode) { + List mesConfigList = configService.findMesConfigByCfgCode(MesPcnExtConstWords.SEND_MES_PROD_MOULD_STATISTICS, organizeCode); + if (CollectionUtils.isEmpty(mesConfigList)) { + log.info("发送开模统计参数【{}】未维护", MesPcnExtConstWords.SEND_MES_PROD_MOULD_STATISTICS); + return null; + } + return mesConfigList.stream().collect(Collectors.toMap(MesConfig::getCfgKey, t -> t)); + } } 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 f7ac860..ae3ab48 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 @@ -313,10 +313,11 @@ public class MesPcnExtConstWords { public static final String CHANNEL = "channel"; public static final String EQUIPMENT_ID = "equipmentId"; - @Deprecated - public static final String OPC_WRITE_VARIABLE="/api/OPCService/WriteVariable"; - @Deprecated - public static final String OPC_READ_VARIABLE="/api/OPCService/ReadVariable"; + //发送开模统计数据 + public static final String SEND_MES_PROD_MOULD_STATISTICS = "SEND_MES_PROD_MOULD_STATISTICS"; + public static final String SEND_URL = "SEND_URL"; + public static final String SEND_DATA = "SEND_DATA"; + public static final String SEND_ITEM_DATA = "SEND_ITEM_DATA"; } From 69603b0aee8a79e081c7e8b695adf2759355d25f Mon Sep 17 00:00:00 2001 From: jun Date: Sat, 29 Jun 2024 16:45:18 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E5=BC=80=E6=A8=A1?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E8=A1=A8=EF=BC=8C=E5=88=A0=E9=99=A4=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=BB=A3=E7=A0=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java index 08d91e4..3f59209 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java @@ -113,7 +113,7 @@ public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatistic StringBuilder itemData = new StringBuilder(); for (MesProdMouldStatistics statistics : mesProdMouldStatisticsList) { String time = TimeTool.parseStringFormat(statistics.getCreateDatetime(), "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ss"); - itemData.append(String.format(sendItemData, statistics.getAssetNum(), statistics.getEquipmentCode(), statistics.getQty(), time, "1117")); + itemData.append(String.format(sendItemData, statistics.getAssetNum(), statistics.getMeterName(), statistics.getQty(), time, "1117")); } String body = HttpRequest.post(sendUrl).header("Content-Type", "text/xml").body(String.format(sendData, itemData)).execute().body(); //发送成功更新同步状态 @@ -155,7 +155,6 @@ public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatistic mesProdMouldStatistic.setWorkDate(mesProdMouldRecordEntry.getKey()); mesProdMouldStatistic.setAssetNum(mesMouldMappingCfg.getAssetNum()); mesProdMouldStatistic.setMeterName(mesMouldMappingCfg.getMeterName()); - mesProdMouldStatistic.setEquipmentCode(mesMouldMappingCfg.getEquipmentCode()); mesProdMouldStatistic.setQty(mesProdMouldRecordEntry.getValue().size()); mesProdMouldStatistic.setOrganizeCode(organizeCode); ConvertBean.serviceModelInitialize(mesProdMouldStatistic, userName); From a6cac78e8da6dd144b05e93ad7552c7b8acb8f1e Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Sat, 29 Jun 2024 22:18:06 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E5=89=8D=E9=81=93=E9=98=B2=E9=94=99?= =?UTF-8?q?=E5=B7=A5=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcn/api/busi/IMesProductionRecordService.java | 3 + .../busi/MesProductionRecordService.java | 15 ++- .../step/MesProdCraftRouteCheckStepService.java | 110 ++++++++++++++++++--- 3 files changed, 112 insertions(+), 16 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java index 8b13ad0..d68a324 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionRecordService.java @@ -29,6 +29,9 @@ public interface IMesProductionRecordService { */ Map checkSnTimeliness(String organizeCode, String serialNo, Long sourceId, Integer dataSource, Boolean isAssembly); + @ApiOperation(value = "根据零件条码查询加工记录信息") + List findProductionRecordList(String organizeCode, String productSn); + @ApiOperation(value = "根据零件条码,物料编码,工序代码,工艺代码查询加工记录信息") List findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java index af90bc1..dacaa71 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProductionRecordService.java @@ -12,9 +12,9 @@ import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; import cn.estsh.i3plus.pojo.mes.repository.MesTimeEfficientCfgRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -134,11 +134,11 @@ public class MesProductionRecordService implements IMesProductionRecordService { for (MesTimeEfficientCfg timeliness : timelinessList) { List records = new ArrayList<>(); //时效性规则 零件号不为空 - if (StringUtils.isNoneBlank(timeliness.getPartNo())){ + if (!StringUtils.isEmpty(timeliness.getPartNo())){ records = recordList.stream().filter(item -> item.getPartNo().equals(timeliness.getPartNo())).sorted(Comparator.comparing(MesProductionRecord::getCompleteDateTime)).collect(Collectors.toList()); } //时效性规则 工艺不为空时 - if (StringUtils.isNoneBlank(timeliness.getCraftCode())){ + if (!StringUtils.isEmpty(timeliness.getCraftCode())){ records = recordList.stream().filter(item -> item.getCraftCode().equals(timeliness.getCraftCode())).sorted(Comparator.comparing(MesProductionRecord::getCompleteDateTime)).collect(Collectors.toList()); } @@ -192,7 +192,16 @@ public class MesProductionRecordService implements IMesProductionRecordService { } @Override + public List findProductionRecordList(String organizeCode, String productSn) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null; + return productionRecordRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PRODUCT_SN}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn}); + } + + @Override public List findProductionRecordList(String organizeCode, String productSn, String partNo, String processCode, String craftCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(processCode) || StringUtils.isEmpty(craftCode)) return null; return productionRecordRepository.findByProperty( new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.PRODUCT_SN, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.CRAFT_CODE}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn, partNo, processCode, craftCode}); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java index 2fa786e..a00ecdc 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckStepService.java @@ -12,9 +12,11 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; 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.util.MesExtEnumUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -79,24 +81,27 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService { o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); if (CollectionUtils.isEmpty(partNoList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "主条码均已通过前道工艺防错验证!"); + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + //查询工艺路线数据 Map> craftRouteDataMap = new HashMap<>(); - partNoList.forEach(o -> doHandleProdCraftData(reqBean, o, craftRouteDataMap)); + partNoList.forEach(o -> doHandleProdCraftData(reqBean, workCenter, o, craftRouteDataMap)); if (CollectionUtils.isEmpty(craftRouteDataMap) || craftRouteDataMap.size() != partNoList.size()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件编码%s未匹配到产品工艺路线!", CollectionUtils.isEmpty(craftRouteDataMap) ? partNoList.toString() : partNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !craftRouteDataMap.containsKey(o))).collect(Collectors.toList()).toString())); //前道工艺防错验证处理 - doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, productionPsInContextList, craftRouteDataMap); + doHandleProdCraftRouteCheck(reqBean, resultBean, stepResult, productionProcessContext, workCenter, productionPsInContextList, craftRouteDataMap); return stepResult; } //查询工艺路线数据 - private void doHandleProdCraftData(StationRequestBean reqBean, String o, Map> craftRouteDataMap) { - List craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, o); + private void doHandleProdCraftData(StationRequestBean reqBean, MesWorkCenter workCenter, String o, Map> craftRouteDataMap) { + List craftRouteDetailList = fsmRouteDataService.doHandleProdCraftData(reqBean, workCenter.getCenterType(), o); if (!CollectionUtils.isEmpty(craftRouteDetailList)) craftRouteDataMap.put(o, craftRouteDetailList); } @@ -126,14 +131,14 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService { //前道工艺防错验证处理 private void doHandleProdCraftRouteCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, - List productionPsInContextList, Map> craftRouteDataMap) { + MesWorkCenter workCenter, List productionPsInContextList, Map> craftRouteDataMap) { for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { if (null == productionPsInContext || StringUtils.isEmpty(productionPsInContext.getPartNo()) || productionPsInContext.getIsCheckCraft().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; //前道工艺防错验证 - Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo())); + Boolean result = doProdCraftRouteCheck(reqBean, stepResult, productionProcessContext, workCenter, productionPsInContext, craftRouteDataMap.get(productionPsInContext.getPartNo())); if (!result) productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); else productionPsInContext.checkCraftResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); @@ -149,7 +154,18 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService { } //前道工艺防错验证 - private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { + private Boolean doProdCraftRouteCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { + + //排序 + if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0) return doProdCraftRouteCheckSort(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDetailList); + + //非排序 + return doProdCraftRouteCheckNosort(reqBean, stepResult, productionProcessContext, productionPsInContext, craftRouteDetailList); + + } + + //前道工艺防错验证【排序】 + private Boolean doProdCraftRouteCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; @@ -193,10 +209,10 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService { if (CollectionUtils.isEmpty(beforeCellCraftList) && !StringUtils.isEmpty(productionPsInContext.getCraftCode()) && !productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode())) return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]已经过首道工艺[%s]", message, productionPsInContext.getProductSn(), productionProcessContext.getCraftCode())).isCompleted(); - //执行首道工艺 【非工位扫描直接生成的自制件条码】 当前主条码验证通过 + //执行首道工艺 当前主条码验证通过 if (CollectionUtils.isEmpty(beforeCellCraftList)) return true; - //当前主条码的工艺字段为空【非工位扫描直接生成的自制件条码】 + //当前主条码的工艺字段为空 if (StringUtils.isEmpty(productionPsInContext.getCraftCode()) && craftRouteDetailList.get(0).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过首道工艺[%s]", message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftCode())).isCompleted(); @@ -213,15 +229,83 @@ public class MesProdCraftRouteCheckStepService extends BaseStepService { //如果没有未完成的工艺, 则代表当前工位可操作 if (CollectionUtils.isEmpty(unCompleteCraftList)) return true; - //未完成工艺重新正序 - unCompleteCraftList = unCompleteCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq)).collect(Collectors.toList()); + //未完成工艺倒序 + unCompleteCraftList = unCompleteCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq).reversed()).collect(Collectors.toList()); Optional optional = unCompleteCraftList.stream().filter(o -> (null != o && o.getIsChoose() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue())).findFirst(); - if (null != optional && optional.isPresent()) - return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), optional.get().getCraftCode())).isCompleted(); + if (unCompleteCraftList.get(0).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), unCompleteCraftList.get(0).getCraftCode())).isCompleted(); return true; } + //前道工艺防错验证 【非排序】 + private Boolean doProdCraftRouteCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsInContext productionPsInContext, List craftRouteDetailList) { + + String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; + + //判断主条码的当前工艺是否包含在产品工艺路线中 + Optional optionalPs = StringUtils.isEmpty(productionPsInContext.getCraftCode()) ? null : craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionPsInContext.getCraftCode()))).findFirst(); + if (!StringUtils.isEmpty(productionPsInContext.getCraftCode()) && (null == optionalPs || !optionalPs.isPresent())) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]对应的工艺代码[%s]不匹配零件[%s]对应的产品工艺路线[%s]", + message, productionPsInContext.getProductSn(), productionPsInContext.getCraftCode(), productionPsInContext.getPartNo(), craftRouteDetailList.get(0).getCraftRouteCode())).isCompleted(); + + //验证工艺对应工序最多经过1个: 当前主条码的工艺字段有值, 对应的工艺路线明细信息设置了【true】, 当前工位的工艺与主条码的当前工艺相同, 当前工位的工序与主条码的当前工序不相同 + if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getAtMostProcess().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionProcessContext.getCraftCode().equals(productionPsInContext.getCraftCode()) && !reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]相同工艺对应工序最多经过1个,上道工艺[%s]当前工位工艺[%s]", + message, productionPsInContext.getProductSn(), craftRouteDetailList.get(0).getCraftRouteCode(), productionPsInContext.getCraftCode(), productionProcessContext.getCraftCode())).isCompleted(); + + List productionRecordList = null; + //验证已完成工序最大重复次数: 如果当前工位的工序与主条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数 + if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) { + //根据零件条码查询加工记录信息 + productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn()); + //条码+物料+工序+工艺搜集加工记录 + List filterList = CollectionUtils.isEmpty(productionRecordList) ? null : + productionRecordList.stream().filter(o -> (null != o && o.getPartNo().equals(productionPsInContext.getPartNo()) && o.getProcessCode().equals(reqBean.getProcessCode()) && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(filterList) && filterList.size() >= optionalPs.get().getRepeatTimes()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]", + message, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted(); + } + + //判断当前工位的工序对应的工艺是否包含在产品工艺路线中 + Optional optionalCell = craftRouteDetailList.stream().filter(o -> (null != o && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).findFirst(); + //根据当前工位对应的工艺 获取 所有前道工艺, 如果当前工位的工序对应工艺不在工艺路线明细内, 则默认所有明细均为所有前道工艺, 否则搜集当前工位工序对应工艺前面的所有前道工艺 + List beforeCellCraftList; + if (null == optionalCell || !optionalCell.isPresent()) beforeCellCraftList = craftRouteDetailList; + else beforeCellCraftList = craftRouteDetailList.stream().filter(o -> (null != o && o.getSeq().compareTo(optionalCell.get().getSeq()) < 0)).collect(Collectors.toList()); + + //前道工艺不存在即当前为首道工艺 + if (CollectionUtils.isEmpty(beforeCellCraftList)) return true; + + //前道工艺正序 + beforeCellCraftList = beforeCellCraftList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesCraftRouteDetail::getSeq)).collect(Collectors.toList()); + + //判断上面是否已经查询过数据 + if (!(null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode()))) + productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn()); + + Map> prMapByCraft = CollectionUtils.isEmpty(productionRecordList) ? null : productionRecordList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProductionRecord::getCraftCode)); + + //遍历前道工艺, 根据工艺查询加工记录是否存在, 并验证是否存在捆绑工艺 + for (int i = 0; i < beforeCellCraftList.size(); i ++) { + if (null == beforeCellCraftList.get(i)) continue; + Boolean isExist = isExistProductionRecord(prMapByCraft, beforeCellCraftList.get(i).getCraftCode()); + if (beforeCellCraftList.get(i).getIsChoose().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && !isExist) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]未经过必过工艺[%s]", message, productionPsInContext.getProductSn(), beforeCellCraftList.get(i).getCraftCode())).isCompleted(); + + if (i != 0 && beforeCellCraftList.get(i - 1).getIsBindNextCraft().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && isExistProductionRecord(prMapByCraft, beforeCellCraftList.get(i - 1).getCraftCode()) && !isExist) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]产品工艺路线[%s]工艺[%s]捆绑后道工艺", + message, productionPsInContext.getProductSn(), beforeCellCraftList.get(i).getCraftRouteCode(), beforeCellCraftList.get(i - 1).getCraftCode())).isCompleted(); + } + + return true; + + } + + private Boolean isExistProductionRecord(Map> prMapByCraft, String craftCode) { + return (CollectionUtils.isEmpty(prMapByCraft) || !prMapByCraft.containsKey(craftCode)) ? false : true; + } + } From 863917dfb71cb1cdbc24afd889a3236efd82a9e2 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Sat, 29 Jun 2024 23:01:56 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87key=20?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IMesProductionCustomContextStepService.java | 9 --- .../IMesProductionDispatchContextStepService.java | 1 - .../IMesProductionProcessContextStepService.java | 10 ++++ .../MesFunctionChooseCavityOrderService.java | 6 +- .../step/MesWorkOrderCheckNosortStepService.java | 6 +- .../step/MesWorkOrderScanStepService.java | 4 +- .../MesProductionCustomContextStepService.java | 67 ++++++---------------- .../MesProductionDispatchContextStepService.java | 12 ++-- .../MesProductionProcessContextStepService.java | 21 +++++++ .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 4 +- 10 files changed, 63 insertions(+), 77 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java index b1e2df1..e742de4 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java @@ -42,15 +42,6 @@ public interface IMesProductionCustomContextStepService { @ApiOperation(value = "发送工步内容") void sendStepContextMessage(StationRequestBean reqBean, List resultList); - @ApiOperation(value = "获取手动选择的腔数及工单信息上下文") - List getFunctionChooseCavityOrderContext(StationRequestBean reqBean); - - @ApiOperation(value = "保存选择/扫描/读取的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)]") - Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList); - - @ApiOperation(value = "删除手动选择的腔数及工单信息上下文") - void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean); - @ApiOperation(value = "验证上下文班次班组信息是否存在") Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java index e1c6b0f..ae3c820 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java @@ -180,7 +180,6 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "删除上下文产品加工规则信息集合") void deleteProdRuleDataContext(StationRequestBean reqBean); - @ApiOperation(value = "获取料桶原材料数据集合") List getMesRawPartChargingDataContext(StationRequestBean reqBean); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java index 407ed15..3c1744f 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import io.swagger.annotations.ApiOperation; @@ -101,5 +102,14 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "存储设备的装配件清单") Boolean saveAssemblyNosortCfgContext(StationRequestBean reqBean, List assemblyNosortCfgList); + @ApiOperation(value = "获取手动选择的腔数及工单信息上下文") + List getFunctionChooseCavityOrderContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存选择/扫描/读取的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)]") + Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList); + + @ApiOperation(value = "删除手动选择的腔数及工单信息上下文") + void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean); + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java index 73570cb..6261a15 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java @@ -1,6 +1,5 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; @@ -37,9 +36,6 @@ public class MesFunctionChooseCavityOrderService extends BaseSwsService implemen private IMesProductionProcessContextStepService productionProcessContextStepService; @Autowired - private IMesProductionCustomContextStepService productionCustomContextStepService; - - @Autowired private IShippingDispatchService shippingDispatchService; @Override @@ -66,7 +62,7 @@ public class MesFunctionChooseCavityOrderService extends BaseSwsService implemen } //保存手动选择的腔数及工单信息上下文 - productionCustomContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList); + productionProcessContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList); this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功,请等待验证! 提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java index 60671f8..67ec597 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java @@ -1,6 +1,5 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; 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.api.busi.IMesWorkOrderExtService; @@ -42,9 +41,6 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired - private IMesProductionCustomContextStepService productionCustomContextStepService; - - @Autowired private IMesWorkOrderExtService workOrderExtService; @Autowired @@ -113,7 +109,7 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工单信息全部为空腔,已清除当前的空腔数据!"); //保存选择/扫描/读取的腔数及工单信息上下文 - productionCustomContextStepService.saveFunctionChooseCavityOrderContext(reqBean, StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), + productionProcessContextStepService.saveFunctionChooseCavityOrderContext(reqBean, StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", String.valueOf(productionPartContextList.size())), new StationKvBean(MesPcnExtConstWords.CELL_MESSAGE_SOURCE, "工位信息来源", MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValueStr()), new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "加工单", equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON))))); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java index 3cd491f..4a72e6e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java @@ -105,10 +105,10 @@ public class MesWorkOrderScanStepService extends BaseStepService { private List doHandleScanWorkOrderNoContext(StationRequestBean reqBean, StepResult stepResult) { //获取手动选择的腔数及工单信息上下文, 扫描的加工单也会存入其中 - List chooseCavityOrder = productionCustomContextStepService.getFunctionChooseCavityOrderContext(reqBean); + List chooseCavityOrder = productionProcessContextStepService.getFunctionChooseCavityOrderContext(reqBean); //删除手动选择的腔数及工单信息上下文 - if (!CollectionUtils.isEmpty(chooseCavityOrder)) productionCustomContextStepService.deleteFunctionChooseCavityOrderContext(reqBean); + if (!CollectionUtils.isEmpty(chooseCavityOrder)) productionProcessContextStepService.deleteFunctionChooseCavityOrderContext(reqBean); if (CollectionUtils.isEmpty(chooseCavityOrder)) return null; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java index 821c690..7c12f2d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java @@ -108,36 +108,6 @@ public class MesProductionCustomContextStepService extends BaseStepService imple this.sendMessage(reqBean, resultBean); } - - //手选腔数及工单信息KEY - private String getChooseCavityOrderContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER).toString()); } - - //获取手动选择的腔数及工单信息上下文 - @Override - public List getFunctionChooseCavityOrderContext(StationRequestBean reqBean) { - String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean)); - return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null; - } - - //保存选择/扫描/读取的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)] - @Override - public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList) { - if (CollectionUtils.isEmpty(resultList)) return false; - return saveFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean), JSONObject.toJSONString(resultList)); - } - - //删除手动选择的腔数及工单信息上下文 - @Override - public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) { - deleteFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean)); - } - - //开班信息KEY 【PS:生产线级别】 - private String getProdShiftContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT).add(workCenterCode).toString(); } - - - - //获取生产线的当前班组班次信息 @Override public MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode) { @@ -155,21 +125,20 @@ public class MesProductionCustomContextStepService extends BaseStepService imple return mesProdShiftContext; } - //加工次数key - private String getProductionStatisticsContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PRODUCTION_COUNT_CONTEXT).toString()); } - + //开班信息KEY 【PS:生产线级别】 + private String getProdShiftContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT).add(workCenterCode).toString(); } //获取上下文班次班组信息 @Override public List getProdShiftDataContext(String orgainzeCode, String workCenterCode) { - String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode); + String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, workCenterCode)); return !StringUtils.isEmpty(prodShiftJson) ? JSONObject.parseArray(prodShiftJson, StationKvBean.class) : null; } //验证上下文班次班组信息是否存在 @Override public Boolean checkProdShiftDataIsExistContext(String orgainzeCode, String workCenterCode) { - String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode); + String prodShiftJson = getFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, workCenterCode)); return !StringUtils.isEmpty(prodShiftJson) ? true : false; } @@ -177,19 +146,22 @@ public class MesProductionCustomContextStepService extends BaseStepService imple @Override public Boolean saveProdShiftDataContext(String organizeCode, String workCenterCode, List prodShiftDataList) { if (CollectionUtils.isEmpty(prodShiftDataList)) return false; - return saveFsmBusiData(organizeCode, getProdShiftContextKey(organizeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode, JSONObject.toJSONString(prodShiftDataList)); + return saveFsmBusiData(organizeCode, getProdShiftContextKey(organizeCode, workCenterCode), JSONObject.toJSONString(prodShiftDataList)); } //删除上下文班次班组信息 @Override public void deleteProdShiftDataContext(String orgainzeCode, String workCenterCode) { - deleteFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT), workCenterCode); + deleteFsmBusiData(orgainzeCode, getProdShiftContextKey(orgainzeCode, workCenterCode)); } + //加工次数key + private String getProductionStatisticsContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT).toString()); } + //获取上下文工位加工数统计信息 @Override public List getProductionStatisticsContext(StationRequestBean reqBean) { - String productionStatisticsJson = getFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT); + String productionStatisticsJson = getFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean)); return !StringUtils.isEmpty(productionStatisticsJson) ? JSONObject.parseArray(productionStatisticsJson, StationKvBean.class) : null; } @@ -197,7 +169,13 @@ public class MesProductionCustomContextStepService extends BaseStepService imple @Override public Boolean saveProductionStatisticsContext(StationRequestBean reqBean, List productionStatisticsList) { if (CollectionUtils.isEmpty(productionStatisticsList)) return false; - return saveFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT, JSONObject.toJSONString(productionStatisticsList)); + return saveFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), JSONObject.toJSONString(productionStatisticsList)); + } + + //删除上下文工位加工数统计信息 + @Override + public void deleteProductionStatisticsContext(StationRequestBean reqBean) { + deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean)); } @Override @@ -224,16 +202,9 @@ public class MesProductionCustomContextStepService extends BaseStepService imple return true; } - //删除上下文工位加工数统计信息 - @Override - public void deleteProductionStatisticsContext(StationRequestBean reqBean) { - deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionStatisticsContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT); - } - - - //工位加工锁KEY + //可复用条码KEY private String getRepeatAssemblySnContextKey(String organizeCode, String workCenterCode, String workCellCode) { - return new StringJoiner(MesPcnExtConstWords.COLON).add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.REPEAT_ASSEMBLY_SN_CONTEXT).add(workCenterCode).add(workCellCode).toString(); + return new StringJoiner(":").add(organizeCode).add(workCenterCode).add(workCellCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.REPEAT_ASSEMBLY_SN_CONTEXT).toString(); } //根据装配件规则ID获取可复用条码 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java index 747adee..43d08cb 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java @@ -30,8 +30,6 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BUSI_DATA_CONTEXT).toString()); } - private String getContextKey(String organizeCode, String busiCode) { return new StringJoiner(":").add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); } - //清除上下文中的所有业务数据 @Override public void doFlushProductionDispatchContext(StationRequestBean reqBean) { @@ -397,21 +395,25 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp public void deleteProdRuleDataContext(StationRequestBean reqBean) { deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_DATA_CONTEXT); } + + //获取料桶原材料数据集合 @Override public List getMesRawPartChargingDataContext(StationRequestBean reqBean) { - String mesRawPartChargingDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT"); + String mesRawPartChargingDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.RAW_PART_CHARGING_DATA_CONTEXT); return !StringUtils.isEmpty(mesRawPartChargingDataJson) ? JSONObject.parseArray(mesRawPartChargingDataJson, MesRawPartCharging.class) : null; } + //保存料桶原材料数据集合 @Override public Boolean saveMesRawPartChargingDataContext(StationRequestBean reqBean, List mesRawPartChargingList) { if (CollectionUtils.isEmpty(mesRawPartChargingList)) return false; - return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT", JSONObject.toJSONString(mesRawPartChargingList)); + return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.RAW_PART_CHARGING_DATA_CONTEXT, JSONObject.toJSONString(mesRawPartChargingList)); } + //删除料桶原材料数据集合 @Override public void deleteMesRawPartChargingDataContext(StationRequestBean reqBean) { - deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT"); + deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.RAW_PART_CHARGING_DATA_CONTEXT); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index bfd8232..467deea 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -11,6 +11,7 @@ import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import com.alibaba.fastjson.JSONObject; @@ -342,4 +343,24 @@ public class MesProductionProcessContextStepService extends BaseStepService impl return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ASSEMBLY_NOSORT_CFG_CONTEXT, JSONObject.toJSONString(assemblyNosortCfgList)); } + //获取手动选择的腔数及工单信息上下文 + @Override + public List getFunctionChooseCavityOrderContext(StationRequestBean reqBean) { + String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER); + return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null; + } + + //保存选择/扫描/读取的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=2)] + @Override + public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList) { + if (CollectionUtils.isEmpty(resultList)) return false; + return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER, JSONObject.toJSONString(resultList)); + } + + //删除手动选择的腔数及工单信息上下文 + @Override + public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) { + deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER); + } + } 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 ae3ab48..1be6c1a 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 @@ -265,8 +265,6 @@ public class MesPcnExtConstWords { public static final String ASSEMBLY_NOSORT_CFG_CONTEXT = "ASSEMBLY_NOSORT_CFG_CONTEXT"; // 生产过程控制工位加工锁 public static final String PRODUCTION_LOCK_CONTEXT = "PRODUCTION_LOCK_CONTEXT"; - // 生产过程控制工位加工锁 - public static final String PRODUCTION_COUNT_CONTEXT = "PRODUCTION_COUNT_CONTEXT"; // 历史扫描信息 public static final String LAST_SCAN_INFO_CONTEXT = "LAST_SCAN_INFO_CONTEXT"; // 上下文: 班次班组信息 @@ -304,6 +302,8 @@ public class MesPcnExtConstWords { public static final String PRODUCTION_PS_IN_CONTEXT = "PRODUCTION_PS_IN_CONTEXT"; // 上下文: 产出条码数据信息 public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT"; + // 上下文: 料桶原材料数据 + public static final String RAW_PART_CHARGING_DATA_CONTEXT = "RAW_PART_CHARGING_DATA_CONTEXT"; //OPC_API_PARAM From 3e3d3543d338cd8449ac7c7a0285136dee6c76ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E7=AC=91=E7=9D=80=E9=9D=A2=E5=AF=B9=E6=98=8E?= =?UTF-8?q?=E5=A4=A9?= <752558143@qq.com> Date: Sun, 30 Jun 2024 13:36:35 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E5=88=86=E5=B1=8F=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/serviceimpl/base/MesWorkCellExtendCfgServiceImpl.java | 4 ++-- .../ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java | 1 + .../pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtService.java | 3 ++- .../apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java | 2 +- .../serviceimpl/step/MesManyCellTriggerTabSwitchStepService.java | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesWorkCellExtendCfgServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesWorkCellExtendCfgServiceImpl.java index 4b2677c..8a3e6eb 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesWorkCellExtendCfgServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesWorkCellExtendCfgServiceImpl.java @@ -36,7 +36,7 @@ public class MesWorkCellExtendCfgServiceImpl implements IMesWorkCellExtendCfgSer DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCellCode(), "workCellCode", packBean); - DdlPreparedPack.getStringEqualPack(bean.getExtendType(), "extendType", packBean); + DdlPreparedPack.getNumEqualPack(bean.getExtendType(), "extendType", packBean); if(!StringUtil.isEmpty(bean.orderBy())){ packBean.setOrderByStr(bean.orderBy()); @@ -57,7 +57,7 @@ public class MesWorkCellExtendCfgServiceImpl implements IMesWorkCellExtendCfgSer DdlPreparedPack.getStringEqualPack(bean.getAreaCode(), "areaCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean); DdlPreparedPack.getStringEqualPack(bean.getWorkCellCode(), "workCellCode", packBean); - DdlPreparedPack.getStringEqualPack(StringUtil.isEmpty(bean.getExtendType())?"20":bean.getExtendType(), "extendType", packBean); + DdlPreparedPack.getNumEqualPack(StringUtil.isEmpty(bean.getExtendType())?20:bean.getExtendType(), "extendType", packBean); if(!StringUtil.isEmpty(bean.orderBy())){ packBean.setOrderByStr(bean.orderBy()); }else { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index 38faf05..f88317e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -475,6 +475,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); if (CollectionUtils.isEmpty(oldMesWorkOrders)) { updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); + return; } report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtService.java index f083512..a97d38a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtService.java @@ -82,7 +82,9 @@ public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService { params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle().toString()); params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel()); params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId().toString()); + LOGGER.info("设备数据变量写值开始-> 地址:{}, params={}", equipVariableRwModel.getWriteRequestUrl(), params); String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getWriteRequestUrl(), params, null, null); + LOGGER.info("设备数据变量写值返回-> data:{} ", data); if (!StringUtils.isEmpty(data)) return JsonUtilTool.decode(data, MesEquipVariableRwResult.class).obj(JSONObject.toJSONString(equipVariableRwModel)); else return result.noSuccessed().message(String.format("设备数据变量写值失败! CLIENT_HANDLE[%s] CHANNEL[%s] EQUIPMENT_ID[%s] VALUE[%s]", equipVariableRwModel.getClientHandle(), equipVariableRwModel.getChannel(), equipVariableRwModel.getEquipId(), equipVariableRwModel.getValue())).obj(JSONObject.toJSONString(equipVariableRwModel)); @@ -122,7 +124,6 @@ public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService { else return result.noSuccessed().message(String.format("设备数据变量读值失败! 数据信息:[%s]!", JSONObject.toJSONString(equipVariableRwModel))); } - @Override public MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) { MesEquipVariableRwModel equipVariableRwModel = new MesEquipVariableRwModel(); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java index 77e50c8..6d95bec 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java @@ -51,7 +51,7 @@ public class MesManyCellNoticeNextStepService extends BaseStepService { if (workCellExtendCfg.getWorkCenterCodeBak().equals(reqBean.getWorkCenterCode()) && workCellExtendCfg.getWorkCellCodeBak().equals(reqBean.getWorkCellCode())) continue; //验证下个工位是否在线 - String clientInfo = shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), workCellExtendCfg.getWorkCenterCode(), workCellExtendCfg.getWorkCellCode()); + String clientInfo = shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), workCellExtendCfg.getWorkCenterCode(), workCellExtendCfg.getWorkCellCodeBak()); if (CollectionUtils.isEmpty(StationWebSocket.getStationWebSocketList(clientInfo))) continue; //调用多工位场景触发定位分屏工步, CLIENT_INFO是必要传参 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellTriggerTabSwitchStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellTriggerTabSwitchStepService.java index 65f1785..d7f1b6b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellTriggerTabSwitchStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellTriggerTabSwitchStepService.java @@ -35,7 +35,7 @@ public class MesManyCellTriggerTabSwitchStepService extends BaseStepService { StationRequestBean stationRequestBean = new StationRequestBean(); BeanUtils.copyProperties(reqBean, stationRequestBean); - stationRequestBean.setScanInfo(clientInfo); + stationRequestBean.setClientInfo(clientInfo); return clientInfo.equals(reqBean.getClientInfo()) ? execDynamicsCompleteAndSendMsgReturn(stationRequestBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.TAB_SWITCH, MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM, String.format("客户端[%s]监听自动切换页面成功!", reqBean.getClientInfo())) : From 34d54037dd06b253d5401951023640929d84357a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E7=AC=91=E7=9D=80=E9=9D=A2=E5=AF=B9=E6=98=8E?= =?UTF-8?q?=E5=A4=A9?= <752558143@qq.com> Date: Sun, 30 Jun 2024 13:42:13 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java index 6d95bec..16ac838 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesManyCellNoticeNextStepService.java @@ -51,7 +51,7 @@ public class MesManyCellNoticeNextStepService extends BaseStepService { if (workCellExtendCfg.getWorkCenterCodeBak().equals(reqBean.getWorkCenterCode()) && workCellExtendCfg.getWorkCellCodeBak().equals(reqBean.getWorkCellCode())) continue; //验证下个工位是否在线 - String clientInfo = shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), workCellExtendCfg.getWorkCenterCode(), workCellExtendCfg.getWorkCellCodeBak()); + String clientInfo = shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), workCellExtendCfg.getWorkCenterCodeBak(), workCellExtendCfg.getWorkCellCodeBak()); if (CollectionUtils.isEmpty(StationWebSocket.getStationWebSocketList(clientInfo))) continue; //调用多工位场景触发定位分屏工步, CLIENT_INFO是必要传参 From 6bfd3075987a68ab5c00008d14160a702da1d42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E7=AC=91=E7=9D=80=E9=9D=A2=E5=AF=B9=E6=98=8E?= =?UTF-8?q?=E5=A4=A9?= <752558143@qq.com> Date: Sun, 30 Jun 2024 14:31:33 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/step/MesProductResultErrorHandleStepService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultErrorHandleStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultErrorHandleStepService.java index 13078f9..61e5cca 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultErrorHandleStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultErrorHandleStepService.java @@ -73,7 +73,7 @@ public class MesProductResultErrorHandleStepService extends BaseStepService { // 获取加工结果 String result = mesProductionDispatchContextStepService.getProductResultContext(reqBean); // 如果是报废或者可疑,需要编辑条码状态为不合格、并且nc判定需要新增一条记录 - if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getCode(), result)) { + if (StringUtils.isEmpty(result) || Objects.equal(MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getCode() + "", result)) { return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "加工结果合格,无需记录异常"); } // 获取条码列表 @@ -132,6 +132,8 @@ public class MesProductResultErrorHandleStepService extends BaseStepService { mesPartInspectionDetail.setDefectTypeCode(mesDefectType.getDefectTypeCode()); mesPartInspectionDetail.setDefectTypeName(mesDefectType.getDefectTypeName()); model.setPartInspection(partInspection); + model.setType(partInspection.getSourceType()); + model.setPartInspectionDetailList(Arrays.asList(mesPartInspectionDetail)); ncProcessingService.saveNc(model, reqBean.getOrganizeCode()); }); From 180ce708a2fef20eea8f2005c4e5fe1786acf28c Mon Sep 17 00:00:00 2001 From: gsz Date: Sun, 30 Jun 2024 14:51:27 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E6=8A=A5=E5=B7=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=95=B0=E6=8F=92=E5=85=A5=E5=B7=A5=E5=8D=95=E5=B9=B6=E6=8A=A5?= =?UTF-8?q?=E5=B7=A5job-=E7=8A=B6=E6=80=81=E6=94=B9=E4=B8=BA=E6=9C=AA?= =?UTF-8?q?=E6=B1=87=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index 38faf05..7b553f1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -741,11 +741,14 @@ public class MesWorkOrderService implements IMesWorkOrderService { //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean); - DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean); + DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(),"reportStatus",ddlPackBean); + List collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList()); + MesShift mesShift= collect.get(0); + String startTime= StringUtil.isEmpty(mesShift.getStartTime())?" 08:00:00":" "+mesShift.getStartTime()+":00"; //获取前一天的早班到当天早班的区间的所有加工记录,统计个数 DdlPreparedPack.timeBuilder( - new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00", - TimeTool.getToday()+" 08:00:00", + new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1)) + startTime, + TimeTool.getToday() + startTime, "completeDateTime", ddlPackBean, false); return productionRecordRao.findByHqlWhere(ddlPackBean); From d94ceabc818e75dcacc483b2b679d6571479257c Mon Sep 17 00:00:00 2001 From: gsz Date: Sun, 30 Jun 2024 14:54:28 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E6=8A=A5=E5=B7=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=95=B0=E6=8F=92=E5=85=A5=E5=B7=A5=E5=8D=95=E5=B9=B6=E6=8A=A5?= =?UTF-8?q?=E5=B7=A5job-=E5=8F=96=E5=89=8D=E4=B8=80=E5=A4=A9=E6=97=A9?= =?UTF-8?q?=E7=8F=AD=E6=AC=A1=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index 431a705..647452d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -744,8 +744,11 @@ public class MesWorkOrderService implements IMesWorkOrderService { DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean); DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(),"reportStatus",ddlPackBean); List collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList()); - MesShift mesShift= collect.get(0); - String startTime= StringUtil.isEmpty(mesShift.getStartTime())?" 08:00:00":" "+mesShift.getStartTime()+":00"; + String startTime=" 08:00:00"; + if(!CollectionUtils.isEmpty(collect)){ + MesShift mesShift= collect.get(0); + startTime= StringUtil.isEmpty(mesShift.getStartTime())?" 08:00:00":" "+mesShift.getStartTime()+":00"; + } //获取前一天的早班到当天早班的区间的所有加工记录,统计个数 DdlPreparedPack.timeBuilder( new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1)) + startTime,