forked from I3-YF/i3plus-mes-pcn-yfai
排序推单
parent
96e5b5ca58
commit
933eef1adb
@ -0,0 +1,22 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
|
||||
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IMesQueueOrderPushService {
|
||||
|
||||
//递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30
|
||||
@ApiOperation(value = "获取当前工单对应的工位推单队列中最大的顺序号")
|
||||
Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo);
|
||||
|
||||
@ApiOperation(value = "写入工位工单推送信息")
|
||||
void insertQueueOrderPush(String organizeCode, String userInfo, MesProduceSn produceSn, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList);
|
||||
|
||||
@ApiOperation(value = "根据配置查询生产队列工位推送信息")
|
||||
List<MesQueueOrderPush> getQueueOrderPushList(String organizeCode, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList, Integer count);
|
||||
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
||||
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
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.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class MesQueueOrderPushService implements IMesQueueOrderPushService {
|
||||
|
||||
@Autowired
|
||||
private MesQueueOrderPushRepository queueOrderPushRepository;
|
||||
|
||||
//获取当前工单对应的工位推单队列中最大的顺序号; 递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30
|
||||
@Override
|
||||
public Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo) {
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return MesPcnExtConstWords.TEN;
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||
DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
|
||||
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PROCESS_SEQ}, packBean);
|
||||
MesQueueOrderPush queueOrderPushDb2MaxSeq = queueOrderPushRepository.getByProperty(packBean);
|
||||
return ((null == queueOrderPushDb2MaxSeq || queueOrderPushDb2MaxSeq.getProcessSeq().compareTo(MesPcnExtConstWords.ZERO) == 0)
|
||||
? MesPcnExtConstWords.ONE : (queueOrderPushDb2MaxSeq.getProcessSeq() / MesPcnExtConstWords.TEN + 1)
|
||||
) * MesPcnExtConstWords.TEN;
|
||||
}
|
||||
|
||||
//写入工位工单推送信息
|
||||
@Override
|
||||
public void insertQueueOrderPush(String organizeCode, String userInfo, MesProduceSn produceSn, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList) {
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(userInfo) || null == produceSn || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return;
|
||||
Integer processSeq = getQueueOrderPushMaxSeq(organizeCode, produceSn.getWorkOrderNo());
|
||||
for (MesQueueOrderPushCellCfg queueOrderPushCellCfg : queueOrderPushCellCfgList) {
|
||||
if (null == queueOrderPushCellCfg) continue;
|
||||
MesQueueOrderPush queueOrderPush = new MesQueueOrderPush();
|
||||
queueOrderPush.setPushSourceCode(queueOrderPushCellCfg.getPushSourceCode());
|
||||
queueOrderPush.setWorkOrderNo(produceSn.getWorkOrderNo());
|
||||
queueOrderPush.setProductSn(produceSn.getProductSn());
|
||||
queueOrderPush.setCustSn(produceSn.getCustSn());
|
||||
queueOrderPush.setProcessSeq(processSeq);
|
||||
queueOrderPush.setQueueStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue());
|
||||
queueOrderPush.setAreaCode(queueOrderPushCellCfg.getAreaCode());
|
||||
queueOrderPush.setWorkCenterCode(queueOrderPushCellCfg.getWorkCenterCode());
|
||||
queueOrderPush.setSourceWorkCellCode(queueOrderPushCellCfg.getWorkCellCode());
|
||||
queueOrderPush.setOrganizeCode(organizeCode);
|
||||
ConvertBean.serviceModelInitialize(queueOrderPush, userInfo);
|
||||
queueOrderPushRepository.insert(queueOrderPush);
|
||||
}
|
||||
}
|
||||
|
||||
//根据配置查询生产队列工位推送信息
|
||||
@Override
|
||||
public List<MesQueueOrderPush> getQueueOrderPushList(String organizeCode, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList, Integer count) {
|
||||
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return null;
|
||||
|
||||
//搜集推送来源代码 去重
|
||||
List<String> pushSourceCodeList = (queueOrderPushCellCfgList.stream()
|
||||
.filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList())
|
||||
).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(pushSourceCodeList)) return null;
|
||||
|
||||
//根据生产线代码,推送来源代码集合查询创建状态的生产队列工位推送信息【创建时间正序】
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||
DdlPreparedPack.getStringEqualPack(queueOrderPushCellCfgList.get(0).getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
|
||||
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue(), MesPcnExtConstWords.QUEUE_STATUS, packBean);
|
||||
if (pushSourceCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pushSourceCodeList.get(0), MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean);
|
||||
else DdlPreparedPack.getInPackList(pushSourceCodeList, MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean);
|
||||
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
|
||||
return queueOrderPushRepository.findByHqlTopWhere(packBean, count);
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,116 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
|
||||
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.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
|
||||
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
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.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
/**
|
||||
* @Description : 工位工单接收工步
|
||||
* @Author : wangjie
|
||||
**/
|
||||
@Slf4j
|
||||
@Service("mesWorkOrderQueueAcceptStepService")
|
||||
public class MesWorkOrderQueueAcceptStepService extends BaseStepService {
|
||||
|
||||
@Autowired
|
||||
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionCustomContextStepService productionCustomContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesQueueOrderPushService queueOrderPushService;
|
||||
|
||||
@Autowired
|
||||
private IFsmCommonService fsmCommonService;
|
||||
|
||||
protected static Map<String, ReentrantLock> queueAcceptLockMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public StepResult init(StationRequestBean reqBean) {
|
||||
|
||||
StepResult stepResult = StepResult.getSuccessComplete();
|
||||
|
||||
String endlessLoopReadTimes = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES);
|
||||
if (StringUtils.isEmpty(endlessLoopReadTimes)) endlessLoopReadTimes = MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES_DEFAULT;
|
||||
if (productionDispatchContextStepService.dispatchOverEndlessLoopReadTimes(reqBean, endlessLoopReadTimes)) {
|
||||
stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, new StationResultBean().isWs(false),
|
||||
stepResult.isCompleted(false).msg(String.format("当前未获取到工位工单队列超过[%s]次!", endlessLoopReadTimes)),
|
||||
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||
}
|
||||
|
||||
//发送工步内容
|
||||
productionCustomContextStepService.sendStepContextMessage(reqBean);
|
||||
|
||||
return stepResult;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public StepResult execute(StationRequestBean reqBean) {
|
||||
|
||||
StationResultBean resultBean = new StationResultBean();
|
||||
|
||||
StepResult stepResult = StepResult.getSuccessComplete();
|
||||
|
||||
//获取上下文信息
|
||||
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
|
||||
|
||||
//配置错误 抛出异常
|
||||
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||
|
||||
//存储生产过程上下文对象
|
||||
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
|
||||
|
||||
//处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】
|
||||
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue());
|
||||
if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
|
||||
String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getDescription()));
|
||||
|
||||
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
|
||||
|
||||
//根据配置查询生产队列工位推送信息
|
||||
List<MesQueueOrderPush> queueOrderPushList = queueOrderPushService.getQueueOrderPushList(reqBean.getOrganizeCode(), queueOrderPushCellCfgList, cellEquipContext.getCavity());
|
||||
if (CollectionUtils.isEmpty(queueOrderPushList) || queueOrderPushList.size() != cellEquipContext.getCavity()) {
|
||||
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
|
||||
false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
|
||||
CollectionUtils.isEmpty(queueOrderPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", queueOrderPushList.size(), cellEquipContext.getCavity()),
|
||||
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "工位工单接收成功!");
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
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.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
|
||||
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
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 java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description : 工位工单推送工步
|
||||
* @Author : wangjie
|
||||
**/
|
||||
@Slf4j
|
||||
@Service("mesWorkOrderQueuePushStepService")
|
||||
public class MesWorkOrderQueuePushStepService extends BaseStepService {
|
||||
|
||||
@Autowired
|
||||
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesQueueOrderPushService queueOrderPushService;
|
||||
|
||||
@Override
|
||||
public StepResult execute(StationRequestBean reqBean) {
|
||||
|
||||
StationResultBean resultBean = new StationResultBean();
|
||||
|
||||
StepResult stepResult = StepResult.getSuccessComplete();
|
||||
|
||||
//获取上下文信息
|
||||
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
|
||||
|
||||
//配置错误 抛出异常
|
||||
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||
|
||||
//存储生产过程上下文对象
|
||||
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
|
||||
|
||||
//处理排序线推单配置上下文, 返回推送工位类型对应的配置信息 【来源工位】
|
||||
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getValue());
|
||||
if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) {
|
||||
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()),
|
||||
stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
|
||||
String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息,当前跳过工位工单推送!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getDescription()));
|
||||
}
|
||||
|
||||
//获取上下文产出条码数据信息集合
|
||||
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
|
||||
if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!");
|
||||
|
||||
//写入工位工单推送信息
|
||||
productionPsOutContextList.stream().forEach(o -> queueOrderPushService.insertQueueOrderPush(reqBean.getOrganizeCode(), reqBean.getUserInfo(), o, queueOrderPushCellCfgList));
|
||||
|
||||
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- ORDER:{} --- PUSH_SOURCE_CODE:{}",
|
||||
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()),
|
||||
productionPsOutContextList.stream().filter(o -> null != o).map(MesProductionPsOutContext::getWorkOrderNo).collect(Collectors.toList()).toString(),
|
||||
queueOrderPushCellCfgList.stream().filter(o -> null != o).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()).toString());
|
||||
|
||||
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "工位工单推送成功!");
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue