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 9f4e1f8..6997172 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 @@ -35,6 +35,7 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "获取工位设备集合信息") MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + //正常情况下均直接调用以下方法获取上下文 @ApiOperation(value = "获取工位当前设备信息") MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean); 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 d8cc7cf..32cacc0 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 @@ -23,6 +23,7 @@ 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.Map; @@ -59,10 +60,11 @@ public class MesAssemblyReadStepService extends BaseStepService { MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); - productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext); + //当前工序已存在读取待验证的装配件条码 + if (!StringUtils.isEmpty(productionProcessContext.getAssemblySnJson())) return stepResult; //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); @@ -91,12 +93,9 @@ public class MesAssemblyReadStepService extends BaseStepService { execDynamicsCompleteAndSendMsg(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); - //验证头道模具号的有效性 + //验证装配件条码的有效性 if (stepResult.isCompleted()) matchAssemblySnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, collectContextList); - //设置STATE_CMD: 失败返回至结束状态, 下次触发流程直接强制执行当前状态点 - if (!stepResult.isCompleted()) stepResult.setStateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE); - productionProcessContextStepService.doCacheContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java new file mode 100644 index 0000000..bb40efe --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java @@ -0,0 +1,123 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCfgCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +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.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; +import cn.estsh.i3plus.pojo.mes.model.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 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; +import java.util.Map; +import java.util.Optional; + +/** + * @Description : 扫描装配件条码工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesAssemblyReadStepService") +public class MesAssemblyScanStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesEquipmentLogExtService equipmentLogExtService; + + @Autowired + private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService; + + @Autowired + private IMesMouldMultiCavityService mouldMultiCavityService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + Optional> stepParamMap = getStepParams(reqBean); + + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); + + //当前工序已存在读取待验证的装配件条码 + if (!StringUtils.isEmpty(productionProcessContext.getAssemblySnJson())) return stepResult; + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, 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, + String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]装配件条码相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + + List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + + List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); + + //配置错误 抛出异常 + if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean, + String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + + List collectContextList = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); + this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(collectContextList), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + //验证设备通信质量 + productionProcessContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) + execDynamicsCompleteAndSendMsg(reqBean, resultBean, stepResult, false, + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); + + //验证装配件条码的有效性 + if (stepResult.isCompleted()) matchAssemblySnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, collectContextList); + + productionProcessContextStepService.doCacheContext(reqBean, productionProcessContext); + + if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + + return stepResult; + + } + + private StepResult matchAssemblySnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List collectContextList) { + + //读取的装配件进行规则匹配 + List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue(), collectContextList); + + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]装配件条码,持续监听中...", cellEquipContext.getEquipmentCode())); + + //保存设备当前一轮工序的装配件信息 + productionProcessContext.assemblySnJson(equipVariableCollectContextList); + + return stepResult; + + } + + +} 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 619d197..b7c96ce 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 @@ -24,6 +24,7 @@ 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.Map; @@ -60,10 +61,11 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); - productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext); + //当前工序已存在头道模具号跟一模多腔信息 + if (!StringUtils.isEmpty(productionProcessContext.getFirstMouldNo()) && !StringUtils.isEmpty(productionProcessContext.getMouldCavityJson())) return stepResult; //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); @@ -95,9 +97,6 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { //验证头道模具号的有效性 if (stepResult.isCompleted()) checkFirstMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, collectContextList); - //设置STATE_CMD: 失败返回至结束状态, 下次触发流程直接强制执行当前状态点 - if (!stepResult.isCompleted()) stepResult.setStateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE); - productionProcessContextStepService.doCacheContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); 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 ad73c4e..82d08d4 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 @@ -61,10 +61,11 @@ public class MesMouldNoReadStepService extends BaseStepService { MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); - productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext); + //当前工序已存在模具号跟一模多腔信息 + if (!StringUtils.isEmpty(productionProcessContext.getMouldNo()) && !StringUtils.isEmpty(productionProcessContext.getMouldCavityJson())) return stepResult; //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); @@ -93,12 +94,9 @@ public class MesMouldNoReadStepService extends BaseStepService { execDynamicsCompleteAndSendMsg(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); - //验证头道模具号的有效性 + //验证模具号的有效性 if (stepResult.isCompleted()) checkMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, collectContextList); - //设置STATE_CMD: 失败返回至结束状态, 下次触发流程直接强制执行当前状态点 - if (!stepResult.isCompleted()) stepResult.setStateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE); - productionProcessContextStepService.doCacheContext(reqBean, productionProcessContext); if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); 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 41648d0..73fc541 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 @@ -21,6 +21,7 @@ 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.Map; @@ -55,10 +56,11 @@ public class MesProductResultReadStepService extends BaseStepService { MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); - productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext); + //当前工序已存在加工结果 + if (!StringUtils.isEmpty(productionProcessContext.getProductResult())) return stepResult; //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); @@ -86,7 +88,7 @@ public class MesProductResultReadStepService extends BaseStepService { //验证设备通信质量; 设置STATE_CMD: 失败返回至结束状态, 下次触发流程直接强制执行当前状态点 productionProcessContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) - execDynamicsCompleteAndSendMsg(reqBean, resultBean, stepResult.stateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE), false, + execDynamicsCompleteAndSendMsg(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); if (stepResult.isCompleted()) matchProductResult(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, collectContextList); @@ -126,7 +128,7 @@ public class MesProductResultReadStepService extends BaseStepService { } //设置STATE_CMD: 失败返回至结束状态, 下次触发流程直接强制执行当前状态点 - return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.stateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE), false, + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, 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 new file mode 100644 index 0000000..a1aa56a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java @@ -0,0 +1,123 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCfgCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +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.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; +import cn.estsh.i3plus.pojo.mes.model.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 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; +import java.util.Map; +import java.util.Optional; + +/** + * @Description : 读主条码工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductSnReadStepService") +public class MesProductSnReadStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesEquipmentLogExtService equipmentLogExtService; + + @Autowired + private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService; + + @Autowired + private IMesMouldMultiCavityService mouldMultiCavityService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + Optional> stepParamMap = getStepParams(reqBean); + + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap); + + //当前工序已存在读取待验证的主条码信息 + if (!StringUtils.isEmpty(productionProcessContext.getProductSnJson())) return stepResult; + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, 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, + String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]主条码相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); + + List categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList); + + List equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList); + + //配置错误 抛出异常 + if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean, + String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + + List collectContextList = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList); + this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(collectContextList), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + //验证设备通信质量 + productionProcessContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) + execDynamicsCompleteAndSendMsg(reqBean, resultBean, stepResult, false, + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); + + //验证主条码的有效性 + if (stepResult.isCompleted()) matchProductSnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, collectContextList); + + productionProcessContextStepService.doCacheContext(reqBean, productionProcessContext); + + if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + + return stepResult; + + } + + private StepResult matchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List collectContextList) { + + //读取的主条码进行规则匹配 + List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue(), collectContextList); + + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]主条码,持续监听中...", cellEquipContext.getEquipmentCode())); + + //保存设备当前一轮工序的主信息 + productionProcessContext.productSnJson(equipVariableCollectContextList); + + return stepResult; + + } + + +} 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 1dc0c15..b8ae68a 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 @@ -148,6 +148,8 @@ public class MesProductionProcessContextStepService extends BaseStepService impl if (!productionProcessContext.getSuccess()) return productionProcessContext; + if (StringUtils.isEmpty(productionProcessContext.getCellEquipListJson())) getCellEquipmentList(reqBean, productionProcessContext); + //获取当前工步的设备参数 String equipmentCode = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.EQUIPMENT_CODE_UC)) ? stepParamMap.get().get(MesPcnExtConstWords.EQUIPMENT_CODE_UC).getParamValue() : null; 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 54540e9..d53acdc 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 @@ -283,9 +283,14 @@ public class MesProductionProcessContext { return this; } + //从上下文中取出头道模具号 + public MesEquipVariableCollectContext getFirstMouldNo() { + return StringUtils.isEmpty(this.firstMouldNo) ? null : JSONObject.parseObject(this.firstMouldNo, MesEquipVariableCollectContext.class); + } + //上下文赋值头道模具号 - public MesProductionProcessContext firstMouldNo(String firstMouldNo) { - this.firstMouldNo = firstMouldNo; + public MesProductionProcessContext firstMouldNo(MesEquipVariableCollectContext firstMouldNo) { + this.firstMouldNo = null != firstMouldNo ? JSONObject.toJSONString(firstMouldNo) : null; return this; } @@ -295,9 +300,14 @@ public class MesProductionProcessContext { return this; } + //从上下文中取出模具号 + public MesEquipVariableCollectContext getMouldNo() { + return StringUtils.isEmpty(this.mouldNo) ? null : JSONObject.parseObject(this.mouldNo, MesEquipVariableCollectContext.class); + } + //上下文赋值模具号 - public MesProductionProcessContext mouldNo(String mouldNo) { - this.mouldNo = mouldNo; + public MesProductionProcessContext mouldNo(MesEquipVariableCollectContext mouldNo) { + this.mouldNo = null != mouldNo ? JSONObject.toJSONString(mouldNo) : null; return this; } @@ -341,14 +351,48 @@ public class MesProductionProcessContext { return this; } + //从上下文中取出主条码信息 + public List getProductSnList() { + return StringUtils.isEmpty(this.productSnJson) ? null : JSONObject.parseArray(this.productSnJson, MesEquipVariableCollectContext.class); + } + + //上下文赋值主条码信息 + public MesProductionProcessContext productSnJson(List productSnList) { + this.productSnJson = !CollectionUtils.isEmpty(productSnList) ? JSONObject.toJSONString(productSnList) : null; + return this; + } + + //上下文清除主条码信息 + public MesProductionProcessContext productSnJsonClear() { + this.productSnJson = null; + return this; + } + + //从上下文中取出装配件条码集合 + public List getAssemblySnList() { + return StringUtils.isEmpty(this.assemblySnJson) ? null : JSONObject.parseArray(this.assemblySnJson, MesEquipVariableCollectContext.class); + } + + //上下文赋值装配件条码集合 + public MesProductionProcessContext assemblySnJson(List assemblySnList) { + this.assemblySnJson = !CollectionUtils.isEmpty(assemblySnList) ? JSONObject.toJSONString(assemblySnList) : null; + return this; + } + + //上下文清除装配件条码集合 + public MesProductionProcessContext assemblySnJsonClear() { + this.assemblySnJson = null; + return this; + } + //从上下文中取出零件条码信息集合 public List getProduceSnDataList() { return StringUtils.isEmpty(this.produceSnDataJson) ? null : JSONObject.parseArray(this.produceSnDataJson, MesProduceSn.class); } //上下文赋值零件条码信息集合 - public MesProductionProcessContext produceSnDataJson(List produceSnList) { - this.produceSnDataJson = !CollectionUtils.isEmpty(produceSnList) ? JSONObject.toJSONString(produceSnList) : null; + public MesProductionProcessContext produceSnDataJson(List produceSnDataList) { + this.produceSnDataJson = !CollectionUtils.isEmpty(produceSnDataList) ? JSONObject.toJSONString(produceSnDataList) : null; return this; }