[feat] 杂项优化,可改派人员排序,车队信息模糊查询等,活动通知方式
1 文件已重命名
1个文件已添加
22个文件已修改
284 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsUserMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpOperationsUserService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationUserClientFallbackFactory.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/WebSocketMessageFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpFleetClientFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/WebSocketMessageClient.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpFleetClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/OptionalUsersPageListQuery.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/XpTaskVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserWithRoleVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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));
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);
}
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);
}
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);
    }
}
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>
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());
            }
        };
    }
}
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("发送失败");
            }
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失败");
            }
        };
    }
}
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);
}
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);
}
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);
}
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;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/OptionalUsersPageListQuery.java
New file
@@ -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;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/XpTaskVO.java
File was renamed from xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/TaskVO.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;
}
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;
}
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 = {"定时任务"})
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);
}
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);
}
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);
            }
        }
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);
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">
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
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();
    }
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列表