From 7bd10d34e8a8dc2437ec8551eb511e37634d7306 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 02 十一月 2026 16:51:52 +0800
Subject: [PATCH] feat(mes): 生产计划审批改走协同办公,修复工单领料与产成品入库校验
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java | 90 +++++++++++++++++++++++++++++++--------------
1 files changed, 62 insertions(+), 28 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 b6233cd..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,23 +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.enums.pro.MesProWorkOrderProductionStatusEnum;
+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;
@@ -68,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 = "鍒涘缓鐢熶骇宸ュ崟")
@@ -96,7 +108,6 @@
@GetMapping("/get")
@Operation(summary = "鑾峰緱鐢熶骇宸ュ崟")
@Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')")
public CommonResult<MesProWorkOrderRespVO> getWorkOrder(@RequestParam("id") Long id) {
MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(id);
if (workOrder == null) {
@@ -107,15 +118,19 @@
@GetMapping("/page")
@Operation(summary = "鑾峰緱鐢熶骇宸ュ崟鍒嗛〉")
- @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')")
public CommonResult<PageResult<MesProWorkOrderRespVO>> getWorkOrderPage(@Valid MesProWorkOrderPageReqVO pageReqVO) {
PageResult<MesProWorkOrderDO> pageResult = workOrderService.getWorkOrderPage(pageReqVO);
return success(new PageResult<>(buildWorkOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
}
+ @GetMapping("/approve-process-list")
+ @Operation(summary = "鑾峰彇瀹℃壒鎶ュ伐鐨勬祦绋嬪畾涔夊垪琛�")
+ public CommonResult<List<Map<String, Object>>> getWorkOrderApproveProcessDefinitionList() {
+ return success(workOrderService.getWorkOrderApproveProcessDefinitionList());
+ }
+
@GetMapping("/schedule-page")
@Operation(summary = "鑾峰緱鐢熶骇宸ュ崟璋冨害鐘舵�佸垎椤�")
- @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')")
public CommonResult<PageResult<MesProWorkOrderRespVO>> getWorkOrderSchedulePage(@Valid MesProWorkOrderPageReqVO pageReqVO) {
PageResult<MesProWorkOrderDO> pageResult = workOrderService.getWorkOrderSchedulePage(pageReqVO);
return success(new PageResult<>(buildWorkOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
@@ -142,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)
@@ -163,7 +200,6 @@
@GetMapping("/progress/{id}")
@Operation(summary = "鑾峰彇宸ュ崟杩涘害璇︽儏")
@Parameter(name = "id", description = "缂栧彿", required = true)
- @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')")
public CommonResult<MesProWorkOrderProgressRespVO> getWorkOrderProgress(@PathVariable("id") Long id) {
return success(workOrderService.getWorkOrderProgress(id));
}
@@ -196,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);
@@ -221,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;
@@ -230,15 +279,16 @@
vo.setCompletionProgress(produced.compareTo(BigDecimal.ZERO) > 0 ? new BigDecimal("100.00") : BigDecimal.ZERO);
}
- // 璁$畻杩涘害鍜岀姸鎬�
+ // 璁$畻宸ュ簭杩涘害
List<MesProWorkOrderProcessDO> processes = woProcessMap.getOrDefault(vo.getId(), Collections.emptyList());
List<MesProTaskDO> tasks = woTaskMap.getOrDefault(vo.getId(), Collections.emptyList());
-
+
List<MesProWorkOrderProcessProgressVO> progressList = new ArrayList<>();
- boolean allCompleted = !processes.isEmpty();
- boolean anyStarted = false;
-
- 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());
@@ -256,25 +306,9 @@
progressVO.setProgress(totalProduced.compareTo(BigDecimal.ZERO) > 0 ? new BigDecimal("100.00") : BigDecimal.ZERO);
}
progressList.add(progressVO);
-
- if (totalProduced.compareTo(BigDecimal.ZERO) > 0) {
- anyStarted = true;
- }
- if (totalQty.compareTo(BigDecimal.ZERO) == 0 || totalProduced.compareTo(totalQty) < 0) {
- allCompleted = false;
- }
}
-
+
vo.setProcessProgressList(progressList);
- if (processes.isEmpty()) {
- vo.setProductionStatus(MesProWorkOrderProductionStatusEnum.WAITING.getStatus()); // 寰呯敓浜�
- } else if (allCompleted) {
- vo.setProductionStatus(MesProWorkOrderProductionStatusEnum.FINISHED.getStatus()); // 鐢熶骇瀹屾垚
- } else if (anyStarted) {
- vo.setProductionStatus(MesProWorkOrderProductionStatusEnum.PRODUCING.getStatus()); // 鐢熶骇涓�
- } else {
- vo.setProductionStatus(MesProWorkOrderProductionStatusEnum.WAITING.getStatus()); // 寰呯敓浜�
- }
});
}
--
Gitblit v1.9.3