深汕工单

uat-temp-wj-2502060000-chongqing-step
王杰 4 months ago
parent 8080df155a
commit 0b9b1c2e73

@ -1,14 +1,17 @@
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.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesWorkOrderCompleteQtyContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -37,7 +40,8 @@ public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepSer
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService;
@ -64,20 +68,27 @@ public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepSer
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
synchronized (new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).toString().intern()) {
synchronized (new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT).toString().intern()) {
//验证加工单完成数量flag=1【验证】
workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList);
//验证加工单完成数量
List<MesWorkOrderCompleteQtyContext> workOrderCompleteQtyContextList = workOrderCheckCompleteQtyStepService
.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList);
//匹配失败需要清除本次扫描/读取信息
if (!stepResult.isCompleted() && workOrderCheckCompleteQtyStepService.doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList))
return stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO);
reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
//非排序线 保存加工结果工步 execute 方法 使用的是 新事务
((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean);
//验证加工单完成数量flag=2【累加完成数】
workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList);
for (MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext : workOrderCompleteQtyContextList) {
if (null == workOrderCompleteQtyContext) continue;
if (MathOperation.compareTo(workOrderCompleteQtyContext.getCalcCompleteQty(), new Double(MesPcnExtConstWords.ZERO)) == 0) continue;
//保存加工单完成数量
//【isCellNoCalcQty=true代表工位维度的统计,最终不一定会实际累加到工单上】【isCellNoCalcQty=false代表生产线维度的统计】
productionCustomContextStepService.dispatchWorkOrderCompleteQtyCellContext(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), workOrderCompleteQtyContext.getIsCellNoCalcQty(), reqBean, productionPartContextList.get(0), workOrderCompleteQtyContext.getCalcCompleteQty());
}
}

@ -1,8 +1,10 @@
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.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -53,7 +55,7 @@ public class MesProductionDataSaveStepService extends BaseStepService {
LinkedList<String> stepList = !isSort ? noSortStepList : sortStepList;
for (String stepService : stepList) {
if (StringUtils.isEmpty(stepResult)) continue;
if (StringUtils.isEmpty(stepService)) continue;
StepResult innerStepResult = ((IStepService) SpringContextsUtil.getBean(stepService)).executeInState(reqBean);
if (!StringUtils.isEmpty(innerStepResult.getNextTriggerEvent())) stepResult.nextTriggerEvent(innerStepResult.getNextTriggerEvent());
if (!StringUtils.isEmpty(innerStepResult.getStepAfterState())) stepResult.stepAfterState(innerStepResult.getStepAfterState());
@ -63,5 +65,4 @@ public class MesProductionDataSaveStepService extends BaseStepService {
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存加工结果成功!");
}
}

@ -85,6 +85,12 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService {
//保存生产工单数据
doHandleWorkOrderData(reqBean, resultBean, productionPartContextList, productionPsOutContextList);
//【非排序线】WORK_ORDER_COMPLETE_CONTEXT由验证加工单数量后保存加工结果工步[MesProductionDataSaveBeforeLockOrderStepService]标记
// true的情况下赋值 stepAfterState, 当前工步集执行结束后会执行当前工步重写的executeStepAfterState方法
Boolean isNeedDispatchWorkOrderCompleteContext = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT);
if (!isNeedDispatchWorkOrderCompleteContext) reqBean.getDataMap().remove(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT);
else stepResult.stepAfterState(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()));
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存加工单信息成功!");
}
@ -189,5 +195,11 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService {
}
}
//当前工步集完成之后执行当前方法
@Override
public void executeStepAfterState(StationRequestBean reqBean, StepResult stepResult) {
if (!stepResult.isCompleted()) return;
}
}

@ -334,6 +334,8 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
}
//处理工位维度的工单完成数上下文, 有效期三天
//flag查询=1;保存=2
//【isCellNoCalcQty=true代表工位维度的统计,最终不一定会实际累加到工单上】【isCellNoCalcQty=false代表生产线维度的统计】
@Override
public MesWorkOrderCompleteQtyContext dispatchWorkOrderCompleteQtyCellContext(Integer flag, Boolean isCellNoCalcQty, StationRequestBean reqBean, MesProductionPartContext productionPartContext, Double calcCompleteQty) {
String key = getWorkOrderCompleteQtyContextCellKey(reqBean, isCellNoCalcQty, productionPartContext.getWorkOrderNo());

@ -20,6 +20,7 @@ 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;
@ -41,24 +42,23 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService {
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
//flag=1【验证】
//验证加工单完成数量, 验证的前提条件: 每腔均已匹配到加工规则;存在工单;
public void dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, StationResultBean resultBean,
public List<MesWorkOrderCompleteQtyContext> dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, StationResultBean resultBean,
StepResult stepResult, MesProductionProcessContext productionProcessContext,
List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//是否存在产成零件信息
if (!stepResult.isCompleted() || CollectionUtils.isEmpty(productionPartContextList)) return;
if (!stepResult.isCompleted() || CollectionUtils.isEmpty(productionPartContextList)) return null;
//根据产出零件或者腔数拿到需要的加工规则数量, 优先使用产出零件数量
Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : productionProcessContext.getCurCellEquip().getCavity();
//验证是否满足腔数
if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() < needQty) return;
if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() < needQty) return null;
//对MesProductionPartContext中的工单号经行分组每个工单可能对应多条数据, 筛选掉foreignkey为空的数据
Map<String, List<MesProductionPartContext>> productionPartContextMap = productionPartContextList.stream().filter(o ->
(!StringUtils.isEmpty(o.getWorkOrderNo()) && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo));
if (CollectionUtils.isEmpty(productionPartContextMap)) return;
if (CollectionUtils.isEmpty(productionPartContextMap)) return null;
//根据foreignkey分组进料零件条码
Map<Integer, MesProductionPsInContext> productionPsInContextMap = CollectionUtils.isEmpty(productionPsInContextList) ? null :
@ -71,20 +71,32 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService {
Boolean isCellNoCalcQty = isCellNoCalcQty(workCell.getNoCalcOrderQty());
//遍历验证加工单完成数量
List<MesWorkOrderCompleteQtyContext> workOrderCompleteQtyContextList = null;
for (Map.Entry<String, List<MesProductionPartContext>> entry : productionPartContextMap.entrySet()) {
if (null == entry) continue;
//验证加工单完成数量
dispatchWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, isCellNoCalcQty, entry.getValue(), productionPsInContextMap);
MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext = dispatchWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, isCellNoCalcQty, entry.getValue(), productionPsInContextMap);
//验证失败直接退出
if (!stepResult.isCompleted()) break;
if (null != workOrderCompleteQtyContext) {
if (CollectionUtils.isEmpty(workOrderCompleteQtyContextList)) workOrderCompleteQtyContextList = new ArrayList<>();
workOrderCompleteQtyContextList.add(workOrderCompleteQtyContext);
}
}
//验证失败标记删除标志
if (!stepResult.isCompleted()) {
productionPartContextList.forEach(o -> o.busiCheckToDelete());
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList.forEach(o -> o.busiCheckToDelete());
if (!CollectionUtils.isEmpty(workOrderCompleteQtyContextList)) workOrderCompleteQtyContextList.clear();
}
return workOrderCompleteQtyContextList;
}
//验证加工单完成数量
@ -101,14 +113,23 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService {
if (isCalcCompleteQty) calcCompleteQty = MathOperation.add(calcCompleteQty, new Double(MesPcnExtConstWords.ONE));
}
//当前工单无须计算工单完成数
if (MathOperation.compareTo(calcCompleteQty, new Double(MesPcnExtConstWords.ZERO)) == 0) return;
if (MathOperation.compareTo(calcCompleteQty, new Double(MesPcnExtConstWords.ZERO)) == 0) return null;
//处理工位维度的工单完成数上下文
//处理工位维度的工单完成数上下文;
//flag查询=1;保存=2
//【isCellNoCalcQty=true代表工位维度的统计,最终不一定会实际累加到工单上】【isCellNoCalcQty=false代表生产线维度的统计】
MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext = productionCustomContextStepService.dispatchWorkOrderCompleteQtyCellContext(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), isCellNoCalcQty, reqBean, productionPartContextList.get(0), calcCompleteQty);
//验证工单完成数
checkWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, workOrderCompleteQtyContext, calcCompleteQty);
if (!stepResult.isCompleted()) return null;
//标记累加数量
workOrderCompleteQtyContext.calcCompleteQty(calcCompleteQty, isCellNoCalcQty);
return workOrderCompleteQtyContext;
}
//工位是否不累计工单完成数

@ -24,6 +24,12 @@ public class MesWorkOrderCompleteQtyContext implements Serializable {
@ApiParam("完成数量")
private Double completeQty;
@ApiParam("累加数量")
private Double calcCompleteQty = new Double(MesPcnExtConstWords.ZERO);
@ApiParam(name = "是否不累计工单完成数")
private Boolean isCellNoCalcQty;
public MesWorkOrderCompleteQtyContext(String workOrderNo, Double qty, Double completeQty) {
this.workOrderNo = workOrderNo;
this.qty = qty;
@ -34,4 +40,10 @@ public class MesWorkOrderCompleteQtyContext implements Serializable {
this.completeQty = completeQty;
return this;
}
public MesWorkOrderCompleteQtyContext calcCompleteQty(Double calcCompleteQty, Boolean isCellNoCalcQty) {
this.calcCompleteQty = calcCompleteQty;
this.isCellNoCalcQty = isCellNoCalcQty;
return this;
}
}

Loading…
Cancel
Save