From eec479e2f3139286449005dcb05c014e4a60d255 Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期一, 18 八月 2025 16:59:25 +0800
Subject: [PATCH] 报工接口、产线线边库物料查询接口

---
 src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java                      |   12 +
 src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java        |  198 +++++++++++++++++++++++-----
 db/双林新火炬MES数据库设计.pdma.json                                                               |   24 +++
 src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java  |    3 
 src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java                      |    2 
 src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java                 |   33 ++++
 src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java                       |   15 ++
 src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java                |   47 ++++++
 src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java |   30 ++++
 src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java                       |    5 
 src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java                       |    3 
 src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java                   |    4 
 src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java                        |    2 
 src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java     |    6 
 src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java         |    3 
 src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java                         |    3 
 16 files changed, 342 insertions(+), 48 deletions(-)

diff --git "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json"
index 18fd831..1431e02 100644
--- "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json"
+++ "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json"
@@ -2,9 +2,9 @@
   "name": "鍙屾灄鏂扮伀鐐琈ES鏁版嵁搴撹璁�",
   "describe": "鎻忚堪鍙岃柂鏂扮伀鐐琈ES鏁版嵁搴撹璁¤鎯�",
   "avatar": "",
-  "version": "4.9.2",
+  "version": "4.9.4",
   "createdTime": "2025-3-10 16:38:19",
-  "updatedTime": "2025-8-15 14:58:22",
+  "updatedTime": "2025-8-18 15:02:20",
   "dbConns": [],
   "profile": {
     "default": {
@@ -632,7 +632,7 @@
       "#DDE5FF"
     ],
     "DDLToggleCase": "L",
-    "menuWidth": "364px"
+    "menuWidth": "296px"
   },
   "entities": [
     {
@@ -11555,6 +11555,24 @@
           "id": "125E1F1A-A084-4244-8D44-57D5838EE133"
         },
         {
+          "defKey": "finished_pallets",
+          "defName": "宸茬敓浜ф墭鏁�",
+          "comment": "褰撳墠鐝宸茬敓浜х殑鎵樻暟閲忥紝姣忔鎶ュ伐鏇存柊",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
+          "extProps": {},
+          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
+          "id": "A2AFA492-7799-4E1C-B2AB-A6004630C951"
+        },
+        {
           "defKey": "publisher",
           "defName": "鍙戝竷浜�",
           "comment": "",
diff --git a/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java b/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java
index 6ec4ff1..e6b7a92 100644
--- a/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java
+++ b/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java
@@ -17,5 +17,18 @@
     /**
      * 鐑鐞�
      */
-    HEATTREATMENT
+    HEATTREATMENT;
+
+    /**
+     * @param name 鏋氫妇鐨勫悕绉�
+     * @return 瀵瑰簲鐨� ProductionTypeEnum 鏋氫妇绫诲瀷锛屽鏋滄湭鎵惧埌鍒欒繑鍥� null
+     */
+    public static ProductionTypeEnum fromName(String name) {
+        for (ProductionTypeEnum typeEnum : ProductionTypeEnum.values()) {
+            if (typeEnum.name().equals(name)) {
+                return typeEnum;
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java b/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java
index 25b8af6..222c87a 100644
--- a/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java
+++ b/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java
@@ -1,5 +1,7 @@
 package org.jeecg.modules.lsw.controller;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,10 +17,14 @@
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.base.entity.Factory;
 import org.jeecg.modules.base.entity.LineSideWarehouse;
+import org.jeecg.modules.base.enums.ProductionTypeEnum;
+import org.jeecg.modules.base.service.IFactoryService;
 import org.jeecg.modules.base.service.ILineSideWarehouseService;
 import org.jeecg.modules.lsw.entity.LswMaterial;
 import org.jeecg.modules.lsw.entity.LswMaterialInventory;
+import org.jeecg.modules.lsw.enums.MaterialCategoryEnum;
 import org.jeecg.modules.lsw.service.ILswMaterialInventoryService;
 import org.jeecg.modules.lsw.service.ILswMaterialService;
 import org.jeecg.modules.lsw.vo.LswMaterialPage;
@@ -53,6 +59,8 @@
     private ILswMaterialInventoryService lswMaterialInventoryService;
     @Autowired
     private ILineSideWarehouseService lineSideWarehouseService;
+    @Autowired
+    private IFactoryService factoryService;
 
     /**
      * 鍒嗛〉鍒楄〃鏌ヨ
@@ -160,6 +168,45 @@
         return Result.OK(lswMaterialInventoryList);
     }
 
+    @AutoLog(value = "绾胯竟搴撶墿鏂欎俊鎭�-閫氳繃浜х嚎绫诲瀷鏌ヨ绾胯竟搴撶墿鏂�")
+    @ApiOperation(value = "绾胯竟搴撶墿鏂欎俊鎭�-閫氳繃浜х嚎绫诲瀷鏌ヨ绾胯竟搴撶墿鏂�", notes = "绾胯竟搴撶墿鏂欎俊鎭�-閫氳繃浜х嚎绫诲瀷鏌ヨ绾胯竟搴撶墿鏂�")
+    @GetMapping(value = "/queryLswMaterialByProductionType")
+    public Result<List<LswMaterial>> queryLswMaterialByProductionType(@RequestParam("factoryId") String factoryId) {
+        Factory factory = factoryService.getById(factoryId);
+        ProductionTypeEnum productionType = ProductionTypeEnum.fromName(factory.getProductionType());
+        List<LswMaterial> lswMaterialList = CollectionUtil.newArrayList();
+        if (productionType == null) {
+            throw new JeecgBootException("浜х嚎绫诲瀷鏈缃紝鏃犳硶鏌ヨ鐩稿簲鐗╂枡淇℃伅锛�");
+        }
+        switch (productionType) {
+            case ASSEMBLE:
+                //瑁呴厤绾匡紝鏌ヨ鎴愬搧鐗╂枡
+                lswMaterialList = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>()
+                        .eq(LswMaterial::getMaterialCategory, MaterialCategoryEnum.FINISHED_PRODUCT.name())
+                        .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0)
+                        .eq(LswMaterial::getMaterialStatus, CommonConstant.STATUS_1)
+                        .orderByAsc(LswMaterial::getMaterialNumber));
+                break;
+            case INNERFLANGE:
+                //鍐呮硶鍏版満鍔犵嚎锛屾煡璇㈠唴娉曞叞鐗╂枡
+                lswMaterialList = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>()
+                        .eq(LswMaterial::getMaterialCategory, MaterialCategoryEnum.INNER_FLANGE.name())
+                        .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0)
+                        .eq(LswMaterial::getMaterialStatus, CommonConstant.STATUS_1)
+                        .orderByAsc(LswMaterial::getMaterialNumber));
+                break;
+            case OUTERFLANGE:
+                //澶栨硶鍏版満鍔犵嚎锛屾煡璇㈠娉曞叞鐗╂枡
+                lswMaterialList = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>()
+                        .eq(LswMaterial::getMaterialCategory, MaterialCategoryEnum.OUTER_FLANGE.name())
+                        .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0)
+                        .eq(LswMaterial::getMaterialStatus, CommonConstant.STATUS_1)
+                        .orderByAsc(LswMaterial::getMaterialNumber));
+                break;
+        }
+        return Result.OK(lswMaterialList);
+    }
+
     /**
      * 瀵煎嚭excel
      *
diff --git a/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java b/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java
index 92f6e24..8827025 100644
--- a/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java
+++ b/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java
@@ -15,6 +15,7 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -81,7 +82,7 @@
 	/**鍏ュ簱鏁伴噺*/
 	@Excel(name = "鍏ュ簱鏁伴噺", width = 15)
     @ApiModelProperty(value = "鍏ュ簱鏁伴噺")
-    private Double quantity;
+    private BigDecimal quantity;
 	/**鎺ユ敹浜�*/
 	@Excel(name = "鎺ユ敹浜�", width = 15)
     @ApiModelProperty(value = "鎺ユ敹浜�")
diff --git a/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java b/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java
index 4d49942..6037d5d 100644
--- a/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java
+++ b/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java
@@ -5,6 +5,14 @@
     OUTER_FLANGE, //澶栨硶鍏�
     INNER_FLANGE, //鍐呮硶鍏�
     COMPONENTS, //閰嶄欢
-    BLANK, //姣涘澂
-    ;
+    BLANK; //姣涘澂
+
+    public static MaterialCategoryEnum fromName(String name) {
+        for (MaterialCategoryEnum category : MaterialCategoryEnum.values()) {
+            if (category.name().equals(name)) {
+                return category;
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java b/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
index c021299..2057d3b 100644
--- a/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
+++ b/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
@@ -204,10 +204,12 @@
     @GetMapping(value = "/execute")
     public Result<?> execute(@RequestParam("id") String id) {
         MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id);
-        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) {
+        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())
+                && !CommonConstant.DEFAULT_1.equals(workOrder.getCompletenessCheckFlag())
+                && !CommonConstant.DEFAULT_1.equals(workOrder.getEquipmentInspectionFlag())
+                && !CommonConstant.DEFAULT_1.equals(workOrder.getProcessInspectionFlag())) {
             return Result.error("褰撳墠宸ュ崟鐘舵�佷笉鑳芥墽琛岋紒");
         }
-        //todo 榻愬鎬ф鏌ャ�佸伐鑹虹偣妫�銆佽澶囩偣妫� 鐨勬牎楠岄�昏緫
         MesProductionWorkOrder executeOrder = new MesProductionWorkOrder()
                 .setId(id)
                 .setWorkOrderStatus(ProductionWorkOrderStatus.EXECUTING.name());
diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java b/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java
index 94e5eeb..32bd01b 100644
--- a/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java
+++ b/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java
@@ -12,6 +12,7 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -85,11 +86,11 @@
 	/**鏁伴噺*/
 	@Excel(name = "鏁伴噺", width = 15)
     @ApiModelProperty(value = "鏁伴噺")
-    private Double quantity;
+    private BigDecimal quantity;
 	/**鍓╀綑鏁伴噺*/
 	@Excel(name = "鍓╀綑鏁伴噺", width = 15)
     @ApiModelProperty(value = "鍓╀綑鏁伴噺")
-    private Double remainingQuantity;
+    private BigDecimal remainingQuantity;
     @TableField(exist = false)
     @ApiModelProperty(value = "宸ュ崟鍙�")
     private String workOrderCode;
diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java b/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java
index 252384d..a153d3a 100644
--- a/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java
+++ b/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java
@@ -116,6 +116,10 @@
 	@Excel(name = "瀹為檯鎶ュ伐鏁伴噺", width = 15)
     @ApiModelProperty(value = "瀹為檯鎶ュ伐鏁伴噺")
     private BigDecimal actualQuantity;
+    /**宸茬敓浜ф墭鏁帮紙褰撳墠鐝宸茬敓浜х殑鎵樻暟閲忥紝姣忔鎶ュ伐鏃舵洿鏂帮級*/
+    @Excel(name = "宸茬敓浜ф墭鏁�", width = 15)
+    @ApiModelProperty(value = "宸茬敓浜ф墭鏁�")
+    private Integer finishedPallets = 0;
 	/**鍙戝竷浜�*/
 	@Excel(name = "鍙戝竷浜�", width = 15)
     @ApiModelProperty(value = "鍙戝竷浜�")
diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java b/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java
index d95a708..d281e7e 100644
--- a/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java
+++ b/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java
@@ -12,6 +12,7 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -79,7 +80,7 @@
 	/**鏁伴噺*/
 	@Excel(name = "鏁伴噺", width = 15)
     @ApiModelProperty(value = "鏁伴噺")
-    private Double quantity;
+    private BigDecimal quantity;
 	/**鎶ュ伐浜�*/
 	@Excel(name = "鎶ュ伐浜�", width = 15)
     @ApiModelProperty(value = "鎶ュ伐浜�")
diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
index 2b407ff..0a788fb 100644
--- a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
@@ -77,6 +77,9 @@
                         .eq(ShiftGroup::getFactoryId, request.getFactoryId())
                         .eq(ShiftGroup::getDelFlag, CommonConstant.DEL_FLAG_0))
                 .stream().collect(Collectors.toMap(ShiftGroup::getShiftId, v1 -> v1, (v1, v2) -> v1));
+        if (shiftGroupMap.isEmpty()) {
+            throw new JeecgBootException("璇ヤ骇绾夸笅鏈缃彮缁勶紝鏃犳硶鎺掍骇锛�");
+        }
         Factory factory = factoryService.getById(request.getFactoryId());
         Map<String, Shift> shiftNameMap = new HashMap<>();
         List<Shift> shifts = shiftService.list(new LambdaQueryWrapper<Shift>()
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 3dde504..271c5aa 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
@@ -1,35 +1,54 @@
 package org.jeecg.modules.mes.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.base.entity.Factory;
 import org.jeecg.modules.base.entity.LineSideWarehouse;
 import org.jeecg.modules.base.entity.Shift;
+import org.jeecg.modules.base.entity.ShiftGroup;
 import org.jeecg.modules.base.service.IFactoryService;
 import org.jeecg.modules.base.service.ILineSideWarehouseService;
+import org.jeecg.modules.base.service.IShiftGroupService;
 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.enums.MaterialCategory;
+import org.jeecg.modules.lsw.enums.MaterialCategoryEnum;
 import org.jeecg.modules.lsw.service.ILswMaterialInboundService;
 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.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.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.sap.request.OrderLoadRequest;
+import org.jeecg.modules.sap.request.OrderReportRequest;
+import org.jeecg.modules.sap.service.OrderLoadService;
+import org.jeecg.modules.sap.service.OrderReportService;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoField;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 宸ュ崟鎶ュ伐
@@ -37,11 +56,14 @@
  * @Date:   2025-07-04
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class MesWorkReportingServiceImpl extends ServiceImpl<MesWorkReportingMapper, MesWorkReporting> implements IMesWorkReportingService {
 
     @Autowired
     private IMesProductionWorkOrderService mesProductionWorkOrderService;
+    @Autowired
+    private IMesProductionOrderService mesProductionOrderService;
     @Autowired
     private ILswMaterialService lswMaterialService;
     @Autowired
@@ -49,11 +71,23 @@
     @Autowired
     private IShiftService shiftService;
     @Autowired
+    private IShiftGroupService shiftGroupService;
+    @Autowired
     private ILineSideWarehouseService lineSideWarehouseService;
     @Autowired
     private ILswMaterialInboundService lswMaterialInboundService;
     @Autowired
+    private IMesMaterialLoadingService mesMaterialLoadingService;
+    @Autowired
+    private IPmsProcessBillMaterialsService pmsProcessBillMaterialsService;
+    @Autowired
+    private IPmsMaterialProcessService pmsMaterialProcessService;
+    @Autowired
     private ISysBusinessCodeRuleService sysBusinessCodeRuleService;
+    @Autowired
+    private OrderReportService orderReportService;
+    @Autowired
+    private OrderLoadService orderLoadService;
 
     @Override
     public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) {
@@ -66,6 +100,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void addReporting(MesWorkReporting mesWorkReporting) {
         MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId());
         if (workOrder == null) {
@@ -78,13 +113,11 @@
         if (material == null) {
             throw new JeecgBootException("鐗╂枡涓嶅瓨鍦紒");
         }
-        MaterialCategory materialCategory = MaterialCategory.fromName(material.getMaterialCategory());
+        MaterialCategoryEnum materialCategory = MaterialCategoryEnum.fromName(material.getMaterialCategory());
         if (materialCategory == null) {
             throw new JeecgBootException("鏈煡鐨勭墿鏂欑被鍨嬶紒");
         }
-        //鐢熶骇鎵规鍙�
-        String batchNumber = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingBatchNumber");
-        mesWorkReporting.setBatchNumber(batchNumber);
+
         LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper<LineSideWarehouse>()
                         .eq(LineSideWarehouse::getFactoryId, mesWorkReporting.getFactoryId())
                         .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0))
@@ -92,44 +125,137 @@
         if (lineSideWarehouse == null) {
             throw new JeecgBootException("绾胯竟浠撳簱涓嶅瓨鍦紒");
         }
-        mesWorkReporting.setWarehouseId(lineSideWarehouse.getId());
-        mesWorkReporting.setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername());
-        mesWorkReporting.setReportTime(new Date());
-        String date = DateUtil.format(new Date(), "yyMMdd");
+
+        //鐢熶骇鎵规鍙�
+        LocalDate today = LocalDate.now();
+        String yearLastTwo = today.format(DateTimeFormatter.ofPattern("yy"));
+        String dayOfYearStr = today.format(DateTimeFormatter.ofPattern("DDD"));
+        ShiftGroup shiftGroup = shiftGroupService.getById(workOrder.getGroupId());
+        int currentPallets = workOrder.getFinishedPallets() + 1;
+        String batchNumber = yearLastTwo + dayOfYearStr + shiftGroup.getGroupCode() + currentPallets;
+        mesWorkReporting.setBatchNumber(batchNumber)
+                .setWarehouseId(lineSideWarehouse.getId())
+                .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());
         switch (materialCategory) {
-            case FINISHED:
-                //鎴愬搧鎶ュ伐閫昏緫
+            case FINISHED_PRODUCT:
+                //鎴愬搧鎶ュ伐
+                productReport(mesWorkReporting, workOrder, lineSideWarehouse);
+                //鎷兼帴鎴愬搧鎶ュ伐鎵樺彿
                 String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4");
                 String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4;
                 mesWorkReporting.setPalletNumber(finishedPalletNumber);
-                //todo 鎵e噺鍐呮硶鍏帮紙瀵瑰簲鏈哄姞鍐呮硶鍏扮嚎杈瑰簱锛夈�佸娉曞叞锛堝搴旀満鍔犲娉曞叞绾胯竟搴擄級銆佸皬鍐呭湀锛堝搴旇閰嶇嚎杈瑰簱锛夊簱瀛橈紝璋冪敤SAP鎶曟枡鎺ュ彛
-                //todo 璋冪敤SAP宸ュ簭鎶ュ伐
-                //todo 鎵撳嵃鎴愬搧鎵樻爣绛俱�佹楠屾爣璇嗗崱銆佺Щ搴撳崟銆佸畬宸ユ楠屽伐鍗曪紱鍒ゆ柇鐢熶骇璁㈠崟鏄惁闇�瑕佸叧闂紙鍚堟牸鏁伴噺 = 璁㈠崟鏁伴噺锛�
+                //todo 鎵撳嵃鎴愬搧鎵樻爣绛俱�佹楠屾爣璇嗗崱銆佺Щ搴撳崟銆佸畬宸ユ楠屽伐鍗�
                 break;
-            case HALF:
-            case RAW:
-                //鍗婃垚鍝佹姤宸ラ�昏緫
-                Factory factory = factoryService.getById(mesWorkReporting.getFactoryId());
+            case INNER_FLANGE:
+            case OUTER_FLANGE:
+                //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)鎶ュ伐
+                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);
-                //todo 鎵e噺瀵瑰簲绾胯竟搴擄紙澶栨硶鍏版瘺鍧�佸唴娉曞叞姣涘澂锛夊簱瀛樺悗锛岃皟鐢⊿AP鎶曟枡鎺ュ彛
-                //todo 璋冪敤SAP宸ュ簭鎶ュ伐
-                break;
-            case PARTS:
                 break;
         }
+        //鏂板鎶ュ伐璁板綍
         save(mesWorkReporting);
-        //绾胯竟搴撳叆搴撻�昏緫
-        LswMaterialInbound lswMaterialInbound = new LswMaterialInbound()
-                .setFactoryId(mesWorkReporting.getFactoryId())
-                .setMaterialNumber(material.getMaterialNumber())
-                .setMaterialName(material.getMaterialName())
-                .setBatchNumber(batchNumber)
-                .setQuantity(mesWorkReporting.getQuantity())
-                .setWarehouseId(lineSideWarehouse.getId());
-        lswMaterialInboundService.save(lswMaterialInbound);
+        //鏇存柊鎺掍骇宸ュ崟
+        MesProductionWorkOrder productionWorkUpdateOrder = new MesProductionWorkOrder()
+                .setId(workOrder.getId())
+                .setActualQuantity(workOrder.getActualQuantity().add(mesWorkReporting.getQuantity()))
+                .setFinishedPallets(workOrder.getFinishedPallets() + 1);
+        mesProductionWorkOrderService.updateById(productionWorkUpdateOrder);
+    }
+
+    //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)銆佹垚鍝佹姤宸�
+    private void productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) {
+        //1銆佸叆搴� 鍗婃垚鍝�/鎴愬搧 鍒板搴旂嚎杈瑰簱
+        LswMaterialInbound materialInbound = new LswMaterialInbound()
+                .setFactoryId(workOrder.getFactoryId())
+                .setWarehouseId(lineSideWarehouse.getId())
+                .setMaterialNumber(workOrder.getMaterialNumber())
+                .setMaterialName(workOrder.getMaterialName())
+                .setBatchNumber(mesWorkReporting.getBatchNumber())
+                .setQuantity(mesWorkReporting.getQuantity());
+        lswMaterialInboundService.save(materialInbound);
+        //2銆佹墸鍑忎娇鐢ㄦ瘺鍧簱瀛橈紙鏇存柊涓婃枡璁板綍锛夋垨鍗婃垚鍝佺墿鏂欏簱瀛橈紙鍐呮硶鍏般�佸娉曞叞銆佸皬鍐呭湀銆侀厤浠剁瓑锛夛紝鎸夌収 鎺掍骇宸ュ崟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())
+                        .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();
+        for (String materialNumber : processBillMaterialsDetailMap.keySet()) {
+            List<MesMaterialLoading> materialLoadingRecordList = materialLoadingRecordMap.get(materialNumber);
+            if (materialLoadingRecordList.isEmpty()) {
+                throw new JeecgBootException("鏈煡璇㈠埌鐩稿簲鐗╂枡鐨勪笂鏂欒褰曪紒");
+            }
+            //璁$畻鐗╂枡鎵e噺鏁伴噺
+            ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber);
+            BigDecimal quantity = processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity());
+            List<MesMaterialLoading> updateList = deductQuantity(materialLoadingRecordList, quantity);
+            materialLoadingRecordUpdateList.addAll(updateList);
+        }
+        //鏇存柊涓婃枡璁板綍
+        mesMaterialLoadingService.updateBatchById(materialLoadingRecordUpdateList);
+        MesProductionOrder productionOrder = mesProductionOrderService.getById(mesWorkReporting.getOrderId());
+        //3銆佽皟鐢⊿AP鎶曟枡鎺ュ彛锛堟秷鑰楃殑鐗╂枡锛� OrderLoadService
+        for (String materialNumber : processBillMaterialsDetailMap.keySet()) {
+            ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber);
+            OrderLoadRequest loadRequest = new OrderLoadRequest()
+                    .setOrderCode(productionOrder.getOrderCode())
+                    .setFactoryCode(workOrder.getFactoryCode())
+                    .setMaterialNumber(materialNumber)
+                    .setWarehouseCode(lineSideWarehouse.getWarehouseCode())
+                    .setQuantity(processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity()))
+                    .setBatchNumber(mesWorkReporting.getBatchNumber())
+                    .setProductionUnit(processBillMaterialsDetailVo.getProductionUnit());
+            try {
+                orderLoadService.productionOrderLoad(loadRequest);
+            } catch (Exception e) {
+                log.error("SAP鐢熶骇璁㈠崟鎶曟枡寮傚父锛�", e);
+            }
+        }
+        //4銆佽皟鐢⊿AP宸ュ簭鎶ュ伐锛堟牴鎹敓浜ц鍗昳d鏌ヨ瀵瑰簲鐨勭墿鏂欏伐搴忥紙鍗婃垚鍝佹槸澶氫釜宸ュ簭锛屾垚鍝佸彧鏈変竴涓伐搴忥級锛屾寜鐓у伐搴忓彿浠庡皬鍒板ぇ渚濇鎸ㄤ釜鎶ュ伐锛涚洰鍓嶈�冭檻寮傛鎵ц锛� OrderReportService
+        List<PmsMaterialProcess> processList = pmsMaterialProcessService.list(new LambdaQueryWrapper<PmsMaterialProcess>()
+                .eq(PmsMaterialProcess::getOrderId, mesWorkReporting.getOrderId())
+                .orderByAsc(PmsMaterialProcess::getProcessCode));
+        for (PmsMaterialProcess process : processList) {
+            OrderReportRequest reportRequest = new OrderReportRequest()
+                    .setOrderCode(productionOrder.getOrderCode())
+                    .setFactoryCode(workOrder.getFactoryCode())
+                    .setProcessCode(process.getProcessCode())
+                    .setQualifiedQuantity(mesWorkReporting.getQuantity())
+                    .setWarehouseCode(lineSideWarehouse.getWarehouseCode())
+                    .setBatchNumber(mesWorkReporting.getBatchNumber());
+            try {
+                orderReportService.productionOrderReport(reportRequest);
+            } catch (Exception e) {
+                log.error("SAP宸ュ簭鎶ュ伐寮傚父锛�", e);
+            }
+        }
+    }
+
+    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);
+            }
+        }
+        return materialLoadingRecordList;
     }
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
index 8f4cfb3..6c63fa7 100644
--- a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
+++ b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
+import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo;
 import org.jeecg.modules.sap.dto.OrderBomDTO;
 
 import java.util.List;
@@ -39,4 +40,6 @@
      * @return
      */
     IPage<PmsProcessBillMaterials> queryPageList(Page<PmsProcessBillMaterials> page, PmsProcessBillMaterials query);
+
+    List<ProcessBillMaterialsDetailVo> queryMaterialsDetailByOrderIdAndMaterialNumber(String orderId, String materialNumber);
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
index ec90412..dc6a157 100644
--- a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
@@ -7,16 +7,21 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
+import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail;
 import org.jeecg.modules.pms.mapper.PmsProcessBillMaterialsMapper;
 import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService;
 import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
+import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo;
 import org.jeecg.modules.sap.dto.OrderBomDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.RoundingMode;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -98,4 +103,29 @@
         }
         return this.getBaseMapper().queryPageList(page, queryWrapper);
     }
+
+    @Override
+    public List<ProcessBillMaterialsDetailVo> queryMaterialsDetailByOrderIdAndMaterialNumber(String orderId, String materialNumber) {
+        //鏍规嵁鐢熶骇璁㈠崟id鍜岀墿鏂欑紪鐮佹煡璇㈣鍗旴OM
+        PmsProcessBillMaterials processBillMaterials = list(new LambdaQueryWrapper<PmsProcessBillMaterials>()
+                        .eq(PmsProcessBillMaterials::getOrderId, orderId)
+                        .eq(PmsProcessBillMaterials::getMaterialNumber, materialNumber))
+                .stream().findFirst().orElse(null);
+        if (processBillMaterials == null) {
+            throw new JeecgBootException("鏈壘鍒颁笌璇ョ墿鏂欏叧鑱旂殑璁㈠崟BOM锛�");
+        }
+        //鏌ヨ璁㈠崟BOM鏄庣粏
+        List<PmsProcessBillMaterialsDetail> processBillMaterialsDetails = processBillMaterialsDetailService.queryByMaterialId(processBillMaterials.getId());
+        List<ProcessBillMaterialsDetailVo> billMaterialsDetailList = CollectionUtil.newArrayList();
+        for (PmsProcessBillMaterialsDetail processBillMaterialsDetail : processBillMaterialsDetails) {
+            ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = new ProcessBillMaterialsDetailVo()
+                    .setMaterialNumber(processBillMaterialsDetail.getMaterialNumber())
+                    .setMaterialName(processBillMaterialsDetail.getMaterialName())
+                    .setProductionUnit(processBillMaterialsDetail.getProductionUnit())
+                    .setPerQuantity(processBillMaterialsDetail.getUsageQuantity()
+                            .divide(processBillMaterials.getProductionQuantity(), 2, RoundingMode.HALF_UP));
+            billMaterialsDetailList.add(processBillMaterialsDetailVo);
+        }
+        return billMaterialsDetailList;
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java b/src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java
new file mode 100644
index 0000000..58a60db
--- /dev/null
+++ b/src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java
@@ -0,0 +1,33 @@
+package org.jeecg.modules.pms.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Description: 鐗╂枡娓呭崟
+ * @Author: jeecg-boot
+ * @Date:   2025-07-01
+ * @Version: V1.0
+ */
+@Data
+@Accessors(chain = true)
+public class ProcessBillMaterialsDetailVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**鐗╂枡缂栫爜*/
+    @ApiModelProperty(value = "鐗╂枡缂栫爜")
+    private String materialNumber;
+	/**鐗╂枡鍚嶇О*/
+    @ApiModelProperty(value = "鐗╂枡鍚嶇О")
+    private String materialName;
+    /**鍩烘湰鍗曚綅*/
+    @ApiModelProperty(value = "鍩烘湰鍗曚綅")
+    private String productionUnit;
+	/**闇�姹傜敤閲�*/
+    @ApiModelProperty(value = "鍗曚綅鐢ㄩ噺锛堝姞宸�1浠剁殑鐢ㄩ噺锛�")
+    private BigDecimal perQuantity;
+
+}
diff --git a/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java b/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java
index af72a18..b85318d 100644
--- a/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java
+++ b/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java
@@ -1,6 +1,7 @@
 package org.jeecg.modules.sap.request;
 
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
 
@@ -8,6 +9,7 @@
  * 鎶曟枡璇锋眰鍙傛暟
  */
 @Data
+@Accessors(chain = true)
 public class OrderLoadRequest {
     /** MATNR 鐗╂枡鍙� */
     private String materialNumber;
diff --git a/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java b/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java
index 54281b5..1545d4f 100644
--- a/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java
+++ b/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java
@@ -1,6 +1,7 @@
 package org.jeecg.modules.sap.request;
 
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
 
@@ -9,6 +10,7 @@
  * 璇锋眰绫�
  */
 @Data
+@Accessors(chain = true)
 public class OrderReportRequest {
     /** I_WERKS 宸ュ巶 */
     private String factoryCode;

--
Gitblit v1.9.3