From a82d847bbb39e2417d4c9773ebc4fc51fdb0b8fc Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 10 十一月 2026 13:31:31 +0800
Subject: [PATCH] feat(crm): 完善投标保证金与报价单关联及作废功能

---
 yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/message/BpmMessageServiceImpl.java |   88 ++++++++++++++++++++++++++------------------
 1 files changed, 52 insertions(+), 36 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 b0206c3..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,23 +1,25 @@
 package cn.iocoder.yudao.module.bpm.service.message;
 
-import cn.iocoder.yudao.framework.web.config.WebProperties;
-import cn.iocoder.yudao.module.bpm.convert.message.BpmMessageConvert;
-import cn.iocoder.yudao.module.bpm.enums.message.BpmMessageEnum;
+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.api.sms.SmsSendApi;
+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 jakarta.annotation.Resource;
 import java.util.HashMap;
 import java.util.Map;
 
 /**
  * BPM 娑堟伅 Service 瀹炵幇绫�
+ *
+ * 褰撳墠鍙繚鐣欍�愬緟鍔炰换鍔°�戠殑绔欏唴淇¢�氱煡锛氫换鍔″垎閰嶅埌鍏蜂綋瀹℃壒浜烘椂锛岀粰瀹℃壒浜哄彂涓�鏉$珯鍐呬俊锛堢郴缁熷彸涓婅灏忛搩閾涘彲瑙侊級銆�
+ * 鐭俊閫氱煡宸叉暣浣撳叧闂紝鍏朵綑鏂规硶浠呰褰曟棩蹇椼��
  *
  * @author 瓒呯骇绠$悊鍛�
  */
@@ -26,54 +28,68 @@
 @Slf4j
 public class BpmMessageServiceImpl implements BpmMessageService {
 
-    @Resource
-    private SmsSendApi smsSendApi;
+    /**
+     * 寰呭姙浠诲姟绔欏唴淇℃ā鏉跨紪鐮侊紝瀵瑰簲 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 WebProperties webProperties;
+    private NotifySendService notifySendService;
+
+    @Resource
+    private TaskService flowTaskService;
 
     @Override
     public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) {
-        Map<String, Object> templateParams = new HashMap<>();
-        templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
-        templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
-        smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(),
-                BpmMessageEnum.PROCESS_INSTANCE_APPROVE.getSmsTemplateCode(), templateParams));
+        log.info("[sendMessageWhenProcessInstanceApprove][宸插叧闂煭淇¢�氱煡锛岃烦杩囧彂閫乚[processInstanceId: {}]", reqDTO.getProcessInstanceId());
     }
 
     @Override
     public void sendMessageWhenProcessInstanceReject(BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO) {
-        Map<String, Object> templateParams = new HashMap<>();
-        templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
-        templateParams.put("reason", reqDTO.getReason());
-        templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
-        smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(),
-                BpmMessageEnum.PROCESS_INSTANCE_REJECT.getSmsTemplateCode(), templateParams));
+        log.info("[sendMessageWhenProcessInstanceReject][宸插叧闂煭淇¢�氱煡锛岃烦杩囧彂閫乚[processInstanceId: {}]", reqDTO.getProcessInstanceId());
     }
 
+    /**
+     * 浠诲姟鍒嗛厤鍒板鎵逛汉鏃讹紝鍙戦�佺珯鍐呬俊閫氱煡銆�
+     *
+     * 璇存槑锛氭墍鏈夋祦绋嬭妭鐐圭殑寰呭姙浠诲姟閮戒細璧� BpmTaskServiceImpl#processTaskAssigned 鐨勬湰娆¤皟鐢紙鍔犵銆佽浆鍔炲悓鏍蜂細瑙﹀彂锛夛紝
+     * 鍥犳杩欓噷瀹炵幇涓�娆″嵆鍙鐩栧叏閮ㄦ祦绋嬬殑寰呭姙閫氱煡銆�
+     */
     @Override
     public void sendMessageWhenTaskAssigned(BpmMessageSendWhenTaskCreatedReqDTO reqDTO) {
-        Map<String, Object> templateParams = new HashMap<>();
-        templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
-        templateParams.put("taskName", reqDTO.getTaskName());
-        templateParams.put("startUserNickname", reqDTO.getStartUserNickname());
-        templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
-        smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(),
-                BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams));
+        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
     public void sendMessageWhenTaskTimeout(BpmMessageSendWhenTaskTimeoutReqDTO reqDTO) {
-        Map<String, Object> templateParams = new HashMap<>();
-        templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
-        templateParams.put("taskName", reqDTO.getTaskName());
-        templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
-        smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(),
-                BpmMessageEnum.TASK_TIMEOUT.getSmsTemplateCode(), templateParams));
-    }
-
-    private String getProcessInstanceDetailUrl(String taskId) {
-        return webProperties.getAdminUi().getUrl() + "/bpm/process-instance/detail?id=" + taskId;
+        log.info("[sendMessageWhenTaskTimeout][宸插叧闂煭淇¢�氱煡锛岃烦杩囧彂閫乚[processInstanceId: {}]", reqDTO.getProcessInstanceId());
     }
 
 }

--
Gitblit v1.9.3