From 67db945bbfd7ae08335652c30537a68e443deb78 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期日, 15 三月 2026 16:22:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java | 101 +++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 94 insertions(+), 7 deletions(-)
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index a1b4155..49aafad 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -324,8 +324,16 @@
if (Objects.nonNull(evaluate)) {
vo.setOrderRating(evaluate.getOrderRating());
}
- //TODO 7.查询mongodb 该订单上传的经纬度轨迹信息
- vo.setOrderPositionList(new ArrayList<>());
+ // 7. 查询mongodb 该订单上传的经纬度轨迹信息(按订单id)
+ List<OrderTrajectory> trajectories = queryOrderTrajectories(id);
+ vo.setOrderPositionList(convertTrajectoriesToPositions(trajectories));
+
+ // 8. 起步价、里程费、时长费、远途费:按订单费用明细聚合
+ Map<Integer, BigDecimal> feeMap = sumOrderDetailMoneyByDetailType(id);
+ vo.setStartMoney(feeMap.getOrDefault(1, BigDecimal.ZERO));
+ vo.setMileageMoney(feeMap.getOrDefault(2, BigDecimal.ZERO));
+ vo.setDurationMoney(feeMap.getOrDefault(3, BigDecimal.ZERO));
+ vo.setLongDistancemoney(feeMap.getOrDefault(4, BigDecimal.ZERO));
return vo;
}
@@ -2473,12 +2481,15 @@
}
}
- List<OrderTrajectory> trajectories = mongoTemplate.find(
- new Query(Criteria.where("orderId").is(orderId))
- .with(Sort.by(Sort.Direction.ASC, "locatetime")),
- OrderTrajectory.class
- );
+ List<OrderTrajectory> trajectories = queryOrderTrajectories(orderId);
orderDetailVo.setTrajectories(trajectories);
+
+ // 起步价、里程费、时长费、远途费:按订单费用明细聚合,覆盖订单表字段
+ Map<Integer, BigDecimal> feeMap = sumOrderDetailMoneyByDetailType(orderId);
+ orderDetailVo.setStartMoney(feeMap.getOrDefault(1, BigDecimal.ZERO));
+ orderDetailVo.setMileageMoney(feeMap.getOrDefault(2, BigDecimal.ZERO));
+ orderDetailVo.setDurationMoney(feeMap.getOrDefault(3, BigDecimal.ZERO));
+ orderDetailVo.setLongDistancemoney(feeMap.getOrDefault(4, BigDecimal.ZERO));
if (order.getBoardingTime() != null && order.getTripEnd() != null) {
// 计算两个时间相差多少分钟
double exactMinutes = Duration.between(order.getBoardingTime(), order.getTripEnd()).toMillis() / (1000.0 * 60);
@@ -2492,6 +2503,82 @@
return orderDetailVo;
}
+ /**
+ * 查询订单轨迹(mongodb)
+ *
+ * @param orderId 订单id
+ * @return 轨迹列表(按 locatetime 升序)
+ */
+ private List<OrderTrajectory> queryOrderTrajectories(Long orderId) {
+ if (orderId == null) {
+ return new ArrayList<>();
+ }
+ List<OrderTrajectory> trajectories = mongoTemplate.find(
+ new Query(Criteria.where("orderId").is(orderId))
+ .with(Sort.by(Sort.Direction.ASC, "locatetime")),
+ OrderTrajectory.class
+ );
+ return trajectories;
+ }
+
+ /**
+ * 订单费用明细聚合:按 detail_type 汇总 money
+ *
+ * <p>detail_type:1=起步价 2=里程费 3=时长费 4=远途费</p>
+ */
+ private Map<Integer, BigDecimal> sumOrderDetailMoneyByDetailType(Long orderId) {
+ if (orderId == null) {
+ return Collections.emptyMap();
+ }
+ List<XpOrderDetail> detailList = xpOrderDetailMapper.selectList(
+ new LambdaQueryWrapper<XpOrderDetail>()
+ .eq(XpOrderDetail::getOrderId, orderId)
+ .ne(XpOrderDetail::getIsDeleted, true)
+ );
+ if (CollectionUtils.isEmpty(detailList)) {
+ return Collections.emptyMap();
+ }
+ Map<Integer, BigDecimal> sumMap = new HashMap<>();
+ for (XpOrderDetail detail : detailList) {
+ if (detail == null || detail.getDetailType() == null) {
+ continue;
+ }
+ BigDecimal money = detail.getMoney() == null ? BigDecimal.ZERO : detail.getMoney();
+ sumMap.put(detail.getDetailType(), sumMap.getOrDefault(detail.getDetailType(), BigDecimal.ZERO).add(money));
+ }
+ return sumMap;
+ }
+
+ /**
+ * 将轨迹点转换为订单经纬度列表
+ */
+ private List<XpOrderDetailVO.OrderPosition> convertTrajectoriesToPositions(List<OrderTrajectory> trajectories) {
+ if (CollectionUtils.isEmpty(trajectories)) {
+ return new ArrayList<>();
+ }
+ List<XpOrderDetailVO.OrderPosition> positions = new ArrayList<>();
+ for (OrderTrajectory trajectory : trajectories) {
+ if (trajectory == null || StringUtils.isBlank(trajectory.getLocation())) {
+ continue;
+ }
+ String[] parts = trajectory.getLocation().split(",");
+ if (parts.length != 2) {
+ continue;
+ }
+ try {
+ double longitude = Double.parseDouble(parts[0].trim());
+ double latitude = Double.parseDouble(parts[1].trim());
+ XpOrderDetailVO.OrderPosition position = new XpOrderDetailVO.OrderPosition();
+ position.setLongitude(longitude);
+ position.setLatitude(latitude);
+ positions.add(position);
+ } catch (Exception e) {
+ // ignore invalid point
+ }
+ }
+ return positions;
+ }
+
@Override
public R<String> feeDescription(Long orderId, String uid) {
XpOrder order = this.getById(orderId);
--
Gitblit v1.7.1