xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
@@ -321,8 +321,7 @@ } userService.checkUserAllowed(user); // userService.checkUserDataScope(user.getId()); user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); return toAjax(userService.updateById(user)); return toAjax(userService.resetUserPwd(user.getId(), SecurityUtils.encryptPassword(dto.getNewPassword().trim()))); } /** xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysUserServiceImpl.java
@@ -262,6 +262,6 @@ @Override public boolean resetUserPwd(Long id, String newPassword) { return lambdaUpdate().set(SysUser::getId, id).set(SysUser::getPassword, newPassword).update(); return lambdaUpdate().eq(SysUser::getId, id).set(SysUser::getPassword, newPassword).update(); } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpElectronicFenceArea.java
@@ -15,6 +15,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; /** @@ -57,4 +58,7 @@ @ApiModelProperty(value = "围栏点位 经度_维度,经度_维度") private String fencePoints; @ApiModelProperty(value = "运营策略") private String operationStrategy; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/ElectronicPageListQuery.java
@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel(value = "电子围栏列表查询query") public class ElectronicPageListQuery extends BasePage { @@ -13,7 +15,7 @@ @ApiModelProperty(value = "围栏构成 区域id") private String electronicAreaId; @ApiModelProperty(value = "围栏状态 0=草稿 1=待启用 2=启用中 3=已停用") private Integer status; private List<Integer> statusList; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "创建开始时间") xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
New file @@ -0,0 +1,163 @@ package com.xiaopeng.maintenance.controller; import cn.hutool.core.util.IdUtil; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.operation.NewCruiseOrderDto; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient; import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpCruiseOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.OrderType; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.maintenance.dto.VehicleDispatchAcceptDTO; import com.xiaopeng.maintenance.dto.VehicleDispatchDepartureDTO; import com.xiaopeng.maintenance.model.query.OperationRecordsQuery; import com.xiaopeng.maintenance.model.vo.OperationRecordsVO; import com.xiaopeng.maintenance.service.IXpVehiclePreparationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; 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.RestController; import javax.annotation.Resource; /** * <p> * 车辆管理 前端控制器 * </p> * * @author mitao * @since 2026-02-03 */ @Slf4j @RestController @Api(tags = "车辆运维") public class XpVehicleOperationsController { @Resource private IXpVehiclePreparationService xpVehiclePreparationService; @Resource private XpVehicleClient xpVehicleClient; @Resource private XpCruiseOrderClient xpCruiseOrderClient; @Resource private MongoTemplate mongoTemplate; @Resource private OrderMissionClient orderMissionClient; @Autowired private XpCruisePlanClient xpCruisePlanClient; /** * 车辆详情-车辆调度-发车 收车 */ @ApiOperation(value = "车辆运维-车辆调度-发车/收车", tags = {"运维APP-车辆管理"}) @PostMapping("/api/v1/vehicle/vehicleDispatchDeparture") public R<String> vehicleDispatchDeparture(@RequestBody VehicleDispatchDepartureDTO dto) { // 判断是否有正在进行的正常订单 // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData(); if(xpVehicle.getState()==1){ return R.fail("车辆正在接单中"); } xpVehicle.setOperatingStatus(dto.getDepartureStatus()); xpVehicleClient.updateVehicleById(xpVehicle); // 发车 if(dto.getDepartureStatus()==1){ // 找车辆的任务 生成巡游单子 下发命令 R<XpCruiseOrder> newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(),xpVehicle.getVehicleVin(),xpVehicle.getFleetId())); if(newCruiseOrder.getData()!=null){ // 下发命令 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setVin(xpVehicle.getVehicleVin()); pushOrderDto.setOrderId(newCruiseOrder.getData().getId()); pushOrderDto.setStartLatitude(newCruiseOrder.getData().getStartLat()); pushOrderDto.setStartLongitude(newCruiseOrder.getData().getStartLon()); pushOrderDto.setEndLatitude(newCruiseOrder.getData().getEndLat()); pushOrderDto.setEndLongitude(newCruiseOrder.getData().getEndLon()); pushOrderDto.setOrderType(OrderType.CRUISE_ORDER); pushOrderDto.setStage(2); orderMissionClient.pushOrder(pushOrderDto); } }else if(dto.getDepartureStatus()==3){ // 收车 关闭当前巡游单子 生成新的返程单子 找到收车站点 R<String> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin()); // redis 获取当前最新经纬度位置 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); XpCruiseOrder xpCruiseOrder = new XpCruiseOrder(); if(vehiclePosition!=null){ double x = vehiclePosition.getPoint().getX(); double y = vehiclePosition.getPoint().getY(); xpCruiseOrder.setStartLon(x); xpCruiseOrder.setStartLat(y); } xpCruiseOrder.setId("XU"+ IdUtil.fastUUID()); xpCruiseOrder.setVehicleId(xpVehicle.getId()); xpCruiseOrder.setFleetId(xpVehicle.getFleetId()); xpCruiseOrder.setOrderType(2); xpCruiseOrder.setStatus(1); xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setLastOrderId(r.getData()); // 找到收车站点 R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder); if(returnCruisePoint!=null){ xpCruiseOrderClient.addCruiseOrder(returnCruisePoint.getData()); // 下发命令 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setVin(returnCruisePoint.getData().getVehicleVin()); pushOrderDto.setOrderId(returnCruisePoint.getData().getId()); pushOrderDto.setStartLatitude(returnCruisePoint.getData().getStartLat()); pushOrderDto.setStartLongitude(returnCruisePoint.getData().getStartLon()); pushOrderDto.setEndLatitude(returnCruisePoint.getData().getEndLat()); pushOrderDto.setEndLongitude(returnCruisePoint.getData().getEndLon()); pushOrderDto.setOrderType(OrderType.CRUISE_ORDER); pushOrderDto.setStage(2); orderMissionClient.pushOrder(pushOrderDto); } } return R.ok(); } /** * 车辆详情-车辆调度-接单、测试 */ @ApiOperation(value = "车辆运维-车辆调度-接单、测试", tags = {"运维APP-车辆管理"}) @PostMapping("/api/v1/vehicle/vehicleDispatchAccept") public R<String> vehicleDispatchAccept(@RequestBody VehicleDispatchAcceptDTO dto) { // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData(); xpVehicle.setAcceptOrTest(dto.getAcceptOrTest()); xpVehicle.setAcceptOrTestStatus(dto.getAcceptOrTestStatus()); xpVehicleClient.updateVehicleById(xpVehicle); return R.ok(); } /** * 车辆详情-车辆调度-运维记录 */ @ApiOperation(value = "车辆运维-车辆调度-运维记录", tags = {"运维APP-车辆管理"}) @PostMapping("/api/v1/vehicle/operationRecords") public R<PageInfo<OperationRecordsVO>> operationRecords(@Validated @RequestBody OperationRecordsQuery query) { PageInfo<OperationRecordsVO> operationRecords = xpVehiclePreparationService.operationRecords(query); return R.ok(operationRecords); } } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/query/XpTaskRecordPageQuery.java
@@ -27,9 +27,11 @@ @ApiModelProperty(value = "任务类别 1常规 2事故") private Integer taskCategory; @ApiModelProperty(value = "任务类型id 任务类别为2时对应数据字典,多个逗号分割,为1的时候 枚举1车辆检查 2车辆充电 3车辆整备 4整备洗车 5车辆维修 6车辆保养 7车辆保险到期 8车辆年检到期 9车辆运营资质到期") private String taskTypeId; @ApiModelProperty(value = "常规任务类型枚举1车辆检查 2车辆充电 3车辆整备 4整备洗车 5车辆维修 6车辆保养 7车辆保险到期 8车辆年检到期 9车辆运营资质到期") private Integer taskGeneralId; @ApiModelProperty(value = "事故任务类型id") private Long taskErrorId; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate startTime; xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -828,10 +828,14 @@ wrapper.eq(XpTask::getTaskCategory, query.getTaskCategory()); } if (StringUtils.isNotBlank(query.getTaskTypeId())) { wrapper.eq(XpTask::getTaskTypeId, query.getTaskTypeId()); if (Objects.nonNull(query.getTaskGeneralId())) { wrapper.eq(XpTask::getTaskTypeId, query.getTaskGeneralId()).eq(XpTask::getTaskCategory, 1); } if (Objects.nonNull(query.getTaskErrorId())) { wrapper.apply("find_in_set({0}, task_type_id)", query.getTaskErrorId()) .eq(XpTask::getTaskCategory, 2); } if (query.getStartTime() != null) { wrapper.ge(XpTask::getCreateTime, query.getStartTime().atStartOfDay()); } xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpElectronicFenceMapper.xml
@@ -20,8 +20,10 @@ <if test="query.electronicAreaId != null"> and efa.id = #{query.electronicAreaId} </if> <if test="query.status != null"> and ef.status = #{query.status} <if test="query.statusList != null"> <foreach collection="query.statusList" item="status" open="and ef.status in (" separator="," close=")"> #{status} </foreach> </if> <if test="query.createBy != null and query.createBy!=''"> and ef.create_by like concat('%',#{query.createBy},'%') xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -27,6 +27,7 @@ import com.xiaopeng.order.model.dto.XpOrderPayDto; import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel; import com.xiaopeng.order.model.query.XpHistoryOrderListQuery; import com.xiaopeng.order.model.query.XpOrderExcelQuery; import com.xiaopeng.order.model.query.XpOrderPageQuery; import com.xiaopeng.order.model.dto.XpOrderOperateDTO; import com.xiaopeng.order.model.dto.XpOrderReassignDTO; @@ -229,7 +230,7 @@ */ @ApiOperation(value = "订单导出", tags = {"管理后台-交易管理-订单管理"}) @PostMapping("/api/v1/order/exportExcel") public void exportExcel(@RequestBody XpOrderPageQuery query) { public void exportExcel(@RequestBody XpOrderExcelQuery query) { // 1. 查询导出数据 List<XpOrderPageVO> dataList = xpOrderService.exportList(query); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/query/XpOrderExcelQuery.java
New file @@ -0,0 +1,26 @@ 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; import java.util.List; /** * 订单分页查询请求 * * @author mitao */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "订单分页查询请求", description = "订单分页查询参数") public class XpOrderExcelQuery extends XpOrderPageQuery { @ApiModelProperty(value = "订单ID列表") private List<Long> ids; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -18,6 +18,7 @@ import com.xiaopeng.order.model.dto.XpOrderCommentDto; import com.xiaopeng.order.model.dto.XpOrderPayDto; import com.xiaopeng.order.model.query.XpHistoryOrderListQuery; import com.xiaopeng.order.model.query.XpOrderExcelQuery; import com.xiaopeng.order.model.query.XpOrderPageQuery; import com.xiaopeng.order.model.vo.XpOrderDetailVO; import com.xiaopeng.order.model.vo.XpOrderHistoryVO; @@ -73,7 +74,7 @@ * @param query 查询参数 * @return 订单列表 */ List<XpOrderPageVO> exportList(XpOrderPageQuery query); List<XpOrderPageVO> exportList(XpOrderExcelQuery query); /** * 取消或关闭订单 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -79,6 +79,7 @@ import com.xiaopeng.order.model.dto.XpOrderCommentDto; import com.xiaopeng.order.model.dto.XpOrderPayDto; import com.xiaopeng.order.model.query.XpHistoryOrderListQuery; import com.xiaopeng.order.model.query.XpOrderExcelQuery; import com.xiaopeng.order.model.query.XpOrderPageQuery; import com.xiaopeng.order.model.vo.*; import com.xiaopeng.order.service.IXpOrderCancelService; @@ -298,9 +299,9 @@ } @Override public List<XpOrderPageVO> exportList(XpOrderPageQuery query) { public List<XpOrderPageVO> exportList(XpOrderExcelQuery query) { // 1. 构建查询条件 LambdaQueryWrapper<XpOrder> wrapper = buildQueryWrapper(query); LambdaQueryWrapper<XpOrder> wrapper = buildExcelQueryWrapper(query); // 2. 查询订单列表 List<XpOrder> orderList = this.list(wrapper); @@ -357,7 +358,27 @@ wrapper.orderByDesc(XpOrder::getCreateTime); return wrapper; } private LambdaQueryWrapper<XpOrder> buildExcelQueryWrapper(XpOrderExcelQuery query) { LambdaQueryWrapper<XpOrder> wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(query.getOrderNumber()), XpOrder::getOrderNumber, query.getOrderNumber()) .eq(Objects.nonNull(query.getFleetId()), XpOrder::getFleetId, query.getFleetId()) .eq(Objects.nonNull(query.getOrderSource()), XpOrder::getOrderSource, query.getOrderSource()) .like(StringUtils.isNotBlank(query.getCityCode()), XpOrder::getCityCode, query.getCityCode()) .eq(Objects.nonNull(query.getStatus()), XpOrder::getStatus, query.getStatus()); if (Objects.nonNull(query.getStartTime())) { wrapper.ge(XpOrder::getCreateTime, LocalDateTime.of(query.getStartTime(), LocalTime.MIN)); } if (Objects.nonNull(query.getEndTime())) { wrapper.le(XpOrder::getCreateTime, LocalDateTime.of(query.getEndTime(), LocalTime.MAX)); } if (CollUtil.isNotEmpty(query.getIds())) { wrapper.in(XpOrder::getId, query.getIds()); } wrapper.orderByDesc(XpOrder::getCreateTime); return wrapper; } /** * 批量获取用户信息 */