sql/增量sql/xprt_order.sql
@@ -0,0 +1,9 @@ ALTER TABLE `xp_order`.`xp_order_reassign` ADD COLUMN `reassign_num` int(0) NULL DEFAULT 0 COMMENT '改派次数 默认0' AFTER `update_by`, ADD COLUMN `is_complete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否完成 0=未完成 1=已完成' AFTER `reassign_num`, ADD COLUMN `longitude` double(20, 10) NULL COMMENT '经度' AFTER `is_complete`, ADD COLUMN `latitude` double(20, 10) NULL COMMENT '纬度' AFTER `longitude`, ADD COLUMN `app_user_id` bigint NULL COMMENT '用户id' AFTER `latitude`; ALTER TABLE `xp_order`.`xp_order` ADD COLUMN `car_abnormal` tinyint(1) NULL DEFAULT 0 COMMENT '车辆是否故障 0-否 1-是' AFTER `change_money_flag`; xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -140,7 +140,7 @@ return R.ok(); } XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId()); //状态(1=未使用,2=已使用,3=已过期) //状态(1=未使用,2=已使用,3=已过期 0=待领取 4=占用中) if(appUserCoupon.getExpirationTime().isAfter(LocalDateTime.now())){ appUserCoupon.setStatus(3); }else{ xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ReassignOrderDTO.java
@@ -21,4 +21,7 @@ @ApiModelProperty(value = "订单号") private String orderNo; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/ReassignOrderClientFallbackFactory.java
@@ -23,4 +23,5 @@ }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderReassignClientFallbackFactory.java
New file @@ -0,0 +1,49 @@ package com.xiaopeng.api.factory.order; import com.xiaopeng.api.feignClient.order.XpOrderReassignClient; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import java.util.List; public class XpOrderReassignClientFallbackFactory implements FallbackFactory<XpOrderReassignClient> { private static final Logger log = LoggerFactory.getLogger(XpOrderReassignClientFallbackFactory.class); String msg ="订单改派"; @Override public XpOrderReassignClient create(Throwable cause) { log.error(msg+"服务调用失败: {}", cause.getMessage()); return new XpOrderReassignClient(){ @Override public R<List<XpOrderReassign>> findListOrderReassign() { log.error(msg+"获取列表失败: {}", cause.getMessage()); return R.fail("获取列表失败"); } @Override public R<Long> saveOrderReassign(XpOrderReassign entity) { log.error(msg+"保存失败: {}", cause.getMessage()); return R.fail(msg+"保存失败"); } @Override public R<Long> updateByIdOrderReassign(XpOrderReassign entity) { log.error(msg+"修改失败: {}", cause.getMessage()); return R.fail(msg+"修改失败"); } @Override public R<Long> updateCompleteOrderReassign(XpOrderReassign entity) { log.error(msg+"修改失败: {}", cause.getMessage()); return R.fail(msg+"修改失败"); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -10,7 +10,10 @@ import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; /** * 订单Feign客户端 @@ -149,4 +152,5 @@ } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderReassignClient.java
New file @@ -0,0 +1,55 @@ package com.xiaopeng.api.feignClient.order; import com.xiaopeng.api.factory.order.XpOrderClientFallbackFactory; import com.xiaopeng.api.factory.order.XpOrderReassignClientFallbackFactory; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; /** * 订单改派 Feign客户端 * * @author mitao */ @FeignClient(contextId = "XpOrderReassignClient", value = ServiceNameConstantsEnum.XP_ORDER_SERVICE, fallbackFactory = XpOrderReassignClientFallbackFactory.class) public interface XpOrderReassignClient { //-----------------------订单改派--------------------------------------------- /** * 获取获取订单改派数据 * @return */ @PostMapping("/logan/inner/orderReassign/findList") R<List<XpOrderReassign>> findListOrderReassign() ; /** * 保存(内部接口) * @return */ @PostMapping("/logan/inner/orderReassign/save") R<Long> saveOrderReassign(@RequestBody XpOrderReassign entity) ; /** * 修改数据 * @return */ @PostMapping("/logan/inner/orderReassign/update") R<Long> updateByIdOrderReassign(@RequestBody XpOrderReassign entity) ; /** * 修改是否完成 * @return */ @PostMapping("/logan/inner/orderReassign/updateComplete") R<Long> updateCompleteOrderReassign(@RequestBody XpOrderReassign entity) ; //-----------------------订单改派--------------------------------------------- } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java
@@ -47,7 +47,7 @@ @TableField(updateStrategy = FieldStrategy.IGNORED) private LocalDateTime useTime; @ApiModelProperty(value = "状态(1=未使用,2=已使用,3=已过期)") @ApiModelProperty(value = "状态(1=未使用,2=已使用,3=已过期 0=待领取 4=占用中)") private Integer status; @ApiModelProperty(value = "优惠券类型(1=抵扣,2=满减)") xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -235,4 +235,8 @@ private Integer num; @ApiModelProperty(value = "是否改价标识 0-否 1-是") private Boolean changeMoneyFlag; @ApiModelProperty(value = "车辆是否故障 0-否 1-是") private Boolean carAbnormal; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrderReassign.java
@@ -1,8 +1,6 @@ package com.xiaopeng.api.model.order; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.*; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -36,6 +34,9 @@ @ApiModelProperty(value = "订单id") private Long orderId; @TableField(exist = false) @ApiModelProperty(value = "订单号") private String orderNumber; @ApiModelProperty(value = "操作人员id") private Long userId; @@ -58,4 +59,31 @@ @ApiModelProperty(value = "改派原因") private String reassignReason; @ApiModelProperty(value = "改派次数默认为0 改派多次后 还未找到车则标记订单取消") private Integer reassignNum; @ApiModelProperty(value = "是否完成 0=未完成 1=已完成") private Boolean isComplete; @ApiModelProperty(value = "经度") private Double longitude; @ApiModelProperty(value = "纬度") private Double latitude; @ApiModelProperty(value = "用户id") @TableField(updateStrategy = FieldStrategy.NEVER) private Long appUserId; @ApiModelProperty(value = "备注") private String remarks; public XpOrderReassign() { } public XpOrderReassign(Long orderId, Long oldVehicleId, Long oldFleetId,Double longitude,Double latitude, String reassignReason) { this.reassignNum = 1; this.orderId = orderId; this.oldVehicleId = oldVehicleId; this.oldFleetId = oldFleetId; this.reassignReason = reassignReason; } } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -106,7 +106,8 @@ taskBuilder.setSequence(1); taskBuilder.setOrderPhase(OrderPhase.ROUTE_TO_CRUISE); taskListBuilder.addTasks(taskBuilder.build()); }else if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.USER_ORDER)){ } else if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.USER_ORDER)){ //乘客单 for (int i = 1; i < 3; i++) { RtTask.Builder taskBuilder = RtTask.newBuilder(); xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -508,8 +508,8 @@ if (vehicle != null) { // 修改车辆状态 XpVehicle vehicle1 = new XpVehicle(); vehicle1.setState(0); vehicle1.setOperatingStatus(4); vehicle1.setState(0);//车辆接单状态 1接单中 0空闲 vehicle1.setOperatingStatus(4);//运营状态 1运营中 2维修中 3已收车 4车辆异常 vehicle1.setId(vehicle.getId()); xpVehicleClient.updateVehicleById(vehicle1); log.info("车辆故障,车辆状态修改0 {}", vehicle.getPlateNumber()); @@ -522,20 +522,15 @@ userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); } //status 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成 List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点 List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点 status=2、3、4、5 add(OrderStatusEnum.READY_DEPART.getCode());add(OrderStatusEnum.PICK_UP.getCode()); add(OrderStatusEnum.PICK_UP_GUESTS.getCode());add(OrderStatusEnum.PASSENGER_BOARDED.getCode()); }}; if(xpOrder.getStatus().equals(OrderStatusEnum.IN_SERVICE.getCode()) || xpOrder.getStatus().equals(OrderStatusEnum.SEE_OFF_GUESTS.getCode()) ){ //6=服务中 7=待客下车 在行驶中 修改订单-已完成 需要处理订单金额 //单独写个修改订单的方法。 // ff if(xpOrder.getStatus().equals(OrderStatusEnum.IN_SERVICE.getCode()) ){ //6=服务中 在行驶中 修改订单-已完成 需要处理订单金额 //行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额 再将状态修改成8 xpOrderClient.carAbnormalUpdateOrderStatus(Long.parseLong(orderId)); }else if(notDrive.contains(xpOrder.getStatus())){//在接驾中 车辆出现故障 重新派单 // TODO 重新派单 }else if(notDrive.contains(xpOrder.getStatus())){//在接驾中 车辆出现故障 重新派单 改派 ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO(); reassignOrderDTO.setUid(xpOrder.getAppUserId().toString()); reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber()); xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/CacheConstants.java
@@ -146,4 +146,12 @@ * 用户默认路线偏好(高德 strategy) */ public static final String USER_ROUTE_PREFERENCE = "USER_ROUTE_PREFERENCE:"; /** * 重新派单 改派 */ public static final String reassign_Order = "reassign_order"; } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/ReassignOrderController.java
@@ -1,13 +1,20 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.api.dto.operation.ReassignOrderDTO; import com.xiaopeng.api.feignClient.order.XpOrderReassignClient; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.operation.utils.TaskOrderUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; 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; import java.util.List; /** * token 控制 @@ -19,11 +26,49 @@ public class ReassignOrderController { @Autowired private TaskOrderUtil taskOrderUtil; @Resource private RedisService redisService; @Resource private XpOrderReassignClient xpOrderReassignClient; /** * 重新改派 * @param dto * @return */ @PostMapping("/logan/inner/v1/order/reassignOrder") public R<String> reassignOrder(@RequestBody ReassignOrderDTO dto) { taskOrderUtil.reassignPushOrder(dto.getCount(),dto.getUid(),dto.getLongitude(),dto.getLatitude(),dto.getOrderNo()); //保存改派记录 XpOrderReassign reassign = taskOrderUtil.reassignPushOrder(dto.getCount(), dto.getUid(), dto.getLongitude(), dto.getLatitude(), dto.getOrderNo()); //未找到车 系统强制取消订单,状态流转至“系统自动取消”。 自动退回优惠卷 xpOrderReassignClient.saveOrderReassign(reassign); return R.ok(); } /** * 5秒执行一次 *将需要改派的订单信息保存在redis ,ReassignOrderController 这个类的 taskReassignPushOrder 方法异步 处理信息。 */ @Scheduled(cron = "0/3 * * * * ?") public void taskReassignPushOrder() { // System.out.println("3秒执行一次"); //从redis 获取数据 同步 处理数据 R<List<XpOrderReassign>> r = xpOrderReassignClient.findListOrderReassign(); if(r.getCode()==200 && !r.getData().isEmpty()){ for (XpOrderReassign reassign : r.getData()) { //改派次数小4 if(!reassign.getIsComplete() && reassign.getReassignNum()<=3){ XpOrderReassign reassign2 = taskOrderUtil.reassignPushOrder(10, String.valueOf(reassign.getAppUserId()),reassign.getLongitude(),reassign.getLatitude(),reassign.getOrderNumber()); xpOrderReassignClient.saveOrderReassign(reassign2); } } } } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -2,7 +2,6 @@ import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson2.JSON; import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.map.RouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; @@ -18,6 +17,7 @@ import com.xiaopeng.api.model.operation.XpElectronicFence; import com.xiaopeng.api.model.operation.XpTradingStrategy; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.OrderType; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; @@ -28,13 +28,13 @@ import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.operation.config.UidVinBindingConfig; import com.xiaopeng.operation.dto.PriorityMatchResult; import com.xiaopeng.operation.mapper.XpElectronicFenceMapper; import com.xiaopeng.operation.service.IXpElectronicFenceAreaService; import com.xiaopeng.operation.service.IXpTradingStrategyService; import com.xiaopeng.operation.service.XpPointService; import com.xiaopeng.operation.config.UidVinBindingConfig; import com.xiaopeng.operation.dto.PriorityMatchResult; import com.xiaopeng.operation.service.UidVinPriorityMatcher; import com.xiaopeng.operation.service.XpPointService; import com.xiaopeng.operation.utils.mango.VehiclePositionService; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -107,8 +107,6 @@ // 自定义线程池 private static final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(20); static { threadPoolTaskExecutor.setCorePoolSize(20); @@ -1148,31 +1146,44 @@ // yong id 去查目的地坐标,判断是否小于800 return false; } /** * 订单处理 * 重新改派 * 1.优化好点 做个倒计时的异步改派多次 * @param count 轮数 * @param uid * @param uid 用户id * @param longitude 经度 * @param latitude 纬度 * @param orderNo 订单号 */ @SneakyThrows public void reassignPushOrder(int count, String uid, Double longitude, Double latitude, String orderNo) { System.out.println("进入推单环环节"); public XpOrderReassign reassignPushOrder(int count, String uid, Double longitude, Double latitude, String orderNo) { log.info("进入推单环环节"); if (count == 0) { count = 1; } // 订单状态 R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo); if (xpOrderR.getCode() != 200) { return; return null; } // List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点 status=2、3、4、5 // add(OrderStatusEnum.READY_DEPART.getCode());add(OrderStatusEnum.PICK_UP.getCode()); // add(OrderStatusEnum.PICK_UP_GUESTS.getCode());add(OrderStatusEnum.PASSENGER_BOARDED.getCode()); // }}; if (xpOrderR.getData().getStatus() != 1) { return; return null; } XpOrder data = xpOrderR.getData(); XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null); boolean orderCarStatus = false;//未派到车 默认 XpOrderReassign entity = new XpOrderReassign(data.getId(),data.getVehicleId(),data.getFleetId(),longitude,latitude,"接驾故障"); entity.setIsComplete(false); entity.setAppUserId(Long.valueOf(uid)); //循环找车 for (int i = 0; i < count; i++) { log.info("进入找车环节"); @@ -1220,29 +1231,23 @@ // 调用推送服务 orderId + carVin orderMissionClient.pushOrder(pushOrderDto); //接单成功 将 修改 订单的状态=1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成) orderCarStatus = true; entity.setNewVehicleId(vehicleId1.getId()); entity.setNewFleetId(vehicleId1.getFleetId()); entity.setIsComplete(true); // //接单成功 将 修改 订单的状态=1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成) // orderCarStatus = true; xpOrderClient.updateOrderStatus(data.getId(), OrderStatusEnum.PENDING_ORDER.getCode()); redisService.setCacheObject("ORDER_STATUS:" + data.getId(), OrderStatusEnum.PENDING_ORDER.getCode(), 24L, TimeUnit.HOURS); break; } catch (Exception e) { throw new RuntimeException(e); } finally { lock.unlock(); } } //未找到车 系统强制取消订单,状态流转至“系统自动取消”。 自动退回优惠卷 if(!orderCarStatus){ xpOrderClient.updateOrderStatus(data.getId(),OrderStatusEnum.CANCELED.getCode()); redisService.setCacheObject("ORDER_STATUS:" + data.getId(), OrderStatusEnum.CANCELED.getCode(), 24L, TimeUnit.HOURS); //有优惠卷 自动退回优惠卷 if(data.getCouponId() != null ){ UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); useUserCouponDto.setUserCouponId(data.getCouponId() ); xpAppUserCouponClient.backUserCoupon(useUserCouponDto); } } //保存改派记录 return entity; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderReassignController.java
New file @@ -0,0 +1,111 @@ package com.xiaopeng.order.controller; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.order.service.IXpOrderReassignService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; 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; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.TimeUnit; /** * <p> * 订单改派 前端控制器 * </p> * * @author mitao * @since 2026-02-03 */ @RestController @Api(tags = "订单改派") @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpOrderReassignController { @Resource private IXpOrderReassignService xpOrderReassignService; /** * 获取获取订单改派数据(内部接口) * * @return */ @ApiOperation(value = "获取获取订单改派数据", tags = {"内部接口"}) @PostMapping("/logan/inner/orderReassign/findList") public R<List<XpOrderReassign>> findListOrderReassign() { return R.ok(xpOrderReassignService.findListNotComplete()); } /** * 保存(内部接口) * @return */ @ApiOperation(value = "保存", tags = {"内部接口"}) @PostMapping("/logan/inner/orderReassign/save") public R<Long> saveOrderReassign(@RequestBody XpOrderReassign entity) { entity.setCreateTime(LocalDateTime.now()); entity.setUpdateTime(LocalDateTime.now()); boolean save = xpOrderReassignService.saveInfo(entity); if (!save) { return R.fail("保存失败"); } return R.ok(entity.getId()); } /** * 修改数据 * @return */ @ApiOperation(value = "修改数据", tags = {"内部接口"}) @PostMapping("/logan/inner/orderReassign/update") public R<Long> updateByIdOrderReassign(@RequestBody XpOrderReassign entity) { entity.setUpdateTime(LocalDateTime.now()); boolean save = xpOrderReassignService.updateById(entity); if (!save) { return R.fail("修改失败"); } return R.ok(); } /** * 修改是否完成 * @return */ @ApiOperation(value = "修改是否完成", tags = {"内部接口"}) @PostMapping("/logan/inner/orderReassign/updateComplete") public R<Long> updateCompleteOrderReassign(@RequestBody XpOrderReassign entity) { LambdaUpdateWrapper<XpOrderReassign> update = new LambdaUpdateWrapper<>(); update.eq(XpOrderReassign::getIsComplete,false); update.eq(XpOrderReassign::getReassignNum,3);//改派小于3次 update.set(XpOrderReassign::getUpdateTime,LocalDateTime.now()); update.set(XpOrderReassign::getReassignNum,entity.getReassignNum()); if(entity.getIsComplete()){ update.set(XpOrderReassign::getNewVehicleId,entity.getNewVehicleId()); update.set(XpOrderReassign::getNewFleetId,entity.getNewFleetId()); update.set(XpOrderReassign::getIsComplete,true); } boolean b = xpOrderReassignService.update(update); if (!b) { return R.fail("修改失败"); } return R.ok(); } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/mapper/XpOrderReassignMapper.java
@@ -3,6 +3,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.order.XpOrderReassign; import java.util.List; /** * <p> * 订单改派记录 Mapper 接口 @@ -13,4 +16,7 @@ */ public interface XpOrderReassignMapper extends BaseMapper<XpOrderReassign> { List<XpOrderReassign> findListNotComplete(); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderReassignService.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.order.XpOrderReassign; import java.util.List; /** * <p> * 订单改派记录 服务类 @@ -13,4 +15,7 @@ */ public interface IXpOrderReassignService extends IService<XpOrderReassign> { List<XpOrderReassign> findListNotComplete(); boolean saveInfo(XpOrderReassign entity); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderReassignServiceImpl.java
@@ -1,10 +1,18 @@ package com.xiaopeng.order.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.order.mapper.XpOrderReassignMapper; import com.xiaopeng.order.service.IXpOrderReassignService; import com.xiaopeng.order.service.IXpOrderService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.TimeUnit; /** * <p> @@ -17,4 +25,52 @@ @Service public class XpOrderReassignServiceImpl extends ServiceImpl<XpOrderReassignMapper, XpOrderReassign> implements IXpOrderReassignService { @Resource private IXpOrderService xpOrderService; /** * 获取没有完成的数据 * @return */ @Override public List<XpOrderReassign> findListNotComplete(){ return baseMapper.findListNotComplete(); } public XpOrderReassign getByOrderId(Long orderId){ LambdaQueryWrapper<XpOrderReassign> query = new LambdaQueryWrapper<>(); query.eq(XpOrderReassign::getOrderId,orderId); return super.getOne(query); } @Override public boolean saveInfo(XpOrderReassign entity){ boolean b = false; XpOrderReassign byOrderId = getByOrderId(entity.getOrderId()); entity.setUpdateTime(LocalDateTime.now()); if(byOrderId == null){ entity.setCreateTime(LocalDateTime.now()); b = save(entity); }else{ boolean canceled = false; //修改数据 改派大于等于3次后将取消订单 entity.setId(byOrderId.getId()); entity.setReassignNum(byOrderId.getReassignNum()+1); if(!entity.getIsComplete() && entity.getReassignNum()>=3){//在改派订单中未获取到车辆 并改派次数 >=3 则直接完成 entity.setIsComplete(true); entity.setRemarks("改派3此后未获取匹配车辆,系统强制取消订单"); canceled = true; } b = updateById(entity); //是否取消订单 if(canceled){ xpOrderService.updateOrderStatus(entity.getOrderId(),OrderStatusEnum.CANCELED.getCode()); } } return b; } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1806,9 +1806,15 @@ Long appUserId = xpOrder.getAppUserId(); // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); // 订单的状态 status =1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成) switch (status) { case 0://去掉订单 优惠卷需要返回 case 0://去掉订单 优惠卷需要返回 @todo yyy 这里可能不需要这个步骤 //取消订单会将优惠卷 从占用修改成未使用 if(xpOrder.getCouponId() != null){ UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); useUserCouponDto.setUserCouponId(xpOrder.getCouponId() ); xpAppUserCouponClient.backUserCoupon(useUserCouponDto); } break; case 4: // 查询起点点位 @@ -1928,6 +1934,8 @@ jobMaps ); break; default: break; } xpOrder.setStatus(status); xpOrder.setAppUserId(null); @@ -1956,7 +1964,7 @@ // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); Long appUserId = xpOrder.getAppUserId(); xpOrder.setCarAbnormal(true);//车辆是否故障 0-否 1-是 xpOrder.setGetoffTime(LocalDateTime.now()); // 解析下车地点 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); @@ -1981,6 +1989,7 @@ this.updateById(xpOrder); //结束行程,修改状态和计算费用 this.endTrip(xpOrder.getId(),appUserId.toString()); return R.ok(); } @@ -2080,7 +2089,8 @@ order.setOrderMoney(totalPrice); order.setAppUserId(null); baseMapper.updateById(order); } else { } else { //动态计费 if (pricing.getPricingType() == 1) { @@ -2865,22 +2875,25 @@ order.setStatus(9); order.setAppUserId(null); if(order.getCouponId()!=null){ UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); useUserCouponDto.setUserCouponId(order.getCouponId()); R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto); if(decimalR.getCode()==200){ order.setCouponMoney(decimalR.getData()); if(order.getCouponMoney().compareTo(order.getOrderMoney())>0){ order.setPayMoney(BigDecimal.ZERO); order.setCouponMoney(order.getOrderMoney()); }else { order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData())); if(order.getCarAbnormal()){//是故障单 支付金额未0 @todo yyy 这里应该有问题 order.setPayMoney(BigDecimal.ZERO); }else{ if(order.getCouponId()!=null){ UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); useUserCouponDto.setUserCouponId(order.getCouponId()); R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto); if(decimalR.getCode()==200){ order.setCouponMoney(decimalR.getData()); if(order.getCouponMoney().compareTo(order.getOrderMoney())>0){ order.setPayMoney(BigDecimal.ZERO); order.setCouponMoney(order.getOrderMoney()); }else { order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData())); } } } } baseMapper.updateById(order); redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 9, 24L, TimeUnit.HOURS); return R.ok(); xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderReassignMapper.xml
@@ -9,4 +9,15 @@ is_deleted, create_time, update_time, create_by, update_by </sql> <select id="findListNotComplete" resultType="com.xiaopeng.api.model.order.XpOrderReassign"> SELECT a.*,b.order_number as order_number FROM xp_order_reassign a inner join xp_order b on b.id = a.order_id WHERE a.is_deleted = 0 AND a.is_complete = 0 ORDER BY a.order_id DESC </select> </mapper>