puzhibing
2026-04-16 46342ddcf5d52ccbf2ae8d8a9a0b14cc0d29b250
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -4,15 +4,12 @@
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaopeng.api.dto.QueryOrderRouteDTO;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.order.AddCruiseMissionDto;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
@@ -21,22 +18,19 @@
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.*;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.order.mangodb.model.OrderTrajectory;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderOperateDTO;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
import com.xiaopeng.order.model.dto.XpOrderReassignDTO;
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;
import com.xiaopeng.order.model.vo.XpOrderDetailVO;
import com.xiaopeng.order.model.vo.XpOrderHistoryVO;
import com.xiaopeng.order.model.vo.XpOrderPageVO;
@@ -57,6 +51,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -64,9 +59,9 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.*;
import static org.bouncycastle.asn1.x500.style.RFC4519Style.uid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
@@ -85,7 +80,7 @@
    private final RedisService redisService;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    @Resource
    private XpVehicleClient xpVehicleClient;
    /**
@@ -95,7 +90,7 @@
     * @return 订单统计数据
     */
    @ApiOperation(value = "获取订单统计数据", tags = {"内部接口"})
    @PostMapping("/inner/order/statistics")
    @PostMapping("/logan/inner/order/statistics")
    public R<OrderStatisticsDTO> getOrderStatistics(@RequestBody StatisticsQueryDTO query) {
        return R.ok(xpOrderService.getOrderStatistics(query));
    }
@@ -105,14 +100,14 @@
     * 查询是否有未支付订单 或 正在进行的订单
     * 返回0 可以下单  1有进行中的订单  8有待支付的
     */
    @PostMapping("/inner/order/has-unpaid-order")
    @PostMapping("/logan/inner/order/has-unpaid-order")
    @ApiOperation(value = "查询是否有未支付订单 或 正在进行的订单", tags = {"内部接口"})
    public R<Long> hasUnPaodOrder(String uid) {
        List<XpOrder> list = xpOrderService.list(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).in(XpOrder::getStatus, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)));
        if (!list.isEmpty()) {
            return R.ok(list.get(0).getId());
        }
        return R.ok(0l);
        return R.ok(0L);
    }
@@ -122,12 +117,12 @@
     * @param orderId 订单id
     * @return 订单详情
     */
    @PostMapping("/inner/order/queryOrderById")
    @PostMapping("/logan/inner/order/queryOrderById")
    public R<XpOrder> queryOrderById(@RequestParam Long orderId) {
        return R.ok(xpOrderService.getById(orderId));
    }
    @PostMapping("/inner/order/queryOrderByOrderNo")
    @PostMapping("/logan/inner/order/queryOrderByOrderNo")
    public R<XpOrder> queryOrderByOrderNo(@RequestParam String orderNo) {
        return R.ok(xpOrderService.getOne(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getOrderNumber, orderNo)));
    }
@@ -137,7 +132,7 @@
     *
     * @return 订单数量
     */
    @PostMapping("/inner/order/getOrderNum")
    @PostMapping("/logan/inner/order/getOrderNum")
    public R<Integer> getOrderNum(@RequestBody GetOrderNumDto dto) {
        return R.ok(xpOrderService.getOrderNum(dto));
    }
@@ -148,7 +143,7 @@
     * @param cityId 开通城市ID
     * @return 进行中订单数量
     */
    @GetMapping("/inner/order/countActiveOrders")
    @GetMapping("/logan/inner/order/countActiveOrders")
    public R<Integer> countActiveOrdersByCityId(@RequestParam("cityId") Long cityId) {
        return R.ok(xpOrderService.countActiveOrdersByCityId(cityId));
    }
@@ -157,7 +152,7 @@
    /**
     * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
     */
    @PostMapping("/inner/order/popOrder")
    @PostMapping("/logan/inner/order/popOrder")
    public R<?> popOrder(@RequestBody PopOrderDto dto) {
        xpOrderService.popOrder(dto);
        return R.ok();
@@ -168,7 +163,7 @@
     *
     * @param xpOrder 订单信息
     */
    @PostMapping("/inner/order/updateOrder")
    @PostMapping("/logan/inner/order/updateOrder")
    public R<?> updateOrder(@RequestBody XpOrder xpOrder) {
        xpOrder.setAppUserId(null);
        return xpOrderService.updateById(xpOrder) ? R.ok() : R.fail();
@@ -181,7 +176,7 @@
     * @param xpOrder 订单信息
     * @return 订单ID
     */
    @PostMapping("/inner/order/addOrder")
    @PostMapping("/logan/inner/order/addOrder")
    public R<Long> addOrder(@RequestBody XpOrder xpOrder) {
        boolean save = xpOrderService.addOrder(xpOrder);
        if (!save) {
@@ -197,7 +192,7 @@
     * @param orderId 订单ID
     * @return 操作结果
     */
    @PostMapping("/inner/order/cancelOrder")
    @PostMapping("/logan/inner/order/cancelOrder")
    public R<?> cancelOrder(@RequestParam("orderId") String orderId) {
        xpOrderService.cancelOrder(orderId);
        return R.ok();
@@ -327,13 +322,16 @@
    /**
     * 获取用户快捷胶囊 历史 时段 终点高点
     */
    @ApiOperation(value = "获取用户快捷胶囊 历史 时段 终点高点", tags = {"小程序-获取用户快捷胶囊 历史 时段 终点高点"})
    @ApiOperation(value = "获取首页快捷胶囊推荐站点", notes = "根据当前起点和用户近30天有效订单,按场景优先推荐目的地;无匹配时返回空数据", tags = {"小程序-首页快捷胶囊"}, response = XpPointInfoVo.class)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "startPointId", value = "当前首页起点站点ID", required = true, dataType = "Long", paramType = "query")
    })
    @GetMapping("/api/v1/mini-program/order/getUserQuickCapsule")
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpPointInfoVo> getUserQuickCapsule(HttpServletRequest request) {
    public R<XpPointInfoVo> getUserQuickCapsule(@RequestParam Long startPointId, HttpServletRequest request) {
        // uid已通过拦截器otp校验,可以直接使用
        String uid = request.getHeader("XP-Uid");
        return R.ok(xpOrderService.getUserQuickCapsule(uid));
        return R.ok(xpOrderService.getUserQuickCapsule(uid, startPointId));
    }
@@ -394,6 +392,17 @@
        return R.ok(xpOrderService.getActiveOrder(uid));
    }
    /**
     * 获取正在进行中的订单_行程管理
     */
    @ApiOperation(value = "获取正在进行中的订单_行程管理", tags = {"小程序-获取正在进行中的订单_行程管理"})
    @GetMapping("/api/v1/mini-program/order/active_itineraryManage")
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpOrderDetailVO> getActiveOrder_itineraryManage(HttpServletRequest request) {
        // uid已通过拦截器otp校验,可以直接使用
        String uid = request.getHeader("XP-Uid");
        return R.ok(xpOrderService.getActiveOrder_itineraryManage(uid));
    }
    /**
     * 查询历史订单列表
@@ -409,10 +418,21 @@
    /**
     * 1.0 获取待支付订单数量
     */
    @ApiOperation(value = "1.0 获取待支付订单数量", tags = {"小程序-1.0 获取待支付订单数量"})
    @GetMapping("/api/v1/mini-program/order/getWaitPayOrderNum")
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<Integer> getWaitPayOrderNum(HttpServletRequest request) {
        // uid已通过拦截器otp校验,可以直接使用
        String uid = request.getHeader("XP-Uid");
        return R.ok(xpOrderService.getWaitPayOrderNum(uid));
    }
    /**
     * +
     * 取消订单
     */
    @PutMapping("/api/v1/mini-program/order/cancel/{orderId}")
    @ApiOperation(value = "取消订单", tags = {"小程序-取消订单"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
@@ -500,10 +520,20 @@
     * 订单状态修改-车控消息推送我方调用(内部接口)
     */
    @ApiOperation(value = "订单状态推送修改")
    @PostMapping("/inner/v1/order/updateOrderStatus")
    @PostMapping("/logan/inner/v1/order/updateOrderStatus")
    public R<String> updateOrderStatus(@RequestParam Long orderId,
                                       @RequestParam Integer status) {
        return xpOrderService.updateOrderStatus(orderId, status);
    }
    /**
     * 行驶中车辆异常,订单状态修改- 修改状态=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);
    }
    /**
@@ -521,7 +551,7 @@
     * 订单车辆定位实时存储-订单车辆定位实时存储(内部接口)
     */
    @ApiOperation(value = "订单车辆定位实时存储")
    @PostMapping("/inner/v1/order/saveVehicleLocation")
    @PostMapping("/logan/inner/v1/order/saveVehicleLocation")
    public R<String> saveVehicleLocation(@RequestBody OrderTrajectoryVo vo) {
        OrderTrajectory orderTrajectory = new OrderTrajectory();
        BeanUtils.copyProperties(vo, orderTrajectory);
@@ -534,7 +564,11 @@
     */
    @ApiOperation(value = "订单查询实时轨迹路线")
    @PostMapping("/api/v1/mini-program/order/queryOrderRoute")
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<RouteVo> queryOrderRoute(@Validated @RequestBody QueryOrderRouteDTO dto, HttpServletRequest request) {
        if(dto.getOrderId() == null){
            return R.fail("参数不能为空");
        }
        String uid = request.getHeader("XP-Uid");
        // 查询订单信息
        XpOrder xpOrder = xpOrderService.getById(dto.getOrderId());
@@ -562,8 +596,11 @@
     */
    @ApiOperation(value = "订单查询轨迹路线")
    @GetMapping("/api/v1/mini-program/order/queryOrderTrajectory")
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<RouteVo> queryOrderTrajectory(@RequestParam String orderId, HttpServletRequest request) {
        String uid = request.getHeader("XP-Uid");
        if(orderId == null){
            return R.fail("参数不能为空");
        }
        List<OrderTrajectory> trajectories = mongoTemplate.find(
                new Query(Criteria.where("orderId").is(Long.valueOf(orderId)))
                        .with(Sort.by(Sort.Direction.ASC, "locatetime")),
@@ -600,4 +637,7 @@
        return R.ok((int)count);
    }
}