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
@@ -5,3 +5,4 @@ repair.money.too.long=维修费用不能超过10字符 task.save.error=获取车辆实时定位信息失败,请稍后重试 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,10 +687,17 @@ List<XpVehicleExportExcel> exportList = BeanUtil.copyToList(dataList, XpVehicleExportExcel.class); for (XpVehicleExportExcel xpVehicleExportExcel : exportList) { if (StringUtils.isNotBlank(xpVehicleExportExcel.getVehiclePictures())) { JSONObject jsonObject = JSONObject.parseObject(xpVehicleExportExcel.getVehiclePictures()); 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 Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpVehicleExportExcel.class, exportList); 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(); } }