diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java index 18c1d9d..6a5bd8a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java @@ -1,26 +1,22 @@ 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.api.busi.IWriteVariableService; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; -import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; 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.repository.MesEquipmentProdParamCfgRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +24,10 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -46,117 +45,214 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired - private IWriteVariableService writeVariableService; + private IMesProductionCustomContextStepService productionCustomContextStepService; @Autowired - private MesEquipmentVariableRepository mesEquipmentVariableRepository; + private IMesEquipmentProdParamCfgService equipmentProdParamCfgService; @Autowired - private MesEquipmentProdParamCfgRepository mesEquipmentProdParamCfgRepository; + private IMesEquipVariableRwExtService equipVariableRwExtService; + @Autowired + private IMesEquipmentExtService equipmentExtService; @Override public StepResult execute(StationRequestBean reqBean) { StationResultBean resultBean = new StationResultBean(); - StepResult stepResult = StepResult.getSuccessComplete(); - - //获取工步参数 - Optional> stepParamMap = getStepParams(reqBean); + //获取上下文加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), "发送设备加工参数:当前没有加工规则数据,跳过发送!"); //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean, stepParamMap); + 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(); - //获取上下文加工规则数据信息集合 - List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + //获取上下文中的业务数据 + 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); - if (CollectionUtils.isEmpty(prodRuleContextList)) { - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "未找到加工规则,无需发送加工参数!"); - } - List mesEquipmentVariableList = new ArrayList<>(); - List mesEquipmentProdParamCfgList = new ArrayList<>(); - Map> mesEquipmentVariableMap = getMesEquipmentProdParamCfgs(reqBean, prodRuleContextList, mesEquipmentProdParamCfgList); - - - mesEquipmentVariableMap.forEach((k, v) -> { - v.stream().forEach(mesEquipmentProdParamCfg -> { - DdlPackBean packBean = DdlPackBean.getDdlPackBean(); - DdlPreparedPack.getNumEqualPack(mesEquipmentProdParamCfg.getEquipVariableId(), "id", packBean); - MesEquipmentVariable mesEquipmentVariable = mesEquipmentVariableRepository.getByProperty(packBean); - if (mesEquipmentVariable == null) { - return; - } - mesEquipmentVariableList.add(mesEquipmentVariable); - mesEquipmentProdParamCfgList.add(mesEquipmentProdParamCfg); - execSendEquipParamsCmd(reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), k, stepParamMap); - }); }); + 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; + } + } - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "发送加工参数成功!"); + //发送设备加工参数 + 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); } - /** - * 根据排序和非排序 获取对应的加工参数 - * @param reqBean - * @param prodRuleContextList - * @param mesEquipmentProdParamCfgList - * @return - */ - private Map> getMesEquipmentProdParamCfgs(StationRequestBean reqBean, List prodRuleContextList, List mesEquipmentProdParamCfgList) { + //发送设备加工参数【非排序】 + 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) { - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean); + //当前加工规则的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().toUpperCase()).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().toUpperCase().equals(matchRule) && evMap.containsKey(o.getEquipVariableId()))).findFirst(); + + if (null == equipmentProdParamCfgOp || !equipmentProdParamCfgOp.isPresent()) continue; - Map> map = new HashMap<>(); - for (MesProdRuleContext mesProdRuleContext : prodRuleContextList) { - List mesEquipmentProdParamCfgs= new ArrayList<>(); - //从上下文中取出生产线对象 - MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - // 获取加工参数 - if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()){ - - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); - DdlPreparedPack.getNumEqualPack(mesProdRuleContext.getPid(), "sourceId", ddlPackBean); - mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean); - } else { - MesWorkCenter mesWorkCenter = new MesWorkCenter(); - mesWorkCenter.setWorkCenterCode(reqBean.getWorkCenterCode()); - List assemblyDataContext = mesProdRuleContext.getAssemblyDataContext(mesWorkCenter); - List sourceIds = assemblyDataContext.stream().map(MesProductionAssemblyContext::getSourceId).collect(Collectors.toList()); - - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); - DdlPreparedPack.getInPackList(sourceIds, "sourceId", ddlPackBean); - mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean); + evMap.remove(equipmentProdParamCfgOp.get().getId()); + + //数据转换 + 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; } - if (!CollectionUtils.isEmpty(mesEquipmentProdParamCfgs)) { - mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgs.stream().distinct().collect(Collectors.toList()); + + //写值 + MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(matchValue, equipmentVariable, cellEquipContext.getKepwareFlag(equipmentVariable.getChannel())); + + if (!equipVariableRwResult.getIsSuccessed()) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog().checkRepeat(), String.format("设备[%s]:发送设备加工参数失败!原因:%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; } - map.put(mesProdRuleContext.getForeignKey(), mesEquipmentProdParamCfgs); + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("设备[%s]:发送设备加工参数成功!%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + } - return map; - } - private void execSendEquipParamsCmd(StationRequestBean reqBean, - String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey, Optional> stepParamMap) { - //最大重试次数[工步参数] - Integer maxRetryTimes = getMaxRetryTimes(stepParamMap); + } - writeVariableService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey, null, maxRetryTimes); + //发送设备加工参数【排序】 + 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 Integer getMaxRetryTimes(Optional> stepParamMap) { - Integer maxRetryTimes = null; - try { - maxRetryTimes = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.MAX_RETRY_TIMES)) ? Integer.valueOf(stepParamMap.get().get(MesPcnExtConstWords.MAX_RETRY_TIMES).getParamValue()) : null; - } catch (NumberFormatException e) { + //数据转换 + 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; } - return !StringUtils.isEmpty(maxRetryTimes) ? maxRetryTimes : 3; + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepServiceBak.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepServiceBak.java new file mode 100644 index 0000000..7d7154e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepServiceBak.java @@ -0,0 +1,162 @@ +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.IWriteVariableService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; +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.repository.MesEquipmentProdParamCfgRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository; +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.*; +import java.util.stream.Collectors; + +/** + * @Description : 发送加工参数 + * @Author : zxw + **/ +@Slf4j +@Service("mesSendEquipParamsCmdStepServiceBak") +public class MesSendEquipParamsCmdStepServiceBak extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IWriteVariableService writeVariableService; + + @Autowired + private MesEquipmentVariableRepository mesEquipmentVariableRepository; + + @Autowired + private MesEquipmentProdParamCfgRepository mesEquipmentProdParamCfgRepository; + + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取工步参数 + Optional> stepParamMap = getStepParams(reqBean); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean, stepParamMap); + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //获取上下文加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + + if (CollectionUtils.isEmpty(prodRuleContextList)) { + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "未找到加工规则,无需发送加工参数!"); + } + List mesEquipmentVariableList = new ArrayList<>(); + List mesEquipmentProdParamCfgList = new ArrayList<>(); + Map> mesEquipmentVariableMap = getMesEquipmentProdParamCfgs(reqBean, prodRuleContextList, mesEquipmentProdParamCfgList); + + + mesEquipmentVariableMap.forEach((k, v) -> { + v.stream().forEach(mesEquipmentProdParamCfg -> { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(mesEquipmentProdParamCfg.getEquipVariableId(), "id", packBean); + MesEquipmentVariable mesEquipmentVariable = mesEquipmentVariableRepository.getByProperty(packBean); + if (mesEquipmentVariable == null) { + return; + } + mesEquipmentVariableList.add(mesEquipmentVariable); + mesEquipmentProdParamCfgList.add(mesEquipmentProdParamCfg); + execSendEquipParamsCmd(reqBean, mesEquipmentProdParamCfg.getMatchRule(), mesEquipmentVariable, cellEquipContext.getKepwareFlag(mesEquipmentVariable.getChannel()), k, stepParamMap); + }); + }); + + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "发送加工参数成功!"); + } + + /** + * 根据排序和非排序 获取对应的加工参数 + * @param reqBean + * @param prodRuleContextList + * @param mesEquipmentProdParamCfgList + * @return + */ + private Map> getMesEquipmentProdParamCfgs(StationRequestBean reqBean, List prodRuleContextList, List mesEquipmentProdParamCfgList) { + + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean); + + Map> map = new HashMap<>(); + for (MesProdRuleContext mesProdRuleContext : prodRuleContextList) { + List mesEquipmentProdParamCfgs= new ArrayList<>(); + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + // 获取加工参数 + if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()){ + + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(mesProdRuleContext.getPid(), "sourceId", ddlPackBean); + mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean); + } else { + MesWorkCenter mesWorkCenter = new MesWorkCenter(); + mesWorkCenter.setWorkCenterCode(reqBean.getWorkCenterCode()); + List assemblyDataContext = mesProdRuleContext.getAssemblyDataContext(mesWorkCenter); + List sourceIds = assemblyDataContext.stream().map(MesProductionAssemblyContext::getSourceId).collect(Collectors.toList()); + + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(sourceIds, "sourceId", ddlPackBean); + mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgRepository.findByHqlWhere(ddlPackBean); + } + if (!CollectionUtils.isEmpty(mesEquipmentProdParamCfgs)) { + mesEquipmentProdParamCfgs = mesEquipmentProdParamCfgs.stream().distinct().collect(Collectors.toList()); + } + map.put(mesProdRuleContext.getForeignKey(), mesEquipmentProdParamCfgs); + } + return map; + } + + private void execSendEquipParamsCmd(StationRequestBean reqBean, + String value, MesEquipmentVariable equipmentVariable, String kepwareFlag, Integer foreignKey, Optional> stepParamMap) { + //最大重试次数[工步参数] + Integer maxRetryTimes = getMaxRetryTimes(stepParamMap); + + writeVariableService.writeVariable(reqBean, value, equipmentVariable, kepwareFlag, foreignKey, null, maxRetryTimes); + } + + //最大重试次数[工步参数] + private Integer getMaxRetryTimes(Optional> stepParamMap) { + Integer maxRetryTimes = null; + try { + maxRetryTimes = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.MAX_RETRY_TIMES)) ? Integer.valueOf(stepParamMap.get().get(MesPcnExtConstWords.MAX_RETRY_TIMES).getParamValue()) : null; + } catch (NumberFormatException e) { + } + return !StringUtils.isEmpty(maxRetryTimes) ? maxRetryTimes : 3; + } + + +}