From 0da8464afe907ed91ab03eebc7613666353bd7e5 Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期三, 19 八月 2026 11:54:08 +0800
Subject: [PATCH] feat(mes): 新增工作台报工数据隔离与生产订单BPM审批动态控制

---
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java                       |    8 
 .gitignore                                                                                                                 |    5 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessServiceImpl.java                |   71 +++++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java                 |   12 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java     |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessService.java                    |   19 ++
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java                 |   14 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java   |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java               |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSubmitReqVO.java |   50 +++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java           |   13 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java             |   18 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java |    9 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackRespVO.java      |    8 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java   |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java                 |   43 ----
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java                   |    8 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/listener/MesProFeedbackStatusListener.java |   74 ++++++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java             |   77 ++++++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java                                   |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java               |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java              |    2 
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java                      |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java    |   12 +
 24 files changed, 428 insertions(+), 56 deletions(-)

diff --git a/.gitignore b/.gitignore
index a140560..d2323d7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,4 +57,7 @@
 ### Claude Code ###
 .claude/settings.local.json
 .claude/worktrees/
-.claude/scheduled_tasks.json
\ No newline at end of file
+.claude/scheduled_tasks.json
+
+graphify-out/
+.agents/
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java
index db782f7..8a78405 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java
@@ -17,6 +17,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackQuickCreateRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSubmitReqVO;
 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.MesMdWorkstationDO;
@@ -176,10 +177,9 @@
 
     @PutMapping("/submit")
     @Operation(summary = "鎻愪氦鎶ュ伐")
-    @Parameter(name = "id", description = "缂栧彿", required = true)
     @PreAuthorize("@ss.hasPermission('mes:pro-feedback:update')")
-    public CommonResult<Boolean> submitFeedback(@RequestParam("id") Long id) {
-        feedbackService.submitFeedback(id);
+    public CommonResult<Boolean> submitFeedback(@Valid @RequestBody MesProFeedbackSubmitReqVO reqVO) {
+        feedbackService.submitFeedback(reqVO);
         return success(true);
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackRespVO.java
index b86dc24..4df6e71 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackRespVO.java
@@ -169,4 +169,12 @@
     @ExcelProperty("鍒涘缓鏃堕棿")
     private LocalDateTime createTime;
 
+    @Schema(description = "BPM 娴佺▼瀹炰緥缂栧彿")
+    @ExcelProperty("BPM 娴佺▼瀹炰緥缂栧彿")
+    private String processInstanceId;
+
+    @Schema(description = "BPM 娴佺▼瀹氫箟 Key")
+    @ExcelProperty("BPM 娴佺▼瀹氫箟 Key")
+    private String processDefinitionKey;
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java
index 35a5f3c..2deb3fd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java
@@ -87,4 +87,10 @@
     @Schema(description = "澶囨敞", example = "澶囨敞")
     private String remark;
 
+    @Schema(description = "BPM 娴佺▼瀹炰緥缂栧彿")
+    private String processInstanceId;
+
+    @Schema(description = "BPM 娴佺▼瀹氫箟 Key")
+    private String processDefinitionKey;
+
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSubmitReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSubmitReqVO.java
new file mode 100644
index 0000000..88b6f76
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSubmitReqVO.java
@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎶ュ伐鎻愪氦 Request VO")
+@Data
+public class MesProFeedbackSubmitReqVO {
+
+    @Schema(description = "鎶ュ伐鍗曠紪鍙�", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "鎶ュ伐鍗旾D涓嶈兘涓虹┖")
+    private Long id;
+
+    @Schema(description = "鐢熶骇鏃ユ湡")
+    private LocalDateTime produceDate;
+
+    @Schema(description = "杩囨湡鏃ユ湡")
+    private LocalDateTime expireDate;
+
+    @Schema(description = "鍏ュ簱鏃ユ湡")
+    private LocalDateTime receiptDate;
+
+    @Schema(description = "渚涘簲鍟咺D")
+    private Long vendorId;
+
+    @Schema(description = "瀹㈡埛ID")
+    private Long clientId;
+
+    @Schema(description = "閲囪喘璁㈠崟缂栧彿")
+    private String purchaseOrderCode;
+
+    @Schema(description = "閿�鍞鍗曠紪鍙�")
+    private String salesOrderCode;
+
+    @Schema(description = "宸ュ叿ID")
+    private Long toolId;
+
+    @Schema(description = "妯″叿ID")
+    private Long moldId;
+
+    @Schema(description = "鐢熶骇鎵瑰彿")
+    private String lotNumber;
+
+    @Schema(description = "璐ㄩ噺鐘舵��")
+    private Integer qualityStatus;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java
index 8b1e52f..17f18e6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java
@@ -140,4 +140,6 @@
     @Schema(description = "鎸囧畾鎶ュ伐浜哄憳濮撳悕闆嗗悎")
     private List<String> assigneeUserNames;
 
+    @Schema(description = "鏄惁鎶ュ伐瀹℃壒")
+    private Boolean feedbackApprove;
 }
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..37ab219 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
@@ -113,6 +113,13 @@
         return success(new PageResult<>(buildWorkOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
     }
 
+    @GetMapping("/approve-process-list")
+    @Operation(summary = "鑾峰彇瀹℃壒鎶ュ伐鐨勬祦绋嬪畾涔夊垪琛�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')")
+    public CommonResult<List<Map<String, Object>>> getWorkOrderApproveProcessDefinitionList() {
+        return success(workOrderService.getWorkOrderApproveProcessDefinitionList());
+    }
+
     @GetMapping("/schedule-page")
     @Operation(summary = "鑾峰緱鐢熶骇宸ュ崟璋冨害鐘舵�佸垎椤�")
     @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java
index beb178f..714bf36 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java
@@ -145,4 +145,16 @@
     @ExcelProperty("鐢熶骇鐘舵��")
     private Integer productionStatus;
 
+    @Schema(description = "鏄惁鎶ュ伐瀹℃壒")
+    @ExcelProperty("鏄惁鎶ュ伐瀹℃壒")
+    private Boolean feedbackApprove;
+
+    @Schema(description = "BPM 娴佺▼瀹氫箟 Key")
+    @ExcelProperty("BPM 娴佺▼瀹氫箟 Key")
+    private String processDefinitionKey;
+
+    @Schema(description = "鎶ュ伐瑙掕壊 (澶氫釜瑙掕壊閫楀彿鍒嗛殧)")
+    @ExcelProperty("鎶ュ伐瑙掕壊")
+    private String feedbackRole;
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java
index b8527bc..a41d1f1 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderSaveReqVO.java
@@ -70,4 +70,13 @@
     @Schema(description = "澶囨敞", example = "澶囨敞")
     private String remark;
 
+    @Schema(description = "鏄惁鎶ュ伐瀹℃壒")
+    private Boolean feedbackApprove;
+
+    @Schema(description = "BPM 娴佺▼瀹氫箟 Key")
+    private String processDefinitionKey;
+
+    @Schema(description = "鎶ュ伐瑙掕壊 (澶氫釜瑙掕壊閫楀彿鍒嗛殧)")
+    private String feedbackRole;
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java
index bb3cc23..bd27c07 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java
@@ -160,4 +160,14 @@
      */
     private String remark;
 
+    /**
+     * BPM 娴佺▼瀹炰緥缂栧彿
+     */
+    private String processInstanceId;
+
+    /**
+     * BPM 娴佺▼瀹氫箟 Key
+     */
+    private String processDefinitionKey;
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java
index 82cd251..85dd127 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java
@@ -8,6 +8,7 @@
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.math.BigDecimal;
@@ -148,4 +149,21 @@
      */
     private String remark;
 
+    /**
+     * 鏄惁鎶ュ伐瀹℃壒
+     */
+    @com.baomidou.mybatisplus.annotation.TableField("is_feedback_approve")
+    private Boolean feedbackApprove;
+
+    /**
+     * BPM 娴佺▼瀹氫箟 Key
+     */
+    private String processDefinitionKey;
+
+    /**
+     * 鎶ュ伐瑙掕壊 (澶氫釜瑙掕壊閫楀彿鍒嗛殧)
+     */
+    private String feedbackRole;
+
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
index dec84a2..3b683cc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -39,6 +39,7 @@
     ErrorCode MD_ITEM_BATCH_CONFIG_NOT_EXISTS = new ErrorCode(1_040_102_100, "鐗╂枡鎵规灞炴�ч厤缃笉瀛樺湪");
     ErrorCode MD_ITEM_BATCH_CONFIG_AT_LEAST_ONE_FLAG = new ErrorCode(1_040_102_101, "鎵规绠$悊宸插惎鐢紝鑷冲皯闇�瑕侀厤缃竴涓壒娆″睘鎬�");
     ErrorCode MD_ITEM_PRODUCT_BOM_REQUIRED = new ErrorCode(1_040_102_102, "浜у搧绫荤墿鏂欏惎鐢ㄥ墠锛屽繀椤婚厤缃嚦灏戜竴涓� BOM 缁勬垚");
+    ErrorCode MD_ITEM_BATCH_CONFIG_AT_LEAST_ONE_APPROVE_FLAG = new ErrorCode(1_040_102_103, "闇�瑕侀厤缃竴涓壒娆″睘鎬�,璇峰湪瀹℃壒鎰忚涓~鍐�");
 
     // ========== MES 浠撳簱绠$悊-鎵规绠$悊锛�1-040-717-000锛� ==========
     ErrorCode WM_BATCH_PRODUCE_DATE_REQUIRED = new ErrorCode(1_040_717_000, "鎵规閰嶇疆瑕佹眰鐢熶骇鏃ユ湡涓嶈兘涓虹┖");
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessService.java
new file mode 100644
index 0000000..8771e8d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessService.java
@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.mes.service.common.bpm;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * MES 妯″潡鐨勯�氱敤 BPM 娴佺▼澶勭悊 Service 鎺ュ彛
+ */
+public interface MesBpmProcessService {
+
+    /**
+     * 鑾峰彇鎸囧畾鍒嗙被涓嬬殑婵�娲荤姸鎬併�佹渶鏂扮増鏈殑娴佺▼瀹氫箟鍒楄〃
+     *
+     * @param categoryCode 娴佺▼鍒嗙被缂栫爜
+     * @return 娴佺▼瀹氫箟鍒楄〃锛屽寘鍚� id, key, name
+     */
+    List<Map<String, Object>> getApproveProcessDefinitionList(String categoryCode);
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessServiceImpl.java
new file mode 100644
index 0000000..13055df
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/common/bpm/MesBpmProcessServiceImpl.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.mes.service.common.bpm;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.*;
+
+/**
+ * MES 妯″潡鐨勯�氱敤 BPM 娴佺▼澶勭悊 Service 瀹炵幇绫�
+ */
+@Service
+@Validated
+@Slf4j
+public class MesBpmProcessServiceImpl implements MesBpmProcessService {
+
+    @Resource
+    private BpmCategoryService bpmCategoryService;
+    @Resource
+    private BpmProcessDefinitionService bpmProcessDefinitionService;
+
+    @Override
+    public List<Map<String, Object>> getApproveProcessDefinitionList(String categoryCode) {
+        // 1. 鏍¢獙鍒嗙被鏄惁瀛樺湪
+        List<BpmCategoryDO> categories = bpmCategoryService.getCategoryListByCode(
+                Collections.singletonList(categoryCode));
+        if (CollUtil.isEmpty(categories)) {
+            log.warn("[getApproveProcessDefinitionList] BPM 娴佺▼鍒嗙被 {} 涓嶅瓨鍦�", categoryCode);
+            return Collections.emptyList();
+        }
+
+        // 2. 鑾峰彇鍒嗙被涓嬬殑娴佺▼瀹氫箟淇℃伅
+        List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService
+                .getProcessDefinitionInfoListByCategory(categoryCode);
+        if (CollUtil.isEmpty(definitionInfoList)) {
+            return Collections.emptyList();
+        }
+
+        // 3. 杩囨护婵�娲荤姸鎬侊紝淇濈暀鏈�鏂扮増鏈�
+        Map<String, ProcessDefinition> latestVersionMap = new HashMap<>();
+        for (BpmProcessDefinitionInfoDO info : definitionInfoList) {
+            ProcessDefinition pd = bpmProcessDefinitionService.getProcessDefinition(info.getProcessDefinitionId());
+            if (pd == null || pd.isSuspended()) {
+                continue;
+            }
+            ProcessDefinition existing = latestVersionMap.get(pd.getKey());
+            if (existing == null || pd.getVersion() > existing.getVersion()) {
+                latestVersionMap.put(pd.getKey(), pd);
+            }
+        }
+
+        // 4. 杩斿洖娴佺▼瀹氫箟鍒楄〃
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (ProcessDefinition pd : latestVersionMap.values()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("id", pd.getId());
+            item.put("key", pd.getKey());
+            item.put("name", pd.getName());
+            result.add(item);
+        }
+        return result;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
index 6648c60..2eacc3f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
@@ -7,8 +7,7 @@
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
-import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
-import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
+import cn.iocoder.yudao.module.mes.service.common.bpm.MesBpmProcessService;
 import cn.iocoder.yudao.module.mes.controller.admin.pd.project.vo.MesPdProjectPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pd.project.vo.MesPdProjectSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pd.document.MesPdDocumentDO;
@@ -80,10 +79,7 @@
     private BpmProcessInstanceApi processInstanceApi;
 
     @Resource
-    private BpmCategoryService bpmCategoryService;
-
-    @Resource
-    private BpmProcessDefinitionService bpmProcessDefinitionService;
+    private MesBpmProcessService mesBpmProcessService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -238,40 +234,7 @@
 
     @Override
     public List<Map<String, Object>> getProjectApproveProcessDefinitionList() {
-        // 1. 鏍¢獙鍒嗙被鏄惁瀛樺湪
-        List<BpmCategoryDO> categories = bpmCategoryService.getCategoryListByCode(
-                Collections.singletonList(BPM_PROCESS_DEFINITION_CATEGORY_CODE));
-        if (CollUtil.isEmpty(categories)) {
-            throw exception(PD_PROJECT_BPM_CATEGORY_NOT_EXISTS);
-        }
-        // 2. 鑾峰彇鍒嗙被涓嬬殑娴佺▼瀹氫箟淇℃伅
-        List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService
-                .getProcessDefinitionInfoListByCategory(BPM_PROCESS_DEFINITION_CATEGORY_CODE);
-        if (CollUtil.isEmpty(definitionInfoList)) {
-            return Collections.emptyList();
-        }
-        // 3. 杩囨护婵�娲荤姸鎬侊紝淇濈暀鏈�鏂扮増鏈�
-        Map<String, ProcessDefinition> latestVersionMap = new HashMap<>();
-        for (BpmProcessDefinitionInfoDO info : definitionInfoList) {
-            ProcessDefinition pd = bpmProcessDefinitionService.getProcessDefinition(info.getProcessDefinitionId());
-            if (pd == null || pd.isSuspended()) {
-                continue;
-            }
-            ProcessDefinition existing = latestVersionMap.get(pd.getKey());
-            if (existing == null || pd.getVersion() > existing.getVersion()) {
-                latestVersionMap.put(pd.getKey(), pd);
-            }
-        }
-        // 4. 杩斿洖娴佺▼瀹氫箟鍒楄〃
-        List<Map<String, Object>> result = new ArrayList<>();
-        for (ProcessDefinition pd : latestVersionMap.values()) {
-            Map<String, Object> item = new HashMap<>();
-            item.put("id", pd.getId());
-            item.put("key", pd.getKey());
-            item.put("name", pd.getName());
-            result.add(item);
-        }
-        return result;
+        return mesBpmProcessService.getApproveProcessDefinitionList(BPM_PROCESS_DEFINITION_CATEGORY_CODE);
     }
 
     @Override
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java
index 05d2a48..c744afe 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java
@@ -81,9 +81,9 @@
     /**
      * 鎻愪氦鎶ュ伐锛堣崏绋� 鈫� 瀹℃壒涓級
      *
-     * @param id 缂栧彿
+     * @param reqVO 鎻愪氦璇锋眰
      */
-    void submitFeedback(Long id);
+    void submitFeedback(@Valid MesProFeedbackSubmitReqVO reqVO);
 
     /**
      * 椹冲洖鎶ュ伐锛堝鎵逛腑 鈫� 鑽夌锛�
@@ -122,6 +122,14 @@
     MesProFeedbackBatchCheckRespVO checkBatchRequirements(Long feedbackId);
 
     /**
+     * 澶勭悊 BPM 瀹℃壒缁撴灉
+     *
+     * @param id 鎶ュ伐鍗旾D
+     * @param bpmResult 瀹℃壒缁撴灉鐘舵��
+     */
+    void handleBpmProcessResult(Long id, Integer bpmResult,String reason);
+
+    /**
      * IPQC 瀹屾垚鍚庡洖璋冿細瀹屾垚鎶ュ伐鍗曞苟鏇存柊浠诲姟/宸ュ崟杩涘害
      *
      * <p>鐢� IPQC 妫�楠屽畬鎴愭椂璋冪敤锛屽皢鎶ュ伐鍗曠姸鎬佷粠寰呮楠屾敼涓哄凡瀹屾垚锛�
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
index d5401e9..3d3022f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -4,6 +4,7 @@
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.*;
@@ -62,6 +63,7 @@
  */
 @Service
 @Validated
+@lombok.extern.slf4j.Slf4j
 public class MesProFeedbackServiceImpl implements MesProFeedbackService {
 
     @Resource
@@ -94,6 +96,8 @@
     private MesMdmItemService mdmItemService;
     @Resource
     private MdmItemBatchConfigApi itemBatchConfigApi;
+    @Resource
+    private cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi processInstanceApi;
 
     @Override
     public Long createFeedback(MesProFeedbackSaveReqVO createReqVO) {
@@ -154,13 +158,76 @@
     }
 
     @Override
-    public void submitFeedback(Long id) {
+    @Transactional(rollbackFor = Exception.class)
+    public void submitFeedback(MesProFeedbackSubmitReqVO reqVO) {
+        Long id = reqVO.getId();
         // 1. 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
-        validateFeedbackStatusPrepare(id);
+        MesProFeedbackDO feedback = validateFeedbackStatusPrepare(id);
 
-        // 2. 鏇存柊鐘舵�佷负瀹℃壒涓紙鎶ュ伐浜哄拰鎶ュ伐鏃堕棿鐢辫〃鍗曚繚瀛樻椂纭畾锛屾彁浜や笉瑕嗙洊锛�
-        feedbackMapper.updateById(new MesProFeedbackDO().setId(id)
-                .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()));
+        MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId());
+
+        if (workOrder != null && Boolean.TRUE.equals(workOrder.getFeedbackApprove()) && cn.hutool.core.util.StrUtil.isNotBlank(workOrder.getProcessDefinitionKey())) {
+            // 2. 鏇存柊鐘舵�佷负瀹℃壒涓紝骞跺惎鍔ㄦ祦绋�
+            String processInstanceId = processInstanceApi.createProcessInstance(cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId(),
+                    new cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO()
+                            .setProcessDefinitionKey(workOrder.getProcessDefinitionKey())
+                            .setBusinessKey(String.valueOf(id)));
+
+            feedbackMapper.updateById(new MesProFeedbackDO().setId(id)
+                    .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())
+                    .setProcessDefinitionKey(workOrder.getProcessDefinitionKey())
+                    .setProcessInstanceId(processInstanceId));
+        } else {
+            // 2. 鍒ゆ柇杩欎釜鎶ュ伐闇�涓嶉渶瑕佹壒娆″彿
+            MesProFeedbackBatchCheckRespVO mesProFeedbackBatchCheckRespVO = checkBatchRequirements(id);
+            if (mesProFeedbackBatchCheckRespVO.getNeedBatchInput()) {
+                if (StrUtil.isBlank(reqVO.getLotNumber())) {
+                    throw exception(MD_ITEM_BATCH_CONFIG_AT_LEAST_ONE_APPROVE_FLAG);
+                }
+            }
+
+            // 3. 鏇存柊鐘舵�佷负瀹℃壒涓紝鐒跺悗鐩存帴閫氳繃瀹℃壒
+            feedbackMapper.updateById(new MesProFeedbackDO().setId(id)
+                    .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()));
+            MesProFeedbackApproveReqVO approveReqVO = cn.iocoder.yudao.framework.common.util.object.BeanUtils.toBean(reqVO, MesProFeedbackApproveReqVO.class);
+            approveFeedback(approveReqVO);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handleBpmProcessResult(Long id, Integer bpmResult,String reason) {
+        // 1. 鏌旀�ф牎楠岋細鑾峰彇鎶ュ伐鍗曞苟鍒ゆ柇鐘舵��
+        MesProFeedbackDO feedback = feedbackMapper.selectById(id);
+        if (feedback == null) {
+            log.warn("[handleBpmProcessResult] 鐢熶骇鎶ュ伐({}) 涓嶅瓨鍦�", id);
+            return;
+        }
+        if (!MesProFeedbackStatusEnum.APPROVING.getStatus().equals(feedback.getStatus())) {
+            log.warn("[handleBpmProcessResult] 鐢熶骇鎶ュ伐({}) 涓嶅浜庡鎵逛腑鐘舵�侊紝褰撳墠鐘舵�侊細{}", id, feedback.getStatus());
+            return;
+        }
+
+        // 2. 鏍规嵁瀹℃壒缁撴灉杩涜澶勭悊
+        if (cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(bpmResult)) {
+            MesProFeedbackApproveReqVO  reqVO = new MesProFeedbackApproveReqVO();
+            reqVO.setId(id);
+            //  鍒ゆ柇杩欎釜鎶ュ伐闇�涓嶉渶瑕佹壒娆″彿
+            MesProFeedbackBatchCheckRespVO mesProFeedbackBatchCheckRespVO = checkBatchRequirements(id);
+            if (mesProFeedbackBatchCheckRespVO.getNeedBatchInput()){
+               if (StrUtil.isBlank(reason)){
+                   //  鎶ラ敊 璇峰湪瀹℃壒鎰忚閲屽~鍐欐壒娆″彿
+                   throw  exception(MD_ITEM_BATCH_CONFIG_AT_LEAST_ONE_APPROVE_FLAG);
+               }else {
+                 BeanUtils.copyProperties(mesProFeedbackBatchCheckRespVO,reqVO);
+                 reqVO.setLotNumber(reason);
+               }
+            }
+            approveFeedback(reqVO);
+        } else if (cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(bpmResult) ||
+                   cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.CANCEL.getStatus().equals(bpmResult)) {
+            rejectFeedback(id);
+        }
     }
 
     @Override
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/listener/MesProFeedbackStatusListener.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/listener/MesProFeedbackStatusListener.java
new file mode 100644
index 0000000..9156eeb
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/listener/MesProFeedbackStatusListener.java
@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.mes.service.pro.feedback.listener;
+
+import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
+import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
+import cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackService;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
+import org.flowable.task.api.history.HistoricTaskInstance;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * 鐢熶骇鎶ュ伐瀹℃壒鐘舵�佺洃鍚櫒
+ *
+ * 鐩戝惉 BPM 娴佺▼瀹炰緥鐘舵�佸彉鏇翠簨浠讹紝鏇存柊鐢熶骇鎶ュ伐鐨勫鎵圭姸鎬�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Component
+@Slf4j
+public class MesProFeedbackStatusListener extends BpmProcessInstanceStatusEventListener {
+
+    /**
+     * BPM 鐢熶骇鎶ュ伐瀹℃壒娴佺▼瀹氫箟 key
+     */
+    private static final String BPM_PROCESS_DEFINITION_KEY = "mes-pro-feedback-audit";
+
+    @Resource
+    private MesProFeedbackService feedbackService;
+
+    @Resource
+    private BpmTaskService bpmTaskService;
+
+    @Override
+    protected String getProcessDefinitionKey() {
+        return BPM_PROCESS_DEFINITION_KEY;
+    }
+
+    @Override
+    protected void onEvent(BpmProcessInstanceStatusEvent event) {
+        Long feedbackId;
+        try {
+            feedbackId = Long.parseLong(event.getBusinessKey());
+        } catch (NumberFormatException e) {
+            log.warn("[onEvent] businessKey({}) 涓嶆槸鏈夋晥鐨勭敓浜ф姤宸ョ紪鍙�", event.getBusinessKey());
+            return;
+        }
+        String reason = event.getReason();
+        if (StrUtil.isEmpty(reason) && event.getId() != null) {
+            // 褰� event.getReason() 涓虹┖鏃讹紝灏濊瘯浠庢渶鍚庝竴涓畬鎴愮殑浠诲姟涓幏鍙栧鎵规剰瑙�
+            List<HistoricTaskInstance> tasks = bpmTaskService.getTaskListByProcessInstanceId(event.getId(), false);
+            if (CollUtil.isNotEmpty(tasks)) {
+                HistoricTaskInstance lastTask = tasks.stream()
+                        .filter(task -> task.getEndTime() != null)
+                        .max(Comparator.comparing(HistoricTaskInstance::getEndTime))
+                        .orElse(null);
+                if (lastTask != null && lastTask.getTaskLocalVariables() != null) {
+                    reason = (String) lastTask.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_REASON);
+                }
+            }
+        }
+
+        log.info("[onEvent] 鏀跺埌BPM瀹℃壒浜嬩欢锛宖eedbackId={}, status={},Reason={}", feedbackId, event.getStatus(), reason);
+
+        feedbackService.handleBpmProcessResult(feedbackId, event.getStatus(), reason);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java
index 08c4657..04d890d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java
@@ -67,6 +67,13 @@
     MesProWorkOrderDO getWorkOrder(String code);
 
     /**
+     * 鑾峰彇瀹℃壒鎶ュ伐鐨勬祦绋嬪畾涔夊垪琛�
+     *
+     * @return 娴佺▼瀹氫箟鍒楄〃锛屽寘鍚� id, key, name
+     */
+    List<Map<String, Object>> getWorkOrderApproveProcessDefinitionList();
+
+    /**
      * 鑾峰緱鐢熶骇宸ュ崟鍒嗛〉
      *
      * @param pageReqVO 鍒嗛〉鏌ヨ
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java
index c4cb972..eee7b86 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java
@@ -13,6 +13,7 @@
 import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.common.bpm.MesBpmProcessService;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderProgressRespVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
@@ -46,6 +47,11 @@
 @Service
 @Validated
 public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
+
+    @Resource
+    private MesBpmProcessService mesBpmProcessService;
+
+    private static final String BPM_PROCESS_DEFINITION_CATEGORY_CODE = "mes_pro_feedback_audit";
 
     @Resource
     private MesProWorkOrderMapper workOrderMapper;
@@ -150,6 +156,13 @@
     }
 
     @Override
+    public List<Map<String, Object>> getWorkOrderApproveProcessDefinitionList() {
+        return mesBpmProcessService.getApproveProcessDefinitionList(BPM_PROCESS_DEFINITION_CATEGORY_CODE);
+    }
+
+
+
+    @Override
     public MesProWorkOrderDO getWorkOrder(Long id) {
         return workOrderMapper.selectById(id);
     }
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
index cb63401..9212aaf 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
@@ -157,15 +157,19 @@
     }
 
     @GetMapping("/list-by-role-code")
-    @Operation(summary = "閫氳繃瑙掕壊鏍囪瘑鑾峰彇鐢ㄦ埛绮剧畝淇℃伅鍒楄〃", description = "鍙寘鍚嫢鏈夎瑙掕壊鐨勭敤鎴凤紝涓昏鐢ㄤ簬鍓嶇鐨勪笅鎷夐�夐」")
-    @Parameter(name = "code", description = "瑙掕壊鏍囪瘑", required = true, example = "admin")
+    @Operation(summary = "閫氳繃瑙掕壊鏍囪瘑鑾峰彇鐢ㄦ埛绮剧畝淇℃伅鍒楄〃", description = "鍙寘鍚嫢鏈夎繖浜涜鑹茬殑鐢ㄦ埛锛屼富瑕佺敤浜庡墠绔殑涓嬫媺閫夐」銆傛敮鎸侀�楀彿鍒嗛殧鐨勫涓鑹叉爣璇�")
+    @Parameter(name = "code", description = "瑙掕壊鏍囪瘑锛屾敮鎸佸涓紝閫楀彿鍒嗛殧", required = true, example = "admin,user")
     public CommonResult<List<UserSimpleRespVO>> getSimpleUserListByRoleCode(
             @RequestParam("code") String code) {
-        RoleDO role = roleService.getRoleByCode(code);
-        if (role == null) {
+        if (StrUtil.isBlank(code)) {
             return success(Collections.emptyList());
         }
-        Set<Long> userIds = permissionService.getUserRoleIdListByRoleId(Collections.singleton(role.getId()));
+        List<String> codes = StrUtil.split(code, ",");
+        List<RoleDO> roles = roleService.getRoleListByCodes(codes);
+        if (CollUtil.isEmpty(roles)) {
+            return success(Collections.emptyList());
+        }
+        Set<Long> userIds = permissionService.getUserRoleIdListByRoleId(convertList(roles, RoleDO::getId));
         if (CollUtil.isEmpty(userIds)) {
             return success(Collections.emptyList());
         }
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java
index 902ff90..a9fd004 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMapper.java
@@ -32,6 +32,10 @@
         return selectOne(RoleDO::getCode, code);
     }
 
+    default List<RoleDO> selectListByCodes(Collection<String> codes) {
+        return selectList(RoleDO::getCode, codes);
+    }
+
     default List<RoleDO> selectListByStatus(@Nullable Collection<Integer> statuses) {
         return selectList(RoleDO::getStatus, statuses);
     }
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java
index 30e17cf..fddb9dc 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java
@@ -73,6 +73,14 @@
     RoleDO getRoleByCode(String code);
 
     /**
+     * 鑾峰緱瑙掕壊鍒楄〃
+     *
+     * @param codes 瑙掕壊缂栫爜鏁扮粍
+     * @return 瑙掕壊鍒楄〃
+     */
+    List<RoleDO> getRoleListByCodes(Collection<String> codes);
+
+    /**
      * 鑾峰緱瑙掕壊锛屼粠缂撳瓨涓�
      *
      * @param id 瑙掕壊缂栧彿
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
index 345c418..32ccf51 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
@@ -195,6 +195,14 @@
     }
 
     @Override
+    public List<RoleDO> getRoleListByCodes(Collection<String> codes) {
+        if (CollUtil.isEmpty(codes)) {
+            return Collections.emptyList();
+        }
+        return roleMapper.selectListByCodes(codes);
+    }
+
+    @Override
     @Cacheable(value = RedisKeyConstants.ROLE, key = "#id",
             unless = "#result == null")
     public RoleDO getRoleFromCache(Long id) {

--
Gitblit v1.9.3