From 5d75fcaea0a3774052b7484a4ffe755258502363 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 06 十二月 2025 20:49:11 +0800
Subject: [PATCH] fix:开始执行人员就绪按钮

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java |  189 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 185 insertions(+), 4 deletions(-)

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 a04871a..a6bca50 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
@@ -36,6 +36,7 @@
 import com.ruoyi.system.service.ISysTaskEmergencyService;
 import com.ruoyi.system.service.ITaskAttachmentSyncService;
 import com.ruoyi.system.service.IMapService;
+import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.event.TaskCreatedEvent;
 import com.ruoyi.system.event.TaskAssignedEvent;
 import com.ruoyi.system.event.TaskStatusChangedEvent;
@@ -99,6 +100,9 @@
 
     @Autowired(required = false)
     private IMapService mapService;
+
+    @Autowired
+    private ISysConfigService configService;
 
     /**
      * 鏌ヨ浠诲姟绠$悊
@@ -1024,7 +1028,6 @@
      * @return 缁撴灉
      */
     @Override
-    @Transactional
     public int changeTaskStatus(Long taskId, TaskStatus newStatus, String remark) {
         return changeTaskStatusWithLocation(taskId, newStatus, remark, null);
     }
@@ -1039,7 +1042,6 @@
      * @return 缁撴灉
      */
     @Override
-    @Transactional
     public int changeTaskStatusWithLocation(Long taskId, TaskStatus newStatus, String remark, SysTaskLog locationLog) {
         SysTask oldTask = sysTaskMapper.selectSysTaskByTaskId(taskId);
         if (oldTask == null) {
@@ -1091,7 +1093,10 @@
                     .map(SysTaskAssignee::getUserId)
                     .collect(Collectors.toList());
             }
-            
+            Long userId=SecurityUtils.getUserId();
+            Double lng=locationLog==null?null: locationLog.getLongitude();
+            Double lat=locationLog==null?null: locationLog.getLatitude();
+            String address=locationLog==null?null: locationLog.getLocationAddress();
             eventPublisher.publishEvent(new TaskStatusChangedEvent(
                 this,
                 oldTask.getTaskId(),
@@ -1101,7 +1106,11 @@
                 oldTaskStatus.getInfo(),
                 newStatus.getInfo(),
                 assigneeIds,
-                oldTask.getCreatorId()
+                oldTask.getCreatorId(),
+                userId,
+                    lng, lat,
+                    address
+
             ));
         }
         
@@ -2262,5 +2271,177 @@
         }
     }
     
+    /**
+     * 妫�鏌ヤ换鍔℃槸鍚﹀彲浠ュ嚭鍙�
+     * 妫�鏌ワ細
+     * 1. 杞﹁締鏄惁鏈夋湭瀹屾垚鐨勪换鍔�
+     * 2. 鎵ц浜哄憳鏄惁鏈夋湭瀹屾垚鐨勪换鍔�
+     * 
+     * @param taskId 浠诲姟ID
+     * @return AjaxResult 鏍¢獙缁撴灉
+     */
+    @Override
+    public com.ruoyi.common.core.domain.AjaxResult checkTaskCanDepart(Long taskId) {
+        // 鑾峰彇浠诲姟璇︽儏
+        SysTask task = this.getTaskDetail(taskId);
+        if (task == null) {
+            return com.ruoyi.common.core.domain.AjaxResult.error("浠诲姟涓嶅瓨鍦�");
+        }
+        
+        List<Map<String, Object>> conflicts = new ArrayList<>();
+        
+        // 1. 妫�鏌ヨ溅杈嗘槸鍚︽湁鏈畬鎴愮殑浠诲姟
+        List<SysTaskVehicle> taskVehicles = task.getAssignedVehicles();
+        if (taskVehicles != null && !taskVehicles.isEmpty()) {
+            for (SysTaskVehicle taskVehicle : taskVehicles) {
+                Long vehicleId = taskVehicle.getVehicleId();
+                List<SysTask> vehicleActiveTasks = this.checkVehicleActiveTasks(vehicleId);
+                
+                // 杩囨护鎺夊綋鍓嶄换鍔℃湰韬�
+                vehicleActiveTasks = vehicleActiveTasks.stream()
+                    .filter(t -> !t.getTaskId().equals(taskId))
+                    .collect(Collectors.toList());
+                
+                if (!vehicleActiveTasks.isEmpty()) {
+                    for (SysTask activeTask : vehicleActiveTasks) {
+                        Map<String, Object> conflict = new HashMap<>();
+                        conflict.put("type", "vehicle");
+                        conflict.put("vehicleNo", taskVehicle.getVehicleNo());
+                        conflict.put("taskId", activeTask.getTaskId());
+                        conflict.put("taskCode", activeTask.getTaskCode());
+                        conflict.put("taskStatus", activeTask.getTaskStatus());
+                        conflict.put("message", String.format("杞﹁締 %s 灏氭湁鏈畬鎴愮殑浠诲姟 %s锛岃鍏堝畬鎴�", 
+                            taskVehicle.getVehicleNo(), activeTask.getTaskCode()));
+                        conflicts.add(conflict);
+                    }
+                }
+            }
+        }
+        
+        // 2. 妫�鏌ユ墽琛屼汉鍛樻槸鍚︽湁鏈畬鎴愮殑浠诲姟
+        List<SysTaskAssignee> assignees = task.getAssignees();
+        if (assignees != null && !assignees.isEmpty()) {
+            for (SysTaskAssignee assignee : assignees) {
+                Long userId = assignee.getUserId();
+                
+                // 鏌ヨ璇ユ墽琛屼汉鐨勬墍鏈夋鍦ㄨ繘琛屼腑鐨勪换鍔★紙鎺掗櫎PENDING銆丆OMPLETED銆丆ANCELLED锛�
+                List<SysTask> userActiveTasks = this.selectMyTasks(userId).stream()
+                    .filter(t -> !TaskStatus.PENDING.getCode().equals(t.getTaskStatus())
+                              && !TaskStatus.COMPLETED.getCode().equals(t.getTaskStatus()) 
+                              && !TaskStatus.CANCELLED.getCode().equals(t.getTaskStatus())
+                              && !t.getTaskId().equals(taskId)) // 杩囨护鎺夊綋鍓嶄换鍔�
+                    .collect(Collectors.toList());
+                
+                if (!userActiveTasks.isEmpty()) {
+                    for (SysTask activeTask : userActiveTasks) {
+                        Map<String, Object> conflict = new HashMap<>();
+                        conflict.put("type", "assignee");
+                        conflict.put("userName", assignee.getUserName());
+                        conflict.put("taskId", activeTask.getTaskId());
+                        conflict.put("taskCode", activeTask.getTaskCode());
+                        conflict.put("taskStatus", activeTask.getTaskStatus());
+                        conflict.put("message", String.format("鎵ц浜� %s 灏氭湁姝e湪杩涜涓殑浠诲姟 %s锛岃鍏堝畬鎴�", 
+                            assignee.getUserName(), activeTask.getTaskCode()));
+                        conflicts.add(conflict);
+                    }
+                }
+            }
+        }
+        
+        // 3. 妫�鏌ユ墽琛屼汉鏄惁鍏ㄩ儴灏辩华锛堝彈閰嶇疆寮�鍏虫帶鍒讹級
+        String readyCheckEnabled = configService.selectConfigByKey("task.assignee.ready.check.enabled");
+        if ("true".equalsIgnoreCase(readyCheckEnabled)) {
+             assignees = task.getAssignees();
+            if (assignees != null && !assignees.isEmpty()) {
+                boolean allReady = assignees.stream()
+                    .allMatch(a -> "1".equals(a.getIsReady()));
+                if (!allReady) {
+                    Map<String, Object> conflict = new HashMap<>();
+                    conflict.put("type", "assigneeReady");
+                    conflict.put("message", "瀛樺湪鏈氨缁殑鎵ц浜猴紝璇风瓑寰呮墍鏈夋墽琛屼汉鐐瑰嚮灏辩华鍚庡啀鍑鸿溅");
+                    conflicts.add(conflict);
+                }
+            }
+        }
+        
+        // 杩斿洖缁撴灉
+        Map<String, Object> result = new HashMap<>();
+        result.put("valid", conflicts.isEmpty());
+        result.put("conflicts", conflicts);
+        
+        return com.ruoyi.common.core.domain.AjaxResult.success(result);
+    }
+
+    /**
+     * 鎵ц浜虹偣鍑诲氨缁�
+     * 
+     * @param taskId 浠诲姟ID
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public com.ruoyi.common.core.domain.AjaxResult setAssigneeReady(Long taskId, Long userId) {
+        // 1. 鏌ヨ鎵ц浜哄叧鑱斾俊鎭�
+        List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
+        SysTaskAssignee targetAssignee = assignees.stream()
+            .filter(a -> a.getUserId().equals(userId))
+            .findFirst()
+            .orElse(null);
+        
+        if (targetAssignee == null) {
+            return com.ruoyi.common.core.domain.AjaxResult.error("鎮ㄤ笉鏄浠诲姟鐨勬墽琛屼汉");
+        }
+        
+        // 2. 鏇存柊灏辩华鐘舵��
+        targetAssignee.setIsReady("1");
+        targetAssignee.setReadyTime(new Date());
+        targetAssignee.setUpdateBy(SecurityUtils.getUsername());
+        targetAssignee.setUpdateTime(new Date());
+        
+        sysTaskAssigneeMapper.updateSysTaskAssignee(targetAssignee);
+        
+        // 3. 妫�鏌ユ槸鍚︽墍鏈夋墽琛屼汉閮藉凡灏辩华
+        boolean allReady = assignees.stream()
+            .allMatch(a -> a.getUserId().equals(userId) || "1".equals(a.getIsReady()));
+        
+        Map<String, Object> result = new HashMap<>();
+        result.put("allReady", allReady);
+        result.put("message", "灏辩华鎴愬姛");
+        
+        return com.ruoyi.common.core.domain.AjaxResult.success(result);
+    }
+
+    /**
+     * 鍙栨秷鎵ц浜哄氨缁�
+     * 
+     * @param taskId 浠诲姟ID
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public com.ruoyi.common.core.domain.AjaxResult cancelAssigneeReady(Long taskId, Long userId) {
+        // 鏌ヨ鎵ц浜哄叧鑱斾俊鎭�
+        List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
+        SysTaskAssignee targetAssignee = assignees.stream()
+            .filter(a -> a.getUserId().equals(userId))
+            .findFirst()
+            .orElse(null);
+        
+        if (targetAssignee == null) {
+            return com.ruoyi.common.core.domain.AjaxResult.error("鎮ㄤ笉鏄浠诲姟鐨勬墽琛屼汉");
+        }
+        
+        // 鏇存柊灏辩华鐘舵��
+        targetAssignee.setIsReady("0");
+        targetAssignee.setReadyTime(null);
+        targetAssignee.setUpdateBy(SecurityUtils.getUsername());
+        targetAssignee.setUpdateTime(new Date());
+        
+        sysTaskAssigneeMapper.updateSysTaskAssignee(targetAssignee);
+        
+        return com.ruoyi.common.core.domain.AjaxResult.success("宸插彇娑堝氨缁�");
+    }
    
 }

--
Gitblit v1.9.1