From 0eb9b56fce17a8cdaf446463848554c234ace6e8 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Wed, 29 May 2024 18:33:18 +0800 Subject: [PATCH] ste --- .../IMesProductionProcessContextStepService.java | 7 ++-- .../step/MesAssemblyReadStepService.java | 21 +++++++++--- .../step/MesAssemblyShowStepService.java | 15 +++++++++ .../step/MesFirstMouldNoReadStepService.java | 31 ++++++++++++++--- .../step/MesMouldNoReadStepService.java | 26 ++++++++++++--- .../step/MesProductResultReadStepService.java | 23 +++++++++++-- .../step/MesProductSnReadStepService.java | 21 +++++++++--- .../MesProductionProcessContextStepService.java | 39 ++++++++++++++++++++-- .../step/MesReadySignalReadStepService.java | 27 +++++++++++---- .../pojo/context/MesProductionProcessContext.java | 3 -- 10 files changed, 179 insertions(+), 34 deletions(-) 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 b41cd7f..c06b173 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 @@ -74,12 +74,15 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "获取设备数据变量信息") List findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType); - @ApiOperation(value = "获取设备数据变量信息") + @ApiOperation(value = "根据变量类型与二级变量获取设备数据变量信息") List findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType, List categoryLevelTwoList); @ApiOperation(value = "获取设备数据变量信息") List findEquipmentVariableList(List equipmentVariableList, Integer variableType, List categoryLevelTwoList); + @ApiOperation(value = "验证设备数据变量信息是否为空") + MesProductionProcessContext checkIsEmptyEquipmentVariableList(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE production, List categoryLevelTwoList); + @ApiOperation(value = "发送设备质量信息") void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext); @@ -105,6 +108,4 @@ public interface IMesProductionProcessContextStepService { void sendStepContextMessage(StationRequestBean reqBean, List resultList); - - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java index 68f3209..6b0e615 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java @@ -53,6 +53,7 @@ public class MesAssemblyReadStepService extends BaseStepService { @Override public StepResult init(StationRequestBean reqBean) { + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -66,8 +67,10 @@ public class MesAssemblyReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //获取工步参数 Optional> stepParamMap = getStepParams(reqBean); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); //当前工序已存在读取待验证的装配件条码 @@ -76,24 +79,30 @@ public class MesAssemblyReadStepService extends BaseStepService { //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + //根据变量类别[装配件]搜集设备数据变量接口逻辑信息 equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue()); + //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]装配件条码相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue()).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //搜集设备数据变量接口逻辑信息中的二级变量 List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + //根据变量类型与二级变量获取设备数据变量信息 List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //获取设备LOG采集数据 MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); @@ -106,6 +115,7 @@ public class MesAssemblyReadStepService extends BaseStepService { //验证装配件条码的有效性 if (stepResult.isCompleted()) matchAssemblySnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); + //存储生产过程上下文对象 productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -116,18 +126,21 @@ public class MesAssemblyReadStepService extends BaseStepService { private StepResult matchAssemblySnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) { + //未采集到数据 if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]装配件条码,持续监听中...", cellEquipContext.getEquipmentCode())); //读取的装配件进行规则匹配 List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList()); + //没有有效的数据 if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的装配件条码,持续监听中...", cellEquipContext.getEquipmentCode())); //保存设备当前一轮工序待验证的装配件条码信息 productionProcessContext.assemblySnJson(equipVariableCollectContextList); + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean, equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowStepService.java index fa4e7cc..f1a0d14 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowStepService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; 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.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -27,6 +28,20 @@ public class MesAssemblyShowStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + + + + + + + + + + + + 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 99c393e..b11fd23 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 @@ -59,6 +59,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { @Override public StepResult init(StationRequestBean reqBean) { + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -72,8 +73,10 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //获取工步参数 Optional> stepParamMap = getStepParams(reqBean); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); //当前工序已存在头道模具号跟一模多腔信息 @@ -82,24 +85,30 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + //根据变量类别[头道模具号]搜集设备数据变量接口逻辑信息 equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue()); + //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]头道模具号相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue()).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //搜集设备数据变量接口逻辑信息中的二级变量 List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + //根据变量类型与二级变量获取设备数据变量信息 List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //获取设备LOG采集数据 MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); @@ -112,6 +121,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { //验证头道模具号的有效性 if (stepResult.isCompleted()) checkFirstMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); + //存储生产过程上下文对象 productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -122,17 +132,21 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { private StepResult checkFirstMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) { + //未采集到数据 if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]头道模具号,持续监听中...", cellEquipContext.getEquipmentCode())); //读取的头道模具号进行规则匹配 List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList()); + //没有有效的数据 if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode())); + //默认只需要配置一个点位 String firstMouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean, firstMouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); //验证一模多腔信息 @@ -153,8 +167,10 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { public List getMouldMultiCavityList(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, String equipmentCode, String mouldNo, Boolean isFirstMouldNo) { + //从上下文中取出一模多腔信息集合 List mouldMultiCavityList = productionProcessContext.getMouldCavityList(); + //验证一模多腔信息是否跟当前对设备及模具匹配; 根据设备代码,模具号查询一模多腔信息 if (!checkCachedMouldMultiCavityValid(mouldMultiCavityList, equipmentCode, mouldNo)) mouldMultiCavityList = mouldMultiCavityService.getMouldMultiCavityList(reqBean.getOrganizeCode(), equipmentCode, mouldNo); //配置错误 抛出异常 @@ -170,17 +186,22 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { public Map getPartDataMap(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, List mouldMultiCavityList) { + //从上下文中取出零件信息集合 Map partDataMap = productionProcessContext.getPartDataMap(); + //从一模多腔信息中搜集零件编码并去重 List partNoList = (mouldMultiCavityList.stream().filter(o -> (null != o)).map(MesMouldMultiCavity::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + //验证上下文中取出零件信息集合是否匹配一模多腔信息中搜集零件编码 if (!CollectionUtils.isEmpty(partDataMap) && partDataMap.keySet().containsAll(partNoList) && partNoList.containsAll(partDataMap.keySet())) return partDataMap; + //根据物料编码集合查询物料信息 Map finalPartDataMap = partService.getPartMap(reqBean.getOrganizeCode(), partNoList); //零件信息缺失 抛出异常 List filterList = CollectionUtils.isEmpty(finalPartDataMap) ? null : partNoList.stream().filter(o -> (null != o && !finalPartDataMap.containsKey(o))).collect(Collectors.toList()); + //验证错误 抛出异常 if (CollectionUtils.isEmpty(finalPartDataMap) || !CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(finalPartDataMap) ? partNoList.toString() : filterList.toString())); return finalPartDataMap; @@ -188,9 +209,11 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { } public void doCacheMoudleContext(StationRequestBean reqBean, List mouldMultiCavityList, Boolean isFirstMouldNo) { + //存储展示组件MODULE_CONTENT内容 productionProcessContextStepService.doCacheModuleContext(reqBean, getModuleContextData(reqBean, mouldMultiCavityList, isFirstMouldNo)); } + //封装展示组件MODULE_CONTENT内容 private List> getModuleContextData(StationRequestBean reqBean, List mouldMultiCavityList, Boolean isFirstMouldNo) { List> dataList = new ArrayList<>(); mouldMultiCavityList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java index 8556675..deb15f3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java @@ -53,6 +53,7 @@ public class MesMouldNoReadStepService extends BaseStepService { @Override public StepResult init(StationRequestBean reqBean) { + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -66,8 +67,10 @@ public class MesMouldNoReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //获取工步参数 Optional> stepParamMap = getStepParams(reqBean); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); //当前工序已存在模具号跟一模多腔信息 @@ -76,24 +79,30 @@ public class MesMouldNoReadStepService extends BaseStepService { //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + //根据变量类别[模具号]搜集设备数据变量接口逻辑信息 equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue()); + //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]模具号相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue()).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //搜集设备数据变量接口逻辑信息中的二级变量 List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + //根据变量类型与二级变量获取设备数据变量信息 List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //获取设备LOG采集数据 MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); @@ -109,6 +118,7 @@ public class MesMouldNoReadStepService extends BaseStepService { //保存设备当前一轮工序的模具号 if (null != stepResult.getObj()) productionProcessContext.mouldNo((MesEquipVariableCollectContext) stepResult.getObj()); + //存储生产过程上下文对象 productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -119,23 +129,29 @@ public class MesMouldNoReadStepService extends BaseStepService { private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) { + //未采集到数据 if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]模具号,持续监听中...", cellEquipContext.getEquipmentCode())); //读取的模具号进行规则匹配 List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList()); + //没有有效的数据: 设置常变值 或者 当前没有头道模具号或生产工单信息 if (CollectionUtils.isEmpty(equipVariableCollectContextList) && (equipLogDispatchContext.getNeedNewValue() || (StringUtils.isEmpty(productionProcessContext.getFirstMouldNo()) && StringUtils.isEmpty(productionProcessContext.getWorkOrderDataJson())))) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,持续监听中...", cellEquipContext.getEquipmentCode())); - else if (CollectionUtils.isEmpty(equipVariableCollectContextList)) + else if (CollectionUtils.isEmpty(equipVariableCollectContextList)) //非常变值 没有有效的数据 也无需再读 return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,接口逻辑设置只读一次,当前读取模具号直接跳过!", cellEquipContext.getEquipmentCode())); + //默认只需要配置一个点位 String mouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean, mouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + //将模具信息放到工步结果对象的中, 工步主方法体会从里面取出 stepResult.obj(equipVariableCollectContextList.get(0)); + //判断是否存在头道模具号或生产工单信息 if (!StringUtils.isEmpty(productionProcessContext.getFirstMouldNo()) || !StringUtils.isEmpty(productionProcessContext.getWorkOrderDataJson())) return stepResult; //磨具号当头道模具号的使用 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 bea0b01..8f3d200 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 @@ -49,6 +49,7 @@ public class MesProductResultReadStepService extends BaseStepService { @Override public StepResult init(StationRequestBean reqBean) { + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -62,8 +63,10 @@ public class MesProductResultReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //获取工步参数 Optional> stepParamMap = getStepParams(reqBean); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); //当前工序已存在加工结果 @@ -72,26 +75,32 @@ public class MesProductResultReadStepService extends BaseStepService { //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + //根据变量类别[设备加工成功/设备加工失败/零件报废/设备加工可疑]搜集设备数据变量接口逻辑信息 equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue()); + //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue()).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //搜集设备数据变量接口逻辑信息中的二级变量 List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + //根据变量类型与二级变量获取设备数据变量信息 List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //获取设备LOG采集数据 MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); @@ -101,8 +110,10 @@ public class MesProductResultReadStepService extends BaseStepService { execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); + //匹配加工结果 matchProductResult(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); + //存储生产过程上下文对象 productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -114,11 +125,14 @@ public class MesProductResultReadStepService extends BaseStepService { private StepResult matchProductResult(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) { + //未采集到数据 if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]加工结果,持续监听中...", cellEquipContext.getEquipmentCode())); + //根据变量类别分组数据 Map> variableCategoryMap = equipLogDispatchContext.getEquipVariableCfgCollectContextList().stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCfgCollectContext::getVariableCategory)); + //根据变量类别分别匹配加工结果 matchVariableCategoryMap(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, variableCategoryMap); //保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果 @@ -134,17 +148,22 @@ public class MesProductResultReadStepService extends BaseStepService { for (Map.Entry> entry : variableCategoryMap.entrySet()) { if (null == entry) continue; + //设备数据变量接口逻辑根据变量类别规则匹配 if (!(Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, entry.getKey(), entry.getValue())) continue; + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey()), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + //设备加工失败 if (MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue().equals(entry.getKey())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getDescription())); + //设备加工成功/零件报废/设备加工可疑 均返回true; 零件报废/设备加工可疑标记错误信息 return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.obj(entry.getKey()), true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue().equals(entry.getKey()) ? MesPcnEnumUtil.STATION_DATA_TYPE.TEXT : MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey()))); } + //加工结果匹配失败 return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]加工结果的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode())); 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 c87cbdb..d4f541c 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 @@ -53,6 +53,7 @@ public class MesProductSnReadStepService extends BaseStepService { @Override public StepResult init(StationRequestBean reqBean) { + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -66,8 +67,10 @@ public class MesProductSnReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //获取工步参数 Optional> stepParamMap = getStepParams(reqBean); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); //当前工序已存在读取待验证的主条码信息 @@ -76,24 +79,30 @@ public class MesProductSnReadStepService extends BaseStepService { //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + //根据变量类别[主条码]搜集设备数据变量接口逻辑信息 equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue()); + //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]主条码相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue()).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //搜集设备数据变量接口逻辑信息中的二级变量 List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + //根据变量类型与二级变量获取设备数据变量信息 List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //获取设备LOG采集数据 MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); @@ -106,6 +115,7 @@ public class MesProductSnReadStepService extends BaseStepService { //验证主条码的有效性 if (stepResult.isCompleted()) matchProductSnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); + //存储生产过程上下文对象 productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -116,18 +126,21 @@ public class MesProductSnReadStepService extends BaseStepService { private StepResult matchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) { + //未采集到数据 if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]主条码,持续监听中...", cellEquipContext.getEquipmentCode())); //读取的主条码进行规则匹配 List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList()); + //没有有效的数据 if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的主条码,持续监听中...", cellEquipContext.getEquipmentCode())); //保存设备当前一轮工序的待验证的主条码信息 productionProcessContext.productSnJson(equipVariableCollectContextList); + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean, equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java index eb55645..10d5b9d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java @@ -45,11 +45,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT); } + //存储生产过程上下文对象【工步根据业务实际情况执行,配置错误等情况无需执行】 @Override public Boolean doCacheProductionProcessContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesProductionProcessContext.class.getSimpleName(), JSONObject.toJSONString(productionProcessContext)); } + //获取生产过程上下文对象 @Override public MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean) { @@ -75,11 +77,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //获取工序工艺信息 @Override public MesProductionProcessContext processContext(StationRequestBean reqBean) { return processContext(reqBean, getProductionProcessContext(reqBean)); } + //获取工序工艺信息 @Override public MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { @@ -98,6 +102,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //验证组织模型有效性 @Override public MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { @@ -111,11 +116,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //获取工位设备集合信息 @Override public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean) { return getCellEquipmentList(reqBean, getProductionProcessContext(reqBean)); } + //获取工位设备集合信息 @Override public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { @@ -128,11 +135,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //获取工位当前设备信息 @Override public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean) { return getCurCellEquipment(reqBean, getCellEquipmentList(reqBean)); } + //获取工位当前设备信息 @Override public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { @@ -142,11 +151,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //获取工位当前设备信息 @Override public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, Optional> stepParamMap) { return getCurCellEquipment(reqBean, getCellEquipmentList(reqBean), stepParamMap); } + //获取工位当前设备信息 @Override public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Optional> stepParamMap) { @@ -171,11 +182,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //获取设备数据变量接口逻辑信息 @Override public MesProductionProcessContext getEquipmentVariableCfgList(StationRequestBean reqBean) { return getEquipmentVariableCfgList(getCurCellEquipment(reqBean)); } + //获取设备数据变量接口逻辑信息 @Override public MesProductionProcessContext getEquipmentVariableCfgList(MesProductionProcessContext productionProcessContext) { @@ -197,30 +210,35 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //根据变量类别搜集设备数据变量接口逻辑信息 @Override public List collectEquipmentVariableCfgList(List equipmentVariableCfgList, String... variableCategory) { List variableCategoryList = null == variableCategory ? null : Arrays.asList(variableCategory); return (CollectionUtils.isEmpty(equipmentVariableCfgList) || CollectionUtils.isEmpty(variableCategoryList)) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && variableCategoryList.contains(o.getVariableCategory()))).collect(Collectors.toList()); } + //验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息 @Override public MesProductionProcessContext checkNecessaryEquipmentVariableCfg(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipmentVariableCfgList, String... variableCategory) { List variableCategoryList = null == variableCategory ? null : Arrays.asList(variableCategory); Optional optional = (CollectionUtils.isEmpty(equipmentVariableCfgList) || CollectionUtils.isEmpty(variableCategoryList)) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && variableCategoryList.contains(o.getVariableCategory()))).findFirst(); - return (null != optional && optional.isPresent()) ? productionProcessContext : productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]变量类别%s的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType(), variableCategoryList.toString())); + return (null != optional && optional.isPresent()) ? productionProcessContext : productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]变量类别%s相关的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType(), variableCategoryList.toString())); } + //搜集设备数据变量接口逻辑信息中的二级变量 @Override public List collectCategoryLevelTwoList(List equipmentVariableCfgList) { return CollectionUtils.isEmpty(equipmentVariableCfgList) ? null : (equipmentVariableCfgList.stream().filter(o -> null != o).map(MesEquipmentVariableCfg::getCategoryLevelTwo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); } + //获取设备数据变量信息 @Override public MesProductionProcessContext getEquipmentVariableList(StationRequestBean reqBean, Integer variableType) { return getEquipmentVariableList(getEquipmentVariableCfgList(reqBean), variableType); } + //获取设备数据变量信息 @Override public MesProductionProcessContext getEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType) { @@ -240,6 +258,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //获取设备数据变量信息 @Override public List findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType) { @@ -260,18 +279,28 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //根据变量类型与二级变量获取设备数据变量信息 @Override public List findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType, List categoryLevelTwoList) { List equipmentVariableList = findEquipmentVariableList(productionProcessContext, variableType); return findEquipmentVariableList(equipmentVariableList, variableType, categoryLevelTwoList); } + //获取设备数据变量信息 @Override public List findEquipmentVariableList(List equipmentVariableList, Integer variableType, List categoryLevelTwoList) { return (CollectionUtils.isEmpty(equipmentVariableList) || CollectionUtils.isEmpty(categoryLevelTwoList)) ? null : equipmentVariableList.stream().filter(o -> (null != o && categoryLevelTwoList.contains(o.getCategoryLevelTwo()) && o.getVariableType().compareTo(variableType) == 0)).collect(Collectors.toList()); } + //验证设备数据变量信息是否为空 + @Override + public MesProductionProcessContext checkIsEmptyEquipmentVariableList(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE variableType, List categoryLevelTwoList) { + if (!CollectionUtils.isEmpty(equipmentVariableList)) return productionProcessContext; + return productionProcessContext.message(String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), variableType.getDescription(), categoryLevelTwoList.toString())); + } + + //发送设备质量信息 @Override public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) { StationResultBean resultBean = new StationResultBean(); @@ -281,8 +310,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl this.sendMessage(reqBean, resultBean); } - - + //存储展示组件MODULE_CONTENT内容 @Override public Boolean doCacheModuleContext(StationRequestBean reqBean, List> dataList) { return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue(), JSONObject.toJSONString(dataList)); @@ -294,22 +322,26 @@ public class MesProductionProcessContextStepService extends BaseStepService impl return StringUtils.isEmpty(moduleContent) ? null : JSONObject.parseObject(moduleContent, new TypeReference>>() {}); } + //存储上个扫描/读取信息 @Override public Boolean doCacheLastScanContext(StationRequestBean reqBean, List dataList) { return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.LAST_SCAN_INFO, JSONObject.toJSONString(dataList)); } + //获取上个扫描/读取信息 @Override public List getCachedLastScanContext(StationRequestBean reqBean) { String lastScanContent = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.LAST_SCAN_INFO); return StringUtils.isEmpty(lastScanContent) ? new ArrayList<>() : JSONObject.parseArray(lastScanContent, StationKvBean.class); } + //发送工步内容 @Override public void doSendStepContextMessage(StationRequestBean reqBean) { sendStepContextMessage(reqBean, getCachedLastScanContext(reqBean)); } + //发送工步内容 @Override public void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source) { @@ -323,6 +355,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } + //发送工步内容 @Override public void sendStepContextMessage(StationRequestBean reqBean, List lastScanContext) { StationResultBean resultBean = new StationResultBean(); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java index 73a373b..030acb3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java @@ -21,7 +21,6 @@ import com.alibaba.fastjson.JSONObject; 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; @@ -48,6 +47,7 @@ public class MesReadySignalReadStepService extends BaseStepService { @Override public StepResult init(StationRequestBean reqBean) { + //发送工步内容 productionProcessContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -61,8 +61,10 @@ public class MesReadySignalReadStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //获取工步参数 Optional> stepParamMap = getStepParams(reqBean); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); //当前工序已存在就绪信号 @@ -71,24 +73,30 @@ public class MesReadySignalReadStepService extends BaseStepService { //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + //根据变量类别[就绪信号]搜集设备数据变量接口逻辑信息 equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue()); + //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]就绪信号相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue()).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //搜集设备数据变量接口逻辑信息中的二级变量 List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + //根据变量类型与二级变量获取设备数据变量信息 List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + //获取设备LOG采集数据 MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); @@ -98,11 +106,13 @@ public class MesReadySignalReadStepService extends BaseStepService { execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); + //匹配就绪信号有效性 matchReadySignal(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext); //保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果 if (stepResult.isCompleted()) productionProcessContext.readySignal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); + //存储生产过程上下文对象 productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -113,15 +123,20 @@ public class MesReadySignalReadStepService extends BaseStepService { private StepResult matchReadySignal(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) { - + //未采集到数据 if (!equipLogDispatchContext.getIsCollectValue()) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]就绪信号,持续监听中...", cellEquipContext.getEquipmentCode())); + //匹配就绪信号有效性 Boolean result = (Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList()); + //匹配成功发送工步内容 if (result) productionProcessContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + //匹配成功 if (result) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("已读取到设备[%s]的就绪信号!", cellEquipContext.getEquipmentCode())); + + //匹配失败 return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]就绪信号的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode())); diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java index 8266d00..297cf7d 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java @@ -349,14 +349,11 @@ public class MesProductionProcessContext { //从上下文中取出零件信息集合 public Map getPartDataMap() { -// Map partMap = StringUtils.isEmpty(this.partDataJson) ? null : JSONObject.parseObject(this.partDataJson, Map.class); -// return CollectionUtils.isEmpty(partMap) ? null : partMap.entrySet().stream().filter(o -> null != o).collect(Collectors.toMap(Map.Entry::getKey, o -> JSONObject.parseObject(o.getValue(), MesPart.class))); return StringUtils.isEmpty(this.partDataJson) ? null : JSONObject.parseObject(this.partDataJson, new TypeReference>() {}); } //上下文赋值零件信息集合 public MesProductionProcessContext partDataJson(Map partDataMap) { -// Map partDataMap = partMap.entrySet().stream().filter(o -> null != o).collect(Collectors.toMap(Map.Entry::getKey, o -> JSONObject.toJSONString(o.getValue()))); this.partDataJson = !CollectionUtils.isEmpty(partDataMap) ? JSONObject.toJSONString(partDataMap) : null; return this; }