From 09e6dc3fb7266620fafb5e341808a8eb36e080a1 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 13 十二月 2025 22:51:52 +0800
Subject: [PATCH] feat:增加企业微信消息提醒

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java |  536 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 501 insertions(+), 35 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java
index a58c2c8..32708d8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java
@@ -16,29 +16,29 @@
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
 import java.security.cert.X509Certificate;
-
+import com.ruoyi.common.utils.MapValueUtils;
 import com.ruoyi.system.domain.*;
+import com.ruoyi.system.event.TaskDispatchSyncEvent;
+import com.ruoyi.system.event.TaskServiceOrderSyncEvent;
+import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.task.ITaskAttachmentService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.ruoyi.common.config.LegacySystemConfig;
+import com.ruoyi.common.utils.MapValueUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.system.domain.vo.TaskCreateVO;
-import com.ruoyi.system.mapper.SysTaskMapper;
-import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
-import com.ruoyi.system.mapper.SysTaskVehicleMapper;
-import com.ruoyi.system.mapper.SysTaskAssigneeMapper;
-import com.ruoyi.system.mapper.VehicleInfoMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.utils.TaskStatusConverter;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 鏃х郴缁熷悓姝ervice涓氬姟灞傚鐞�
@@ -56,6 +56,9 @@
     
     @Autowired
     private SysTaskMapper sysTaskMapper;
+    
+    @Autowired
+    private SysTaskEmergencyMapper sysTaskEmergencyMapper;
     
     @Autowired
     private SysUserMapper sysUserMapper;
@@ -86,12 +89,37 @@
 
     @Autowired
     private ITaskAttachmentService taskAttachmentService;
+
+
+    @Autowired
+    private ApplicationEventPublisher eventPublisher;
     
+    @Autowired
+    private LegacyTransferSyncMapper legacyTransferSyncMapper;
+    
+    
+    public Map<String,Object> getLegacyDispatchByDispatchId(Long dispatchId) {
+        List<Map<String, Object>> result = legacyTransferSyncMapper.selectByDispatchId(dispatchId);
+        if(!CollectionUtils.isEmpty(result)){
+            return result.get(0);
+        }else{
+            return null;
+        }
+    }
+
+
+    private Map<String,Object> getLegacyByServiceOrdId(Long serviceOrdId) {
+        List<Map<String, Object>> result = legacyTransferSyncMapper.selectByServiceOrdId(serviceOrdId);
+        if(!CollectionUtils.isEmpty(result)){
+            return result.get(0);
+        }else{
+            return null;
+        }
+    }
     /**
      * 鍚屾鎬ユ晳杞繍浠诲姟鍒版棫绯荤粺
      */
     @Override
-    @Transactional
     public Long syncEmergencyTaskToLegacy(Long taskId) {
         if (!legacyConfig.isEnabled()) {
             log.info("鏃х郴缁熷悓姝ュ凡绂佺敤锛岃烦杩囦换鍔D: {}", taskId);
@@ -144,12 +172,26 @@
                 emergency.setSyncStatus(2); // 鍚屾鎴愬姛
                 emergency.setSyncTime(new Date());
                 emergency.setSyncErrorMsg(null);
+                Map<String, Object> legacy = getLegacyByServiceOrdId(serviceOrdId);
+                String serviceOrdNo = MapValueUtils.getStringValue(legacy, "ServiceOrdNo");
+                if(serviceOrdNo!=null) {
+                    emergency.setLegacyServiceOrdNo(serviceOrdNo);
+                }
+                String serviceOrdClass = MapValueUtils.getStringValue(legacy, "ServiceOrdClass");
+                if(serviceOrdClass!=null) {
+                    emergency.setLegacyServiceOrdClass(serviceOrdClass);
+                }
+                Date serviceCCTime = MapValueUtils.getDateValue(legacy, "ServiceOrd_CC_Time");
+                if(serviceCCTime!=null) {
+                    emergency.setLegacyServiceNsTime(serviceCCTime);
+                }
                 sysTaskEmergencyService.updateSysTaskEmergency(emergency);
                 
                 // 鏇存柊浠诲姟涓昏〃鍚屾鏍囪
                 task.setLegacySynced(1);
                 sysTaskMapper.updateSysTask(task);
-                
+
+                eventPublisher.publishEvent(new TaskServiceOrderSyncEvent(this, taskId, task.getTaskCode(), serviceOrdId));
                 log.info("浠诲姟鍚屾鎴愬姛锛屼换鍔D: {}, ServiceOrdID: {}", taskId, serviceOrdId);
                 return serviceOrdId;
             } else {
@@ -182,7 +224,13 @@
             return null;
         }
     }
-    
+
+    //鍦ㄨ繖閲岀洃鍚淳鍙戠殑浜嬩欢
+    @EventListener
+    public void handleTaskServiceOrderSyncEvent(TaskServiceOrderSyncEvent event) {
+        log.info("鏀跺埌浠诲姟鏈嶅姟鍗曞悓姝ヤ簨浠讹紝浠诲姟ID锛歿}锛屼换鍔$紪鍙凤細{}锛屾湇鍔″崟ID锛歿}", event.getTaskId(), event.getTaskCode(), event.getServiceOrderId());
+        syncDispatchOrderToLegacy(event.getTaskId());
+    }
     /**
      * 鎵归噺鍚屾鏈悓姝ョ殑鎬ユ晳杞繍浠诲姟
      * 浣跨敤鍒嗛〉鏌ヨ锛岀‘淇濇墍鏈夌鍚堟潯浠剁殑浠诲姟閮借兘琚悓姝�
@@ -252,8 +300,7 @@
     /**
      * 閲嶆柊鍚屾澶辫触鐨勪换鍔�
      */
-    @Override
-    @Transactional
+    @Override    
     public boolean retrySyncTask(Long taskId) {
         try {
             // 閲嶇疆鍚屾鐘舵��
@@ -299,7 +346,6 @@
      * 鍚屾璋冨害鍗曞埌鏃х郴缁燂紙admin_save_24.asp锛�
      */
     @Override
-    @Transactional
     public Long syncDispatchOrderToLegacy(Long taskId) {
         if (!legacyConfig.isEnabled()) {
             log.info("鏃х郴缁熷悓姝ュ凡绂佺敤锛岃烦杩囪皟搴﹀崟鍚屾锛屼换鍔D: {}", taskId);
@@ -340,8 +386,70 @@
                 return null;
             }
 
-
-
+            // ====== 鍓嶇疆鏍¢獙锛氱‘淇濅换鍔℃暟鎹畬鏁� ======
+            
+            // 1. 妫�鏌ユ槸鍚﹀凡鍒嗛厤杞﹁締
+            List<SysTaskVehicle> taskVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId);
+            if (taskVehicles == null || taskVehicles.isEmpty()) {
+                log.warn("浠诲姟鏈垎閰嶈溅杈嗭紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            // 2. 妫�鏌ユ槸鍚﹀凡鍒嗛厤鎵ц浜哄憳
+            List<SysTaskAssignee> taskAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
+            if (taskAssignees == null || taskAssignees.isEmpty()) {
+                log.warn("浠诲姟鏈垎閰嶆墽琛屼汉鍛橈紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            // 3. 妫�鏌ラ绾︽椂闂存槸鍚︽湁鏁堬紙蹇呴』澶т簬1970骞达級
+            if (task.getPlannedStartTime() == null) {
+                log.warn("浠诲姟鏈缃绾︽椂闂达紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            // 妫�鏌ラ绾︽椂闂存槸鍚﹀ぇ浜�1970-01-01锛堟椂闂存埑0瀵瑰簲1970-01-01 00:00:00锛�
+            long timestamp1970 = 0L;
+            if (task.getPlannedStartTime().getTime() <= timestamp1970) {
+                log.warn("浠诲姟棰勭害鏃堕棿鏃犳晥锛堝皬浜庣瓑浜�1970骞达級锛岃烦杩囪皟搴﹀崟鍚屾锛屼换鍔D: {}, 棰勭害鏃堕棿: {}", 
+                    taskId, task.getPlannedStartTime());
+                return null;
+            }
+            
+            // 4. 妫�鏌ヨ浆鍑哄尰闄俊鎭�
+            if (StringUtils.isEmpty(emergency.getHospitalOutName())) {
+                log.warn("浠诲姟鏈缃浆鍑哄尰闄紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            if (StringUtils.isEmpty(emergency.getHospitalOutAddress())) {
+                log.warn("浠诲姟鏈缃浆鍑哄尰闄㈠湴鍧�锛岃烦杩囪皟搴﹀崟鍚屾锛屼换鍔D: {}", taskId);
+                return null;
+            }
+            
+            // 5. 妫�鏌ヨ浆鍏ュ尰闄俊鎭�
+            if (StringUtils.isEmpty(emergency.getHospitalInName())) {
+                log.warn("浠诲姟鏈缃浆鍏ュ尰闄紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            if (StringUtils.isEmpty(emergency.getHospitalInAddress())) {
+                log.warn("浠诲姟鏈缃浆鍏ュ尰闄㈠湴鍧�锛岃烦杩囪皟搴﹀崟鍚屾锛屼换鍔D: {}", taskId);
+                return null;
+            }
+            
+            // 6. 妫�鏌ユ偅鑰呭熀鏈俊鎭�
+            if (StringUtils.isEmpty(emergency.getPatientName())) {
+                log.warn("浠诲姟鏈缃偅鑰呭鍚嶏紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            if (StringUtils.isEmpty(emergency.getPatientPhone())) {
+                log.warn("浠诲姟鏈缃偅鑰呯數璇濓紝璺宠繃璋冨害鍗曞悓姝ワ紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+            
+            log.info("浠诲姟鏁版嵁鏍¢獙閫氳繃锛屽紑濮嬪悓姝ヨ皟搴﹀崟锛屼换鍔D: {}", taskId);
 
             // 鏇存柊鍚屾鐘舵�佷负鍚屾涓�
             emergency.setDispatchSyncStatus(1);
@@ -353,6 +461,7 @@
             // 鏋勫缓璇锋眰鍙傛暟
             Map<String, String> params = buildDispatchOrderParams(task, emergency);
             
+           
             // 鍙戦�丠TTP璇锋眰
             String response = sendHttpPost(legacyConfig.getDispatchCreateUrl(), params);
             
@@ -365,13 +474,18 @@
                 emergency.setDispatchSyncStatus(2); // 鍚屾鎴愬姛
                 emergency.setDispatchSyncTime(new Date());
                 emergency.setDispatchSyncErrorMsg(null);
+                //鏇存柊璋冨害鍗曚俊鎭紑鍒版柊绯荤粺
+                Map<String,Object> dispatchInfo = this.getLegacyDispatchByDispatchId(dispatchOrdId);
+                if (dispatchInfo != null) {
+                    emergency.setLegacyDispatchNsTime(MapValueUtils.getDateValue(dispatchInfo, "DispatchOrd_NS_Time")); // 鍚屾鎴愬姛
+                    emergency.setLegacyDispatchOrdClass(MapValueUtils.getStringValue(dispatchInfo, "DispatchOrdClass")); // 鍚屾鎴愬姛
+                    emergency.setLegacyDispatchOrdNo(MapValueUtils.getStringValue(dispatchInfo, "DispatchOrdNo")); // 鍚屾鎴愬姛
+                    emergency.setLegacyServiceNsTime(MapValueUtils.getDateValue(dispatchInfo, "ServiceOrd_CC_Time")); // 鍚屾鎴愬姛
+                    emergency.setLegacyServiceOrdClass(MapValueUtils.getStringValue(dispatchInfo, "ServiceOrdClass")); // 鍚屾鎴愬姛
+                }
                 sysTaskEmergencyService.updateSysTaskEmergency(emergency);
 
-                List<SysTaskAttachment> taskAttachments= sysTaskService.getAttachmentsByTaskId(taskId);
-                if (taskAttachments != null && !taskAttachments.isEmpty()) {
-                    //鍚屾闄勪欢
-                   this.syncAttachmentToLegacy(taskAttachments,serviceOrdId,dispatchOrdId,oaUserID);
-                }
+                eventPublisher.publishEvent(new TaskDispatchSyncEvent(this, taskId, task.getTaskCode(),serviceOrdId, dispatchOrdId, oaUserID));
 
                 log.info("璋冨害鍗曞悓姝ユ垚鍔燂紝浠诲姟ID: {}, DispatchOrdID: {}", taskId, dispatchOrdId);
                 return dispatchOrdId;
@@ -405,7 +519,19 @@
             return null;
         }
     }
-    
+
+    @EventListener
+    public void handleTaskDispatchSyncEvent(TaskDispatchSyncEvent event) {
+        Long taskId = event.getTaskId();
+        Long dispatchOrdId = event.getDispatchOrderId();
+        Long serviceOrdId = event.getServiceOrderId();
+        Integer oaUserID = event.getOaUserId();
+        List<SysTaskAttachment> taskAttachments= sysTaskService.getAttachmentsByTaskId(taskId);
+        if (taskAttachments != null && !taskAttachments.isEmpty()) {
+            //鍚屾闄勪欢
+            this.syncAttachmentToLegacy(taskAttachments,serviceOrdId,dispatchOrdId,oaUserID);
+        }
+    }
     /**
      * 鎵归噺鍚屾鏈悓姝ョ殑璋冨害鍗�
      * 浣跨敤鍒嗛〉鏌ヨ锛岀‘淇濇墍鏈夌鍚堟潯浠剁殑浠诲姟閮借兘琚悓姝�
@@ -425,17 +551,17 @@
             while (true) {
                 // 鍒嗛〉鏌ヨ宸插悓姝ユ湇鍔″崟浣嗘湭鍚屾璋冨害鍗曠殑浠诲姟
                 List<SysTaskEmergency> pendingTasks = sysTaskEmergencyService.selectPendingDispatchSyncTasks(offset, pageSize);
-                log.info("鏌ヨ鍒版湭鍚屾璋冨害鍗曠殑浠诲姟鏁伴噺: {}", pendingTasks.size());
+//                log.info("鏌ヨ鍒版湭鍚屾璋冨害鍗曠殑浠诲姟鏁伴噺: {}", pendingTasks.size());
                 if (pendingTasks == null || pendingTasks.isEmpty()) {
                     log.info("娌℃湁鏇村闇�瑕佸悓姝ヨ皟搴﹀崟鐨勪换鍔★紝offset: {}", offset);
                     break; // 娌℃湁鏇村鏁版嵁锛岄��鍑哄惊鐜�
                 }
                 
-                log.info("寮�濮嬪悓姝ヨ皟搴﹀崟绗� {} 椤碉紝浠诲姟鏁伴噺: {}", (offset / pageSize) + 1, pendingTasks.size());
+//                log.info("寮�濮嬪悓姝ヨ皟搴﹀崟绗� {} 椤碉紝浠诲姟鏁伴噺: {}", (offset / pageSize) + 1, pendingTasks.size());
                 
                 int pageSuccessCount = 0;
                 for (SysTaskEmergency emergency : pendingTasks) {
-                    log.info("寮�濮嬪悓姝ヨ皟搴﹀崟锛屼换鍔D: {}", emergency.getTaskId());
+//                    log.info("寮�濮嬪悓姝ヨ皟搴﹀崟锛屼换鍔D: {}", emergency.getTaskId());
                     Long dispatchOrdId = syncDispatchOrderToLegacy(emergency.getTaskId());
 
                     if (dispatchOrdId != null && dispatchOrdId > 0) {
@@ -521,7 +647,8 @@
         params.put("DispatchOrdCoPhone", StringUtils.nvl(emergency.getPatientPhone(), ""));
         params.put("ServiceOrdCoName", StringUtils.nvl(emergency.getPatientContact(), ""));
         params.put("ServiceOrdCoPhone", StringUtils.nvl(emergency.getPatientPhone(), ""));
-        
+        params.put("ServiceOrdPtName", StringUtils.nvl(emergency.getPatientName(), ""));
+        params.put("ServiceOrdTraStreet",StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), "")));
         // 鍦板潃淇℃伅
         params.put("DispatchOrdTraStreet", StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), "")));
         params.put("DispatchOrdTraEnd", StringUtils.nvl(task.getDestinationAddress(), StringUtils.nvl(emergency.getHospitalInAddress(), "")));
@@ -530,8 +657,20 @@
         // 鎿嶄綔鍛戒护
         params.put("DispatchOrd_Check", "0"); // 3=鐩存帴寮哄埗瀹屾垚
         
-        // 缁╂晥鍜岃垂鐢�
-        params.put("DispatchOrdPerfomance", emergency.getTransferPrice() != null ? emergency.getTransferPrice().toString() : "0");
+        // 缁╂晥鍜岃垂鐢細纭繚鏁板�煎瓧娈典笉涓簄ull
+        String transferPrice = "0";
+        if (emergency.getTransferPrice() != null) {
+            try {
+                transferPrice = emergency.getTransferPrice().toString();
+                if (transferPrice.contains(".")) {
+                    transferPrice = new java.math.BigDecimal(transferPrice).stripTrailingZeros().toPlainString();
+                }
+            } catch (Exception e) {
+                log.warn("杞崲杞繍浠锋牸澶辫触锛屼换鍔D: {}, 浣跨敤榛樿鍊�0", task.getTaskId(), e);
+                transferPrice = "0";
+            }
+        }
+        params.put("DispatchOrdPerfomance", transferPrice);
         params.put("StretcherMoney", "0"); // 鎶媴鏋惰垂
         params.put("AddMoneyType", ""); // 闄勫姞椤圭洰
         params.put("AddMoney", "0"); // 闄勫姞椤圭洰璐圭敤
@@ -564,7 +703,8 @@
         params.put("ServiceOrdPtDoctorPhone", ""); // 鎮h�呭尰鐢熺數璇�
         params.put("TransferModeID", ""); // 杞繍鏂瑰紡
         params.put("ServiceOrdVIP", "0"); // VIP瀹㈡埛
-        params.put("ServiceOrdTraTxnPrice", emergency.getTransferPrice() != null ? emergency.getTransferPrice().toString() : "0"); // 鎴愪氦浠�
+        // 浠锋牸瀛楁澶嶇敤锛岀‘淇濅竴鑷存��
+        params.put("ServiceOrdTraTxnPrice", transferPrice); // 鎴愪氦浠�
         params.put("ServiceOrdTraPrePayment", "0"); // 闇�棰勪粯娆�
         params.put("SettlementPrice", "0"); // 缁撶畻浠�
         params.put("ServiceOrdTraPriceReason", ""); // 宸环鍘熷洜
@@ -581,7 +721,21 @@
         params.put("ServiceOrdEstimatedOrderDate", ""); // 棰勮娲惧崟鏃堕棿
         params.put("ServiceOrdEstimatedOrderDateOld", ""); // 鍘熼璁℃淳鍗曟椂闂�
         params.put("ServiceOrdViaDistance", "0"); // 涓�旇窛绂�
-        params.put("ServiceOrdTraDistance", emergency.getTransferDistance() != null ? emergency.getTransferDistance().toString() : "0"); // 璺濈
+        // 璺濈瀛楁锛氱‘淇濅笉涓虹┖锛岄伩鍏嶆棫绯荤粺鎺ュ彛鎶ラ敊
+        String transferDistance = "0";
+        if (emergency.getTransferDistance() != null) {
+            try {
+                transferDistance = emergency.getTransferDistance().toString();
+                // 鍘婚櫎鍙兘鐨勫皬鏁扮偣鍚庡浣欑殑0
+                if (transferDistance.contains(".")) {
+                    transferDistance = new java.math.BigDecimal(transferDistance).stripTrailingZeros().toPlainString();
+                }
+            } catch (Exception e) {
+                log.warn("杞崲杞繍璺濈澶辫触锛屼换鍔D: {}, 浣跨敤榛樿鍊�0", task.getTaskId(), e);
+                transferDistance = "0";
+            }
+        }
+        params.put("ServiceOrdTraDistance", transferDistance);
         params.put("OrderLevel", "0"); // 鏌ョ湅绛夌骇
         params.put("ServiceOrdDepartureType", "1"); // 棰勭害绫诲瀷
         params.put("ConditionLevel", "0"); // 鐥呴噸绾у埆
@@ -619,7 +773,9 @@
      */
     private void syncTaskAssignees(SysTask task, Map<String, String> params) {
         try {
-            // 鑾峰彇浠诲姟鐨勬墽琛屼汉鍛樹俊鎭垪琛紙鍖呭惈瑙掕壊绫诲瀷锛�
+            // 鑾峰彇浠诲姟鐨勬墽琛屼汉鍛樹俊鎭垪琛紙鍖呭惈瑙掕壊绫诲瀷锛� //TODO 濡傛灉鏈変袱涓徃鏈哄氨瑕� 璁剧疆銆�Entourage_1鍜孍ntourage_2
+            //涓や釜鎶ゅ+灏辫璁剧疆 Entourage_4鍜孍ntourage_6
+            //涓や釜鍖荤敓瑕佽缃� Entourage_3鍜孍ntourage_5
             List<TaskCreateVO.AssigneeInfo> assignees = getTaskAssignees(task.getTaskId());
             
             if (assignees == null || assignees.isEmpty()) {
@@ -627,8 +783,12 @@
                 // 璁剧疆榛樿绌哄��
                 params.put("EntourageLeadID", "");
                 params.put("Entourage_1", ""); // 鍙告満
+                params.put("Entourage_2", ""); //鍙告満
                 params.put("Entourage_3", ""); // 鍖荤敓
+                params.put("Entourage_5", ""); //鍖荤敓
                 params.put("Entourage_4", ""); // 鎶ゅ+
+                params.put("Entourage_6", ""); // 鎶ゅ+
+
                 return;
             }
             
@@ -660,6 +820,11 @@
                 if ("driver".equals(userType)) {
                     if (driverOaId.isEmpty()) {
                         driverOaId = oaUserId;
+                        if(params.get("Entourage_1")==null) {
+                            params.put("Entourage_1", oaUserId);
+                        }else{
+                            params.put("Entourage_2", oaUserId);
+                        }
                         // 濡傛灉鏄涓�涓墽琛屼汉鍛橈紝璁剧疆涓洪闃�
                         if (i == 0 && leadEntourageId.isEmpty()) {
                             leadEntourageId = "1"; // 鍙告満瀵瑰簲Entourage_1
@@ -668,6 +833,11 @@
                 } else if ("doctor".equals(userType)) {
                     if (doctorOaId.isEmpty()) {
                         doctorOaId = oaUserId;
+                        if(params.get("Entourage_3")==null) {
+                            params.put("Entourage_3", oaUserId);
+                        }else{
+                            params.put("Entourage_5", oaUserId);
+                        }
                         // 濡傛灉鏄涓�涓墽琛屼汉鍛橈紝璁剧疆涓洪闃�
                         if (i == 0 && leadEntourageId.isEmpty()) {
                             leadEntourageId = "3"; // 鍖荤敓瀵瑰簲Entourage_3
@@ -676,6 +846,11 @@
                 } else if ("nurse".equals(userType)) {
                     if (nurseOaId.isEmpty()) {
                         nurseOaId = oaUserId;
+                        if(params.get("Entourage_4")==null) {
+                            params.put("Entourage_4", oaUserId);
+                        }else{
+                            params.put("Entourage_6", oaUserId);
+                        }
                         // 濡傛灉鏄涓�涓墽琛屼汉鍛橈紝璁剧疆涓洪闃�
                         if (i == 0 && leadEntourageId.isEmpty()) {
                             leadEntourageId = "4"; // 鎶ゅ+瀵瑰簲Entourage_4
@@ -686,9 +861,9 @@
             
             // 璁剧疆鍙傛暟
             params.put("EntourageLeadID", leadEntourageId);
-            params.put("Entourage_1", driverOaId);  // 鍙告満
-            params.put("Entourage_3", doctorOaId);  // 鍖荤敓
-            params.put("Entourage_4", nurseOaId);   // 鎶ゅ+
+//            params.put("Entourage_1", driverOaId);  // 鍙告満
+//            params.put("Entourage_3", doctorOaId);  // 鍖荤敓
+//            params.put("Entourage_4", nurseOaId);   // 鎶ゅ+
             
             log.info("浠诲姟鎵ц浜哄憳鍚屾鎴愬姛锛屼换鍔D: {}, 棰嗛槦ID: {}, 鍙告満: {}, 鍖荤敓: {}, 鎶ゅ+: {}", 
                 task.getTaskId(), leadEntourageId, driverOaId, doctorOaId, nurseOaId);
@@ -937,7 +1112,7 @@
         // 鍦板潃淇℃伅
         params.put("province", ""); // 鍑哄彂鍦扮渷浠�
         params.put("city", ""); // 鍑哄彂鍦板煄甯�
-        params.put("ServiceOrdTraStreet", StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), "")));
+        params.put("ServiceOrdTraStreet",task.getDepartureAddress()); //娲捐溅鍦板潃
         params.put("ServiceOrdTraStreetCoo", ""); // 鍑哄彂鍦板潗鏍�
         params.put("ServiceOrdTraEnd", StringUtils.nvl(task.getDestinationAddress(), StringUtils.nvl(emergency.getHospitalInAddress(), "")));
         params.put("ServiceOrdTraEndCoo", ""); // 鐩殑鍦板潗鏍�
@@ -1109,4 +1284,295 @@
             return null;
         }
     }
+    
+    // 鍒犻櫎涓嬮潰鐨勯噸澶嶆柟娉曪紝鍥犱负鎴戜滑灏嗕娇鐢∕apValueUtils宸ュ叿绫讳腑鐨勬柟娉�
+    /*
+    private String getStringValue(Map<String, Object> map, String key) {
+        Object value = map.get(key);
+        return value != null ? value.toString() : null;
+    }
+    
+    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;
+        }
+        try {
+            return new BigDecimal(value.toString());
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+    
+    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;
+        }
+    }
+    
+    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;
+            }
+        }
+        return null;
+    }
+    
+    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;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+    */
+    
+    /**
+     * 閲嶆柊鍚屾杞﹁締鍜屼汉鍛樺彉鏇寸殑浠诲姟鍒版棫绯荤粺
+     * 褰撲换鍔$殑杞﹁締淇℃伅鎴栦汉鍛樹俊鎭彂鐢熷彉鏇存椂锛岄渶瑕佽皟鐢ㄦ棫绯荤粺鎺ュ彛閲嶆柊鍚屾
+     * 浣跨敤 admin_save_25.asp 鎺ュ彛锛岃�屼笉鏄� admin_save_24.gds
+     */
+    @Override
+    @Transactional
+    public boolean resyncDispatchOrderToLegacy(Long taskId) {
+        if (!legacyConfig.isEnabled()) {
+            log.info("鏃х郴缁熷悓姝ュ凡绂佺敤锛岃烦杩囪皟搴﹀崟閲嶆柊鍚屾锛屼换鍔D: {}", taskId);
+            return false;
+        }
+        
+        try {
+            // 鏌ヨ浠诲姟淇℃伅
+            SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
+            if (task == null) {
+                log.error("浠诲姟涓嶅瓨鍦紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            // 鍙悓姝ユ�ユ晳杞繍浠诲姟
+            if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+                log.info("闈炴�ユ晳杞繍浠诲姟锛岃烦杩囪皟搴﹀崟閲嶆柊鍚屾锛屼换鍔D: {}", taskId);
+                return false;
+            }
+            
+            // 鏌ヨ鎬ユ晳杞繍鎵╁睍淇℃伅
+            SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
+            if (emergency == null) {
+                log.error("鎬ユ晳杞繍鎵╁睍淇℃伅涓嶅瓨鍦紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            // 蹇呴』宸茬粡鍚屾杩囪皟搴﹀崟
+            if (emergency.getLegacyDispatchOrdId() == null || emergency.getLegacyDispatchOrdId() <= 0) {
+                log.warn("璋冨害鍗曟湭鍚屾锛屾棤娉曢噸鏂板悓姝ワ紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            Long serviceOrdId = emergency.getLegacyServiceOrdId();
+            if (serviceOrdId == null || serviceOrdId <= 0) {
+                log.warn("鏈嶅姟鍗曟湭鍚屾锛屾棤娉曢噸鏂板悓姝ヨ皟搴﹀崟锛屼换鍔D: {}", taskId);
+                return false;
+            }
+            
+            // ====== 鍓嶇疆鏍¢獙锛氱‘淇濅换鍔℃暟鎹畬鏁� ======
+            
+            // 1. 妫�鏌ユ槸鍚﹀凡鍒嗛厤杞﹁締
+            List<SysTaskVehicle> taskVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId);
+            if (taskVehicles == null || taskVehicles.isEmpty()) {
+                log.warn("浠诲姟鏈垎閰嶈溅杈嗭紝璺宠繃璋冨害鍗曢噸鏂板悓姝ワ紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            // 2. 妫�鏌ユ槸鍚﹀凡鍒嗛厤鎵ц浜哄憳
+            List<SysTaskAssignee> taskAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
+            if (taskAssignees == null || taskAssignees.isEmpty()) {
+                log.warn("浠诲姟鏈垎閰嶆墽琛屼汉鍛橈紝璺宠繃璋冨害鍗曢噸鏂板悓姝ワ紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            // 3. 妫�鏌ラ绾︽椂闂存槸鍚︽湁鏁�
+            if (task.getPlannedStartTime() == null || task.getPlannedStartTime().getTime() <= 0L) {
+                log.warn("浠诲姟棰勭害鏃堕棿鏃犳晥锛岃烦杩囪皟搴﹀崟閲嶆柊鍚屾锛屼换鍔D: {}", taskId);
+                return false;
+            }
+            
+            // 4. 妫�鏌ヨ浆鍑哄尰闄俊鎭�
+            if (StringUtils.isEmpty(emergency.getHospitalOutName()) || StringUtils.isEmpty(emergency.getHospitalOutAddress())) {
+                log.warn("浠诲姟杞嚭鍖婚櫌淇℃伅涓嶅畬鏁达紝璺宠繃璋冨害鍗曢噸鏂板悓姝ワ紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            // 5. 妫�鏌ヨ浆鍏ュ尰闄俊鎭�
+            if (StringUtils.isEmpty(emergency.getHospitalInName()) || StringUtils.isEmpty(emergency.getHospitalInAddress())) {
+                log.warn("浠诲姟杞叆鍖婚櫌淇℃伅涓嶅畬鏁达紝璺宠繃璋冨害鍗曢噸鏂板悓姝ワ紝浠诲姟ID: {}", taskId);
+                return false;
+            }
+            
+            // 6. 妫�鏌ユ偅鑰呭熀鏈俊鎭�
+            if (StringUtils.isEmpty(emergency.getPatientName()) || StringUtils.isEmpty(emergency.getPatientPhone())) {
+                log.warn("浠诲姟鎮h�呬俊鎭笉瀹屾暣锛岃烦杩囪皟搴﹀崟閲嶆柊鍚屾锛屼换鍔D: {}", taskId);
+                return false;
+            }
+            
+            log.info("浠诲姟鏁版嵁鏍¢獙閫氳繃锛屽紑濮嬮噸鏂板悓姝ヨ皟搴﹀崟锛屼换鍔D: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
+            
+            // 鏋勫缓璇锋眰鍙傛暟锛堜娇鐢ㄧ浉鍚岀殑鍙傛暟鏋勫缓鏂规硶锛�
+            Map<String, String> params = buildDispatchOrderParams(task, emergency);
+            params.put("DispatchOrdID", emergency.getLegacyDispatchOrdId().toString());
+            params.put("ServiceOrdID", emergency.getLegacyServiceOrdId().toString());
+            params.put("DispatchOrdState", "3");
+            log.info("閲嶆柊鍚屾璋冨害鍗曞埌鏃х郴缁熻姹傚弬鏁�: {}", params);
+            // 鍙戦�丠TTP璇锋眰鍒版棫绯荤粺锛堜娇鐢╝dmin_save_25.asp鎺ュ彛锛�
+            String response = sendHttpPost(legacyConfig.getDispatchUpdateUrl(), params);
+            log.info("閲嶆柊鍚屾璋冨害鍗曞埌鏃х郴缁熷搷搴�: ServiceOrdID:{},DispatchOrdId:{},Result: {}",emergency.getLegacyServiceOrdId(),emergency.getLegacyDispatchOrdId(), response);
+            // 瑙f瀽鍝嶅簲
+//            Long dispatchOrdId = parseResponse(response);
+            
+            if (response != null && response.equals("OK")) {
+                // 閲嶆柊鍚屾鎴愬姛锛屾竻闄ら噸鏂板悓姝ユ爣璁�
+                emergency.setNeedResync(0);
+                emergency.setDispatchSyncTime(new Date());
+                emergency.setDispatchSyncErrorMsg(null);
+                sysTaskEmergencyService.updateSysTaskEmergency(emergency);
+                
+                log.info("璋冨害鍗曢噸鏂板悓姝ユ垚鍔燂紝浠诲姟ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
+                return true;
+            } else {
+                // 閲嶆柊鍚屾澶辫触
+                emergency.setDispatchSyncErrorMsg("閲嶆柊鍚屾澶辫触锛�" + response);
+                sysTaskEmergencyService.updateSysTaskEmergency(emergency);
+                
+                log.error("璋冨害鍗曢噸鏂板悓姝ュけ璐ワ紝浠诲姟ID: {}, 鍝嶅簲: {}", taskId, response);
+                return false;
+            }
+            
+        } catch (Exception e) {
+            log.error("閲嶆柊鍚屾璋冨害鍗曞埌鏃х郴缁熷紓甯革紝浠诲姟ID: {}", taskId, e);
+            
+            // 鏇存柊鍚屾鐘舵�佷负澶辫触
+            try {
+                SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
+                if (emergency != null) {
+                    emergency.setDispatchSyncErrorMsg("閲嶆柊鍚屾寮傚父: " + e.getMessage());
+                    sysTaskEmergencyService.updateSysTaskEmergency(emergency);
+                }
+            } catch (Exception ex) {
+                log.error("鏇存柊璋冨害鍗曞悓姝ョ姸鎬佸け璐�", ex);
+            }
+            
+            return false;
+        }
+    }
+    
+    /**
+     * 鎵归噺閲嶆柊鍚屾闇�瑕佹洿鏂扮殑璋冨害鍗�
+     */
+    @Override
+    public int batchResyncPendingDispatchOrders() {
+        if (!legacyConfig.isEnabled()) {
+            log.info("鏃х郴缁熷悓姝ュ凡绂佺敤");
+            return 0;
+        }
+        
+        try {
+            int totalSuccessCount = 0;
+            int pageSize = 100; // 姣忛〉100鏉�
+            int offset = 0;
+            
+            while (true) {
+                // 鍒嗛〉鏌ヨ闇�瑕侀噸鏂板悓姝ョ殑浠诲姟
+                List<SysTaskEmergency> needResyncTasks = sysTaskEmergencyMapper.selectNeedResyncTasks(offset, pageSize);
+                
+                log.info("鏌ヨ鍒伴渶瑕侀噸鏂板悓姝ョ殑浠诲姟鏁伴噺: {}", needResyncTasks.size());
+                if (needResyncTasks == null || needResyncTasks.isEmpty()) {
+                    log.info("娌℃湁鏇村闇�瑕侀噸鏂板悓姝ョ殑浠诲姟锛宱ffset: {}", offset);
+                    break; // 娌℃湁鏇村鏁版嵁锛岄��鍑哄惊鐜�
+                }
+                
+                log.info("寮�濮嬮噸鏂板悓姝ヨ皟搴﹀崟绗� {} 椤碉紝浠诲姟鏁伴噺: {}", (offset / pageSize) + 1, needResyncTasks.size());
+                
+                int pageSuccessCount = 0;
+                for (SysTaskEmergency emergency : needResyncTasks) {
+                    log.info("寮�濮嬮噸鏂板悓姝ヨ皟搴﹀崟锛屼换鍔D: {}", emergency.getTaskId());
+                    boolean success = resyncDispatchOrderToLegacy(emergency.getTaskId());
+                    
+                    if (success) {
+                        pageSuccessCount++;
+                    }
+                    
+                    // 閬垮厤杩囦簬棰戠箒鐨勮姹�
+                    try {
+                        Thread.sleep(1000); // 姣忎釜璇锋眰闂撮殧1绉�
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        log.warn("閲嶆柊鍚屾璋冨害鍗曡涓柇");
+                        return totalSuccessCount + pageSuccessCount;
+                    }
+                }
+                
+                totalSuccessCount += pageSuccessCount;
+                log.info("璋冨害鍗曢噸鏂板悓姝ョ {} 椤靛畬鎴愶紝鎬绘暟: {}, 鎴愬姛: {}", 
+                    (offset / pageSize) + 1, needResyncTasks.size(), pageSuccessCount);
+                
+                // 濡傛灉鏈〉鏁版嵁灏戜簬姣忛〉澶у皬锛岃鏄庡凡缁忔槸鏈�鍚庝竴椤�
+                if (needResyncTasks.size() < pageSize) {
+                    log.info("宸插埌杈炬渶鍚庝竴椤碉紝璋冨害鍗曢噸鏂板悓姝ョ粨鏉�");
+                    break;
+                }
+                
+                offset += pageSize; // 涓嬩竴椤�
+            }
+            
+            log.info("鎵归噺閲嶆柊鍚屾璋冨害鍗曞畬鎴愶紝鎬绘垚鍔熸暟: {}", totalSuccessCount);
+            return totalSuccessCount;
+            
+        } catch (Exception e) {
+            log.error("鎵归噺閲嶆柊鍚屾璋冨害鍗曞紓甯�", e);
+            return 0;
+        }
+    }
 }

--
Gitblit v1.9.1