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 |  910 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 611 insertions(+), 299 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 abc7e5c..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
@@ -1,15 +1,14 @@
 package com.ruoyi.system.service.impl;
 
-import com.ruoyi.common.annotation.DataSource;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.enums.DataSourceType;
-import com.ruoyi.common.utils.DateUtils;
-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;
 import com.ruoyi.system.domain.vo.TaskCreateVO;
+import com.ruoyi.system.domain.vo.TaskUpdateVO;
 import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
 import com.ruoyi.system.mapper.SysTaskMapper;
 import com.ruoyi.system.service.ILegacyTransferSyncService;
@@ -18,8 +17,14 @@
 import com.ruoyi.system.mapper.LegacyTransferSyncMapper;
 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;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -27,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涓氬姟灞傚鐞�
@@ -61,89 +68,151 @@
 
     @Autowired
     private ISysUserService sysUserService;
-    
+
+    @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 {
-                    String serviceOrdID = getStringValue(order, "ServiceOrdID");
-                    String dispatchOrdID = getStringValue(order, "DispatchOrdID");
-                    
-                    // 妫�鏌ュ弬鏁版湁鏁堟��
-                    if (StringUtils.isEmpty(serviceOrdID)) {
-                        log.warn("绗瑊}鏉℃暟鎹湇鍔″崟ID涓虹┖锛岃烦杩囧鐞�", processedCount);
-                        continue;
-                    }
-                    
-                    log.debug("姝e湪澶勭悊绗瑊}/{}鏉¤浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", 
-                             processedCount, totalCount, serviceOrdID, dispatchOrdID);
-                    
-                    // 妫�鏌ユ槸鍚﹀凡鍚屾
-                    if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
-                        log.debug("杞繍鍗曞凡鍚屾锛岃烦杩�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
-                        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={}", 
-                             getStringValue(order, "ServiceOrdID"), 
-                             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;
     }
     
     /**
@@ -154,31 +223,35 @@
      * @return 鏄惁鍚屾鎴愬姛
      */
     @Override
-    public boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID) {
-        log.info("寮�濮嬪悓姝ュ崟涓浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+    public boolean syncSingleTransferOrder(Long serviceOrdID, Long dispatchOrdID) {
+//        log.info("寮�濮嬪悓姝ュ崟涓浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
         
         try {
             // 妫�鏌ュ弬鏁版湁鏁堟��
-            if (StringUtils.isEmpty(serviceOrdID)) {
+            if (serviceOrdID == null || serviceOrdID <= 0) {
                 log.error("鏈嶅姟鍗旾D涓嶈兘涓虹┖");
                 return false;
             }
+
+
             
+            List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID);
+
+            Map<String, Object> order = transferOrders.get(0);
+
             // 妫�鏌ユ槸鍚﹀凡鍚屾
             if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
-                log.info("杞繍鍗曞凡鍚屾锛岃烦杩�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+//                log.info("杞繍鍗曞凡鍚屾锛岃烦杩�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                updateTransferOrder(serviceOrdID, dispatchOrdID, order);
                 return true;
             }
             
-            // 鐩存帴鏌ヨ鎸囧畾鐨勮浆杩愬崟淇℃伅
-            List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID);
-            
+
             if (transferOrders == null || transferOrders.isEmpty()) {
                 log.error("鏈煡璇㈠埌瀵瑰簲鐨勮浆杩愬崟淇℃伅: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                 return false;
             }
-            
-            Map<String, Object> order = transferOrders.get(0);
+
             
             // 鍚屾鍗曚釜杞繍鍗�
             return syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order);
@@ -188,7 +261,99 @@
             return false;
         }
     }
-    
+
+    /**
+     * 鏇存柊鍗曚釜杞繍鍗�
+     * @param serviceOrdID
+     * @param dispatchOrdID
+     * @param order
+     * @return
+     */
+    private boolean updateTransferOrder(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order){
+//        log.info("寮�濮嬪悓姝ュ崟涓浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+        String sysTaskCode="";
+        try {
+            SysTaskEmergency emergency=sysTaskEmergencyMapper.selectByLegacyServiceOrdId(serviceOrdID);
+            if(emergency.getNeedResync().equals(1)){
+                log.info("鏂扮郴缁熼渶瑕佸悓姝ュ埌鏃х郴缁熼偅閲岋紝鎵�浠ヤ笉瑕佸悓姝ユ棫鏁版嵁鍒版柊绯荤粺,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return false;
+            }
+            // 鏋勯�燭askCreateVO瀵硅薄
+            TaskCreateVO createTaskVo = buildCreateTaskVo(serviceOrdID, dispatchOrdID, order);
+            if (createTaskVo == null) {
+                log.error("鏋勯�燭askCreateVO澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return false;
+            }
+            sysTaskCode = createTaskVo.getTaskCode();
+            // 璁板綍鍒涘缓鐨勪换鍔′俊鎭�
+//            log.debug("鍑嗗鍒涘缓浠诲姟: ServiceOrdID={}, DispatchOrdID={}, 鎮h�呭鍚�={}, 杞嚭鍖婚櫌={}, 杞叆鍖婚櫌={}",
+//                    serviceOrdID, dispatchOrdID,
+//                    createTaskVo.getPatient() != null ? createTaskVo.getPatient().getName() : "鏈煡",
+//                    createTaskVo.getHospitalOut() != null ? createTaskVo.getHospitalOut().getName() : "鏈煡",
+//                    createTaskVo.getHospitalIn() != null ? createTaskVo.getHospitalIn().getName() : "鏈煡");
+            /**
+             * 寮�鍗曟椂闂�
+             */
+            Date ServiceOrd_CC_Time= MapValueUtils.getDateValue(order, "ServiceOrd_CC_Time");
+            // 璋冪敤sysTaskService鍒涘缓浠诲姟
+            String serviceOrdClass = MapValueUtils.getStringValue(order,"ServiceOrdClass");
+            String serviceOrdNo = MapValueUtils.getStringValue(order,"ServiceOrdNo");
+
+            Integer oauserId=MapValueUtils.getIntegerValue(order,"ServiceOrd_CC_ID");
+            if(oauserId==null){
+                oauserId=MapValueUtils.getIntegerValue(order,"ServiceOrd_NS_ID");
+            }
+            if(oauserId==null || oauserId==0) {
+                log.error("鍒涘缓浠诲姟鏃讹紝鑾峰彇鍒涘缓浜轰俊鎭け璐ワ紝serviceOrdID={}, DispatchOrdID={} ServiceOrd_NS_ID={},ServiceOrd_CC_ID={}", serviceOrdID, dispatchOrdID, MapValueUtils.getIntegerValue(order, "ServiceOrd_NS_ID"), MapValueUtils.getIntegerValue(order, "ServiceOrd_CC_ID"));
+                return false;
+            }
+            SysUser sysUser=sysUserService.selectUserByOaUserId(oauserId);
+            Long taskCreatorId=sysUser==null?null:sysUser.getUserId();
+            String createUserName=sysUser==null?"system":sysUser.getUserName();
+            if(taskCreatorId==null || createUserName==null){
+                log.error("鍒涘缓浠诲姟鏃讹紝鑾峰彇鍒涘缓浜轰俊鎭け璐ワ紝serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return false;
+            }
+            SysDept dept=sysDeptService.selectDeptByServiceClass(serviceOrdClass);
+            Long deptId=dept==null?null:dept.getDeptId();
+            if(deptId==null){
+                log.error("鍒涘缓浠诲姟鏃讹紝鑾峰彇閮ㄩ棬淇℃伅澶辫触锛宻erviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return false;
+            }
+            createTaskVo.setDeptId(deptId);
+            TaskUpdateVO updateTaskVo = new TaskUpdateVO();
+            BeanUtils.copyProperties(createTaskVo, updateTaskVo);
+
+//            log.info("寮�濮嬩繚瀛樿浆杩愪换鍔�,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+
+            int result = sysTaskService.updateTask(updateTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
+
+            if (result > 0) {
+//                log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, result);
+
+                try {
+                    // 鐩存帴浣跨敤鏂规硶澶撮儴宸叉煡璇㈢殑 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);
+                }
+
+                return true;
+            } else {
+                log.error("杞繍鍗曞悓姝ュけ璐�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return false;
+            }
+
+        } catch (Exception e) {
+            log.error("鍚屾鍗曚釜杞繍鍗曞紓甯�: ServiceOrdID={}, DispatchOrdID={},sysTaskCode:{}", serviceOrdID, dispatchOrdID,sysTaskCode, e);
+            return false;
+        }
+    }
     /**
      * 鍚屾鍗曚釜鏃х郴缁熻浆杩愬崟鍒版柊绯荤粺锛堝甫璇︾粏淇℃伅锛�
      * 
@@ -197,40 +362,67 @@
      * @param order 杞繍鍗曡缁嗕俊鎭�
      * @return 鏄惁鍚屾鎴愬姛
      */
-    private boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) {
-        log.info("寮�濮嬪悓姝ュ崟涓浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
-        
+    private boolean syncSingleTransferOrder(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order) {
+//        log.info("寮�濮嬪悓姝ュ崟涓浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+        String sysTaskCode="";
         try {
             // 鏋勯�燭askCreateVO瀵硅薄
             TaskCreateVO createTaskVo = buildCreateTaskVo(serviceOrdID, dispatchOrdID, order);
-            
+
             if (createTaskVo == null) {
                 log.error("鏋勯�燭askCreateVO澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                 return false;
             }
-            
+            sysTaskCode = createTaskVo.getTaskCode();
             // 璁板綍鍒涘缓鐨勪换鍔′俊鎭�
-            log.debug("鍑嗗鍒涘缓浠诲姟: ServiceOrdID={}, DispatchOrdID={}, 鎮h�呭鍚�={}, 杞嚭鍖婚櫌={}, 杞叆鍖婚櫌={}", 
-                     serviceOrdID, dispatchOrdID, 
-                     createTaskVo.getPatient() != null ? createTaskVo.getPatient().getName() : "鏈煡",
-                     createTaskVo.getHospitalOut() != null ? createTaskVo.getHospitalOut().getName() : "鏈煡",
-                     createTaskVo.getHospitalIn() != null ? createTaskVo.getHospitalIn().getName() : "鏈煡");
-
-            Date ServiceOrd_CC_Time= getDateValue(order, "ServiceOrd_CC_Time");
+//            log.debug("鍑嗗鍒涘缓浠诲姟: ServiceOrdID={}, DispatchOrdID={}, 鎮h�呭鍚�={}, 杞嚭鍖婚櫌={}, 杞叆鍖婚櫌={}",
+//                     serviceOrdID, dispatchOrdID,
+//                     createTaskVo.getPatient() != null ? createTaskVo.getPatient().getName() : "鏈煡",
+//                     createTaskVo.getHospitalOut() != null ? createTaskVo.getHospitalOut().getName() : "鏈煡",
+//                     createTaskVo.getHospitalIn() != null ? createTaskVo.getHospitalIn().getName() : "鏈煡");
+            /**
+             * 寮�鍗曟椂闂�
+             */
+            Date ServiceOrd_CC_Time= MapValueUtils.getDateValue(order, "ServiceOrd_CC_Time");
             // 璋冪敤sysTaskService鍒涘缓浠诲姟
-            String serviceOrdClass = getStringValue(order,"ServiceOrdClass");
+            String serviceOrdClass = MapValueUtils.getStringValue(order,"ServiceOrdClass");
+            String serviceOrdNo = MapValueUtils.getStringValue(order,"ServiceOrdNo");
 
-            Integer oauserId=getIntegerValue(order,"ServiceOrd_NS_ID");
+            /**
+             * 鍒涘缓浜篒D
+             */
+            Integer oauserId=MapValueUtils.getIntegerValue(order,"ServiceOrd_CC_ID");
+            if(oauserId==null || oauserId==0) {
+                oauserId=MapValueUtils.getIntegerValue(order,"ServiceOrd_NS_ID");
+            }
             SysUser sysUser=sysUserService.selectUserByOaUserId(oauserId);
-            Long taskCreatorId=sysUser==null?null:sysUser.getUserId();
-            String createUserName=sysUser==null?"system":sysUser.getUserName();
+            if(sysUser==null) {
+                log.error("鍒涘缓浠诲姟鏃讹紝鑾峰彇鍒涘缓浜轰俊鎭け璐ワ紝serviceOrdID={}, DispatchOrdID={} ServiceOrd_CC_ID:{},ServiceOrd_NS_ID:{}", serviceOrdID, dispatchOrdID, MapValueUtils.getIntegerValue(order, "ServiceOrd_CC_ID"), MapValueUtils.getIntegerValue(order, "ServiceOrd_NS_ID"));
+                return false;
+            }
+            
+            Long taskCreatorId= sysUser.getUserId();
+            String createUserName= sysUser.getUserName();
             SysDept dept=sysDeptService.selectDeptByServiceClass(serviceOrdClass);
             Long deptId=dept==null?null:dept.getDeptId();
+            if(deptId==null){
+                log.error("鍒涘缓浠诲姟鏃讹紝鑾峰彇閮ㄩ棬淇℃伅澶辫触锛宻erviceOrdID={}, DispatchOrdID={} ServiceOrdClass:{}", serviceOrdID, dispatchOrdID, serviceOrdClass);
+                return false;
+            }
+            createTaskVo.setDeptId(deptId);
 
-            int result = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
 
-            if (result > 0) {
-                log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, result);
+            Long taskId = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
+
+            if (taskId != null && taskId > 0) {
+//                log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, taskId);
+
+                try {
+                    notifyTransferOrderByWechat(taskId, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
+                } catch (Exception e) {
+                    log.error("杞繍鍗曞悓姝ユ垚鍔熷悗鍙戦�佸井淇¢�氱煡澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
+                }
+
                 return true;
             } else {
                 log.error("杞繍鍗曞悓姝ュけ璐�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
@@ -238,7 +430,7 @@
             }
             
         } catch (Exception e) {
-            log.error("鍚屾鍗曚釜杞繍鍗曞紓甯�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
+            log.error("鍚屾鍗曚釜杞繍鍗曞紓甯�: ServiceOrdID={}, DispatchOrdID={},sysTaskCode:{}", serviceOrdID, dispatchOrdID,sysTaskCode, e);
             return false;
         }
     }
@@ -251,10 +443,10 @@
      * @return 鏄惁宸插悓姝�
      */
     @Override
-    public boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID) {
+    public boolean isTransferOrderSynced(Long serviceOrdID, Long dispatchOrdID) {
         try {
             // 妫�鏌ュ弬鏁版湁鏁堟��
-            if (StringUtils.isEmpty(serviceOrdID)) {
+            if (LongUtil.isEmpty(serviceOrdID)) {
                 log.warn("鏈嶅姟鍗旾D涓嶈兘涓虹┖");
                 return false;
             }
@@ -263,7 +455,7 @@
             // 鏉′欢锛歭egacy_service_ord_id = serviceOrdID 鎴� legacy_dispatch_ord_id = dispatchOrdID
             
             try {
-                SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.valueOf(serviceOrdID));
+                SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(serviceOrdID);
                 if (emergency != null) {
                     return true;
                 }
@@ -271,9 +463,9 @@
                 log.warn("鏈嶅姟鍗旾D涓嶆槸鏈夋晥鏁板瓧: {}", serviceOrdID);
             }
             
-            if (StringUtils.isNotEmpty(dispatchOrdID)) {
+            if (LongUtil.isNotEmpty(dispatchOrdID)) {
                 try {
-                    SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(Long.valueOf(dispatchOrdID));
+                    SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(dispatchOrdID);
                     if (emergency != null) {
                         return true;
                     }
@@ -288,7 +480,18 @@
             return false;
         }
     }
-    
+
+    private String getServiceOrdCode(Date ServiceOrd_CC_Time,String serviceOrdClass,String serviceOrdNo){
+        //BF20251101-serviceOrdNo;
+        //灏� ServiceOrd_CC_Time 杞负 yyyyMMdd 鏍煎紡
+        String ServiceOrd_CC_Time_Str= DateUtils.parseDateToStr(DateUtils.YYYYMMDD,ServiceOrd_CC_Time);
+        //serviceOrdNo 杩欎釜鏄暟瀛楋紝鍥哄畾3浣嶆暟 锛屽皢32锛岃浆鎴�032锛涘皢1杞垚001
+        Integer intServiceNo=Integer.valueOf(serviceOrdNo);
+        String ServiceOrdNo_Str=String.format("%03d", intServiceNo);
+        return serviceOrdClass+ServiceOrd_CC_Time_Str+"-"+ServiceOrdNo_Str;
+    }
+
+
     /**
      * 鏋勯�燭askCreateVO瀵硅薄鐢ㄤ簬鍒涘缓浠诲姟
      * 
@@ -298,8 +501,8 @@
      * @return TaskCreateVO瀵硅薄
      */
     @Override
-    public TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) {
-        log.info("鏋勯�燭askCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+    public TaskCreateVO buildCreateTaskVo(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order) {
+//        log.info("鏋勯�燭askCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
 
         try {
             // 妫�鏌ュ弬鏁版湁鏁堟��
@@ -308,54 +511,58 @@
                 return null;
             }
             
-            if (StringUtils.isEmpty(serviceOrdID)) {
+            if (LongUtil.isEmpty(serviceOrdID)) {
                 log.error("鏈嶅姟鍗旾D涓嶈兘涓虹┖");
                 return null;
             }
-            
+            String serviceOrdClass = MapValueUtils.getStringValue(order, "ServiceOrdClass");
+
             TaskCreateVO createTaskVo = new TaskCreateVO();
-            String Old_ServiceOrdID_TXT=getStringValue(order,"Old_ServiceOrdID_TXT");
-            if(Old_ServiceOrdID_TXT!=null){
-                createTaskVo.setTaskCode(Old_ServiceOrdID_TXT);
-            }
-            
+            String serviceOrdCode=this.getServiceOrdCode(MapValueUtils.getDateValue(order, "ServiceOrd_CC_Time"),serviceOrdClass,MapValueUtils.getStringValue(order, "ServiceOrdNo"));
+            createTaskVo.setTaskCode(serviceOrdCode);
+//            log.info("鏋勯�燭askCreateVO: ServiceOrdID={}, DispatchOrdID={},taskCode:{}", serviceOrdID, dispatchOrdID,serviceOrdCode);
             // 璁剧疆鍩烘湰淇℃伅
             createTaskVo.setTaskType("EMERGENCY_TRANSFER"); // 鎬ユ晳杞繍浠诲姟
             
             // 璁剧疆鍗曟嵁绫诲瀷鍜屼换鍔$被鍨婭D锛堜粠鏃х郴缁熷瓧娈垫槧灏勶級
-            String serviceOrdClass = getStringValue(order, "ServiceOrdClass");
-            if (StringUtils.isNotEmpty(serviceOrdClass)) {
-                createTaskVo.setDocumentTypeId(serviceOrdClass);
+            String ServiceOrdAreaType = MapValueUtils.getStringValue(order, "ServiceOrdAreaType");
+            if (StringUtils.isNotEmpty(ServiceOrdAreaType)) {
+                createTaskVo.setDocumentTypeId(ServiceOrdAreaType);
             }
             
-            String serviceOrdType = getStringValue(order, "ServiceOrdType");
+            String serviceOrdType = MapValueUtils.getStringValue(order, "ServiceOrdType");
             if (StringUtils.isNotEmpty(serviceOrdType)) {
                 createTaskVo.setTaskTypeId(serviceOrdType);
             }
             
-            // 璁剧疆鍖哄煙绫诲瀷
-            String serviceOrdAreaType = getStringValue(order, "ServiceOrdAreaType");
-            if (StringUtils.isNotEmpty(serviceOrdAreaType)) {
-                // 鍙互鏍规嵁闇�瑕佸皢鍖哄煙绫诲瀷鏄犲皠鍒癟askCreateVO鐨勫叾浠栧瓧娈�
-                log.debug("鍖哄煙绫诲瀷: {}", 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 = getLongValue(order, "ServiceOrdUserID");
-            if (serviceOrdUserID != null) {
-                // 鍙互鏍规嵁闇�瑕佸皢鐢ㄦ埛ID鏄犲皠鍒癟askCreateVO鐨勫叾浠栧瓧娈�
-                log.debug("鐢ㄦ埛ID: {}", serviceOrdUserID);
-            }
-            
+            Long serviceOrdUserID = MapValueUtils.getLongValue(order, "ServiceOrdUserID");
+
             // 璁剧疆鎮h�呬俊鎭�
             TaskCreateVO.PatientInfo patientInfo = new TaskCreateVO.PatientInfo();
-            patientInfo.setName(getStringValue(order, "ServiceOrdPtName"));
-            patientInfo.setPhone(getStringValue(order, "ServiceOrdCoPhone"));
-            patientInfo.setIdCard(getStringValue(order, "ServiceOrdPtIDCard"));
-            patientInfo.setCondition(getStringValue(order, "ServiceOrdPtCondition"));
-            patientInfo.setContact(getStringValue(order, "ServiceOrdCoName"));
+            patientInfo.setName(MapValueUtils.getStringValue(order, "ServiceOrdPtName"));
+            patientInfo.setPhone(MapValueUtils.getStringValue(order, "ServiceOrdCoPhone"));
+            patientInfo.setIdCard(MapValueUtils.getStringValue(order, "ServiceOrdPtIDCard"));
+            patientInfo.setCondition(MapValueUtils.getStringValue(order, "ServiceOrdPtCondition"));
+            patientInfo.setContact(MapValueUtils.getStringValue(order, "ServiceOrdCoName"));
 
-            String serviceOrdPtSex = getStringValue(order, "ServiceOrdPtSex");
+            String serviceOrdPtSex = MapValueUtils.getStringValue(order, "ServiceOrdPtSex");
             if(serviceOrdPtSex!=null){
                 if(serviceOrdPtSex.equals("鐢�")){
                     patientInfo.setGender("male");
@@ -364,18 +571,27 @@
                 }
             }
             createTaskVo.setPatient(patientInfo);
-            //1000鍏噷锛屾彁鍙栨暟瀛�
-            String ServiceOrdTraDistance=getStringValue(order, "ServiceOrdTraDistance");
+            //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));
+                }
             }
 
             
             // 璁剧疆杞嚭鍖婚櫌淇℃伅
 
             TaskCreateVO.HospitalInfo hospitalOutInfo = new TaskCreateVO.HospitalInfo();
-            Long hospitalOutId = getLongValue(order, "ServiceOrdPtOutHospID");
+            Long hospitalOutId = MapValueUtils.getLongValue(order, "ServiceOrdPtOutHospID");
             hospitalOutInfo.setId(hospitalOutId);
             if (hospitalOutId != null) {
                 String hospitalOutName = legacyTransferSyncMapper.selectHospitalNameByHospID(hospitalOutId.toString());
@@ -383,16 +599,13 @@
                     hospitalOutInfo.setName(hospitalOutName);
                 }
             }
-            String ServiceOrdTraVia=getStringValue(order, "ServiceOrdTraVia");
+            String ServiceOrdTraVia=MapValueUtils.getStringValue(order, "ServiceOrdTraVia");
             if(ServiceOrdTraVia!=null){
                 hospitalOutInfo.setAddress(ServiceOrdTraVia);
             }
 
 
-            String hospitalOutDeptId = getStringValue(order, "ServiceOrdPtServicesID");
-
-            //杞嚭搴婁綅
-            String serviceOrdPtServices=getStringValue(order, "ServiceOrdPtServices");
+            String hospitalOutDeptId = MapValueUtils.getStringValue(order, "ServiceOrdPtServicesID");
             hospitalOutInfo.setDepartmentId(hospitalOutDeptId);
             if (StringUtils.isNotEmpty(hospitalOutDeptId)) {
                 String hospitalOutDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalOutDeptId);
@@ -400,6 +613,8 @@
                     hospitalOutInfo.setDepartment(hospitalOutDeptName);
                 }
             }
+            //杞嚭搴婁綅
+            String serviceOrdPtServices=MapValueUtils.getStringValue(order, "ServiceOrdPtServices");
             if(serviceOrdPtServices!= null){
                 hospitalOutInfo.setBedNumber(serviceOrdPtServices);
             }
@@ -407,7 +622,7 @@
             
             // 璁剧疆杞叆鍖婚櫌淇℃伅
             TaskCreateVO.HospitalInfo hospitalInInfo = new TaskCreateVO.HospitalInfo();
-            Long hospitalInId = getLongValue(order, "ServiceOrdPtInHospID");
+            Long hospitalInId = MapValueUtils.getLongValue(order, "ServiceOrdPtInHospID");
             hospitalInInfo.setId(hospitalInId);
             if (hospitalInId != null) {
                 String hospitalInName = legacyTransferSyncMapper.selectHospitalNameByHospID(hospitalInId.toString());
@@ -415,18 +630,18 @@
                     hospitalInInfo.setName(hospitalInName);
                 }
             }
-            String DispatchOrdTraEnd = getStringValue(order, "DispatchOrdTraEnd");
-            if(DispatchOrdTraEnd!= null){
-                hospitalInInfo.setAddress(DispatchOrdTraEnd);
+            String serviceOrdTraEnd = MapValueUtils.getStringValue(order, "ServiceOrdTraEnd");
+            if(serviceOrdTraEnd!= null){
+                hospitalInInfo.setAddress(serviceOrdTraEnd);
             }
             //杞叆搴婁綅
-            String serviceOrdPtInServices =getStringValue(order, "ServiceOrdPtInServices");
+            String serviceOrdPtInServices =MapValueUtils.getStringValue(order, "ServiceOrdPtInServices");
             if(serviceOrdPtInServices!= null){
                 hospitalInInfo.setBedNumber(serviceOrdPtInServices);
             }
 
 
-            String hospitalInDeptId = getStringValue(order, "ServiceOrdPtInServicesID");
+            String hospitalInDeptId = MapValueUtils.getStringValue(order, "ServiceOrdPtInServicesID");
             hospitalInInfo.setDepartmentId(hospitalInDeptId);
             if (StringUtils.isNotEmpty(hospitalInDeptId)) {
                 String hospitalInDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalInDeptId);
@@ -437,25 +652,30 @@
             createTaskVo.setHospitalIn(hospitalInInfo);
             
             // 璁剧疆鍦板潃淇℃伅
-            createTaskVo.setDepartureAddress(getStringValue(order, "ServiceOrdTraVia"));
-            createTaskVo.setDestinationAddress(getStringValue(order, "ServiceOrdTraEnd"));
+            createTaskVo.setDepartureAddress(MapValueUtils.getStringValue(order, "ServiceOrdTraStreet"));
+            createTaskVo.setDestinationAddress(MapValueUtils.getStringValue(order, "ServiceOrdTraEnd"));
             
             // 璁剧疆浠锋牸鍜岃窛绂讳俊鎭�
-            createTaskVo.setPrice(getBigDecimalValue(order, "ServiceOrdTraTxnPrice"));
+            createTaskVo.setPrice(MapValueUtils.getBigDecimalValue(order, "ServiceOrdTraTxnPrice"));
             // 璺濈淇℃伅闇�瑕佷粠鍏朵粬瀛楁璁$畻鎴栬幏鍙�
-            
-            // 璁剧疆鎵ц浜轰俊鎭�
-            List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
-            createTaskVo.setAssignees(assignees);
-            
+
+            if(LongUtil.isNotEmpty(dispatchOrdID)) {
+                // 璁剧疆鎵ц浜轰俊鎭�
+                List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
+                createTaskVo.setAssignees(assignees);
+                if (!assignees.isEmpty()) {
+                    createTaskVo.setAssigneeId(assignees.get(0).getUserId());
+                }
+            }
             // 璁剧疆杞﹁締淇℃伅
             // 杞﹁締ID闇�瑕佹牴鎹瓺ispatchOrdCarID鏌ヨ鑾峰彇
-            String carID = getStringValue(order, "DispatchOrdCarID");
+            String carID = MapValueUtils.getStringValue(order, "DispatchOrdCarID");
             if (StringUtils.isNotEmpty(carID)) {
                 String carLicense = legacyTransferSyncMapper.selectCarLicenseByCarID(carID);
                 if (StringUtils.isNotEmpty(carLicense)) {
                     // 鏍规嵁杞︾墝鍙锋煡璇㈡柊绯荤粺涓殑杞﹁締ID
-                    log.debug("杞﹁締杞︾墝鍙�: {}", carLicense);
+//                    log.info("杞繍浠诲姟,ServiceOrdID:{},杞﹁締杞︾墝:{}",serviceOrdID,carLicense);
+//                    log.debug("杞﹁締杞︾墝鍙�: {}", carLicense);
                     
                     // 棣栧厛灏濊瘯閫氳繃VehicleInfoMapper鏌ヨ杞﹁締淇℃伅
                     try {
@@ -467,7 +687,7 @@
                             List<Long> vehicleIds = new ArrayList<>();
                             vehicleIds.add(vehicleInfo.getVehicleId());
                             createTaskVo.setVehicleIds(vehicleIds);
-                            log.debug("閫氳繃car_id鎵惧埌杞﹁締淇℃伅: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
+//                            log.debug("閫氳繃car_id鎵惧埌杞﹁締淇℃伅: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                         } else {
                             // 濡傛灉閫氳繃car_id鎵句笉鍒帮紝灏濊瘯閫氳繃杞︾墝鍙锋煡璇�
                             vehicleInfo = vehicleInfoMapper.selectVehicleInfoByVehicleNo(carLicense);
@@ -475,9 +695,9 @@
                                 List<Long> vehicleIds = new ArrayList<>();
                                 vehicleIds.add(vehicleInfo.getVehicleId());
                                 createTaskVo.setVehicleIds(vehicleIds);
-                                log.debug("閫氳繃杞︾墝鍙锋壘鍒拌溅杈嗕俊鎭�: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
+//                                log.debug("杞繍浠诲姟,ServiceOrdID:{} 閫氳繃杞︾墝鍙锋壘鍒拌溅杈嗕俊鎭�: vehicle_id={}, vehicle_no={}",serviceOrdID, vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                             } else {
-                                log.warn("鏈壘鍒板搴旂殑杞﹁締淇℃伅: car_id={}, vehicle_no={}", carID, carLicense);
+                                log.warn("杞繍浠诲姟,ServiceOrdID:{} 鏈壘鍒板搴旂殑杞﹁締淇℃伅: car_id={}, vehicle_no={}",serviceOrdID, carID, carLicense);
                             }
                         }
                     } catch (NumberFormatException e) {
@@ -488,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);
                         }
@@ -497,37 +717,38 @@
             }
             
 
+
             // 璁剧疆鍏朵粬淇℃伅
             createTaskVo.setTaskDescription("浠庢棫绯荤粺鍚屾鐨勮浆杩愬崟");
             
             // 璁剧疆澶囨敞淇℃伅
             String remark = "鏈嶅姟鍗旾D: " + serviceOrdID + ", 璋冨害鍗旾D: " + dispatchOrdID;
-            String serviceOrdCoTies = getStringValue(order, "ServiceOrdCoTies");
+            String serviceOrdCoTies = MapValueUtils.getStringValue(order, "ServiceOrdCoTies");
             if (StringUtils.isNotEmpty(serviceOrdCoTies)) {
                 remark += ", 鑱旂郴浜哄叧绯�: " + serviceOrdCoTies;
             }
             createTaskVo.setRemark(remark);
             
             // 璁剧疆璁″垝寮�濮嬫椂闂�
-            Date plannedStartTime = getDateValue(order, "ServiceOrdApptDate");
+            Date plannedStartTime = MapValueUtils.getDateValue(order, "ServiceOrdApptDate");
             if (plannedStartTime != null) {
                 createTaskVo.setPlannedStartTime(plannedStartTime);
             }
 
-            Date actualStartTime = getDateValue(order, "DispatchOrdActualDate");
+            Date actualStartTime = MapValueUtils.getDateValue(order, "DispatchOrdActualDate");
             if (actualStartTime != null) {
                 createTaskVo.setActualStartTime(actualStartTime);
             }
 
-            Date actualEndTime = getDateValue(order, "DispatchOrdReturnDate");
+            Date actualEndTime = MapValueUtils.getDateValue(order, "DispatchOrdReturnDate");
             if (actualEndTime != null) {
                 createTaskVo.setActualEndTime(actualEndTime);
             }
 
 
             
-            // 璁剧疆鍒涘缓鏃堕棿
-            Date createTime = getDateValue(order, "ServiceOrd_CC_Time");
+            // 璁剧疆鍒涘缓鏃堕棿 寮�鍗曟棩鏈�
+            Date createTime = MapValueUtils.getDateValue(order, "ServiceOrd_CC_Time");
             if (createTime != null) {
                 createTaskVo.setCreateTime(createTime);
             }
@@ -546,8 +767,37 @@
                 }
                 createTaskVo.setDiseaseIds(diseaseIds);
             }
-            
-            log.info("TaskCreateVO鏋勯�犲畬鎴�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+
+            Integer dispatchOrdStatus = MapValueUtils.getIntegerValue(order, "DispatchOrdStatus");
+           TaskStatus status= TaskStatusConverter.convertFromLegacyStatus(dispatchOrdStatus);
+           if(status!=null) {
+               createTaskVo.setTaskStatus(status.getCode());
+           }
+
+            // 璁剧疆鏃х郴缁熷悓姝ュ瓧娈�
+            String dispatchOrdNo = MapValueUtils.getStringValue(order, "DispatchOrdNo");
+           if(dispatchOrdNo!=null) {
+               createTaskVo.setLegacyDispatchOrdNo(dispatchOrdNo);
+           }
+           Date ccTime=MapValueUtils.getDateValue(order, "ServiceOrd_CC_Time");
+
+           if(ccTime!=null) {
+               createTaskVo.setLegacyServiceNsTime(ccTime);
+           }
+           Date nsTime=MapValueUtils.getDateValue(order, "DispatchOrd_NS_Time");
+           if(nsTime!=null) {
+               createTaskVo.setLegacyDispatchNsTime(MapValueUtils.getDateValue(order, "DispatchOrd_NS_Time"));
+           }
+           String dispatchOrdClass=MapValueUtils.getStringValue(order, "DispatchOrdClass");
+           if(dispatchOrdClass!=null) {
+               createTaskVo.setLegacyDispatchOrdClass(dispatchOrdClass);
+           }
+
+//           String serviceOrdClass=MapValueUtils.getStringValue(order, "ServiceOrdClass");
+           if(serviceOrdClass!=null) {
+               createTaskVo.setLegacyServiceOrdClass(serviceOrdClass);
+           }
+
             return createTaskVo;
             
         } catch (Exception e) {
@@ -562,23 +812,34 @@
      * @param dispatchOrdID 璋冨害鍗旾D
      * @return 鎵ц浜轰俊鎭垪琛�
      */
-    private List<TaskCreateVO.AssigneeInfo> queryAssignees(String dispatchOrdID) {
+    private List<TaskCreateVO.AssigneeInfo> queryAssignees(Long dispatchOrdID) {
+        long startTime = System.currentTimeMillis();
         try {
             // 妫�鏌ュ弬鏁版湁鏁堟��
-            if (StringUtils.isEmpty(dispatchOrdID)) {
+            if (LongUtil.isEmpty(dispatchOrdID)) {
                 log.warn("璋冨害鍗旾D涓嶈兘涓虹┖");
                 return new ArrayList<>();
             }
             
-            // 浠嶴QL Server鏌ヨ鎵ц浜轰俊鎭�
+            // 灏哠tring杞崲涓篖ong锛岄伩鍏嶆暟鎹簱绫诲瀷涓嶅尮閰嶅鑷寸殑鎬ц兘闂
+
+            
+            // 浠嶴QL Server鏌ヨ鎵ц浜轰俊鎭紙浣跨敤Long绫诲瀷锛屽尮閰岯IGINT瀛楁锛�
             List<Map<String, Object>> assigneeList = legacyTransferSyncMapper.selectAssigneesByDispatchOrdID(dispatchOrdID);
+            long queryTime = System.currentTimeMillis() - startTime;
+            
+            // 璁板綍鎱㈡煡璇紙瓒呰繃500ms锛�
+            if (queryTime > 500) {
+                log.warn("鏌ヨ鎵ц浜轰俊鎭�楁椂杩囬暱: {}ms, 璋冨害鍗旾D: {}, 寤鸿鍦� DispatchOrd_Entourage 琛ㄧ殑 DispatchOrdIDDt 瀛楁涓婂垱寤虹储寮�", 
+                    queryTime, dispatchOrdID);
+            }
             
             // 杞崲涓篢askCreateVO.AssigneeInfo瀵硅薄
             List<TaskCreateVO.AssigneeInfo> assignees = new ArrayList<>();
             if (assigneeList != null && !assigneeList.isEmpty()) {
                 for (Map<String, Object> assigneeMap : assigneeList) {
-                    String entourageOAId = getStringValue(assigneeMap, "EntourageOAId");
-                    String entourageState = getStringValue(assigneeMap, "EntourageState");
+                    String entourageOAId = MapValueUtils.getStringValue(assigneeMap, "EntourageOAId");
+                    String entourageState = MapValueUtils.getStringValue(assigneeMap, "EntourageID");
                     
                     if (StringUtils.isNotEmpty(entourageOAId)) {
                         try {
@@ -589,7 +850,7 @@
                             if (sysUser != null) {
                                 TaskCreateVO.AssigneeInfo assigneeInfo = new TaskCreateVO.AssigneeInfo();
                                 assigneeInfo.setUserId(sysUser.getUserId()); // 浣跨敤绯荤粺鐢ㄦ埛ID
-                                assigneeInfo.setUserName(sysUser.getUserName());
+                                assigneeInfo.setUserName(sysUser.getNickName());
                                 // 鏍规嵁EntourageState纭畾瑙掕壊绫诲瀷
                                 // 1,2 鍙告満锛�3,5 鍖荤敓锛�4,6 鎶ゅ+
                                 if ("1".equals(entourageState) || "2".equals(entourageState)) {
@@ -613,10 +874,11 @@
                 }
             }
             
-            log.info("鏌ヨ鍒皗}涓墽琛屼汉锛岃皟搴﹀崟ID: {}", assignees.size(), dispatchOrdID);
+//            log.debug("鏌ヨ鍒皗}涓墽琛屼汉锛岃皟搴﹀崟ID: {}, 鑰楁椂: {}ms", assignees.size(), dispatchOrdID, System.currentTimeMillis() - startTime);
             return assignees;
         } catch (Exception e) {
-            log.error("鏌ヨ鎵ц浜轰俊鎭紓甯革紝璋冨害鍗旾D: {}", dispatchOrdID, e);
+            long totalTime = System.currentTimeMillis() - startTime;
+            log.error("鏌ヨ鎵ц浜轰俊鎭紓甯革紝璋冨害鍗旾D: {}, 鑰楁椂: {}ms", dispatchOrdID, totalTime, e);
             return new ArrayList<>(); // 杩斿洖绌哄垪琛ㄨ�屼笉鏄痭ull
         }
     }
@@ -627,10 +889,10 @@
      * @param serviceOrdID 鏈嶅姟鍗旾D
      * @return 鐥呮儏ID鍒楄〃
      */
-    private String queryDiseaseIds(String serviceOrdID) {
+    private String queryDiseaseIds(Long serviceOrdID) {
         try {
             // 妫�鏌ュ弬鏁版湁鏁堟��
-            if (StringUtils.isEmpty(serviceOrdID)) {
+            if (LongUtil.isEmpty(serviceOrdID) ) {
                 log.warn("鏈嶅姟鍗旾D涓嶈兘涓虹┖");
                 return null;
             }
@@ -643,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);
@@ -651,120 +913,170 @@
         }
     }
     
-    /**
-     * 浠嶮ap涓幏鍙栧瓧绗︿覆鍊�
-     * 
-     * @param map Map瀵硅薄
-     * @param key 閿�
-     * @return 瀛楃涓插��
-     */
-    private String getStringValue(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        return value != null ? value.toString() : null;
-    }
-    
-    /**
-     * 浠嶮ap涓幏鍙朆igDecimal鍊�
-     * 
-     * @param map Map瀵硅薄
-     * @param key 閿�
-     * @return BigDecimal鍊�
-     */
-    private BigDecimal getBigDecimalValue(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
-        if (value instanceof BigDecimal) {
-            return (BigDecimal) value;
-        }
+
+
+    private void notifyTransferOrderByWechat(Long taskId,
+                                             Long serviceOrdID,
+                                             Long dispatchOrdID,
+                                             String serviceOrdNo,
+                                             Date serviceOrdCcTime,
+                                             SysDept dept,
+                                             Map<String, Object> order) {
         try {
-            return new BigDecimal(value.toString());
-        } catch (NumberFormatException e) {
-            return null;
-        }
-    }
-    
-    /**
-     * 浠嶮ap涓幏鍙朙ong鍊�
-     * 
-     * @param map Map瀵硅薄
-     * @param key 閿�
-     * @return Long鍊�
-     */
-    private Long getLongValue(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
-        if (value instanceof Long) {
-            return (Long) value;
-        }
-        try {
-            return Long.valueOf(value.toString());
-        } catch (NumberFormatException e) {
-            return null;
-        }
-    }
-    private Integer getIntegerValue(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
-        if (value instanceof Integer) {
-            return (Integer) value;
-        }
-        try {
-            return Integer.valueOf(value.toString());
-        } catch (NumberFormatException e) {
-            return null;
-        }
-    }
-    /**
-     * 浠嶮ap涓幏鍙朌ate鍊�
-     * 
-     * @param map Map瀵硅薄
-     * @param key 閿�
-     * @return Date鍊�
-     */
-    private Date getDateValue(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
-        if (value instanceof Date) {
-            return (Date) value;
-        }
-        // 濡傛灉鏄瓧绗︿覆锛屽皾璇曡В鏋�
-        if (value instanceof String) {
-            try {
-                return DateUtils.parseDate(value.toString());
-            } catch (Exception e) {
-                return null;
+            // 1. 鑾峰彇鎵ц浜哄垪琛�
+            List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
+            if (assignees.isEmpty()) {
+//                log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犳墽琛屼汉锛宼askId={}", taskId);
+                return;
             }
-        }
-        return null;
-    }
-    
-    /**
-     * 楠岃瘉鏃ユ湡瀛楃涓叉牸寮忔槸鍚︽湁鏁�
-     * 
-     * @param dateStr 鏃ユ湡瀛楃涓�
-     * @param format 鏃ユ湡鏍煎紡
-     * @return 鏄惁鏈夋晥
-     */
-    private boolean isValidDateFormat(String dateStr, String format) {
-        if (StringUtils.isEmpty(dateStr)) {
-            return false;
-        }
-        
-        try {
-            SimpleDateFormat sdf = new SimpleDateFormat(format);
-            sdf.setLenient(false);
-            sdf.parse(dateStr);
-            return true;
+
+            // 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);
+                    }
+                }
+            }
+
+            // 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) {
-            return false;
+            log.error("notifyTransferOrderByWechat鍙戠敓寮傚父, serviceOrdID={}, dispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
         }
     }
-}
\ No newline at end of file
+
+    /**
+     * 鏋勫缓鏃х郴缁熷悓姝ヨ浆杩愬崟鐨勯�氱煡鍐呭
+     */
+    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) {
+        try {
+            List<SysUser> result = new ArrayList<>();
+
+            List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
+            if (!assignees.isEmpty()) {
+                for (TaskCreateVO.AssigneeInfo assigneeInfo : assignees) {
+                    if (assigneeInfo == null || assigneeInfo.getUserId() == null) {
+                        continue;
+                    }
+                    SysUser user = sysUserService.selectUserById(assigneeInfo.getUserId());
+                    if (user != null && StringUtils.isNotEmpty(user.getOpenId())) {
+                        result.add(user);
+                    }
+                }
+            }
+
+            if (!result.isEmpty()) {
+                return result;
+            }
+
+            if (dept == null || StringUtils.isEmpty(dept.getPhone())) {
+                return result;
+            }
+
+            SysUser leader = sysUserService.selectUserByPhonenumber(dept.getPhone());
+            if (leader != null && StringUtils.isNotEmpty(leader.getOpenId())) {
+                result.add(leader);
+            }
+
+            return result;
+        } catch (Exception e) {
+            log.error("鑾峰彇鏃х郴缁熷悓姝ヨ浆杩愬崟寰俊閫氱煡鎺ユ敹浜哄け璐�, dispatchOrdID={}", dispatchOrdID, e);
+            return new ArrayList<>();
+        }
+    }
+}

--
Gitblit v1.9.1