From f5c900c58513bad824381e69750ac7667ef35de0 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 26 二月 2026 22:29:46 +0800
Subject: [PATCH] feat: 修改增另任务单查询,使用单号查询

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java          |   71 +++------
 ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml                           |  142 ++++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java                     |   10 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java            |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java |    1 
 ruoyi-ui/src/views/task/general/detail.vue                                                |   41 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/controller/TaskSyncController.java            |   89 ++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java                  |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java                           |   21 +++
 ruoyi-ui/src/api/task.js                                                                  |   22 +++
 10 files changed, 354 insertions(+), 50 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
index bb566c9..43d7369 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
@@ -95,7 +95,7 @@
         List<SysTask> list;
         if(searchTaskCode != null && !searchTaskCode.trim().isEmpty()){
             // Search across task_code, emergency_info.dispatch_code, and emergency_info.service_code
-            list = sysTaskService.selectSysTaskListByMultiCode(queryVO, searchTaskCode);
+            list = sysTaskService.selectSysTaskListByMultiCode(queryVO, searchTaskCode.trim());
         } else {
             queryVO.setTaskCode(null);
             list = sysTaskService.selectSysTaskList(queryVO);
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/TaskSyncController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/TaskSyncController.java
new file mode 100644
index 0000000..964da60
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/TaskSyncController.java
@@ -0,0 +1,89 @@
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.service.ILegacyTransferSyncService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 浠诲姟鍚屾鎺у埗鍣�
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/task")
+public class TaskSyncController {
+    
+    private static final Logger log = LoggerFactory.getLogger(TaskSyncController.class);
+    
+    @Autowired
+    private ILegacyTransferSyncService legacyTransferSyncService;
+    
+    /**
+     * 浠庢棫绯荤粺鍚屾鏁版嵁鍒版柊绯荤粺
+     * 
+     * @param serviceOrdID 鏈嶅姟鍗旾D
+     * @param dispatchOrdID 璋冨害鍗旾D
+     * @return 鍚屾缁撴灉
+     */
+    @PostMapping("/syncFromLegacySystem")
+    public AjaxResult syncFromLegacySystem(@RequestBody SyncRequest request) {
+        try {
+            Long serviceOrdID = request.getServiceOrdID();
+            Long dispatchOrdID = request.getDispatchOrdID();
+            
+            // 鍙傛暟楠岃瘉
+            if (serviceOrdID == null || serviceOrdID <= 0) {
+                return AjaxResult.error("鏈嶅姟鍗旾D涓嶈兘涓虹┖涓斿繀椤诲ぇ浜�0");
+            }
+            
+            if (dispatchOrdID == null || dispatchOrdID <= 0) {
+                return AjaxResult.error("璋冨害鍗旾D涓嶈兘涓虹┖涓斿繀椤诲ぇ浜�0");
+            }
+            
+            log.info("寮�濮嬩粠鏃х郴缁熷悓姝ユ暟鎹埌鏂扮郴缁�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+            
+            // 璋冪敤鍚屾鏈嶅姟
+            boolean result = legacyTransferSyncService.syncSingleTransferOrder(serviceOrdID, dispatchOrdID);
+            
+            if (result) {
+                log.info("浠庢棫绯荤粺鍚屾鏁版嵁鎴愬姛: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return AjaxResult.success("鍚屾鎴愬姛");
+            } else {
+                log.error("浠庢棫绯荤粺鍚屾鏁版嵁澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
+                return AjaxResult.error("鍚屾澶辫触");
+            }
+            
+        } catch (Exception e) {
+            log.error("浠庢棫绯荤粺鍚屾鏁版嵁寮傚父: ServiceOrdID={}, DispatchOrdID={}", 
+                     request.getServiceOrdID(), request.getDispatchOrdID(), e);
+            return AjaxResult.error("鍚屾寮傚父: " + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鍚屾璇锋眰鍙傛暟绫�
+     */
+    public static class SyncRequest {
+        private Long serviceOrdID;
+        private Long dispatchOrdID;
+        
+        public Long getServiceOrdID() {
+            return serviceOrdID;
+        }
+        
+        public void setServiceOrdID(Long serviceOrdID) {
+            this.serviceOrdID = serviceOrdID;
+        }
+        
+        public Long getDispatchOrdID() {
+            return dispatchOrdID;
+        }
+        
+        public void setDispatchOrdID(Long dispatchOrdID) {
+            this.dispatchOrdID = dispatchOrdID;
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java
index b44aa72..1fb1f46 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java
@@ -143,6 +143,27 @@
     public void setShowTaskCode(String showTaskCode) {
          showTaskCode=this.showTaskCode;
     }
+    
+    // 鐢ㄤ簬SQL鏄犲皠鐨勫瓧娈碉紙澶氱爜鏌ヨ浼樺寲锛�
+    //杩欎簺瀛楁鎺ユ敹SQL鏌ヨ涓绠楀嚭鐨刣ispatchCode鍜宻erviceCode鍊�
+    private String dispatchCode;
+    private String serviceCode;
+    
+    public String getDispatchCode() {
+        return dispatchCode;
+    }
+    
+    public void setDispatchCode(String dispatchCode) {
+        this.dispatchCode = dispatchCode;
+    }
+    
+    public String getServiceCode() {
+        return serviceCode;
+    }
+    
+    public void setServiceCode(String serviceCode) {
+        this.serviceCode = serviceCode;
+    }
     /**
      * 鑾峰彇鏄剧ず浠诲姟缂栧彿锛屼紭鍏堣繑鍥炴�ユ晳杞繍鐨勮皟搴﹀崟缂栧彿锛屽叾娆℃槸鏈嶅姟鍗曠紪鍙凤紝鏈�鍚庢槸浠诲姟缂栧彿
      */
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java
index 6b4ecd7..4e19487 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java
@@ -173,7 +173,10 @@
     public String getServiceCode(){
         if(this.legacyServiceOrdClass!=null && this.legacyServiceNsTime!=null && this.legacyServiceOrdNo!=null) {
             String nstime = DateUtils.parseDateToStr(DateUtils.YYYYMMDD, this.legacyServiceNsTime);
-            return this.legacyServiceOrdClass + nstime +'-'+ this.legacyServiceOrdNo;
+            //serviceOrdNo 杩欎釜鏄暟瀛楋紝鍥哄畾3浣嶆暟 锛屽皢32锛岃浆鎴�032锛涘皢1杞垚001
+            Integer intServiceNo = Integer.valueOf(this.legacyServiceOrdNo);
+            String ordNoStr = String.format("%03d", intServiceNo);
+            return this.legacyServiceOrdClass + nstime +'-'+ ordNoStr;
         }
         return null;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
index cd4b187..77d0170 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
@@ -153,8 +153,16 @@
     /**
      * 鏌ヨ杞﹁締鍦ㄦ寚瀹氭椂闂磋寖鍥村唴鐨勪换鍔″垪琛�
      * 
-     * @param params 鍖呭惈vehicleId銆乻tartTime銆乪ndTime鐨勫弬鏁癕ap
+     * @param params鍖呭惈vehicleId銆乻tartTime銆乪ndTime鐨勫弬鏁癕ap
      * @return 浠诲姟鍒楄〃
      */
     public List<SysTask> selectVehicleTasksInTimeRange(java.util.Map<String, Object> params);
+    
+    /**
+     * 浼樺寲鐨勫鐮佹煡璇㈡柟娉曪紝鍏宠仈sys_task_emergency琛ㄥ苟璁$畻dispatchCode鍜宻erviceCode
+     * 
+     * @param queryVO 浠诲姟鏌ヨ瀵硅薄
+     * @return 浠诲姟绠$悊闆嗗悎
+     */
+    public List<SysTask> selectSysTaskListByMultiCodeOptimized(TaskQueryVO queryVO);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java
index 7ea9400..65a144b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java
@@ -439,6 +439,7 @@
         }
         if (createVO.getPrice() != null) {
             existingInfo.setTransferPrice(createVO.getPrice());
+            log.info("浠诲姟ID:{},serviceOrdId:{} 鏇存柊浠锋牸:{}",existingInfo.getTaskId(),existingInfo.getLegacyServiceOrdId(), createVO.getPrice());
         }
         
         // 鏇存柊鍗曟嵁绫诲瀷ID
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
index b0141f1..9c69173 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -189,7 +189,7 @@
     }
 
     /**
-     * 鏍规嵁浠诲姟缂栧彿銆佽皟搴﹀崟缂栧彿鎴栨湇鍔″崟缂栧彿鏌ヨ浠诲姟鍒楄〃
+     *鏍规嵁浠诲姟缂栧彿銆佽皟搴﹀崟缂栧彿鎴栨湇鍔″崟缂栧彿鏌ヨ浠诲姟鍒楄〃锛圫QL绠楁硶涓嬫帹浼樺寲鐗堟湰锛�
      * 
      * @param queryVO 浠诲姟鏌ヨ瀵硅薄
      * @param taskCode 浠诲姟缂栧彿
@@ -197,52 +197,34 @@
      */
     @Override
     public List<SysTask> selectSysTaskListByMultiCode(TaskQueryVO queryVO, String taskCode) {
-        // Create a new query object without the taskCode filter
-        TaskQueryVO newQuery = new TaskQueryVO();
-        // Copy all properties except taskCode
-        try {
-            org.springframework.beans.BeanUtils.copyProperties(queryVO, newQuery, "taskCode");
-        } catch (Exception e) {
-            // If copy fails, manually copy the important fields
-            newQuery.setTaskType(queryVO.getTaskType());
-            newQuery.setTaskStatus(queryVO.getTaskStatus());
-            newQuery.setVehicleNo(queryVO.getVehicleNo());
-            newQuery.setCreatorId(queryVO.getCreatorId());
-            newQuery.setAssigneeId(queryVO.getAssigneeId());
-            newQuery.setDeptId(queryVO.getDeptId());
-            newQuery.setDeptIds(queryVO.getDeptIds());
-            newQuery.setPlannedStartTimeBegin(queryVO.getPlannedStartTimeBegin());
-            newQuery.setPlannedStartTimeEnd(queryVO.getPlannedStartTimeEnd());
-            newQuery.setPlannedEndTimeBegin(queryVO.getPlannedEndTimeBegin());
-            newQuery.setPlannedEndTimeEnd(queryVO.getPlannedEndTimeEnd());
-            newQuery.setOverdue(queryVO.getOverdue());
-        }
-
-        // Get all tasks matching the other criteria
-        List<SysTask> allTasks = sysTaskMapper.selectSysTaskList(newQuery);
-        allTasks.stream().forEach(task -> {
-
+        // 璁剧疆浠诲姟鐮佺敤浜嶴QL鏌ヨ
+        queryVO.setTaskCode(taskCode);
+        
+        // 浣跨敤浼樺寲鐨勬煡璇㈡柟娉曪紝鐩存帴鍦⊿QL涓叧鑱攕ys_task_emergency琛ㄥ苟璁$畻鍖归厤鐨刣ispatchCode鍜宻erviceCode
+        List<SysTask> tasks = sysTaskMapper.selectSysTaskListByMultiCodeOptimized(queryVO);
+        
+        // 澶勭悊浠诲姟鍒嗛厤淇℃伅鍜屾�ユ晳杞繍鎵╁睍淇℃伅
+        tasks.forEach(task -> {
+            bindTaskAssign(task);
+            
+            // 瀵逛簬鎬ユ晳杞繍浠诲姟锛屼娇鐢⊿QL鏌ヨ涓凡璁$畻骞跺尮閰嶅ソ鐨刣ispatchCode鍜宻erviceCode
             if ("EMERGENCY_TRANSFER".equals(task.getTaskType())) {
-                SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(task.getTaskId());
-                task.setEmergencyInfo(emergencyInfo);
+                // 鍒涘缓涓�涓复鏃剁殑emergencyInfo瀵硅薄锛屽寘鍚粠SQL鏌ヨ缁撴灉涓幏鍙栫殑璁$畻鍚庣殑浠g爜
+//                SysTaskEmergency emergencyInfo = new SysTaskEmergency();
+//                emergencyInfo.setDispatchCode(task.getDispatchCode());
+//                emergencyInfo.setServiceCode(task.getServiceCode());
+                
+                // 鍔犺浇瀹屾暣鐨勬墿灞曚俊鎭�
+                SysTaskEmergency fullEmergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(task.getTaskId());
+                if (fullEmergencyInfo != null) {
+                    // 淇濈暀瀹屾暣淇℃伅锛屼絾纭繚dispatchCode鍜宻erviceCode鏄绠楀悗鐨勫��
+                    task.setEmergencyInfo(fullEmergencyInfo);
+                }
+
             }
         });
-        return allTasks.stream().filter(task -> {
-            if (task.getTaskCode() != null && task.getTaskCode().contains(taskCode)) {
-                return true;
-            }
-            bindTaskAssign(task);
-
-            if ("EMERGENCY_TRANSFER".equals(task.getTaskType()) && task.getEmergencyInfo() != null) {
-                String dispatchCode = task.getEmergencyInfo().getDispatchCode();
-                String serviceCode = task.getEmergencyInfo().getServiceCode();
-                return (dispatchCode != null && dispatchCode.contains(taskCode)) ||
-                        (serviceCode != null && serviceCode.contains(taskCode));
-            }
-            return false;
-
-        }).collect(Collectors.toList());
-
+        
+        return tasks;
     }
 
     /**
@@ -700,6 +682,7 @@
         }
 
 
+
 //        task.setAssigneeId(updateVO.getAssigneeId());
         task.setUpdateBy(userName);
         task.setUpdateTime(DateUtils.getNowDate());
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
index 99faf07..fb24bf8 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
@@ -78,6 +78,56 @@
         left join sys_task_vehicle tv on t.task_id = tv.task_id
         left join tb_vehicle_info v on tv.vehicle_id = v.vehicle_id
     </sql>
+    
+    <sql id="selectSysTaskVoWithEmergency">
+        select t.task_id, t.task_code, t.task_type, t.task_status, t.task_description, 
+               t.departure_address, t.destination_address, t.departure_longitude, t.departure_latitude,
+               t.destination_longitude, t.destination_latitude, t.estimated_distance,
+               t.planned_start_time, t.planned_end_time,
+               t.actual_start_time, t.actual_end_time, t.creator_id, t.assignee_id, t.dept_id,
+               t.create_time, t.update_time, t.create_by, t.update_by, t.remark, t.del_flag, t.legacy_synced,
+               u1.nick_name as creator_name, u2.nick_name as assignee_name, d.dept_name,
+               (
+                   select v2.vehicle_no 
+                   from sys_task_vehicle tv2 
+                   left join tb_vehicle_info v2 on tv2.vehicle_id = v2.vehicle_id 
+                   where tv2.task_id = t.task_id 
+                   order by tv2.assign_time asc 
+                   limit 1
+               ) as vehicle_no,
+               tv.id as tv_id, tv.task_id as tv_task_id, tv.vehicle_id as tv_vehicle_id,
+               v.vehicle_no as tv_vehicle_no, v.vehicle_type as tv_vehicle_type,
+               v.vehicle_brand as tv_vehicle_brand, v.vehicle_model as tv_vehicle_model,
+               tv.assign_time as tv_assign_time, tv.assign_by as tv_assign_by,
+               tv.status as tv_status, tv.remark as tv_remark,
+               CASE 
+                   WHEN e.legacy_dispatch_ord_class IS NOT NULL 
+                        AND e.legacy_dispatch_ns_time IS NOT NULL 
+                        AND e.legacy_dispatch_ord_no IS NOT NULL 
+                   THEN CONCAT(e.legacy_dispatch_ord_class, 
+                               DATE_FORMAT(e.legacy_dispatch_ns_time, '%Y%m%d'), 
+                               '-', 
+                               LPAD(CAST(e.legacy_dispatch_ord_no AS CHAR), 3, '0'))
+                   ELSE NULL 
+               END AS dispatch_code,
+               CASE 
+                   WHEN e.legacy_service_ord_class IS NOT NULL 
+                        AND e.legacy_service_ns_time IS NOT NULL 
+                        AND e.legacy_service_ord_no IS NOT NULL 
+                   THEN CONCAT(e.legacy_service_ord_class, 
+                               DATE_FORMAT(e.legacy_service_ns_time, '%Y%m%d'), 
+                               '-', 
+                               LPAD(CAST(e.legacy_service_ord_no AS CHAR), 3, '0'))
+                   ELSE NULL 
+               END AS service_code
+        from sys_task t
+        left join sys_user u1 on t.creator_id = u1.user_id
+        left join sys_user u2 on t.assignee_id = u2.user_id
+        left join sys_dept d on t.dept_id = d.dept_id
+        left join sys_task_vehicle tv on t.task_id = tv.task_id
+        left join tb_vehicle_info v on tv.vehicle_id = v.vehicle_id
+        left join sys_task_emergency e on t.task_id = e.task_id
+    </sql>
 
     <select id="selectSysTaskList" parameterType="TaskQueryVO" resultMap="SysTaskResult">
         <include refid="selectSysTaskVo"/>
@@ -383,4 +433,96 @@
           )
         order by t.actual_start_time, t.planned_start_time
     </select>
+    
+    <!-- 浼樺寲鐨勫鐮佹煡璇㈡柟娉曪紝鍏宠仈sys_task_emergency琛� -->
+    <select id="selectSysTaskListByMultiCodeOptimized" parameterType="TaskQueryVO" resultMap="SysTaskResult">
+        <include refid="selectSysTaskVoWithEmergency"/>
+        <where>  
+            t.del_flag = '0'
+            <if test="taskCode != null  and taskCode != ''">
+                and (
+                    t.task_code like concat('%', #{taskCode}, '%')
+                    or CASE 
+                           WHEN e.legacy_dispatch_ord_class IS NOT NULL 
+                                AND e.legacy_dispatch_ns_time IS NOT NULL 
+                                AND e.legacy_dispatch_ord_no IS NOT NULL 
+                           THEN CONCAT(e.legacy_dispatch_ord_class, 
+                                       DATE_FORMAT(e.legacy_dispatch_ns_time, '%Y%m%d'), 
+                                       '-', 
+                                       LPAD(CAST(e.legacy_dispatch_ord_no AS CHAR), 3, '0'))
+                           ELSE NULL 
+                       END like concat('%', #{taskCode}, '%')
+                    or CASE 
+                           WHEN e.legacy_service_ord_class IS NOT NULL 
+                                AND e.legacy_service_ns_time IS NOT NULL 
+                                AND e.legacy_service_ord_no IS NOT NULL 
+                           THEN CONCAT(e.legacy_service_ord_class, 
+                                       DATE_FORMAT(e.legacy_service_ns_time, '%Y%m%d'), 
+                                       '-', 
+                                       LPAD(CAST(e.legacy_service_ord_no AS CHAR), 3, '0'))
+                           ELSE NULL 
+                       END like concat('%', #{taskCode}, '%')
+                )
+            </if>
+            <if test="taskType != null  and taskType != ''"> and t.task_type = #{taskType}</if>
+            <if test="taskStatus != null  and taskStatus != ''"> and t.task_status = #{taskStatus}</if>
+            <if test="taskStatusList != null and taskStatusList != ''"> and t.task_status in 
+                <foreach collection="taskStatusList.split(',')" item="status" open="(" separator="," close=")">
+                    #{status}
+                </foreach>
+            </if>
+            <if test="vehicleNo != null  and vehicleNo != ''"> and v.vehicle_no like concat('%', #{vehicleNo}, '%')</if>
+            <!-- 缁煎悎鏌ヨ锛氬綋鍓嶇敤鎴锋墍鍦ㄦ満鏋� OR 褰撳墠鐢ㄦ埛鍒涘缓 OR 鍒嗛厤缁欏綋鍓嶇敤鎴� -->
+            <if test="(creatorId != null and creatorId != 0) or (assigneeId != null and assigneeId != 0) or (deptId != null and deptId != 0) or (deptIds != null and deptIds.size() > 0)">
+                and (
+                    <!-- 鏌ヨ鎸囧畾鍒嗗叕鍙稿強鍏舵墍鏈夊瓙閮ㄩ棬鐨勪换鍔� -->
+                    <if test="deptId != null and deptId != 0">
+                        (t.dept_id = #{deptId} OR t.dept_id IN (
+                            SELECT dept_id FROM sys_dept 
+                            WHERE del_flag = '0' AND find_in_set(#{deptId}, ancestors)
+                        ))
+                    </if>
+                    <!-- 鏌ヨ澶氫釜鍒嗗叕鍙稿強鍏舵墍鏈夊瓙閮ㄩ棬鐨勪换鍔� -->
+                    <if test="deptIds != null and deptIds.size() > 0">
+                        <if test="deptId != null and deptId != 0"> or </if>
+                        (
+                            <foreach collection="deptIds" item="branchDeptId" separator=" OR ">
+                                (t.dept_id = #{branchDeptId} OR t.dept_id IN (
+                                    SELECT dept_id FROM sys_dept 
+                                    WHERE del_flag = '0' AND find_in_set(#{branchDeptId}, ancestors)
+                                ))
+                            </foreach>
+                        )
+                    </if>
+                    <if test="creatorId != null and creatorId != 0">
+                        <if test="(deptId != null and deptId != 0) or (deptIds != null and deptIds.size() > 0)"> or </if>
+                        t.creator_id = #{creatorId}
+                    </if>
+                    <if test="assigneeId != null and assigneeId != 0">
+                        <if test="(deptId != null and deptId != 0) or (deptIds != null and deptIds.size() > 0) or (creatorId != null and creatorId != 0)"> or </if>
+                        t.task_id IN (
+                            SELECT task_id FROM sys_task_assignee WHERE user_id = #{assigneeId}
+                        )
+                    </if>
+                )
+            </if>
+            <if test="plannedStartTimeBegin != null "> and t.planned_start_time &gt;= #{plannedStartTimeBegin}</if>
+            <if test="plannedStartTimeEnd != null "> and t.planned_start_time &lt;= #{plannedStartTimeEnd}</if>
+            <if test="plannedEndTimeBegin != null "> and t.planned_end_time &gt;= #{plannedEndTimeBegin}</if>
+            <if test="plannedEndTimeEnd != null "> and t.planned_end_time &lt;= #{plannedEndTimeEnd}</if>
+            <if test="overdue != null and overdue == true"> and t.planned_end_time &lt; now() and t.task_status != 'COMPLETED'</if>
+        </where>
+        order by 
+            CASE t.task_status
+                WHEN 'PENDING' THEN 1
+                WHEN 'DEPARTING' THEN 2
+                WHEN 'ARRIVED' THEN 3
+                WHEN 'RETURNING' THEN 4
+                WHEN 'IN_PROGRESS' THEN 5
+                WHEN 'COMPLETED' THEN 6
+                WHEN 'CANCELLED' THEN 7
+                ELSE 8
+            END,
+            t.create_time desc
+    </select>
 </mapper>
diff --git a/ruoyi-ui/src/api/task.js b/ruoyi-ui/src/api/task.js
index 1bb98c6..7990787 100644
--- a/ruoyi-ui/src/api/task.js
+++ b/ruoyi-ui/src/api/task.js
@@ -310,4 +310,24 @@
     url: '/task/syncTaskStatus/' + taskId,
     method: 'post'
   })
-}
\ No newline at end of file
+}
+
+// 浠庢棫绯荤粺鍚屾鏁版嵁鍒版柊绯荤粺
+export function syncFromLegacySystem(serviceOrdID, dispatchOrdID) {
+  return request({
+    url: '/task/syncFromLegacySystem',
+    method: 'post',
+    data: {
+      serviceOrdID: serviceOrdID,
+      dispatchOrdID: dispatchOrdID
+    }
+  })
+}
+
+// 妫�鏌ヤ换鍔℃槸鍚﹀凡鐢宠鍙戠エ
+export function checkTaskInvoice(taskId) {
+  return request({
+    url: '/system/invoice/checkTaskInvoice/' + taskId,
+    method: 'get'
+  })
+}
diff --git a/ruoyi-ui/src/views/task/general/detail.vue b/ruoyi-ui/src/views/task/general/detail.vue
index e0b0bd8..2c0ab51 100644
--- a/ruoyi-ui/src/views/task/general/detail.vue
+++ b/ruoyi-ui/src/views/task/general/detail.vue
@@ -129,6 +129,16 @@
             @click="syncDispatchOrder"
             style="margin-left: 10px;"
           >鍚屾璋冨害鍗�</el-button>
+          <!-- 浠庢棫绯荤粺鍚屾鏁版嵁鍒版柊绯荤粺鎸夐挳 -->
+          <el-button
+            v-if="taskDetail.emergencyInfo.legacyServiceOrdId && taskDetail.emergencyInfo.legacyDispatchOrdId"
+            type="success"
+            size="mini"
+            icon="el-icon-download"
+            :loading="syncingFromLegacy"
+            @click="syncFromLegacySystem"
+            style="margin-left: 10px;"
+          >浠庢棫绯荤粺鍚屾</el-button>
         </el-descriptions-item>
         <el-descriptions-item label="璋冨害鍗曞彿">
           <span v-if="taskDetail.emergencyInfo.legacyDispatchOrdId">
@@ -788,7 +798,7 @@
 </template>
 
 <script>
-import { getTask, updateTask, assignTask, changeTaskStatus, uploadAttachment, deleteAttachment, getTaskVehicles, getAvailableVehicles, assignVehiclesToTask, unassignVehicleFromTask, getPaymentInfo, syncServiceOrder, syncDispatchOrder, syncTaskStatus } from "@/api/task";
+import { getTask, updateTask, assignTask, changeTaskStatus, uploadAttachment, deleteAttachment, getTaskVehicles, getAvailableVehicles, assignVehiclesToTask, unassignVehicleFromTask, getPaymentInfo, syncServiceOrder, syncDispatchOrder, syncTaskStatus, syncFromLegacySystem, checkTaskInvoice } from "@/api/task";
 import { listUser } from "@/api/system/user";
 import { getToken } from "@/utils/auth";
 
@@ -881,6 +891,7 @@
       // 鍚屾鍔犺浇鐘舵��
       syncingServiceOrder: false,
       syncingDispatchOrder: false,
+      syncingFromLegacy: false,
       syncingTaskStatus: false,
       // 鍙戠エ鐢宠鐘舵��
       hasInvoiceApplied: false,
@@ -1226,6 +1237,32 @@
         this.syncingDispatchOrder = false;
       });
     },
+    /** 浠庢棫绯荤粺鍚屾鏁版嵁鍒版柊绯荤粺 */
+    syncFromLegacySystem() {
+      // 妫�鏌ユ槸鍚﹀悓鏃舵湁serviceOrdID鍜宒ispatchOrdID
+      if (!this.taskDetail.emergencyInfo.legacyServiceOrdId || !this.taskDetail.emergencyInfo.legacyDispatchOrdId) {
+        this.$modal.msgError("缂哄皯蹇呰鐨勬棫绯荤粺ID淇℃伅");
+        return;
+      }
+      
+      this.$modal.confirm('鏄惁纭浠庢棫绯荤粺鍚屾鏁版嵁鍒版柊绯荤粺锛�').then(() => {
+        this.syncingFromLegacy = true;
+        return syncFromLegacySystem(
+          this.taskDetail.emergencyInfo.legacyServiceOrdId,
+          this.taskDetail.emergencyInfo.legacyDispatchOrdId
+        );
+      }).then(() => {
+        this.$modal.msgSuccess("浠庢棫绯荤粺鍚屾鎴愬姛");
+        // 閲嶆柊鍔犺浇浠诲姟璇︽儏
+        this.getTaskDetail();
+      }).catch((error) => {
+        if (error !== 'cancel') {
+          this.$modal.msgError("鍚屾澶辫触: " + (error.message || "鏈煡閿欒"));
+        }
+      }).finally(() => {
+        this.syncingFromLegacy = false;
+      });
+    },
     /** 鎵嬪姩鍚屾浠诲姟鐘舵�� */
     syncTaskStatus() {
       this.$modal.confirm('鏄惁纭鍚屾浠诲姟鐘舵�佸埌鏃х郴缁燂紵').then(() => {
@@ -1245,7 +1282,7 @@
     /** 妫�鏌ュ彂绁ㄧ敵璇风姸鎬� */
     checkInvoiceStatus() {
       // 璋冪敤鍚庣鎺ュ彛妫�鏌ヨ浠诲姟鏄惁宸茬敵璇峰彂绁�
-      this.$axios.get(`/system/invoice/checkTaskInvoice/${this.$route.params.taskId}`)
+      checkTaskInvoice(this.$route.params.taskId)
         .then(response => {
           if (response.code === 200 && response.data) {
             this.hasInvoiceApplied = true;

--
Gitblit v1.9.1