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/service/task/BpmTaskServiceImpl.java |   31 +++++++++++++++++++++++++++++--
 1 files changed, 29 insertions(+), 2 deletions(-)

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 73f8a01..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;
@@ -74,7 +75,7 @@
 /**
  * 娴佺▼浠诲姟瀹炰緥 Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  * @author jason
  */
 @Slf4j
@@ -102,6 +103,8 @@
     private BpmMessageService messageService;
     @Resource
     private BpmFormService formService;
+    @Resource
+    private BpmProcessAutoApproveService processAutoApproveService;
 
     @Resource
     private AdminUserApi adminUserApi;
@@ -987,7 +990,7 @@
         //  鏀规垚 moveExecutionsToSingleActivityId 濂藉儚骞舵病鏈夐亣鍒� 鈶� 鎻愬埌鐨勮秴鏃舵彁閱掑け鏁堢殑闂銆傛殏鏃跺厛鏀瑰洖 moveExecutionsToSingleActivityId
         // 鈶� moveExecutionsToSingleActivityId 鍥為��澶氬疄渚嬬殑鏃跺�欎笉浼氬幓鍒犻櫎澶氬疄渚嬫牴, 搴旀敼鎴� moveActivityIdsToSingleActivityId
         // flowable 8.0.0  淇涓婇潰鐩稿叧闂锛� 杩樹慨澶嶄簡骞惰鍒嗘敮鍥為��鐨勯棶棰� https://t.zsxq.com/z4d9i銆�
-        // 鈶� 浣跨敤 moveExecutionsToSingleActivityId 鏂规硶杩涜鍥為��鎿嶄綔鏃讹紝濡傛灉鏄瀹炰緥鐨勭敤鎴蜂换鍔°�愯妺閬撶敤鎴蜂换鍔¢粯璁や负澶氬疄渚嬨�戯紝涓嶄細鍒犻櫎澶氬疄渚嬩换鍔$殑鏍规暟鎹� ACT_RU_EXECUTION
+        // 鈶� 浣跨敤 moveExecutionsToSingleActivityId 鏂规硶杩涜鍥為��鎿嶄綔鏃讹紝濡傛灉鏄瀹炰緥鐨勭敤鎴蜂换鍔°�愯秴绾х鐞嗗憳鐢ㄦ埛浠诲姟榛樿涓哄瀹炰緥銆戯紝涓嶄細鍒犻櫎澶氬疄渚嬩换鍔$殑鏍规暟鎹� ACT_RU_EXECUTION
         // 浼氬鑷存湁涓�浜涢棶棰橈紝鎵�浠ヤ娇鐢� moveActivityIdsToSingleActivityId銆� 浣嗘槸璇ユ柟娉曞湪 flowable 6.8.1 ~ 7.1.0 鐨勭増鏈細鏈� bug 闃诲鍥為��鍔熻兘
         // 鐩稿叧 issue: https://github.com/flowable/flowable-engine/issues/3944
         runtimeService.createChangeActivityStateBuilder()
@@ -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