From f161eb229c5fb0f82c2dfd26c6440dbf84cba1ca Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期五, 24 四月 2026 17:05:52 +0800
Subject: [PATCH] [feat] 杂项优化,可改派人员排序,车队信息模糊查询等,活动通知方式

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java                         |    5 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/XpTaskVO.java                                                        |   31 ++++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java               |    9 +
 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java             |   13 ++
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java |    9 -
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java                                           |    2 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsUserMapper.java                         |    2 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java              |    6 +
 xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml                     |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/WebSocketMessageClient.java                     |    4 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java                   |   45 ++++++--
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java                 |    6 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java                           |    4 
 xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java     |   11 +
 xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml                                  |   28 +++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java                          |    5 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/WebSocketMessageFallbackFactory.java                |    5 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java                              |    3 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetClientFallbackFactory.java                 |    6 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetClient.java                            |    7 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java                |   52 ++++++++-
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java                      |    3 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/OptionalUsersPageListQuery.java                           |   21 ++++
 xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml                                    |    5 
 24 files changed, 238 insertions(+), 46 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
index a53f60e..6866bdb 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -18,6 +18,7 @@
 import com.xiaopeng.api.model.account.XpOperationsUser;
 import com.xiaopeng.api.model.account.XpQualificationAudit;
 import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
 import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
@@ -86,6 +87,11 @@
         return R.ok(xpOperationsUserService.listByIds(ids));
     }
 
+    @PostMapping("/logan/inner/xpOperationsUser/pageListByIds")
+    public R<List<XpOperationsUserWithRoleVO>> pageListByIds(@RequestBody OptionalUsersPageListQuery q) {
+        return R.ok(xpOperationsUserService.pageListByIds(q));
+    }
+
     @PostMapping("/logan/inner/xpOperationsUser/findList")
     public R<List<XpOperationsUserWithRoleVO>> findList(@RequestBody XpOperationsUserQueryDTO query) {
         return R.ok(xpOperationsUserService.findList(query));
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsUserMapper.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsUserMapper.java
index d4853f6..cc5d945 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsUserMapper.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsUserMapper.java
@@ -6,6 +6,7 @@
 import com.xiaopeng.account.model.query.XpOperationsUserQuery;
 import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO;
 import com.xiaopeng.api.model.account.XpOperationsUser;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
 import com.xiaopeng.api.vo.account.ExportOperationsUserVo;
 import com.xiaopeng.api.vo.account.XpOperationsUserVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
@@ -50,4 +51,5 @@
      */
     List<ExportOperationsUserVo> exportOperationsUser(@Param("query")XpOperationsUserQuery query);
 
+    List<XpOperationsUserWithRoleVO> pageListByIds(OptionalUsersPageListQuery q);
 }
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java
index 12ccc17..a62a5f0 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java
@@ -9,6 +9,7 @@
 import com.xiaopeng.account.model.query.XpOperationsUserQuery;
 import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO;
 import com.xiaopeng.api.model.account.XpOperationsUser;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
 import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserVO;
 import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
@@ -135,4 +136,6 @@
      * @return
      */
     List<XpOperationsUser> getByPhoneNumber(String phoneNumber);
+
+    List<XpOperationsUserWithRoleVO> pageListByIds(OptionalUsersPageListQuery q);
 }
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
index 6426f83..b1eaa53 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -29,6 +29,7 @@
 import com.xiaopeng.api.model.account.XpOperationsUser;
 import com.xiaopeng.api.model.account.XpQualificationAudit;
 import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
 import com.xiaopeng.api.vo.account.*;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.exception.ServiceException;
@@ -546,4 +547,9 @@
         }
         return lambdaQuery().like(XpOperationsUser::getPhoneNumber, phoneNumber).list();
     }
+
+    @Override
+    public List<XpOperationsUserWithRoleVO> pageListByIds(OptionalUsersPageListQuery q) {
+        return baseMapper.pageListByIds(q);
+    }
 }
diff --git a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml
index 2cc0a22..c981954 100644
--- a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml
+++ b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml
@@ -110,4 +110,32 @@
     <select id="findList" resultType="com.xiaopeng.api.vo.account.XpOperationsUserVO">
     </select>
 
+    <select id="pageListByIds" resultType="com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO">
+        SELECT
+        u.*,
+        r.id AS roleId,
+        GROUP_CONCAT(r.role_name) AS roleName
+        FROM xp_operations_user u
+        LEFT JOIN xp_operations_role ur ON u.id = ur.operations_user_id
+        LEFT JOIN sys_role r ON ur.role_id = r.id AND r.is_deleted = 0
+        <where>
+            u.is_deleted = 0
+            <if test="query.nickName != null and query.nickName != ''">
+                AND u.nick_name LIKE CONCAT('%', #{query.nickName}, '%')
+            </if>
+            <if test="query.roleId != null">
+                AND r.role_name LIKE CONCAT('%', #{query.role}, '%')
+            </if>
+            <if test="query.ids != null and query.ids.size() > 0">
+                AND u.id IN
+                <foreach collection="query.ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+
+        </where>
+        GROUP BY u.id
+        ORDER BY u.create_time DESC
+    </select>
+
 </mapper>
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
index 2844a6c..c4c1408 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java
@@ -3,8 +3,10 @@
 import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO;
 import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
 import com.xiaopeng.api.model.account.XpOperationsRole;import com.xiaopeng.api.model.account.XpOperationsUser;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
 import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.web.page.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
@@ -89,6 +91,13 @@
                 log.error("根据手机号精确查询运维用户失败,原因:{}", cause.getMessage());
                 return R.fail("根据手机号精确查询运维用户失败:" + cause.getMessage());
             }
+
+            @Override
+            public R<PageInfo<XpOperationsUserWithRoleVO>> listByQueryIds(OptionalUsersPageListQuery query) {
+
+                log.error("根据id列表获取运维人员列表失败,原因:{}", cause.getMessage());
+                return R.fail("根据id列表获取运维人员列表失败)" + cause.getMessage());
+            }
         };
     }
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/WebSocketMessageFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/WebSocketMessageFallbackFactory.java
index c97fce4..6cc0700 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/WebSocketMessageFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/WebSocketMessageFallbackFactory.java
@@ -1,8 +1,7 @@
 package com.xiaopeng.api.factory.pushMessage;
 
-import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
 import com.xiaopeng.api.feignClient.pushMessage.WebSocketMessageClient;
-import com.xiaopeng.api.vo.TaskVO;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.common.core.domain.R;
 import org.springframework.cloud.openfeign.FallbackFactory;
 
@@ -11,7 +10,7 @@
     public WebSocketMessageClient create(Throwable cause) {
         return new WebSocketMessageClient() {
             @Override
-            public R<String> pushTask(TaskVO dto) {
+            public R<String> pushTask(XpTaskVO dto) {
                 return R.fail("发送失败");
             }
 
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetClientFallbackFactory.java
index e1be5ae..31a2a34 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetClientFallbackFactory.java
@@ -42,6 +42,12 @@
                 log.error("查询打卡地被使用次数失败,原因: {}", cause.getMessage());
                 return R.fail("查询打卡地被使用次数失败");
             }
+
+            @Override
+            public R<List<Long>> idsByFleetName(String fleetName) {
+                log.error("根据车队名称查询ID失败,原因: {}", cause.getMessage());
+                return R.fail("根据车队名称查询ID失败");
+            }
         };
     }
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
index 01bc2de..acf5871 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
@@ -4,9 +4,11 @@
 import com.xiaopeng.api.factory.account.XpOperationUserClientFallbackFactory;
 import com.xiaopeng.api.model.account.XpOperationsRole;
 import com.xiaopeng.api.model.account.XpOperationsUser;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
 import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
+import com.xiaopeng.common.core.web.page.PageInfo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -109,4 +111,7 @@
      */
     @GetMapping("/logan/inner/xpOperationsUser/getByExactPhone")
     R<XpOperationsUser> getByExactPhone(@RequestParam("phoneNumber") String phoneNumber);
+
+    @PostMapping("/logan/inner/xpOperationsUser/pageListByIds")
+    R<PageInfo<XpOperationsUserWithRoleVO>> listByQueryIds(OptionalUsersPageListQuery query);
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/WebSocketMessageClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/WebSocketMessageClient.java
index 898ab65..20461ac 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/WebSocketMessageClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/WebSocketMessageClient.java
@@ -1,7 +1,7 @@
 package com.xiaopeng.api.feignClient.pushMessage;
 
 import com.xiaopeng.api.factory.pushMessage.WebSocketMessageFallbackFactory;
-import com.xiaopeng.api.vo.TaskVO;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -22,6 +22,6 @@
      * 工单推送
      */
     @PostMapping("/inner/websocket/push/task")
-    R<String> pushTask(@RequestBody TaskVO dto);
+    R<String> pushTask(@RequestBody XpTaskVO dto);
 
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetClient.java
index 183cbf1..4377d55 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetClient.java
@@ -47,4 +47,11 @@
     @GetMapping("/logan/inner/fleet/getUseCountByLocationId")
     R<Long> getUseCountByLocationId(@RequestParam Long locationId);
 
+    /**
+     * 根据车队名字模糊查询车队人员
+     *
+     */
+    @PostMapping("/logan/inner/fleet/idsByFleetName")
+    R<List<Long>> idsByFleetName(@RequestParam String fleetName);
+
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
index 902b7f0..6818a14 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
@@ -105,7 +105,7 @@
     @ApiModelProperty(value = "任务来源 1-运维APP 2-管理后台")
     private Integer taskSource;
 
-    @ApiModelProperty(value = "申请改派的用户id")
+    @ApiModelProperty(value = "申请改派的用户")
     @TableField(typeHandler = JacksonTypeHandler.class)
     private List<Reject> excluded;
 
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/OptionalUsersPageListQuery.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/OptionalUsersPageListQuery.java
new file mode 100644
index 0000000..1c2e2b2
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/OptionalUsersPageListQuery.java
@@ -0,0 +1,21 @@
+package com.xiaopeng.api.query.account;
+
+import com.xiaopeng.common.core.web.page.BasePage;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OptionalUsersPageListQuery extends BasePage {
+
+    Long taskId;
+
+    String nickName;
+
+    String role;
+
+    String fleet;
+
+    List<Long> ids;
+
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/TaskVO.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/XpTaskVO.java
similarity index 69%
rename from xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/TaskVO.java
rename to xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/XpTaskVO.java
index beeeff1..c19ac7c 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/TaskVO.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/XpTaskVO.java
@@ -1,6 +1,7 @@
 package com.xiaopeng.api.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xiaopeng.api.model.maintenance.XpTask;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -8,6 +9,7 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * <p>
@@ -19,7 +21,7 @@
  */
 @Data
 @ApiModel(value = "任务中心分页列表VO")
-public class TaskVO implements Serializable {
+public class XpTaskVO implements Serializable {
 
     @ApiModelProperty(value = "任务")
     private Long id;
@@ -44,6 +46,20 @@
     @ApiModelProperty(value = "车牌号")
     private String plateNumber;
 
+    @ApiModelProperty(value = "剩余处理时间(秒)")
+    private Long timeRemain;
+
+    public Long getTimeRemain() {
+        if (endTime != null) return null;
+        return LocalDateTime.now().until(endTime, java.time.temporal.ChronoUnit.SECONDS);
+    }
+
+    @ApiModelProperty(value = "事故类型id")
+    private String errorTypeId;
+
+    @ApiModelProperty(value = "事故类型")
+    private String errorName;
+
     @ApiModelProperty(value = "车辆id")
     private Long vehicleId;
 
@@ -61,4 +77,17 @@
 
     @ApiModelProperty(value = "处理人id")
     private String handleUserId;
+
+    @ApiModelProperty(value = "任务描述")
+    private String taskDescription;
+
+    @ApiModelProperty(value = "任务描述图片")
+    private String taskImage;
+
+    @ApiModelProperty(value = "申请改派的用户")
+    private List<XpTask.Reject> excluded;
+
+    @ApiModelProperty(value = "状态 2=已处理 1=改派中")
+    private Integer reassignmentStatus;
+
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java
index a48ec3d..179f279 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java
@@ -24,4 +24,7 @@
 
     @ApiModelProperty(value = "关联角色名称, 逗号拼接")
     private String roleName;
+
+    @ApiModelProperty(value = "和事故地点距离")
+    private String dis;
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
index fd6cd71..54ca44f 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -5,6 +5,7 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.xiaopeng.api.dto.account.XpOperationsUserPositionDTO;
 import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.account.XpOperationsUser;
@@ -12,8 +13,10 @@
 import com.xiaopeng.api.model.maintenance.XpTask;
 import com.xiaopeng.api.model.maintenance.XpTaskRule;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
-import com.xiaopeng.api.vo.TaskVO;
+import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.api.vo.account.LoginOperationUser;
+import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.web.page.PageInfo;
@@ -305,35 +308,49 @@
 
     @ApiOperation(value = "待改派的工单分页列表", tags = {"管理后台-运维执行-任务工单-待改派工单"})
     @PostMapping("/api/v1/task/reassign/pageList")
-    public R<PageInfo<TaskVO>> reassignTaskPageList(@RequestBody TaskPageListQuery query) {
+    public R<PageInfo<XpTaskVO>> reassignTaskPageList(@RequestBody TaskPageListQuery query) {
         return R.ok(xpTaskService.reassignTaskPageList(query));
     }
 
-    @ApiOperation(value = "可改派的运维人员列表", tags = {"管理后台-运维执行-任务工单-待改派工单"})
-    @GetMapping("/api/v1/task/reassign/availableUsers")
-    public R<List<XpOperationsUser>> availableReassignUsers(@RequestParam Long taskId) {
+    @Resource
+    XpFleetClient xpFleetClient;
 
-        XpTask task = xpTaskService.getById(taskId);
+    @ApiOperation(value = "可改派的运维人员列表", tags = {"管理后台-运维执行-任务工单-待改派工单"})
+    @PostMapping("/api/v1/task/reassign/availableUsers")
+    public R<PageInfo<XpOperationsUserWithRoleVO>> availableReassignUsers(@RequestBody OptionalUsersPageListQuery query) {
+
+        XpTask task = xpTaskService.getById(query.getTaskId());
         GeoJsonPoint point =
             new GeoJsonPoint(
                 task.getVehicleLon().doubleValue(), 
                 task.getVehicleLat().doubleValue()
             );
-        Query query = new Query(Criteria.where("location").near(point)
+        Query q = new Query(Criteria.where("location").near(point)
             .maxDistance(new Distance(10, Metrics.KILOMETERS).getNormalizedValue()));
-        query.with(Sort.by(Sort.Direction.ASC, "dis"));
-        List<Long> ids = mongoTemplate.find(query, XpOperationsUserPositionDTO.class)
-                .stream().map(XpOperationsUserPositionDTO::getId).collect(Collectors.toList());
-        return R.ok(operationUserClient.listByIds(ids).getData());
+        q.with(Sort.by(Sort.Direction.ASC, "dis"));
+
+        List<XpOperationsUserPositionDTO> up = mongoTemplate.find(q, XpOperationsUserPositionDTO.class);
+
+        // 查询车队下面面所有人员id和up求交集
+        List<Long> data = xpFleetClient.idsByFleetName(query.getFleet()).getData();
+
+        List<Long> ids = up.stream().map(XpOperationsUserPositionDTO::getId)
+                .filter(e -> data!=null && !data.isEmpty() &&!data.contains(e))
+                .collect(Collectors.toList());
+
+        query.setIds(ids);
+        PageInfo<XpOperationsUserWithRoleVO> ret = operationUserClient.listByQueryIds(query).getData();
+
+        return R.ok(ret);
     }
 
     @Resource
     private XpOperationUserClient operationUserClient;
 
     @ApiOperation(value = "改派详情", tags = {"管理后台-运维执行-任务工单-待改派工单"})
-    @GetMapping("/api/v1/task/reassign/detail")
-    public R<XpTask> reassignDetail(@RequestParam Long taskId) {
-        return R.ok(xpTaskService.getById(taskId));
+    @GetMapping("/api/v1/task/detail")
+    public R<XpTaskVO> reassignDetail(@RequestParam Long taskId) {
+        return R.ok(xpTaskService.detail(taskId));
     }
 
     @ApiOperation(value = "执行保险年检检测定时任务", tags = {"定时任务"})
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java
index 03543ac..790bb92 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java
@@ -2,7 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xiaopeng.api.model.maintenance.XpTask;
-import com.xiaopeng.api.vo.TaskVO;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.maintenance.model.query.TaskManagementPageListQuery;
 import com.xiaopeng.maintenance.model.query.WorkBenchQuery;
@@ -39,5 +39,5 @@
      */
     XpTask queryInfoByVehicleId(@Param("vehicleId")Long vehicleId);
 
-    PageInfo<TaskVO> reassignTaskPageList(@Param("pageInfo")PageInfo<TaskPageListQuery> pageInfo, @Param("query")TaskPageListQuery query);
+    PageInfo<XpTaskVO> reassignTaskPageList(@Param("pageInfo")PageInfo<TaskPageListQuery> pageInfo, @Param("query")TaskPageListQuery query);
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
index 989ed0e..e74a6da 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xiaopeng.api.model.account.XpOperationsUser;
 import com.xiaopeng.api.model.maintenance.XpTask;
-import com.xiaopeng.api.vo.TaskVO;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.maintenance.dto.HandleVehicleAccidentDto;
@@ -102,6 +102,7 @@
 
     void accept(String taskId);
 
-    PageInfo<TaskVO> reassignTaskPageList(TaskPageListQuery query);
+    PageInfo<XpTaskVO> reassignTaskPageList(TaskPageListQuery query);
 
+    XpTaskVO detail(Long taskId);
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java
index 9858a8b..e973156 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java
@@ -99,14 +99,13 @@
     @Override
     public List<XpCruiseCheckInStatisticsVO> statistics(XpCruiseCheckInStatisticsQuery query) {
         List<XpCruiseCheckInStatisticsVO> vos = xpCruiseCheckInRecordMapper.selectCruiseCheckInStatistics(query);
-        if (CollectionUtils.isEmpty(vos) || vos.size() < 7) {
-            String date = vos.get(vos.size() - 1).getDate();
-            LocalDate endDate = LocalDate.parse(date);
-            LocalDate startDate = endDate.minusDays(vos.size() + 1);
+        if (!CollectionUtils.isEmpty(vos) && vos.size() < 7) {
+            String date = vos.get(0).getDate();
+            LocalDate startDate = LocalDate.parse(date);
             for (int i = 7 - vos.size(); i > 0; i--) {
                 XpCruiseCheckInStatisticsVO v = new XpCruiseCheckInStatisticsVO();
-                v.setDate(startDate.toString());
                 startDate = startDate.minusDays(1);
+                v.setDate(startDate.toString());
                 vos.add(0, v);
             }
         }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
index 7053aa0..d4084d7 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -13,7 +13,6 @@
 import com.xiaopeng.api.feignClient.account.SysUserClient;
 import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
 import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
-import com.xiaopeng.api.feignClient.account.XpOperationsRoleClient;
 import com.xiaopeng.api.feignClient.operation.SmsClient;
 import com.xiaopeng.api.feignClient.pushMessage.WebSocketMessageClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient;
@@ -25,10 +24,8 @@
 import com.xiaopeng.api.model.account.XpOperationsUser;
 import com.xiaopeng.api.model.account.XpOperationsUserNotification;
 import com.xiaopeng.api.model.maintenance.*;
-import com.xiaopeng.api.model.operation.XpPasswordFreePolicy;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
-import com.xiaopeng.api.vo.TaskVO;
-import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.api.vo.operation.SmsVo;
@@ -428,9 +425,9 @@
             log.info("事故通知记录保存成功,共 {} 条", notifications.size());
         }
 
-        TaskVO taskVO = new TaskVO();
-        BeanUtil.copyProperties(xpTask, taskVO);
-        xpWebSocketMessageClient.pushTask(taskVO);
+        XpTaskVO xpTaskVO = new XpTaskVO();
+        BeanUtil.copyProperties(xpTask, xpTaskVO);
+        xpWebSocketMessageClient.pushTask(xpTaskVO);
 
         Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream()
                 .filter(u -> u.getDeviceType() != null && StringUtils.isNotBlank(u.getPhoneNumber()))
@@ -1407,6 +1404,7 @@
         XpTask.Reject reject = task.reject(msg);
         rejects.add(reject);
         task.setExcluded(rejects);
+        task.setReassignmentStatus(2);
         Set<String> excludedUserIds = rejects.stream().map(XpTask.Reject::getRejectUserId).collect(Collectors.toSet());
 
         Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
@@ -1501,10 +1499,45 @@
     }
 
     @Override
-    public PageInfo<TaskVO> reassignTaskPageList(TaskPageListQuery query) {
-        // 创建分页对象
+    public PageInfo<XpTaskVO> reassignTaskPageList(TaskPageListQuery query) {
+
         PageInfo<TaskPageListQuery> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+
         return baseMapper.reassignTaskPageList(pageInfo,query);
+    }
+
+    @Override
+    public XpTaskVO detail(Long taskId) {
+        XpTask task = getById(taskId);
+        if (task == null) {
+            return null;
+        }
+        XpTaskVO xpTaskVO = new XpTaskVO();
+        BeanUtil.copyProperties(task, xpTaskVO);
+
+        String taskImage = xpTaskVO.getTaskImage();
+        if (StringUtils.isNotBlank(taskImage)) {
+            try {
+                xpTaskVO.setTaskImage(aliOssDownloadUtil.getPictureJsonArray(taskImage));
+            } catch (Exception e) {
+                log.error("获取任务图片下载地址失败,taskId={}", taskId, e);
+            }
+        }
+
+        // 2. 如果有车辆信息,可以补充车辆相关详情(如果需要)
+        if (task.getVehicleId() != null) {
+            R<XpVehicle> vehicleResult = xpVehicleClient.queryById(task.getVehicleId());
+            if (vehicleResult != null && vehicleResult.getData() != null) {
+                XpVehicle vehicle = vehicleResult.getData();
+                xpTaskVO.setPlateNumber(vehicle.getPlateNumber());
+//                xpTaskVO.setVehicleColor(vehicle.getVehicleColor());
+//                xpTaskVO.setVehicleCode(vehicle.getVehicleCode());
+//                xpTaskVO.setVehicleVin(vehicle.getVehicleVin());
+
+            }
+        }
+
+        return xpTaskVO;
     }
 
     @Value("${robotaxi.sms.app-id:1476153389173952512}")
@@ -1582,6 +1615,7 @@
         } else {
             task.setEndTime(LocalDateTime.now().plusDays(3));
         }
+        task.setReassignmentStatus(2);
         task.setAssigneeTime(LocalDateTime.now());
         task.setHandleUserId(handlerUserId.toString());
         task.setVehicleId(null);
diff --git a/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml b/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml
index 892c3fb..ef5a29d 100644
--- a/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml
+++ b/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml
@@ -140,7 +140,7 @@
             AND DATE(r.check_in_time) &lt;= #{query.endDate}
         </if>
         GROUP BY DATE(r.check_in_time)
-        ORDER BY `date` DESC
+        ORDER BY `date`
     </select>
 
     <select id="exportList" resultType="com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO">
diff --git a/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml b/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml
index 0f54894..1bb3c81 100644
--- a/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml
+++ b/xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml
@@ -183,7 +183,7 @@
         ORDER BY handle_time DESC limit 1
     </select>
 
-    <select id="reassignTaskPageList" resultType="com.xiaopeng.api.vo.TaskVO">
+    <select id="reassignTaskPageList" resultType="com.xiaopeng.api.vo.XpTaskVO">
         SELECT
             t.id,
             t.task_code AS taskCode,
@@ -196,10 +196,11 @@
             t.handle_user_id AS handleUserId,
             t.assignee_user_id AS assigneeUserId,
             t.status,
+            t.excluded,
             t.reassignment_status AS reassignmentStatus,
             t.create_time AS createTime,
             v.plate_number AS plateNumber,
-            et.error_name AS accidentTypeName
+            et.error_name AS errorName
         FROM xp_task t
         LEFT JOIN xp_vehicle v ON t.vehicle_id = v.id AND v.is_deleted = 0
         LEFT JOIN xp_error_type et ON t.error_type_id = et.id
diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
index 25f7e2b..873c7fe 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
@@ -3,7 +3,7 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
-import com.xiaopeng.api.vo.TaskVO;
+import com.xiaopeng.api.vo.XpTaskVO;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.web.controller.BaseController;
 import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserService;
@@ -13,6 +13,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -366,11 +367,13 @@
      * 运维工单app推送
      */
     @PostMapping("/inner/websocket/push/task")
-    public R<?> pushTask(@RequestBody TaskVO vo) throws JsonProcessingException {
+    public R<?> pushTask(@RequestBody XpTaskVO vo) throws JsonProcessingException {
 
         String handleUserId = vo.getHandleUserId();
-        String msg = om.writeValueAsString(vo);
-        webSocketUserService.sendMessageToUser(handleUserId, msg);
+        Map<String, Object> msg = new HashMap();
+        msg.put("type", "task");
+        msg.put("data", vo);
+        webSocketUserService.sendMessageToUser(handleUserId, om.writeValueAsString(msg));
         return R.ok();
 
     }
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
index 2ebc55c..71ae40b 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -29,6 +29,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -47,6 +48,18 @@
     private final IXpFleetOperationsService xpFleetOperationsService;
 
     /**
+     * 根据车队名字模糊查询车队人员
+     *
+     */
+    @ApiOperation(value = "批量查询车队信息", tags = {"内部接口"})
+    @PostMapping("/logan/inner/fleet/idsByFleetName")
+    public R<List<Long>> idsByFleetName(@RequestParam String fleetName) {
+        List<Long> ids = xpFleetService.lambdaQuery().like(XpFleet::getFleetName, fleetName).list().stream().map(XpFleet::getId).collect(Collectors.toList());
+        List<Long> ret = xpFleetOperationsService.lambdaQuery().eq(XpFleetOperations::getFleetId, ids).list().stream().map(XpFleetOperations::getFleetId).collect(Collectors.toList());
+        return R.ok(ret);
+    }
+
+    /**
      * 根据ID列表批量查询车队信息(内部接口)
      *
      * @param ids 车队ID列表

--
Gitblit v1.7.1