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,65 +157,12 @@ } @ApiOperation(value = "查询车辆不分页列表") @PostMapping(" /listVehicle") public R<List<VehicleListVO>> listVehicle() { // xpVehicleClient.listByIds() 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); public R<List<XpVehicle>> listVehicle() { List<XpVehicle> vehicles = xpVehicleClient.listVehicle().getData(); if (vehicles == null){ return R.ok(new ArrayList<>()); } 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); } @@ -1078,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-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/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/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/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