From 97f048ce14db07ee41ca05f9c7010dfe132150e4 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 03 十一月 2026 11:06:59 +0800
Subject: [PATCH] feat(mes): 补生产准备检查与仓储收发存汇总接口,附 CFWJ 演示数据种子脚本

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 52 insertions(+), 1 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java
index 60714d3..1aa9a97 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java
@@ -12,22 +12,29 @@
 import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
 import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.*;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.factory.MesMdFactoryDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
+import cn.iocoder.yudao.module.mes.service.md.factory.MesMdFactoryService;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkshopService;
 import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
 import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
 import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
@@ -67,6 +74,12 @@
     private MesProTaskService taskService;
     @Resource
     private MesProProcessService processService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private MesMdFactoryService factoryService;
+    @Resource
+    private MesMdWorkshopService workshopService;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓鐢熶骇宸ュ崟")
@@ -144,6 +157,28 @@
         return success(true);
     }
 
+    @PutMapping("/update-batch")
+    @Operation(summary = "鏇存柊宸ュ崟鐢熶骇鎵规", description = "鏈畬宸ョ殑宸ュ崟锛堝惈鐢熶骇涓級閮藉彲浠ョ淮鎶ゆ壒娆″彿")
+    @Parameters({
+            @Parameter(name = "id", description = "缂栧彿", required = true),
+            @Parameter(name = "batchCode", description = "鎵规鍙�", required = true)
+    })
+    @PreAuthorize("@ss.hasPermission('mes:pro-work-order:update')")
+    public CommonResult<Boolean> updateWorkOrderBatch(@RequestParam("id") Long id,
+                                                      @RequestParam("batchCode") String batchCode) {
+        workOrderService.updateWorkOrderBatch(id, batchCode);
+        return success(true);
+    }
+
+    @PutMapping("/start")
+    @Operation(summary = "鍚姩鐢熶骇", description = "宸茬‘璁ゅ伐鍗曞紑宸ワ紝鍐欏叆瀹為檯寮�宸ユ椂闂达紝宸ュ崟杩涘叆鐢熶骇涓�")
+    @Parameter(name = "id", description = "缂栧彿", required = true)
+    @PreAuthorize("@ss.hasPermission('mes:pro-work-order:update')")
+    public CommonResult<Boolean> startWorkOrder(@RequestParam("id") Long id) {
+        workOrderService.startWorkOrder(id);
+        return success(true);
+    }
+
     @PutMapping("/finish")
     @Operation(summary = "瀹屾垚宸ュ崟")
     @Parameter(name = "id", description = "缂栧彿", required = true)
@@ -197,6 +232,12 @@
                 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
         Map<Long, MesProWorkOrderDO> parentMap = workOrderService.getWorkOrderMap(
                 convertSet(list, MesProWorkOrderDO::getParentId));
+        Map<Long, MesMdFactoryDO> factoryMap = factoryService.getFactoryMap(
+                convertSet(list, MesProWorkOrderDO::getFactoryId));
+        Map<Long, MesMdWorkshopDO> workshopMap = workshopService.getWorkshopMap(
+                convertSet(list, MesProWorkOrderDO::getWorkshopId));
+        Map<Long, AdminUserRespDTO> startUserMap = adminUserApi.getUserMap(
+                convertSet(list, MesProWorkOrderDO::getStartUserId));
                 
         // 鑾峰彇鎵�鏈夊叧鑱旂殑宸ュ崟宸ュ簭鍜屼换鍔�
         List<MesProWorkOrderProcessDO> allProcesses = workOrderProcessService.getWorkOrderProcessListByWorkOrderIds(workOrderIds);
@@ -222,6 +263,13 @@
                     supplier -> vo.setVendorName(supplier.getName()));
             MapUtils.findAndThen(parentMap, vo.getParentId(),
                     parent -> vo.setParentCode(parent.getCode()));
+            MapUtils.findAndThen(factoryMap, vo.getFactoryId(),
+                    factory -> vo.setFactoryName(factory.getName()));
+            MapUtils.findAndThen(workshopMap, vo.getWorkshopId(),
+                    workshop -> vo.setWorkshopName(workshop.getName()));
+            MapUtils.findAndThen(startUserMap, vo.getStartUserId(),
+                    user -> vo.setStartUserName(user.getNickname()));
+            vo.setStarted(vo.getActualStartTime() != null);
 
             // 璁$畻瀹屽伐杩涘害 (quantityProduced / quantity * 100)
             BigDecimal produced = vo.getQuantityProduced() != null ? vo.getQuantityProduced() : BigDecimal.ZERO;
@@ -237,7 +285,10 @@
 
             List<MesProWorkOrderProcessProgressVO> progressList = new ArrayList<>();
 
-            Map<Long, List<MesProTaskDO>> processTaskMap = convertMultiMap(tasks, MesProTaskDO::getProcessId);
+            // 鏈厤缃伐搴忕殑鍗曞伐搴忎换鍔� processId 涓虹┖锛屽垎缁勫墠鍏堣繃婊わ紝閬垮厤 null key 鎶� NPE
+            Map<Long, List<MesProTaskDO>> processTaskMap = convertMultiMap(
+                    tasks.stream().filter(task -> task.getProcessId() != null).toList(),
+                    MesProTaskDO::getProcessId);
             
             for (MesProWorkOrderProcessDO process : processes) {
                 List<MesProTaskDO> pTasks = processTaskMap.getOrDefault(process.getProcessId(), Collections.emptyList());

--
Gitblit v1.9.3