From 6b29bd596f8b48485d3506bfba4a1e0ea6c7df99 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期二, 14 四月 2026 22:45:40 +0800
Subject: [PATCH] feat: 优化统计及告急处理

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java |  385 ++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 284 insertions(+), 101 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
index 55d2337..6c11568 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
@@ -2,10 +2,8 @@
 
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.LongUtil;
-import com.ruoyi.common.utils.MapValueUtils;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.*;
+import com.ruoyi.system.domain.SysTask;
 import com.ruoyi.system.domain.SysTaskEmergency;
 import com.ruoyi.system.domain.VehicleInfo;
 import com.ruoyi.system.domain.enums.TaskStatus;
@@ -20,6 +18,9 @@
 import com.ruoyi.system.mapper.VehicleInfoMapper;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.IWechatTaskNotifyService;
+import com.ruoyi.system.service.INotifyTaskService;
+import com.ruoyi.system.service.INotifyDispatchService;
+import com.ruoyi.system.domain.NotifyTask;
 import com.ruoyi.system.utils.TaskStatusConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,8 +32,10 @@
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 鏃х郴缁熻浆杩愬崟鍚屾Service涓氬姟灞傚鐞�
@@ -69,92 +72,147 @@
     @Autowired
     private IWechatTaskNotifyService wechatTaskNotifyService;
 
+    @Autowired
+    private INotifyTaskService notifyTaskService;
+
+    @Autowired
+    private INotifyDispatchService notifyDispatchService;
+
 
 
     /**
      * 鍚屾鎸囧畾鏃ユ湡鑼冨洿鐨勬棫绯荤粺杞繍鍗曞埌鏂扮郴缁�
-     * 
-     * @param daysAgo 澶氬皯澶╁墠鐨勬暟鎹紙濡�7琛ㄧず7澶╁墠鐨勬暟鎹級
+     * 浼樺寲锛氬皢澶氬ぉ鑼冨洿鎷嗗垎涓洪�愬ぉ寰幆锛屾瘡娆′粎鏌ヨ1澶╂暟鎹紝閬垮厤澶ф暟鎹噺瀵艰嚧SQL Server瓒呮椂
+     *
+     * @param daysAgo 澶氬皯澶╁墠鐨勬暟鎹紙濡�7琛ㄧず鍚屾鏈�杩�7澶╃殑鏁版嵁锛�
      * @return 鎴愬姛鍚屾鐨勮浆杩愬崟鏁伴噺
      */
     @Override
     public int syncLegacyTransferOrders(int daysAgo) {
-        log.info("寮�濮嬪悓姝}澶╁墠鐨勬棫绯荤粺杞繍鍗曟暟鎹�", daysAgo);
-        
         try {
             // 鍙傛暟楠岃瘉
             if (daysAgo <= 0) {
                 log.error("澶╂暟鍙傛暟蹇呴』澶т簬0");
                 return 0;
             }
-            
-            // 璁$畻鏃ユ湡鑼冨洿
-            Date startDate = DateUtils.addDays(new Date(), -daysAgo);
-            String startDateStr = DateUtils.parseDateToStr("yyyy-MM-dd", startDate);
-            
-            // 浠嶴QL Server鏌ヨ杞繍鍗曟暟鎹�
-            List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr);
-            
-            if (transferOrders == null || transferOrders.isEmpty()) {
-                log.info("鏈煡璇㈠埌{}澶╁墠鐨勮浆杩愬崟鏁版嵁", daysAgo);
-                return 0;
+
+//            log.info("[杞繍鍗曞悓姝 寮�濮嬪悓姝ワ紝鑼冨洿: 鏈�杩憑}澶�", daysAgo);
+            int totalSuccessCount = 0;
+            int totalDays = daysAgo + 1;
+
+            // 鎸夊ぉ鎷嗗垎锛屾瘡娆″彧鍚屾1澶╃殑鏁版嵁锛岄伩鍏嶅ぇ鑼冨洿鏌ヨ瓒呮椂
+            for (int i = daysAgo; i >= 0; i--) {
+                Date dayStart = DateUtils.addDays(new Date(), -i);
+                String dayStartStr = DateUtils.parseDateToStr("yyyy-MM-dd", dayStart) + " 00:00:00";
+                String dayEndStr   = DateUtils.parseDateToStr("yyyy-MM-dd", dayStart) + " 23:59:59";
+
+                int dayIndex = totalDays - i;
+//                log.info("[杞繍鍗曞悓姝 澶勭悊澶� {}/{}: {}", dayIndex, totalDays, dayStartStr);
+                int daySuccessCount = syncSingleDayOrders(dayStartStr, dayEndStr);
+                totalSuccessCount += daySuccessCount;
+//                log.info("[杞繍鍗曞悓姝 {} 瀹屾垚锛屾柊澧炲悓姝�: {}鏉★紝绱: {}鏉�", dayStartStr, daySuccessCount, totalSuccessCount);
             }
-            
-            log.info("鏌ヨ鍒皗}鏉¤浆杩愬崟鏁版嵁锛屽紑濮嬪悓姝�...", transferOrders.size());
-            
-            int successCount = 0;
-            int totalCount = transferOrders.size();
-            int processedCount = 0;
-            
-            for (Map<String, Object> order : transferOrders) {
-                processedCount++;
-                try {
-                    Long serviceOrdID = MapValueUtils.getLongValue(order, "ServiceOrdID");
-                    Long dispatchOrdID = MapValueUtils.getLongValue(order, "DispatchOrdID");
-                    
-                    // 妫�鏌ュ弬鏁版湁鏁堟��
-                    if (serviceOrdID==null || serviceOrdID<=0) {
-                        log.warn("绗瑊}鏉℃暟鎹湇鍔″崟ID涓虹┖锛岃烦杩囧鐞�", processedCount);
-                        continue;
-                    }
-                    
-                    log.debug("姝e湪澶勭悊绗瑊}/{}鏉¤浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", 
-                             processedCount, totalCount, serviceOrdID, dispatchOrdID);
-                    
-                    // 妫�鏌ユ槸鍚﹀凡鍚屾
-                    if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
-                        log.debug("杞繍鍗曞凡鍚屾锛岃烦杩�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
-                        //杩涜鏇存柊鎿嶄綔
-                        updateTransferOrder(serviceOrdID, dispatchOrdID, order);
-                        continue;
-                    }
-                    
-                    // 鍚屾鍗曚釜杞繍鍗�
-                    boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order);
-                    if (success) {
-                        successCount++;
-                    }
-                    
-                    // 鎺у埗鍚屾棰戠巼锛岄伩鍏嶈姹傝繃蹇�
-                    Thread.sleep(100);
-                } catch (InterruptedException ie) {
-                    log.warn("鍚屾浠诲姟琚腑鏂�");
-                    Thread.currentThread().interrupt();
-                    break;
-                } catch (Exception e) {
-                    log.error("鍚屾鍗曚釜杞繍鍗曞け璐�: ServiceOrdID={}, DispatchOrdID={}", 
-                             MapValueUtils.getStringValue(order, "ServiceOrdID"), 
-                             MapValueUtils.getStringValue(order, "DispatchOrdID"), e);
-                }
-            }
-            
-            log.info("鍚屾瀹屾垚锛屽叡澶勭悊{}鏉¤浆杩愬崟锛屾垚鍔熷悓姝}鏉¤浆杩愬崟鏁版嵁", totalCount, successCount);
-            return successCount;
-            
+
+//            log.info("[杞繍鍗曞悓姝 鍏ㄩ儴瀹屾垚锛屽叡鏂板鍚屾 {}鏉�", totalSuccessCount);
+            return totalSuccessCount;
+
         } catch (Exception e) {
             log.error("鍚屾{}澶╁墠鐨勬棫绯荤粺杞繍鍗曟暟鎹紓甯�", daysAgo, e);
             return 0;
         }
+    }
+
+    /**
+     * 鍚屾鍗曞ぉ鐨勮浆杩愬崟鏁版嵁锛圞eyset娓告爣鍒嗛〉锛�
+     *
+     * @param startDateStr 寮�濮嬫棩鏈熷瓧绗︿覆锛坹yyy-MM-dd锛�
+     * @param endDateStr   缁撴潫鏃ユ湡瀛楃涓诧紙yyyy-MM-dd锛�
+     * @return 鎴愬姛鍚屾鐨勮浆杩愬崟鏁伴噺
+     */
+    private int syncSingleDayOrders(String startDateStr, String endDateStr) {
+        final int PAGE_SIZE = 5;
+        long lastId = 0L;
+        int successCount = 0;
+        int pageNum = 0;
+        int totalProcessed = 0;
+
+        try {
+            while (true) {
+                List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr, endDateStr, lastId, PAGE_SIZE);
+
+                if (transferOrders == null || transferOrders.isEmpty()) {
+                    break;
+                }
+
+                pageNum++;
+                int totalCount = transferOrders.size();
+                int processedCount = 0;
+
+//                log.info("[杞繍鍗曞悓姝 {} 绗瑊}椤碉紝鑾峰彇{}.鏉℃暟鎹紝lastId={}", startDateStr, pageNum, totalCount, lastId);
+
+                for (Map<String, Object> order : transferOrders) {
+                    processedCount++;
+                    totalProcessed++;
+                    try {
+                        Long serviceOrdID = MapValueUtils.getLongValue(order, "ServiceOrdID");
+                        Long dispatchOrdID = MapValueUtils.getLongValue(order, "DispatchOrdID");
+
+                        if (serviceOrdID == null || serviceOrdID <= 0) {
+                            log.warn("绗瑊}鏉℃暟鎹湇鍔″崟ID涓虹┖锛岃烦杩囧鐞�", processedCount);
+                            continue;
+                        }
+
+                        // 妫�鏌ユ槸鍚﹀凡鍚屾
+                        if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
+                            log.debug("[杞繍鍗曞悓姝 宸插瓨鍦紝鎵ц鏇存柊: ServiceOrdID={}", serviceOrdID);
+                            updateTransferOrder(serviceOrdID, dispatchOrdID, order);
+                            continue;
+                        }
+
+                        // 鍚屾鍗曚釜杞繍鍗�
+                        log.info("[杞繍鍗曞悓姝 鏂板鍚屾: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                        boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order);
+                        if (success) {
+                            successCount++;
+                            log.info("[杞繍鍗曞悓姝 鍚屾鎴愬姛: ServiceOrdID={}, 褰撳ぉ鏂板绱: {}", serviceOrdID, successCount);
+                        } else {
+                            log.warn("[杞繍鍗曞悓姝 鍚屾澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                        }
+
+                        // 鎺у埗鍚屾棰戠巼锛岄伩鍏嶈姹傝繃蹇�
+                        Thread.sleep(100);
+                    } catch (InterruptedException ie) {
+                        log.warn("鍚屾浠诲姟琚腑鏂�");
+                        Thread.currentThread().interrupt();
+                        return successCount;
+                    } catch (Exception e) {
+                        log.error("鍚屾鍗曚釜杞繍鍗曞け璐�: ServiceOrdID={}, DispatchOrdID={}",
+                                MapValueUtils.getStringValue(order, "ServiceOrdID"),
+                                MapValueUtils.getStringValue(order, "DispatchOrdID"), e);
+                    }
+                }
+
+                // 鏇存柊娓告爣涓烘湰椤垫渶鍚庝竴鏉$殑 ServiceOrdID
+                Map<String, Object> lastOrder = transferOrders.get(transferOrders.size() - 1);
+                Long lastServiceOrdID = MapValueUtils.getLongValue(lastOrder, "ServiceOrdID");
+                if (lastServiceOrdID != null && lastServiceOrdID > 0) {
+                    lastId = lastServiceOrdID;
+                } else {
+                    break;
+                }
+
+                // 鏈〉鏈弧涓�椤碉紝璇存槑宸叉棤鏇村鏁版嵁
+                if (totalCount < PAGE_SIZE) {
+                    break;
+                }
+            }
+
+//            log.info("[杞繍鍗曞悓姝 {} 鍒嗛〉瀹屾垚锛屽叡澶勭悊: {}鏉★紝鏂板鍚屾: {}鏉�", startDateStr, totalProcessed, successCount);
+        } catch (Exception e) {
+            log.error("鍚屾鍗曞ぉ杞繍鍗曟暟鎹紓甯�: date={}", startDateStr, e);
+        }
+
+        return successCount;
     }
     
     /**
@@ -274,7 +332,13 @@
 //                log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, result);
 
                 try {
-                    notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
+                    // 鐩存帴浣跨敤鏂规硶澶撮儴宸叉煡璇㈢殑 emergency 鑾峰彇 taskId
+                    Long taskId = emergency.getTaskId();
+                    if (taskId != null) {
+                        notifyTransferOrderByWechat(taskId, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
+                    } else {
+                        log.warn("鏇存柊鍚庢壘涓嶅埌taskId锛岃烦杩囬�氱煡: ServiceOrdID={}", serviceOrdID);
+                    }
                 } catch (Exception e) {
                     log.error("杞繍鍗曞悓姝ユ垚鍔熷悗鍙戦�佸井淇¢�氱煡澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
                 }
@@ -348,13 +412,13 @@
             createTaskVo.setDeptId(deptId);
 
 
-            int result = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
+            Long taskId = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
 
-            if (result > 0) {
-//                log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, result);
+            if (taskId != null && taskId > 0) {
+//                log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, taskId);
 
                 try {
-                    notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
+                    notifyTransferOrderByWechat(taskId, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
                 } catch (Exception e) {
                     log.error("杞繍鍗曞悓姝ユ垚鍔熷悗鍙戦�佸井淇¢�氱煡澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
                 }
@@ -461,9 +525,9 @@
             createTaskVo.setTaskType("EMERGENCY_TRANSFER"); // 鎬ユ晳杞繍浠诲姟
             
             // 璁剧疆鍗曟嵁绫诲瀷鍜屼换鍔$被鍨婭D锛堜粠鏃х郴缁熷瓧娈垫槧灏勶級
-
-            if (StringUtils.isNotEmpty(serviceOrdClass)) {
-                createTaskVo.setDocumentTypeId(serviceOrdClass);
+            String ServiceOrdAreaType = MapValueUtils.getStringValue(order, "ServiceOrdAreaType");
+            if (StringUtils.isNotEmpty(ServiceOrdAreaType)) {
+                createTaskVo.setDocumentTypeId(ServiceOrdAreaType);
             }
             
             String serviceOrdType = MapValueUtils.getStringValue(order, "ServiceOrdType");
@@ -471,8 +535,21 @@
                 createTaskVo.setTaskTypeId(serviceOrdType);
             }
             
-            // 璁剧疆鍖哄煙绫诲瀷
-            String serviceOrdAreaType = MapValueUtils.getStringValue(order, "ServiceOrdAreaType");
+
+
+           String serviceOrdVIP = MapValueUtils.getStringValue(order, "ServiceOrdVIP");
+           if(serviceOrdVIP!=null){
+               createTaskVo.setServiceOrdVIP(serviceOrdVIP);
+           }else{
+               createTaskVo.setServiceOrdVIP("0");
+           }
+
+           Integer FromHQ_is = MapValueUtils.getIntegerValue(order, "FromHQ_is");
+           if(IntegerUtil.isNotEmpty(FromHQ_is)){
+               createTaskVo.setFromHQ2_is("1");
+           }else{
+               createTaskVo.setFromHQ2_is("0");
+           }
 
             // 璁剧疆鐢ㄦ埛ID
             Long serviceOrdUserID = MapValueUtils.getLongValue(order, "ServiceOrdUserID");
@@ -494,11 +571,20 @@
                 }
             }
             createTaskVo.setPatient(patientInfo);
-            //1000鍏噷锛屾彁鍙栨暟瀛�
+            //1000鍏噷锛屾彁鍙栨暟瀛楋紙鏀寔灏忔暟锛�
             String ServiceOrdTraDistance=MapValueUtils.getStringValue(order, "ServiceOrdTraDistance");
             if(ServiceOrdTraDistance!=null){
-                ServiceOrdTraDistance=ServiceOrdTraDistance.replaceAll("[^0-9]", "");
-                createTaskVo.setDistance(new BigDecimal(ServiceOrdTraDistance));
+                // 淇濈暀鏁板瓧鍜屽皬鏁扮偣锛岀Щ闄ゅ叾浠栧瓧绗�
+                ServiceOrdTraDistance=ServiceOrdTraDistance.replaceAll("[^0-9.]", "");
+                // 澶勭悊澶氫釜灏忔暟鐐圭殑鎯呭喌锛屽彧淇濈暀绗竴涓�
+                int firstDotIndex = ServiceOrdTraDistance.indexOf('.');
+                if (firstDotIndex != -1) {
+                    ServiceOrdTraDistance = ServiceOrdTraDistance.substring(0, firstDotIndex + 1) 
+                        + ServiceOrdTraDistance.substring(firstDotIndex + 1).replace(".", "");
+                }
+                if (!ServiceOrdTraDistance.isEmpty() && !ServiceOrdTraDistance.equals(".")) {
+                    createTaskVo.setTransferDistance(new BigDecimal(ServiceOrdTraDistance));
+                }
             }
 
             
@@ -588,7 +674,7 @@
                 String carLicense = legacyTransferSyncMapper.selectCarLicenseByCarID(carID);
                 if (StringUtils.isNotEmpty(carLicense)) {
                     // 鏍规嵁杞︾墝鍙锋煡璇㈡柊绯荤粺涓殑杞﹁締ID
-                    log.info("杞繍浠诲姟,ServiceOrdID:{},杞﹁締杞︾墝:{}",serviceOrdID,carLicense);
+//                    log.info("杞繍浠诲姟,ServiceOrdID:{},杞﹁締杞︾墝:{}",serviceOrdID,carLicense);
 //                    log.debug("杞﹁締杞︾墝鍙�: {}", carLicense);
                     
                     // 棣栧厛灏濊瘯閫氳繃VehicleInfoMapper鏌ヨ杞﹁締淇℃伅
@@ -609,7 +695,7 @@
                                 List<Long> vehicleIds = new ArrayList<>();
                                 vehicleIds.add(vehicleInfo.getVehicleId());
                                 createTaskVo.setVehicleIds(vehicleIds);
-                                log.debug("杞繍浠诲姟,ServiceOrdID:{} 閫氳繃杞︾墝鍙锋壘鍒拌溅杈嗕俊鎭�: vehicle_id={}, vehicle_no={}",serviceOrdID, vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
+//                                log.debug("杞繍浠诲姟,ServiceOrdID:{} 閫氳繃杞︾墝鍙锋壘鍒拌溅杈嗕俊鎭�: vehicle_id={}, vehicle_no={}",serviceOrdID, vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                             } else {
                                 log.warn("杞繍浠诲姟,ServiceOrdID:{} 鏈壘鍒板搴旂殑杞﹁締淇℃伅: car_id={}, vehicle_no={}",serviceOrdID, carID, carLicense);
                             }
@@ -622,7 +708,7 @@
                             List<Long> vehicleIds = new ArrayList<>();
                             vehicleIds.add(vehicleInfo.getVehicleId());
                             createTaskVo.setVehicleIds(vehicleIds);
-                            log.debug("閫氳繃杞︾墝鍙锋壘鍒拌溅杈嗕俊鎭�: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
+//                            log.debug("閫氳繃杞︾墝鍙锋壘鍒拌溅杈嗕俊鎭�: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                         } else {
                             log.warn("鏈壘鍒板搴旂殑杞﹁締淇℃伅: vehicle_no={}", carLicense);
                         }
@@ -819,7 +905,7 @@
                 return String.join(",", diseaseIds);
             }
             
-            log.info("鏌ヨ鍒扮梾鎯呬俊鎭紝鏈嶅姟鍗旾D: {}, 鐥呮儏鏁伴噺: {}", serviceOrdID, diseaseIds != null ? diseaseIds.size() : 0);
+//            log.info("鏌ヨ鍒扮梾鎯呬俊鎭紝鏈嶅姟鍗旾D: {}, 鐥呮儏鏁伴噺: {}", serviceOrdID, diseaseIds != null ? diseaseIds.size() : 0);
             return null;
         } catch (Exception e) {
             log.error("鏌ヨ鐥呮儏淇℃伅寮傚父锛屾湇鍔″崟ID: {}", serviceOrdID, e);
@@ -837,27 +923,124 @@
                                              SysDept dept,
                                              Map<String, Object> order) {
         try {
-            // 鑾峰彇閫氱煡鎺ユ敹浜哄垪琛�
-            List<SysUser> receivers = getWechatNotifyUsers(dispatchOrdID, dept);
-            if (receivers == null || receivers.isEmpty()) {
-//                log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犲彲鐢ㄥ井淇℃帴鏀朵汉锛宼askId={}", taskId);
+            // 1. 鑾峰彇鎵ц浜哄垪琛�
+            List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
+            if (assignees.isEmpty()) {
+//                log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犳墽琛屼汉锛宼askId={}", taskId);
                 return;
             }
 
-            // 鎻愬彇鎺ユ敹浜� ID 鍒楄〃
-            List<Long> userIds = new ArrayList<>();
-            for (SysUser user : receivers) {
-                if (user != null && user.getUserId() != null) {
-                    userIds.add(user.getUserId());
+            // 2. 鏌ヨ浠诲姟鑾峰彇showTaskCode
+            SysTask sysTask = sysTaskService.getTaskDetail(taskId);
+            String showTaskCode = sysTask != null ? sysTask.getShowTaskCode() : serviceOrdNo;
+
+            // 3. 鏋勫缓閫氱煡鍐呭
+            String notifyContent = buildLegacyNotifyContent(showTaskCode, serviceOrdCcTime, order);
+
+            // 4. 鏌ヨ璇askId宸叉湁鐨勯�氱煡璁板綍锛屾敹闆嗗凡瀛樺湪鐨剈serId闆嗗悎
+            List<NotifyTask> existingTasks = notifyTaskService.selectByTaskIdAndType(taskId, NotifyTask.NOTIFY_TYPE_TASK_ASSIGN);
+            Set<Long> existingUserIds = new HashSet<>();
+            List<NotifyTask> pendingTasks = new ArrayList<>();
+            if (existingTasks != null && !existingTasks.isEmpty()) {
+                for (NotifyTask t : existingTasks) {
+                    existingUserIds.add(t.getUserId());
+                    // 灏嗘湭瀹屾垚鐨勮褰曟敹闆嗙粰寰呭垎鍙戝垪琛�
+                    if (!NotifyTask.STATUS_COMPLETED.equals(t.getStatus())) {
+                        pendingTasks.add(t);
+                    }
                 }
             }
 
-            // 璋冪敤缁熶竴鐨勫井淇¢�氱煡鏈嶅姟
-            int successCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds);
-//            log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟寰俊閫氱煡鍙戦�佸畬鎴愶紝taskId={}, 鎴愬姛={}", taskId, successCount);
+            // 5. 鍙鏂版墽琛屼汉鍒涘缓閫氱煡浠诲姟
+            List<NotifyTask> notifyTasks = new ArrayList<>(pendingTasks);
+            for (TaskCreateVO.AssigneeInfo assignee : assignees) {
+                if (assignee == null || assignee.getUserId() == null) {
+                    continue;
+                }
+                // 璇ョ敤鎴峰凡鏈夐�氱煡璁板綍锛岃烦杩�
+                if (existingUserIds.contains(assignee.getUserId())) {
+//                    log.info("鐢ㄦ埛宸叉湁閫氱煡璁板綍锛岃烦杩囧垱寤猴紝taskId={}, userId={}", taskId, assignee.getUserId());
+                    continue;
+                }
+
+                SysUser user = sysUserService.selectUserById(assignee.getUserId());
+                if (user == null) {
+                    log.warn("鎵句笉鍒版墽琛屼汉鐢ㄦ埛淇℃伅锛寀serId={}", assignee.getUserId());
+                    continue;
+                }
+
+                NotifyTask notifyTask = new NotifyTask();
+                notifyTask.setTaskId(taskId);
+                notifyTask.setTaskCode(showTaskCode);
+                notifyTask.setNotifyType(NotifyTask.NOTIFY_TYPE_TASK_ASSIGN);
+                notifyTask.setUserId(user.getUserId());
+                notifyTask.setUserName(user.getNickName());
+                notifyTask.setUserPhone(user.getPhonenumber());
+                notifyTask.setTitle("杞繍鍗曚换鍔℃淳鍗曢�氱煡");
+                notifyTask.setContent(notifyContent);
+                notifyTask.setCreateBy("绯荤粺鍚屾");
+
+                NotifyTask created = notifyTaskService.createNotifyTask(notifyTask);
+                if (created != null) {
+                    notifyTasks.add(created);
+//                    log.info("鍒涘缓閫氱煡浠诲姟鎴愬姛锛宨d={}, userId={}", created.getId(), user.getUserId());
+                }
+            }
+
+            // 6. 鍒嗗彂閫氱煡浠诲姟
+            if (!notifyTasks.isEmpty()) {
+                int successCount = notifyDispatchService.dispatchNotifies(notifyTasks);
+//                log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟閫氱煡鍒嗗彂瀹屾垚锛宼askId={}, 鍒嗗彂鏁伴噺={}, 鎴愬姛鏁伴噺={}",
+//                        taskId, notifyTasks.size(), successCount);
+            }
+//            else {
+//                log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犻渶鏂板閫氱煡锛宼askId={}", taskId);
+//            }
+
+            // 5. 鍚屾椂淇濈暀鍘熸湁鐨勫井淇¢�氱煡鏈嶅姟锛堝吋瀹癸級
+            // List<Long> userIds = new ArrayList<>();
+            // for (TaskCreateVO.AssigneeInfo assignee : assignees) {
+            //     if (assignee != null && assignee.getUserId() != null) {
+            //         userIds.add(assignee.getUserId());
+            //     }
+            // }
+            // if (!userIds.isEmpty()) {
+            //     int wxCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds);
+            //     log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟寰俊閫氱煡鍙戦�佸畬鎴愶紝taskId={}, 鎴愬姛={}", taskId, wxCount);
+            // }
+
         } catch (Exception e) {
             log.error("notifyTransferOrderByWechat鍙戠敓寮傚父, serviceOrdID={}, dispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
         }
+    }
+
+    /**
+     * 鏋勫缓鏃х郴缁熷悓姝ヨ浆杩愬崟鐨勯�氱煡鍐呭
+     */
+    private String buildLegacyNotifyContent(String serviceOrdNo, Date serviceOrdCcTime, Map<String, Object> order) {
+        StringBuilder content = new StringBuilder();
+        content.append("鎮ㄦ湁鏂扮殑杞繍浠诲姟锛屼换鍔″崟鍙�:").append(serviceOrdNo);
+
+        // 鍑哄彂鏃堕棿
+        if (serviceOrdCcTime != null) {
+            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+            content.append("锛屽嚭鍙戞椂闂�:").append(df.format(serviceOrdCcTime));
+        }
+
+        // 鍑哄彂鍦�
+        String departure = MapValueUtils.getStringValue(order, "ServiceOrdTraVia");
+        if (StringUtils.isNotEmpty(departure)) {
+            content.append("锛屽嚭鍙戝湴:").append(departure);
+        }
+
+        // 鐩殑鍦�
+        String destination = MapValueUtils.getStringValue(order, "ServiceOrdTraEnd");
+        if (StringUtils.isNotEmpty(destination)) {
+            content.append("锛岀洰鐨勫湴:").append(destination);
+        }
+
+        content.append("锛岃鍙婃椂澶勭悊銆�");
+        return content.toString();
     }
 
     private List<SysUser> getWechatNotifyUsers(Long dispatchOrdID, SysDept dept) {
@@ -865,7 +1048,7 @@
             List<SysUser> result = new ArrayList<>();
 
             List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
-            if (assignees != null && !assignees.isEmpty()) {
+            if (!assignees.isEmpty()) {
                 for (TaskCreateVO.AssigneeInfo assigneeInfo : assignees) {
                     if (assigneeInfo == null || assigneeInfo.getUserId() == null) {
                         continue;

--
Gitblit v1.9.1