From c55aca77e84607238c3354168a8642176c575ca1 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 10 十一月 2026 11:42:16 +0800
Subject: [PATCH] feat(bpm): 待办任务站内信实时推送

---
 yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java |   57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java
index 0175358..af93ad3 100644
--- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java
@@ -1,18 +1,25 @@
 package cn.iocoder.yudao.module.bpm.service.message;
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO;
+import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
+import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.TaskService;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * BPM 娑堟伅 Service 瀹炵幇绫�
  *
- * 娉ㄦ剰锛氬凡鍏抽棴鐭俊閫氱煡鍔熻兘锛岀浉鍏虫柟娉曚粎璁板綍鏃ュ織锛屼笉鍐嶈皟鐢ㄧ煭淇″彂閫佹帴鍙o紝
- * 浠ラ伩鍏嶁�滅煭淇℃ā鏉夸笉瀛樺湪鈥濈瓑闂銆�
+ * 褰撳墠鍙繚鐣欍�愬緟鍔炰换鍔°�戠殑绔欏唴淇¢�氱煡锛氫换鍔″垎閰嶅埌鍏蜂綋瀹℃壒浜烘椂锛岀粰瀹℃壒浜哄彂涓�鏉$珯鍐呬俊锛堢郴缁熷彸涓婅灏忛搩閾涘彲瑙侊級銆�
+ * 鐭俊閫氱煡宸叉暣浣撳叧闂紝鍏朵綑鏂规硶浠呰褰曟棩蹇椼��
  *
  * @author 瓒呯骇绠$悊鍛�
  */
@@ -20,6 +27,24 @@
 @Validated
 @Slf4j
 public class BpmMessageServiceImpl implements BpmMessageService {
+
+    /**
+     * 寰呭姙浠诲姟绔欏唴淇℃ā鏉跨紪鐮侊紝瀵瑰簲 system_notify_template.code
+     */
+    private static final String TEMPLATE_CODE_TASK_ASSIGNED = "bpm_task_assigned";
+
+    /**
+     * 绔欏唴淇″弬鏁板�肩殑鏈�澶ч暱搴︺��
+     * 璇存槑锛歴ystem_notify_message.template_params 鍙湁 varchar(255)锛屽弬鏁板�艰繃闀夸細瀵艰嚧鎻掑叆澶辫触锛�
+     * 杩欓噷缁熶竴鎴柇锛屼繚璇佷竴鏉″緟鍔炲繀瀹氳兘鍙戝嚭鍘汇��
+     */
+    private static final int PARAM_VALUE_MAX_LENGTH = 60;
+
+    @Resource
+    private NotifySendService notifySendService;
+
+    @Resource
+    private TaskService flowTaskService;
 
     @Override
     public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) {
@@ -31,9 +56,35 @@
         log.info("[sendMessageWhenProcessInstanceReject][宸插叧闂煭淇¢�氱煡锛岃烦杩囧彂閫乚[processInstanceId: {}]", reqDTO.getProcessInstanceId());
     }
 
+    /**
+     * 浠诲姟鍒嗛厤鍒板鎵逛汉鏃讹紝鍙戦�佺珯鍐呬俊閫氱煡銆�
+     *
+     * 璇存槑锛氭墍鏈夋祦绋嬭妭鐐圭殑寰呭姙浠诲姟閮戒細璧� BpmTaskServiceImpl#processTaskAssigned 鐨勬湰娆¤皟鐢紙鍔犵銆佽浆鍔炲悓鏍蜂細瑙﹀彂锛夛紝
+     * 鍥犳杩欓噷瀹炵幇涓�娆″嵆鍙鐩栧叏閮ㄦ祦绋嬬殑寰呭姙閫氱煡銆�
+     */
     @Override
     public void sendMessageWhenTaskAssigned(BpmMessageSendWhenTaskCreatedReqDTO reqDTO) {
-        log.info("[sendMessageWhenTaskAssigned][宸插叧闂煭淇¢�氱煡锛岃烦杩囧彂閫乚[processInstanceId: {}]", reqDTO.getProcessInstanceId());
+        if (reqDTO.getAssigneeUserId() == null) {
+            return;
+        }
+        // 浠诲姟鍙兘鍦ㄥ悓涓�浜嬪姟閲屽凡琚嚜鍔ㄩ�氳繃銆佽嚜鍔ㄦ嫆缁濇垨鍙栨秷锛堝厤瀹℃壒寮�鍏炽�佹垨绛捐鎶㈠崰绛夛級锛屾鏃跺彂寰呭姙閫氱煡鍙細璇瀹℃壒浜�
+        if (flowTaskService.createTaskQuery().taskId(reqDTO.getTaskId()).count() == 0) {
+            log.info("[sendMessageWhenTaskAssigned][taskId({}) 宸蹭笉鍦ㄥ緟鍔炰腑锛岃烦杩囧緟鍔為�氱煡]", reqDTO.getTaskId());
+            return;
+        }
+        Map<String, Object> templateParams = new HashMap<>(4);
+        templateParams.put("processName", StrUtil.maxLength(reqDTO.getProcessInstanceName(), PARAM_VALUE_MAX_LENGTH));
+        templateParams.put("taskName", StrUtil.maxLength(reqDTO.getTaskName(), PARAM_VALUE_MAX_LENGTH));
+        templateParams.put("startUserName", StrUtil.maxLength(reqDTO.getStartUserNickname(), PARAM_VALUE_MAX_LENGTH));
+        try {
+            notifySendService.sendSingleNotifyToAdmin(reqDTO.getAssigneeUserId(), TEMPLATE_CODE_TASK_ASSIGNED, templateParams);
+            log.info("[sendMessageWhenTaskAssigned][宸插悜鐢ㄦ埛({})鍙戦�佸緟鍔炵珯鍐呬俊][taskId({}) taskName({})]",
+                    reqDTO.getAssigneeUserId(), reqDTO.getTaskId(), reqDTO.getTaskName());
+        } catch (Exception ex) {
+            // 绔欏唴淇″彂閫佸け璐ヤ笉鑳藉奖鍝嶅鎵逛换鍔℃湰韬殑鍒涘缓锛屽惁鍒欐暣涓祦绋嬫彁浜や簨鍔′細琚洖婊�
+            log.error("[sendMessageWhenTaskAssigned][鍚戠敤鎴�({})鍙戦�佸緟鍔炵珯鍐呬俊澶辫触][taskId({})]",
+                    reqDTO.getAssigneeUserId(), reqDTO.getTaskId(), ex);
+        }
     }
 
     @Override

--
Gitblit v1.9.3