forked from I3-YF/i3plus-mes-pcn-yfai
step
parent
1374383614
commit
d2a1b018d4
@ -0,0 +1,17 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface IMesWorkOrderExtService {
|
||||||
|
|
||||||
|
@ApiOperation(value = "根据生产工单号集合 查询生产工单数据")
|
||||||
|
List<MesWorkOrder> getWorkOrderList(String organizeCode, List<String> workOrderNoList);
|
||||||
|
|
||||||
|
@ApiOperation(value = "根据生产工单号集合 查询生产工单数据")
|
||||||
|
Map<String, MesWorkOrder> getWorkOrderMap(String organizeCode, List<String> workOrderNoList);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
||||||
|
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class MesWorkOrderExtService implements IMesWorkOrderExtService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MesWorkOrderRepository workOrderRepository;
|
||||||
|
|
||||||
|
//根据生产工单号集合 查询生产工单数据
|
||||||
|
@Override
|
||||||
|
public List<MesWorkOrder> getWorkOrderList(String organizeCode, List<String> workOrderNoList) {
|
||||||
|
|
||||||
|
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(workOrderNoList)) return null;
|
||||||
|
|
||||||
|
workOrderNoList = workOrderNoList.size() == 1 ? workOrderNoList : workOrderNoList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
|
||||||
|
|
||||||
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||||
|
if (workOrderNoList.size() == 1) DdlPreparedPack.getStringEqualPack(workOrderNoList.get(0), MesPcnExtConstWords.WORK_ORDER_NO, packBean);
|
||||||
|
else DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
|
||||||
|
|
||||||
|
return workOrderRepository.findByHqlWhere(packBean);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//根据生产工单号集合 查询生产工单数据
|
||||||
|
@Override
|
||||||
|
public Map<String, MesWorkOrder> getWorkOrderMap(String organizeCode, List<String> workOrderNoList) {
|
||||||
|
|
||||||
|
List<MesWorkOrder> workOrderList = getWorkOrderList(organizeCode, workOrderNoList);
|
||||||
|
|
||||||
|
return CollectionUtils.isEmpty(workOrderList) ? null : workOrderList.stream().filter(o -> null != o).collect(Collectors.toMap(MesWorkOrder::getWorkOrderNo, o -> o));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,207 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IPartService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
|
||||||
|
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
|
||||||
|
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.MesPart;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 读产出零件号工步
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesProductionPartNoReadStepService")
|
||||||
|
public class MesProductionPartNoReadStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesEquipmentLogExtService equipmentLogExtService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IPartService partService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult init(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
|
||||||
|
|
||||||
|
return super.init(reqBean);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 (productionDispatchContextStepService.checkProductionPartNoIsExistContext(reqBean) && productionDispatchContextStepService.checkProductionPartIsExistContext(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.PRODUCTION_PART_NO.getValue());
|
||||||
|
|
||||||
|
//当前工位使用的设备
|
||||||
|
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
|
||||||
|
|
||||||
|
//配置错误 抛出异常
|
||||||
|
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCTION_PART_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 (!productionProcessContextStepService.checkIsEmptyEquipmentVariableList(productionProcessContext, cellEquipContext, equipmentVariableList, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION, categoryLevelTwoList).getSuccess())
|
||||||
|
execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//获取设备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);
|
||||||
|
|
||||||
|
//验证设备通信质量
|
||||||
|
productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
|
||||||
|
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
|
||||||
|
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()));
|
||||||
|
|
||||||
|
//验证产出零件号的有效性
|
||||||
|
return checkProductionPartNoValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证产出零件号的有效性
|
||||||
|
private StepResult checkProductionPartNoValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
|
||||||
|
|
||||||
|
//未采集到数据
|
||||||
|
if (!equipLogDispatchContext.getIsCollectValue())
|
||||||
|
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean, stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]产出零件号,持续监听中...", cellEquipContext.getEquipmentCode())),
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||||
|
|
||||||
|
//读取的产出零件号进行规则匹配
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCTION_PART_NO.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
|
||||||
|
|
||||||
|
//没有有效的数据
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
|
||||||
|
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的头道模具号,持续监听中...", cellEquipContext.getEquipmentCode())),
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
|
||||||
|
|
||||||
|
//获取产出零件信息 获取零件信息
|
||||||
|
List<MesProductionPartContext> productionPartContextList = getProductionPartContext(reqBean, resultBean, productionProcessContext, equipVariableCollectContextList);
|
||||||
|
|
||||||
|
//更新展示组件MODULE_CONTENT内容
|
||||||
|
doCacheMoudleContext(reqBean, productionPartContextList);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]产出零件号[%s]!", cellEquipContext.getEquipmentCode(), scanInfo));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MesProductionPartContext> getProductionPartContext(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
|
||||||
|
|
||||||
|
//从上下文中取出零件信息集合
|
||||||
|
Map<String, MesPart> partDataMap = productionDispatchContextStepService.getPartDataContext(reqBean);
|
||||||
|
|
||||||
|
//从读取信息中搜集零件编码并去重
|
||||||
|
List<String> partNoList = (equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).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()))) partDataMap = partService.getPartMap(reqBean.getOrganizeCode(), partNoList);
|
||||||
|
|
||||||
|
//零件信息缺失 抛出异常
|
||||||
|
List<MesProductionPartContext> productionPartContextList = getProductionPartContext(reqBean, resultBean, partNoList, partDataMap, equipVariableCollectContextList);
|
||||||
|
|
||||||
|
//保存设备当前一轮工序的产出零件号,产出零件信息,零件信息
|
||||||
|
productionDispatchContextStepService.saveProductionPartNoContext(reqBean, equipVariableCollectContextList);
|
||||||
|
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
|
||||||
|
productionDispatchContextStepService.savePartDataContext(reqBean, partDataMap);
|
||||||
|
|
||||||
|
return productionPartContextList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MesProductionPartContext> getProductionPartContext(StationRequestBean reqBean, StationResultBean resultBean, List<String> partNoList, Map<String, MesPart> partDataMap, List<MesEquipVariableCollectContext> equipVariableCollectContextList) {
|
||||||
|
List<String> filterList = CollectionUtils.isEmpty(partDataMap) ? null : partNoList.stream().filter(o -> (null != o && !partDataMap.containsKey(o))).collect(Collectors.toList());
|
||||||
|
|
||||||
|
//验证错误 抛出异常
|
||||||
|
if (CollectionUtils.isEmpty(partDataMap) || !CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(partDataMap) ? partNoList.toString() : filterList.toString()));
|
||||||
|
|
||||||
|
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
|
||||||
|
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(new MesProductionPartContext().copyPartNo(reqBean.getOrganizeCode(), o.getEquipVariableValue(), partDataMap.get(o.getEquipVariableValue()).getPartName())));
|
||||||
|
|
||||||
|
return productionPartContextList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doCacheMoudleContext(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
|
||||||
|
//存储展示组件MODULE_CONTENT内容
|
||||||
|
productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList));
|
||||||
|
}
|
||||||
|
|
||||||
|
//封装展示组件MODULE_CONTENT内容
|
||||||
|
private List<List<StationKvBean>> getModuleContextData(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList) {
|
||||||
|
List<List<StationKvBean>> dataList = new ArrayList<>();
|
||||||
|
productionPartContextList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnConstWords.PART_NAME, "零件名称", o.getPartName())));
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,129 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
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.api.busi.IMesWorkOrderExtService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
|
||||||
|
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 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.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 加工单验证工步【非排序】
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesWorkOrderCheckNosortStepService")
|
||||||
|
public class MesWorkOrderCheckNosortStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesWorkOrderExtService workOrderExtService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//配置错误 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//获取上下文生产扫/读信息:加工单
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "上下文中缺失待验证的加工单信息!");
|
||||||
|
|
||||||
|
//获取上下文产出零件信息
|
||||||
|
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
||||||
|
|
||||||
|
//清除本次已获取得到的加工单信息
|
||||||
|
productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean);
|
||||||
|
|
||||||
|
//非扫描场景 清除历史产出零件信息
|
||||||
|
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean);
|
||||||
|
|
||||||
|
//验证工单的有效性
|
||||||
|
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
|
||||||
|
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
|
||||||
|
|
||||||
|
//扫描场景下合并历史产出零件信息
|
||||||
|
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
|
||||||
|
|
||||||
|
//保存上下文产出零件信息
|
||||||
|
productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList);
|
||||||
|
|
||||||
|
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString()));
|
||||||
|
|
||||||
|
//当前工位使用的设备
|
||||||
|
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
|
||||||
|
|
||||||
|
if (cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0)
|
||||||
|
return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false,
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!",
|
||||||
|
equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size()));
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息加工单[%s]验证工单状态成功,上下文中的加工单个数[%s]已满足腔数!", equipVariableCollectContextList.get(0).getEquipVariableValue(), productionPartContextList.size()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//验证工单的有效性
|
||||||
|
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
|
||||||
|
MesProductionProcessContext productionProcessContext, List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList) {
|
||||||
|
|
||||||
|
//搜集生产工单号
|
||||||
|
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
|
||||||
|
List<String> workOrderNoList = filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
|
||||||
|
|
||||||
|
//获取生产工单信息
|
||||||
|
Map<String, MesWorkOrder> workOrderMap = workOrderExtService.getWorkOrderMap(reqBean.getOrganizeCode(), workOrderNoList);
|
||||||
|
|
||||||
|
for (String workOrderNo : workOrderNoList) {
|
||||||
|
|
||||||
|
if (StringUtils.isEmpty(workOrderNo)) continue;
|
||||||
|
|
||||||
|
MesWorkOrder workOrderDb = (CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(workOrderNo)) ? null : workOrderMap.get(workOrderNo);
|
||||||
|
if (null == workOrderDb) return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo));
|
||||||
|
|
||||||
|
if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workOrderDb.getWorkOrderStatus())) return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus())));
|
||||||
|
|
||||||
|
if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add(new MesProductionPartContext().copyPartNo(workOrderMap.get(o.getEquipVariableValue()))));
|
||||||
|
|
||||||
|
return stepResult.obj(filterList);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
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.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
|
||||||
|
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 cn.estsh.impp.framework.boot.util.SpringContextsUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 加工单验证工步
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesWorkOrderCheckStepService")
|
||||||
|
public class MesWorkOrderCheckStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//配置错误 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//从上下文中取出生产线对象
|
||||||
|
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
|
||||||
|
|
||||||
|
//排序线 加工单验证工步
|
||||||
|
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).execute(reqBean);
|
||||||
|
|
||||||
|
//非排序线 加工单验证工步
|
||||||
|
return ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckNosortStepService")).execute(reqBean);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,149 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.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.MesEquipLogDispatchContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StepResult;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 读取加工单工步
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesWorkOrderReadStepService")
|
||||||
|
public class MesWorkOrderReadStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesEquipmentLogExtService equipmentLogExtService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesEquipVariableCfgRuleMatchDispatchService equipVariableCfgRuleMatchService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult init(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
|
||||||
|
|
||||||
|
return super.init(reqBean);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 (productionDispatchContextStepService.checkScanWorkOrderNoIsExistContext(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.WORK_ORDER.getValue());
|
||||||
|
|
||||||
|
//当前工位使用的设备
|
||||||
|
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
|
||||||
|
|
||||||
|
//配置错误 抛出异常
|
||||||
|
if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(productionProcessContext, cellEquipContext, equipmentVariableCfgList, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.WORK_ORDER.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());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//获取设备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);
|
||||||
|
|
||||||
|
//验证设备通信质量
|
||||||
|
productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext);
|
||||||
|
if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality()))
|
||||||
|
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()));
|
||||||
|
|
||||||
|
//匹配读取的加工单的有效性
|
||||||
|
return matchWorkOrderValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipLogDispatchContext);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//匹配读取的加工单的有效性
|
||||||
|
private StepResult matchWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, Optional<Map<String, MesProdRouteOptParam>> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesEquipLogDispatchContext equipLogDispatchContext) {
|
||||||
|
|
||||||
|
//未采集到数据
|
||||||
|
if (!equipLogDispatchContext.getIsCollectValue())
|
||||||
|
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean, stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]加工单,持续监听中...", cellEquipContext.getEquipmentCode())),
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||||
|
|
||||||
|
//读取的加工单进行规则匹配
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = (List<MesEquipVariableCollectContext>) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.WORK_ORDER.getValue(), equipLogDispatchContext.getEquipVariableCfgCollectContextList());
|
||||||
|
|
||||||
|
//没有有效的数据
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList))
|
||||||
|
execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前未读取到设备[%s]有效的加工单,持续监听中...", cellEquipContext.getEquipmentCode())),
|
||||||
|
MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||||
|
|
||||||
|
//保存设备当前一轮工序的待验证的加工单信息
|
||||||
|
productionDispatchContextStepService.saveScanWorkOrderNoContext(reqBean, equipVariableCollectContextList);
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]加工单信息[%s]!", cellEquipContext.getEquipmentCode(), scanInfo));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,127 @@
|
|||||||
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||||
|
|
||||||
|
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.MesEquipVariableCollectContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||||
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||||
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||||
|
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
||||||
|
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
|
||||||
|
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 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.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description : 扫描加工单工步
|
||||||
|
* @Author : wangjie
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
@Service("mesWorkOrderScanStepService")
|
||||||
|
public class MesWorkOrderScanStepService extends BaseStepService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult guide(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描加工单!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StepResult execute(StationRequestBean reqBean) {
|
||||||
|
|
||||||
|
StationResultBean resultBean = new StationResultBean();
|
||||||
|
|
||||||
|
StepResult stepResult = StepResult.getSuccessComplete();
|
||||||
|
|
||||||
|
//扫描信息置空
|
||||||
|
String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo());
|
||||||
|
|
||||||
|
//获取上下文信息
|
||||||
|
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean);
|
||||||
|
|
||||||
|
//获取生产过程上下文对象有异常信息 抛出异常
|
||||||
|
if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||||
|
|
||||||
|
//存储生产过程上下文对象
|
||||||
|
productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext);
|
||||||
|
|
||||||
|
//当前工位使用的设备
|
||||||
|
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
|
||||||
|
|
||||||
|
//如果没有扫描信息, 取手选工单信息, 封装扫/读信息:加工单信息
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList;
|
||||||
|
if (!StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult, scanInfo);
|
||||||
|
else equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, stepResult);
|
||||||
|
|
||||||
|
//扫描信息为空
|
||||||
|
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描加工单!");
|
||||||
|
|
||||||
|
//保存上下文扫/读信息:加工单
|
||||||
|
productionDispatchContextStepService.saveScanWorkOrderNoContext(reqBean, equipVariableCollectContextList);
|
||||||
|
|
||||||
|
return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//封装扫/读信息:加工单信息 (扫描)
|
||||||
|
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult, String scanInfo) {
|
||||||
|
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
|
||||||
|
|
||||||
|
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()));
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN);
|
||||||
|
|
||||||
|
stepResult.msg(String.format("当前扫描信息加工单[%s]!", scanInfo));
|
||||||
|
|
||||||
|
return equipVariableCollectContextList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//封装扫/读信息:加工单信息 (选择)
|
||||||
|
private List<MesEquipVariableCollectContext> doHandleScanProductSnContext(StationRequestBean reqBean, StepResult stepResult) {
|
||||||
|
|
||||||
|
List<StationKvBean> chooseCavityOrder = productionDispatchContextStepService.getFunctionChooseCavityOrderContext(reqBean);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(chooseCavityOrder)) return null;
|
||||||
|
|
||||||
|
List<String> pickList = new ArrayList<>(Arrays.asList(chooseCavityOrder.stream().filter(o -> (null != o && o.getKey().equals(MesPcnExtConstWords.WORK_ORDER_NO))).findFirst().get().getValue().split(MesPcnExtConstWords.SEMICOLON)));
|
||||||
|
|
||||||
|
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
|
||||||
|
|
||||||
|
pickList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK.getValue())));
|
||||||
|
|
||||||
|
//发送工步内容
|
||||||
|
String scanInfo = chooseCavityOrder.stream().filter(o -> null != o).map(o -> o.getName() + "[" + o.getValue() + "]").collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON));
|
||||||
|
productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK);
|
||||||
|
|
||||||
|
stepResult.msg(String.format("当前选择信息%s!", scanInfo));
|
||||||
|
|
||||||
|
return equipVariableCollectContextList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue