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