1.车辆接驾中异常处理
2.行驶中,用户去掉订单异常处理
3.行驶中,车辆故障异常处理
10个文件已修改
203 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,18 +523,33 @@
                    cancelTaxiPassengerVo.setAppId(appid);
                    userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
                }
                // TODO 重新派单
                ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
                reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
                reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
                reassignOrderDTO.setCount(10);
                RealtimePose pose = systemRuntimeStatus.getPose();
                Wgs naviPose = pose.getNaviPose();
                Double latitude = naviPose.getLatitude();
                Double longitude = naviPose.getLongitude();
                reassignOrderDTO.setLongitude(longitude);
                reassignOrderDTO.setLatitude(latitude);
                reassignOrderClient.reassignOrder(reassignOrderDTO);
                //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());
                    reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
                    reassignOrderDTO.setCount(10);
                    RealtimePose pose = systemRuntimeStatus.getPose();
                    Wgs naviPose = pose.getNaviPose();
                    Double latitude = naviPose.getLatitude();
                    Double longitude = naviPose.getLongitude();
                    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<>();