From d7377fa4c6f7907070bfb82f244fd620da135f1f Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Sat, 8 Feb 2025 11:42:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=B1=E6=B1=95kitting=E6=8B=89=E5=8A=A8,?= =?UTF-8?q?=E6=8C=89=E6=95=B0=E9=87=8F=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 142 ++++++++++++++++----- 1 file changed, 108 insertions(+), 34 deletions(-) diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index 8369f48..d10af34 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java @@ -191,6 +191,9 @@ public class MesWorkOrderService extends BaseMesService implements private MesPullingOrderInfoRepository mesPullingOrderInfoRao; @Autowired + private MesPullingOrderPartInfoRepository pullingOrderPartInfoRao; + + @Autowired private MesPartPullRepository partPullRao; @Autowired @@ -202,6 +205,8 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesBomRepository bomRao; + + @Override public MesWorkOrder insert(MesWorkOrder bean) { // 数据校验 @@ -676,6 +681,7 @@ public class MesWorkOrderService extends BaseMesService implements seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel.organizeCode(next.getOrganizeCode()), next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList(); } List mesWorkOrderLogList = new ArrayList<>(); + List workOrderListForKitting = new ArrayList<>(); int index = 0; for (MesWorkOrder item : mesWorkOrderList) { //获取相同类型 相同标识 生产序号最大值的 @@ -698,6 +704,7 @@ public class MesWorkOrderService extends BaseMesService implements ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser()); index++; baseRDao.insert(copyMesWorkOrder); + workOrderListForKitting.add(copyMesWorkOrder); //保存记录 MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); BeanUtils.copyProperties(item, workOrderLog,MesExtConstWords.ID,MesExtConstWords.SYSTEM_SYNC_STATUS); @@ -729,6 +736,8 @@ public class MesWorkOrderService extends BaseMesService implements if (!CollectionUtils.isEmpty(mesWorkOrderLogList)) { workOrderLogService.insertBatch(mesWorkOrderLogList); } + //创建kitting + doCreateKitting(workOrderListForKitting, next.organizeCode); } private void doCreateKitting(List mesWorkOrderList,String organizeCode) { @@ -799,16 +808,19 @@ public class MesWorkOrderService extends BaseMesService implements collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty())); list.addAll(collect); } - // 计算所有拉动单的数量,生成拉动单 - + String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); + genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList(); + String serialNo = resultList.get(0); String workOrderStr = workOrderListNew.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.joining("/r/n")); String workOrderPartNoStr = workOrderListNew.stream().map(MesWorkOrder::getPartNo).collect(Collectors.joining("/r/n")); String workOrderPartNameStr = workOrderListNew.stream().map(MesWorkOrder::getPartName).collect(Collectors.joining("/r/n")); String custPartNo = workOrderListNew.stream().map(MesWorkOrder::getCustPartNo).collect(Collectors.joining("/r/n")); MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); pullingOrder.setOrganizeCode(organizeCode); - pullingOrder.setPullingOrderNo("xxx"); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号 pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); pullingOrder.setPullGroupFid(mesPartPull.getId()); pullingOrder.setWorkOrderNo(workOrderStr); @@ -823,7 +835,7 @@ public class MesWorkOrderService extends BaseMesService implements pullingOrder.setCarModelCode(workOrderListNew.get(0).getCarModelCode()); pullingOrder.setOrderFlag(workOrderListNew.get(0).getOrderFlag()); ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); - + mesPullingOrderInfoRao.insert(pullingOrder); // 需要合并同类项 Map> itemBomMap = list.stream().collect(Collectors.groupingBy(MesBom::getItemPartNo)); for (String itemPartNo : itemBomMap.keySet()) { @@ -849,6 +861,7 @@ public class MesWorkOrderService extends BaseMesService implements detail.setCarSeries(pullDetailMap.get(itemPartNo) == null ? "" : pullDetailMap.get(itemPartNo).getCarSeries()); detail.setOrderFlag(pullingOrder.getOrderFlag()); ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); } } @@ -861,9 +874,9 @@ public class MesWorkOrderService extends BaseMesService implements if (CollectionUtils.isEmpty(mesPartPullDetailList)) { return; } - //bom中对应的partNo列表 + //拉动组详情中的零件号 List partNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPartNo).collect(Collectors.toList()); - //深汕按照包装圆整 + //深汕按照数量圆整 if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ int packRoundQty = Integer.parseInt(mesPartPull.getPackRoundQty()); String partNo = workOrderListNew.get(0).getPartNo(); @@ -871,40 +884,101 @@ public class MesWorkOrderService extends BaseMesService implements List bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode); //需要生成拉动单的零件 List bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); - - - /** - * 满足一个拉动组就生成一个拉动单 - * 分类 - * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少,是否有余数 取模 - * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除,看看是否大于1 ,大于1需要拆分多个拉动单 - * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充 - */ - Map partNoRemainder = new HashMap<>(); - for (int i = 0; i < workOrderListNew.size(); i++) { - MesWorkOrder mesWorkOrder = workOrderListNew.get(0); + for (MesWorkOrder mesWorkOrder : workOrderListNew) { Double qty = mesWorkOrder.getQty(); bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); - for (int j = 0; j < bomPullList.size(); j++) { - double m = bomPullList.get(j).getItemQty() % packRoundQty; - double n = bomPullList.get(j).getItemQty() / packRoundQty; - if (m == 0 && n != 0){ - //子零件数量 * 工单需求数量 = packRoundQty - //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了 - - }else if (m != 0 && n == 0) { - //子零件数量 * 工单需求数量 < packRoundQty - //证明需要凑下一个工单的当前零件 - } else if (m !=0 && n > 0) { - //子零件数量 * 工单需求数量 > packRoundQty - //够一个拉动单以上的数据,还有余数给 - - } + DoubleSummaryStatistics summaryStatistics = bomPullList.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)); + double max = summaryStatistics.getMax(); + int multiple = Integer.parseInt(String.valueOf(Math.ceil(max / packRoundQty))); //生成的拉动的数量 + for (int i = 1; i <= multiple; i++) { + insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty); } } - +// /** +// * 满足一个拉动组就生成一个拉动单 +// * 分类 +// * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少,是否有余数 取模 +// * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除,看看是否大于1 ,大于1需要拆分多个拉动单 +// * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充 +// */ +// Map partNoRemainder = new HashMap<>(); +// for (int i = 0; i < workOrderListNew.size(); i++) { +// MesWorkOrder mesWorkOrder = workOrderListNew.get(0); +// Double qty = mesWorkOrder.getQty(); +// bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); +// for (int j = 0; j < bomPullList.size(); j++) { +// double m = bomPullList.get(j).getItemQty() % packRoundQty; +// double n = bomPullList.get(j).getItemQty() / packRoundQty; +// if (m == 0 && n != 0){ +// //子零件数量 * 工单需求数量 = packRoundQty +// //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了 +// +// }else if (m != 0 && n == 0) { +// //子零件数量 * 工单需求数量 < packRoundQty +// //证明需要凑下一个工单的当前零件 +// } else if (m !=0 && n > 0) { +// //子零件数量 * 工单需求数量 > packRoundQty +// //够一个拉动单以上的数据,还有余数给 +// +// } +// } +// } + + + } + } + + private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ + // 计算所有拉动单的数量,生成拉动单 + Map pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity())); + String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); + genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList(); + String serialNo = resultList.get(0); + MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); + pullingOrder.setOrganizeCode(organizeCode); + pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); + pullingOrder.setPullGroupFid(mesPartPull.getId()); + pullingOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue()); + pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode()); + pullingOrder.setPullCode(mesPartPull.getPullCode()); + pullingOrder.setPartNo(mesWorkOrder.getPartNo()); + pullingOrder.setPartName(mesWorkOrder.getPartName()); + pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo()); + pullingOrder.setCarModelCode(mesWorkOrder.getCarModelCode()); + pullingOrder.setOrderFlag(mesWorkOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); + mesPullingOrderInfoRao.insert(pullingOrder); + for (MesBom mesBom : bomPullList) { + MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); + detail.setOrganizeCode(organizeCode); + detail.setPullCode(pullingOrder.getPullCode()); + detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setPartNo(mesBom.getItemPartNo()); + detail.setPartName(mesBom.getItemPartName()); + double remainingQty = mesBom.getItemQty() - i * roundPackQty; + detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty)); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setWaterSeq(pullingOrder.getProductSeq()); + detail.setWorkCellCode(mesWorkOrder.getWorkCenterCode()); + detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + detail.setCustPartNo(pullingOrder.getCustPartNo()); + detail.setCarSeries(pullDetailMap.get(mesBom.getItemPartNo()) == null ? "" : pullDetailMap.get(mesBom.getItemPartNo()).getCarSeries()); + detail.setOrderFlag(pullingOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); } + } private List getPlatBom(MesBom mesBom,String partNo, String effectiveTime,String organizeCode) {