xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -129,6 +129,29 @@ return R.ok(appUserCoupon.getMoney()); } /** * 退回用户的优惠卷 * @param dto * @return */ @PostMapping("/logan/inner/appUserCoupon/backUserCoupon") public R<BigDecimal> backUserCoupon(@RequestBody UseUserCouponDto dto) { if(dto.getUserCouponId() == null){ return R.ok(); } XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId()); //状态(1=未使用,2=已使用,3=已过期) if(appUserCoupon.getExpirationTime().isAfter(LocalDateTime.now())){ appUserCoupon.setStatus(3); }else{ appUserCoupon.setStatus(1); } appUserCoupon.setUseTime(null); appUserCoupon.setAppUserId(null); xpAppUserCouponService.updateById(appUserCoupon); return R.ok(); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
@@ -9,7 +9,6 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; @@ -30,4 +29,13 @@ R<BigDecimal> useUserCoupon(@RequestBody UseUserCouponDto dto); /** * 退回用户的优惠卷 * @param dto * @return */ @PostMapping("/logan/inner/appUserCoupon/backUserCoupon") R<BigDecimal> backUserCoupon(@RequestBody UseUserCouponDto dto); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -130,6 +130,13 @@ @PostMapping("/logan/inner/v1/order/updateOrderStatus") R<String> updateOrderStatus(@RequestParam Long orderId, @RequestParam Integer status); /** * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8 * @param orderId * @return */ @PostMapping("/logan/inner/v1/order/carAbnormalUpdateOrderStatus") R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId); /** xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java
@@ -1,12 +1,6 @@ package com.xiaopeng.api.model.account; import java.math.BigDecimal; 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 com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; @@ -14,6 +8,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -47,6 +44,7 @@ @ApiModelProperty(value = "使用时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField(updateStrategy = FieldStrategy.IGNORED) private LocalDateTime useTime; @ApiModelProperty(value = "状态(1=未使用,2=已使用,3=已过期)") xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -1,6 +1,7 @@ package com.xiaopeng.api.model.order; import com.baomidou.mybatisplus.annotation.*; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -170,6 +171,9 @@ @ApiModelProperty(value = "优惠券id") private Long couponId; /** * {@link OrderStatusEnum } */ @ApiModelProperty(value = "状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成") private Integer status; xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -498,7 +498,13 @@ log.info("车辆故障,车辆状态修改0 {}", vehicle.getPlateNumber()); } }else { //正常订单 //正常订单 车辆故障 /* 1.将订单信息车辆的 查询出来 设置故障状态 2.解除用户和车的关系 3.如果是 接驾中的车需要重新派车 4.如果是行驶中的车需要将订单结束 计算金额 */ XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData(); vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); if (vehicle != null) { @@ -517,6 +523,20 @@ cancelTaxiPassengerVo.setAppId(appid); userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); } //status 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成 List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点 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 xpOrderClient.carAbnormalUpdateOrderStatus(Long.parseLong(orderId)); }else if(notDrive.contains(xpOrder.getStatus())){//在接驾中 车辆出现故障 重新派单 // TODO 重新派单 ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO(); reassignOrderDTO.setUid(xpOrder.getAppUserId().toString()); @@ -529,6 +549,7 @@ reassignOrderDTO.setLongitude(longitude); reassignOrderDTO.setLatitude(latitude); reassignOrderClient.reassignOrder(reassignOrderDTO); } } //添加车辆异常任务和发送消息 xpTaskClient.saveVehicleAccidentError(vehicle.getId()); @@ -1284,8 +1305,12 @@ if(xpOrder.getStatus() == 0 || xpOrder.getStatus() >= 8){ return; } if(xpOrder.getStatus() > 5 && xpOrder.getStatus() < 8){ //行程中取消订单,按照行程结束处理 List<Integer> xczqx = new ArrayList<Integer>(){{ add(OrderStatusEnum.IN_SERVICE.getCode());//服务中 add(OrderStatusEnum.SEE_OFF_GUESTS.getCode());//SEE_OFF_GUESTS }}; if(xczqx.contains(xpOrder.getStatus())){//行程中取消订单,按照行程结束处理 buildPushOrderStatus(cmd, orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence); xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode()); redisService.setCacheObject("ORDER_STATUS:" + orderId, OrderStatusEnum.SEE_OFF_GUESTS.getCode(), 24L, TimeUnit.HOURS); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -2,11 +2,13 @@ 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; import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; @@ -24,6 +26,7 @@ import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.core.constant.Constants; 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.mapper.XpElectronicFenceMapper; import com.xiaopeng.operation.service.IXpElectronicFenceAreaService; @@ -97,6 +100,8 @@ @Resource private UidVinPriorityMatcher uidVinPriorityMatcher; @Resource private XpAppUserCouponClient xpAppUserCouponClient; // 自定义线程池 @@ -1105,6 +1110,8 @@ } XpOrder data = xpOrderR.getData(); XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null); boolean orderCarStatus = false;//未派到车 默认 //循环找车 for (int i = 0; i < count; i++) { log.info("进入找车环节"); List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(longitude, latitude, xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount()); @@ -1151,12 +1158,29 @@ // 调用推送服务 orderId + carVin orderMissionClient.pushOrder(pushOrderDto); //接单成功 将 修改 订单的状态=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); } 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); } } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -516,6 +516,16 @@ } /** * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8 */ @ApiOperation(value = "行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8") @PostMapping("/logan/inner/v1/order/carAbnormalUpdateOrderStatus") public R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId ) { // Integer status = OrderStatusEnum.SEE_OFF_GUESTS.getCode(); return xpOrderService.carAbnormalUpdateOrderStatus(orderId); } /** * 业务流程-通过订单id查询车辆信息 */ @ApiOperation(value = "通过订单id查询车辆信息", tags = {"小程序-业务流程"}) xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -159,6 +159,11 @@ */ R<String> updateOrderStatus(Long orderId, Integer status); /** * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8 */ R<String> carAbnormalUpdateOrderStatus(Long orderId); Boolean endTrip(Long orderId, String uid); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1807,6 +1807,9 @@ // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); switch (status) { case 0://去掉订单 优惠卷需要返回 break; case 4: // 查询起点点位 Long startPointId = xpOrder.getStartPointId(); @@ -1933,6 +1936,56 @@ return R.ok(); } /** * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8 */ @Override public R<String> carAbnormalUpdateOrderStatus(Long orderId){ XpOrder xpOrder = this.getById(orderId); if (Objects.isNull(xpOrder)) { return R.fail("订单不存在"); } if (xpOrder.getStatus() == 0) { return R.fail("订单已取消"); } if(xpOrder.getStatus() >= 8){ return R.fail("订单已结束"); } // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); Long appUserId = xpOrder.getAppUserId(); xpOrder.setGetoffTime(LocalDateTime.now()); // 解析下车地点 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); if(Objects.nonNull(vehiclePosition)){ GeoJsonPoint point = vehiclePosition.getPoint(); if(Objects.nonNull(point)){ double x = point.getX(); double y = point.getY(); Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y)); xpOrder.setGetoffAddress(geocode.get("address")); } } //计算行驶总距离和时长 List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(new Query().addCriteria(Criteria.where("orderId").is(xpOrder.getId())), OrderTrajectory.class); Double reduce = orderTrajectoryList.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum); xpOrder.setMileageKilometers(new BigDecimal(reduce).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN).doubleValue()); long duration = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - xpOrder.getTripBegin().toEpochSecond(ZoneOffset.of("+8")); xpOrder.setDuration(new BigDecimal(duration).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue()); xpOrder.setStatus(OrderStatusEnum.SEE_OFF_GUESTS.getCode());//待客下车 xpOrder.setAppUserId(null); this.updateById(xpOrder); //结束行程,修改状态和计算费用 this.endTrip(xpOrder.getId(),appUserId.toString()); return R.ok(); } @Override public Boolean endTrip(Long orderId, String uid) { List<XpOrderDetail> xpOrderDetails = new ArrayList<>();