|
|
|
@ -8,13 +8,11 @@ import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
|
|
|
|
|
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
|
|
|
|
import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil;
|
|
|
|
|
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.tool.MathOperation;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
|
|
|
@ -107,10 +105,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
|
|
|
|
|
doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
|
|
|
|
|
|
|
|
|
|
//验证加工单完成数量, 验证的前提条件: 每腔均已匹配到加工规则
|
|
|
|
|
workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList);
|
|
|
|
|
workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList);
|
|
|
|
|
|
|
|
|
|
//匹配失败需要清除本次扫描/读取信息
|
|
|
|
|
if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList))
|
|
|
|
|
if (!stepResult.isCompleted() && workOrderCheckCompleteQtyStepService.doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList))
|
|
|
|
|
return stepResult.nextTriggerEvent(CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO : (!StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO : MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN));
|
|
|
|
|
|
|
|
|
|
if (prodRuleContextList.size() != initSize) {
|
|
|
|
@ -200,75 +198,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
|
|
|
|
|
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPartContext), JSONObject.toJSONString(prodRuleContext));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// 默认头道才有超工单
|
|
|
|
|
validSuperWorkOrder(reqBean, productionPartContextList, null, workCenter, stepResult, resultBean);
|
|
|
|
|
|
|
|
|
|
return stepResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 1 遍历 MesProductionPartContext 对工单号分组
|
|
|
|
|
* 2 不同的单号,查询对应的工单数量和完成数量,进行对比
|
|
|
|
|
* 3 是否超报工和报工比例,
|
|
|
|
|
* @param reqBean
|
|
|
|
|
* @param productionPartContextList
|
|
|
|
|
* @param workCenter
|
|
|
|
|
* @param stepResult
|
|
|
|
|
* @param resultBean
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private StepResult validSuperWorkOrder(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList, MesWorkCenter workCenter, StepResult stepResult, StationResultBean resultBean) {
|
|
|
|
|
// 验证超工单
|
|
|
|
|
log.info("验证是否超工单begin ->");
|
|
|
|
|
|
|
|
|
|
//判断是否还存在待匹配的主条码信息, 内部循环匹配成功会标记 foreignKey
|
|
|
|
|
Optional<MesProductionPartContext> optional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst();
|
|
|
|
|
if (null == optional || !optional.isPresent()) return stepResult;
|
|
|
|
|
|
|
|
|
|
// 对MesProductionPartContext中的工单号经行分组,每个工单可能对应多条数据,筛选掉foreignkey为空的数据
|
|
|
|
|
Map<String, List<MesProductionPartContext>> productionPartContextMap = productionPartContextList.stream().filter(productionPartContext -> !StringUtils.isEmpty(productionPartContext.getForeignKey()))
|
|
|
|
|
.collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo));
|
|
|
|
|
// 获取涉及到的所有工单列表
|
|
|
|
|
List<MesWorkOrder> workOrderList = workOrderExtService.getWorkOrderList(reqBean.getOrganizeCode(), new ArrayList<>(productionPartContextMap.keySet()));
|
|
|
|
|
|
|
|
|
|
// 对工单经行分组
|
|
|
|
|
Map<String, List<MesWorkOrder>> orderListMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo));
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<MesProductionPartContext>> entry : productionPartContextMap.entrySet()) {
|
|
|
|
|
String workOrder = entry.getKey();
|
|
|
|
|
List<MesProductionPartContext> productionPartContexts = entry.getValue();
|
|
|
|
|
MesWorkOrder mesWorkOrder = orderListMap.get(workOrder).get(0);
|
|
|
|
|
|
|
|
|
|
Double complateQty = mesWorkOrder.getCompleteQty() + productionPartContexts.size();
|
|
|
|
|
Double qty = mesWorkOrder.getQty();
|
|
|
|
|
log.info("验证超工单,工单号【{}】,qty=【{}】,complateQty =【{}】begin ->", mesWorkOrder.getWorkOrderNo(), qty, complateQty);
|
|
|
|
|
// 如果预完成数量 小于等于工单数量,则直接过
|
|
|
|
|
if (complateQty <= qty) continue;
|
|
|
|
|
|
|
|
|
|
// 以下则是超工单逻辑
|
|
|
|
|
// 如果产线中没有配置超工单,则直接阻断
|
|
|
|
|
if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workCenter.getIsCheckOrderQty())) {
|
|
|
|
|
productionPartContextList.forEach(o -> o.busiCheckToDelete());
|
|
|
|
|
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList.forEach(o -> o.busiCheckToDelete());
|
|
|
|
|
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.obj(false),
|
|
|
|
|
MathOperation.compareTo(mesWorkOrder.getQty(), mesWorkOrder.getCompleteQty()) == 0
|
|
|
|
|
? String.format("请检查工单数量,工单[%s]计划数量[%s]已完成数量[%s],当前已完成!", workOrder, mesWorkOrder.getQty().intValue(), mesWorkOrder.getCompleteQty().intValue())
|
|
|
|
|
: String.format("请检查工单数量,工单[%s]计划数量[%s]已完成数量[%s],当前不支持超工单!", workOrder, mesWorkOrder.getQty().intValue(), mesWorkOrder.getCompleteQty().intValue()));
|
|
|
|
|
}
|
|
|
|
|
// 如果配置了超工单,且比例已经超过了配置的超工单比例,也需要阻断
|
|
|
|
|
Double rate = (complateQty - qty)/qty;
|
|
|
|
|
if (rate > workCenter.getOrderRate()/100) {
|
|
|
|
|
productionPartContextList.forEach(o -> o.busiCheckToDelete());
|
|
|
|
|
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList.forEach(o -> o.busiCheckToDelete());
|
|
|
|
|
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.obj(false),
|
|
|
|
|
String.format("请检查工单数量,工单[%s]计划数量[%s]已完成数量[%s],当前超出超工单比例[%s]!", workOrder, mesWorkOrder.getQty().intValue(), mesWorkOrder.getCompleteQty().intValue(), workCenter.getOrderRate()));
|
|
|
|
|
}
|
|
|
|
|
log.info("验证超工单,工单号【{}】,qty=【{}】,complateQty =【{}】,isCheckOrderQty=【{}】, rate = 【{}】end ->", mesWorkOrder.getWorkOrderNo(), qty, complateQty,workCenter.getIsCheckOrderQty(),rate);
|
|
|
|
|
}
|
|
|
|
|
log.info("验证是否超工单end ->");
|
|
|
|
|
return stepResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,否则报错)
|
|
|
|
|
private StepResult doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext,
|
|
|
|
|
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPsInContext> productionPsInContextList,
|
|
|
|
@ -460,8 +393,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
|
|
|
|
|
productSnStr));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 默认头道才有超工单
|
|
|
|
|
validSuperWorkOrder(reqBean, productionPartContextList,productionPsInContextList,workCenter, stepResult, resultBean);
|
|
|
|
|
return stepResult;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
@ -599,22 +530,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
|
|
|
|
|
return attrBeanList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//清除本次扫描/读取信息 有进料【只】需要清除进料,否则存在产出零件需要清除产出零件 【只需要清除被标记的数据】
|
|
|
|
|
private Boolean doBusiCheckToDelete(StationRequestBean reqBean, StepResult stepResult, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
|
|
|
|
|
if (!CollectionUtils.isEmpty(productionPsInContextList) && StringUtils.isEmpty(stepResult.getObj())) {
|
|
|
|
|
productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()));
|
|
|
|
|
} else if (!CollectionUtils.isEmpty(productionPartContextList)) {
|
|
|
|
|
if (!StringUtils.isEmpty(stepResult.getObj())) productionDispatchContextStepService.removeProductionPsInContext(reqBean);
|
|
|
|
|
productionDispatchContextStepService.removeProductionPartContext(reqBean);
|
|
|
|
|
productionDispatchContextStepService.removeProdRuleDataContext(reqBean);
|
|
|
|
|
productionProcessContextStepService.removeFunctionChooseCavityOrderContext(reqBean);
|
|
|
|
|
if (productionDispatchContextStepService.checkFirstMouldNoIsExistContext(reqBean)) {
|
|
|
|
|
//存在头道模具号场景下 必须抛出异常 因为头道模具号的接口逻辑会配置非常变值,也就是每次返回回去都会拿到头道模具号 就会出现死循环线程
|
|
|
|
|
productionDispatchContextStepService.removeFirstMouldNoContext(reqBean);
|
|
|
|
|
foundExThrowNoShowMsg();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|