From 6fc77688be4b43d5aae93f5f05c41dba350a7a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E7=AC=91=E7=9D=80=E9=9D=A2=E5=AF=B9=E6=98=8E?= =?UTF-8?q?=E5=A4=A9?= <752558143@qq.com> Date: Thu, 4 Jul 2024 15:15:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E5=B7=A5=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/schedulejob/MesReportNoSortJob.java | 1 - .../serviceimpl/busi/MesWorkOrderService.java | 116 ++++++++++++++----- .../step/MesAssemblyShowNosortStepService.java | 61 +++++++++- .../MesWorkOrderCheckQtyNosortStepService.java | 126 +++++++++++++++++++++ 4 files changed, 272 insertions(+), 32 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckQtyNosortStepService.java diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java index 5883576..a1ba6b8 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java @@ -83,7 +83,6 @@ public class MesReportNoSortJob extends BaseMesScheduleJob { return; } try { - Map map = new HashMap<>(); workOrderService.doProductReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName); } catch (ImppBusiException e) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index d0d4dd3..1df2164 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -92,6 +92,8 @@ public class MesWorkOrderService implements IMesWorkOrderService { @Autowired private IMesShiftService mesShiftService; + @Autowired + private MesPartSapRepository partSapRepository; @Override public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) { @@ -434,13 +436,13 @@ public class MesWorkOrderService implements IMesWorkOrderService { //新增初始化 todo // 根据 //根据物料获取已发布的工单 - MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode); - if (oldMesWorkOrder == null) { + List oldMesWorkOrderList = getMesWorkOrder(productionRecord, organizeCode); + if (CollectionUtils.isEmpty(oldMesWorkOrderList)) { updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); return; } - report(productionRecord, organizeCode, userName, oldMesWorkOrder); + report(productionRecord, organizeCode, userName, oldMesWorkOrderList); } @Override @@ -449,22 +451,61 @@ public class MesWorkOrderService implements IMesWorkOrderService { // 根据 //根据物料获取已发布的工单 LOGGER.info("此次报工的条码【{}】,工单【{}】", productionRecord.getProductSn(), productionRecord.getWorkOrderNo()); - List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); + List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode); if (CollectionUtils.isEmpty(oldMesWorkOrders)) { updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); return; } - report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0)); + report(productionRecord, organizeCode, userName, oldMesWorkOrders); + + } + + /** + * 获取最优的工单 + * @param oldMesWorkOrderList + * @param mesWorkCenter + * @return + */ + public MesWorkOrder getBestWorkOrder(MesProductionRecord productionRecord, List oldMesWorkOrderList, MesWorkCenter mesWorkCenter) { + + if (!StringUtils.isEmpty(productionRecord.getWorkOrderNo())) { + return oldMesWorkOrderList.get(0); + } + + for (MesWorkOrder mesWorkOrder : oldMesWorkOrderList) { + double reportdQty = MathOperation.add(1, mesWorkOrder.getReportedQty()); + // 如果是允许,则需要判断是否超过比例 + if (reportdQty <= mesWorkOrder.getQty()) { + return mesWorkOrder; + } + if (Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),mesWorkCenter.getIsCheckOrderQty())) { + double remainQty = reportdQty - mesWorkOrder.getQty(); + double rate = remainQty / mesWorkOrder.getQty(); + if (rate > mesWorkCenter.getOrderRate()/100) { + continue; + } else { + return mesWorkOrder; + } + } + } + return null; } - private void report(MesProductionRecord productionRecord, String organizeCode, String userName, MesWorkOrder oldMesWorkOrder) { + + private void report(MesProductionRecord productionRecord, String organizeCode, String userName, List oldMesWorkOrderList) { + // + DdlPackBean ddlPackBean; //查询工作中心 ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getWorkCenterCode(), "workCenterCode", ddlPackBean); + DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean); MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); if (Objects.isNull(mesWorkCenter)) { - throw new ImppBusiException(String.format("产线【%s】不存在", oldMesWorkOrder.getWorkCenterCode())); + throw new ImppBusiException(String.format("产线【%s】不存在", productionRecord.getWorkCenterCode())); + } + MesWorkOrder oldMesWorkOrder = getBestWorkOrder(productionRecord, oldMesWorkOrderList, mesWorkCenter); + if (oldMesWorkOrder == null) { + throw new ImppBusiException(String.format("未找到匹配的加工单")); } //获取生产版本 ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); @@ -475,6 +516,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { if (null == mesProductVersion) { throw new ImppBusiException(String.format("物料【%s】生产版本信息不存在", productionRecord.getPartNo())); } + //物料+生产版本获取bom信息 ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean); @@ -493,12 +535,9 @@ public class MesWorkOrderService implements IMesWorkOrderService { //更新工单状态 double unCompleteQty = MathOperation.sub(oldMesWorkOrder.getQty(), oldMesWorkOrder.getReportedQty()); oldMesWorkOrder.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); - if (oldMesWorkOrder.getReportedQty() > oldMesWorkOrder.getQty()) { - throw new ImppBusiException(String.format("工单报工数量【%s】大于工单数量【%s】,不允许报工", - oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())); - } else if (Objects.equals(oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())) { + if (oldMesWorkOrder.getReportedQty() >= oldMesWorkOrder.getQty()) { oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); - } else { + } else { oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); } LOGGER.info("工单报工后数量【{}】", oldMesWorkOrder.getReportedQty()); @@ -553,12 +592,14 @@ public class MesWorkOrderService implements IMesWorkOrderService { * @param organizeCode * @return */ - private MesWorkOrder getMesWorkOrder(MesProductionRecord productionRecord, String organizeCode) { + private List getMesWorkOrder(MesProductionRecord productionRecord, String organizeCode) { MesWorkOrder mesWorkOrder = new MesWorkOrder(); + + List workOrders = new ArrayList<>(); /** * 根据产线物料获取所有工单 */ - List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); + List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode); if (CollectionUtils.isEmpty(oldMesWorkOrders)) { return null; } @@ -586,11 +627,11 @@ public class MesWorkOrderService implements IMesWorkOrderService { } }*/ - mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> beginDate.getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && beginDate.getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null); + workOrders = oldMesWorkOrders.stream().filter(workOrder -> beginDate.getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && beginDate.getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).collect(Collectors.toList()); String date = productionRecord.getLotNo(); // 如果找不到需要找 当天的其它班次 - if (mesWorkOrder == null) { + if (CollectionUtils.isEmpty(workOrders)) { // 如果开始时间大于结束时间,说明跨天了,跨天说明是晚班,需要找, 如果是晚班, 则找早中班的工单 if (currentShift.getStartTime().compareTo(currentShift.getEndTime()) > 0) { // 如果比0点大,需要找日期前一天的班次的工单号,如果是0点前,date =lotNO 如果是0点后,则找lot的前一天 @@ -603,7 +644,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { String endTime = date + " " +currentShift.getStartTime(); String startTime = date + " " +currentShift.getEndTime(); - mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() > transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() < transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null); + workOrders = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() > transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() < transfer(workOrder.getPlanEndTime()).getTime()).collect(Collectors.toList()); } else { // 早班或者中班 则找当天非当前班次的最早单号 @@ -614,18 +655,19 @@ public class MesWorkOrderService implements IMesWorkOrderService { break; } } - mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null); + workOrders = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).collect(Collectors.toList()); } - if (mesWorkOrder == null) { + if (CollectionUtils.isEmpty(workOrders)) { // todo 需要记录并且第二天要用job跑 return null; } } - return mesWorkOrder; + return workOrders; } - private List getMesWorkOrders(MesProductionRecord productionRecord, String organizeCode, String workOrderNo) { - List list = Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList()); + private List getMesWorkOrders(MesProductionRecord productionRecord, String organizeCode) { + List list = Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue(), MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()).collect(Collectors.toList()); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean); DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean); @@ -686,8 +728,8 @@ public class MesWorkOrderService implements IMesWorkOrderService { List statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList()); DdlPreparedPack.getInPackList( statusList,"reportStatus",ddlPackBean); DdlPreparedPack.getIsNull("workOrderNo",ddlPackBean); - String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER"); - + //String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER"); + String workCenterCodes ="B19CK01A"; List centerList = Arrays.asList(workCenterCodes.split(",")); DdlPreparedPack.getInPackList(centerList, "workCenterCode",ddlPackBean); @@ -698,9 +740,18 @@ public class MesWorkOrderService implements IMesWorkOrderService { if(!CollectionUtils.isEmpty(mesProductionRecordList)) { Map> map = mesProductionRecordList.stream().collect(Collectors.groupingBy(MesProductionRecord::getPartNo)); map.forEach((k, v) -> { - recordList.add(v.get(0)); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getStringEqualPack(k, "partNo", packBean); + // 排除掉试制造件 + MesPartSap part = partSapRepository.getByProperty(packBean); + if (part != null && !Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), part.getIsTestPiece())) { + recordList.add(v.get(0)); + } + LOGGER.info("sap物料中不存在该物料号【{}】, 或者是试制件,不进行报工"); }); } + + return recordList; } @@ -711,9 +762,11 @@ public class MesWorkOrderService implements IMesWorkOrderService { List statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList()); DdlPreparedPack.getInPackList( statusList,"reportStatus",ddlPackBean); DdlPreparedPack.getIsNotNull("workOrderNo",ddlPackBean); - String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER"); + //String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER"); + String workCenterCodes ="B19CK01A"; List centerList = Arrays.asList(workCenterCodes.split(",")); + DdlPreparedPack.getInPackList(centerList, "workCenterCode",ddlPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"modifyDatetime"}, ddlPackBean); @@ -723,7 +776,14 @@ public class MesWorkOrderService implements IMesWorkOrderService { if(!CollectionUtils.isEmpty(mesProductionRecordList)) { Map> map = mesProductionRecordList.stream().collect(Collectors.groupingBy(MesProductionRecord::getPartNo)); map.forEach((k, v) -> { - recordList.add(v.get(0)); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getStringEqualPack(k, "partNo", packBean); + // 排除掉试制造件 + MesPartSap part = partSapRepository.getByProperty(packBean); + if (part != null && !Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), part.getIsTestPiece())) { + recordList.add(v.get(0)); + } + LOGGER.info("sap物料中不存在该物料号【{}】, 或者是试制件,不进行报工"); }); } return recordList; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java index 0261b83..f6ff727 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java @@ -9,6 +9,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; 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; @@ -48,6 +49,9 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { @Autowired private IMesProductionRecordService productionRecordService; + @Autowired + private IMesWorkOrderExtService workOrderExtService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -158,12 +162,65 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format( "请检查非排序产品加工规则信息,根据设备[%s]产出零件[%s]进料零件[空]查询到[%s]条加工规则配置信息,无法显示出装配件清单!", cellEquipContext.getEquipmentName(), productionPartContext.getPartNo(), CollectionUtils.isEmpty(filterList) ? MesPcnExtConstWords.ZERO : filterList.size())); } - //【非排序线】获取产品加工规则对应的装配件信息 prodRuleContextList.add(prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext( reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()). copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey()))); + } + // 默认头道才有超工单 + validSuperWorkOrder(reqBean, productionPartContextList,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 productionPartContextList, MesWorkCenter workCenter, StepResult stepResult, StationResultBean resultBean) { + // 验证超工单 + // 对MesProductionPartContext中的工单号经行分组,每个工单可能对应多条数据,筛选掉foreignkey为空的数据 + Map> productionPartContextMap = productionPartContextList.stream().filter(productionPartContext -> !StringUtils.isEmpty(productionPartContext.getForeignKey())) + .collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo)); + // 获取涉及到的所有工单列表 + List workOrderList = workOrderExtService.getWorkOrderList(reqBean.getOrganizeCode(), new ArrayList<>(productionPartContextMap.keySet())); + // 对工单经行分组 + Map> orderListMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo)); + + for (Map.Entry> entry : productionPartContextMap.entrySet()) { + String workOrder = entry.getKey(); + List productionPartContexts = entry.getValue(); + MesWorkOrder mesWorkOrder = orderListMap.get(workOrder).get(0); + + double complateQty = mesWorkOrder.getCompleteQty() + productionPartContexts.size(); + double qty = mesWorkOrder.getQty(); + // 如果预完成数量 小于等于工单数量,则直接过 + if (complateQty <= qty) { + continue; + } + // 以下则是超工单逻辑 + // 如果产线中没有配置超工单,则直接阻断 + if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workCenter.getIsCheckOrderQty())) { + productionPartContextList.forEach(o -> o.busiCheckToDelete()); + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format( + "请检查工单数量,工单号[%s],工单数量[%s]预完成数量[%s],且未配置超工单", + workOrder, mesWorkOrder.getQty(), complateQty)); + } + // 如果配置了超工单,且比例已经超过了配置的超工单比例,也需要阻断 + double rate = (complateQty - qty)/qty; + if (rate > workCenter.getOrderRate()) { + productionPartContextList.forEach(o -> o.busiCheckToDelete()); + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format( + "请检查工单数量,工单号[%s],工单数量[%s]预完成数量[%s],配置了超工单,但超过了比例[%s]", + workOrder, mesWorkOrder.getQty(), complateQty, workCenter.getOrderRate())); + } } return stepResult; } @@ -275,11 +332,9 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { } productionPartContext.foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()); - productSn = productionPsInContext.getProductSn(); break; - } //【非排序线】获取产品加工规则对应的装配件信息 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckQtyNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckQtyNosortStepService.java new file mode 100644 index 0000000..87b95be --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckQtyNosortStepService.java @@ -0,0 +1,126 @@ +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.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.mes.pcn.util.StationKvBeanUtil; +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.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +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.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description : 加工单验证工步 【非排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderCheckQtyNosortStepService") +public class MesWorkOrderCheckQtyNosortStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesWorkOrderExtService workOrderExtService; + + @Autowired + private IFsmCommonService fsmCommonService; + + @Autowired + private MesFirstMouldNoReadStepService firstMouldNoReadStepService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文生产扫/读信息:加工单 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中缺失待验证的加工单信息!"); + + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //验证工单的有效性 + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, equipVariableCollectContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + + String workOrderStr = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(workOrderStr), stepResult, String.format("当前%s加工单%s验证工单数量成功%s!")); + + } + + + //验证工单的有效性 + public StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, + List equipVariableCollectContextList) { + + //搜集生产工单号 + List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + List workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList()); + + //获取生产工单信息 + List workOrderDbList = workOrderExtService.getWorkOrderList(reqBean.getOrganizeCode(), workOrderNoList); + Map> workOrderMap = CollectionUtils.isEmpty(workOrderDbList) ? null : workOrderDbList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo)); + + + if (!CollectionUtils.isEmpty(workOrderNoList)) { + + for (String workOrderNo : workOrderNoList) { + + if ((StringUtils.isEmpty(workCenter.getIsCheckOrderQty()) || workCenter.getIsCheckOrderQty().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || + workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0) && + MathOperation.compareTo(MathOperation.add(workOrderDbList.get(0).getCompleteQty(), new Double(workOrderMap.get(workOrderDbList.get(0).getWorkOrderNo()).size())), workOrderDbList.get(0).getQty()) > 0) + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]信息完成数量[%s]累加当前腔数量[%s]已超过计划数量[%s]!", + workOrderNo, workOrderDbList.get(0).getCompleteQty(), workOrderMap.get(workOrderDbList.get(0).getWorkOrderNo()).size(), workOrderDbList.get(0).getQty())); + + if (!StringUtils.isEmpty(workCenter.getIsCheckOrderQty()) && workCenter.getIsCheckOrderQty().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && + workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue()) == 0 && + MathOperation.compareTo(MathOperation.add(workOrderDbList.get(0).getReportedQty(), new Double(workOrderMap.get(workOrderDbList.get(0).getWorkOrderNo()).size())), + (MathOperation.mul(workOrderDbList.get(0).getQty(), MathOperation.div(MathOperation.add(workCenter.getOrderRate(), new Double(100)), new Double(100))))) >= 0) + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]信息汇报数量[%s]累加当前腔数量[%s]已超过计划数量[%s]超工单比例[%s]!", + workOrderNo, workOrderDbList.get(0).getReportedQty(), workOrderMap.get(workOrderDbList.get(0).getWorkOrderNo()).size(), workOrderDbList.get(0).getQty(), workCenter.getOrderRate() + MesPcnExtConstWords.PERCENT)); + + } + } + + return stepResult.obj(filterList); + + } +}