From 40a8157440e3b906da8f52e07d939d78c3f4c313 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 12 四月 2026 16:14:06 +0800
Subject: [PATCH] feat: 任务增加统计、同步增加通知

---
 ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java |  272 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 245 insertions(+), 27 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
index a9a1141..5b20aae 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
@@ -1,8 +1,12 @@
 package com.ruoyi.system.listener;
 
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.config.WechatConfig;
+import com.ruoyi.common.utils.DeptUtil;
+import com.ruoyi.common.utils.LongUtil;
 import com.ruoyi.system.domain.*;
-import com.ruoyi.system.event.TaskDispatchSyncEvent;
-import com.ruoyi.system.service.ISysTaskAssigneeService;
+import com.ruoyi.system.event.*;
+import com.ruoyi.system.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,16 +15,11 @@
 import org.springframework.stereotype.Component;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.event.TaskCreatedEvent;
-import com.ruoyi.system.event.TaskAssignedEvent;
-import com.ruoyi.system.event.TaskStatusChangedEvent;
 import com.ruoyi.system.mapper.SysMessageMapper;
 import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.mapper.SysTaskMapper;
 import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.system.service.INotifyTaskService;
-import com.ruoyi.system.service.INotifyDispatchService;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -59,6 +58,12 @@
     @Autowired
     private INotifyDispatchService notifyDispatchService;
 
+    @Autowired
+    private IQyWechatService qyWechatService;
+
+    @Autowired
+    private WechatConfig wechatConfig;
+
     /** 寰呭噯澶囩姸鎬� - 鍙互鍙戦�佺煭淇¢�氱煡 */
     private static final String TASK_STATUS_PENDING = "PENDING";
     /** 寰呭噯澶囩姸鎬� - 鍙互鍙戦�佺煭淇¢�氱煡 */
@@ -66,6 +71,9 @@
 
     @Autowired
     private ISysTaskAssigneeService taskAssigneeService;
+
+    @Autowired
+    private ITaskStatusPushService taskStatusPushService;
 
     @Async
     @EventListener
@@ -78,14 +86,34 @@
                List<SysTaskAssignee> assignees=taskAssigneeService.getAssigneesByTaskId(emergency.getTaskId());
                if(assignees!=null && !assignees.isEmpty()){
                    List<Long> assigneeIds=assignees.stream().map(SysTaskAssignee::getUserId).collect(Collectors.toList());
-                   sendDispatchNotify(assigneeIds, task.getCreatorId(), event.getTaskId(), task.getTaskCode(), buildNotifyContent(task, emergency));
+                   task.setEmergencyInfo( emergency);
+                   sendDispatchNotify(assigneeIds, task.getCreatorId(), event.getTaskId(),task.getShowTaskCode(), buildNotifyContent(task, emergency));
                }
             }
+            syncDispatchActualStartTime(emergency, task);
+            Long taskId= event.getTaskId();
+            Long dispatchOrdId= event.getDispatchOrderId();
+            Long serviceOrdId= event.getServiceOrderId();
+            Integer oaUserID= event.getOaUserId();
+            legacySystemSyncService.syncTaskAttachment(taskId, dispatchOrdId, serviceOrdId, oaUserID);
 
         }catch (Exception ex){
             log.error("澶勭悊浠诲姟娲惧彂鍚屾浜嬩欢澶辫触", ex);
         }
     }
+
+    private void syncDispatchActualStartTime(SysTaskEmergency emergency, SysTask task) {
+        try {
+            //杩欓噷涔熷悓姝ヤ竴涓嬪疄闄呮椂闂�
+            Long disatpchOrdId = emergency.getLegacyDispatchOrdId();
+            Date actualTime = task.getActualStartTime();
+            legacySystemSyncService.updateDispatchActualTime(disatpchOrdId, actualTime);
+        }catch (Exception ex){
+        log.error("鍚屾瀹為檯鏃堕棿澶辫触", ex);
+        }
+    }
+
+
     /**
      * 鐩戝惉浠诲姟鍒涘缓浜嬩欢
      * 
@@ -129,10 +157,123 @@
     }
 
 
+    @Autowired
+    private ISysDeptService sysDeptService;
+    /**
+     * 鍙湁鏈嶅姟鍗曪紝涓斿彧鍦ㄥ箍宸炲鐨勬湇鍔″崟锛屾病鏈夎皟搴﹀崟
+     * @param event
+     */
+    @Async
+    @EventListener
+    public void handleTaskOnlyServiceSync(TaskDispatchSyncEvent event){
+        //缁欒礋璐d汉鍙戦�佹秷鎭�
+       Long taskId= event.getTaskId();
+       SysTask task=sysTaskMapper.selectSysTaskByTaskId(taskId);
+       SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
+       if(emergency != null){
+           task.setEmergencyInfo( emergency);
+           Long deptId=task.getDeptId();
+           if(!deptId.equals(DeptUtil.GUANGZHOU_DEPT_ID)){
+               //鎵惧埌璇ラ儴闂ㄧ殑璐熻矗浜�
+               SysDept dept= sysDeptService.selectDeptById(deptId);
+               if(dept!=null){
+                  String serviceOrdClass= dept.getServiceOrderClass();
+                  String dispatchOrdClass= dept.getDispatchOrderClass();
+                  List<SysUser> user=sysUserMapper.selectUsersByOrderClassAndCanViewAllConsult(serviceOrdClass);
+                  if(user!=null && !user.isEmpty()){
+                      List<NotifyTask> tasks=new ArrayList<>();
+                      String buildNotifyContent = buildUnAssignNotifyContent(task, emergency);
+                      for(SysUser u:user){
+                       NotifyTask notifyTask= this.sendTaskUnAssignNotify(u.getUserId(),u.getNickName(),u.getPhonenumber(),taskId,task.getShowTaskCode(),"鏈嶅姟鍗曟淳鍙�",buildNotifyContent);
+                       tasks.add(notifyTask);
+                      }
+                      if(!tasks.isEmpty()){
+                          int successCount = notifyDispatchService.dispatchNotifies(tasks);
+                          log.info("浠诲姟鏈垎閰嶆秷鎭凡鍙戦�侊紝鍙戦�佹垚鍔熸暟閲忥細{}", successCount);
+                      }
+                  }
+               }
+           }
+
+
+
+       }
+    }
+
+    private  String buildUnAssignNotifyContent(SysTask task, SysTaskEmergency emergency){
+        //娲惧彂鍗曞彿
+        String dispatchCode=emergency.getDispatchCode();
+        String taskCode=task.getTaskCode();
+        String orderCode=dispatchCode;
+        if(dispatchCode==null){
+            orderCode=taskCode;
+        }
+        Date dispatchTime=task.getPlanedStartTime();
+
+        StringBuilder content = new StringBuilder();
+        content.append("鎮ㄦ湁鏂扮殑鏈嶅姟鍗曪紝浠诲姟鍗曞彿:"+orderCode);
+        // 娣诲姞鍑哄彂鍦颁俊鎭�
+        String departure = null;
+        if (emergency != null && StringUtils.isNotEmpty(emergency.getHospitalOutName())) {
+            departure = emergency.getHospitalOutName();
+        } else if (StringUtils.isNotEmpty(task.getDepartureAddress())) {
+            departure = task.getDepartureAddress();
+        }
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        content.append("锛屽嚭鍙戞椂闂�:").append(df.format(dispatchTime));
+
+        // 娣诲姞鐩殑鍦颁俊鎭�
+        String destination = null;
+        if (emergency != null && StringUtils.isNotEmpty(emergency.getHospitalInName())) {
+            destination = emergency.getHospitalInName();
+        } else if (StringUtils.isNotEmpty(task.getDestinationAddress())) {
+            destination = task.getDestinationAddress();
+        }
+
+        if (departure != null || destination != null) {
+            if (departure != null) {
+                content.append("鍑哄彂鍦帮細").append(departure);
+            }
+            if (destination != null) {
+                if (content.length() > 0) content.append("锛�");
+                content.append("鐩殑鍦帮細").append(destination);
+            }
+            content.append("锛岃鍙婃椂澶勭悊銆�");
+        }
+
+        return content.toString();
+    }
+
+
+
+
+    @Autowired
+    private ILegacySystemSyncService legacySystemSyncService;
+
+    @Async
+    @EventListener
+    public void handleTaskUpdateEvent(TaskUpdateEvent event){
+        log.info("鏀跺埌浠诲姟鏇存柊浜嬩欢锛屼换鍔D锛歿}锛屼换鍔$紪鍙凤細{}", event.getTaskId(), event.getTaskCode());
+        legacySystemSyncService.resyncDispatchOrderToLegacy(event.getTaskId());
+
+    }
+    //鍦ㄨ繖閲岀洃鍚淳鍙戠殑浜嬩欢
+    @Async
+    @EventListener
+    public void handleTaskServiceOrderSyncEvent(TaskServiceOrderSyncEvent event) {
+//        log.info("鏀跺埌浠诲姟鏈嶅姟鍗曞悓姝ヤ簨浠讹紝浠诲姟ID锛歿}锛屼换鍔$紪鍙凤細{}锛屾湇鍔″崟ID锛歿}", event.getTaskId(), event.getTaskCode(), event.getServiceOrderId());
+       Long dispatchOrderId= legacySystemSyncService.syncDispatchOrderToLegacy(event.getTaskId());
+//       if(LongUtil.isNotEmpty(dispatchOrderId)){
+//           //鏇存柊needsync涓�0
+//
+//       }
+    }
+
 
     /**
      * 鐩戝惉浠诲姟鍒嗛厤浜嬩欢
      * 鍒涘缓閫氱煡浠诲姟锛岀敱閫氱煡鍒嗗彂鏈嶅姟鍐冲畾鍙戦�佹笭閬�
+     * 鍚屾椂鐩存帴鍙戦�佷紒涓氬井淇¢�氱煡
      * 
      * @param event 浠诲姟鍒嗛厤浜嬩欢
      */
@@ -161,21 +302,62 @@
 
             Long creatorId = task.getCreatorId();
             String taskStatus = task.getTaskStatus();
+            task.setEmergencyInfo(emergency);
             
-            // 浠呭湪寰呭噯澶囩姸鎬佷笅鍙戦�侀�氱煡
-            if (!TASK_STATUS_PENDING.equals(taskStatus) && !TASK_STATUS_PREPARING.equals(taskStatus)) {
-                log.info("浠诲姟鐘舵��({})闈炲緟鍑嗗鐘舵�侊紝璺宠繃閫氱煡锛宼askId={}", taskStatus, event.getTaskId());
-                return;
-            }
-
             // 鏋勫缓閫氱煡鍐呭
             String notifyContent = buildNotifyContent(task, emergency);
-            this.sendDispatchNotify(event.getAssigneeIds(), creatorId, event.getTaskId(), event.getTaskCode(), notifyContent);
+            
+            // 鐩存帴鍙戦�佷紒涓氬井淇¢�氱煡缁欐墽琛屼汉鍛�
+            sendQyWechatNotifyToAssignees(event.getAssigneeIds(), creatorId, event.getTaskId(), notifyContent);
+            
+            // 鍚屾椂璧板師鏈夐�氱煡鍒嗗彂娴佺▼锛堢珯鍐呮秷鎭瓑锛�
+            // 浠呭湪寰呭噯澶囩姸鎬佷笅鍙戦�佸叾浠栭�氱煡
+            if (TASK_STATUS_PENDING.equals(taskStatus) || TASK_STATUS_PREPARING.equals(taskStatus)) {
+                this.sendDispatchNotify(event.getAssigneeIds(), creatorId, event.getTaskId(), task.getShowTaskCode(), notifyContent);
+            }
 
             
         } catch (Exception e) {
             log.error("澶勭悊浠诲姟鍒嗛厤浜嬩欢澶辫触", e);
         }
+    }
+
+    /**
+     * 鐩存帴鍙戦�佷紒涓氬井淇¢�氱煡缁欐墽琛屼汉鍛�
+     */
+    private void sendQyWechatNotifyToAssignees(List<Long> assigneeIds, Long creatorId, Long taskId, String content) {
+        String appId = wechatConfig.getAppId();
+        String pathPage = "/pagesTask/detail?id=" + taskId;
+        int successCount = 0;
+        
+        for (Long assigneeId : assigneeIds) {
+            // 鎺掗櫎鍒涘缓浜�
+            if (creatorId != null && creatorId.equals(assigneeId)) {
+                log.debug("璺宠繃鍒涘缓浜猴紝涓嶅彂閫佷紒涓氬井淇¢�氱煡锛寀serId={}", assigneeId);
+                continue;
+            }
+            
+            try {
+                boolean success = qyWechatService.sendNotifyMessage(
+                        assigneeId,
+                        "杞繍鍗曚换鍔℃淳鍗曢�氱煡",
+                        content,
+                        appId,
+                        pathPage
+                );
+                
+                if (success) {
+                    successCount++;
+                    log.info("浼佷笟寰俊娲惧崟閫氱煡鍙戦�佹垚鍔燂紝taskId={}, userId={}", taskId, assigneeId);
+                } else {
+                    log.warn("浼佷笟寰俊娲惧崟閫氱煡鍙戦�佸け璐ワ紝taskId={}, userId={}", taskId, assigneeId);
+                }
+            } catch (Exception e) {
+                log.error("浼佷笟寰俊娲惧崟閫氱煡鍙戦�佸紓甯革紝taskId={}, userId={}", taskId, assigneeId, e);
+            }
+        }
+        
+        log.info("浼佷笟寰俊娲惧崟閫氱煡鍙戦�佸畬鎴愶紝taskId={}, 鎴愬姛鏁伴噺={}/{}", taskId, successCount, assigneeIds.size());
     }
 
     /**
@@ -237,6 +419,23 @@
                     taskId, createdTasks.size(), successCount);
         }
     }
+
+    private NotifyTask  sendTaskUnAssignNotify(Long userId,String nickName,String phone,
+                            Long taskId,String taskCode,String title,String notifyContent) {
+        NotifyTask notifyTask = new NotifyTask();
+        notifyTask.setTaskId(taskId);
+        notifyTask.setTaskCode(taskCode);
+        notifyTask.setNotifyType(NotifyTask.NOTIFY_TASK_UNASSIGN);
+        notifyTask.setUserId(userId);
+        notifyTask.setUserName(nickName);
+        notifyTask.setUserPhone(phone);
+        notifyTask.setTitle(title);
+        notifyTask.setContent(notifyContent);
+        notifyTask.setCreateBy( "绯荤粺");
+
+        NotifyTask created = notifyTaskService.createNotifyTask(notifyTask);
+        return created;
+    }
     /**
      * 鏋勫缓閫氱煡鍐呭
      */
@@ -260,7 +459,7 @@
             departure = task.getDepartureAddress();
         }
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-        content.append("锛屽嚭鍙戞椂闂达細").append(df.format(dispatchTime));
+        content.append("锛屽嚭鍙戞椂闂�:").append(df.format(dispatchTime));
 
         // 娣诲姞鐩殑鍦颁俊鎭�
         String destination = null;
@@ -271,7 +470,6 @@
         }
         
         if (departure != null || destination != null) {
-            content = new StringBuilder();
             if (departure != null) {
                 content.append("鍑哄彂鍦帮細").append(departure);
             }
@@ -285,6 +483,8 @@
         return content.toString();
     }
 
+    @Autowired
+    private ITaskStatusSyncService taskStatusSyncService;
     /**
      * 鐩戝惉浠诲姟鐘舵�佸彉鏇翠簨浠�
      * 
@@ -293,26 +493,44 @@
     @Async
     @EventListener
     public void handleTaskStatusChangedEvent(TaskStatusChangedEvent event) {
+
+        sendTaskStatusToLocal(event);
+        sendTaskStatusToLegacy(event.getTaskId());
+
+    }
+
+    private void sendTaskStatusToLegacy(Long taskId) {
+        try{
+            log.info("浠诲姟鐘舵�佸悓姝ュ埌鏃х郴缁熷紑濮� taskId:{}",taskId);
+           taskStatusPushService.pushTaskStatusToLegacy(taskId);
+        }catch (Exception e){
+            log.error("浠诲姟鐘舵�佸悓姝ュ埌鏃х郴缁熷紓甯� taskId:{}",taskId, e);
+        }
+    }
+
+
+
+    private  void sendTaskStatusToLocal(TaskStatusChangedEvent event) {
         try {
-            log.info("鏀跺埌浠诲姟鐘舵�佸彉鏇翠簨浠讹紝浠诲姟ID锛歿}锛屾棫鐘舵�侊細{}锛屾柊鐘舵�侊細{}", 
+            log.info("鏀跺埌浠诲姟鐘舵�佸彉鏇翠簨浠讹紝浠诲姟ID锛歿}锛屾棫鐘舵�侊細{}锛屾柊鐘舵�侊細{}",
                     event.getTaskId(), event.getOldStatus(), event.getNewStatus());
-            
+            //鍙戣捣鐘舵�佸悓姝�
             // 鏋勫缓鐘舵�佸彉鏇村唴瀹�
             String statusContent = getStatusChangeContent(event.getNewStatus(), event.getNewStatusDesc());
-            
+
             // 鏀堕泦鎵�鏈夐渶瑕侀�氱煡鐨勭敤鎴稩D锛堟墽琛屼汉+鍒涘缓浜猴紝鍘婚噸锛�
             java.util.Set<Long> receiverIds = new java.util.HashSet<>();
-            
+
             // 娣诲姞鎵ц浜�
             if (event.getAssigneeIds() != null) {
                 receiverIds.addAll(event.getAssigneeIds());
             }
-            
+
             // 娣诲姞鍒涘缓浜猴紙濡傛灉涓嶆槸鎵ц浜猴級
             if (event.getCreatorId() != null) {
                 receiverIds.add(event.getCreatorId());
             }
-            
+
             // 缁欐瘡涓敤鎴峰彂閫佹秷鎭�
             for (Long receiverId : receiverIds) {
                 SysUser user = sysUserMapper.selectUserById(receiverId);
@@ -320,7 +538,7 @@
                     log.warn("鎵句笉鍒扮敤鎴蜂俊鎭紝鐢ㄦ埛ID锛歿}", receiverId);
                     continue;
                 }
-                
+
                 // 鍒涘缓娑堟伅
                 SysMessage message = new SysMessage();
                 message.setMessageType("STATUS");
@@ -335,13 +553,13 @@
                 message.setIsRead("0");
                 message.setCreateTime(DateUtils.getNowDate());
                 message.setDelFlag("0");
-                
+
                 // 淇濆瓨娑堟伅
                 sysMessageMapper.insertSysMessage(message);
-                log.info("浠诲姟鐘舵�佸彉鏇存秷鎭凡淇濆瓨锛屾秷鎭疘D锛歿}锛屾柊鐘舵�侊細{}锛屾帴鏀朵汉锛歿}", 
+                log.info("浠诲姟鐘舵�佸彉鏇存秷鎭凡淇濆瓨锛屾秷鎭疘D锛歿}锛屾柊鐘舵�侊細{}锛屾帴鏀朵汉锛歿}",
                         message.getMessageId(), event.getNewStatus(), user.getNickName());
             }
-            
+
         } catch (Exception e) {
             log.error("澶勭悊浠诲姟鐘舵�佸彉鏇翠簨浠跺け璐�", e);
         }

--
Gitblit v1.9.1