tags/yfai-pcn-ext-v1.0
王杰 12 months ago
parent 81578b5f10
commit 2bb18b5374

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.base; package cn.estsh.i3plus.ext.mes.pcn.api.base;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; 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.MesEquipmentVariable;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -18,4 +19,7 @@ public interface IMesEquipmentExtService {
@ApiOperation(value = "根据设备代码,变量类型查询设备数据变量集合") @ApiOperation(value = "根据设备代码,变量类型查询设备数据变量集合")
List<MesEquipmentVariable> getEquipmentVariableList(String organizeCode, String equipmentCode, Integer variableType); List<MesEquipmentVariable> getEquipmentVariableList(String organizeCode, String equipmentCode, Integer variableType);
@ApiOperation(value = "根据设备代码查询设备通道集合")
List<MesEquipmentChannel> getEquipmentChannelList(String organizeCode, String equipmentCode);
} }

@ -1,5 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi; 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.MesEquipVariableRwModel;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -15,4 +17,7 @@ public interface IMesEquipVariableRwExtService {
@ApiOperation(value = "读取") @ApiOperation(value = "读取")
MesEquipVariableRwResult readVariable(MesEquipVariableRwModel equipVariableRwModel); MesEquipVariableRwResult readVariable(MesEquipVariableRwModel equipVariableRwModel);
@ApiOperation(value = "写值")
MesEquipVariableRwResult writeVariable(MesEquipmentVariableCfg equipmentVariableCfg, MesEquipmentVariable equipmentVariable, String kepwareFlag);
} }

@ -61,6 +61,15 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "删除上下文就绪信号") @ApiOperation(value = "删除上下文就绪信号")
void deleteReadySignalContext(StationRequestBean reqBean); 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 = "获取上下文头道模具号") @ApiOperation(value = "获取上下文头道模具号")
MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean); MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean);

@ -67,6 +67,9 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息") @ApiOperation(value = "验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息")
MesProductionProcessContext checkNecessaryEquipmentVariableCfg(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariableCfg> equipmentVariableCfgList, String... variableCategory); MesProductionProcessContext checkNecessaryEquipmentVariableCfg(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariableCfg> equipmentVariableCfgList, String... variableCategory);
@ApiOperation(value = "验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息, 并且参考值不能为空")
MesProductionProcessContext checkNecessaryEquipmentVariableCfgAndValue(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariableCfg> equipmentVariableCfgList, String... variableCategory);
@ApiOperation(value = "搜集设备数据变量接口逻辑信息中的二级变量") @ApiOperation(value = "搜集设备数据变量接口逻辑信息中的二级变量")
List<String> collectCategoryLevelTwoList(List<MesEquipmentVariableCfg> equipmentVariableCfgList); List<String> collectCategoryLevelTwoList(List<MesEquipmentVariableCfg> equipmentVariableCfgList);

@ -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.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipment; import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; import cn.estsh.i3plus.pojo.mes.repository.*;
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 lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -40,6 +34,9 @@ public class MesEquipmentExtService implements IMesEquipmentExtService {
@Autowired @Autowired
private MesEquipmentVariableCfgRepository equipmentVariableCfgRepository; private MesEquipmentVariableCfgRepository equipmentVariableCfgRepository;
@Autowired
private MesEquipmentChannelRepository equipmentChannelRepository;
@Override @Override
public List<MesCellEquipContext> getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode) { public List<MesCellEquipContext> getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; 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); return equipmentVariableRepository.findByHqlWhere(packBean);
} }
@Override
public List<MesEquipmentChannel> 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});
}
} }

@ -7,11 +7,14 @@ import cn.estsh.i3plus.platform.common.tool.HttpClientTool;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesConfig; 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.MesEquipVariableRwModel;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -67,33 +70,33 @@ public class MesEquipmentRwExtServiceImpl implements IMesEquipVariableRwExtServi
if (!result.getIsSuccessed()) return result; 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<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put(MesPcnExtConstWords.VALUE, equipVariableRwModel.getValue()); 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.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); 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); 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) { 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())) 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())) getRwRequestUrl(equipVariableRwModel);
if (StringUtils.isEmpty(equipVariableRwModel.getWriteRequestUrl()) || StringUtils.isEmpty(equipVariableRwModel.getReadRequestUrl())) 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; if (!result.getIsSuccessed()) return result;
Map<String, String> params = new HashMap<>(); Map<String, String> 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.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); 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); 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));
}
} }

@ -90,7 +90,7 @@ public class MesProductResultReadStepService extends BaseStepService {
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); 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()); execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量 //搜集设备数据变量接口逻辑信息中的二级变量

@ -86,7 +86,7 @@ public class MesReadySignalReadStepService extends BaseStepService {
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); 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()); execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量 //搜集设备数据变量接口逻辑信息中的二级变量

@ -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<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> 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<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> 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<Map<String, MesProdRouteOptParam>> 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<Map<String, MesProdRouteOptParam>> 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;
}
}

@ -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<Map<String, MesProdRouteOptParam>> 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<MesEquipmentVariableCfg> 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<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> 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()));
}
}

@ -18,6 +18,7 @@ import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -138,6 +139,24 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.READY_SIGNAL_CONTEXT); 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 @Override
public MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean) { public MesEquipVariableCollectContext getFirstMouldNoContext(StationRequestBean reqBean) {

@ -95,22 +95,21 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
if (!StringUtils.isEmpty(productionProcessContext.getProcessCode()) && productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) return productionProcessContext; if (!StringUtils.isEmpty(productionProcessContext.getProcessCode()) && productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) return productionProcessContext;
MesProcess process = fsmRouteDataService.doCachedFsmProcessData(reqBean, reqBean.getProcessCode()); MesProcessCraftCfg processCraftCfg = fsmRouteDataService.doCachedFsmProcessCraftData(reqBean, reqBean.getProcessCode());
MesProcessCraftCfg processCraftCfg = fsmRouteDataService.getProcessCraftCfg(reqBean.getOrganizeCode(), 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码 //获取finishCode码
@Override @Override
public MesProductionProcessContext finishCodeContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { public MesProductionProcessContext finishCodeContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
MesConfig config = configService.getMesConfigByCfgCode(MesPcnExtConstWords.CAVITY_FINISH_CODE, reqBean.getOrganizeCode()); List<MesConfig> configList = configService.doCachedConfigList(MesPcnExtConstWords.CAVITY_FINISH_CODE, reqBean.getOrganizeCode());
return productionProcessContext.finishCode((null != config && !StringUtils.isEmpty(config.getCfgValue())) ? config.getCfgValue() : MesPcnExtConstWords.CAVITY_FINISH_CODE); 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); 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())) : 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)); 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())); 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<MesEquipmentVariableCfg> equipmentVariableCfgList, String... variableCategory) {
List<String> variableCategoryList = null == variableCategory ? null : Arrays.asList(variableCategory);
List<MesEquipmentVariableCfg> filterList = (CollectionUtils.isEmpty(equipmentVariableCfgList) || CollectionUtils.isEmpty(variableCategoryList)) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && variableCategoryList.contains(o.getVariableCategory()))).collect(Collectors.toList());
Optional<MesEquipmentVariableCfg> 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 @Override
public List<String> collectCategoryLevelTwoList(List<MesEquipmentVariableCfg> equipmentVariableCfgList) { public List<String> collectCategoryLevelTwoList(List<MesEquipmentVariableCfg> equipmentVariableCfgList) {

@ -1,10 +1,16 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.context; 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 cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import lombok.Data; import lombok.Data;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable; import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* - * -
@ -50,4 +56,32 @@ public class MesCellEquipContext implements Serializable {
@ApiParam("设备质量") @ApiParam("设备质量")
private Integer quality = MesExtEnumUtil.EQUIP_LOG_QUALITY.QUALITY.getValue(); private Integer quality = MesExtEnumUtil.EQUIP_LOG_QUALITY.QUALITY.getValue();
@ApiParam("kepware标识 Map<channel, kepwareFlag>")
private String kepwareFlagJson;
//根据通到获取对应的kepware标识
public String getKepwareFlag(String channel) {
if (StringUtils.isEmpty(channel) || StringUtils.isEmpty(this.kepwareFlagJson)) return null;
Map<String, String> kepwareFlagMap = JSONObject.parseObject(this.kepwareFlagJson, Map.class);
return !CollectionUtils.isEmpty(kepwareFlagMap) ? kepwareFlagMap.get(channel) : null;
}
//赋值kepware标识数据
public MesCellEquipContext kepwareFlagJson(List<MesEquipmentChannel> 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<String, String> 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;
}
} }

@ -32,6 +32,9 @@ public class MesProductionProcessContext implements Serializable {
@ApiParam("信息") @ApiParam("信息")
private String message; private String message;
@ApiParam("是否需要重新存储")
private Boolean isNeedCache;
@ApiParam("组织代码") @ApiParam("组织代码")
private String organizeCode; private String organizeCode;
@ -88,6 +91,7 @@ public class MesProductionProcessContext implements Serializable {
//上下文信息结果初始化 //上下文信息结果初始化
public MesProductionProcessContext success() { public MesProductionProcessContext success() {
this.success = true; this.success = true;
this.isNeedCache = false;
this.message = null; this.message = null;
return this; return this;
} }
@ -98,6 +102,12 @@ public class MesProductionProcessContext implements Serializable {
return this; return this;
} }
//手动赋是否缓存的标志(大部分工步最后都会保存上下文,最终实际根据此标志识别是否需要保存)
public MesProductionProcessContext isNeedCache() {
this.isNeedCache = true;
return this;
}
//上下文信息结果信息赋值后给工步使用 //上下文信息结果信息赋值后给工步使用
public MesProductionProcessContext message(String message) { public MesProductionProcessContext message(String message) {
this.success = false; this.success = false;
@ -110,7 +120,7 @@ public class MesProductionProcessContext implements Serializable {
//上下文赋值finishCode码 //上下文赋值finishCode码
public MesProductionProcessContext finishCode(String finishCode) { public MesProductionProcessContext finishCode(String finishCode) {
this.finishCode = finishCode; this.finishCode = finishCode;
return this; return this.isNeedCache();
} }
@ -124,7 +134,7 @@ public class MesProductionProcessContext implements Serializable {
//上下文赋值生产线对象 //上下文赋值生产线对象
public MesProductionProcessContext workCenterJson(MesWorkCenter workCenter) { public MesProductionProcessContext workCenterJson(MesWorkCenter workCenter) {
this.workCenterJson = null != workCenter ? JSONObject.toJSONString(workCenter) : null; 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) { public MesProductionProcessContext workCellJson(MesWorkCell workCell) {
this.workCellJson = null != workCell ? JSONObject.toJSONString(workCell) : null; 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) { public MesProductionProcessContext processCode(String processCode, String processName) {
this.processCode = processCode; this.processCode = processCode;
this.processName = processName; this.processName = processName;
return this; return this.isNeedCache();
} }
//上下文赋值工艺信息 //上下文赋值工艺信息
public MesProductionProcessContext craftCode(String craftCode, String craftName) { public MesProductionProcessContext craftCode(String craftCode, String craftName) {
this.craftCode = craftCode; this.craftCode = craftCode;
this.craftName = craftName; this.craftName = craftName;
return this; return this.isNeedCache();
} }
//---------------------- 工位设备对象集合 --------------------------------------- //---------------------- 工位设备对象集合 ---------------------------------------
@ -166,7 +176,7 @@ public class MesProductionProcessContext implements Serializable {
//上下文赋值工位设备对象集合 //上下文赋值工位设备对象集合
public MesProductionProcessContext cellEquipListJson(List<MesCellEquipContext> cellEquipList) { public MesProductionProcessContext cellEquipListJson(List<MesCellEquipContext> cellEquipList) {
this.cellEquipListJson = !CollectionUtils.isEmpty(cellEquipList) ? JSONObject.toJSONString(cellEquipList) : null; 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); if (StringUtils.isEmpty(curEquip.getBindQty())) curEquip.setBindQty(MesPcnExtConstWords.ZERO);
this.curCellEquipJson = null != curEquip ? JSONObject.toJSONString(curEquip) : null; 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).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)); 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); 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).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)); 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); this.equipVariableJson = JSONObject.toJSONString(equipmentVariableList);
return this; return this.isNeedCache();
} }
} }

@ -123,8 +123,12 @@ public class MesPcnExtConstWords {
public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE"; public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE";
// 读取失败睡眠毫秒数[工步参数] // 读取失败睡眠毫秒数[工步参数]
public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP"; public static final String READ_FAILURE_SLEEP = "READ_FAILURE_SLEEP";
// 0 // 读取失败睡眠默认毫秒数
public static final Long READ_FAILURE_SLEEP_DEFAULT_TIME = 1000L; 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 PRODUCT_RESULT_CONTEXT = "PRODUCT_RESULT_CONTEXT";
// 上下文: 就绪信号 // 上下文: 就绪信号
public static final String READY_SIGNAL_CONTEXT = "READY_SIGNAL_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"; 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 SCAN_ASSEMBLY_SN_CONTEXT = "SCAN_ASSEMBLY_SN_CONTEXT";
// 上下文: 产品加工规则数据信息 // 上下文: 产品加工规则数据信息
public static final String PROD_RULE_DATA_CONTEXT = "PROD_RULE_DATA_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"; public static final String OUT_PRODUCE_SN_DATA_CONTEXT = "OUT_PRODUCE_SN_DATA_CONTEXT";
// 上下文: 装配件清单 // 上下文: 装配件清单

Loading…
Cancel
Save