From 85bf50215eb6ef18a47d4f85c9ddbfb8472b38f4 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Wed, 31 Jul 2024 22:48:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=8F=91=E9=80=81=E5=8A=A0?= =?UTF-8?q?=E5=B7=A5=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/api/base/IMesEquipmentExtService.java | 4 + .../api/base/IMesEquipmentProdParamCfgService.java | 13 ++ .../serviceimpl/base/MesEquipmentExtService.java | 11 + .../base/MesEquipmentProdParamCfgService.java | 38 +++ .../busi/MesProductionRecordService.java | 14 +- .../equiplog/MesEquipmentRwExtService.java | 12 +- .../step/MesProductResultReadStepService.java | 6 +- .../step/MesSendEquipParamsCmdStepService2.java | 256 +++++++++++++++++++++ .../MesProductionCustomContextStepService.java | 9 + 9 files changed, 347 insertions(+), 16 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentProdParamCfgService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentProdParamCfgService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService2.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java index e3556da..8551207 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java @@ -24,4 +24,8 @@ public interface IMesEquipmentExtService { @ApiOperation(value = "根据设备代码查询生产设备信息") MesEquipment getMesEquipment(String organizeCode, String equipmentCode); + + @ApiOperation(value = "根据设备数据变量ID集合查询设备数据变量信息") + List getEquipmentVariableList(String organizeCode, List equipVariableIdList); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentProdParamCfgService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentProdParamCfgService.java new file mode 100644 index 0000000..47add82 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentProdParamCfgService.java @@ -0,0 +1,13 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface IMesEquipmentProdParamCfgService { + + @ApiOperation(value = "根据来源ID查询设备加工参数信息") + List getEquipmentProdParamCfgList(String organizeCode, List sourceIdList); + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java index d6e0f42..5b7a78f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java @@ -17,6 +17,7 @@ import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Slf4j @Service @@ -106,4 +107,14 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { DdlPreparedPack.getStringEqualPack(equipmentCode, MesPcnExtConstWords.EQUIPMENT_CODE, packBean); return equipmentRepository.getByProperty(packBean); } + + @Override + public List getEquipmentVariableList(String organizeCode, List equipVariableIdList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(equipVariableIdList)) return null; + equipVariableIdList = equipVariableIdList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (equipVariableIdList.size() == 1) DdlPreparedPack.getNumEqualPack(equipVariableIdList.get(0), MesPcnExtConstWords.ID, packBean); + else DdlPreparedPack.getInPackList(equipVariableIdList, MesPcnExtConstWords.ID, packBean); + return equipmentVariableRepository.findByHqlWhere(packBean); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentProdParamCfgService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentProdParamCfgService.java new file mode 100644 index 0000000..126d376 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentProdParamCfgService.java @@ -0,0 +1,38 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentProdParamCfgService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentProdParamCfgRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class MesEquipmentProdParamCfgService implements IMesEquipmentProdParamCfgService { + + @Autowired + private MesEquipmentProdParamCfgRepository equipmentProdParamCfgRepository; + + //根据来源ID查询设备加工参数信息 + @Override + public List getEquipmentProdParamCfgList(String organizeCode, List sourceIdList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(sourceIdList)) return null; + sourceIdList = sourceIdList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (sourceIdList.size() == 1) DdlPreparedPack.getNumEqualPack(sourceIdList.get(0), MesPcnExtConstWords.SOURCE_ID, packBean); + else DdlPreparedPack.getInPackList(sourceIdList, MesPcnExtConstWords.SOURCE_ID, packBean); + List equipmentProdParamCfgList = equipmentProdParamCfgRepository.findByHqlWhere(packBean); + return CollectionUtils.isEmpty(equipmentProdParamCfgList) ? null : + equipmentProdParamCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipVariableId()) && !StringUtils.isEmpty(o.getMatchRule()))).collect(Collectors.toList()); + } + +} 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 b5e9042..ae4285e 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 @@ -123,7 +123,7 @@ public class MesProductionRecordService implements IMesProductionRecordService { /** * MATCH_RULE_10("10", "生产时间小于装配件有效期"), * MATCH_RULE_20("20", "小于最小时差有效"), - * MATCH_RULE_30("30", "大于最小时差有效"), + * MATCH_RULE_30("30", "大于最大时差有效"), * MATCH_RULE_40("40", "最大最小时差有效"), * MATCH_RULE_50("50", "最大外或最小内有效"); * 用于校验主条码时效性 @@ -138,23 +138,23 @@ public class MesProductionRecordService implements IMesProductionRecordService { Double minValue = timeliness.getMinValue(); Double maxValue = timeliness.getMaxValue(); if (MesExtEnumUtil.MATCH_RULE.MATCH_RULE_20.getValue().equals(matchRule)) { - //差值 大于等于最小值 + //差值 小于最小时差有效 if (minDiff >= minValue){ return false; } } else if (MesExtEnumUtil.MATCH_RULE.MATCH_RULE_30.getValue().equals(matchRule)) { - // 差值 小于等于最大值 - if (minDiff <= minValue){ + // 差值 大于最大时差有效 + if (minDiff <= maxValue){ return false; } } else if (MesExtEnumUtil.MATCH_RULE.MATCH_RULE_40.getValue().equals(matchRule)) { - // 差值 在 最大值 最小值之间 + // 差值 最大最小时差有效 在 最大值 最小值之间 if (minDiff <= minValue || minDiff >= maxValue){ return false; } } else if (MesExtEnumUtil.MATCH_RULE.MATCH_RULE_50.getValue().equals(matchRule)) { - // 差值 在 最小值之间 - if (minDiff >= minValue && maxValue <= minDiff){ + // 差值 最大外或最小内有效 + if (minDiff >= minValue && minDiff <= maxValue){ return false; } } 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 cd41a93..2a9950b 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 @@ -84,14 +84,14 @@ public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService { 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); + LOGGER.info("设备数据变量写值-> 地址:{}, params={}, data:{} ", equipVariableRwModel.getWriteRequestUrl(), params, data); result = !StringUtils.isEmpty(data) ? JsonUtilTool.decode(data, MesEquipVariableRwResult.class).obj(JSONObject.toJSONString(equipVariableRwModel)) : result.noSuccessed(); - return result.obj(JSONObject.toJSONString(equipVariableRwModel)).message(String.format("%s设备数据变量写值%s! CLIENT_HANDLE[%s] CHANNEL[%s] EQUIPMENT_ID[%s] VALUE[%s]", + return result.obj(JSONObject.toJSONString(equipVariableRwModel)).message(String.format("%s设备数据变量写值%s! CLIENT_HANDLE[%s] CHANNEL[%s] EQUIPMENT_ID[%s] VALUE[%s] TAG_NAME[%s] EQUIP_VARIABLE_ID[%s]", !StringUtils.isEmpty(result.getMessage()) ? String.format("%s!", result.getMessage()) : MesPcnExtConstWords.EMPTY, - result.getIsSuccessed() ? "成功" : "失败", equipVariableRwModel.getClientHandle(), equipVariableRwModel.getChannel(), equipVariableRwModel.getEquipId(), equipVariableRwModel.getValue())); + result.getIsSuccessed() ? "成功" : "失败", + equipVariableRwModel.getClientHandle(), equipVariableRwModel.getChannel(), equipVariableRwModel.getEquipId(), equipVariableRwModel.getValue(), equipVariableRwModel.getTagName(), equipVariableRwModel.getEquipVariableId())); } @@ -135,14 +135,14 @@ public class MesEquipmentRwExtService implements IMesEquipVariableRwExtService { public MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) { MesEquipVariableRwModel equipVariableRwModel = new MesEquipVariableRwModel(); BeanUtils.copyProperties(equipmentVariable, equipVariableRwModel); - return writeVariable(equipVariableRwModel.value(equipmentVariableCfg.getValue()).kepwareFlag(kepwareFlag)); + return writeVariable(equipVariableRwModel.tagName(equipmentVariable.getId(), equipmentVariable.getTagName()).value(equipmentVariableCfg.getValue()).kepwareFlag(kepwareFlag)); } @Override public MesEquipVariableRwResult writeVariable(String value, MesEquipmentVariable equipmentVariable, String kepwareFlag) { MesEquipVariableRwModel equipVariableRwModel = new MesEquipVariableRwModel(); BeanUtils.copyProperties(equipmentVariable, equipVariableRwModel); - return writeVariable(equipVariableRwModel.value(value).kepwareFlag(kepwareFlag)); + return writeVariable(equipVariableRwModel.tagName(equipmentVariable.getId(), equipmentVariable.getTagName()).value(value).kepwareFlag(kepwareFlag)); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java index 86f3813..aed4b6f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java @@ -146,8 +146,8 @@ public class MesProductResultReadStepService extends BaseStepService { //根据变量类别分别匹配加工结果 matchVariableCategoryMap(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); - //保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果 - if (stepResult.isCompleted()) productionDispatchContextStepService.saveProductResultContext(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfCodeStr((String) stepResult.getObj())); + //保存设备当前一轮工序的加工结果 + if (!StringUtils.isEmpty(stepResult.getObj())) productionDispatchContextStepService.saveProductResultContext(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfCodeStr((String) stepResult.getObj())); return stepResult; @@ -172,7 +172,7 @@ public class MesProductResultReadStepService extends BaseStepService { if (MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue().equals(entry.getKey())) { this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.READ.getValue()), String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getDescription()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); - return stepResult.isCompleted(false); + return stepResult.isCompleted(false).obj(entry.getKey()); } //设备加工成功/零件报废/设备加工可疑 均返回true; 零件报废/设备加工可疑标记错误信息 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService2.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService2.java new file mode 100644 index 0000000..571335c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService2.java @@ -0,0 +1,256 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentProdParamCfgService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableRwExtService; +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.context.*; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult; +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; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Description : 发送加工参数 + * @Author : zxw + **/ +@Slf4j +@Service("mesSendEquipParamsCmdStepService2") +public class MesSendEquipParamsCmdStepService2 extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private IMesEquipmentProdParamCfgService equipmentProdParamCfgService; + + @Autowired + private IMesEquipVariableRwExtService equipVariableRwExtService; + + @Autowired + private IMesEquipmentExtService equipmentExtService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + //获取上下文加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), "发送设备加工参数:当前没有加工规则数据,跳过发送!"); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //获取生产线信息 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //搜集加工参数关联ID集合 + List sourceIdList = getEquipmentProdParamCfgSourceIdList(productionProcessContext, prodRuleContextList, workCenter); + + //根据来源ID查询设备加工参数信息 + List equipmentProdParamCfgList = equipmentProdParamCfgService.getEquipmentProdParamCfgList(reqBean.getOrganizeCode(), sourceIdList); + + if (CollectionUtils.isEmpty(equipmentProdParamCfgList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), "发送设备加工参数:当前加工规则未匹配到设备加工参数相关配置,跳过发送!"); + + //设备加工参数信息集合根据来源ID分组 + Map> eppcMap2SourceId = equipmentProdParamCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipmentProdParamCfg::getSourceId)); + + //设备加工参数信息集合根据数据变量ID分组 + Map> eppcMap2EquipVariableId = equipmentProdParamCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipmentProdParamCfg::getEquipVariableId)); + + //根据设备数据变量ID集合查询设备数据变量信息 + List equipmentVariableList = equipmentExtService.getEquipmentVariableList(reqBean.getOrganizeCode(), new ArrayList<>(eppcMap2EquipVariableId.keySet())); + + //设备加工参数信息集合根据数据变量ID分组 + Map evMap = CollectionUtils.isEmpty(equipmentVariableList) ? null : equipmentVariableList.stream().filter(o -> null != o).collect(Collectors.toMap(MesEquipmentVariable::getId, o -> o)); + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //获取上下文中的业务数据 + String productResult = productionDispatchContextStepService.getProductResultContext(reqBean); + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + List productionPsInContexts = productionDispatchContextStepService.getProductionPsInContext(reqBean); + List productionPsOutContexts = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + MesProdShiftContext mesProdShiftKvBean = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); + + //发送设备加工参数 + prodRuleContextList.stream().filter(o -> null != o).forEach(o -> { + + Optional productionPartContextOp = CollectionUtils.isEmpty(productionPartContextList) ? null : + productionPartContextList.stream().filter(i -> (null != i && !StringUtils.isEmpty(i.getForeignKey()) && i.getForeignKey().compareTo(o.getForeignKey()) == 0)).findFirst(); + + Optional productionPsInContextOp = CollectionUtils.isEmpty(productionPsInContexts) ? null : + productionPsInContexts.stream().filter(i -> (null != i && !StringUtils.isEmpty(i.getForeignKey()) && i.getForeignKey().compareTo(o.getForeignKey()) == 0)).findFirst(); + + Optional productionPsOutContextOp = CollectionUtils.isEmpty(productionPsOutContexts) ? null : + productionPsOutContexts.stream().filter(i -> (null != i && !StringUtils.isEmpty(i.getForeignKey()) && i.getForeignKey().compareTo(o.getForeignKey()) == 0)).findFirst(); + + + doSendEquipParamsCmd(reqBean, resultBean, o, workCenter, cellEquipContext, eppcMap2SourceId, evMap, productionProcessContext, productResult, productionPartContextOp, productionPsInContextOp, productionPsOutContextOp); + + }); + + return StepResult.getSuccessComplete(); + } + + //搜集加工参数关联ID集合 + private List getEquipmentProdParamCfgSourceIdList(MesProductionProcessContext productionProcessContext, List prodRuleContextList, MesWorkCenter workCenter) { + if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()) { + return prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPid()))).map(MesProdRuleContext::getPid).collect(Collectors.toList()); + } else { + List sourceIdList = null; + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + List itemIdList = prodRuleContext.getSortAssemblyDataContext().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getSourceId()))).map(MesProductionAssemblySortContext::getSourceId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(itemIdList)) continue; + if (CollectionUtils.isEmpty(sourceIdList)) sourceIdList = new ArrayList<>(); + sourceIdList.addAll(itemIdList); + } + return sourceIdList; + } + } + + //发送设备加工参数 + private void doSendEquipParamsCmd(StationRequestBean reqBean, StationResultBean resultBean, MesProdRuleContext prodRuleContext, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, + Map> eppcMap2SourceId, Map evMap, MesProductionProcessContext productionProcessContext, String productResult, + Optional productionPartContextOp, Optional productionPsInContextOp, Optional productionPsOutContextOp) { + if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()) + doSendEquipParamsCmdNosort(reqBean, resultBean, prodRuleContext, cellEquipContext, eppcMap2SourceId, evMap, productionProcessContext, productResult, productionPartContextOp, productionPsInContextOp, productionPsOutContextOp); + else + doSendEquipParamsCmdSort(reqBean, resultBean, prodRuleContext, cellEquipContext, eppcMap2SourceId, evMap, productionProcessContext, productResult, productionPartContextOp, productionPsInContextOp, productionPsOutContextOp); + } + + //发送设备加工参数【非排序】 + private void doSendEquipParamsCmdNosort(StationRequestBean reqBean, StationResultBean resultBean, MesProdRuleContext prodRuleContext, MesCellEquipContext cellEquipContext, + Map> eppcMap2SourceId, Map evMap, MesProductionProcessContext productionProcessContext, String productResult, + Optional productionPartContextOp, Optional productionPsInContextOp, Optional productionPsOutContextOp) { + + //当前加工规则的PID对应的设备加工参数 + List equipmentProdParamCfgList = eppcMap2SourceId.get(prodRuleContext.getPid()); + + if (CollectionUtils.isEmpty(equipmentProdParamCfgList)) return; + + MesProductionPartContext productionPartContext = (null != productionPartContextOp && productionPartContextOp.isPresent()) ? productionPartContextOp.get() : null; + + MesProductionPsInContext productionPsInContext = (null != productionPsInContextOp && productionPsInContextOp.isPresent()) ? productionPsInContextOp.get() : null; + + MesProductionPsOutContext productionPsOutContext = (null != productionPsOutContextOp && productionPsOutContextOp.isPresent()) ? productionPsOutContextOp.get() : null; + + //搜集发送规则并去重 + List matchRuleList = (equipmentProdParamCfgList.stream().filter(o -> null != o).map(o -> o.getMatchRule().toLowerCase()).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + + for (String matchRule : matchRuleList) { + + if (StringUtils.isEmpty(matchRule)) continue; + + Optional equipmentProdParamCfgOp = equipmentProdParamCfgList.stream().filter(o -> (null != o && o.getMatchRule().toLowerCase().equals(matchRule) && evMap.containsKey(o.getEquipVariableId()))).findFirst(); + + if (null == equipmentProdParamCfgOp || !equipmentProdParamCfgOp.isPresent()) continue; + + //数据转换 + String matchValue = transferValue(matchRule, reqBean, prodRuleContext, productionProcessContext, productResult, productionPartContext, productionPsInContext, productionPsOutContext); + + if (StringUtils.isEmpty(matchValue)) { + this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("发送设备加工参数:[%s]未匹配到业务数据", matchRule), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } + + MesEquipmentVariable equipmentVariable = evMap.get(equipmentProdParamCfgOp.get().getEquipVariableId()); + if (null == equipmentVariable) { + this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("发送设备加工参数:设备加工参数信息ID[%s]关联的设备数据变量ID[%s]未维护有效的设备数据变量信息!", equipmentProdParamCfgOp.get().getId(), equipmentProdParamCfgOp.get().getEquipVariableId()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } + + //写值 + MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(matchValue, equipmentVariable, cellEquipContext.getKepwareFlag(equipmentVariable.getChannel())); + + if (!equipVariableRwResult.getIsSuccessed()) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog().checkRepeatType(false), String.format("设备[%s]:发送设备加工参数失败!原因:%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("设备[%s]:发送设备加工参数成功!%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + } + + } + + //发送设备加工参数【排序】 + private void doSendEquipParamsCmdSort(StationRequestBean reqBean, StationResultBean resultBean, MesProdRuleContext prodRuleContext, MesCellEquipContext cellEquipContext, + Map> eppcMap2SourceId, Map evMap, MesProductionProcessContext productionProcessContext, String productResult, + Optional productionPartContextOp, Optional productionPsInContextOp, Optional productionPsOutContextOp) { + } + + //数据转换 + private String transferValue(String matchRule, StationRequestBean reqBean, MesProdRuleContext prodRuleContext, MesProductionProcessContext productionProcessContext, String productResult, + MesProductionPartContext productionPartContext, MesProductionPsInContext productionPsInContext, MesProductionPsOutContext productionPsOutContext) { + switch (matchRule) { + case "%RESULT%" : + return MesExtEnumUtil.PRODUCT_RESULT_EQUIP_PARAM.codeOfValue(productResult); + case "%PARAM%": + case "%ORDERCODE%": + return prodRuleContext.getWorkOrderNo(); + case "%CUSTPARTNO%": + return null != productionPartContext ? productionPartContext.getCustPartNo() : null; + case "%EMPLOYEENO%": + case "%CREATEUSER%": + return reqBean.getUserInfo(); + case "%BARCODE%": + return null != productionPsOutContext ? productionPsOutContext.getProductSn() : null; + case "%CREATEDATE%": + case "%GETDATE%": + return TimeTool.getNowTime(true); + case "%SHIFT%": + return "shift"; + case "%STATUS%": + return null != productionPsInContext ? productionPsInContext.getSnStatus().toString() : null; + case "%CUSTORDERCOD%": + return null != productionPartContext ? productionPartContext.getCustOrderNo() : null; + case "%PARTNO%": + return null != productionPsOutContext ? productionPsOutContext.getPartNo() : null; + case "%VINCODE%": + return null != productionPartContext ? productionPartContext.getVinCode() : null; + case "%SEQUENCE%": + return null != productionPartContext ? productionPartContext.getWorkOrderSeq() : null; + case "%CUSTBARCODE%": + return null != productionPsOutContext ? productionPsOutContext.getCustSn() : null; + default: + return matchRule; + } + + } + + + +} 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 66ab184..118965e 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 @@ -195,12 +195,21 @@ public class MesProductionCustomContextStepService extends BaseStepService imple stationKvBeans = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(mesProdShiftKvBean.getShiftGroup(), name, countStr), new StationKvBean(MesPcnExtConstWords.COLOR, "颜色", MesExtEnumUtil.COLOR.BLACK.getValue())); } else { + AtomicReference flag = new AtomicReference<>(false); stationKvBeans.stream().forEach(stationKvBean -> { if (stationKvBean.getKey().contains(mesProdShiftKvBean.getShiftGroup())) { stationKvBean.setValue(stationKvBean == null ? countStr : String.valueOf(Integer.valueOf(stationKvBean.getValue()) + count)); amount.set(Integer.valueOf(stationKvBean.getValue())); + flag.set(true); } }); + + if (!flag.get()) { + String name = "加工数"; + stationKvBeans = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), + new StationKvBean(mesProdShiftKvBean.getShiftGroup(), name, countStr), new StationKvBean(MesPcnExtConstWords.COLOR, "颜色", MesExtEnumUtil.COLOR.BLACK.getValue())); + } + } saveProductionStatisticsContext(reqBean, stationKvBeans);