xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpSystemSettingClientFallbackFactory.java
@@ -19,6 +19,12 @@ log.error("获取下单距离失败:{}", cause.getMessage()); return R.fail("获取下单距离失败"); } @Override public R<Integer> getOrderFinishTime() { log.error("获取自动结束行程时间失败:{}", cause.getMessage()); return R.fail("获取自动结束行程时间失败,"+cause.getMessage()); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpSystemSettingClient.java
@@ -15,6 +15,11 @@ @GetMapping("/base/v1/mini-program/support/getOrderDistance") R getOrderDistance(); /** * 获取自动结束行程时间 * @return */ @GetMapping("/api/v1/mini-program/support/getOrderFinishTime") R<Integer> getOrderFinishTime(); } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/IndexController.java
@@ -3,6 +3,7 @@ import com.xiaopeng.api.dto.operation.PointMapQuery; import com.xiaopeng.api.feignClient.operation.XpPointClient; import com.xiaopeng.api.model.operation.XpPoint; import com.xiaopeng.api.query.operation.PointPageListQuery; import com.xiaopeng.api.vo.account.LoginOperationUser; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.redis.service.RedisService; @@ -38,6 +39,12 @@ R<List<XpPoint>> pageInfo= pointClient.pointMap(query); return pageInfo; } @ApiOperation(value = "点位管理列表", tags = {"运维APP-站点导航"}) @PostMapping("/list") public R<List<XpPoint>> list(@RequestBody PointPageListQuery query) { return pointClient.list( query); } @ApiOperation(value = "点位详情") @GetMapping("/api/v1/pointDetail") public R<XpPoint> pointDetail(@RequestParam(value = "点位id", required = true)Long id) { xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpSystemSettingController.java
@@ -19,7 +19,7 @@ @Slf4j @RestController @RequestMapping("/base/v1/mini-program") @RequestMapping("") @Api(tags = "系统设置模块") public class XpSystemSettingController extends BaseController { @@ -33,7 +33,7 @@ } @GetMapping("/support/phone") @GetMapping("/base/v1/mini-program/support/phone") @ApiOperation(value = "获取客服电话",tags = {"小程序首页"},response = String.class) public AjaxResult<CustomerServicePhoneVo> getBannerList() { Object customerServicePhone = redisService.getCacheObject(CacheConstants.CUSTOMER_SERVICE_PHONE); @@ -52,11 +52,16 @@ // } @GetMapping("/support/getOrderDistance") @GetMapping("/base/v1/mini-program/support/getOrderDistance") @ApiOperation(value = "获取下单距离",tags = {"小程序首页-服务调用获取下单距离"},response = Integer.class) public R getOrderDistance() { return R.ok(xpSystemSettingService.getOrderDistance()); } @ApiOperation(value = "获取自动结束行程时间",tags = {"小程序-业务流程"},response = Integer.class) @GetMapping("/api/v1/mini-program/support/getOrderFinishTime") public R<Integer> getOrderFinishTime() { return R.ok(xpSystemSettingService.getOrderFinishTime()); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpSystemSettingService.java
@@ -27,5 +27,11 @@ Integer getOrderDistance(); /** * 获取自动结束行程时间 * @return */ Integer getOrderFinishTime(); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpSystemSettingServiceImpl.java
@@ -35,4 +35,13 @@ } return 0; } @Override public Integer getOrderFinishTime() { XpSystemSetting xpSystemSetting = this.getOne(null); if (xpSystemSetting != null) { return xpSystemSetting.getArriveTime(); } return 15; } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -8,6 +8,7 @@ import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.order.FareBreakdownVo; import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo; import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo; @@ -388,5 +389,14 @@ return xpOrderService.updateOrderStatus(orderId,status); } /** * 业务流程-通过订单id查询车辆信息 */ @ApiOperation(value = "通过订单id查询车辆信息", tags = {"小程序-业务流程"}) @GetMapping("/api/v1/order/queryVehicleByOrderId") public R<XpVehicle> queryVehicleByOrderId(@RequestParam Long orderId, HttpServletRequest request) { String uid = request.getHeader("XP-Uid"); return R.ok(xpOrderService.queryVehicleByOrderId(orderId,uid)); } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/base/TimeJobType.java
@@ -5,7 +5,8 @@ * @date 2025年2月17日 下午7:22:28 */ public enum TimeJobType { ORDER_CANCEL("order_cancel","订单取消"); ORDER_CANCEL("order_cancel","订单取消"), END_TRIP("end_trip","自动结束行程"); private String type; private String desc; private TimeJobType(String type, String desc) { xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/EndTripJob.java
New file @@ -0,0 +1,42 @@ package com.xiaopeng.order.job.jobs; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.common.core.enums.PushMessageTypeEnum; import com.xiaopeng.order.job.base.AbstractJob; import lombok.extern.slf4j.Slf4j; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * 直播推送定时任务 * @author Administrator * */ @Slf4j public class EndTripJob extends AbstractJob { public static final String name = "endTrip_"; @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap maps = context.getMergedJobDataMap(); Long orderId = maps.getLong("id"); try { log.info("开始执行自动结束行程任务"); // TODO 自动结束行程任务 }catch(Exception e){ e.printStackTrace(); } } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -6,6 +6,7 @@ import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.order.FareBreakdownVo; import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo; import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo; @@ -167,6 +168,13 @@ boolean addOrder(XpOrder xpOrder); /** * 根据订单ID查询车辆信息 * @param orderId 订单ID * @param uid * @return */ XpVehicle queryVehicleByOrderId(Long orderId, String uid); /** * 获取订单数量 * @return */ xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -18,6 +18,7 @@ import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.feignClient.account.XpAppUserClient; import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient; import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient; @@ -47,6 +48,7 @@ import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.common.security.utils.SecurityUtils; import com.xiaopeng.order.constant.I18nKeyConstant; import com.xiaopeng.order.job.jobs.EndTripJob; import com.xiaopeng.order.mapper.XpOrderMapper; import com.xiaopeng.order.model.dto.XpOrderCommentDto; import com.xiaopeng.order.model.dto.XpOrderPayDto; @@ -104,6 +106,7 @@ private final IXpOrderReassignService xpOrderReassignService; private final RedisService redisService; private final XpPricingClient xpPricingClient; private final XpSystemSettingClient xpSystemSettingClient; @Override public OrderStatisticsDTO getOrderStatistics(StatisticsQueryDTO query) { @@ -782,8 +785,8 @@ xpOrder.setStatus(status); switch (status) { case 4: // 添加定时任务job Map<String, ? extends Object> maps = // 添加取消订单定时任务job Map<String, ? extends Object> cancelJobMaps = new ImmutableMap.Builder<String, Long>(). put("id", xpOrder.getId()) .build(); @@ -792,12 +795,28 @@ (OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL, DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(5)), maps cancelJobMaps ); break; case 5: // 删除定时任务job QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL); break; case 7: // 查询自动结束行程时间 Integer arriveTime = xpSystemSettingClient.getOrderFinishTime().getData(); // 添加自动结束行程定时任务job Map<String, ? extends Object> endTripJobMaps = new ImmutableMap.Builder<String, Long>(). put("id", xpOrder.getId()) .build(); QuartzManager.addJob( EndTripJob.class, (EndTripJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.END_TRIP, DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(arriveTime)), endTripJobMaps ); break; } baseMapper.updateById(xpOrder); @@ -925,6 +944,14 @@ return true; } @Override public XpVehicle queryVehicleByOrderId(Long orderId, String uid) { XpOrder xpOrder = this.getById(orderId); XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); return xpVehicle; } /** * 获取订单数量 * @param dto xp-robotaxi-vehicleConvoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -7,9 +7,12 @@ import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.feignClient.maintenance.XpVehiclePreparationClient; import com.xiaopeng.api.model.query.XpVehiclePreparationPageQuery; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.vehicleConvoy.VehicleTemperatureVo; import com.xiaopeng.api.model.vehicleConvoy.XpVehicleAnnualRecord; import com.xiaopeng.api.vo.maintenance.XpVehiclePreparationDetailVO; import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandCallbackVo; @@ -38,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; @@ -45,6 +49,7 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * <p> @@ -61,6 +66,7 @@ public class XpVehicleController { private final IXpVehicleService xpVehicleService; private final XpOrderClient xpOrderClient; private final IXpVehicleAnnualRecordService xpVehicleAnnualRecordService; private final XpVehiclePreparationClient xpVehiclePreparationClient; @@ -453,7 +459,7 @@ */ @ApiOperation(value = "打开车门操作", tags = {"小程序-业务流程"}) @PostMapping("/api/v1/order/vehicle/unlock") public R<String> unlock(@RequestBody UnlockAppletDTO dto) { public R<Integer> unlock(@RequestBody UnlockAppletDTO dto) { return R.ok(xpVehicleService.unlock(dto)); } @@ -462,8 +468,19 @@ */ @ApiOperation(value = "打开设置温度", tags = {"小程序-业务流程"}) @PostMapping("/api/v1/order/ac/set-temperature") public R<String> setTemperature(@RequestBody SetTemperatureDTO dto) { public R<Integer> setTemperature(@RequestBody SetTemperatureDTO dto) { return R.ok(xpVehicleService.setTemperature(dto)); } /** * 业务流程-通过订单id查询当前车辆温度 */ @ApiOperation(value = "通过订单id查询当前车辆温度", tags = {"小程序-业务流程"}) @GetMapping("/api/v1/order/queryTemperatureByOrderId") public R<VehicleTemperatureVo> queryTemperatureByOrderId(@RequestParam Long orderId, HttpServletRequest request) { String uid = request.getHeader("XP-Uid"); VehicleTemperatureVo vehicleTemperatureVo = xpVehicleService.queryTemperatureByOrderId(orderId,uid); return R.ok(vehicleTemperatureVo); } } xp-robotaxi-vehicleConvoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/dto/SetTemperatureDTO.java
@@ -11,9 +11,9 @@ public class SetTemperatureDTO implements Serializable { @ApiModelProperty(value = "订单id") private Long order_id; private Long orderId; @ApiModelProperty(value = "设置温度值") private Integer target_temperature; private Integer targetTemperature; } xp-robotaxi-vehicleConvoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/dto/UnlockAppletDTO.java
@@ -11,9 +11,9 @@ public class UnlockAppletDTO implements Serializable { @ApiModelProperty(value = "订单id") private Long order_id; private Long orderId; @ApiModelProperty(value = "要开启的车门类型,取值: \"door\" — 主副驾车门 \"trunk\" — 后备箱") private String door_type; private String doorType; } xp-robotaxi-vehicleConvoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.vehicleConvoy.VehicleTemperatureVo; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.vehicleConvoy.model.dto.*; import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; @@ -60,14 +61,14 @@ * @param dto 车门解锁/后备箱解锁参数 * @return */ String unlock(UnlockAppletDTO dto); Integer unlock(UnlockAppletDTO dto); /** * 车辆详情-设定温度 * @param dto 设定温度参数 * @return */ String setTemperature(SetTemperatureDTO dto); Integer setTemperature(SetTemperatureDTO dto); /** * 新增车辆 @@ -156,4 +157,12 @@ * @param query 查询参数 */ List<XpVehicle> operationVehicleExportList(OperationVehicleExportQuery query); /** * 查询车辆温度 * * @param orderId 订单ID * @return 车辆温度 */ VehicleTemperatureVo queryTemperatureByOrderId(Long orderId,String uid); } xp-robotaxi-vehicleConvoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -12,6 +12,7 @@ import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.model.vehicleConvoy.XpVehicleAnnualRecord; import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo; import com.xiaopeng.api.vo.vehicleConvoy.VehicleTemperatureVo; import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandEnum; import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandParamVo; import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandVo; @@ -119,9 +120,9 @@ } @Override public String unlock(UnlockAppletDTO dto) { public Integer unlock(UnlockAppletDTO dto) { // 查询订单 XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrder_id()).getData(); XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrderId()).getData(); if(Objects.isNull(xpOrder)){ throw new ServiceException("未查询到有效订单信息", I18nKeyConstant.ORDER_NOT_EXISTS); } @@ -133,18 +134,25 @@ VehiclesCommandVo vehiclesCommandVo = new VehiclesCommandVo(); vehiclesCommandVo.setUid(xpOrder.getAppUserId()); vehiclesCommandVo.setVin(xpVehicle.getVehicleVin()); if("door".equals(dto.getDoor_type())){ if("door".equals(dto.getDoorType())){ vehiclesCommandVo.setCommandCode(VehiclesCommandEnum.DOOR_UNLOCK); }else { vehiclesCommandVo.setCommandCode(VehiclesCommandEnum.DOOR_TRUNK_OPEN); } return vehicleControlUtil.vehiclesCommand(vehiclesCommandVo); try{ String result = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo); log.info("车辆控制结果:{}", result); return 1; }catch (Exception e){ log.error("车辆控制异常:{}", e.getMessage()); return 0; } } @Override public String setTemperature(SetTemperatureDTO dto) { public Integer setTemperature(SetTemperatureDTO dto) { // 查询订单 XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrder_id()).getData(); XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrderId()).getData(); if(Objects.isNull(xpOrder)){ throw new ServiceException("未查询到有效订单信息", I18nKeyConstant.ORDER_NOT_EXISTS); } @@ -158,9 +166,16 @@ vehiclesCommandVo.setVin(xpVehicle.getVehicleVin()); vehiclesCommandVo.setCommandCode(VehiclesCommandEnum.HVAC_TEMP_SET); VehiclesCommandParamVo vehiclesCommandParamVo = new VehiclesCommandParamVo(); vehiclesCommandParamVo.setDegree(dto.getTarget_temperature()); vehiclesCommandParamVo.setDegree(dto.getTargetTemperature()); vehiclesCommandVo.setExtParam(vehiclesCommandParamVo); return vehicleControlUtil.vehiclesCommand(vehiclesCommandVo); try{ String result = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo); log.info("车辆控制结果:{}", result); return 1; }catch (Exception e){ log.error("车辆控制异常:{}", e.getMessage()); return 0; } } @Override @@ -573,4 +588,24 @@ } return list; } @Override public VehicleTemperatureVo queryTemperatureByOrderId(Long orderId,String uid) { XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); if(Objects.isNull(xpOrder)){ throw new ServiceException("未查询到有效订单信息", I18nKeyConstant.ORDER_NOT_EXISTS); } XpVehicle xpVehicle = this.getById(xpOrder.getVehicleId()); if(Objects.isNull(xpVehicle)){ throw new ServiceException("未查询到有效车辆信息", I18nKeyConstant.VEHICLE_NOT_EXISTS); } try{ VehicleTemperatureVo vehicleTemperatureVo = vehicleControlUtil.queryVehicleTemperature(uid, xpVehicle.getVehicleVin()); log.info("查询车辆温度成功:{}",vehicleTemperatureVo); return vehicleTemperatureVo; }catch (Exception e){ log.error("查询车辆温度失败",e); return new VehicleTemperatureVo(); } } }