xuhy
2026-02-25 684484103733f369e81b2c01d936185ee0fbb8fd
Merge remote-tracking branch 'origin/master'
14个文件已添加
41个文件已修改
1617 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTaskRuleRole.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpWorkOrder.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpWorkOrderLog.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpBanner.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/pom.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/TaskRuleDetailDto.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpWorkOrderMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/query/WorkOrderPageListQuery.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpWorkOrderLogService.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpWorkOrderService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpWorkOrderLogServiceImpl.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpWorkOrderServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpWorkOrderMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/constant/I18nKeyConstant.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpBannerManagementController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpFeedbackTypeManagementController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpNotificationController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpSystemSettingManagementController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/NotificationDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpBannerMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/BannerPageListQuery.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpBannerService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpBannerServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/i18n/messages.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/i18n/messages_en_US.properties 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/i18n/messages_zh_CN.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpBannerMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/constant/I18nKeyConstant.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderEvaluateManagementController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/mapper/XpOrderEvaluateMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/query/OrderEvaluateManagementPageListQuery.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/OrderEvaluateManagementPageListVO.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderEvaluateService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/resources/i18n/messages.properties 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/resources/i18n/messages_en_US.properties 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/resources/i18n/messages_zh_CN.properties 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderEvaluateMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java
@@ -35,6 +35,13 @@
            }
            @Override
            public R<List<XpVehicle>> listVehicle() {
                log.error("获取所有车辆信息失败,原因: {}", cause.getMessage());
                // 降级返回空列表
                return R.ok(new ArrayList<>());
            }
            @Override
            public R<XpVehicle> queryById(Long id) {
                log.error("查询车辆信息失败,原因: {}", cause.getMessage());
                return R.ok(null);
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java
@@ -33,6 +33,13 @@
    @PostMapping("/inner/vehicle/listByIds")
    R<List<XpVehicle>> listByIds(@RequestBody List<Long> ids);
    /**
     * 查询车辆列表
     *
     * @return 车辆列表
     */
    @PostMapping("/inner/vehicle/listVehicle")
    R<List<XpVehicle>> listVehicle();
    /**
     * 根据ID查询车辆信息
     *
     * @param id 车辆ID
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTaskRuleRole.java
@@ -34,7 +34,7 @@
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "任务类型 1车辆日常检测任务接收角色 2车辆保养周期任务接收角色 3充电策略任务接收角色 4车身清洁任务接收角色 5日常整备任务接收角色 6年检/保险策略任务接收角色 7事故任务上报角色 8事故任务处理角色")
    @ApiModelProperty(value = "任务类型 1车辆日常检测任务接收角色 2车辆每日收车 3车辆保养周期任务接收角色 4充电策略任务接收角色 5车身清洁任务接收角色 6日常整备任务接收角色 7年检/保险策略任务接收角色 8事故任务上报角色 9事故任务处理角色")
    private Integer ruleType;
    @ApiModelProperty(value = "角色id")
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpWorkOrder.java
@@ -1,10 +1,12 @@
package com.xiaopeng.api.model.maintenance;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.List;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
@@ -51,15 +53,24 @@
    @ApiModelProperty(value = "类型id")
    private Long feedbackTypeId;
    @ApiModelProperty(value = "类型id")
    private String feedbackTypeName;
    @ApiModelProperty(value = "优先级 1低 2中 3高")
    private Integer priority;
    @ApiModelProperty(value = "处理状态 1待处理 2处理中 3已处理")
    private Integer handleStatus;
    @ApiModelProperty(value = "如果状态为待处理或者处理中 是否可以处理 0否 1是")
    private Integer isHandle;
    @ApiModelProperty(value = "处理人id")
    private Long handleUserId;
    @ApiModelProperty(value = "处理人名称")
    @TableField(exist = false)
    private String handleUserName;
    @ApiModelProperty(value = "处理日志")
    @TableField(exist = false)
    private List<XpWorkOrderLog> workOrderLogs;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpWorkOrderLog.java
@@ -1,5 +1,6 @@
package com.xiaopeng.api.model.maintenance;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -42,9 +43,12 @@
    @ApiModelProperty(value = "所属处理人id")
    private Long handleUserId;
    @ApiModelProperty(value = "所属处理人名称")
    @TableField(exist = false)
    private String handleUserName;
    @ApiModelProperty(value = "操作类型 1移交 2办结")
    private String handleType;
    private Integer handleType;
    @ApiModelProperty(value = "处理时间")
    private LocalDateTime handleTime;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpBanner.java
@@ -63,5 +63,11 @@
    @ApiModelProperty(value = "广告状态 1上架 2下架")
    @TableField("banner_status")
    private Integer bannerStatus;
    @ApiModelProperty(value = "广告图片")
    @TableField("banner_pictures")
    private String bannerPictures;
    @ApiModelProperty(value = "广告标题")
    @TableField("banner_title")
    private String bannerTitle;
}
xp-robotaxi-maintenance-boot/pom.xml
@@ -15,6 +15,48 @@
    </description>
    <dependencies>
        <!-- easypoi -->
        <!-- Apache POI 核心依赖 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <!-- Apache POI OOXML 支持(用于 .xlsx 文件) -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <!-- Apache POI XMLBeans(可选,用于复杂 XML 处理) -->
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>5.1.1</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.4.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -1,19 +1,27 @@
package com.xiaopeng.maintenance.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.SysUser;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.model.maintenance.XpErrorType;
import com.xiaopeng.api.model.operation.XpWhitelist;
import com.xiaopeng.api.model.operation.XpWhitelistOperlog;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.account.LoginOperationUser;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.utils.ip.IpUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.maintenance.dto.HandleVehicleAccidentDto;
import com.xiaopeng.maintenance.dto.SaveErrorTaskDto;
import com.xiaopeng.maintenance.dto.SaveRoutineDetailDto;
import com.xiaopeng.maintenance.dto.SaveVehicleAccidentDto;
import com.xiaopeng.maintenance.exportExcel.XpTaskExportExcel;
import com.xiaopeng.maintenance.model.query.TaskManagementPageListQuery;
import com.xiaopeng.maintenance.model.query.TaskPageListQuery;
import com.xiaopeng.maintenance.model.query.XpTaskRecordPageQuery;
@@ -25,17 +33,24 @@
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
 * 运维APP 任务中心
 * 管理后台 任务工单
 * </p>
 *
 * @author mitao
@@ -61,11 +76,55 @@
    public R<List<XpErrorType>> errorTypeList() {
        return xpErrorTypeService.errorTypeList();
    }
    @ApiOperation(value = "任务中心列表", response = TaskPageListVO.class)
    @ApiOperation(value = "任务中心列表", response = TaskManagementPageListVO.class)
    @PostMapping("/pageList")
    public R<PageInfo<TaskManagementPageListVO>> pageListManagement(@RequestBody TaskManagementPageListQuery query) {
        PageInfo<TaskManagementPageListVO> pageList = xpTaskService.pageListManagement(query);
        return R.ok(pageList);
    }
    @ApiOperation(value = "任务工单导出")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody TaskManagementPageListQuery query) {
        List<TaskManagementPageListVO> exportList = xpTaskService.exportList(query);
        List<XpTaskExportExcel> taskExportExcels = new ArrayList<>();
        Integer num = 1;
        for (TaskManagementPageListVO task : exportList) {
            XpTaskExportExcel xpTaskExportExcel = new XpTaskExportExcel();
            xpTaskExportExcel.setPlateNumber(task.getPlateNumber());
            xpTaskExportExcel.setTaskCategory(task.getTaskCategory());
            xpTaskExportExcel.setTaskTypeName(task.getTaskTypeName());
            xpTaskExportExcel.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
            xpTaskExportExcel.setTaskDescription(task.getTaskDescription());
            xpTaskExportExcel.setHandleUserName(task.getHandleUserName());
            xpTaskExportExcel.setNumber(num);
            xpTaskExportExcel.setStatus(task.getStatus());
            LocalDateTime createTime = task.getCreateTime();
            // 将LocalDateTime转化为yyyy-MM-dd HH:mm:ss格式字符串
            xpTaskExportExcel.setCreateTime(createTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            taskExportExcels.add(xpTaskExportExcel);
            num++;
        }
        //1.获取excel模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpTaskExportExcel.class, taskExportExcels);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("任务工单列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 管理后台-车辆管理-运营车辆管理-删除任务/事故
@@ -98,90 +157,12 @@
    }
    @ApiOperation(value = "查询车辆不分页列表")
    @PostMapping(" /listVehicle")
    public R<List<VehicleListVO>> listVehicle() {
        LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
        XpOperationsUser xpOperationsUser = loginOperationUser.getXpOperationsUser();
        // 查询当前人员所属车队 查询车队关联车辆
        R<List<Long>> vehicleByUserId = xpFleetOperationsClient.getVehicleByUserId(xpOperationsUser.getId());
        List<Long> vehicleIds = vehicleByUserId.getData();
        if (vehicleIds != null && !vehicleIds.isEmpty()){
            // todo 查询车辆列表 获取经纬度
            List<XpVehicle> data = xpVehicleClient.listByIds(vehicleIds).getData();
            if (data!=null){
                List<VehicleListVO> vehicleListVOS = new ArrayList<>();
                for (XpVehicle xpVehicle : data) {
                    VehicleListVO vehicleListVO = new VehicleListVO();
                    vehicleListVO.setId(xpVehicle.getId());
//                    vehicleListVO.setVehicleLon(xpVehicle.getVehicleLon());
//                    vehicleListVO.setVehicleLat(xpVehicle.getVehicleLat());
                    vehicleListVO.setVehicleCode(xpVehicle.getVehicleCode());
                    vehicleListVO.setVehicleColor(xpVehicle.getVehicleColor());
                    vehicleListVO.setPlateNumber(xpVehicle.getPlateNumber());
                    vehicleListVO.setOperatingStatus(xpVehicle.getOperatingStatus());
                    vehicleListVOS.add(vehicleListVO);
                }
                return R.ok(vehicleListVOS);
            }
    public R<List<XpVehicle>> listVehicle() {
        List<XpVehicle> vehicles = xpVehicleClient.listVehicle().getData();
        if (vehicles == null){
            return R.ok(new ArrayList<>());
        }
        return R.ok(new ArrayList<>());
    }
    @ApiOperation(value = "上传车辆事故", tags = "运维APP-任务中心")
    @PostMapping(" /saveVehicleAccident")
    public R saveVehicleAccident(@RequestBody SaveVehicleAccidentDto dto) {
        LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
        XpOperationsUser xpOperationsUser = loginOperationUser.getXpOperationsUser();
        xpTaskService.saveVehicleAccident(dto, xpOperationsUser);
        return R.ok();
    }
    @ApiOperation(value = "车辆其他常规任务详情", tags = "运维APP-任务中心")
    @GetMapping(" /vehicleRoutineDetail")
    public R<TaskRoutineDetailVO> vehicleRoutineDetail(Long id) {
        return xpTaskService.vehicleRoutineDetail(id);
    }
    @ApiOperation(value = "上传车辆其他常规任务详情", tags = "运维APP-任务中心")
    @PostMapping(" /saveRoutineDetail")
    public R saveRoutineDetail(@RequestBody SaveRoutineDetailDto dto) {
        LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
        Long id = loginOperationUser.getId();
        return xpTaskService.saveRoutineDetail(dto, id);
    }
    @ApiOperation(value = "车辆常规充电任务详情", tags = "运维APP-任务中心")
    @GetMapping(" /chargingDetail")
    public R<TaskChargingDetailVO> chargingDetail(Long id) {
        return xpTaskService.chargingDetail(id);
    }
    @ApiOperation(value = "车辆常规维修任务详情", tags = "运维APP-任务中心")
    @GetMapping(" /repairDetail")
    public R<com.xiaopeng.maintenance.vo.TaskRepairDetailVO> repairDetail(Long id) {
        return xpTaskService.repairDetail(id);
    }
    @ApiOperation(value = "车辆常规整备任务详情", tags = "运维APP-任务中心")
    @GetMapping(" /preparationDetail")
    public R<com.xiaopeng.maintenance.vo.TaskPreparationDetailVO> preparationDetail(Long id) {
        return xpTaskService.preparationDetail(id);
    }
    @ApiOperation(value = "车辆常规检测任务详情", tags = "运维APP-任务中心")
    @GetMapping(" /detectionDetail")
    public R<com.xiaopeng.maintenance.vo.TaskDetectionDetailVO> detectionDetail(Long id) {
        return xpTaskService.detectionDetail(id);
    }
    @ApiOperation(value = "车辆常规洗车任务详情", tags = "运维APP-任务中心")
    @GetMapping(" /cleanDetail")
    public R<com.xiaopeng.maintenance.vo.TaskCleanDetailVO> cleanDetail(Long id) {
        return xpTaskService.cleanDetail(id);
    }
    @ApiOperation(value = "处理车辆事故", tags = "运维APP-任务中心")
    @PostMapping(" /handleVehicleAccident")
    @Transactional
    public R handleVehicleAccident(@RequestBody HandleVehicleAccidentDto dto) {
        LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
        XpOperationsUser xpOperationsUser = loginOperationUser.getXpOperationsUser();
        return xpTaskService.handleVehicleAccident(dto,xpOperationsUser);
        return R.ok(vehicles);
    }
    /**
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java
New file
@@ -0,0 +1,48 @@
package com.xiaopeng.maintenance.controller;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
import com.xiaopeng.maintenance.service.IXpTaskRuleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * <p>
 * 管理后台 任务规则设置
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@RestController
@Slf4j
@Api(tags = "管理后台-任务规则设置")
@RequestMapping("/api/v1/taskRule")
public class XpTaskRuleController {
    @Resource
    private IXpTaskRuleService xpTaskRuleService;
    @Resource
    private IXpTaskRuleRoleService xpTaskRuleRoleService;
    @ApiOperation(value = "任务规则详情")
    @GetMapping("/taskRuleDetail")
    @Transactional
    public R<TaskRuleDetailVO> taskRuleDetail() {
        return xpTaskRuleService.taskRuleDetail();
    }
    @ApiOperation(value = "保存或修改任务规则")
    @PostMapping("/saveOrUpdateTaskRule")
    public R saveOrUpdateTaskRule(@RequestBody TaskRuleDetailDto dto) {
        xpTaskRuleService.saveOrUpdateTaskRule(dto);
        return R.ok();
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java
New file
@@ -0,0 +1,85 @@
package com.xiaopeng.maintenance.controller;
import com.xiaopeng.api.model.maintenance.XpWorkOrder;
import com.xiaopeng.api.model.maintenance.XpWorkOrderLog;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
import com.xiaopeng.maintenance.model.query.TaskManagementPageListQuery;
import com.xiaopeng.maintenance.model.query.WorkOrderPageListQuery;
import com.xiaopeng.maintenance.model.vo.TaskManagementPageListVO;
import com.xiaopeng.maintenance.model.vo.TaskPageListVO;
import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
import com.xiaopeng.maintenance.service.IXpTaskRuleService;
import com.xiaopeng.maintenance.service.IXpWorkOrderLogService;
import com.xiaopeng.maintenance.service.IXpWorkOrderService;
import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * 管理后台 任务规则设置
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@RestController
@Slf4j
@Api(tags = "管理后台-工单管理")
@RequestMapping("/api/v1/workOrder")
public class XpWorkOrderController {
    @Resource
    private IXpWorkOrderService workOrderService;
    @Resource
    private IXpWorkOrderLogService workOrderLogService;
    @Resource
    private TokenService tokenService;
    @ApiOperation(value = "工单管理分页列表")
    @PostMapping("/pageList")
    public R<PageInfo<XpWorkOrder>> pageList(@RequestBody WorkOrderPageListQuery query) {
        query.setUserId(tokenService.getLoginUser().getSysUser().getId());
        PageInfo<XpWorkOrder> pageList = workOrderService.pageList(query);
        return R.ok(pageList);
    }
    @ApiOperation(value = "创建工单")
    @PostMapping("/saveWorkOrder")
    public R saveWordOrder(@RequestBody XpWorkOrder workOrder) {
        workOrderService.save(workOrder);
        return R.ok();
    }
    @ApiOperation(value = "编辑工单")
    @PostMapping("/updateWorkOrder")
    public R updateWordOrder(@RequestBody XpWorkOrder workOrder) {
        workOrderService.updateById(workOrder);
        return R.ok();
    }
    @ApiOperation(value = "处理工单")
    @PostMapping("/handleWorkOrder")
    public R handleWorkOrder(@RequestBody XpWorkOrderLog workOrderLog) {
        workOrderService.handleWorkOrder(workOrderLog);
        return R.ok();
    }
    @ApiOperation(value = "删除工单")
    @DeleteMapping("/deleteWorkOrder")
    public R deleteWordOrder(Long id) {
        workOrderService.removeById(id);
        return R.ok();
    }
    @ApiOperation(value = "工单详情")
    @GetMapping("/workOrderDetail")
    public R<XpWorkOrder> workOrderDetail(Long id) {
        XpWorkOrder detail =workOrderService.workOrderDetail(id);
        return R.ok(detail);
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/TaskRuleDetailDto.java
New file
@@ -0,0 +1,99 @@
package com.xiaopeng.maintenance.dto;
import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "管理后台-任务规则详情VO")
public class TaskRuleDetailDto implements Serializable {
    @ApiModelProperty(value = "自增id")
    private Long id;
    @ApiModelProperty(value = "车辆日常检测是否启用 0否1是")
    private Boolean vehicleInspection;
    @ApiModelProperty(value = "车辆日常监测 频次")
    private Integer vehicleInspectionFrequency;
    @ApiModelProperty(value = "车辆日常检测 任务下放时间")
    private LocalDateTime vehicleInspectionTime;
    @ApiModelProperty(value = "车辆日常监测 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer vehicleInspectionLevel;
    @ApiModelProperty(value = "车辆收车是否启用 0否1是")
    private Boolean vehicleCollection;
    @ApiModelProperty(value = "车辆收车每日时间")
    private LocalDateTime vehicleCollectionTime;
    @ApiModelProperty(value = "车辆保养周期是否启用")
    private Boolean maintenanceCycle;
    @ApiModelProperty(value = "车辆保养周期 保养周期X")
    private Integer maintenanceCycleTime;
    @ApiModelProperty(value = "车辆保养周期 保养周期X 1=天 2=月")
    private Integer maintenanceCycleTimeType;
    @ApiModelProperty(value = "车辆保养周期 任务下放时间")
    private LocalDateTime maintenanceCycleTaskTime;
    @ApiModelProperty(value = "车辆保养周期 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer maintenanceCycleLevel;
    @ApiModelProperty(value = "充电策略是否启用 0否1是")
    private Integer chargingStrategy;
    @ApiModelProperty(value = "充电策略 电量低于XX 不可接新单并发起充电任务")
    private BigDecimal chargingStrategyBatteryl;
    @ApiModelProperty(value = "充电策略 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer chargingStrategyLevel;
    @ApiModelProperty(value = "车身清洁保养周期X")
    private Integer vehicleCleanTime;
    @ApiModelProperty(value = "车身清洁保养周期X 1=天 2=月")
    private Integer vehicleCleanTimeType;
    @ApiModelProperty(value = "车身清洁任务紧急程度0=P0 1=P1 2=P2 3=P3")
    private Integer vehicleCleanLevel;
    @ApiModelProperty(value = "日常整备保养周期X")
    private Integer routineMaintenanceTime;
    @ApiModelProperty(value = "日常整备保养周期X 1=天 2=月")
    private Integer routineMaintenanceTimeType;
    @ApiModelProperty(value = "日常整备 紧急程度0=P0 1=P1 2=P2 3=P3")
    private Integer routineMaintenanceLevel;
    @ApiModelProperty(value = "年检/保险策略 是否启用 0否1是")
    private Boolean insurance;
    @ApiModelProperty(value = "年检/保险策略 保险到期X天 下发任务")
    private Integer insuranceExpires;
    @ApiModelProperty(value = "年检/保险策略 年检到期X天 下发任务")
    private Integer insuranceInspectionExpires;
    @ApiModelProperty(value = "网约车运营资质到期X天 下发任务")
    private Integer operationQualificationExpires;
    @ApiModelProperty(value = "年检/保险策略 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer insuranceLevel;
    @ApiModelProperty(value = "任务处理时限(分钟)")
    private Integer processingTimeLimit;
    @ApiModelProperty(value = "可以操作到达的配置范围,单位米")
    private Double canArriveRange;
    @ApiModelProperty(value = "任务类型关联角色列表")
    private List<XpTaskRuleRole> taskRuleRoleList;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java
New file
@@ -0,0 +1,50 @@
package com.xiaopeng.maintenance.exportExcel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * <p>
 * 白名单导出
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@Data
@ApiModel(value="任务工单导出")
public class XpTaskExportExcel {
    @Excel(name = "序号",width = 20)
    private Integer number;
    @Excel(name = "车牌号",width = 20)
    private String plateNumber;
    @ApiModelProperty(value = "任务类别1常规 2事故")
    @Excel(name = "任务类别",width = 20)
    private Integer taskCategory;
    @ApiModelProperty(value = "类型")
    @Excel(name = "类型",width = 40)
    private String taskTypeName;
    @ApiModelProperty(value = "任务紧急程度 0=P0 1=P1 2=P2 3=P3")
    @Excel(name = "紧急程度",width = 20,replace = {"P0_0","P1_1","P2_2","P3_3"})
    private Integer taskUrgencyLevel;
    @ApiModelProperty(value = "任务描述")
    @Excel(name = "任务描述",width = 40)
    private String taskDescription;
    @ApiModelProperty(value = "上报时间")
    @Excel(name = "上报时间",width = 40)
    private String createTime;
    @ApiModelProperty(value = "状态 0=待到达 1=待处理 2=已完成 3=已取消")
    @Excel(name = "状态",width = 20,replace = {"待到达_0","待处理_1","已完成_2","已取消_3"})
    private Integer status;
    @ApiModelProperty(value = "处理人名称")
    @Excel(name = "处理人",width = 20)
    private String handleUserName;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpTaskMapper.java
@@ -29,4 +29,6 @@
    List<TaskPageListVO> pageList(@Param("pageInfo")PageInfo<TaskPageListVO> pageInfo, @Param("query")TaskPageListQuery query);
    List<TaskManagementPageListVO> pageListManagement(@Param("pageInfo")PageInfo<TaskManagementPageListVO> pageInfo,@Param("query") TaskManagementPageListQuery query);
    List<TaskManagementPageListVO> exportList(@Param("query")TaskManagementPageListQuery query);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpWorkOrderMapper.java
@@ -2,6 +2,11 @@
import com.xiaopeng.api.model.maintenance.XpWorkOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.model.query.WorkOrderPageListQuery;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -13,4 +18,5 @@
 */
public interface XpWorkOrderMapper extends BaseMapper<XpWorkOrder> {
    List<XpWorkOrder> pageList(@Param("pageInfo") PageInfo<XpWorkOrder> pageInfo, @Param("query") WorkOrderPageListQuery query);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/query/WorkOrderPageListQuery.java
New file
@@ -0,0 +1,28 @@
package com.xiaopeng.maintenance.model.query;
import com.xiaopeng.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "管理后台工单管理列表查询query")
public class WorkOrderPageListQuery extends BasePage {
    @ApiModelProperty(value = "当前登陆人id 前端忽略")
    private Long userId;
    @ApiModelProperty(value = "反馈用户手机号")
    private String feedbackUserPhone;
    @ApiModelProperty(value = "问题来源 目前只有1电话客服")
    private Integer problemSource;
    @ApiModelProperty(value = "类型id")
    private Long feedbackTypeId;
    @ApiModelProperty(value = "优先级 1低 2中 3高")
    private Integer priority;
    @ApiModelProperty(value = "处理状态 1待处理 2处理中 3已处理")
    private Integer handleStatus;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java
@@ -2,6 +2,9 @@
import com.xiaopeng.api.model.maintenance.XpTaskRule;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
/**
 * <p>
@@ -13,4 +16,9 @@
 */
public interface IXpTaskRuleService extends IService<XpTaskRule> {
    R<TaskRuleDetailVO> taskRuleDetail();
    void saveOrUpdateTaskRule(TaskRuleDetailDto dto);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpWorkOrderLogService.java
@@ -13,4 +13,5 @@
 */
public interface IXpWorkOrderLogService extends IService<XpWorkOrderLog> {
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpWorkOrderService.java
@@ -2,6 +2,9 @@
import com.xiaopeng.api.model.maintenance.XpWorkOrder;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.maintenance.XpWorkOrderLog;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.model.query.WorkOrderPageListQuery;
/**
 * <p>
@@ -13,4 +16,9 @@
 */
public interface IXpWorkOrderService extends IService<XpWorkOrder> {
    PageInfo<XpWorkOrder> pageList(WorkOrderPageListQuery query);
    XpWorkOrder workOrderDetail(Long id);
    void handleWorkOrder(XpWorkOrderLog workOrderLog);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -16,6 +16,7 @@
import com.xiaopeng.maintenance.model.query.TaskPageListQuery;
import javax.validation.Valid;
import java.util.List;
/**
 * <p>
@@ -80,4 +81,6 @@
    void saveTask(SaveErrorTaskDto dto, Long reportUserId);
    R<TaskManagementDetailVO> taskDetail(Long id);
    List<TaskManagementPageListVO> exportList(TaskManagementPageListQuery query);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java
@@ -1,10 +1,20 @@
package com.xiaopeng.maintenance.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.maintenance.XpTaskRule;
import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.bean.BeanUtils;
import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
import com.xiaopeng.maintenance.service.IXpTaskRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -17,4 +27,40 @@
@Service
public class XpTaskRuleServiceImpl extends ServiceImpl<XpTaskRuleMapper, XpTaskRule> implements IXpTaskRuleService {
    @Autowired
    private XpTaskRuleRoleMapper taskRuleRoleMapper;
    @Override
    public R<TaskRuleDetailVO> taskRuleDetail() {
        XpTaskRule taskRule = this.getOne(null);
        if (taskRule == null){
            TaskRuleDetailVO taskRuleDetailVO = new TaskRuleDetailVO();
            return R.ok(taskRuleDetailVO);
        }
        TaskRuleDetailVO taskRuleDetailVO = new TaskRuleDetailVO();
        BeanUtils.copyProperties(taskRule, taskRuleDetailVO);
        List<XpTaskRuleRole> xpTaskRuleRoles = taskRuleRoleMapper.selectList(null);
        taskRuleDetailVO.setTaskRuleRoleList(xpTaskRuleRoles);
        return R.ok(taskRuleDetailVO);
    }
    @Override
    public void saveOrUpdateTaskRule(TaskRuleDetailDto dto) {
        if (dto.getId()!=null){
            XpTaskRule xpTaskRule = new XpTaskRule();
            BeanUtils.copyProperties(dto, xpTaskRule);
            this.updateById(xpTaskRule);
            taskRuleRoleMapper.delete(new LambdaQueryWrapper<XpTaskRuleRole>()
                    .isNotNull(XpTaskRuleRole::getId));
            for (XpTaskRuleRole xpTaskRuleRole : dto.getTaskRuleRoleList()) {
                taskRuleRoleMapper.insert(xpTaskRuleRole);
            }
        }else{
            XpTaskRule xpTaskRule = new XpTaskRule();
            BeanUtils.copyProperties(dto, xpTaskRule);
            this.save(xpTaskRule);
            for (XpTaskRuleRole xpTaskRuleRole : dto.getTaskRuleRoleList()) {
                taskRuleRoleMapper.insert(xpTaskRuleRole);
            }
        }
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -744,7 +744,11 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public List<TaskManagementPageListVO> exportList(TaskManagementPageListQuery query) {
        List<TaskManagementPageListVO> list = this.baseMapper.exportList(query);
        return list;
    }
    @Override
    public R assigneeTask(Long id, Long handlerUserId,Long assigneeUserId) {
        XpTask task = this.getById(id);
@@ -758,18 +762,33 @@
    @Override
    public void saveTask(SaveErrorTaskDto dto, Long reportUserId) {
        XpTask task = new XpTask();
        BeanUtils.copyProperties(dto, task);
        task.setReportTime(LocalDateTime.now());
        task.setStatus(0);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        task.setTaskCode(code);
        // 查询规则
        XpTaskRule taskRule = xpTaskRuleMapper.selectOne(null);
        if (taskRule != null){
            task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()));
        List<XpTask> saveTask = new ArrayList<>();
        for (Long vehicleId : dto.getVehicleIds()) {
            XpTask task = new XpTask();
            BeanUtils.copyProperties(dto, task);
            task.setReportTime(LocalDateTime.now());
            task.setStatus(0);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
            task.setTaskCode(code);
            // 查询规则
            XpTaskRule taskRule = xpTaskRuleMapper.selectOne(null);
            if (taskRule != null){
                task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()));
            }
            task.setTaskCategory(2);
            task.setTaskTypeId(dto.getTaskTypeId());
            task.setTaskUrgencyLevel(dto.getTaskUrgencyLevel());
            task.setTaskDescription(dto.getTaskDescription());
            task.setTaskImage(dto.getTaskImage());
            task.setVehicleId(vehicleId);
            task.setVehicleLocation(dto.getVehicleLocation());
            task.setVehicleLon(dto.getVehicleLon());
            task.setVehicleLat(dto.getVehicleLat());
            task.setReportUserId(reportUserId);
            task.setReportTime(LocalDateTime.now());
        }
        this.saveBatch(saveTask);
    }
@@ -807,42 +826,181 @@
                        taskManagementDetectionDetailVO.setVehicleVin(vehicle.getVehicleVin());
                        taskManagementDetectionDetailVO.setVehicleLocation(task.getVehicleLocation());
                        taskManagementDetectionDetailVO.setTaskCode(task.getTaskCode());
//                        taskManagementDetectionDetailVO.setNetworkDetection();
//                        taskManagementDetectionDetailVO.setVersionVerification();
//                        taskManagementDetectionDetailVO.setCommunicationSelfCheck();
//                        taskManagementDetectionDetailVO.setRemoteSelfCheck();
//                        taskManagementDetectionDetailVO.setCollisionPrevention();
//                        taskManagementDetectionDetailVO.setSensorSelfCheck();
//                        taskManagementDetectionDetailVO.setSensorCleaning();
//                        taskManagementDetectionDetailVO.setSensorCleaningPicture();
//                        taskManagementDetectionDetailVO.setInteractiveScreen();
//                        taskManagementDetectionDetailVO.setInteractiveScreenPicture();
//                        taskManagementDetectionDetailVO.setHelpButton();
//                        taskManagementDetectionDetailVO.setHelpButtonPicture();
//                        taskManagementDetectionDetailVO.setPaymentFunction();
//                        taskManagementDetectionDetailVO.setPaymentFunctionPicture();
//                        taskManagementDetectionDetailVO.setSystemCheck();
//                        taskManagementDetectionDetailVO.setSystemCheckPicture();
//                        taskManagementDetectionDetailVO.setOperationsUserId();
//                        taskManagementDetectionDetailVO.setOperationsUserName();
//                        taskManagementDetectionDetailVO.setCheckTime();
                        XpVehicleDetection vehicleDetection = vehicleDetectionMapper.selectOne(new LambdaQueryWrapper<XpVehicleDetection>()
                                .eq(XpVehicleDetection::getTaskId, id).last("limit 1"));
                        if (vehicleDetection != null){
                            taskManagementDetectionDetailVO.setNetworkDetection(vehicleDetection.getNetworkDetection());
                            taskManagementDetectionDetailVO.setVersionVerification(vehicleDetection.getVersionVerification());
                            taskManagementDetectionDetailVO.setCommunicationSelfCheck(vehicleDetection.getCommunicationSelfCheck());
                            taskManagementDetectionDetailVO.setRemoteSelfCheck(vehicleDetection.getRemoteSelfCheck());
                            taskManagementDetectionDetailVO.setCollisionPrevention(vehicleDetection.getCollisionPrevention());
                            taskManagementDetectionDetailVO.setSensorSelfCheck(vehicleDetection.getSensorSelfCheck());
                            taskManagementDetectionDetailVO.setSensorCleaning(vehicleDetection.getSensorCleaning());
                            taskManagementDetectionDetailVO.setSensorCleaningPicture(vehicleDetection.getSensorCleaningPicture());
                            taskManagementDetectionDetailVO.setInteractiveScreen(vehicleDetection.getInteractiveScreen());
                            taskManagementDetectionDetailVO.setInteractiveScreenPicture(vehicleDetection.getInteractiveScreenPicture());
                            taskManagementDetectionDetailVO.setHelpButton(vehicleDetection.getHelpButton());
                            taskManagementDetectionDetailVO.setHelpButtonPicture(vehicleDetection.getHelpButtonPicture());
                            taskManagementDetectionDetailVO.setPaymentFunction(vehicleDetection.getPaymentFunction());
                            taskManagementDetectionDetailVO.setPaymentFunctionPicture(vehicleDetection.getPaymentFunctionPicture());
                            taskManagementDetectionDetailVO.setSystemCheck(vehicleDetection.getSystemCheck());
                            taskManagementDetectionDetailVO.setSystemCheckPicture(vehicleDetection.getSystemCheckPicture());
                            taskManagementDetectionDetailVO.setCheckTime(vehicleDetection.getCheckTime());
                            taskManagementDetectionDetailVO.setOperationsUserId(vehicleDetection.getOperationsUserId());
                            if (vehicleDetection.getOperationsUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(vehicleDetection.getOperationsUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementDetectionDetailVO.setOperationsUserName(operationsUser.getNickName());
                                }
                            }
                        }
                        managementDetailVO.setDetectionDetailVO(taskManagementDetectionDetailVO);
                        break;
                    case "2":
                        // 充电
                        TaskManagementChargingDetailVO taskManagementChargingDetailVO = new TaskManagementChargingDetailVO();
                        taskManagementChargingDetailVO.setId(task.getId());
                        taskManagementChargingDetailVO.setVehicleId(vehicle.getId());
                        taskManagementChargingDetailVO.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
                        taskManagementChargingDetailVO.setPlateNumber(vehicle.getPlateNumber());
                        taskManagementChargingDetailVO.setVehicleColor(vehicle.getVehicleColor());
                        taskManagementChargingDetailVO.setVehicleCode(vehicle.getVehicleCode());
                        taskManagementChargingDetailVO.setVehicleVin(vehicle.getVehicleVin());
                        taskManagementChargingDetailVO.setVehicleLocation(task.getVehicleLocation());
                        taskManagementChargingDetailVO.setTaskCode(task.getTaskCode());
                        XpChargingRecord chargingRecord = chargingRecordMapper.selectOne(new LambdaQueryWrapper<XpChargingRecord>()
                                .eq(XpChargingRecord::getTaskId, id).last("limit 1"));
                        if (chargingRecord != null){
                            taskManagementChargingDetailVO.setStartRemainingBattery(chargingRecord.getStartRemainingBattery());
                            taskManagementChargingDetailVO.setStartChargingPicture(chargingRecord.getStartChargingPicture());
                            taskManagementChargingDetailVO.setStartTime(chargingRecord.getStartTime());
                            taskManagementChargingDetailVO.setEndRemainingBattery(chargingRecord.getEndRemainingBattery());
                            taskManagementChargingDetailVO.setEndChargingPicture(chargingRecord.getEndChargingPicture());
                            taskManagementChargingDetailVO.setEndTime(chargingRecord.getEndTime());
                            taskManagementChargingDetailVO.setStartOperationsUserId(chargingRecord.getStartOperationsUserId());
                            taskManagementChargingDetailVO.setEndOperationsUserId(chargingRecord.getEndOperationsUserId());
                            if (chargingRecord.getStartOperationsUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(chargingRecord.getStartOperationsUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementChargingDetailVO.setStartOperationsUserName(operationsUser.getNickName());
                                }
                            }
                            if (chargingRecord.getEndOperationsUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(chargingRecord.getEndOperationsUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementChargingDetailVO.setEndOperationsUserName(operationsUser.getNickName());
                                }
                            }
                        }
                        managementDetailVO.setChargingDetailVO(taskManagementChargingDetailVO);
                        break;
                    case "3":
                        // 整备
                        TaskManagementPreparationDetailVO taskManagementPreparationDetailVO = new TaskManagementPreparationDetailVO();
                        taskManagementPreparationDetailVO.setId(task.getId());
                        taskManagementPreparationDetailVO.setVehicleId(vehicle.getId());
                        taskManagementPreparationDetailVO.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
                        taskManagementPreparationDetailVO.setPlateNumber(vehicle.getPlateNumber());
                        taskManagementPreparationDetailVO.setVehicleColor(vehicle.getVehicleColor());
                        taskManagementPreparationDetailVO.setVehicleCode(vehicle.getVehicleCode());
                        taskManagementPreparationDetailVO.setVehicleVin(vehicle.getVehicleVin());
                        taskManagementPreparationDetailVO.setVehicleLocation(task.getVehicleLocation());
                        taskManagementPreparationDetailVO.setTaskCode(task.getTaskCode());
                        XpVehiclePreparation vehiclePreparation = vehiclePreparationMapper.selectOne(new LambdaQueryWrapper<XpVehiclePreparation>()
                                .eq(XpVehiclePreparation::getTaskId, id).last("limit 1"));
                        if (vehiclePreparation != null){
                            taskManagementPreparationDetailVO.setLeftFrontWheel(vehiclePreparation.getLeftFrontWheel());
                            taskManagementPreparationDetailVO.setRightFrontWheel(vehiclePreparation.getRightFrontWheel());
                            taskManagementPreparationDetailVO.setLeftRearWheel(vehiclePreparation.getLeftRearWheel());
                            taskManagementPreparationDetailVO.setRightRearWheel(vehiclePreparation.getRightRearWheel());
                            taskManagementPreparationDetailVO.setHeadLight(vehiclePreparation.getHeadLight());
                            taskManagementPreparationDetailVO.setTurnSignal(vehiclePreparation.getTurnSignal());
                            taskManagementPreparationDetailVO.setBrakeLight(vehiclePreparation.getBrakeLight());
                            taskManagementPreparationDetailVO.setFogLight(vehiclePreparation.getFogLight());
                            taskManagementPreparationDetailVO.setBodyEmblem(vehiclePreparation.getBodyEmblem());
                            taskManagementPreparationDetailVO.setCabinCleaning(vehiclePreparation.getCabinCleaning());
                            taskManagementPreparationDetailVO.setLostItems(vehiclePreparation.getLostItems());
                            taskManagementPreparationDetailVO.setRemarks(vehiclePreparation.getRemarks());
                            taskManagementPreparationDetailVO.setOperationsUserId(vehiclePreparation.getOperationsUserId());
                            taskManagementPreparationDetailVO.setOperationsTime(vehiclePreparation.getCreateTime());
                            if (vehiclePreparation.getOperationsUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(vehiclePreparation.getOperationsUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementPreparationDetailVO.setOperationsUserName(operationsUser.getNickName());
                                }
                            }
                        }
                        managementDetailVO.setPreparationDetailVO(taskManagementPreparationDetailVO);
                        break;
                    case "4":
                        // 洗车
                        TaskManagementCleanDetailVO taskManagementCleanDetailVO = new TaskManagementCleanDetailVO();
                        taskManagementCleanDetailVO.setId(task.getId());
                        taskManagementCleanDetailVO.setVehicleId(vehicle.getId());
                        taskManagementCleanDetailVO.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
                        taskManagementCleanDetailVO.setPlateNumber(vehicle.getPlateNumber());
                        taskManagementCleanDetailVO.setVehicleColor(vehicle.getVehicleColor());
                        taskManagementCleanDetailVO.setVehicleCode(vehicle.getVehicleCode());
                        taskManagementCleanDetailVO.setVehicleVin(vehicle.getVehicleVin());
                        taskManagementCleanDetailVO.setVehicleLocation(task.getVehicleLocation());
                        taskManagementCleanDetailVO.setTaskCode(task.getTaskCode());
                        XpVehicleClean vehicleClean = vehicleCleanMapper.selectOne(new LambdaQueryWrapper<XpVehicleClean>()
                                .eq(XpVehicleClean::getTaskId, id).last("limit 1"));
                        if (vehicleClean != null){
                            taskManagementCleanDetailVO.setTaskImage(vehicleClean.getTaskImage());
                            taskManagementCleanDetailVO.setOperationUserId(vehicleClean.getOperationsUserId());
                            if (vehicleClean.getOperationsUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(vehicleClean.getOperationsUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementCleanDetailVO.setOperationsUserName(operationsUser.getNickName());
                                }
                            }
                        }
                        managementDetailVO.setCleanDetailVO(taskManagementCleanDetailVO);
                        break;
                    case "5":
                        // 维修
                        TaskManagementRepairDetailVO taskManagementRepairDetailVO = new TaskManagementRepairDetailVO();
                        taskManagementRepairDetailVO.setId(task.getId());
                        taskManagementRepairDetailVO.setVehicleId(vehicle.getId());
                        taskManagementRepairDetailVO.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
                        taskManagementRepairDetailVO.setPlateNumber(vehicle.getPlateNumber());
                        taskManagementRepairDetailVO.setVehicleColor(vehicle.getVehicleColor());
                        taskManagementRepairDetailVO.setVehicleCode(vehicle.getVehicleCode());
                        taskManagementRepairDetailVO.setVehicleVin(vehicle.getVehicleVin());
                        taskManagementRepairDetailVO.setVehicleLocation(task.getVehicleLocation());
                        taskManagementRepairDetailVO.setTaskCode(task.getTaskCode());
                        XpVehicleRepair vehicleRepair = vehicleRepairMapper.selectOne(new LambdaQueryWrapper<XpVehicleRepair>()
                                .eq(XpVehicleRepair::getTaskId, id).last("limit 1"));
                        if (vehicleRepair != null){
                            taskManagementRepairDetailVO.setStartTime(vehicleRepair.getStartTime());
                            taskManagementRepairDetailVO.setEndTime(vehicleRepair.getEndTime());
                            taskManagementRepairDetailVO.setRepairReason(vehicleRepair.getRepairReason());
                            taskManagementRepairDetailVO.setStartRepairPicture(vehicleRepair.getStartRepairPicture());
                            taskManagementRepairDetailVO.setRepairMoney(vehicleRepair.getRepairMoney());
                            taskManagementRepairDetailVO.setRepairMoneyDetail(vehicleRepair.getRepairMoneyDetail());
                            taskManagementRepairDetailVO.setSendUserId(vehicleRepair.getSendUserId());
                            taskManagementRepairDetailVO.setSendTime(vehicleRepair.getSendTime());
                            taskManagementRepairDetailVO.setReturnUserId(vehicleRepair.getReturnUserId());
                            taskManagementRepairDetailVO.setReturnTime(vehicleRepair.getReturnTime());
                            if (vehicleRepair.getReturnUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(vehicleRepair.getReturnUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementRepairDetailVO.setReturnUserName(operationsUser.getNickName());
                                }
                            }
                            if (vehicleRepair.getSendUserId() != null){
                                XpOperationsUser operationsUser = xpOperationUserClient.queryById(vehicleRepair.getSendUserId()).getData();
                                if (operationsUser != null){
                                    taskManagementRepairDetailVO.setSendUserName(operationsUser.getNickName());
                                }
                            }
                        }
                        managementDetailVO.setRepairDetailVO(taskManagementRepairDetailVO);
                        break;
                    default:
                        // 保养、年检、保险、营运资质
@@ -876,6 +1034,8 @@
                        res.setVehicleCode(vehicle.getVehicleCode());
                        res.setVehicleLocation(task.getVehicleLocation());
                        res.setVehicleVin(vehicle.getVehicleVin());
                        managementDetailVO.setRoutineDetailVO(res);
                        break;
                }
@@ -937,4 +1097,6 @@
        return R.ok(managementDetailVO);
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpWorkOrderLogServiceImpl.java
@@ -18,4 +18,5 @@
@Service
public class XpWorkOrderLogServiceImpl extends ServiceImpl<XpWorkOrderLogMapper, XpWorkOrderLog> implements IXpWorkOrderLogService {
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpWorkOrderServiceImpl.java
@@ -1,10 +1,26 @@
package com.xiaopeng.maintenance.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.feignClient.account.SysUserClient;
import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient;
import com.xiaopeng.api.model.account.SysUser;
import com.xiaopeng.api.model.maintenance.XpWorkOrder;
import com.xiaopeng.api.model.maintenance.XpWorkOrderLog;
import com.xiaopeng.api.model.operation.XpFeedbackType;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.mapper.XpWorkOrderLogMapper;
import com.xiaopeng.maintenance.mapper.XpWorkOrderMapper;
import com.xiaopeng.maintenance.model.query.WorkOrderPageListQuery;
import com.xiaopeng.maintenance.model.vo.TaskManagementPageListVO;
import com.xiaopeng.maintenance.service.IXpWorkOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
@@ -17,4 +33,89 @@
@Service
public class XpWorkOrderServiceImpl extends ServiceImpl<XpWorkOrderMapper, XpWorkOrder> implements IXpWorkOrderService {
    @Autowired
    private SysUserClient sysUserClient;
    @Autowired
    private XpSystemSettingClient systemSettingClient;
    @Autowired
    private XpWorkOrderLogMapper workOrderLogMapper;
    @Override
    public PageInfo<XpWorkOrder> pageList(WorkOrderPageListQuery query) {
        PageInfo<XpWorkOrder> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpWorkOrder> list = this.baseMapper.pageList(pageInfo, query);
        if (list.isEmpty()) {
            return new PageInfo<>();
        }
        List<Long> handleUserIds = list.stream().map(XpWorkOrder::getHandleUserId).collect(Collectors.toList());
        List<SysUser> sysUsers = sysUserClient.listByIds(handleUserIds).getData();
        Map<Long, String> userMap = new HashMap<>();
        if (sysUsers != null) {
            userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getId, SysUser::getNickName));
        }
        for (XpWorkOrder xpWorkOrder : list) {
            if (xpWorkOrder.getHandleUserId() != null) {
                String handleUserName = userMap.get(xpWorkOrder.getHandleUserId());
                xpWorkOrder.setHandleUserName(handleUserName);
                if (xpWorkOrder.getHandleUserId().equals(query.getUserId())){
                    xpWorkOrder.setIsHandle(1);
                }else{
                    xpWorkOrder.setIsHandle(0);
                }
            }
            XpFeedbackType feedbackType = systemSettingClient.getFeedbackTypeById(xpWorkOrder.getFeedbackTypeId()).getData();
            if (feedbackType != null) {
                xpWorkOrder.setFeedbackTypeName(feedbackType.getFeedbackType());
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public XpWorkOrder workOrderDetail(Long id) {
        XpWorkOrder workOrder = this.getById(id);
        List<XpWorkOrderLog> workOrderLogs = workOrderLogMapper.selectList(new LambdaQueryWrapper<XpWorkOrderLog>()
                .eq(XpWorkOrderLog::getWorkOrderId, id));
        XpFeedbackType feedbackType = systemSettingClient.getFeedbackTypeById(workOrder.getFeedbackTypeId()).getData();
        if (feedbackType != null) {
            workOrder.setFeedbackTypeName(feedbackType.getFeedbackType());
        }
        if (workOrderLogs.isEmpty()) {
            return workOrder;
        }
        List<Long> handleUserIds = workOrderLogs.stream().map(XpWorkOrderLog::getHandleUserId).collect(Collectors.toList());
        List<SysUser> sysUsers = sysUserClient.listByIds(handleUserIds).getData();
        Map<Long, String> userMap = new HashMap<>();
        if (sysUsers != null) {
            userMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getId, SysUser::getNickName));
        }
        for (XpWorkOrderLog workOrderLog : workOrderLogs) {
            if (workOrderLog.getHandleUserId() != null) {
                String handleUserName = userMap.get(workOrderLog.getHandleUserId());
                workOrderLog.setHandleUserName(handleUserName);
            }
        }
        workOrder.setWorkOrderLogs(workOrderLogs);
        return workOrder;
    }
    @Override
    public void handleWorkOrder(XpWorkOrderLog workOrderLog) {
        XpWorkOrder workOrder = this.getById(workOrderLog.getWorkOrderId());
        if (workOrderLog.getHandleType() == 2) {
            // 办结 工单状态流转为已完成
            workOrder.setHandleStatus(3);
            workOrder.setHandleUserId(workOrderLog.getHandleUserId());
            this.updateById(workOrder);
        }else{
            // 移交
            workOrder.setHandleStatus(2);
            workOrder.setHandleUserId(workOrderLog.getHandleUserId());
            this.updateById(workOrder);
        }
        workOrderLogMapper.insert(workOrderLog);
    }
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java
New file
@@ -0,0 +1,101 @@
package com.xiaopeng.maintenance.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "管理后台-任务规则详情VO")
public class TaskRuleDetailVO implements Serializable {
    @ApiModelProperty(value = "自增id")
    private Long id;
    @ApiModelProperty(value = "车辆日常检测是否启用 0否1是")
    private Boolean vehicleInspection;
    @ApiModelProperty(value = "车辆日常监测 频次")
    private Integer vehicleInspectionFrequency;
    @ApiModelProperty(value = "车辆日常检测 任务下放时间")
    private LocalDateTime vehicleInspectionTime;
    @ApiModelProperty(value = "车辆日常监测 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer vehicleInspectionLevel;
    @ApiModelProperty(value = "车辆收车是否启用 0否1是")
    private Boolean vehicleCollection;
    @ApiModelProperty(value = "车辆收车每日时间")
    private LocalDateTime vehicleCollectionTime;
    @ApiModelProperty(value = "车辆保养周期是否启用")
    private Boolean maintenanceCycle;
    @ApiModelProperty(value = "车辆保养周期 保养周期X")
    private Integer maintenanceCycleTime;
    @ApiModelProperty(value = "车辆保养周期 保养周期X 1=天 2=月")
    private Integer maintenanceCycleTimeType;
    @ApiModelProperty(value = "车辆保养周期 任务下放时间")
    private LocalDateTime maintenanceCycleTaskTime;
    @ApiModelProperty(value = "车辆保养周期 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer maintenanceCycleLevel;
    @ApiModelProperty(value = "充电策略是否启用 0否1是")
    private Integer chargingStrategy;
    @ApiModelProperty(value = "充电策略 电量低于XX 不可接新单并发起充电任务")
    private BigDecimal chargingStrategyBatteryl;
    @ApiModelProperty(value = "充电策略 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer chargingStrategyLevel;
    @ApiModelProperty(value = "车身清洁保养周期X")
    private Integer vehicleCleanTime;
    @ApiModelProperty(value = "车身清洁保养周期X 1=天 2=月")
    private Integer vehicleCleanTimeType;
    @ApiModelProperty(value = "车身清洁任务紧急程度0=P0 1=P1 2=P2 3=P3")
    private Integer vehicleCleanLevel;
    @ApiModelProperty(value = "日常整备保养周期X")
    private Integer routineMaintenanceTime;
    @ApiModelProperty(value = "日常整备保养周期X 1=天 2=月")
    private Integer routineMaintenanceTimeType;
    @ApiModelProperty(value = "日常整备 紧急程度0=P0 1=P1 2=P2 3=P3")
    private Integer routineMaintenanceLevel;
    @ApiModelProperty(value = "年检/保险策略 是否启用 0否1是")
    private Boolean insurance;
    @ApiModelProperty(value = "年检/保险策略 保险到期X天 下发任务")
    private Integer insuranceExpires;
    @ApiModelProperty(value = "年检/保险策略 年检到期X天 下发任务")
    private Integer insuranceInspectionExpires;
    @ApiModelProperty(value = "网约车运营资质到期X天 下发任务")
    private Integer operationQualificationExpires;
    @ApiModelProperty(value = "年检/保险策略 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer insuranceLevel;
    @ApiModelProperty(value = "任务处理时限(分钟)")
    private Integer processingTimeLimit;
    @ApiModelProperty(value = "可以操作到达的配置范围,单位米")
    private Double canArriveRange;
    @ApiModelProperty(value = "任务类型关联角色列表")
    private List<XpTaskRuleRole> taskRuleRoleList;
}
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpTaskMapper.xml
@@ -130,5 +130,37 @@
        </if>
        order by t.status,t.task_urgency_level asc, t.create_time desc
    </select>
    <select id="exportList" resultType="com.xiaopeng.maintenance.model.vo.TaskManagementPageListVO">
        select t.id,t.task_category as taskCategory,t.task_type_id as taskTypeId,t.task_urgency_level as
        taskUrgencyLevel,t.task_description as taskDescription,t.handle_user_id as handleUserId,t.create_time as
        createTime,t.status as status,
        v.plate_number as plateNumber
        from xp_task t
        left join xp_vehicle v on t.vehicle_id = v.id
        where t.is_deleted = 0
        <if test="query.taskCategory != null">
            and t.task_category = #{query.taskCategory}
        </if>
        <if test="query.taskUrgencyLevel != null">
            and t.task_urgency_level = #{query.taskUrgencyLevel}
        </if>
        <if test="query.status != null">
            and t.status = #{query.status}
        </if>
        <if test="query.plateNumber != null and query.plateNumber != ''">
            and v.plate_number like concat('%',#{query.plateNumber},'%')
        </if>
        <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
            and t.create_time between #{query.startTime} and #{query.endTime}
        </if>
        <if test="query.taskGeneralId != null">
            and t.task_type_id = #{query.taskGeneralId}
        </if>
        <if test="query.taskErrorId != null">
            and find_in_set(#{query.taskErrorId}, t.task_type_id)
            and t.task_category = 2
        </if>
        order by t.status,t.task_urgency_level asc, t.create_time desc
    </select>
</mapper>
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpWorkOrderMapper.xml
@@ -2,4 +2,36 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaopeng.maintenance.mapper.XpWorkOrderMapper">
    <select id="pageList" resultType="com.xiaopeng.api.model.maintenance.XpWorkOrder">
        select wo.id as id,
        wo.problem as problem,
        wo.problem_description as problemDescription,
        wo.problem_image as problemImage,
        wo.feedback_user_phone as feedbackUserPhone,
        wo.problem_source as problemSource,
        wo.feedback_type_id as feedbackTypeId,
        wo.priority as priority,
        wo.handle_status as handleStatus,
        wo.handle_user_id as handleUserId,
        wo.create_time as createTime
        from xp_work_order wo
        where 1=1 and wo.is_deleted = 0
        <if test="query.feedbackUserPhone != null and query.feedbackUserPhone != ''">
            and wo.feedbackUserPhone like concat('%',#{query.feedbackUserPhone},'%')
        </if>
        <if test="query.problemSource != null">
            and wo.problem_source = #{query.problemSource}
        </if>
        <if test="query.feedbackTypeId != null">
            and wo.feedback_type_id = #{query.feedbackTypeId}
        </if>
        <if test="query.priority != null">
            and wo.priority = #{query.priority}
        </if>
        <if test="query.handleStatus != null">
            and wo.handle_status = #{query.handleStatus}
        </if>
        order by wo.handle_status asc,wo.priority ,wo.create_time desc
    </select>
</mapper>
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
@@ -7,16 +7,12 @@
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.common.core.utils.HttpUtils;
import com.xiaopeng.map.mangodb.service.XpGeoFencingPolygonService;
import com.xiaopeng.map.utils.mangoUtils.MongoGeoFenceUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 高德地图的地理编码工具类
@@ -27,9 +23,7 @@
    private String key = "66ae577f63898dae3016d599fda57221";
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private XpGeoFencingPolygonService xpGeoFencingPolygonService;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/constant/I18nKeyConstant.java
@@ -53,4 +53,7 @@
    // 路径不存在
    String PATH_NOT_FOUND = "path.not.found";
    // 存在进行中的订单
    String HAS_UNPAID_ORDER = "has.unpaid.order";
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpBannerManagementController.java
New file
@@ -0,0 +1,44 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpBanner;
import com.xiaopeng.api.model.operation.XpWhitelist;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.query.BannerPageListQuery;
import com.xiaopeng.operation.query.WhitelistPageListQuery;
import com.xiaopeng.operation.service.XpBannerService;
import com.xiaopeng.operation.vo.XpBannerListVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/api/v1/banner")
@Api(tags = "管理后台-banner模块")
public class XpBannerManagementController extends BaseController {
    // banner实现类
    private final XpBannerService xpBannerService;
    public XpBannerManagementController(XpBannerService xpBannerService) {
        this.xpBannerService = xpBannerService;
    }
    @ApiOperation(value = "banner分页列表")
    @PostMapping("/pageList")
    public R<PageInfo<XpBanner>> pageList(@RequestBody BannerPageListQuery query) {
        PageInfo<XpBanner> pageList = xpBannerService.pageList(query);
        return R.ok(pageList);
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpFeedbackTypeManagementController.java
New file
@@ -0,0 +1,56 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpFeedbackType;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.operation.service.IXpFeedbackTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * 意见反馈类型表 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@Slf4j
@RestController
@RequestMapping("/api/v1/feedbackType")
@Api(tags = "管理后台-意见反馈类型")
public class XpFeedbackTypeManagementController {
    private final IXpFeedbackTypeService xpFeedbackTypeService;
    public XpFeedbackTypeManagementController(IXpFeedbackTypeService xpFeedbackTypeService) {
        this.xpFeedbackTypeService = xpFeedbackTypeService;
    }
    @GetMapping("/getList")
    @ApiOperation(value = "获取意见反馈类型列表")
    public R<List<XpFeedbackType>> getList() {
        List<XpFeedbackType> list = xpFeedbackTypeService.list();
        return R.ok(list);
    }
    @ApiOperation(value = "新增意见反馈类型")
    @PostMapping(value = "/saveFeedbackType")
    public R<Boolean> add(@RequestBody XpFeedbackType xpFeedbackType) {
        return R.ok(xpFeedbackTypeService.save(xpFeedbackType));
    }
    @ApiOperation(value = "编辑意见反馈类型")
    @PostMapping(value = "/updateFeedbackType")
    public R<Boolean> updateFeedbackType(@RequestBody XpFeedbackType xpFeedbackType) {
        return R.ok(xpFeedbackTypeService.updateById(xpFeedbackType));
    }
    @ApiOperation(value = "删除意见反馈类型")
    @DeleteMapping(value = "/deleteFeedbackType")
    public R<Boolean> deleteFeedbackType(Long id) {
        return R.ok(xpFeedbackTypeService.removeById(id));
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpNotificationController.java
@@ -1,9 +1,23 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpFeedbackType;
import com.xiaopeng.api.model.operation.XpNotification;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.operation.dto.NotificationDto;
import com.xiaopeng.operation.service.IXpNotificationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * <p>
@@ -13,8 +27,23 @@
 * @author mitao
 * @since 2026-02-03
 */
@Controller
@RequestMapping("/xp-notification")
@RestController
@RequestMapping("/api/v1/notification")
@Api(tags = "管理后台-消息通知设置")
public class XpNotificationController {
    @Autowired
    private IXpNotificationService xpNotificationService;
    @GetMapping("/list")
    @ApiOperation(value = "获取消息通知设置列表")
    public R<List<XpNotification>> list() {
        List<XpNotification> list = xpNotificationService.list();
        return R.ok(list);
    }
    @PostMapping("/update")
    @ApiOperation(value = "修改设置")
    public R<List<XpNotification>> update(@RequestBody NotificationDto notificationDto) {
        List<XpNotification> notifications = notificationDto.getNotifications();
        xpNotificationService.updateBatchById(notifications);
        return R.ok();
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpSystemSettingManagementController.java
New file
@@ -0,0 +1,52 @@
package com.xiaopeng.operation.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaopeng.api.model.operation.XpSystemSetting;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
import com.xiaopeng.common.core.web.domain.AjaxResult;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.operation.service.XpSystemSettingService;
import com.xiaopeng.operation.vo.CustomerServicePhoneVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/api/v1/systemSetting")
@Api(tags = "管理后台-系统设置模块")
public class XpSystemSettingManagementController extends BaseController {
    // 系统设置实现类
    private final XpSystemSettingService xpSystemSettingService;
    private final RedisService redisService;
    public XpSystemSettingManagementController(XpSystemSettingService xpSystemSettingService, RedisService redisService) {
        this.xpSystemSettingService = xpSystemSettingService;
        this.redisService = redisService;
    }
    @GetMapping("/getSetting")
    @ApiOperation(value = "获取系统设置")
    public R<XpSystemSetting> getCustomerServicePhone() {
        XpSystemSetting systemSetting = xpSystemSettingService.getOne(new LambdaQueryWrapper<XpSystemSetting>()
                .isNotNull(XpSystemSetting::getId));
        return R.ok(systemSetting);
    }
    @GetMapping("/saveOrUpdateSetting")
    @ApiOperation(value = "保存或修改系统设置")
    public R saveOrUpdateSetting(@RequestBody XpSystemSetting xpSystemSetting) {
        xpSystemSettingService.saveOrUpdate(xpSystemSetting);
        return R.ok();
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/NotificationDto.java
New file
@@ -0,0 +1,19 @@
package com.xiaopeng.operation.dto;
import com.xiaopeng.api.model.operation.XpNotification;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ApiModel(value = "消息通知设置DTO")
public class NotificationDto {
    @ApiModelProperty(value = "消息通知列表")
    private List<XpNotification> notifications;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpBannerMapper.java
@@ -3,6 +3,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.operation.XpBanner;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.query.BannerPageListQuery;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -14,4 +19,5 @@
 */
public interface XpBannerMapper extends BaseMapper<XpBanner> {
    List<XpBanner> pageList(@Param("pageInfo") PageInfo<XpBanner> pageInfo, @Param("query") BannerPageListQuery query);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/BannerPageListQuery.java
New file
@@ -0,0 +1,18 @@
package com.xiaopeng.operation.query;
import com.baomidou.mybatisplus.annotation.TableField;
import com.xiaopeng.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "banner管理列表查询query")
public class BannerPageListQuery extends BasePage {
    @ApiModelProperty(value = "广告标题")
    private String bannerTitle;
    @ApiModelProperty(value = "状态(0=未开始,1=进行中,2=已结束)")
    private Integer status;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpBannerService.java
@@ -3,6 +3,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.operation.XpBanner;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.query.BannerPageListQuery;
import com.xiaopeng.operation.query.WhitelistPageListQuery;
import com.xiaopeng.operation.vo.XpBannerListVo;
import java.util.List;
@@ -24,4 +27,6 @@
     */
    List<XpBannerListVo> getXpBannerList();
    PageInfo<XpBanner> pageList(BannerPageListQuery query);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpBannerServiceImpl.java
@@ -3,8 +3,12 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.operation.XpWhitelist;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.mapper.XpBannerMapper;
import com.xiaopeng.api.model.operation.XpBanner;
import com.xiaopeng.operation.query.BannerPageListQuery;
import com.xiaopeng.operation.query.WhitelistPageListQuery;
import com.xiaopeng.operation.service.XpBannerService;
import com.xiaopeng.operation.vo.XpBannerListVo;
import org.springframework.stereotype.Service;
@@ -46,4 +50,12 @@
        return Collections.emptyList();
    }
    @Override
    public PageInfo<XpBanner> pageList(BannerPageListQuery query) {
        PageInfo<XpBanner> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
        List<XpBanner> list = this.baseMapper.pageList(pageInfo,query);
        pageInfo.setRecords(list);
        return pageInfo;
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -415,7 +415,6 @@
    @Override
    public Long saveOrder(XpOrderDto dto, String uid) {
        // 是否在运营区域时间内
        XpElectronicFenceArea xpElectronicFenceArea = xpElectronicFenceAreaMapper.selectById(dto.getXpElectronicFenceAreaId());
        XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(xpElectronicFenceArea.getElectronicId());
@@ -430,7 +429,7 @@
        // 判断是否有进行的订单
        R<Long> r = xpOrderClient.hasUnPaodOrder(uid);
        if (r.getData() > 0) {
            throw new RuntimeException("有正在进行的订单");
            throw new ServiceException("有正在进行的订单", I18nKeyConstant.HAS_UNPAID_ORDER);
        }
        // 获取起点经纬度
xp-robotaxi-operation-boot/src/main/resources/i18n/messages.properties
@@ -18,4 +18,5 @@
pricing.json.invalid=价格配置JSON格式不正确
pricing.rule.empty=价格规则不能为空
no.current.point=?????????
path.not.found=?????
path.not.found=路径不存在
has.unpaid.order=有正在进行的订单
xp-robotaxi-operation-boot/src/main/resources/i18n/messages_en_US.properties
@@ -19,3 +19,4 @@
pricing.rule.empty=Price rule cannot be empty
no.current.point=The current location is not open for service
path.not.found=Path does not exist
has.unpaid.order=There are ongoing orders
xp-robotaxi-operation-boot/src/main/resources/i18n/messages_zh_CN.properties
@@ -18,4 +18,5 @@
pricing.json.invalid=价格配置JSON格式不正确
pricing.rule.empty=价格规则不能为空
no.current.point=?????????
path.not.found=?????
path.not.found=路径不存在
has.unpaid.order=有正在进行的订单
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpBannerMapper.xml
@@ -3,4 +3,15 @@
<mapper namespace="com.xiaopeng.operation.mapper.XpBannerMapper">
    <select id="pageList" resultType="com.xiaopeng.api.model.operation.XpBanner">
        select * from xp_banner
        where is_deleted =0
        <if test="query.status != null">
            and status = #{query.status}
        </if>
        <if test="query.bannerTitle != null">
            and banner_title like concat('%',#{query.bannerTitle},'%')
        </if>
        order by id desc
    </select>
</mapper>
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/constant/I18nKeyConstant.java
@@ -19,5 +19,7 @@
    String ORDER_REASSIGN_NEW_VEHICLE_NOT_IN_ACCEPT_MODE = "order.reassign.new.vehicle.not.in.accept.mode";
    String ORDER_REASSIGN_NEW_VEHICLE_NOT_START_ACCEPT = "order.reassign.new.vehicle.not.start.accept";
    String ORDER_REASSIGN_NEW_VEHICLE_NOT_FREE = "order.reassign.new.vehicle.not.free";
    String ORDER_STATUS_ERROR = "order.status.error";
    String VEHICLE_NOT_EXISTS = "vehicle.not.exists";
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderEvaluateManagementController.java
New file
@@ -0,0 +1,50 @@
package com.xiaopeng.order.controller;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.model.query.OrderEvaluateManagementPageListQuery;
import com.xiaopeng.order.model.query.OrderEvaluatePageQuery;
import com.xiaopeng.order.model.vo.OrderEvaluateManagementPageListVO;
import com.xiaopeng.order.model.vo.OrderEvaluatePageVO;
import com.xiaopeng.order.service.IXpOrderEvaluateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apiguardian.api.API;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * <p>
 * 意见反馈 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@RestController
@RequestMapping("/api/v1/orderEvaluateManagement")
@Api(tags = "管理后台-意见反馈记录")
public class XpOrderEvaluateManagementController {
    @Resource
    private IXpOrderEvaluateService xpOrderEvaluateService;
    /**
     * 意见反馈
     *
     * @param query 查询条件
     * @return 分页结果
     */
    @ApiOperation(value = "意见反馈分页列表")
    @PostMapping("/pageList")
    public R<PageInfo<OrderEvaluateManagementPageListVO>> managementPageList(@RequestBody OrderEvaluateManagementPageListQuery query) {
        PageInfo<OrderEvaluateManagementPageListVO> pageInfo = xpOrderEvaluateService.managementPageList(query);
        return R.ok(pageInfo);
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/mapper/XpOrderEvaluateMapper.java
@@ -2,6 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.order.XpOrderEvaluate;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.model.query.OrderEvaluateManagementPageListQuery;
import com.xiaopeng.order.model.vo.OrderEvaluateManagementPageListVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -13,4 +19,5 @@
 */
public interface XpOrderEvaluateMapper extends BaseMapper<XpOrderEvaluate> {
    List<OrderEvaluateManagementPageListVO> managementPageList(@Param("pageInfo") PageInfo<OrderEvaluateManagementPageListVO> pageInfo,@Param("query") OrderEvaluateManagementPageListQuery query);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/query/OrderEvaluateManagementPageListQuery.java
New file
@@ -0,0 +1,27 @@
package com.xiaopeng.order.model.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDate;
/**
 * <p>
 * 管理后台意见反馈分页查询请求
 * </p>
 *
 * @author mitao
 * @since 2026-02-05
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "管理后台意见反馈分页查询请求", description = "管理后台意见反馈分页查询请求")
public class OrderEvaluateManagementPageListQuery extends BasePage {
    @ApiModelProperty(value = "内容")
    private String feedbackContent;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/OrderEvaluateManagementPageListVO.java
New file
@@ -0,0 +1,43 @@
package com.xiaopeng.order.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * <p>
 * 订单评价分页列表VO
 * </p>
 *
 * @author mitao
 * @since 2026-02-05
 */
@Data
@ApiModel(value = "管理后台订单评价分页列表VO")
public class OrderEvaluateManagementPageListVO {
    @ApiModelProperty(value = "用户id")
    private Long userId;
    @ApiModelProperty(value = "用户昵称")
    private String nickName;
    @ApiModelProperty(value = "用户头像")
    private String headImage;
    @ApiModelProperty(value = "用户手机号")
    private String phoneNumber;
    @ApiModelProperty(value = "反馈类型名称")
    private String feedbackTypeName;
    @ApiModelProperty(value = "反馈类型id")
    private Long FeedbackTypeId;
    @ApiModelProperty(value = "反馈图片")
    private String feedbackPictures;
    @ApiModelProperty(value = "反馈内容")
    private String feedbackContent;
    @ApiModelProperty(value = "反馈时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderEvaluateService.java
@@ -3,7 +3,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.order.XpOrderEvaluate;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.model.query.OrderEvaluateManagementPageListQuery;
import com.xiaopeng.order.model.query.OrderEvaluatePageQuery;
import com.xiaopeng.order.model.vo.OrderEvaluateManagementPageListVO;
import com.xiaopeng.order.model.vo.OrderEvaluatePageVO;
/**
@@ -23,4 +25,6 @@
     * @return 分页结果
     */
    PageInfo<OrderEvaluatePageVO> pageList(OrderEvaluatePageQuery query);
    PageInfo<OrderEvaluateManagementPageListVO> managementPageList(OrderEvaluateManagementPageListQuery query);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java
@@ -1,18 +1,28 @@
package com.xiaopeng.order.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.account.UserResourcesDto;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.feignClient.account.XpAppUserClient;
import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.operation.XpInvitationCode;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderEvaluate;
import com.xiaopeng.api.vo.account.GetUserListByUidsVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.mapper.XpOrderEvaluateMapper;
import com.xiaopeng.order.model.query.OrderEvaluateManagementPageListQuery;
import com.xiaopeng.order.model.query.OrderEvaluatePageQuery;
import com.xiaopeng.order.model.vo.OrderEvaluateManagementPageListVO;
import com.xiaopeng.order.model.vo.OrderEvaluatePageVO;
import com.xiaopeng.order.service.IXpOrderEvaluateService;
import com.xiaopeng.order.service.IXpOrderService;
@@ -22,6 +32,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
@@ -44,6 +55,8 @@
    private final XpAppUserClient xpAppUserClient;
    private final XpVehicleClient xpVehicleClient;
    private final IXpOrderService xpOrderService;
    private final UserResourcesClient userResourcesClient;
    private final XpSystemSettingClient systemSettingClient;
    @Override
    public PageInfo<OrderEvaluatePageVO> pageList(OrderEvaluatePageQuery query) {
@@ -113,6 +126,38 @@
        return resultPage;
    }
    @Override
    public PageInfo<OrderEvaluateManagementPageListVO> managementPageList(OrderEvaluateManagementPageListQuery query) {
        PageInfo<OrderEvaluateManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
        List<OrderEvaluateManagementPageListVO> list = this.baseMapper.managementPageList(pageInfo,query);
        if (list.isEmpty()){
            return new PageInfo<>();
        }
        List<Long> userIds = list.stream().map(OrderEvaluateManagementPageListVO::getUserId).collect(Collectors.toList());
        GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo();
        getUserListByUidsVo.setUids(userIds);
        getUserListByUidsVo.setGetPreCarOwner(false);
        UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo);
        for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) {
            Object data = userListByUids.getData();
            // 转化为jsonArray
            JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data));
            for (Object o : jsonArray) {
                // 转化为JsonObject
                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o));
                String mobile = jsonObject.getString("mobile");
                String nickName = jsonObject.getString("nickName");
                String headImage = jsonObject.getString("headImage");
                orderEvaluateManagementPageListVO.setPhoneNumber(mobile);
                orderEvaluateManagementPageListVO.setNickName(nickName);
                orderEvaluateManagementPageListVO.setHeadImage(headImage);
            }
            systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId());
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
    /**
     * 批量获取用户信息
     */
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -715,13 +715,13 @@
    public void cancelOrder(Long orderId, String uid) {
        XpOrder order = this.getById(orderId);
        if (order == null) {
            throw new RuntimeException("订单不存在");
            throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS);
        }
        if (!order.getAppUserId().toString().equals(uid)) {
            throw new RuntimeException("无权限取消该订单");
            throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS);
        }
        if (order.getStatus() > 5 || order.getStatus() < 1) {
            throw new RuntimeException("订单状态错误");
            throw new ServiceException("订单状态错误",I18nKeyConstant.ORDER_STATUS_ERROR);
        }
        order.setStatus(0);
@@ -731,7 +731,7 @@
        R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId);
        XpVehicle xpVehicle = xpVehicleR.getData();
        if (xpVehicle == null) {
            throw new RuntimeException("车辆不存在");
            throw new ServiceException("车辆不存在",I18nKeyConstant.VEHICLE_NOT_EXISTS);
        }
        cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin());
        cancelTaxiPassengerVo.setUid(order.getAppUserId().toString());
@@ -779,7 +779,7 @@
    public void cancelOrder(String orderId) {
        XpOrder order = this.getById(orderId);
        if (order == null) {
            throw new RuntimeException("订单不存在");
            throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS);
        }
        order.setStatus(0);
        baseMapper.updateById(order);
@@ -833,13 +833,13 @@
    public void comment(XpOrderCommentDto dto, String uid) {
        XpOrder xpOrder = this.getById(dto.getOrderId());
        if (xpOrder == null) {
            throw new RuntimeException("订单不存在");
            throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS);
        }
        if (!xpOrder.getAppUserId().toString().equals(uid)) {
            throw new RuntimeException("无权限评价该订单");
            throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS);
        }
        if (xpOrder.getStatus() != 9) {
            throw new RuntimeException("订单状态错误");
            throw new ServiceException("订单状态错误",I18nKeyConstant.ORDER_STATUS_ERROR);
        }
        xpOrder.setStatus(10);
        baseMapper.updateById(xpOrder);
xp-robotaxi-order-boot/src/main/resources/i18n/messages.properties
@@ -10,4 +10,6 @@
order.reassign.new.vehicle.not.in.accept.mode=新车辆当前不在接单模式
order.reassign.new.vehicle.not.start.accept=新车辆未开始接单
order.reassign.new.vehicle.not.free=新车辆已接单,请重新选择
order.pricing.not.exists=当前城市未配置定价规则
order.pricing.not.exists=当前城市未配置定价规则
order.order.status.error=订单状态错误
vehicle.not.exists=车辆不存在
xp-robotaxi-order-boot/src/main/resources/i18n/messages_en_US.properties
@@ -11,4 +11,6 @@
order.reassign.new.vehicle.not.start.accept=The new vehicle has not started taking orders yet
order.reassign.new.vehicle.not.free=The new vehicle has been ordered. Please choose again
welcome.message=Welcome to our application!
order.pricing.not.exists=The current city has not been configured with pricing rules
order.pricing.not.exists=The current city has not been configured with pricing rules
order.order.status.error=Order status error
vehicle.not.exists=The vehicle does not exist.
xp-robotaxi-order-boot/src/main/resources/i18n/messages_zh_CN.properties
@@ -11,4 +11,6 @@
order.reassign.new.vehicle.not.start.accept=新车辆未开始接单
order.reassign.new.vehicle.not.free=新车辆已接单,请重新选择
welcome.message=欢迎来到我们的应用程序!
order.pricing.not.exists=当前城市未配置定价规则
order.pricing.not.exists=当前城市未配置定价规则
order.order.status.error=订单状态错误
vehicle.not.exists=车辆不存在
xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderEvaluateMapper.xml
@@ -6,5 +6,15 @@
    <sql id="Base_Column_List">
        id, order_id, vehicle_id, app_user_id, order_rating, evaluate_time, is_deleted, create_time, update_time, create_by, update_by
    </sql>
    <select id="managementPageList" resultType="com.xiaopeng.order.model.vo.OrderEvaluateManagementPageListVO">
        select id,app_user_id as userId,create_time as createTime,feedback_pictures as feedbackPictures,feedback_content as feedbackContent,feedback_type_id as feedbackTypeId
        from xp_order_evaluate
        where is_deleted = 0
        <if test="query.feedbackContent != null and query.feedbackContent != ''">
            and feedback_content like concat('%',#{query.feedbackContent},'%')
        </if>
        and feedback_type_id is not null
        order by create_time
    </select>
</mapper>
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -84,6 +84,17 @@
        return R.ok(xpVehicleService.listByIds(ids));
    }
    /**
     * 批量获取车辆列表
     *
     * @param ids 车辆ID列表
     * @return 车辆列表
     */
    @ApiOperation(value = "批量查询车辆信息", tags = {"内部接口"})
    @PostMapping("/inner/vehicle/listVehicle")
    public R<List<XpVehicle>> listVehicle() {
        return R.ok(xpVehicleService.list());
    }
    /**
     * 根据ID查询车辆信息(内部接口)
     *
     * @param id 车辆ID