From 6676a35122fd9c97d1b1679c211bc8a9b97f08f2 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期二, 24 三月 2026 23:17:37 +0800
Subject: [PATCH] feat: 增加日志记录历史消息

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java |  555 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 503 insertions(+), 52 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 f35b74e..a702997 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
@@ -1,7 +1,20 @@
 package com.ruoyi.web.controller.task;
 
+import java.util.Date;
 import java.util.List;
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.domain.SysTaskEmergency;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.service.ILegacySystemSyncService;
+import com.ruoyi.system.service.ITaskDispatchSyncService;
+import com.ruoyi.system.mapper.SysTaskStatusHistoryMapper;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -11,21 +24,26 @@
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.system.domain.SysTask;
 import com.ruoyi.system.domain.SysTaskLog;
+import com.ruoyi.system.domain.SysTaskStatusHistory;
+import com.ruoyi.system.domain.VehicleInfo;
 import com.ruoyi.system.domain.vo.TaskQueryVO;
 import com.ruoyi.system.domain.vo.TaskCreateVO;
 import com.ruoyi.system.domain.vo.TaskUpdateVO;
 import com.ruoyi.system.domain.vo.TaskStatisticsVO;
 import com.ruoyi.system.domain.enums.TaskStatus;
-import com.ruoyi.system.service.ISysTaskService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.StringUtils;
 
 /**
  * 浠诲姟绠$悊Controller
@@ -40,20 +58,103 @@
     @Autowired
     private ISysTaskService sysTaskService;
 
+    @Autowired
+    private ISysTaskEmergencyService sysTaskEmergencyService;
+    
+    @Autowired
+    private IVehicleInfoService vehicleInfoService;
+    
+    @Autowired
+    private ISysUserService userService;
+    
+    @Autowired
+    private ISysDeptService deptService;
+
+
+    @Autowired
+    @Qualifier("tiandituMapService")
+    private IMapService mapService;
+
+    @Autowired
+    private ILegacySystemSyncService legacySystemSyncService;
+    
+    @Autowired
+    private ITaskDispatchSyncService taskDispatchSyncService;
+    
+    @Autowired
+    private ITaskStatusPushService taskStatusPushService;
+
+    @Autowired
+    private SysTaskStatusHistoryMapper sysTaskStatusHistoryMapper;
+
     /**
-     * 鏌ヨ浠诲姟绠$悊鍒楄〃
+     * 鏌ヨ浠诲姟绠$悊鍒楄〃锛堝悗鍙扮鐞嗙锛�
+     * 绠$悊鍛樻潈闄愶紝鍙互鏌ョ湅鎵�鏈変换鍔�
      */
     @PreAuthorize("@ss.hasPermi('task:general:query')")
+    @GetMapping("/admin/list")
+    public TableDataInfo adminList(TaskQueryVO queryVO) {
+        startPage();
+        // Handle multi-field task code search
+        String searchTaskCode = queryVO.getTaskCode();
+        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.trim());
+        } else {
+            queryVO.setTaskCode(null);
+            list = sysTaskService.selectSysTaskList(queryVO);
+        }
+
+
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏌ヨ浠诲姟鍒楄〃锛圓PP绔級
+     * 鏍规嵁鐢ㄦ埛鏉冮檺杩斿洖涓嶅悓鑼冨洿鐨勪换鍔★細
+     * 1. 鏈夋煡鐪嬫墍鏈夊挩璇㈠崟鏉冮檺锛坈anViewAllConsult='1'锛夛細杩斿洖璇ョ敤鎴风鐞嗘墍鏈夊垎鍏徃涓嬬殑鎵�鏈変换鍔″崟
+     * 2. 鏃犳潈闄愶紙canViewAllConsult='0'锛夛細鍙繑鍥炲垎閰嶇粰璇ョ敤鎴风殑鍗曟垨璇ョ敤鎴峰垱寤虹殑鍗�
+     */
     @GetMapping("/list")
-    public TableDataInfo list(TaskQueryVO queryVO) {
-        // 鍦ㄥ悗绔嚜鍔ㄨ幏鍙栧綋鍓嶇敤鎴蜂俊鎭紝瀹炵幇缁煎悎鏌ヨ
-        // 缁煎悎鏌ヨ锛氬綋鍓嶇敤鎴锋墍鍦ㄦ満鏋勪换鍔� + 褰撳墠鐢ㄦ埛鍒涘缓鐨勪换鍔� + 鍒嗛厤缁欏綋鍓嶇敤鎴风殑浠诲姟
+    public TableDataInfo appList(TaskQueryVO queryVO) {
+        // 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅
         Long currentUserId = getUserId();
-        Long currentDeptId = getDeptId();
+        SysUser currentUser = userService.selectUserById(currentUserId);
         
-        // 濡傛灉鍓嶇娌℃湁浼犻�掕繖浜涘弬鏁帮紝鍒欎娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴蜂俊鎭�
-        if (queryVO.getCreatorId() == null && queryVO.getAssigneeId() == null && queryVO.getDeptId() == null) {
-            queryVO.setDeptId(currentDeptId);
+        if (currentUser == null) {
+            return getDataTable(new java.util.ArrayList<>());
+        }
+        
+        // 鍒ゆ柇鐢ㄦ埛鏄惁鏈夋煡鐪嬫墍鏈夊挩璇㈠崟鐨勬潈闄�
+        String canViewAllConsult = currentUser.getCanViewAllConsult();
+        
+        if ("1".equals(canViewAllConsult)) {
+            // 鏈夋潈闄愶細杩斿洖璇ョ敤鎴风鐞嗘墍鏈夊垎鍏徃涓嬬殑鎵�鏈変换鍔″崟
+            // 1. 鑾峰彇鐢ㄦ埛绠$悊鐨勫垎鍏徃鍒楄〃
+            List<SysDept> branchCompanies = deptService.computeBranchCompaniesForUser(currentUser);
+            
+            if (branchCompanies != null && !branchCompanies.isEmpty()) {
+                // 2. 鎻愬彇鎵�鏈夊垎鍏徃ID
+                List<Long> deptIds = new java.util.ArrayList<>();
+                for (SysDept dept : branchCompanies) {
+                    deptIds.add(dept.getDeptId());
+                }
+                
+                // 3. 璁剧疆鏌ヨ鏉′欢涓哄垎鍏徃ID鍒楄〃锛圫QL浼氳嚜鍔ㄥ寘鍚墍鏈夊瓙閮ㄩ棬锛�
+                queryVO.setDeptIds(deptIds);
+                // 娓呯┖鍒涘缓浜哄拰鎵ц浜鸿繃婊ゆ潯浠讹紝杩斿洖杩欎簺鍒嗗叕鍙镐笅鐨勬墍鏈変换鍔�
+                queryVO.setCreatorId(null);
+                queryVO.setAssigneeId(null);
+            } else {
+                // 濡傛灉娌℃湁鎵惧埌鍒嗗叕鍙革紝杩斿洖绌哄垪琛�
+                return getDataTable(new java.util.ArrayList<>());
+            }
+        } else {
+            // 鏃犳潈闄愶細鍙繑鍥炲垎閰嶇粰璇ョ敤鎴风殑鍗曟垨璇ョ敤鎴峰垱寤虹殑鍗�
+            // 娓呯┖deptId鍜宒eptIds锛屼娇鐢╟reatorId鍜宎ssigneeId杩涜OR鏌ヨ
+            queryVO.setDeptId(null);
+            queryVO.setDeptIds(null);
             queryVO.setCreatorId(currentUserId);
             queryVO.setAssigneeId(currentUserId);
         }
@@ -64,11 +165,11 @@
     }
 
     /**
-     * 瀵煎嚭浠诲姟绠$悊鍒楄〃
+     * 瀵煎嚭浠诲姟绠$悊鍒楄〃锛堝悗鍙扮鐞嗙锛�
      */
     @PreAuthorize("@ss.hasPermi('task:general:export')")
     @Log(title = "浠诲姟绠$悊", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
+    @PostMapping("/admin/export")
     public void export(HttpServletResponse response, TaskQueryVO queryVO) {
         List<SysTask> list = sysTaskService.selectSysTaskList(queryVO);
         ExcelUtil<SysTask> util = new ExcelUtil<SysTask>(SysTask.class);
@@ -76,90 +177,202 @@
     }
 
     /**
-     * 鑾峰彇浠诲姟绠$悊璇︾粏淇℃伅
+     * 鑾峰彇浠诲姟璇︾粏淇℃伅锛堝悗鍙扮鐞嗙锛�
      */
     @PreAuthorize("@ss.hasPermi('task:general:query')")
-    @GetMapping(value = "/{taskId}")
-    public AjaxResult getInfo(@PathVariable("taskId") Long taskId) {
+    @GetMapping(value = "/admin/{taskId}")
+    public AjaxResult adminGetInfo(@PathVariable("taskId") Long taskId) {
         return success(sysTaskService.getTaskDetail(taskId));
     }
 
     /**
-     * 鏂板浠诲姟绠$悊
+     * 鑾峰彇浠诲姟璇︾粏淇℃伅锛圓PP绔級
+     */
+    @GetMapping(value = "/{taskId}")
+    public AjaxResult appGetInfo(@PathVariable("taskId") Long taskId) {
+        return success(sysTaskService.getTaskDetail(taskId));
+    }
+
+    /**
+     * 鏂板浠诲姟锛堝悗鍙扮鐞嗙锛�
      */
     @PreAuthorize("@ss.hasPermi('task:general:add')")
     @Log(title = "浠诲姟绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody TaskCreateVO createVO) {
-        return toAjax(sysTaskService.insertSysTask(createVO));
+    @PostMapping("/admin")
+    public AjaxResult adminAdd(@RequestBody TaskCreateVO createVO) {
+        Long taskId = sysTaskService.insertSysTask(createVO);
+        return taskId > 0 ? AjaxResult.success("鏂板鎴愬姛").put("taskId", taskId) : AjaxResult.error("鏂板澶辫触");
     }
 
     /**
-     * 淇敼浠诲姟绠$悊
+     * 鏂板浠诲姟锛圓PP绔級
+     */
+    @Log(title = "浠诲姟鍒涘缓", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult appAdd(@RequestBody TaskCreateVO createVO) {
+        Long taskId = sysTaskService.insertSysTask(createVO);
+        return taskId > 0 ? AjaxResult.success("鏂板鎴愬姛").put("taskId", taskId) : AjaxResult.error("鏂板澶辫触");
+    }
+    
+    /**
+     * 妫�鏌ヤ换鍔℃槸鍚﹂噸澶嶏紙鏍规嵁鑱旂郴浜虹數璇濆拰鍒涘缓鏃ユ湡锛�
+     * @param phone 鑱旂郴浜虹數璇�
+     * @param createDate 浠诲姟鍒涘缓鏃ユ湡锛堟牸寮忥細YYYY-MM-DD锛�
+     * @return 鏄惁瀛樺湪閲嶅浠诲姟
+     */
+    @GetMapping("/checkDuplicate")
+    public AjaxResult checkDuplicate(
+            @RequestParam("phone") String phone,
+            @RequestParam("createDate") String createDate) {
+        
+        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(createDate)) {
+            return AjaxResult.error("鍙傛暟涓嶈兘涓虹┖");
+        }
+        
+        boolean isDuplicate = sysTaskService.checkTaskDuplicate(phone, createDate);
+        
+        if (isDuplicate) {
+            return AjaxResult.error("璇ヨ仈绯荤數璇濆湪璇ユ棩鏈熷凡鏈変换鍔★紝涓嶈兘閲嶅鎻愪氦");
+        }
+        
+        return AjaxResult.success("鏈彂鐜伴噸澶嶄换鍔�");
+    }
+
+    /**
+     * 淇敼浠诲姟锛堝悗鍙扮鐞嗙锛�
      */
     @PreAuthorize("@ss.hasPermi('task:general:edit')")
     @Log(title = "浠诲姟绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody TaskUpdateVO updateVO) {
-        return toAjax(sysTaskService.updateSysTask(updateVO));
+    @PutMapping("/admin")
+    public AjaxResult adminEdit(@RequestBody TaskUpdateVO updateVO) {
+        return toAjax(sysTaskService.updateSysTask(updateVO,false));
     }
 
     /**
-     * 鍒犻櫎浠诲姟绠$悊
+     * 淇敼浠诲姟锛圓PP绔級
      */
-    @PreAuthorize("@ss.hasPermi('task:general:remove')")
-    @Log(title = "浠诲姟绠$悊", businessType = BusinessType.DELETE)
+    @Log(title = "浠诲姟淇敼", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult appEdit(@RequestBody TaskUpdateVO updateVO) {
+        return toAjax(sysTaskService.updateSysTask(updateVO,false));
+    }
+
+    /**
+     * 鍒犻櫎浠诲姟锛圓PP绔級
+     */
+    @Log(title = "浠诲姟鍒犻櫎", businessType = BusinessType.DELETE)
     @DeleteMapping("/{taskIds}")
-    public AjaxResult remove(@PathVariable Long[] taskIds) {
+    public AjaxResult appRemove(@PathVariable Long[] taskIds) {
         return toAjax(sysTaskService.deleteSysTaskByTaskIds(taskIds));
     }
 
     /**
-     * 鍒嗛厤浠诲姟
+     * 鍒犻櫎浠诲姟锛堝悗鍙扮鐞嗙锛�
      */
-    @PreAuthorize("@ss.hasPermi('task:general:assign')")
+    @PreAuthorize("@ss.hasPermi('task:general:remove')")
+    @Log(title = "浠诲姟绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/admin/{taskIds}")
+    public AjaxResult adminRemove(@PathVariable Long[] taskIds) {
+        return toAjax(sysTaskService.deleteSysTaskByTaskIds(taskIds));
+    }
+
+    /**
+     * 鍒嗛厤浠诲姟锛堝悗鍙扮鐞嗙锛�
+     */
+    @PreAuthorize("@ss.hasPermi('task:general:edit')")
     @Log(title = "浠诲姟鍒嗛厤", businessType = BusinessType.UPDATE)
-    @PutMapping("/{taskId}/assign")
-    public AjaxResult assignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) {
+    @PutMapping("/admin/{taskId}/assign")
+    public AjaxResult adminAssignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) {
         return toAjax(sysTaskService.assignTask(taskId, request.getAssigneeId(), request.getRemark()));
     }
 
     /**
-     * 鏇存柊浠诲姟鐘舵��
+     * 鍒嗛厤浠诲姟锛圓PP绔級
      */
-    @PreAuthorize("@ss.hasPermi('task:general:status')")
+    @Log(title = "浠诲姟鍒嗛厤", businessType = BusinessType.UPDATE)
+    @PutMapping("/{taskId}/assign")
+    public AjaxResult appAssignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) {
+        return toAjax(sysTaskService.assignTask(taskId, request.getAssigneeId(), request.getRemark()));
+    }
+
+    /**
+     * 鏇存柊浠诲姟鐘舵�侊紙鍚庡彴绠$悊绔級
+     */
+    @PreAuthorize("@ss.hasPermi('task:general:edit')")
+    @Log(title = "浠诲姟鐘舵�佸彉鏇�", businessType = BusinessType.UPDATE)
+    @PutMapping("/admin/{taskId}/status")
+    public AjaxResult adminChangeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
+        TaskStatus newStatus = TaskStatus.getByCode(request.getTaskStatus());
+        if (newStatus == null) {
+            return error("鏃犳晥鐨勪换鍔$姸鎬�");
+        }
+        return toAjax(sysTaskService.changeTaskStatus(taskId, newStatus, request.getRemark()));
+    }
+
+    /**
+     * 鏇存柊浠诲姟鐘舵�侊紙APP绔級
+     * 鏀寔GPS浣嶇疆淇℃伅涓婃姤
+     */
     @Log(title = "浠诲姟鐘舵�佸彉鏇�", businessType = BusinessType.UPDATE)
     @PutMapping("/{taskId}/status")
-    public AjaxResult changeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
+    public AjaxResult appChangeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
         TaskStatus newStatus = TaskStatus.getByCode(request.getTaskStatus());
         if (newStatus == null) {
             return error("鏃犳晥鐨勪换鍔$姸鎬�");
         }
         
-        // 濡傛灉鍖呭惈GPS浣嶇疆淇℃伅锛屼娇鐢ㄥ甫浣嶇疆鐨勬柟娉�
-        if (request.getLatitude() != null && request.getLongitude() != null) {
-            SysTaskLog locationLog = new SysTaskLog();
-            locationLog.setLatitude(request.getLatitude());
-            locationLog.setLongitude(request.getLongitude());
-            locationLog.setLocationAddress(request.getLocationAddress());
-            locationLog.setLocationProvince(request.getLocationProvince());
-            locationLog.setLocationCity(request.getLocationCity());
-            locationLog.setLocationDistrict(request.getLocationDistrict());
-            locationLog.setGpsAccuracy(request.getGpsAccuracy());
-            locationLog.setAltitude(request.getAltitude());
-            locationLog.setSpeed(request.getSpeed());
-            locationLog.setHeading(request.getHeading());
-            
-            return toAjax(sysTaskService.changeTaskStatusWithLocation(taskId, newStatus, request.getRemark(), locationLog));
+        // 濡傛灉鏄彇娑堢姸鎬侊紝淇濆瓨鍙栨秷鍘熷洜
+        if (newStatus == TaskStatus.CANCELLED && StringUtils.isNotEmpty(request.getCancelReason())) {
+            sysTaskService.saveCancelInfo(taskId, request.getCancelReason());
         }
         
+        // 濡傛灉鏄己鍒跺畬鎴愶紝鏇存柊瀹為檯寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+        if (newStatus == TaskStatus.COMPLETED && request.getActualStartTime() != null && request.getActualEndTime() != null) {
+            SysTask task = new SysTask();
+            task.setTaskId(taskId);
+            task.setTaskStatus(newStatus.getCode());
+            //灏哠tring杞垚Date
+
+            task.setActualStartTime(DateUtils.parseDate(request.getActualStartTime()));
+            task.setActualEndTime(DateUtils.parseDate(request.getActualEndTime()));
+            task.setRemark(request.getRemark());
+            task.setUpdateBy(SecurityUtils.getUsername());
+            task.setUpdateTime(DateUtils.getNowDate());
+            
+            int result = sysTaskService.forceCompleteTask(task);
+            return toAjax(result);
+        }
+        
+        // 濡傛灉鍖呭惈GPS浣嶇疆淇℃伅锛屼娇鐢ㄥ甫浣嶇疆鐨勬柟娉�
+        if (request.getLatitude() != null && request.getLongitude() != null) {
+           String address= mapService.reverseGeocoding(request.getLongitude(), request.getLatitude());
+           request.setLocationAddress(address);
+            SysTaskLog locationLog = getLocationLog(request);
+
+            return toAjax(sysTaskService.changeTaskStatusWithLocation(taskId, newStatus, request.getRemark(), locationLog));
+        }
+
         return toAjax(sysTaskService.changeTaskStatus(taskId, newStatus, request.getRemark()));
     }
 
+    private static SysTaskLog getLocationLog(ChangeStatusRequest request) {
+        SysTaskLog locationLog = new SysTaskLog();
+        locationLog.setLatitude(request.getLatitude());
+        locationLog.setLongitude(request.getLongitude());
+        locationLog.setLocationAddress(request.getLocationAddress());
+        locationLog.setLocationProvince(request.getLocationProvince());
+        locationLog.setLocationCity(request.getLocationCity());
+        locationLog.setLocationDistrict(request.getLocationDistrict());
+        locationLog.setGpsAccuracy(request.getGpsAccuracy());
+        locationLog.setAltitude(request.getAltitude());
+        locationLog.setSpeed(request.getSpeed());
+        locationLog.setHeading(request.getHeading());
+        return locationLog;
+    }
+
     /**
-     * 鏌ヨ浠诲姟缁熻淇℃伅
+     * 鏌ヨ浠诲姟缁熻淇℃伅锛圓PP绔級
      */
-    @PreAuthorize("@ss.hasPermi('task:general:query')")
     @GetMapping("/statistics")
     public AjaxResult getStatistics() {
         TaskStatisticsVO statistics = sysTaskService.getTaskStatistics();
@@ -167,9 +380,18 @@
     }
 
     /**
-     * 鏌ヨ瓒呮椂浠诲姟鍒楄〃
+     * 鏌ヨ浠诲姟缁熻淇℃伅锛堝悗鍙扮鐞嗙锛�
      */
     @PreAuthorize("@ss.hasPermi('task:general:query')")
+    @GetMapping("/admin/statistics")
+    public AjaxResult adminGetStatistics() {
+        TaskStatisticsVO statistics = sysTaskService.getTaskStatistics();
+        return success(statistics);
+    }
+
+    /**
+     * 鏌ヨ瓒呮椂浠诲姟鍒楄〃锛圓PP绔級
+     */
     @GetMapping("/overdue")
     public AjaxResult getOverdueTasks() {
         List<SysTask> list = sysTaskService.selectOverdueTasks();
@@ -177,13 +399,64 @@
     }
 
     /**
-     * 鏌ヨ鎴戠殑浠诲姟鍒楄〃
+     * 鏌ヨ瓒呮椂浠诲姟鍒楄〃锛堝悗鍙扮鐞嗙锛�
      */
     @PreAuthorize("@ss.hasPermi('task:general:query')")
+    @GetMapping("/admin/overdue")
+    public AjaxResult adminGetOverdueTasks() {
+        List<SysTask> list = sysTaskService.selectOverdueTasks();
+        return success(list);
+    }
+
+    /**
+     * 鏌ヨ鎴戠殑浠诲姟鍒楄〃锛圓PP绔級
+     */
     @GetMapping("/my")
     public AjaxResult getMyTasks() {
         List<SysTask> list = sysTaskService.selectMyTasks(getUserId());
         return success(list);
+    }
+
+    /**
+     * 妫�鏌ヨ溅杈嗘槸鍚︽湁姝e湪杩涜涓殑浠诲姟锛圓PP绔級
+     * 姝e湪杩涜涓殑浠诲姟鏄寚鐘舵�佷笉涓猴細PENDING锛堝緟澶勭悊锛夈�丆OMPLETED锛堝凡瀹屾垚锛夈�丆ANCELLED锛堝凡鍙栨秷锛夌殑浠诲姟
+     */
+    @GetMapping("/vehicle/{vehicleId}/active")
+    public AjaxResult checkVehicleActiveTasks(@PathVariable Long vehicleId) {
+        List<SysTask> activeTasks = sysTaskService.checkVehicleActiveTasks(vehicleId);
+        return success(activeTasks);
+    }
+
+    /**
+     * 妫�鏌ヤ换鍔℃槸鍚﹀彲浠ュ嚭鍙戯紙APP绔級
+     * 妫�鏌ワ細
+     * 1. 杞﹁締鏄惁鏈夋湭瀹屾垚鐨勪换鍔�
+     * 2. 鎵ц浜哄憳鏄惁鏈夋湭瀹屾垚鐨勪换鍔�
+     * 
+     * @param taskId 浠诲姟ID
+     * @return 鏍¢獙缁撴灉
+     */
+    @GetMapping("/{taskId}/check-depart")
+    public AjaxResult checkTaskCanDepart(@PathVariable Long taskId) {
+        return sysTaskService.checkTaskCanDepart(taskId);
+    }
+
+    /**
+     * 鎵ц浜虹偣鍑诲氨缁紙APP绔級
+     */
+    @PostMapping("/{taskId}/assignee/ready")
+    public AjaxResult setAssigneeReady(@PathVariable Long taskId) {
+        Long userId = getUserId();
+        return sysTaskService.setAssigneeReady(taskId, userId);
+    }
+
+    /**
+     * 鎵ц浜哄彇娑堝氨缁紙APP绔級
+     */
+    @PostMapping("/{taskId}/assignee/cancel-ready")
+    public AjaxResult cancelAssigneeReady(@PathVariable Long taskId) {
+        Long userId = getUserId();
+        return sysTaskService.cancelAssigneeReady(taskId, userId);
     }
 
     /**
@@ -228,6 +501,15 @@
         private Double altitude;
         private Double speed;
         private Double heading;
+        
+        // 鍙栨秷鐩稿叧瀛楁
+        private String cancelReason;  // 鍙栨秷鍘熷洜锛堝叧鑱旀暟鎹瓧鍏竧ask_cancel_reason锛�
+        
+        // 寮哄埗瀹屾垚鐩稿叧瀛楁
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+        private String actualStartTime;  // 瀹為檯寮�濮嬫椂闂�
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+        private String actualEndTime;    // 瀹為檯缁撴潫鏃堕棿
 
         public String getTaskStatus() {
             return taskStatus;
@@ -324,5 +606,174 @@
         public void setHeading(Double heading) {
             this.heading = heading;
         }
+
+        public String getCancelReason() {
+            return cancelReason;
+        }
+
+        public void setCancelReason(String cancelReason) {
+            this.cancelReason = cancelReason;
+        }
+        
+        public String getActualStartTime() {
+            return actualStartTime;
+        }
+        
+        public void setActualStartTime(String actualStartTime) {
+            this.actualStartTime = actualStartTime;
+        }
+        
+        public String getActualEndTime() {
+            return actualEndTime;
+        }
+        
+        public void setActualEndTime(String actualEndTime) {
+            this.actualEndTime = actualEndTime;
+        }
+    }
+    
+    /**
+     * 鎵嬪姩鍚屾鏈嶅姟鍗曞埌鏃х郴缁�
+     * 褰撴湇鍔″崟鍚屾澶辫触鎴栨湭鍚屾鏃讹紝鍙互閫氳繃姝ゆ帴鍙f墜鍔ㄨЕ鍙戝悓姝�
+     */
+    @PreAuthorize("@ss.hasPermi('task:general:edit')")
+    @Log(title = "鎵嬪姩鍚屾鏈嶅姟鍗�", businessType = BusinessType.UPDATE)
+    @PostMapping("/syncServiceOrder/{taskId}")
+    public AjaxResult syncServiceOrder(@PathVariable Long taskId) {
+        try {
+            // 鏌ヨ浠诲姟淇℃伅
+            SysTask task = sysTaskService.selectSysTaskByTaskId(taskId);
+            if (task == null) {
+                return error("浠诲姟涓嶅瓨鍦�");
+            }
+            
+            // 鍙敮鎸佹�ユ晳杞繍浠诲姟
+            if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+                return error("鍙湁鎬ユ晳杞繍浠诲姟鎵嶈兘鍚屾鍒版棫绯荤粺");
+            }
+            
+            // 璋冪敤鍚屾鏈嶅姟
+            Long serviceOrdId = legacySystemSyncService.syncEmergencyTaskToLegacy(taskId);
+            
+            if (serviceOrdId != null && serviceOrdId > 0) {
+                return success("鏈嶅姟鍗曞悓姝ユ垚鍔燂紝ServiceOrdID: " + serviceOrdId);
+            } else {
+                return error("鏈嶅姟鍗曞悓姝ュけ璐ワ紝璇锋煡鐪嬪悓姝ラ敊璇俊鎭�");
+            }
+            
+        } catch (Exception e) {
+            logger.error("鎵嬪姩鍚屾鏈嶅姟鍗曞紓甯革紝taskId: {}", taskId, e);
+            return error("鍚屾寮傚父: " + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鎵嬪姩鍚屾璋冨害鍗曞埌鏃х郴缁�
+     * 褰撹皟搴﹀崟鍚屾澶辫触鎴栨湭鍚屾鏃讹紝鍙互閫氳繃姝ゆ帴鍙f墜鍔ㄨЕ鍙戝悓姝�
+     */
+    @PreAuthorize("@ss.hasPermi('task:general:edit')")
+    @Log(title = "鎵嬪姩鍚屾璋冨害鍗�", businessType = BusinessType.UPDATE)
+    @PostMapping("/syncDispatchOrder/{taskId}")
+    public AjaxResult syncDispatchOrder(@PathVariable Long taskId) {
+        try {
+            // 鏌ヨ浠诲姟淇℃伅
+            SysTask task = sysTaskService.selectSysTaskByTaskId(taskId);
+            if (task == null) {
+                return error("浠诲姟涓嶅瓨鍦�");
+            }
+            
+            // 鍙敮鎸佹�ユ晳杞繍浠诲姟
+            if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+                return error("鍙湁鎬ユ晳杞繍浠诲姟鎵嶈兘鍚屾鍒版棫绯荤粺");
+            }
+            
+            // 鏌ヨ鎬ユ晳杞繍鎵╁睍淇℃伅
+            SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
+            if (emergency == null) {
+                return error("鎬ユ晳杞繍鎵╁睍淇℃伅涓嶅瓨鍦�");
+            }
+            
+            // 蹇呴』鍏堟湁鏈嶅姟鍗�
+            if (emergency.getLegacyServiceOrdId() == null || emergency.getLegacyServiceOrdId() <= 0) {
+                return error("璇峰厛鍚屾鏈嶅姟鍗�");
+            }
+            
+            // 璋冪敤鍚屾鏈嶅姟
+            Long dispatchOrdId = taskDispatchSyncService.syncDispatch(taskId);
+            
+            if (dispatchOrdId != null && dispatchOrdId > 0) {
+                return success("璋冨害鍗曞悓姝ユ垚鍔燂紝DispatchOrdID: " + dispatchOrdId);
+            } else {
+                return error("璋冨害鍗曞悓姝ュけ璐ワ紝璇锋煡鐪嬪悓姝ラ敊璇俊鎭�");
+            }
+            
+        } catch (Exception e) {
+            logger.error("鎵嬪姩鍚屾璋冨害鍗曞紓甯革紝taskId: {}", taskId, e);
+            return error("鍚屾寮傚父: " + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鎵嬪姩鍚屾浠诲姟鐘舵�佸埌鏃х郴缁�
+     * 褰撲换鍔$姸鎬佸彉鏇村悗鐢变簬缃戠粶绛夊師鍥犳湭鍚屾鍒版棫绯荤粺鏃讹紝鍙互閫氳繃姝ゆ帴鍙f墜鍔ㄨЕ鍙戝悓姝�
+     */
+//    @PreAuthorize("@ss.hasPermi('task:general:edit')")
+    @Log(title = "鎵嬪姩鍚屾浠诲姟鐘舵��", businessType = BusinessType.UPDATE)
+    @PostMapping("/syncTaskStatus/{taskId}")
+    public AjaxResult syncTaskStatus(@PathVariable Long taskId) {
+        try {
+            // 鏌ヨ浠诲姟淇℃伅
+            SysTask task = sysTaskService.selectSysTaskByTaskId(taskId);
+            if (task == null) {
+                return error("浠诲姟涓嶅瓨鍦�");
+            }
+            
+            // 鍙敮鎸佹�ユ晳杞繍浠诲姟
+            if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+                return error("鍙湁鎬ユ晳杞繍浠诲姟鎵嶈兘鍚屾鍒版棫绯荤粺");
+            }
+            
+            // 鏌ヨ鎬ユ晳杞繍鎵╁睍淇℃伅
+            SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
+            if (emergency == null) {
+                return error("鎬ユ晳杞繍鎵╁睍淇℃伅涓嶅瓨鍦�");
+            }
+            
+            // 蹇呴』鍏堟湁璋冨害鍗�
+            if (emergency.getLegacyDispatchOrdId() == null || emergency.getLegacyDispatchOrdId() <= 0) {
+                return error("璇峰厛鍚屾璋冨害鍗曪紝浠诲姟鐘舵�佷俊鎭悓姝ュ埌鏃х郴缁熺殑璋冨害鍗曚腑");
+            }
+            
+            // 璋冪敤鐘舵�佸悓姝ユ湇鍔�
+            boolean success = taskStatusPushService.pushTaskStatusToLegacy(taskId);
+            
+            if (success) {
+                return success("浠诲姟鐘舵�佸悓姝ユ垚鍔�");
+            } else {
+                return error("浠诲姟鐘舵�佸悓姝ュけ璐ワ紝璇锋煡鐪嬫棩蹇楄幏鍙栬缁嗕俊鎭�");
+            }
+            
+        } catch (Exception e) {
+            logger.error("鎵嬪姩鍚屾浠诲姟鐘舵�佸紓甯革紝taskId: {}", taskId, e);
+            return error("鍚屾寮傚父: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 鏌ヨ浠诲姟鐘舵�佸彉鏇村巻鍙�
+     */
+    @GetMapping("/{taskId}/statusHistory")
+    public AjaxResult getTaskStatusHistory(@PathVariable Long taskId) {
+        try {
+            SysTask task = sysTaskService.selectSysTaskByTaskId(taskId);
+            if (task == null) {
+                return error("浠诲姟涓嶅瓨鍦�");
+            }
+            List<SysTaskStatusHistory> list = sysTaskStatusHistoryMapper.selectByTaskId(taskId);
+            return success(list);
+        } catch (Exception e) {
+            logger.error("鏌ヨ浠诲姟鐘舵�佸巻鍙插紓甯革紝taskId: {}", taskId, e);
+            return error("鏌ヨ澶辫触: " + e.getMessage());
+        }
     }
 }

--
Gitblit v1.9.1