diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java index e0c8039..4720f8a 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.base; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentChannel; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; import io.swagger.annotations.ApiOperation; @@ -18,4 +19,7 @@ public interface IMesEquipmentExtService { @ApiOperation(value = "根据设备代码,变量类型查询设备数据变量集合") List getEquipmentVariableList(String organizeCode, String equipmentCode, Integer variableType); + @ApiOperation(value = "根据设备代码查询设备通道集合") + List getEquipmentChannelList(String organizeCode, String equipmentCode); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableRwExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableRwExtService.java index 3c15355..07505b4 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableRwExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipVariableRwExtService.java @@ -1,5 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwModel; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult; import io.swagger.annotations.ApiOperation; @@ -15,4 +17,7 @@ public interface IMesEquipVariableRwExtService { @ApiOperation(value = "读取") MesEquipVariableRwResult readVariable(MesEquipVariableRwModel equipVariableRwModel); + @ApiOperation(value = "写值") + MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java index 89ff818..80d84a2 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java @@ -61,6 +61,15 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "删除上下文就绪信号") void deleteReadySignalContext(StationRequestBean reqBean); + @ApiOperation(value = "获取上下文发送允许加工指令执行结果") + String getSendProcessCmdContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存上下文发送允许加工指令执行结果", notes = "写接口逻辑的参考值") + Boolean saveSendProcessCmdContext(StationRequestBean reqBean, String value); + + @ApiOperation(value = "删除上下文发送允许加工指令执行结果") + void deleteSendProcessCmdContext(StationRequestBean reqBean); + @ApiOperation(value = "获取上下文头道模具号") MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean); 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 1b755ae..27bc969 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 @@ -67,6 +67,9 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息") MesProductionProcessContext checkNecessaryEquipmentVariableCfg(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipmentVariableCfgList, String... variableCategory); + @ApiOperation(value = "验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息, 并且参考值不能为空") + MesProductionProcessContext checkNecessaryEquipmentVariableCfgAndValue(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipmentVariableCfgList, String... variableCategory); + @ApiOperation(value = "搜集设备数据变量接口逻辑信息中的二级变量") List collectCategoryLevelTwoList(List equipmentVariableCfgList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java index 7556712..f40673a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java @@ -6,14 +6,8 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipment; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; -import cn.estsh.i3plus.pojo.mes.bean.MesWcEquipment; -import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableCfgRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWcEquipmentRepository; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.repository.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -40,6 +34,9 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { @Autowired private MesEquipmentVariableCfgRepository equipmentVariableCfgRepository; + @Autowired + private MesEquipmentChannelRepository equipmentChannelRepository; + @Override public List getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; @@ -80,4 +77,12 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { return equipmentVariableRepository.findByHqlWhere(packBean); } + @Override + public List getEquipmentChannelList(String organizeCode, String equipmentCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode)) return null; + return equipmentChannelRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode}); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtServiceImpl.java index e313abb..00e0e65 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/equiplog/MesEquipmentRwExtServiceImpl.java @@ -7,11 +7,14 @@ import cn.estsh.i3plus.platform.common.tool.HttpClientTool; import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesConfig; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwModel; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -67,33 +70,33 @@ public class MesEquipmentRwExtServiceImpl implements IMesEquipVariableRwExtServi if (!result.getIsSuccessed()) return result; - if (StringUtils.isEmpty(equipVariableRwModel.getValue())) return new MesEquipVariableRwResult(false).message("入参缺失必要参数[value]!"); + if (StringUtils.isEmpty(equipVariableRwModel.getValue())) return result.noSuccessed().isNoCfg().message("入参缺失必要参数[value]!"); Map params = new HashMap<>(); params.put(MesPcnExtConstWords.VALUE, equipVariableRwModel.getValue()); - params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle()); + params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle().toString()); params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel()); - params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId()); + params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId().toString()); String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getWriteRequestUrl(), params, null, null); if (!StringUtils.isEmpty(data)) return JsonUtilTool.decode(data, MesEquipVariableRwResult.class); - else return result.isSuccessed(false).message(String.format("设备数据变量写值失败! 数据信息:[%s]", JSONObject.toJSONString(equipVariableRwModel))); + else return result.noSuccessed().message(String.format("设备数据变量写值失败! 数据信息:[%s]!", JSONObject.toJSONString(equipVariableRwModel))); } private MesEquipVariableRwResult checkBefore(MesEquipVariableRwModel equipVariableRwModel) { - if (null == equipVariableRwModel) return new MesEquipVariableRwResult(false).message("入参为空!"); + if (null == equipVariableRwModel) return new MesEquipVariableRwResult().noSuccessed().isNoCfg().message("入参为空!"); if (StringUtils.isEmpty(equipVariableRwModel.getOrganizeCode()) || StringUtils.isEmpty(equipVariableRwModel.getChannel()) || StringUtils.isEmpty(equipVariableRwModel.getEquipId()) || StringUtils.isEmpty(equipVariableRwModel.getClientHandle())) - return new MesEquipVariableRwResult(false).message("入参缺失必要参数,请检查参数[organizeCode][channel][equipId][clientHandle]是否缺失!"); + return new MesEquipVariableRwResult().noSuccessed().isNoCfg().message("入参缺失必要参数,请检查参数[organizeCode][channel][equipId][clientHandle]是否缺失!"); if (StringUtils.isEmpty(equipVariableRwModel.getWriteRequestUrl()) || StringUtils.isEmpty(equipVariableRwModel.getReadRequestUrl())) getRwRequestUrl(equipVariableRwModel); if (StringUtils.isEmpty(equipVariableRwModel.getWriteRequestUrl()) || StringUtils.isEmpty(equipVariableRwModel.getReadRequestUrl())) - return new MesEquipVariableRwResult(false).message(String.format("工厂[%s]缺失系统配置信息[%s]!", equipVariableRwModel.getOrganizeCode(), MesPcnExtConstWords.EQUIP_VARIABLE_RW_CFG)); + return new MesEquipVariableRwResult().noSuccessed().isNoCfg().message(String.format("工厂[%s]缺失系统配置信息[%s]!", equipVariableRwModel.getOrganizeCode(), MesPcnExtConstWords.EQUIP_VARIABLE_RW_CFG)); - return new MesEquipVariableRwResult(true); + return new MesEquipVariableRwResult(); } @@ -105,14 +108,21 @@ public class MesEquipmentRwExtServiceImpl implements IMesEquipVariableRwExtServi if (!result.getIsSuccessed()) return result; Map params = new HashMap<>(); - params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle()); + params.put(MesPcnExtConstWords.CLIENT_HANDLE, equipVariableRwModel.getClientHandle().toString()); params.put(MesPcnExtConstWords.CHANNEL, equipVariableRwModel.getChannel()); - params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId()); + params.put(MesPcnExtConstWords.EQUIPMENT_ID, equipVariableRwModel.getEquipId().toString()); String data = HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.POST, false, equipVariableRwModel.getReadRequestUrl(), params, null, null); if (!StringUtils.isEmpty(data)) return JsonUtilTool.decode(data, MesEquipVariableRwResult.class); - else return result.isSuccessed(false).message(String.format("设备数据变量读值失败! 数据信息:[%s]", JSONObject.toJSONString(equipVariableRwModel))); + else return result.noSuccessed().message(String.format("设备数据变量读值失败! 数据信息:[%s]!", JSONObject.toJSONString(equipVariableRwModel))); } + @Override + public MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) { + MesEquipVariableRwModel equipVariableRwModel = new MesEquipVariableRwModel(); + BeanUtils.copyProperties(equipmentVariable, equipVariableRwModel); + return writeVariable(equipVariableRwModel.value(equipmentVariableCfg.getValue()).kepwareFlag(kepwareFlag)); + } + } 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 603da1d..4833253 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 @@ -90,7 +90,7 @@ public class MesProductResultReadStepService extends BaseStepService { MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue()).getSuccess()) + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfgAndValue(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue()).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); //搜集设备数据变量接口逻辑信息中的二级变量 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 2363fec..dbb3813 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 @@ -86,7 +86,7 @@ public class MesReadySignalReadStepService extends BaseStepService { MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //配置错误 抛出异常 - if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue()).getSuccess()) + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfgAndValue(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue()).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); //搜集设备数据变量接口逻辑信息中的二级变量 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendInitializationCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendInitializationCmdStepService.java new file mode 100644 index 0000000..239e85a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendInitializationCmdStepService.java @@ -0,0 +1,130 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableRwExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +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.MesEquipVariableRwResult; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import 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.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * @Description : 发送初始化指令工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesSendInitializationCmdStepService") +public class MesSendInitializationCmdStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesEquipVariableRwExtService equipVariableRwExtService; + + @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 (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 + List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + + //根据变量类别[初始化指令]搜集设备数据变量接口逻辑信息 + equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.SEND_INIT.getValue()); + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //配置错误 抛出异常 + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfgAndValue(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.SEND_INIT.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 (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //发送数据给设备的数据变量 + execSendInitializationCmd(reqBean, resultBean, stepResult, cellEquipContext, stepParamMap, equipmentVariableCfgList.get(0), equipmentVariableList.get(0), cellEquipContext.getKepwareFlag(equipmentVariableList.get(0).getChannel())); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + return stepResult; + + } + + private StepResult execSendInitializationCmd(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, + Optional> stepParamMap, MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag) { + Integer maxRetryTimes = getMaxRetryTimes(stepParamMap); + + MesEquipVariableRwResult equipVariableRwResult; + + for (int i = 1; i <= maxRetryTimes; i ++) { + + equipVariableRwResult = equipVariableRwExtService.writeVariable(equipmentVariableCfg, equipmentVariable, kepwareFlag); + + this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipVariableRwResult), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())); + + if (equipVariableRwResult.getIsSuccessed()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送成功!", cellEquipContext.getEquipmentCode())); + + execNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:初始化指令发送失败!累计次数[%s]!原因:[%s]", cellEquipContext.getEquipmentCode(), i, equipVariableRwResult.getMessage())); + + if (i != maxRetryTimes) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + + } + + return stepResult; + + } + + private Integer getMaxRetryTimes(Optional> stepParamMap) { + Integer maxRetryTimes = null; + try { + maxRetryTimes = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.MAX_RETRY_TIMES)) ? Integer.valueOf(stepParamMap.get().get(MesPcnExtConstWords.MAX_RETRY_TIMES).getParamValue()) : null; + } catch (NumberFormatException e) { + } + return !StringUtils.isEmpty(maxRetryTimes) ? maxRetryTimes : MesPcnExtConstWords.MAX_RETRY_TIMES_DEFAULT; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendProcessCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendProcessCmdStepService.java new file mode 100644 index 0000000..4101c7c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendProcessCmdStepService.java @@ -0,0 +1,108 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableRwExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +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.MesEquipVariableRwResult; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import 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.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * @Description : 发送允许加工指令工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesSendProcessCmdStepService") +public class MesSendProcessCmdStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesEquipVariableRwExtService equipVariableRwExtService; + + @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(productionDispatchContextStepService.getSendProcessCmdContext(reqBean))) return stepResult; + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合 + List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct(); + + //根据变量类别[开始处理指令]搜集设备数据变量接口逻辑信息 + equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.SEND_PROCESS.getValue()); + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //配置错误 抛出异常 + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfgAndValue(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.SEND_PROCESS.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 (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess()) + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //发送数据给设备的数据变量 + MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(equipmentVariableCfgList.get(0), equipmentVariableList.get(0), cellEquipContext.getKepwareFlag(equipmentVariableList.get(0).getChannel())); + this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipVariableRwResult), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + if (!equipVariableRwResult.getIsSuccessed() && equipVariableRwResult.getIsNoCfg()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备[%s]:初始化指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //保存设备当前一轮工序的发送允许加工指令, 写接口逻辑参考值 + if (equipVariableRwResult.getIsSuccessed()) productionDispatchContextStepService.saveSendProcessCmdContext(reqBean, equipmentVariableCfgList.get(0).getValue()); + + if (!equipVariableRwResult.getIsSuccessed()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + + return !equipVariableRwResult.getIsSuccessed() ? + execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]:允许加工指令发送失败!原因:[%s]", cellEquipContext.getEquipmentCode(), equipVariableRwResult.getMessage())) : + execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, 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/context/MesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java index e97dcf9..715f499 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java @@ -18,6 +18,7 @@ import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -138,6 +139,24 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.READY_SIGNAL_CONTEXT); } + //获取上下文发送允许加工指令执行结果 + @Override + public String getSendProcessCmdContext(StationRequestBean reqBean) { + return getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SEND_PROCESS_CMD_CONTEXT); + } + + //保存上下文发送允许加工指令执行结果 写接口逻辑的参考值 + @Override + public Boolean saveSendProcessCmdContext(StationRequestBean reqBean, String value) { + return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SEND_PROCESS_CMD_CONTEXT, value); + } + + //删除上下文发送允许加工指令执行结果 + @Override + public void deleteSendProcessCmdContext(StationRequestBean reqBean) { + deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SEND_PROCESS_CMD_CONTEXT); + } + //获取上下文头道模具号 @Override public MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index 95a6b70..5695371 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -95,22 +95,21 @@ public class MesProductionProcessContextStepService extends BaseStepService impl if (!StringUtils.isEmpty(productionProcessContext.getProcessCode()) && productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) return productionProcessContext; - MesProcess process = fsmRouteDataService.doCachedFsmProcessData(reqBean, reqBean.getProcessCode()); - - MesProcessCraftCfg processCraftCfg = fsmRouteDataService.getProcessCraftCfg(reqBean.getOrganizeCode(), reqBean.getProcessCode()); + MesProcessCraftCfg processCraftCfg = fsmRouteDataService.doCachedFsmProcessCraftData(reqBean, reqBean.getProcessCode()); //生产过程上下文对象赋值当前工艺工序,未配置默认赋值工序代码,不强验证 - productionProcessContext.processCode(reqBean.getProcessCode(), null != process ? process.getProcessName() : reqBean.getProcessCode()); + productionProcessContext.processCode(reqBean.getProcessCode(), null != processCraftCfg ? processCraftCfg.getProcessName() : reqBean.getProcessCode()); - return productionProcessContext.craftCode(null != processCraftCfg ? processCraftCfg.getCraftCode() : reqBean.getProcessCode(), (null != processCraftCfg) ? productionProcessContext.getProcessCode() : productionProcessContext.getProcessName()); + return productionProcessContext.craftCode((null != processCraftCfg && !StringUtils.isEmpty(processCraftCfg.getCraftCode())) ? processCraftCfg.getCraftCode() : reqBean.getProcessCode(), + (null != processCraftCfg && !StringUtils.isEmpty(processCraftCfg.getCraftName())) ? processCraftCfg.getCraftName() : productionProcessContext.getProcessName()); } //获取finishCode码 @Override public MesProductionProcessContext finishCodeContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { - MesConfig config = configService.getMesConfigByCfgCode(MesPcnExtConstWords.CAVITY_FINISH_CODE, reqBean.getOrganizeCode()); - return productionProcessContext.finishCode((null != config && !StringUtils.isEmpty(config.getCfgValue())) ? config.getCfgValue() : MesPcnExtConstWords.CAVITY_FINISH_CODE); + List configList = configService.doCachedConfigList(MesPcnExtConstWords.CAVITY_FINISH_CODE, reqBean.getOrganizeCode()); + return productionProcessContext.finishCode((!CollectionUtils.isEmpty(configList) && !StringUtils.isEmpty(configList.get(0).getCfgValue())) ? configList.get(0).getCfgValue() : MesPcnExtConstWords.CAVITY_FINISH_CODE); } //验证组织模型有效性 @@ -188,7 +187,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl MesCellEquipContext cellEquipmentContext = productionProcessContext.filterCurCellEquip(equipmentCode); //生产过程上下文对象赋值当前设备代码 - if (null != cellEquipmentContext) return productionProcessContext.curCellEquipJson(cellEquipmentContext); + if (null != cellEquipmentContext) return productionProcessContext.curCellEquipJson(cellEquipmentContext.kepwareFlagJson(equipmentExtService.getEquipmentChannelList(reqBean.getOrganizeCode(), cellEquipmentContext.getEquipmentCode()))); return StringUtils.isEmpty(equipmentCode) ? productionProcessContext.message(String.format("请检查组织模型,生产线[%s]工位[%s]未维护设备信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())) : productionProcessContext.message(String.format("请检查组织模型,生产线[%s]工位[%s]未维护工步参数[%s]配置的设备[%s]!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.EQUIPMENT_CODE_UC, equipmentCode)); @@ -238,6 +237,15 @@ public class MesProductionProcessContextStepService extends BaseStepService impl return (null != optional && optional.isPresent()) ? productionProcessContext : productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]变量类别%s相关的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType(), variableCategoryList.toString())); } + //验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息,并且参考值不能为空 + @Override + public MesProductionProcessContext checkNecessaryEquipmentVariableCfgAndValue(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipmentVariableCfgList, String... variableCategory) { + List variableCategoryList = null == variableCategory ? null : Arrays.asList(variableCategory); + List filterList = (CollectionUtils.isEmpty(equipmentVariableCfgList) || CollectionUtils.isEmpty(variableCategoryList)) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && variableCategoryList.contains(o.getVariableCategory()))).collect(Collectors.toList()); + Optional optional = CollectionUtils.isEmpty(filterList) ? null : filterList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getValue()))).findFirst(); + return (!CollectionUtils.isEmpty(filterList) && (null == optional || !optional.isPresent())) ? productionProcessContext : productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置有效的变量配置类型[%s]变量类别%s相关的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType(), variableCategoryList.toString())); + } + //搜集设备数据变量接口逻辑信息中的二级变量 @Override public List collectCategoryLevelTwoList(List equipmentVariableCfgList) { diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java index 93cc7dd..510a089 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java @@ -1,10 +1,16 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentChannel; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.ApiParam; import lombok.Data; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.io.Serializable; +import java.util.*; +import java.util.stream.Collectors; /** * 生产过程上下文对象-工位设备信息 @@ -50,4 +56,32 @@ public class MesCellEquipContext implements Serializable { @ApiParam("设备质量") private Integer quality = MesExtEnumUtil.EQUIP_LOG_QUALITY.QUALITY.getValue(); + @ApiParam("kepware标识 Map") + private String kepwareFlagJson; + + //根据通到获取对应的kepware标识 + public String getKepwareFlag(String channel) { + + if (StringUtils.isEmpty(channel) || StringUtils.isEmpty(this.kepwareFlagJson)) return null; + + Map kepwareFlagMap = JSONObject.parseObject(this.kepwareFlagJson, Map.class); + + return !CollectionUtils.isEmpty(kepwareFlagMap) ? kepwareFlagMap.get(channel) : null; + + } + + //赋值kepware标识数据 + public MesCellEquipContext kepwareFlagJson(List equipmentChannelList) { + + equipmentChannelList = CollectionUtils.isEmpty(equipmentChannelList) ? null : + equipmentChannelList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getChannel()) && !StringUtils.isEmpty(o.getKepwareFlag()))) + .distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesEquipmentChannel::getChannel))), ArrayList::new)); + + Map kepwareFlagMap = CollectionUtils.isEmpty(equipmentChannelList) ? null : + equipmentChannelList.stream().filter(o -> null != o).collect(Collectors.toMap(MesEquipmentChannel::getChannel, MesEquipmentChannel::getKepwareFlag)); + + this.kepwareFlagJson = !CollectionUtils.isEmpty(kepwareFlagMap) ? JSONObject.toJSONString(kepwareFlagMap) : null; + + return this; + } } 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 e529e69..01f8eb6 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 @@ -32,6 +32,9 @@ public class MesProductionProcessContext implements Serializable { @ApiParam("信息") private String message; + @ApiParam("是否需要重新存储") + private Boolean isNeedCache; + @ApiParam("组织代码") private String organizeCode; @@ -88,6 +91,7 @@ public class MesProductionProcessContext implements Serializable { //上下文信息结果初始化 public MesProductionProcessContext success() { this.success = true; + this.isNeedCache = false; this.message = null; return this; } @@ -98,6 +102,12 @@ public class MesProductionProcessContext implements Serializable { return this; } + //手动赋是否缓存的标志(大部分工步最后都会保存上下文,最终实际根据此标志识别是否需要保存) + public MesProductionProcessContext isNeedCache() { + this.isNeedCache = true; + return this; + } + //上下文信息结果信息赋值后给工步使用 public MesProductionProcessContext message(String message) { this.success = false; @@ -110,7 +120,7 @@ public class MesProductionProcessContext implements Serializable { //上下文赋值finishCode码 public MesProductionProcessContext finishCode(String finishCode) { this.finishCode = finishCode; - return this; + return this.isNeedCache(); } @@ -124,7 +134,7 @@ public class MesProductionProcessContext implements Serializable { //上下文赋值生产线对象 public MesProductionProcessContext workCenterJson(MesWorkCenter workCenter) { this.workCenterJson = null != workCenter ? JSONObject.toJSONString(workCenter) : null; - return this; + return this.isNeedCache(); } //---------------------- 工位对象 --------------------------------------- @@ -137,7 +147,7 @@ public class MesProductionProcessContext implements Serializable { //上下文赋值工位对象 public MesProductionProcessContext workCellJson(MesWorkCell workCell) { this.workCellJson = null != workCell ? JSONObject.toJSONString(workCell) : null; - return this; + return this.isNeedCache(); } //---------------------- 工序/工艺信息 --------------------------------------- @@ -146,14 +156,14 @@ public class MesProductionProcessContext implements Serializable { public MesProductionProcessContext processCode(String processCode, String processName) { this.processCode = processCode; this.processName = processName; - return this; + return this.isNeedCache(); } //上下文赋值工艺信息 public MesProductionProcessContext craftCode(String craftCode, String craftName) { this.craftCode = craftCode; this.craftName = craftName; - return this; + return this.isNeedCache(); } //---------------------- 工位设备对象集合 --------------------------------------- @@ -166,7 +176,7 @@ public class MesProductionProcessContext implements Serializable { //上下文赋值工位设备对象集合 public MesProductionProcessContext cellEquipListJson(List cellEquipList) { this.cellEquipListJson = !CollectionUtils.isEmpty(cellEquipList) ? JSONObject.toJSONString(cellEquipList) : null; - return this; + return this.isNeedCache(); } //---------------------- 工位当前设备 --------------------------------------- @@ -202,7 +212,7 @@ public class MesProductionProcessContext implements Serializable { //未配置则默认没有装配件 if (StringUtils.isEmpty(curEquip.getBindQty())) curEquip.setBindQty(MesPcnExtConstWords.ZERO); this.curCellEquipJson = null != curEquip ? JSONObject.toJSONString(curEquip) : null; - return this; + return this.isNeedCache(); } //---------------------- 数据变量接口逻辑集合 --------------------------------------- @@ -232,7 +242,7 @@ public class MesProductionProcessContext implements Serializable { equipmentVariableCfgList = equipmentVariableCfgList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesEquipmentVariableCfg::getModifyDatetime).reversed()).collect(Collectors.toList()); equipmentVariableCfgList = equipmentVariableCfgList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesEquipmentVariableCfg::getId))), ArrayList::new)); this.equipVariableCfgJson = JSONObject.toJSONString(equipmentVariableCfgList); - return this; + return this.isNeedCache(); } //---------------------- 数据变量对象集合 --------------------------------------- @@ -263,7 +273,7 @@ public class MesProductionProcessContext implements Serializable { equipmentVariableList = equipmentVariableList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesEquipmentVariable::getModifyDatetime).reversed()).collect(Collectors.toList()); equipmentVariableList = equipmentVariableList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesEquipmentVariable::getId))), ArrayList::new)); this.equipVariableJson = JSONObject.toJSONString(equipmentVariableList); - return this; + return this.isNeedCache(); } } 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 7b72e9e..29eefe3 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 @@ -123,8 +123,12 @@ public class MesPcnExtConstWords { public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE"; // 读取失败睡眠毫秒数[工步参数] public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP"; - // 0 + // 读取失败睡眠默认毫秒数 public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 1000L; + // 最大重试次数[工步参数] + public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES"; + // 最大重试次数[工步参数] + public static final Integer MAX_RETRY_TIMES_DEFAULT = 10; @@ -163,6 +167,8 @@ public class MesPcnExtConstWords { public static final String PRODUCT_RESULT_CONTEXT = "PRODUCT_RESULT_CONTEXT"; // 上下文: 就绪信号 public static final String READY_SIGNAL_CONTEXT = "READY_SIGNAL_CONTEXT"; + // 上下文: 发送允许加工指令 + public static final String SEND_PROCESS_CMD_CONTEXT = "SEND_PROCESS_CMD_CONTEXT"; // 上下文: 头道模具号 public static final String FIRST_MOULD_NO_CONTEXT = "FIRST_MOULD_NO_CONTEXT"; // 上下文: 模具号 @@ -179,8 +185,6 @@ public class MesPcnExtConstWords { public static final String SCAN_ASSEMBLY_SN_CONTEXT = "SCAN_ASSEMBLY_SN_CONTEXT"; // 上下文: 产品加工规则数据信息 public static final String PROD_RULE_DATA_CONTEXT = "PROD_RULE_DATA_CONTEXT"; - // 上下文: 进料条码数据信息 - public static final String IN_PRODUCE_SN_DATA_CONTEXT = "IN_PRODUCE_SN_DATA_CONTEXT"; // 上下文: 产出条码数据信息 public static final String OUT_PRODUCE_SN_DATA_CONTEXT = "OUT_PRODUCE_SN_DATA_CONTEXT"; // 上下文: 装配件清单