“mitao”
2026-04-02 3207399bcdc24d13874e8bd9f27070a928ccc77b
fix(management):管理后台问题修改
1个文件已添加
14个文件已修改
224 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserNotificationServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAgreement.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/I18nKeyConstant.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages_en_US.properties 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages_zh_CN.properties 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAgreementController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/XpAgreementDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAgreementServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/exportExcel/XpVehicleExportExcel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/AliOssDownloadUtil.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserNotificationServiceImpl.java
@@ -30,22 +30,15 @@
            XpOperationsUserNotificationPageQuery query) {
        // 创建分页对象
        Page<XpOperationsUserNotification> page = new Page<>(
            query.getPageNum(),
            query.getPageSize()
        );
        PageInfo<XpOperationsUserNotification> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        // 执行分页查询
        Page<XpOperationsUserNotification> resultPage = baseMapper.selectNotificationPageByUserId(
            page,
            pageInfo,
            query
        );
        // 封装分页结果
        PageInfo<XpOperationsUserNotification> pageInfo = new PageInfo<>();
        pageInfo.setRecords(resultPage.getRecords());
        pageInfo.setTotal(resultPage.getTotal());
        return pageInfo;
    }
    @Override
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAgreement.java
@@ -28,7 +28,7 @@
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "类型 1=用户服务协议 2=平台隐私政策 3=敏感个人信息处理情况说明 4=向第三方提供个人信息情况的说明 5=乘车须知 6=计费规则说明")
    @ApiModelProperty(value = "类型 1=小鹏Robotaxi隐私政策 2=个人信息收集清单 3=敏感个人信息处理情况说明 4=向第三方提供个人信息情况的说明 5=乘车须知 6=计费规则说明 7=权限说明 8=运维APP-小鹏Robotaxi自动驾驶出行运维隐私政策 9=运维APP-第三方共享信息清单 10=运维APP-个人信息收集清单 11=运维APP-权限调用")
    @TableField("content_type")
    private Integer contentType;
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/I18nKeyConstant.java
@@ -12,4 +12,5 @@
    String REPAIR_MONEY_TOO_LONG = "repair.money.too.long";
    String TASK_SAVE_ERROR = "task.save.error";
    String TASK_VEHICLE_NOT_EXIST = "task.vehicle.not.exist";
    String ACCIDENT_TYPE_NOT_EXIST = "accident.type.not.exist";
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java
@@ -25,7 +25,7 @@
    @Excel(name = "车牌",width = 20)
    private String plateNumber;
    @ApiModelProperty(value = "任务类别1常规 2事故")
    @Excel(name = "任务类别",width = 20)
    @Excel(name = "任务类别",width = 20, replace = {"常规_1","事故_2"})
    private Integer taskCategory;
    @ApiModelProperty(value = "类型")
    @Excel(name = "类型",width = 40)
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -1852,6 +1852,12 @@
            Map<Long, List<XpErrorType>> errorType = errorTypeMapper.selectList(new LambdaQueryWrapper<XpErrorType>()
                            .in(XpErrorType::getId, Arrays.asList(task.getTaskTypeId().split(","))))
                    .stream().collect(Collectors.groupingBy(XpErrorType::getParentId));
            if (CollUtil.isEmpty(errorType)) {
                throw new ServiceException(
                        "事故类型不存在",
                        I18nKeyConstant.ACCIDENT_TYPE_NOT_EXIST
                );
            }
            List<XpErrorType> xpErrorTypes = errorType.get(0L);
            for (XpErrorType xpErrorType : xpErrorTypes) {
                xpErrorType.setChild(errorType.get(xpErrorType.getId()));
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages.properties
@@ -4,4 +4,5 @@
vehicle.not.exist=车辆不存在
repair.money.too.long=维修费用不能超过10字符
task.save.error=获取车辆实时定位信息失败,请稍后重试
task.vehicle.not.exist=上报失败,未获取到车辆信息
task.vehicle.not.exist=上报失败,未获取到车辆信息
accident.type.not.exist=事故类型不存在
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages_en_US.properties
@@ -5,4 +5,5 @@
repair.money.too.long=The maintenance cost cannot exceed 10 characters
task.save.error=Failed to obtain the real-time positioning information of the vehicle. Please try again later
task.vehicle.not.exist=The report failed and no vehicle information was obtained
accident.type.not.exist=The accident type does not exist.
task.rule.not.config=The vehicle accident task allocation rules have not been configured
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages_zh_CN.properties
@@ -5,4 +5,5 @@
repair.money.too.long=维修费用不能超过10字符
task.save.error=获取车辆实时定位信息失败,请稍后重试
task.vehicle.not.exist=上报失败,未获取到车辆信息
accident.type.not.exist=事故类型不存在
task.rule.not.config=未配置车辆事故任务分配规则
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAgreementController.java
@@ -44,13 +44,13 @@
    @ApiOperation(value = "获取协议/隐私政策",tags = {"运维APP-个人中心"},response = XpAgreementVo.class)
    @GetMapping("/base/v1/privacy/content/{type}")
    public R<XpAgreementVo> getAppContent(@ApiParam(name = "type", value = "类型 1=用户服务协议 2=平台隐私政策 ") @PathVariable Integer type) {
    public R<XpAgreementVo> getAppContent(@ApiParam(name = "type", value = "类型 8=运维APP-小鹏Robotaxi自动驾驶出行运维隐私政策 9=运维APP-第三方共享信息清单 10=运维APP-个人信息收集清单 11=运维APP-权限调用") @PathVariable Integer type) {
        return R.ok(xpAgreementService.getContentByType(type));
    }
    @ApiOperation(value = "获取协议",tags = {"管理后台-内容中心"})
    @GetMapping("/api/v1/agreement/content/{type}")
    public R<XpAgreement> getAgreementContent(@ApiParam(name = "type", value = "类型 1=用户服务协议 2=平台隐私政策 3=敏感个人信息处理情况说明 4=向第三方提供个人信息情况的说明 5=乘车须知 6=计费规则说明 7= 法律法规") @PathVariable Integer type) {
    public R<XpAgreement> getAgreementContent(@ApiParam(name = "type", value = "类型 1=小鹏Robotaxi隐私政策 2=个人信息收集清单 3=敏感个人信息处理情况说明 4=向第三方提供个人信息情况的说明 5=乘车须知 6=计费规则说明 7=权限说明 8=运维APP-小鹏Robotaxi自动驾驶出行运维隐私政策 9=运维APP-第三方共享信息清单 10=运维APP-个人信息收集清单 11=运维APP-权限调用") @PathVariable Integer type) {
        return R.ok(xpAgreementService.getAgreementContent(type));
    }
    @ApiOperation(value = "保存协议",tags = {"管理后台-内容中心"})
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/XpAgreementDTO.java
@@ -17,7 +17,7 @@
@ApiModel("协议数据传输对象")
public class XpAgreementDTO {
    @NotNull(message = "协议类型不能为空")
    @ApiModelProperty(value = "类型 1=用户服务协议 2=平台隐私政策 3=敏感个人信息处理情况说明 4=向第三方提供个人信息情况的说明 5=乘车须知 6=计费规则说明")
    @ApiModelProperty(value = "类型 1=小鹏Robotaxi隐私政策 2=个人信息收集清单 3=敏感个人信息处理情况说明 4=向第三方提供个人信息情况的说明 5=乘车须知 6=计费规则说明 7=权限说明 8=运维APP-小鹏Robotaxi自动驾驶出行运维隐私政策 9=运维APP-第三方共享信息清单 10=运维APP-个人信息收集清单 11=运维APP-权限调用")
    private Integer contentType;
    @NotBlank(message = "协议内容不能为空")
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAgreementServiceImpl.java
@@ -106,8 +106,8 @@
            this.save(xpAgreement);
        }
        // 判断是否需要发送通知(用户服务协议=1 或 平台隐私政策=2)
        if (dto.getContentType() != null && (dto.getContentType() == 1 || dto.getContentType() == 2)) {
        // 判断是否需要发送通知 8=运维APP-小鹏Robotaxi自动驾驶出行运维隐私政策 9=运维APP-第三方共享信息清单 10=运维APP-个人信息收集清单 11=运维APP-权限调用
        if (dto.getContentType() != null && (dto.getContentType() == 8 || dto.getContentType() == 9 || dto.getContentType() == 10 || dto.getContentType() == 11)) {
            // 发送协议更新提示通知(type=9)
            sendAgreementUpdateNotification(dto.getContentType());
            // 发送协议授权通知(type=10)
@@ -170,10 +170,15 @@
     * @return 协议类型名称
     */
    private String getAgreementTypeName(Integer contentType) {
        if (contentType == 1) {
            return "用户服务协议";
        } else if (contentType == 2) {
            return "平台隐私政策";
        switch (contentType) {
            case 8:
                return "小鹏Robotaxi自动驾驶出行运维隐私政策";
            case 9:
                return "第三方共享信息清单";
            case 10:
                return "个人信息收集清单";
            case 11:
                return "权限调用";
        }
        return "协议";
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.account.UcUserInfo;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
@@ -54,6 +55,31 @@
    @Override
    public PageInfo<OrderEvaluatePageVO> pageList(OrderEvaluatePageQuery query) {
        List<Long> vehicleIdsFilter = null;
        if (StringUtils.isNotBlank(query.getPlateNumber())) {
            R<List<XpVehicle>> vehicleResult = xpVehicleClient.listByPlateNumber(query.getPlateNumber());
            if (vehicleResult == null || CollectionUtils.isEmpty(vehicleResult.getData())) {
                return buildEmptyEvaluatePage(query);
            }
            vehicleIdsFilter = vehicleResult.getData().stream()
                    .map(XpVehicle::getId)
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
            if (CollectionUtils.isEmpty(vehicleIdsFilter)) {
                return buildEmptyEvaluatePage(query);
            }
        }
        Long appUserIdFilter = null;
        if (StringUtils.isNotBlank(query.getPhoneNumber())) {
            UcUserInfo userByMobile = userResourcesClient.getUserByMobile(query.getPhoneNumber());
            if (userByMobile == null || userByMobile.getUid() == null) {
                return buildEmptyEvaluatePage(query);
            }
            appUserIdFilter = userByMobile.getUid();
        }
        // 1. 构建查询条件
        LambdaQueryWrapper<XpOrderEvaluate> wrapper = new LambdaQueryWrapper<>();
@@ -70,19 +96,22 @@
        if (Objects.nonNull(query.getOrderRating())) {
            wrapper.eq(XpOrderEvaluate::getOrderRating, query.getOrderRating());
        }
        if (!CollectionUtils.isEmpty(vehicleIdsFilter)) {
            wrapper.in(XpOrderEvaluate::getVehicleId, vehicleIdsFilter);
        }
        if (Objects.nonNull(appUserIdFilter)) {
            wrapper.eq(XpOrderEvaluate::getAppUserId, appUserIdFilter);
        }
        // 排序:按评价时间降序
        wrapper.orderByDesc(XpOrderEvaluate::getEvaluateTime);
        // 2. 分页查询
        PageInfo<XpOrderEvaluate> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        PageInfo<XpOrderEvaluate> evaluatePage = this.page(pageInfo, wrapper);
        Page<XpOrderEvaluate> evaluatePage = this.page(pageInfo, wrapper);
        if (CollectionUtils.isEmpty(evaluatePage.getRecords())) {
            PageInfo<OrderEvaluatePageVO> resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize());
            resultPage.setTotal(0L);
            resultPage.setRecords(new ArrayList<>());
            return resultPage;
            return buildEmptyEvaluatePage(query);
        }
        // 3. 收集关联ID
@@ -107,16 +136,22 @@
        Map<Long, XpVehicle> vehicleMap = batchGetVehicles(vehicleIds);
        Map<Long, XpOrder> orderMap = batchGetOrders(orderIds);
        // 5. 根据查询条件过滤(手机号、车牌号)
        // 5. 组装 VO
        List<OrderEvaluatePageVO> voList = evaluatePage.getRecords().stream()
                .map(evaluate -> convertToPageVO(evaluate, userInfoMap, vehicleMap, orderMap))
                .filter(vo -> filterByQuery(vo, query))
                .collect(Collectors.toList());
        // 6. 返回分页结果
        PageInfo<OrderEvaluatePageVO> resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize());
        resultPage.setTotal(evaluatePage.getTotal());
        resultPage.setRecords(voList);
        return resultPage;
    }
    private PageInfo<OrderEvaluatePageVO> buildEmptyEvaluatePage(OrderEvaluatePageQuery query) {
        PageInfo<OrderEvaluatePageVO> resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize());
        resultPage.setTotal(0L);
        resultPage.setRecords(new ArrayList<>());
        return resultPage;
    }
@@ -225,28 +260,5 @@
        }
        return vo;
    }
    /**
     * 根据查询条件过滤
     */
    private boolean filterByQuery(OrderEvaluatePageVO vo, OrderEvaluatePageQuery query) {
        // 手机号过滤
        if (StringUtils.isNotBlank(query.getPhoneNumber())) {
            if (StringUtils.isBlank(vo.getPhoneNumber()) ||
                    !vo.getPhoneNumber().contains(query.getPhoneNumber())) {
                return false;
            }
        }
        // 车牌号过滤
        if (StringUtils.isNotBlank(query.getPlateNumber())) {
            if (StringUtils.isBlank(vo.getPlateNumber()) ||
                    !vo.getPlateNumber().contains(query.getPlateNumber())) {
                return false;
            }
        }
        return true;
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -42,6 +42,7 @@
import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleService;
import com.xiaopeng.vehicleConvoy.util.AliOssDownloadUtil;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -105,6 +106,7 @@
    private final TokenService tokenService;
    private final XpVehicleRepairClient xpVehicleRepairClient;
    private final AliOssService aliOssService;
    private final AliOssDownloadUtil aliOssDownloadUtil;
    /**
     * 根据ID列表批量查询车辆信息(内部接口)
     *
@@ -685,8 +687,15 @@
        List<XpVehicleExportExcel> exportList = BeanUtil.copyToList(dataList, XpVehicleExportExcel.class);
        for (XpVehicleExportExcel xpVehicleExportExcel : exportList) {
            if (StringUtils.isNotBlank(xpVehicleExportExcel.getVehiclePictures())) {
                JSONObject jsonObject = JSONObject.parseObject(xpVehicleExportExcel.getVehiclePictures());
                xpVehicleExportExcel.setVehiclePictures(jsonObject.containsKey("url") ? jsonObject.getString("url") : "");
                String pictureJSONObject = aliOssDownloadUtil.getPictureJSONObject(xpVehicleExportExcel.getVehiclePictures());
                if (StringUtils.isNotBlank(pictureJSONObject)) {
                    JSONObject jsonObject = JSONObject.parseObject(pictureJSONObject);
                    xpVehicleExportExcel.setVehiclePictures(jsonObject.containsKey("url") ? jsonObject.getString("url") : "");
                }
            }
            if (Integer.valueOf(2).equals(xpVehicleExportExcel.getStatus()) && Integer.valueOf(1).equals(xpVehicleExportExcel.getOperatingStatus())) {
                xpVehicleExportExcel.setStatus(4);
            }
        }
        // 3. 生成Excel
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/exportExcel/XpVehicleExportExcel.java
@@ -44,7 +44,7 @@
    private String procurementSource;
    @ApiModelProperty(value = "车辆状态")
    @Excel(name = "车辆状态", width = 15, replace = {"待完善_1", "待运营_2", "保险/年检过期_3"})
    @Excel(name = "车辆状态", width = 15, replace = {"待完善_1", "待运营_2", "保险/年检过期_3", "运营_4"})
    private Integer status;
    @ApiModelProperty(value = "运营状态 1运营中 2维修中 3已收车 4车辆异常")
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/AliOssDownloadUtil.java
New file
@@ -0,0 +1,87 @@
package com.xiaopeng.vehicleConvoy.util;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.evi.oss.service.AliOssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.util.Objects;
/**
 * @author MiTao
 * @date 2026-03-25 11:24
 *
 */
@Slf4j
@Component
public class AliOssDownloadUtil {
    @Autowired
    private AliOssService aliOssService;
    public String getPictureJsonArray(String json) {
        JSONArray res = new JSONArray();
        if (json == null || json.isEmpty()) {
            return res.toJSONString();
        }
        if (json.startsWith("{")) {
            JSONObject jsonObject = JSONObject.parseObject(json);
            if (Objects.isNull(jsonObject)) {
                return res.toJSONString();
            }
            String downloadUrl = "";
            try {
                downloadUrl = aliOssService.getDownloadUrl(
                        jsonObject.getString("id"), jsonObject.getString("name"), true);
            } catch (UnsupportedEncodingException e) {
                log.error("获取图片下载地址失败", e);
            }
            jsonObject.put("url", downloadUrl);
            res.add(jsonObject);
        } else if (json.startsWith("[")) {
            JSONArray jsonArray = JSONArray.parseArray(json);
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                if (Objects.isNull(jsonObject)) {
                    continue;
                }
                String downloadUrl = "";
                try {
                    downloadUrl = aliOssService.getDownloadUrl(
                            jsonObject.getString("id"), jsonObject.getString("name"), true);
                } catch (UnsupportedEncodingException e) {
                    log.error("获取图片下载地址失败", e);
                }
                jsonObject.put("url", downloadUrl);
            }
            res = jsonArray;
        }
        return res.toJSONString();
    }
    /**
     * JSONObject类型图片
     * @param json
     * @return
     */
    public String getPictureJSONObject(String json){
        JSONObject jsonObject = JSONObject.parseObject(json);
        if (Objects.isNull(jsonObject)) {
            return new JSONObject().toJSONString();
        }
        String downloadUrl = jsonObject.getString("url");
        try {
            downloadUrl = aliOssService.getDownloadUrl(
                    jsonObject.getString("id"), jsonObject.getString("name"), true);
        } catch (UnsupportedEncodingException e) {
            log.error("获取图片下载地址失败", e);
        }
        jsonObject.put("url", downloadUrl);
        return jsonObject.toJSONString();
    }
}