From d419e5f64cf3876b51827e1f6eddc186b6e26182 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期三, 10 九月 2025 16:57:04 +0800 Subject: [PATCH] 增加热处理排产及报工 --- src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java | 163 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 132 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java index 271c5aa..3427afb 100644 --- a/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java +++ b/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java @@ -17,23 +17,27 @@ import org.jeecg.modules.base.service.IShiftService; import org.jeecg.modules.lsw.entity.LswMaterial; import org.jeecg.modules.lsw.entity.LswMaterialInbound; +import org.jeecg.modules.lsw.entity.LswMaterialInventory; import org.jeecg.modules.lsw.enums.MaterialCategoryEnum; +import org.jeecg.modules.lsw.enums.MaterialInboundCategory; +import org.jeecg.modules.lsw.enums.MaterialInventoryStatusEnum; import org.jeecg.modules.lsw.service.ILswMaterialInboundService; +import org.jeecg.modules.lsw.service.ILswMaterialInventoryService; import org.jeecg.modules.lsw.service.ILswMaterialService; -import org.jeecg.modules.mes.entity.MesMaterialLoading; -import org.jeecg.modules.mes.entity.MesProductionOrder; -import org.jeecg.modules.mes.entity.MesProductionWorkOrder; -import org.jeecg.modules.mes.entity.MesWorkReporting; +import org.jeecg.modules.mes.entity.*; +import org.jeecg.modules.mes.enums.ReportCategoryEnum; import org.jeecg.modules.mes.mapper.MesWorkReportingMapper; -import org.jeecg.modules.mes.service.IMesMaterialLoadingService; -import org.jeecg.modules.mes.service.IMesProductionOrderService; -import org.jeecg.modules.mes.service.IMesProductionWorkOrderService; -import org.jeecg.modules.mes.service.IMesWorkReportingService; +import org.jeecg.modules.mes.service.*; import org.jeecg.modules.mes.utils.CommonUtils; import org.jeecg.modules.pms.entity.PmsMaterialProcess; import org.jeecg.modules.pms.service.IPmsMaterialProcessService; import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService; import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo; +import org.jeecg.modules.qms.entity.InspectionPlan; +import org.jeecg.modules.qms.entity.InspectionPlanItem; +import org.jeecg.modules.qms.enums.PlanCategoryEnum; +import org.jeecg.modules.qms.service.IInspectionPlanItemService; +import org.jeecg.modules.qms.service.IInspectionPlanService; import org.jeecg.modules.sap.request.OrderLoadRequest; import org.jeecg.modules.sap.request.OrderReportRequest; import org.jeecg.modules.sap.service.OrderLoadService; @@ -49,6 +53,7 @@ import java.time.temporal.ChronoField; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Description: 宸ュ崟鎶ュ伐 @@ -88,6 +93,14 @@ private OrderReportService orderReportService; @Autowired private OrderLoadService orderLoadService; + @Autowired + private IInspectionPlanService inspectionPlanService; + @Autowired + private IInspectionPlanItemService inspectionPlanItemService; + @Autowired + private IMesMaterialConsumptionDetailService mesMaterialConsumptionDetailService; + @Autowired + private ILswMaterialInventoryService lswMaterialInventoryService; @Override public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) { @@ -101,7 +114,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public void addReporting(MesWorkReporting mesWorkReporting) { + public MesWorkReporting addReporting(MesWorkReporting mesWorkReporting) { MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId()); if (workOrder == null) { throw new JeecgBootException("宸ュ崟涓嶅瓨鍦紒"); @@ -134,45 +147,100 @@ int currentPallets = workOrder.getFinishedPallets() + 1; String batchNumber = yearLastTwo + dayOfYearStr + shiftGroup.getGroupCode() + currentPallets; mesWorkReporting.setBatchNumber(batchNumber) + .setWorkOrderCode(workOrder.getWorkOrderCode()) .setWarehouseId(lineSideWarehouse.getId()) + .setWarehouseCode(lineSideWarehouse.getWarehouseCode()) .setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername()) .setReportTime(new Date()); String date = today.format(DateTimeFormatter.ofPattern("yyMMdd")); Factory factory = factoryService.getById(mesWorkReporting.getFactoryId()); workOrder.setFactoryCode(factory.getFactoryCode()); + List<MesMaterialConsumptionDetail> consumptionDetailList = CollectionUtil.newArrayList(); switch (materialCategory) { case FINISHED_PRODUCT: //鎴愬搧鎶ュ伐 - productReport(mesWorkReporting, workOrder, lineSideWarehouse); + consumptionDetailList = productReport(mesWorkReporting, workOrder, lineSideWarehouse); + //鐢熸垚妫�楠屽伐鍗� + //generateInspectionOrder(mesWorkReporting, workOrder); //鎷兼帴鎴愬搧鎶ュ伐鎵樺彿 String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4"); String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4; - mesWorkReporting.setPalletNumber(finishedPalletNumber); - //todo 鎵撳嵃鎴愬搧鎵樻爣绛俱�佹楠屾爣璇嗗崱銆佺Щ搴撳崟銆佸畬宸ユ楠屽伐鍗� + mesWorkReporting.setPalletNumber(finishedPalletNumber).setReportType(ReportCategoryEnum.FINISHED.name()); break; case INNER_FLANGE: case OUTER_FLANGE: //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)鎶ュ伐 - productReport(mesWorkReporting, workOrder, lineSideWarehouse); + consumptionDetailList = productReport(mesWorkReporting, workOrder, lineSideWarehouse); //鎷兼帴鍗婃垚鍝佹姤宸ユ墭鍙� Shift shift = shiftService.getById(workOrder.getShiftId()); String palletNumber6 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber6"); String halfPalletNumber = factory.getFactoryCode() + material.getMaterialNumber() + date + shift.getShiftCode() + palletNumber6; - mesWorkReporting.setPalletNumber(halfPalletNumber); + mesWorkReporting.setPalletNumber(halfPalletNumber).setReportType(ReportCategoryEnum.HALF.name()); break; + case BLANK: + //鐑鐞嗘姤宸� + consumptionDetailList = heatTreatmentReport(mesWorkReporting, workOrder, lineSideWarehouse); + mesWorkReporting.setReportType(ReportCategoryEnum.HEATTREATMENT.name()); + } //鏂板鎶ュ伐璁板綍 save(mesWorkReporting); + consumptionDetailList.forEach(i -> i.setReportingId(mesWorkReporting.getId())); + //淇濆瓨鐗╂枡娑堣�楁槑缁� + mesMaterialConsumptionDetailService.saveBatch(consumptionDetailList); //鏇存柊鎺掍骇宸ュ崟 MesProductionWorkOrder productionWorkUpdateOrder = new MesProductionWorkOrder() .setId(workOrder.getId()) .setActualQuantity(workOrder.getActualQuantity().add(mesWorkReporting.getQuantity())) .setFinishedPallets(workOrder.getFinishedPallets() + 1); mesProductionWorkOrderService.updateById(productionWorkUpdateOrder); + //杩斿洖鎶ュ伐璁板綍锛岀敤浜庢墭鏍囩鎵撳嵃 + return mesWorkReporting; + } + + //鐑鐞嗘姤宸� + private List<MesMaterialConsumptionDetail> heatTreatmentReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) { + //1銆佸叆搴撶儹澶勭悊姣涘澂鍒板搴旂嚎杈瑰簱锛岀儹澶勭悊鍓嶅悗鐗╂枡缂栫爜涓嶅彂鐢熷彉鍖栵紝鍙渶瑕佹洿鏂扮儹澶勭悊鏍囪瘑锛屾墍浠ユ澶勪笉鑳界洿鎺ヨ皟鐢ㄧ嚎杈瑰簱鐨勫叆搴撴柟娉曪紝闇�瑕佺洿鎺ユ洿鏂扮墿鏂欏簱瀛樹俊鎭腑鐨勭儹澶勭悊鏍囪瘑瀛楁 + LswMaterialInventory materialInventory = lswMaterialInventoryService.list(new LambdaQueryWrapper<LswMaterialInventory>() + .eq(LswMaterialInventory::getWarehouseId, lineSideWarehouse.getId()) + .eq(LswMaterialInventory::getInventoryStatus, MaterialInventoryStatusEnum.OUTBOUND.name()) + .eq(LswMaterialInventory::getHeatTreatmentFlag, CommonConstant.STATUS_0) + .apply("EXISTS SELECT 1 FROM lsw_material t WHERE t.id = lsw_material_inventory.material_id AND t.material_number = {0} " + + "AND t.del_flag = {1} AND t.material_status = {2}", workOrder.getMaterialNumber(), CommonConstant.DEL_FLAG_0, CommonConstant.STATUS_1)).stream().findFirst().orElse(null); + if (materialInventory == null) { + throw new JeecgBootException("绾胯竟搴撴棤璇ョ墿鏂欏簱瀛樹俊鎭紒"); + } + if (materialInventory.getQuantity().compareTo(mesWorkReporting.getQuantity()) != 0) { + throw new JeecgBootException("鎶ュ伐鏁伴噺涓嶇鍚堟暣鎵规鏁伴噺瑕佹眰锛�"); + } + materialInventory.setHeatTreatmentFlag(CommonConstant.STATUS_1); + materialInventory.setInventoryStatus(MaterialInventoryStatusEnum.NORMAL.name()); + lswMaterialInventoryService.updateById(materialInventory); + //2銆佹洿鏂拌鎵规鍙峰緱涓婃枡璁板綍 + MesMaterialLoading materialLoading = mesMaterialLoadingService.list(new LambdaQueryWrapper<MesMaterialLoading>() + .eq(MesMaterialLoading::getFactoryId, workOrder.getFactoryId()) + .eq(MesMaterialLoading::getWarehouseId, lineSideWarehouse.getId()) + .eq(MesMaterialLoading::getMaterialNumber, workOrder.getMaterialNumber()) + .eq(MesMaterialLoading::getBatchNumber, materialInventory.getBatchNumber())) + .stream().findFirst().orElse(null); + if (materialLoading == null) { + throw new JeecgBootException("鏈壘鍒拌鎵规鍙风殑涓婃枡璁板綍锛�"); + } + materialLoading.setRemainingQuantity(BigDecimal.ZERO); + mesMaterialLoadingService.updateById(materialLoading); + //鐑鐞嗘姤宸ワ紝鎵规鍙峰彇搴撳瓨鐨勬暣鎵规壒娆″彿 + mesWorkReporting.setBatchNumber(materialInventory.getBatchNumber()); + //3銆佽褰曟秷鑰楁槑缁� + MesMaterialConsumptionDetail materialConsumptionDetail = new MesMaterialConsumptionDetail() + .setWorkOrderId(workOrder.getId()) + .setFactoryId(workOrder.getFactoryId()) + .setLoadingId(materialLoading.getId()) + .setQuantity(mesWorkReporting.getQuantity()); + return Collections.singletonList(materialConsumptionDetail); } //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)銆佹垚鍝佹姤宸� - private void productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) { + private List<MesMaterialConsumptionDetail> productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) { //1銆佸叆搴� 鍗婃垚鍝�/鎴愬搧 鍒板搴旂嚎杈瑰簱 LswMaterialInbound materialInbound = new LswMaterialInbound() .setFactoryId(workOrder.getFactoryId()) @@ -180,21 +248,26 @@ .setMaterialNumber(workOrder.getMaterialNumber()) .setMaterialName(workOrder.getMaterialName()) .setBatchNumber(mesWorkReporting.getBatchNumber()) - .setQuantity(mesWorkReporting.getQuantity()); - lswMaterialInboundService.save(materialInbound); - //2銆佹墸鍑忎娇鐢ㄦ瘺鍧簱瀛橈紙鏇存柊涓婃枡璁板綍锛夋垨鍗婃垚鍝佺墿鏂欏簱瀛橈紙鍐呮硶鍏般�佸娉曞叞銆佸皬鍐呭湀銆侀厤浠剁瓑锛夛紝鎸夌収 鎺掍骇宸ュ崟id銆佺墿鏂欑紪鐮� 鏌ヨ涓婃枡璁板綍锛屾寜鐓ф椂闂翠粠鏃╁埌鏅氭帓搴忥紝浼樺厛鎵e噺鏃╃殑涓婃枡璁板綍锛堝厛杩涘厛鍑猴級 + .setQuantity(mesWorkReporting.getQuantity()) + .setInboundCategory(MaterialInboundCategory.PRODUCTION_INBOUND.name())//鐢熶骇涓嬬嚎 + .setOriginalCode(lineSideWarehouse.getWarehouseCode()) + .setOriginalName(lineSideWarehouse.getWarehouseName()); + lswMaterialInboundService.inboundMaterial(materialInbound); + //2銆佹墸鍑忎娇鐢ㄦ瘺鍧簱瀛橈紙鏇存柊涓婃枡璁板綍锛夋垨鍗婃垚鍝佺墿鏂欏簱瀛橈紙鍐呮硶鍏般�佸娉曞叞銆佸皬鍐呭湀銆侀厤浠剁瓑锛夛紝鎸夌収 浜х嚎id銆佸簱瀛樺湴id銆佺墿鏂欑紪鐮� 鏌ヨ涓婃枡璁板綍锛屾寜鐓ф椂闂翠粠鏃╁埌鏅氭帓搴忥紝浼樺厛鎵e噺鏃╃殑涓婃枡璁板綍锛堝厛杩涘厛鍑猴級 //鍏堟煡璇㈢墿鏂� BOM Map<String, ProcessBillMaterialsDetailVo> processBillMaterialsDetailMap = pmsProcessBillMaterialsService .queryMaterialsDetailByOrderIdAndMaterialNumber(mesWorkReporting.getOrderId(), workOrder.getMaterialNumber()).stream() .collect(Collectors.toMap(ProcessBillMaterialsDetailVo::getMaterialNumber, v1 -> v1, (v1, v2) -> v1)); //鏌ヨ涓婃枡璁板綍 Map<String, List<MesMaterialLoading>> materialLoadingRecordMap = mesMaterialLoadingService.list(new LambdaQueryWrapper<MesMaterialLoading>() - .eq(MesMaterialLoading::getWorkOrderId, workOrder.getId()) + .eq(MesMaterialLoading::getFactoryId, workOrder.getFactoryId()) + .eq(MesMaterialLoading::getWarehouseId, lineSideWarehouse.getId()) .in(MesMaterialLoading::getMaterialNumber, processBillMaterialsDetailMap.keySet()) .gt(MesMaterialLoading::getRemainingQuantity, BigDecimal.ZERO)).stream() .sorted(Comparator.comparing(MesMaterialLoading::getCreateTime)) .collect(Collectors.groupingBy(MesMaterialLoading::getMaterialNumber)); List<MesMaterialLoading> materialLoadingRecordUpdateList = CollectionUtil.newArrayList(); + List<MesMaterialConsumptionDetail> consumptionDetailAddList = CollectionUtil.newArrayList(); for (String materialNumber : processBillMaterialsDetailMap.keySet()) { List<MesMaterialLoading> materialLoadingRecordList = materialLoadingRecordMap.get(materialNumber); if (materialLoadingRecordList.isEmpty()) { @@ -203,8 +276,26 @@ //璁$畻鐗╂枡鎵e噺鏁伴噺 ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber); BigDecimal quantity = processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity()); - List<MesMaterialLoading> updateList = deductQuantity(materialLoadingRecordList, quantity); - materialLoadingRecordUpdateList.addAll(updateList); + //鎵e噺涓婃枡鏁伴噺骞惰褰曠墿鏂欐秷鑰楁槑缁� + for (MesMaterialLoading mesMaterialLoading : materialLoadingRecordList) { + //璁板綍鐗╂枡娑堣�楁槑缁� + MesMaterialConsumptionDetail materialConsumptionDetail = new MesMaterialConsumptionDetail() + .setOrderId(mesWorkReporting.getOrderId()) + .setWorkOrderId(workOrder.getId()) + .setFactoryId(workOrder.getFactoryId()) + .setLoadingId(mesMaterialLoading.getId()); + if (mesMaterialLoading.getRemainingQuantity().compareTo(quantity) >= 0) { + mesMaterialLoading.setRemainingQuantity(mesMaterialLoading.getRemainingQuantity().subtract(quantity)); + materialConsumptionDetail.setQuantity(quantity); + break; + } else { + quantity = quantity.subtract(mesMaterialLoading.getRemainingQuantity()); + materialConsumptionDetail.setQuantity(mesMaterialLoading.getRemainingQuantity()); + mesMaterialLoading.setRemainingQuantity(BigDecimal.ZERO); + } + consumptionDetailAddList.add(materialConsumptionDetail); + } + materialLoadingRecordUpdateList.addAll(materialLoadingRecordList); } //鏇存柊涓婃枡璁板綍 mesMaterialLoadingService.updateBatchById(materialLoadingRecordUpdateList); @@ -244,18 +335,28 @@ log.error("SAP宸ュ簭鎶ュ伐寮傚父锛�", e); } } + return consumptionDetailAddList; } - private List<MesMaterialLoading> deductQuantity(List<MesMaterialLoading> materialLoadingRecordList, BigDecimal quantity) { - for (MesMaterialLoading mesMaterialLoading : materialLoadingRecordList) { - if (mesMaterialLoading.getRemainingQuantity().compareTo(quantity) >= 0) { - mesMaterialLoading.setRemainingQuantity(mesMaterialLoading.getRemainingQuantity().subtract(quantity)); - break; - } else { - quantity = quantity.subtract(mesMaterialLoading.getRemainingQuantity()); - mesMaterialLoading.setRemainingQuantity(BigDecimal.ZERO); - } + //鏍规嵁妫�楠屾柟妗堢敓鎴愭楠屽伐鍗� + private void generateInspectionOrder(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder) { + //1.鏍规嵁鐗╂枡缂栫爜鏌ヨ妫�楠屾柟妗� + InspectionPlan inspectionPlan = inspectionPlanService.list(new LambdaQueryWrapper<InspectionPlan>() + .eq(InspectionPlan::getMaterialNumber, workOrder.getMaterialNumber()) + .eq(InspectionPlan::getPlanCategory, PlanCategoryEnum.COMPLETION_INSPECTION.name()) + .eq(InspectionPlan::getPlanStatus, CommonConstant.STATUS_1) + .eq(InspectionPlan::getDelFlag, CommonConstant.DEL_FLAG_0)).stream().findFirst().orElse(null); + if (inspectionPlan == null) { + throw new JeecgBootException("鏈壘鍒拌鐗╂枡鐨勬楠屾柟妗堬紒"); } - return materialLoadingRecordList; + List<InspectionPlanItem> inspectionPlanItemList = inspectionPlanItemService.list(new LambdaQueryWrapper<InspectionPlanItem>() + .eq(InspectionPlanItem::getPlanId, inspectionPlan.getId()) + .orderByAsc(InspectionPlanItem::getSorter)); + if (inspectionPlanItemList.isEmpty()) { + throw new JeecgBootException("鏈壘鍒拌鐗╂枡鐨勬楠屾柟妗堟楠岄」鏄庣粏锛�"); + } + //2.鐢熸垚妫�楠屽伐鍗� + //todo 妫�楠屽伐鍗曠洰鍓嶈繕娌℃湁鐢熸垚浠g爜锛屾病鏈夊姛鑳� } + } -- Gitblit v1.9.3