Merge remote-tracking branch 'origin/dev' into dev

tags/yfai-pcn-ext-v1.0
LML丶 12 months ago
commit e62bc700f6

@ -74,12 +74,15 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "获取设备数据变量信息")
List<MesEquipmentVariable> findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType);
@ApiOperation(value = "获取设备数据变量信息")
@ApiOperation(value = "根据变量类型与二级变量获取设备数据变量信息")
List<MesEquipmentVariable> findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType, List<String> categoryLevelTwoList);
@ApiOperation(value = "获取设备数据变量信息")
List<MesEquipmentVariable> findEquipmentVariableList(List<MesEquipmentVariable> equipmentVariableList, Integer variableType, List<String> categoryLevelTwoList);
@ApiOperation(value = "验证设备数据变量信息是否为空")
MesProductionProcessContext checkIsEmptyEquipmentVariableList(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE production, List<String> categoryLevelTwoList);
@ApiOperation(value = "发送设备质量信息")
void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext);
@ -105,6 +108,4 @@ public interface IMesProductionProcessContextStepService {
void sendStepContextMessage(StationRequestBean reqBean, List<StationKvBean> resultList);
}

@ -53,6 +53,7 @@ public class MesAssemblyReadStepService extends BaseStepService {
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
@ -66,8 +67,10 @@ public class MesAssemblyReadStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在读取待验证的装配件条码
@ -76,24 +79,30 @@ public class MesAssemblyReadStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[装配件]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]装配件条码相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType()));
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString()));
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -106,6 +115,7 @@ public class MesAssemblyReadStepService extends BaseStepService {
//验证装配件条码的有效性
if (stepResult.isCompleted()) matchAssemblySnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
@ -116,18 +126,21 @@ public class MesAssemblyReadStepService extends BaseStepService {
private StepResult matchAssemblySnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]装配件条码,持续监听中...", cellEquipContext.getEquipmentCode()));
//读取的装配件进行规则匹配
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.ASSEMBLY.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的装配件条码,持续监听中...", cellEquipContext.getEquipmentCode()));
//保存设备当前一轮工序待验证的装配件条码信息
productionProcessContext.assemblySnJson(equipVariableCollectContextList);
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean,
equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);

@ -1,6 +1,7 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -27,6 +28,20 @@ public class MesAssemblyShowStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);

@ -59,6 +59,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
@ -72,8 +73,10 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在头道模具号跟一模多腔信息
@ -82,24 +85,30 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[头道模具号]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]头道模具号相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType()));
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString()));
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -112,6 +121,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
//验证头道模具号的有效性
if (stepResult.isCompleted()) checkFirstMouldNoValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
@ -122,17 +132,21 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
private StepResult checkFirstMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]头道模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
//读取的头道模具号进行规则匹配
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.FIRST_MOULD_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
//默认只需要配置一个点位
String firstMouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean, firstMouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//验证一模多腔信息
@ -153,8 +167,10 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
public List<MesMouldMultiCavity> getMouldMultiCavityList(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, String equipmentCode, String mouldNo, Boolean isFirstMouldNo) {
//从上下文中取出一模多腔信息集合
List<MesMouldMultiCavity> mouldMultiCavityList = productionProcessContext.getMouldCavityList();
//验证一模多腔信息是否跟当前对设备及模具匹配; 根据设备代码,模具号查询一模多腔信息
if (!checkCachedMouldMultiCavityValid(mouldMultiCavityList, equipmentCode, mouldNo)) mouldMultiCavityList = mouldMultiCavityService.getMouldMultiCavityList(reqBean.getOrganizeCode(), equipmentCode, mouldNo);
//配置错误 抛出异常
@ -170,17 +186,22 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
public Map<String, MesPart> getPartDataMap(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, List<MesMouldMultiCavity> mouldMultiCavityList) {
//从上下文中取出零件信息集合
Map<String, MesPart> partDataMap = productionProcessContext.getPartDataMap();
//从一模多腔信息中搜集零件编码并去重
List<String> partNoList = (mouldMultiCavityList.stream().filter(o -> (null != o)).map(MesMouldMultiCavity::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
//验证上下文中取出零件信息集合是否匹配一模多腔信息中搜集零件编码
if (!CollectionUtils.isEmpty(partDataMap) && partDataMap.keySet().containsAll(partNoList) && partNoList.containsAll(partDataMap.keySet())) return partDataMap;
//根据物料编码集合查询物料信息
Map<String, MesPart> finalPartDataMap = partService.getPartMap(reqBean.getOrganizeCode(), partNoList);
//零件信息缺失 抛出异常
List<String> filterList = CollectionUtils.isEmpty(finalPartDataMap) ? null : partNoList.stream().filter(o -> (null != o && !finalPartDataMap.containsKey(o))).collect(Collectors.toList());
//验证错误 抛出异常
if (CollectionUtils.isEmpty(finalPartDataMap) || !CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(finalPartDataMap) ? partNoList.toString() : filterList.toString()));
return finalPartDataMap;
@ -188,9 +209,11 @@ public class MesFirstMouldNoReadStepService extends BaseStepService {
}
public void doCacheMoudleContext(StationRequestBean reqBean, List<MesMouldMultiCavity> mouldMultiCavityList, Boolean isFirstMouldNo) {
//存储展示组件MODULE_CONTENT内容
productionProcessContextStepService.doCacheModuleContext(reqBean, getModuleContextData(reqBean, mouldMultiCavityList, isFirstMouldNo));
}
//封装展示组件MODULE_CONTENT内容
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesMouldMultiCavity> mouldMultiCavityList, Boolean isFirstMouldNo) {
List<List<StationKvBean>> dataList = new ArrayList<>();
mouldMultiCavityList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList,

@ -53,6 +53,7 @@ public class MesMouldNoReadStepService extends BaseStepService {
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
@ -66,8 +67,10 @@ public class MesMouldNoReadStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在模具号跟一模多腔信息
@ -76,24 +79,30 @@ public class MesMouldNoReadStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[模具号]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]模具号相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType()));
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString()));
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -109,6 +118,7 @@ public class MesMouldNoReadStepService extends BaseStepService {
//保存设备当前一轮工序的模具号
if (null != stepResult.getObj()) productionProcessContext.mouldNo((MesEquipVariableCollectContext) stepResult.getObj());
//存储生产过程上下文对象
productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
@ -119,23 +129,29 @@ public class MesMouldNoReadStepService extends BaseStepService {
private StepResult checkMouldNoValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
//读取的模具号进行规则匹配
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.MOULD_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据: 设置常变值 或者 当前没有头道模具号或生产工单信息
if (CollectionUtils.isEmpty(equipVariableCollectContextList) && (equipLogDispatchContext.getNeedNewValue() || (StringUtils.isEmpty(productionProcessContext.getFirstMouldNo()) && StringUtils.isEmpty(productionProcessContext.getWorkOrderDataJson()))))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,持续监听中...", cellEquipContext.getEquipmentCode()));
else if (CollectionUtils.isEmpty(equipVariableCollectContextList))
else if (CollectionUtils.isEmpty(equipVariableCollectContextList)) //非常变值 没有有效的数据 也无需再读
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的模具号,接口逻辑设置只读一次,当前读取模具号直接跳过!", cellEquipContext.getEquipmentCode()));
//默认只需要配置一个点位
String mouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean, mouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//将模具信息放到工步结果对象的中, 工步主方法体会从里面取出
stepResult.obj(equipVariableCollectContextList.get(0));
//判断是否存在头道模具号或生产工单信息
if (!StringUtils.isEmpty(productionProcessContext.getFirstMouldNo()) || !StringUtils.isEmpty(productionProcessContext.getWorkOrderDataJson())) return stepResult;
//磨具号当头道模具号的使用

@ -49,6 +49,7 @@ public class MesProductResultReadStepService extends BaseStepService {
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
@ -62,8 +63,10 @@ public class MesProductResultReadStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在加工结果
@ -72,26 +75,32 @@ public class MesProductResultReadStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[设备加工成功/设备加工失败/零件报废/设备加工可疑]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList,
MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue(),
MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SCRAP.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SUSPICIOUS.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString()));
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -101,8 +110,10 @@ public class MesProductResultReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配加工结果
matchProductResult(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
@ -114,11 +125,14 @@ public class MesProductResultReadStepService extends BaseStepService {
private StepResult matchProductResult(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]加工结果,持续监听中...", cellEquipContext.getEquipmentCode()));
//根据变量类别分组数据
Map<String, List<MesEquipVariableCfgCollectContext>> variableCategoryMap = equipLogDispatchContext.getEquipVariableCfgCollectContextList().stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCfgCollectContext::getVariableCategory));
//根据变量类别分别匹配加工结果
matchVariableCategoryMap(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, variableCategoryMap);
//保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果
@ -134,17 +148,22 @@ public class MesProductResultReadStepService extends BaseStepService {
for (Map.Entry<String, List<MesEquipVariableCfgCollectContext>> entry : variableCategoryMap.entrySet()) {
if (null == entry) continue;
//设备数据变量接口逻辑根据变量类别规则匹配
if (!(Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, entry.getKey(), entry.getValue())) continue;
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey()), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//设备加工失败
if (MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue().equals(entry.getKey()))
return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getDescription()));
//设备加工成功/零件报废/设备加工可疑 均返回true; 零件报废/设备加工可疑标记错误信息
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.obj(entry.getKey()), true, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE,
MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_OK.getValue().equals(entry.getKey()) ? MesPcnEnumUtil.STATION_DATA_TYPE.TEXT : MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT,
String.format("%s!", MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey())));
}
//加工结果匹配失败
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]加工结果的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode()));

@ -53,6 +53,7 @@ public class MesProductSnReadStepService extends BaseStepService {
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
@ -66,8 +67,10 @@ public class MesProductSnReadStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在读取待验证的主条码信息
@ -76,24 +79,30 @@ public class MesProductSnReadStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[主条码]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]主条码相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType()));
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString()));
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -106,6 +115,7 @@ public class MesProductSnReadStepService extends BaseStepService {
//验证主条码的有效性
if (stepResult.isCompleted()) matchProductSnValid(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//存储生产过程上下文对象
productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
@ -116,18 +126,21 @@ public class MesProductSnReadStepService extends BaseStepService {
private StepResult matchProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]主条码,持续监听中...", cellEquipContext.getEquipmentCode()));
//读取的主条码进行规则匹配
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_SN.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//没有有效的数据
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]有效的主条码,持续监听中...", cellEquipContext.getEquipmentCode()));
//保存设备当前一轮工序的待验证的主条码信息
productionProcessContext.productSnJson(equipVariableCollectContextList);
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean,
equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);

@ -45,11 +45,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT); }
//存储生产过程上下文对象【工步根据业务实际情况执行,配置错误等情况无需执行】
@Override
public Boolean doCacheProductionProcessContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesProductionProcessContext.class.getSimpleName(), JSONObject.toJSONString(productionProcessContext));
}
//获取生产过程上下文对象
@Override
public MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean) {
@ -75,11 +77,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取工序工艺信息
@Override
public MesProductionProcessContext processContext(StationRequestBean reqBean) {
return processContext(reqBean, getProductionProcessContext(reqBean));
}
//获取工序工艺信息
@Override
public MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
@ -98,6 +102,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//验证组织模型有效性
@Override
public MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
@ -111,11 +116,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取工位设备集合信息
@Override
public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean) {
return getCellEquipmentList(reqBean, getProductionProcessContext(reqBean));
}
//获取工位设备集合信息
@Override
public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
@ -128,11 +135,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取工位当前设备信息
@Override
public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean) {
return getCurCellEquipment(reqBean, getCellEquipmentList(reqBean));
}
//获取工位当前设备信息
@Override
public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) {
@ -142,11 +151,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取工位当前设备信息
@Override
public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap) {
return getCurCellEquipment(reqBean, getCellEquipmentList(reqBean), stepParamMap);
}
//获取工位当前设备信息
@Override
public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Optional<Map<String, MesProdRouteOptParam>> stepParamMap) {
@ -171,11 +182,13 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取设备数据变量接口逻辑信息
@Override
public MesProductionProcessContext getEquipmentVariableCfgList(StationRequestBean reqBean) {
return getEquipmentVariableCfgList(getCurCellEquipment(reqBean));
}
//获取设备数据变量接口逻辑信息
@Override
public MesProductionProcessContext getEquipmentVariableCfgList(MesProductionProcessContext productionProcessContext) {
@ -197,30 +210,35 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//根据变量类别搜集设备数据变量接口逻辑信息
@Override
public List<MesEquipmentVariableCfg> collectEquipmentVariableCfgList(List<MesEquipmentVariableCfg> equipmentVariableCfgList, String... variableCategory) {
List<String> variableCategoryList = null == variableCategory ? null : Arrays.asList(variableCategory);
return (CollectionUtils.isEmpty(equipmentVariableCfgList) || CollectionUtils.isEmpty(variableCategoryList)) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && variableCategoryList.contains(o.getVariableCategory()))).collect(Collectors.toList());
}
//验证设备数据变量接口逻辑信息中是否存在必要的变量类型信息
@Override
public MesProductionProcessContext checkNecessaryEquipmentVariableCfg(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariableCfg> equipmentVariableCfgList, String... variableCategory) {
List<String> variableCategoryList = null == variableCategory ? null : Arrays.asList(variableCategory);
Optional<MesEquipmentVariableCfg> optional = (CollectionUtils.isEmpty(equipmentVariableCfgList) || CollectionUtils.isEmpty(variableCategoryList)) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && variableCategoryList.contains(o.getVariableCategory()))).findFirst();
return (null != optional && optional.isPresent()) ? productionProcessContext : productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]变量类别%s的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType(), variableCategoryList.toString()));
return (null != optional && optional.isPresent()) ? productionProcessContext : productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]变量类别%s相关的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType(), variableCategoryList.toString()));
}
//搜集设备数据变量接口逻辑信息中的二级变量
@Override
public List<String> collectCategoryLevelTwoList(List<MesEquipmentVariableCfg> equipmentVariableCfgList) {
return CollectionUtils.isEmpty(equipmentVariableCfgList) ? null :
(equipmentVariableCfgList.stream().filter(o -> null != o).map(MesEquipmentVariableCfg::getCategoryLevelTwo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
}
//获取设备数据变量信息
@Override
public MesProductionProcessContext getEquipmentVariableList(StationRequestBean reqBean, Integer variableType) {
return getEquipmentVariableList(getEquipmentVariableCfgList(reqBean), variableType);
}
//获取设备数据变量信息
@Override
public MesProductionProcessContext getEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType) {
@ -240,6 +258,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//获取设备数据变量信息
@Override
public List<MesEquipmentVariable> findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType) {
@ -260,18 +279,28 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//根据变量类型与二级变量获取设备数据变量信息
@Override
public List<MesEquipmentVariable> findEquipmentVariableList(MesProductionProcessContext productionProcessContext, Integer variableType, List<String> categoryLevelTwoList) {
List<MesEquipmentVariable> equipmentVariableList = findEquipmentVariableList(productionProcessContext, variableType);
return findEquipmentVariableList(equipmentVariableList, variableType, categoryLevelTwoList);
}
//获取设备数据变量信息
@Override
public List<MesEquipmentVariable> findEquipmentVariableList(List<MesEquipmentVariable> equipmentVariableList, Integer variableType, List<String> categoryLevelTwoList) {
return (CollectionUtils.isEmpty(equipmentVariableList) || CollectionUtils.isEmpty(categoryLevelTwoList)) ? null :
equipmentVariableList.stream().filter(o -> (null != o && categoryLevelTwoList.contains(o.getCategoryLevelTwo()) && o.getVariableType().compareTo(variableType) == 0)).collect(Collectors.toList());
}
//验证设备数据变量信息是否为空
@Override
public MesProductionProcessContext checkIsEmptyEquipmentVariableList(MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List<MesEquipmentVariable> equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE variableType, List<String> categoryLevelTwoList) {
if (!CollectionUtils.isEmpty(equipmentVariableList)) return productionProcessContext;
return productionProcessContext.message(String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), variableType.getDescription(), categoryLevelTwoList.toString()));
}
//发送设备质量信息
@Override
public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) {
StationResultBean resultBean = new StationResultBean();
@ -281,8 +310,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
this.sendMessage(reqBean, resultBean);
}
//存储展示组件MODULE_CONTENT内容
@Override
public Boolean doCacheModuleContext(StationRequestBean reqBean, List<List<StationKvBean>> dataList) {
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue(), JSONObject.toJSONString(dataList));
@ -294,22 +322,26 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
return StringUtils.isEmpty(moduleContent) ? null : JSONObject.parseObject(moduleContent, new TypeReference<List<List<StationKvBean>>>() {});
}
//存储上个扫描/读取信息
@Override
public Boolean doCacheLastScanContext(StationRequestBean reqBean, List<StationKvBean> dataList) {
return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.LAST_SCAN_INFO, JSONObject.toJSONString(dataList));
}
//获取上个扫描/读取信息
@Override
public List<StationKvBean> getCachedLastScanContext(StationRequestBean reqBean) {
String lastScanContent = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.LAST_SCAN_INFO);
return StringUtils.isEmpty(lastScanContent) ? new ArrayList<>() : JSONObject.parseArray(lastScanContent, StationKvBean.class);
}
//发送工步内容
@Override
public void doSendStepContextMessage(StationRequestBean reqBean) {
sendStepContextMessage(reqBean, getCachedLastScanContext(reqBean));
}
//发送工步内容
@Override
public void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source) {
@ -323,6 +355,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
}
//发送工步内容
@Override
public void sendStepContextMessage(StationRequestBean reqBean, List<StationKvBean> lastScanContext) {
StationResultBean resultBean = new StationResultBean();

@ -21,7 +21,6 @@ import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
@ -48,6 +47,7 @@ public class MesReadySignalReadStepService extends BaseStepService {
@Override
public StepResult init(StationRequestBean reqBean) {
//发送工步内容
productionProcessContextStepService.doSendStepContextMessage(reqBean);
return super.init(reqBean);
@ -61,8 +61,10 @@ public class MesReadySignalReadStepService extends BaseStepService {
StepResult stepResult = StepResult.getSuccessComplete();
//获取工步参数
Optional<Map<String, MesProdRouteOptParam>> stepParamMap = getStepParams(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean, stepParamMap);
//当前工序已存在就绪信号
@ -71,24 +73,30 @@ public class MesReadySignalReadStepService extends BaseStepService {
//获取生产过程上下文对象有异常信息 抛出异常
if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//从上下文的设备数据变量接口逻辑对象集合中取出当前设备信息的逻辑类型对应的接口逻辑对象集合
List<MesEquipmentVariableCfg> equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgListByVct();
//根据变量类别[就绪信号]搜集设备数据变量接口逻辑信息
equipmentVariableCfgList = productionProcessContextStepService.collectEquipmentVariableCfgList(equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue());
//当前工位使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量接口逻辑信息,设备[%s]未配置变量配置类型[%s]就绪信号相关变量类别的数据变量接口逻辑信息!", cellEquipContext.getEquipmentCode(), cellEquipContext.getVariableCfgType()));
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue()).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//搜集设备数据变量接口逻辑信息中的二级变量
List<String> categoryLevelTwoList = productionProcessContextStepService.collectCategoryLevelTwoList(equipmentVariableCfgList);
//根据变量类型与二级变量获取设备数据变量信息
List<MesEquipmentVariable> equipmentVariableList = productionProcessContextStepService.findEquipmentVariableList(productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), categoryLevelTwoList);
//配置错误 抛出异常
if (CollectionUtils.isEmpty(equipmentVariableList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
String.format("请检查设备数据变量信息,根据设备[%s]对应的数据变量接口逻辑信息,未配置变量类型[%s]二级变量%s相关的数据变量信息!", cellEquipContext.getEquipmentCode(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getDescription(), categoryLevelTwoList.toString()));
if (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//获取设备LOG采集数据
MesEquipLogDispatchContext equipLogDispatchContext = equipmentLogExtService.doHandleEquipmentLogList(cellEquipContext, equipmentVariableList, equipmentVariableCfgList);
this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -98,11 +106,13 @@ public class MesReadySignalReadStepService extends BaseStepService {
execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality()));
//匹配就绪信号有效性
matchReadySignal(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
//保存设备当前一轮工序的加工结果: 只保存成功/报废/可疑的结果
if (stepResult.isCompleted()) productionProcessContext.readySignal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
//存储生产过程上下文对象
productionProcessContextStepService.doCacheProductionProcessContext(reqBean, productionProcessContext);
if (!stepResult.isCompleted()) threadSleep(stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
@ -113,15 +123,20 @@ public class MesReadySignalReadStepService extends BaseStepService {
private StepResult matchReadySignal(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
//未采集到数据
if (!equipLogDispatchContext.getIsCollectValue())
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前未读取到设备[%s]就绪信号,持续监听中...", cellEquipContext.getEquipmentCode()));
//匹配就绪信号有效性
Boolean result = (Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
//匹配成功发送工步内容
if (result) productionProcessContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
//匹配成功
if (result) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("已读取到设备[%s]的就绪信号!", cellEquipContext.getEquipmentCode()));
//匹配失败
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("读取设备[%s]就绪信号的数据变量值匹配接口逻辑规则失败,持续监听中...", cellEquipContext.getEquipmentCode()));

@ -349,14 +349,11 @@ public class MesProductionProcessContext {
//从上下文中取出零件信息集合
public Map<String, MesPart> getPartDataMap() {
// Map<String, String> partMap = StringUtils.isEmpty(this.partDataJson) ? null : JSONObject.parseObject(this.partDataJson, Map.class);
// return CollectionUtils.isEmpty(partMap) ? null : partMap.entrySet().stream().filter(o -> null != o).collect(Collectors.toMap(Map.Entry::getKey, o -> JSONObject.parseObject(o.getValue(), MesPart.class)));
return StringUtils.isEmpty(this.partDataJson) ? null : JSONObject.parseObject(this.partDataJson, new TypeReference<Map<String, MesPart>>() {});
}
//上下文赋值零件信息集合
public MesProductionProcessContext partDataJson(Map<String, MesPart> partDataMap) {
// Map<String, String> partDataMap = partMap.entrySet().stream().filter(o -> null != o).collect(Collectors.toMap(Map.Entry::getKey, o -> JSONObject.toJSONString(o.getValue())));
this.partDataJson = !CollectionUtils.isEmpty(partDataMap) ? JSONObject.toJSONString(partDataMap) : null;
return this;
}

Loading…
Cancel
Save