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