From dd69dd49c98e2d8fdd9b1c77e97923bde0d57b57 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 14 九月 2026 16:31:33 +0800
Subject: [PATCH] feat(bpm): 新增流程免审批开关,支持按流程或全局跳过 OA 审批
---
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java | 115 +++++++++++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveServiceImpl.java | 133 +++++++++++++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigPageReqVO.java | 17 +
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java | 1
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigSaveReqVO.java | 27 ++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java | 27 ++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessAutoApproveConfigDO.java | 53 +++++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigRespVO.java | 28 ++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java | 4
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessAutoApproveConfigMapper.java | 40 ++++
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveService.java | 106 ++++++++++
11 files changed, 551 insertions(+), 0 deletions(-)
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java
new file mode 100644
index 0000000..4bdf5b8
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java
@@ -0,0 +1,115 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessAutoApproveService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+/**
+ * BPM 娴佺▼鍏嶅鎵归厤缃� Controller
+ *
+ * 鐢ㄤ簬鎸夋祦绋嬫帶鍒躲�屾槸鍚﹁烦杩� OA 瀹℃壒銆嶏細寮�鍏冲紑鍚悗锛屽崟鎹彁浜ゆ椂娴佺▼鐓у父瀹炰緥鍖栵紝
+ * 浣嗘墍鏈変汉宸ュ鏍歌妭鐐圭敱寮曟搸鑷姩閫氳繃锛屼笅娓镐笟鍔″姩浣滀笉鍙楀奖鍝嶃��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Tag(name = "绠$悊鍚庡彴 - BPM 娴佺▼鍏嶅鎵归厤缃�")
+@RestController
+@RequestMapping("/bpm/process-auto-approve")
+@Validated
+public class BpmProcessAutoApproveController {
+
+ @Resource
+ private BpmProcessAutoApproveService processAutoApproveService;
+
+ @PutMapping("/update-by-key")
+ @Operation(summary = "鎸夋祦绋嬪畾涔夌殑 Key 璁剧疆鍏嶅鎵瑰紑鍏�",
+ description = "涓嶅瓨鍦ㄥ垯鏂板銆佸瓨鍦ㄥ垯鏇存柊锛屼緵娴佺▼鍒楄〃鐨勮鍐呭紑鍏崇洿鎺ヨ皟鐢�")
+ @Parameter(name = "processDefinitionKey", description = "娴佺▼瀹氫箟鐨� Key", required = true, example = "purchase_request_approve")
+ @Parameter(name = "autoApprove", description = "鏄惁鍏嶅鎵�", required = true, example = "true")
+ @Parameter(name = "remark", description = "澶囨敞", example = "璇ユ祦绋嬫殏涓嶄笂 OA")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')")
+ public CommonResult<Boolean> updateAutoApproveByKey(@RequestParam("processDefinitionKey") String processDefinitionKey,
+ @RequestParam("autoApprove") Boolean autoApprove,
+ @RequestParam(value = "remark", required = false) String remark) {
+ processAutoApproveService.updateAutoApproveByKey(processDefinitionKey, autoApprove, remark);
+ return success(true);
+ }
+
+ @PutMapping("/update-global")
+ @Operation(summary = "璁剧疆鍏ㄥ眬鍏嶅鎵规�诲紑鍏�",
+ description = "寮�鍚悗鎵�鏈夋祦绋嬩竴寰嬪厤瀹℃壒锛堜紭鍏堜簬鍚勬祦绋嬭嚜宸辩殑寮�鍏筹級锛涘叧闂悗鎭㈠涓烘寜鍚勬祦绋嬭嚜宸辩殑寮�鍏冲垽瀹�")
+ @Parameter(name = "autoApprove", description = "鏄惁寮�鍚叏灞�鍏嶅鎵�", required = true, example = "true")
+ @Parameter(name = "remark", description = "澶囨敞", example = "鍏ㄩ儴娴佺▼鏆備笉涓� OA")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')")
+ public CommonResult<Boolean> updateGlobalAutoApprove(@RequestParam("autoApprove") Boolean autoApprove,
+ @RequestParam(value = "remark", required = false) String remark) {
+ processAutoApproveService.updateGlobalAutoApprove(autoApprove, remark);
+ return success(true);
+ }
+
+ @GetMapping("/global")
+ @Operation(summary = "鑾峰緱鍏ㄥ眬鍏嶅鎵规�诲紑鍏崇姸鎬�")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:query')")
+ public CommonResult<Boolean> getGlobalAutoApprove() {
+ return success(processAutoApproveService.isGlobalAutoApprove());
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "鑾峰緱鍏ㄩ儴鍏嶅鎵归厤缃�", description = "渚涘墠绔竴娆℃�ф媺鍙栥�屾祦绋� Key -> 鏄惁鍏嶅鎵广�嶇殑鏄犲皠")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:query')")
+ public CommonResult<List<BpmProcessAutoApproveConfigRespVO>> getConfigList() {
+ List<BpmProcessAutoApproveConfigDO> list = processAutoApproveService.getConfigList();
+ return success(BeanUtils.toBean(list, BpmProcessAutoApproveConfigRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "鑾峰緱鍏嶅鎵归厤缃垎椤�")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:query')")
+ public CommonResult<PageResult<BpmProcessAutoApproveConfigRespVO>> getConfigPage(
+ @Valid BpmProcessAutoApproveConfigPageReqVO pageReqVO) {
+ PageResult<BpmProcessAutoApproveConfigDO> pageResult = processAutoApproveService.getConfigPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BpmProcessAutoApproveConfigRespVO.class));
+ }
+
+ @PostMapping("/create")
+ @Operation(summary = "鍒涘缓鍏嶅鎵归厤缃�")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')")
+ public CommonResult<Long> createConfig(@Valid @RequestBody BpmProcessAutoApproveConfigSaveReqVO createReqVO) {
+ return success(processAutoApproveService.createConfig(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "鏇存柊鍏嶅鎵归厤缃�")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')")
+ public CommonResult<Boolean> updateConfig(@Valid @RequestBody BpmProcessAutoApproveConfigSaveReqVO updateReqVO) {
+ processAutoApproveService.updateConfig(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "鍒犻櫎鍏嶅鎵归厤缃�", description = "鍒犻櫎鍚庤娴佺▼鎭㈠涓烘甯镐汉宸ュ鎵�")
+ @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')")
+ public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) {
+ processAutoApproveService.deleteConfig(id);
+ return success(true);
+ }
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigPageReqVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigPageReqVO.java
new file mode 100644
index 0000000..af43e79
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigPageReqVO.java
@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - BPM 娴佺▼鍏嶅鎵归厤缃垎椤� Request VO")
+@Data
+public class BpmProcessAutoApproveConfigPageReqVO extends PageParam {
+
+ @Schema(description = "娴佺▼瀹氫箟鐨� Key", example = "purchase_request_approve")
+ private String processDefinitionKey;
+
+ @Schema(description = "鏄惁鍏嶅鎵�", example = "true")
+ private Boolean autoApprove;
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigRespVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigRespVO.java
new file mode 100644
index 0000000..b38d1b7
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigRespVO.java
@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - BPM 娴佺▼鍏嶅鎵归厤缃� Response VO")
+@Data
+public class BpmProcessAutoApproveConfigRespVO {
+
+ @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "娴佺▼瀹氫箟鐨� Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "purchase_request_approve")
+ private String processDefinitionKey;
+
+ @Schema(description = "鏄惁鍏嶅鎵癸細true-鎻愪氦鍚庤嚜鍔ㄩ�氳繃锛宖alse-姝e父浜哄伐瀹℃壒",
+ requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
+ private Boolean autoApprove;
+
+ @Schema(description = "澶囨敞", example = "璇ユ祦绋嬫殏涓嶄笂 OA锛屾彁浜ゅ悗鐩存帴鐢熸晥")
+ private String remark;
+
+ @Schema(description = "鍒涘缓鏃堕棿", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigSaveReqVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigSaveReqVO.java
new file mode 100644
index 0000000..2c2a00e
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigSaveReqVO.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - BPM 娴佺▼鍏嶅鎵归厤缃柊澧�/淇敼 Request VO")
+@Data
+public class BpmProcessAutoApproveConfigSaveReqVO {
+
+ @Schema(description = "缂栧彿", example = "1024")
+ private Long id;
+
+ @Schema(description = "娴佺▼瀹氫箟鐨� Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "purchase_request_approve")
+ @NotEmpty(message = "娴佺▼瀹氫箟鐨� Key 涓嶈兘涓虹┖")
+ private String processDefinitionKey;
+
+ @Schema(description = "鏄惁鍏嶅鎵癸細true-鎻愪氦鍚庤嚜鍔ㄩ�氳繃锛宖alse-姝e父浜哄伐瀹℃壒",
+ requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
+ @NotNull(message = "鏄惁鍏嶅鎵逛笉鑳戒负绌�")
+ private Boolean autoApprove;
+
+ @Schema(description = "澶囨敞", example = "璇ユ祦绋嬫殏涓嶄笂 OA锛屾彁浜ゅ悗鐩存帴鐢熸晥")
+ private String remark;
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessAutoApproveConfigDO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessAutoApproveConfigDO.java
new file mode 100644
index 0000000..9b45565
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessAutoApproveConfigDO.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.definition;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * BPM 娴佺▼鍏嶅鎵归厤缃� DO
+ *
+ * 鐢ㄤ簬鎸夈�屾祦绋嬪畾涔� Key銆嶆帶鍒惰娴佺▼鏄惁璺宠繃浜哄伐瀹℃壒锛�
+ * 寮�鍏冲紑鍚悗锛屾祦绋嬪疄渚嬬収甯稿垱寤猴紝浣嗘墍鏈夈�愪汉宸ュ鏍搞�戣妭鐐逛細琚紩鎿庤嚜鍔ㄩ�氳繃锛�
+ * 涓氬姟渚х殑銆屽鎵归�氳繃銆嶅洖璋冧笌涓嬫父鍔ㄤ綔锛堢敓鎴愰噰璐鍗� / MPS / 渚涘簲鍟嗘。妗堢瓑锛夊叏閮ㄧ収甯告墽琛屻��
+ *
+ * 涔嬫墍浠ユ寜 Key 鑰屼笉鏄寜娴佺▼瀹氫箟锛堝惈鐗堟湰锛夊瓨鍌細娴佺▼姣忔閲嶆柊鍙戝竷閮戒細浜х敓鏂扮殑
+ * processDefinitionId锛岃嫢寮�鍏崇粦鍦ㄧ増鏈笂锛屾敼涓�娆℃祦绋嬪氨瑕侀噸閰嶄竴娆″紑鍏筹紝瀹规槗婕忛厤銆�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@TableName("bpm_process_auto_approve_config")
+@KeySequence("bpm_process_auto_approve_config_seq") // 鐢ㄤ簬 Oracle銆丳ostgreSQL銆並ingbase銆丏B2銆丠2 鏁版嵁搴撶殑涓婚敭鑷銆傚鏋滄槸 MySQL 绛夋暟鎹簱锛屽彲涓嶅啓銆�
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BpmProcessAutoApproveConfigDO extends BaseDO {
+
+ /**
+ * 缂栧彿
+ */
+ @TableId
+ private Long id;
+ /**
+ * 娴佺▼瀹氫箟鐨� Key
+ */
+ private String processDefinitionKey;
+ /**
+ * 鏄惁鍏嶅鎵�
+ *
+ * true - 鍏嶅鎵癸細鎻愪氦鍚庣郴缁熻嚜鍔ㄩ�氳繃锛屼笉杩涘叆浜哄伐瀹℃壒
+ * false - 姝e父浜哄伐瀹℃壒
+ */
+ private Boolean autoApprove;
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessAutoApproveConfigMapper.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessAutoApproveConfigMapper.java
new file mode 100644
index 0000000..4f19df2
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessAutoApproveConfigMapper.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * BPM 娴佺▼鍏嶅鎵归厤缃� Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface BpmProcessAutoApproveConfigMapper extends BaseMapperX<BpmProcessAutoApproveConfigDO> {
+
+ default PageResult<BpmProcessAutoApproveConfigDO> selectPage(BpmProcessAutoApproveConfigPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessAutoApproveConfigDO>()
+ .likeIfPresent(BpmProcessAutoApproveConfigDO::getProcessDefinitionKey, reqVO.getProcessDefinitionKey())
+ .eqIfPresent(BpmProcessAutoApproveConfigDO::getAutoApprove, reqVO.getAutoApprove())
+ .orderByDesc(BpmProcessAutoApproveConfigDO::getId));
+ }
+
+ default BpmProcessAutoApproveConfigDO selectByProcessDefinitionKey(String processDefinitionKey) {
+ return selectOne(BpmProcessAutoApproveConfigDO::getProcessDefinitionKey, processDefinitionKey);
+ }
+
+ /**
+ * 鎸夊涓祦绋� Key 鎵归噺鏌ヨ锛岀敤浜庝竴娆℃煡鍑恒�屽叏灞�鎬诲紑鍏� + 璇ユ祦绋嬪紑鍏炽��
+ */
+ default List<BpmProcessAutoApproveConfigDO> selectListByKeys(Collection<String> processDefinitionKeys) {
+ return selectList(new LambdaQueryWrapperX<BpmProcessAutoApproveConfigDO>()
+ .in(BpmProcessAutoApproveConfigDO::getProcessDefinitionKey, processDefinitionKeys));
+ }
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
index a598ff5..4119fb8 100644
--- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -93,4 +93,8 @@
ErrorCode BUSINESS_ATTACH_NOT_EXISTS = new ErrorCode(1_009_015_000, "涓氬姟闄勪欢閰嶇疆涓嶅瓨鍦�");
ErrorCode BUSINESS_ATTACH_PROCESS_DEFINITION_KEY_DUPLICATE = new ErrorCode(1_009_015_001, "娴佺▼瀹氫箟鐨� Key({})宸插瓨鍦�");
+ // ========== BPM 娴佺▼鍏嶅鎵归厤缃� 1-009-016-000 ==========
+ ErrorCode PROCESS_AUTO_APPROVE_CONFIG_NOT_EXISTS = new ErrorCode(1_009_016_000, "娴佺▼鍏嶅鎵归厤缃笉瀛樺湪");
+ ErrorCode PROCESS_AUTO_APPROVE_CONFIG_KEY_DUPLICATE = new ErrorCode(1_009_016_001, "娴佺▼瀹氫箟鐨� Key({})宸插瓨鍦ㄥ厤瀹℃壒閰嶇疆锛岃鍕块噸澶嶅垱寤�");
+
}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
index d848747..52b5dbc 100644
--- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
@@ -35,6 +35,7 @@
ASSIGN_EMPTY_REJECT("瀹℃壒浜轰负绌猴紝鑷姩涓嶉�氳繃"),
APPROVE_TYPE_AUTO_APPROVE("闈炰汉宸ュ鏍革紝鑷姩閫氳繃"),
APPROVE_TYPE_AUTO_REJECT("闈炰汉宸ュ鏍革紝鑷姩涓嶉�氳繃"),
+ PROCESS_AUTO_APPROVE("娴佺▼宸查厤缃厤瀹℃壒锛屾彁浜ゅ悗鑷姩閫氳繃"), // 鍦烘櫙锛氭祦绋嬪紑鍚簡鍏嶅鎵瑰紑鍏筹紙BpmProcessAutoApproveService锛�
CANCEL_BY_PROCESS_CLEAN("杩涚▼娓呯悊鑷姩鍙栨秷"),
CANCEL_BY_WITHDRAW("鍓嶄竴浠诲姟鎾ゅ洖锛岀郴缁熻嚜鍔ㄥ彇娑�"),
;
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveService.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveService.java
new file mode 100644
index 0000000..41338bd
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveService.java
@@ -0,0 +1,106 @@
+package cn.iocoder.yudao.module.bpm.service.definition;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * BPM 娴佺▼鍏嶅鎵归厤缃� Service 鎺ュ彛
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface BpmProcessAutoApproveService {
+
+ /**
+ * 鍏ㄥ眬鎬诲紑鍏冲湪涓婅堪閰嶇疆琛ㄤ腑鍗犵敤鐨勬祦绋� Key
+ *
+ * 璇� Key 涓嶅搴斾换浣曠湡瀹炴祦绋嬶紝浠呬綔涓恒�屾墍鏈夋祦绋嬩竴寰嬪厤瀹℃壒銆嶇殑鎬婚椄鏍囪
+ */
+ String GLOBAL_KEY = "*";
+
+ /**
+ * 鍒ゆ柇鎸囧畾娴佺▼鏄惁寮�鍚簡鍏嶅鎵�
+ *
+ * 鍒ゅ畾椤哄簭锛氬叏灞�鎬诲紑鍏充紭鍏堬紝鍏舵鐪嬭娴佺▼鑷繁鐨勫紑鍏炽��
+ *
+ * 娉ㄦ剰锛氭湰鏂规硶鍙洖绛斻�屽紑鍏虫槸鍚︽墦寮�銆嶏紝涓嶅垽鏂祦绋嬫槸鍚﹀凡閮ㄧ讲銆�
+ * 娴佺▼鏈儴缃叉椂锛屽垱寤烘祦绋嬪疄渚嬮樁娈靛氨浼氭姏鍑� PROCESS_DEFINITION_NOT_EXISTS锛岃蛋涓嶅埌鏈柟娉曘��
+ *
+ * @param processDefinitionKey 娴佺▼瀹氫箟鐨� Key
+ * @return 鏄惁鍏嶅鎵�
+ */
+ boolean isAutoApprove(String processDefinitionKey);
+
+ /**
+ * 鏄惁寮�鍚簡鍏ㄥ眬鍏嶅鎵规�诲紑鍏�
+ *
+ * @return 鏄惁寮�鍚�
+ */
+ boolean isGlobalAutoApprove();
+
+ /**
+ * 璁剧疆鍏ㄥ眬鍏嶅鎵规�诲紑鍏�
+ *
+ * 寮�鍚悗鎵�鏈夋祦绋嬩竴寰嬪厤瀹℃壒锛堜紭鍏堜簬鍚勬祦绋嬭嚜宸辩殑寮�鍏筹級锛�
+ * 鍏抽棴鍚庢仮澶嶄负鎸夊悇娴佺▼鑷繁鐨勫紑鍏冲垽瀹氥��
+ *
+ * @param autoApprove 鏄惁寮�鍚�
+ * @param remark 澶囨敞
+ */
+ void updateGlobalAutoApprove(Boolean autoApprove, String remark);
+
+ /**
+ * 鎸夋祦绋嬪畾涔夌殑 Key 璁剧疆鍏嶅鎵瑰紑鍏筹紙涓嶅瓨鍦ㄥ垯鏂板锛屽瓨鍦ㄥ垯鏇存柊锛�
+ *
+ * 渚涖�屾祦绋嬫ā鍨嬨�嶅垪琛ㄧ殑琛屽唴寮�鍏崇洿鎺ヨ皟鐢紝鏃犻渶鍏堟煡璇㈤厤缃紪鍙枫��
+ *
+ * @param processDefinitionKey 娴佺▼瀹氫箟鐨� Key
+ * @param autoApprove 鏄惁鍏嶅鎵�
+ * @param remark 澶囨敞
+ */
+ void updateAutoApproveByKey(String processDefinitionKey, Boolean autoApprove, String remark);
+
+ /**
+ * 鑾峰緱鍏ㄩ儴鍏嶅鎵归厤缃�
+ *
+ * 渚涘墠绔竴娆℃�ф媺鍙栥�屾祦绋� Key -> 鏄惁鍏嶅鎵广�嶇殑鏄犲皠鍏崇郴
+ *
+ * @return 閰嶇疆鍒楄〃
+ */
+ List<BpmProcessAutoApproveConfigDO> getConfigList();
+
+ /**
+ * 鑾峰緱鍏嶅鎵归厤缃垎椤�
+ *
+ * @param pageReqVO 鍒嗛〉鏌ヨ
+ * @return 閰嶇疆鍒嗛〉
+ */
+ PageResult<BpmProcessAutoApproveConfigDO> getConfigPage(BpmProcessAutoApproveConfigPageReqVO pageReqVO);
+
+ /**
+ * 鍒涘缓鍏嶅鎵归厤缃�
+ *
+ * @param createReqVO 鍒涘缓淇℃伅
+ * @return 缂栧彿
+ */
+ Long createConfig(@Valid BpmProcessAutoApproveConfigSaveReqVO createReqVO);
+
+ /**
+ * 鏇存柊鍏嶅鎵归厤缃�
+ *
+ * @param updateReqVO 鏇存柊淇℃伅
+ */
+ void updateConfig(@Valid BpmProcessAutoApproveConfigSaveReqVO updateReqVO);
+
+ /**
+ * 鍒犻櫎鍏嶅鎵归厤缃�
+ *
+ * @param id 缂栧彿
+ */
+ void deleteConfig(Long id);
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveServiceImpl.java
new file mode 100644
index 0000000..73a2b04
--- /dev/null
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveServiceImpl.java
@@ -0,0 +1,133 @@
+package cn.iocoder.yudao.module.bpm.service.definition;
+
+import cn.hutool.core.util.ObjUtil;
+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.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessAutoApproveConfigMapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_AUTO_APPROVE_CONFIG_KEY_DUPLICATE;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_AUTO_APPROVE_CONFIG_NOT_EXISTS;
+
+/**
+ * BPM 娴佺▼鍏嶅鎵归厤缃� Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Slf4j
+@Service
+@Validated
+public class BpmProcessAutoApproveServiceImpl implements BpmProcessAutoApproveService {
+
+ @Resource
+ private BpmProcessAutoApproveConfigMapper bpmProcessAutoApproveConfigMapper;
+
+ @Override
+ public boolean isAutoApprove(String processDefinitionKey) {
+ if (StrUtil.isBlank(processDefinitionKey)) {
+ return false;
+ }
+ // 涓�娆℃煡鍑恒�屽叏灞�鎬诲紑鍏炽�嶄笌璇ユ祦绋嬭嚜宸辩殑寮�鍏筹紝閬垮厤涓ゆ鏌ヨ
+ List<BpmProcessAutoApproveConfigDO> configs = bpmProcessAutoApproveConfigMapper
+ .selectListByKeys(List.of(GLOBAL_KEY, processDefinitionKey));
+ boolean globalOn = false;
+ boolean processOn = false;
+ for (BpmProcessAutoApproveConfigDO config : configs) {
+ boolean on = Boolean.TRUE.equals(config.getAutoApprove());
+ if (GLOBAL_KEY.equals(config.getProcessDefinitionKey())) {
+ globalOn = on;
+ } else if (processDefinitionKey.equals(config.getProcessDefinitionKey())) {
+ processOn = on;
+ }
+ }
+ // 鍏ㄥ眬鎬诲紑鍏充紭鍏堬細寮�鍚悗鎵�鏈夋祦绋嬩竴寰嬪厤瀹℃壒锛涘惁鍒欑湅璇ユ祦绋嬭嚜宸辩殑寮�鍏�
+ return globalOn || processOn;
+ }
+
+ @Override
+ public boolean isGlobalAutoApprove() {
+ BpmProcessAutoApproveConfigDO config = bpmProcessAutoApproveConfigMapper.selectByProcessDefinitionKey(GLOBAL_KEY);
+ return config != null && Boolean.TRUE.equals(config.getAutoApprove());
+ }
+
+ @Override
+ public void updateGlobalAutoApprove(Boolean autoApprove, String remark) {
+ updateAutoApproveByKey(GLOBAL_KEY, autoApprove, remark);
+ }
+
+ @Override
+ public void updateAutoApproveByKey(String processDefinitionKey, Boolean autoApprove, String remark) {
+ BpmProcessAutoApproveConfigDO config = bpmProcessAutoApproveConfigMapper.selectByProcessDefinitionKey(processDefinitionKey);
+ if (config == null) {
+ // 棣栨閰嶇疆锛氭柊澧�
+ bpmProcessAutoApproveConfigMapper.insert(BpmProcessAutoApproveConfigDO.builder()
+ .processDefinitionKey(processDefinitionKey)
+ .autoApprove(autoApprove)
+ .remark(remark)
+ .build());
+ return;
+ }
+ // 宸叉湁閰嶇疆锛氭洿鏂板紑鍏�
+ bpmProcessAutoApproveConfigMapper.updateById(BpmProcessAutoApproveConfigDO.builder()
+ .id(config.getId())
+ .autoApprove(autoApprove)
+ .remark(remark)
+ .build());
+ }
+
+ @Override
+ public List<BpmProcessAutoApproveConfigDO> getConfigList() {
+ return bpmProcessAutoApproveConfigMapper.selectList();
+ }
+
+ @Override
+ public PageResult<BpmProcessAutoApproveConfigDO> getConfigPage(BpmProcessAutoApproveConfigPageReqVO pageReqVO) {
+ return bpmProcessAutoApproveConfigMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public Long createConfig(BpmProcessAutoApproveConfigSaveReqVO createReqVO) {
+ validateProcessDefinitionKeyUnique(createReqVO);
+ BpmProcessAutoApproveConfigDO config = BeanUtils.toBean(createReqVO, BpmProcessAutoApproveConfigDO.class);
+ bpmProcessAutoApproveConfigMapper.insert(config);
+ return config.getId();
+ }
+
+ @Override
+ public void updateConfig(BpmProcessAutoApproveConfigSaveReqVO updateReqVO) {
+ validateConfigExists(updateReqVO.getId());
+ validateProcessDefinitionKeyUnique(updateReqVO);
+ bpmProcessAutoApproveConfigMapper.updateById(BeanUtils.toBean(updateReqVO, BpmProcessAutoApproveConfigDO.class));
+ }
+
+ @Override
+ public void deleteConfig(Long id) {
+ validateConfigExists(id);
+ bpmProcessAutoApproveConfigMapper.deleteById(id);
+ }
+
+ private void validateProcessDefinitionKeyUnique(BpmProcessAutoApproveConfigSaveReqVO reqVO) {
+ BpmProcessAutoApproveConfigDO config = bpmProcessAutoApproveConfigMapper.selectByProcessDefinitionKey(reqVO.getProcessDefinitionKey());
+ if (config == null || ObjUtil.equal(config.getId(), reqVO.getId())) {
+ return;
+ }
+ throw exception(PROCESS_AUTO_APPROVE_CONFIG_KEY_DUPLICATE, reqVO.getProcessDefinitionKey());
+ }
+
+ private void validateConfigExists(Long id) {
+ if (bpmProcessAutoApproveConfigMapper.selectById(id) == null) {
+ throw exception(PROCESS_AUTO_APPROVE_CONFIG_NOT_EXISTS);
+ }
+ }
+
+}
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
index 2a98427..b32d85f 100644
--- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -29,6 +29,7 @@
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessAutoApproveService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO;
@@ -102,6 +103,8 @@
private BpmMessageService messageService;
@Resource
private BpmFormService formService;
+ @Resource
+ private BpmProcessAutoApproveService processAutoApproveService;
@Resource
private AdminUserApi adminUserApi;
@@ -1400,6 +1403,10 @@
FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
Integer approveType = BpmnModelUtils.parseApproveType(userTaskElement);
Integer assignEmptyHandlerType = BpmnModelUtils.parseAssignEmptyHandlerType(userTaskElement);
+ // 娴佺▼绾с�愬厤瀹℃壒銆戝紑鍏筹細浠呭銆愪汉宸ュ鏍搞�戣妭鐐圭敓鏁堛��
+ // 闈炰汉宸ュ鏍哥殑鑺傜偣锛圓UTO_APPROVE / AUTO_REJECT锛夋湁鍏惰嚜韬殑璁捐鍣ㄩ厤缃紝涓嶅彈鏈紑鍏冲奖鍝嶏紝閬垮厤涓ゅ閰嶇疆浜掔浉骞叉壈銆�
+ boolean autoApproveEnabled = ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())
+ && processAutoApproveService.isAutoApprove(processInstance.getProcessDefinitionKey());
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
/**
@@ -1418,6 +1425,26 @@
&& getTask(task.getId()) == null) {
return;
}
+ // 鐗规畩鎯呭喌闆讹細娴佺▼寮�鍚簡銆愬厤瀹℃壒銆戝紑鍏筹紝浜哄伐瀹℃牳鑺傜偣鐩存帴鑷姩閫氳繃
+ // 璇存槑锛氫笉鏀瑰姩涓氬姟渚т换浣曢�昏緫鈥斺�斾笟鍔$収甯告妸鍗曟嵁缃负銆屽鎵逛腑銆嶏紝闅忓悗璧颁笌姝e父瀹℃壒閫氳繃
+ // 瀹屽叏鐩稿悓鐨� approveTask 娴佺▼锛屽洜姝や笟鍔$洃鍚櫒銆佸鎵圭暀鐥曘�佷互鍙婁笅娓稿姩浣�
+ // 锛堢敓鎴愰噰璐鍗� / MPS / 渚涘簲鍟嗘。妗� / 鎶ュ伐浜у嚭绛夛級鍏ㄩ儴鐓у父鎵ц銆�
+ if (autoApproveEnabled) {
+ // 骞傜瓑淇濇姢锛氫换鍔″彲鑳藉凡琚帹杩涳紙渚嬪銆屽彂璧蜂汉鑺傜偣銆嶇敱寮曟搸鑷甫鐨勭瓥鐣ュ厛琛岃嚜鍔ㄩ�氳繃锛夛紝
+ // 姝ゆ椂浠诲姟宸蹭笉瀛樺湪锛岀洿鎺ヨ烦杩囷紝閬垮厤閲嶅瀹℃壒鎶ラ敊
+ Task autoApproveTask = getTask(task.getId());
+ if (autoApproveTask == null) {
+ return;
+ }
+ // 蹇呴』浼犲叆浠诲姟鐨勫疄闄呭鎵逛汉锛歛pproveTask 浼氭牎楠屻�屾搷浣滀汉蹇呴』鏄浠诲姟鐨勫鎵逛汉銆嶏紝
+ // 浼� null 浠呭銆屽鎵逛汉涓虹┖銆嶇殑浠诲姟鏀捐锛屽惁鍒欎細鎶涖�岃浠诲姟鐨勫鎵逛汉涓嶆槸浣犮��
+ Long assigneeUserId = StrUtil.isNotBlank(autoApproveTask.getAssignee())
+ ? NumberUtils.parseLong(autoApproveTask.getAssignee()) : null;
+ getSelf().approveTask(assigneeUserId, new BpmTaskApproveReqVO()
+ .setId(autoApproveTask.getId())
+ .setReason(BpmReasonEnum.PROCESS_AUTO_APPROVE.getReason()));
+ return;
+ }
// 鐗规畩鎯呭喌涓�锛氥�愪汉宸ュ鏍搞�戝鎵逛汉涓虹┖锛屾牴鎹厤缃槸鍚﹁鑷姩閫氳繃銆佽嚜鍔ㄦ嫆缁�
if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())) {
// 濡傛灉鏈夊鎵逛汉銆佹垨鑰呮嫢鏈変汉锛屽垯璇存槑涓嶆弧瓒虫儏鍐典竴锛屼笉鑷姩閫氳繃銆佷笉鑷姩鎷掔粷
--
Gitblit v1.9.3