From 10354e63eb3298beb9ebcc029dd9f48d8936a272 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期五, 19 十二月 2025 23:15:05 +0800
Subject: [PATCH] feat:优化同步

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TaskDispatchSyncServiceImpl.java |  395 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 395 insertions(+), 0 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TaskDispatchSyncServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TaskDispatchSyncServiceImpl.java
new file mode 100644
index 0000000..b39db4b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TaskDispatchSyncServiceImpl.java
@@ -0,0 +1,395 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.config.LegacySystemConfig;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.LongUtil;
+import com.ruoyi.common.utils.MapValueUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.SysTask;
+import com.ruoyi.system.domain.SysTaskAssignee;
+import com.ruoyi.system.domain.SysTaskEmergency;
+import com.ruoyi.system.domain.SysTaskVehicle;
+import com.ruoyi.system.domain.vo.TaskCreateVO;
+import com.ruoyi.system.event.TaskDispatchSyncEvent;
+import com.ruoyi.system.mapper.*;
+import com.ruoyi.system.service.ISysTaskEmergencyService;
+import com.ruoyi.system.service.ITaskDispatchSyncService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍚屾鏂扮郴缁熶腑鐨勮皟搴﹀埌鏃х郴缁熶腑
+ */
+@Slf4j
+@Service
+public class TaskDispatchSyncServiceImpl implements ITaskDispatchSyncService {
+
+    @Autowired
+    private ApplicationEventPublisher eventPublisher;
+
+    @Override
+    public Long syncDispatch(Long taskId) {
+        return this.syncDispatchOrderToLegacy(taskId);
+    }
+
+    @Autowired
+    private LegacySystemConfig legacyConfig;
+
+    @Autowired
+    private ISysTaskEmergencyService sysTaskEmergencyService;
+
+    @Autowired
+    private SysTaskMapper sysTaskMapper;
+
+    @Autowired
+    private SysTaskVehicleMapper sysTaskVehicleMapper;
+
+    @Autowired
+    private SysTaskAssigneeMapper sysTaskAssigneeMapper;
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private LegacyTransferSyncMapper legacyTransferSyncMapper;
+
+    @Autowired
+    private TaskSyncUtilService taskSyncUtilService;
+    @Autowired
+    private TaskDispatchSyncUtilService taskDispatchSyncUtilService;
+
+
+
+    /**
+     * 閲嶆柊鍚屾杞﹁締鍜屼汉鍛樺彉鏇寸殑浠诲姟鍒版棫绯荤粺
+     * 褰撲换鍔$殑杞﹁締淇℃伅鎴栦汉鍛樹俊鎭彂鐢熷彉鏇存椂锛岄渶瑕佽皟鐢ㄦ棫绯荤粺鎺ュ彛閲嶆柊鍚屾
+     * 浣跨敤 admin_save_25.asp 鎺ュ彛锛岃�屼笉鏄� admin_save_24.gds
+     */
+   @Override
+    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, Object> params = taskDispatchSyncUtilService.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 =taskSyncUtilService.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;
+        }
+    }
+
+
+    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;
+        }
+    }
+
+    /**
+     * 鍚屾璋冨害鍗曞埌鏃х郴缁燂紙admin_save_24.asp锛�
+     */
+
+    private Long syncDispatchOrderToLegacy(Long taskId) {
+        if (!legacyConfig.isEnabled()) {
+            log.info("鏃х郴缁熷悓姝ュ凡绂佺敤锛岃烦杩囪皟搴﹀崟鍚屾锛屼换鍔D: {}", taskId);
+            return null;
+        }
+
+        try {
+            // 鏌ヨ浠诲姟淇℃伅
+            SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
+            if (task == null) {
+                log.error("浠诲姟涓嶅瓨鍦紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+
+            // 鍙悓姝ユ�ユ晳杞繍浠诲姟
+            if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+                log.info("闈炴�ユ晳杞繍浠诲姟锛岃烦杩囪皟搴﹀崟鍚屾锛屼换鍔D: {}", taskId);
+                return null;
+            }
+
+            // 鏌ヨ鎬ユ晳杞繍鎵╁睍淇℃伅
+            SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
+            if (emergency == null) {
+                log.error("鎬ユ晳杞繍鎵╁睍淇℃伅涓嶅瓨鍦紝浠诲姟ID: {}", taskId);
+                return null;
+            }
+
+            // 濡傛灉宸茬粡鍚屾杩囷紝涓嶅啀閲嶅鍚屾
+            if (emergency.getLegacyDispatchOrdId() != null && emergency.getLegacyDispatchOrdId() > 0) {
+//                log.info("璋冨害鍗曞凡鍚屾杩囷紝浠诲姟ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
+                return emergency.getLegacyDispatchOrdId();
+            }
+
+            Long serviceOrdId=emergency.getLegacyServiceOrdId();
+            // 蹇呴』鍏堝悓姝ユ湇鍔″崟
+            if (LongUtil.isEmpty(serviceOrdId)) {
+                log.warn("鏈嶅姟鍗曟湭鍚屾锛屾棤娉曞悓姝ヨ皟搴﹀崟锛屼换鍔D: {}", taskId);
+                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);
+            sysTaskEmergencyService.updateSysTaskEmergency(emergency);
+
+            SysUser u=sysUserMapper.selectUserById(task.getCreatorId());
+            Integer oaUserID= u.getOaUserId();
+
+            // 鏋勫缓璇锋眰鍙傛暟
+            Map<String, Object> params = taskDispatchSyncUtilService.buildDispatchOrderParams(task, emergency);
+
+
+            // 鍙戦�丠TTP璇锋眰
+            String response =taskSyncUtilService.sendHttpPost(legacyConfig.getDispatchCreateUrl(), params);
+
+            // 瑙f瀽鍝嶅簲
+            Long dispatchOrdId = taskSyncUtilService.parseResponse(response);
+
+            if (dispatchOrdId != null && dispatchOrdId > 0) {
+                // 鍚屾鎴愬姛锛屾洿鏂拌褰�
+                emergency.setLegacyDispatchOrdId(dispatchOrdId);
+                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);
+
+                eventPublisher.publishEvent(new TaskDispatchSyncEvent(this, taskId, task.getTaskCode(),serviceOrdId, dispatchOrdId, oaUserID));
+
+//                log.info("璋冨害鍗曞悓姝ユ垚鍔燂紝浠诲姟ID: {}, DispatchOrdID: {}", taskId, dispatchOrdId);
+                return dispatchOrdId;
+            } else {
+                // 鍚屾澶辫触
+                emergency.setDispatchSyncStatus(3); // 鍚屾澶辫触
+                emergency.setDispatchSyncTime(new Date());
+                emergency.setDispatchSyncErrorMsg("鏃х郴缁熻繑鍥炴棤鏁堢殑DispatchOrdID: " + response);
+                sysTaskEmergencyService.updateSysTaskEmergency(emergency);
+
+                log.error("璋冨害鍗曞悓姝ュけ璐ワ紝浠诲姟ID: {}, 鍝嶅簲: {}", taskId, response);
+                return null;
+            }
+
+        } catch (Exception e) {
+            log.error("鍚屾璋冨害鍗曞埌鏃х郴缁熷紓甯革紝浠诲姟ID: {}", taskId, e);
+
+            // 鏇存柊鍚屾鐘舵�佷负澶辫触
+            try {
+                SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
+                if (emergency != null) {
+                    emergency.setDispatchSyncStatus(3); // 鍚屾澶辫触
+                    emergency.setDispatchSyncTime(new Date());
+                    emergency.setDispatchSyncErrorMsg("鍚屾寮傚父: " + e.getMessage());
+                    sysTaskEmergencyService.updateSysTaskEmergency(emergency);
+                }
+            } catch (Exception ex) {
+                log.error("鏇存柊璋冨害鍗曞悓姝ョ姸鎬佸け璐�", ex);
+            }
+
+            return null;
+        }
+    }
+
+
+}

--
Gitblit v1.9.1