diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesMouldMultiCavityService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesMouldMultiCavityService.java new file mode 100644 index 0000000..3930bf5 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesMouldMultiCavityService.java @@ -0,0 +1,13 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesMouldMultiCavity; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface IMesMouldMultiCavityService { + + @ApiOperation(value = "根据设备代码,模具号查询一模多腔信息") + List getMouldMultiCavityList(String organizeCode, String equipmentCode, String mouldNo); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableCfgRuleMatchDispatchService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableCfgRuleMatchDispatchService.java index 1bab6c1..87c5b36 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableCfgRuleMatchDispatchService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableCfgRuleMatchDispatchService.java @@ -10,6 +10,6 @@ import java.util.List; public interface IMesEquipVariableCfgRuleMatchDispatchService { @ApiOperation(value = "设备数据变量接口逻辑根据变量类别规则匹配") - Boolean matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList); + Object matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesMouldMultiCavityService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesMouldMultiCavityService.java new file mode 100644 index 0000000..dbe690d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesMouldMultiCavityService.java @@ -0,0 +1,29 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesMouldMultiCavity; +import cn.estsh.i3plus.pojo.mes.repository.MesMouldMultiCavityRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.List; + +@Slf4j +@Service +public class MesMouldMultiCavityService implements IMesMouldMultiCavityService { + + @Autowired + private MesMouldMultiCavityRepository mouldMultiCavityRepository; + + @Override + public List getMouldMultiCavityList(String organizeCode, String equipmentCode, String mouldNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode) || StringUtils.isEmpty(mouldNo)) return null; + return mouldMultiCavityRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE, MesPcnExtConstWords.MOULD_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode, mouldNo}); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEquipVariableCfgRuleMatchDispatchService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEquipVariableCfgRuleMatchDispatchService.java index 493d2e5..fbd7140 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEquipVariableCfgRuleMatchDispatchService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEquipVariableCfgRuleMatchDispatchService.java @@ -17,12 +17,12 @@ import java.util.List; @Service public class MesEquipVariableCfgRuleMatchDispatchService implements IMesEquipVariableCfgRuleMatchDispatchService { - private Boolean matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList, String strategyClass) { + private Object matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList, String strategyClass) { return ((IMesEquipVariableCfgRuleMatchDispatchService) SpringContextsUtil.getBean(strategyClass)).matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, variableCategory, collectContextList); } @Override - public Boolean matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList) { + public Object matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList) { switch (MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.getByValue(variableCategory)) { @@ -30,7 +30,10 @@ public class MesEquipVariableCfgRuleMatchDispatchService implements IMesEquipVar case PRODUCT_NOK: case PRODUCT_SCRAP: case PRODUCT_SUSPICIOUS: - return matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, variableCategory, collectContextList, "mesEvcRuleMatchProductionResultService"); + return matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, variableCategory, collectContextList, "mesEvcRuleMatchCompareValueService"); + case FIRST_MOULD_NO: + case MOULD_NO: + return matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, variableCategory, collectContextList, "mesEvcRuleMatchBackValueService"); //TODO CASE 数据变量接口逻辑根据变量类别实现策略 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchBackValueService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchBackValueService.java new file mode 100644 index 0000000..ac78c6b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchBackValueService.java @@ -0,0 +1,48 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; +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.pojo.mes.model.StationRequestBean; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 将不为空的数据变量全部返回 + */ +@Slf4j +@Service +public class MesEvcRuleMatchBackValueService implements IMesEquipVariableCfgRuleMatchDispatchService { + + @Override + public List matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList) { + + List backList = null; + + for (MesEquipVariableCfgCollectContext collectContext : collectContextList) { + + if (null == collectContext || CollectionUtils.isEmpty(collectContext.getEquipVariableCollectContextList())) continue; + + for (MesEquipVariableCollectContext equipVariableCollectContext : collectContext.getEquipVariableCollectContextList()) { + + if (null == equipVariableCollectContext || StringUtils.isEmpty(equipVariableCollectContext.getEquipVariableValue())) continue; + + if (CollectionUtils.isEmpty(backList)) backList = new ArrayList<>(); + + backList.add(equipVariableCollectContext); + + } + + } + + return backList; + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchProductionResultService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchCompareValueService.java similarity index 95% rename from modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchProductionResultService.java rename to modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchCompareValueService.java index e464a1d..07dd359 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchProductionResultService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesEvcRuleMatchCompareValueService.java @@ -14,9 +14,12 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +/** + * 取一组全部匹配的结构 + */ @Slf4j @Service -public class MesEvcRuleMatchProductionResultService implements IMesEquipVariableCfgRuleMatchDispatchService { +public class MesEvcRuleMatchCompareValueService implements IMesEquipVariableCfgRuleMatchDispatchService { @Override public Boolean matchEquipVariableCfgCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, String variableCategory, List collectContextList) { 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 83af825..8188705 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 @@ -1,10 +1,33 @@ 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.MesMouldMultiCavity; +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 java.util.List; +import java.util.Map; +import java.util.Optional; /** * @Description : 读头道模具号工步 @@ -17,6 +40,85 @@ public class MesFirstMouldNoReadStepService 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); + + productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, 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, + 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); + + //读取头道模具号进行规则匹配 + List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue(), collectContextList); + + //验证头道模具号的有效性 + checkMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipVariableCollectContextList); + + //设置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, 1000L); + + return stepResult; + + } + + private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipVariableCollectContextList) { + + 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())); + + String firstMouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); + + List mouldMultiCavityList = mouldMultiCavityService.getMouldMultiCavityList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode(), firstMouldNo); + + if (CollectionUtils.isEmpty(mouldMultiCavityList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("当前设备[%s]与读取到的头道模具号[%s]未维护有效的一模多腔信息!", cellEquipContext.getEquipmentCode(), firstMouldNo)); + + //保存设备当前一轮工序的头道模具号与一模多腔信息 + productionProcessContext.firstMouldNo(firstMouldNo).mouldCavityJson(mouldMultiCavityList); + + return stepResult; + } } 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 new file mode 100644 index 0000000..90474bb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java @@ -0,0 +1,136 @@ +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.MesMouldMultiCavity; +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("mesMouldNoReadStepService") +public class MesMouldNoReadStepService 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); + + productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, 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, + 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); + + //读取模具号进行规则匹配 + List equipVariableCollectContextList = (List) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue(), collectContextList); + + //验证模具号的有效性 + checkMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipVariableCollectContextList); + + //设置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, 1000L); + + return stepResult; + + } + + private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipVariableCollectContextList) { + + 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())); + + String mouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); + + if (StringUtils.isEmpty(productionProcessContext.getFirstMouldNo()) && !checkMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, mouldNo).isCompleted()) return stepResult; + + //保存设备当前一轮工序的模具号 + productionProcessContext.mouldNo(mouldNo); + + return stepResult; + + } + + private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, String mouldNo) { + + List mouldMultiCavityList = mouldMultiCavityService.getMouldMultiCavityList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode(), mouldNo); + + if (CollectionUtils.isEmpty(mouldMultiCavityList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("当前设备[%s]与读取到的模具号[%s]未维护有效的一模多腔信息!", cellEquipContext.getEquipmentCode(), mouldNo)); + + //保存设备当前一轮工序的头道模具号与一模多腔信息 + productionProcessContext.firstMouldNo(mouldNo).mouldCavityJson(mouldMultiCavityList); + + 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 0e55794..79f176a 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 @@ -16,16 +16,15 @@ 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; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -70,10 +69,6 @@ public class MesProductResultReadStepService extends BaseStepService { MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean, - String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]获取加工结果相关变量类别的数据变量接口逻辑信息", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType())); - - //配置错误 抛出异常 if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue()).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean, productionProcessContext.getMessage()); @@ -83,9 +78,10 @@ public class MesProductResultReadStepService extends BaseStepService { //配置错误 抛出异常 if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean, - String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString())); + 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); Map> variableCategoryMap = collectContextList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCfgCollectContext::getVariableCategory)); @@ -96,20 +92,19 @@ public class MesProductResultReadStepService extends BaseStepService { productionProcessContextStepService.doCacheContext(reqBean, productionProcessContext); - if (!stepResult.isCompleted()) threadSleep(stepParamMap); + if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, 1000L); return stepResult; } - //加工结果规则匹配:根据变量类别分组, 只要匹配一组即可; 在一组中根据规则类别分组, 相同规则类别的一组必须全部匹配, 任意一组规则类别匹配成功即可 private StepResult matchVariableCategoryMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, Map> variableCategoryMap) { for (Map.Entry> entry : variableCategoryMap.entrySet()) { if (null == entry) continue; - if (!equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, entry.getKey(), entry.getValue())) continue; + if (!(Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, entry.getKey(), entry.getValue())) continue; if (MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue().equals(entry.getKey())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getDescription())); return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.obj(entry.getKey()), true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, @@ -118,16 +113,11 @@ public class MesProductResultReadStepService extends BaseStepService { } //设置STATE_CMD: 失败返回至结束状态, 下次触发流程直接强制执行当前状态点 - return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.stateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE), String.format("读取设备[%s]数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode())); + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.stateCmd(MesPcnEnumUtil.STATION_REQUEST_BEAN_CMD.FORCE_STATE), false, + MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode())); } - private void threadSleep(Optional> stepParamMap) { - String readFailureSleep = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.READ_FAILURE_SLEEP)) ? stepParamMap.get().get(MesPcnExtConstWords.READ_FAILURE_SLEEP).getParamValue() : null; - try { - TimeUnit.MILLISECONDS.sleep(StringUtils.isEmpty(readFailureSleep) ? 1000L : Long.valueOf(readFailureSleep)); - } catch (InterruptedException e) { - } - } + } 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 8ef9736..23233e9 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 @@ -2,7 +2,6 @@ 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.IMesProdOrgExtService; -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.MesProductionProcessContext; @@ -41,9 +40,6 @@ public class MesProductionProcessContextStepService extends BaseStepService impl @Autowired private IFsmRouteDataService fsmRouteDataService; - @Autowired - private IMesEquipmentLogExtService equipmentLogExtService; - @Override public Boolean doCacheContext(StationRequestBean reqBean, Object o) { return saveFsmBusiData(reqBean.getOrganizeCode(), getFsmBusikey(reqBean, o.getClass().getSimpleName()), JSONObject.toJSONString(o)); } @@ -202,7 +198,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl 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 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 1bddc12..6f131c6 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 @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.*; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.ApiParam; import lombok.Data; @@ -69,8 +66,6 @@ public class MesProductionProcessContext { @ApiParam("加工结果:成功/报废/可疑 【报废/可疑: 在保存逻辑条码时有特殊业务处理】") private String productResult; - //-------------------------------------------------------- - @ApiParam("头道模具号") private String firstMouldNo; @@ -80,6 +75,8 @@ public class MesProductionProcessContext { @ApiParam("一模多腔信息") private String mouldCavityJson; + //-------------------------------------------------------- + @ApiParam("腔组明细信息") private String cavityGroupDetailJson; @@ -270,4 +267,45 @@ public class MesProductionProcessContext { return this; } + //上下文赋值头道模具号 + public MesProductionProcessContext firstMouldNo(String firstMouldNo) { + this.firstMouldNo = firstMouldNo; + return this; + } + + //上下文清除头道模具号 + public MesProductionProcessContext firstMouldNoClear() { + this.firstMouldNo = null; + return this; + } + + //上下文赋值模具号 + public MesProductionProcessContext mouldNo(String mouldNo) { + this.mouldNo = mouldNo; + return this; + } + + //上下文清除模具号 + public MesProductionProcessContext mouldNoClear() { + this.mouldNo = null; + return this; + } + + //从上下文中取出一模多腔信息集合 + public List getMouldCavityList() { + return StringUtils.isEmpty(this.mouldCavityJson) ? null : JSONObject.parseArray(this.mouldCavityJson, MesMouldMultiCavity.class); + } + + //上下文赋值一模多腔信息 + public MesProductionProcessContext mouldCavityJson(List mouldMultiCavityList) { + this.mouldCavityJson = !CollectionUtils.isEmpty(mouldMultiCavityList) ? JSONObject.toJSONString(mouldMultiCavityList) : null; + return this; + } + + //上下文清除一模多腔信息 + public MesProductionProcessContext mouldCavityJsonClear() { + this.mouldCavityJson = null; + return this; + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 56ae6ef..15389bb 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -60,6 +60,8 @@ public class MesPcnExtConstWords { public static final String VARIABLE_CFG_TYPE = "variableCfgType"; // 变量状态 public static final String EQUIP_VARIABLE_STATUS = "equipVariableStatus"; + // 模具号 + public static final String MOULD_NO = "mouldNo";