From d09e1c104aed44b4c2cc3c620ef28f4f5a2ec13a Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期四, 12 二月 2026 21:47:40 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java | 204 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 156 insertions(+), 48 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 14e57ae..d8d8aa0 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
@@ -26,6 +26,7 @@
import com.xiaopeng.api.feignClient.operation.XpPointClient;
import com.xiaopeng.api.feignClient.operation.XpPricingClient;
import com.xiaopeng.api.model.account.XpAppUser;
+import com.xiaopeng.api.model.operation.XpPoint;
import com.xiaopeng.api.model.operation.XpPricing;
import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
@@ -34,14 +35,13 @@
import com.xiaopeng.api.model.order.XpOrderEvaluate;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.api.vo.account.UserCouponVo;
-import com.xiaopeng.api.vo.order.FareBreakdownVo;
-import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
-import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
-import com.xiaopeng.api.vo.order.XpPointInfoVo;
+import com.xiaopeng.api.vo.order.*;
import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
+import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.DateUtils;
+import com.xiaopeng.common.core.utils.GeodesyUtil;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.web.domain.BaseModel;
import com.xiaopeng.common.core.web.page.PageInfo;
@@ -49,6 +49,9 @@
import com.xiaopeng.common.security.utils.SecurityUtils;
import com.xiaopeng.order.constant.I18nKeyConstant;
import com.xiaopeng.order.job.jobs.EndTripJob;
+import com.xiaopeng.order.mangodb.model.OrderTrajectory;
+import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
+import com.xiaopeng.order.mangodb.model.OrderTrajectory;
import com.xiaopeng.order.mapper.XpOrderMapper;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
@@ -66,7 +69,12 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -107,6 +115,12 @@
private final RedisService redisService;
private final XpPricingClient xpPricingClient;
private final XpSystemSettingClient xpSystemSettingClient;
+ private final OrderTrajectoryService orderTrajectoryService;
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+// @Autowired
+// private XpPricingUtil xpPricingUtil;
@Override
public OrderStatisticsDTO getOrderStatistics(StatisticsQueryDTO query) {
@@ -769,6 +783,9 @@
evaluate.setAppUserId(Long.valueOf(uid));
evaluate.setOrderRating(dto.getOrderRating());
evaluate.setEvaluateTime(LocalDateTime.now());
+ evaluate.setFeedbackContent(dto.getFeedbackContent());
+ evaluate.setFeedbackPictures(dto.getFeedbackPictures());
+ evaluate.setFeedbackTypeId(dto.getFeedbackTypeId());
xpOrderEvaluateService.save(evaluate);
}
@@ -785,7 +802,10 @@
xpOrder.setStatus(status);
switch (status) {
case 4:
- // 添加取消订单定时任务job
+ // 查询起点点位
+ Long startPointId = xpOrder.getStartPointId();
+ XpPoint xpPoint = xpPointClient.queryById(startPointId).getData();
+ // 添加取消订单定时任务job 时间为点位限停时长
Map<String, ? extends Object> cancelJobMaps =
new ImmutableMap.Builder<String, Long>().
put("id", xpOrder.getId())
@@ -794,7 +814,7 @@
OrderCancelJob.class,
(OrderCancelJob.name + xpOrder.getId()).toUpperCase(),
TimeJobType.ORDER_CANCEL,
- DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(5)),
+ DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(xpPoint.getParkingTimeLimit())),
cancelJobMaps
);
// 车辆到达上车点时间
@@ -847,39 +867,70 @@
if (pricing == null) {
throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS);
}
- Long id = pricing.getId();
- Integer pricingType = pricing.getPricingType();
- String basicPricingJson = pricing.getBasicPricingJson();
- String startingFareJson = pricing.getStartingFareJson();
- String dynamicPricingJson = pricing.getDynamicPricingJson();
- String priceRule = pricing.getPriceRule();
- // 根据计价规则计算费用
- BigDecimal startMoney = BigDecimal.ZERO;// 起步价
- BigDecimal mileageMoney = BigDecimal.ZERO;// 里程费
- BigDecimal durationMoney = BigDecimal.ZERO;// 时长费
- BigDecimal waitMoney = BigDecimal.ZERO;// 等待费
- BigDecimal longDistancemoney = BigDecimal.ZERO;// 远途费
- BigDecimal redPacketMoney = BigDecimal.ZERO;// 红包抵扣金额
- BigDecimal couponMoney = BigDecimal.ZERO;// 优惠券抵扣金额
- if (pricingType == 1) {
-
- } else {
+ // 查询订单轨迹
+ List<OrderTrajectory> trajectories = mongoTemplate.find(
+ new Query(Criteria.where("orderId").is(orderId))
+ .with(Sort.by(Sort.Direction.ASC, "locatetime")),
+ OrderTrajectory.class
+ );
+ // 计算等待时间
+ LocalDateTime boardingTime = order.getBoardingTime();// 上车时间
+ LocalDateTime arrivalTime = order.getArrivalTime();// 车辆到达上车点时间
+ // 行程开始时间
+ Integer waitTime =Math.abs( (int) Duration.between(boardingTime, arrivalTime).getSeconds());
+ // 计算订单总行驶距离,单位米
+ Double totalDistance = 0.00D;
+ // 行程总时间 秒
+ LocalDateTime tripBegin = order.getTripBegin();
+ LocalDateTime tripEnd = order.getTripEnd();
+ long seconds = Duration.between(tripBegin, tripEnd).getSeconds();
+ for (OrderTrajectory trajectory : trajectories) {
}
- if (org.springframework.util.StringUtils.hasLength(basicPricingJson)) {
+// XpPricingCardVo xpPricingCardVo = xpPricingUtil.calculationPrice(
+// order.getAppUserId().toString(),JSON.parseObject(pricing.getBasicPricingJson()),
+// JSON.parseArray(pricing.getStartingFareJson()),
+// pricing.getDynamicPricingJson(),
+// pricing.getIsDynamicPrice(),
+// totalDistance,
+// seconds,
+// order.getCityId()
+// );
- }
- if (org.springframework.util.StringUtils.hasLength(startingFareJson)) {
+// Long id = pricing.getId();
+// Integer pricingType = pricing.getPricingType();
+// String basicPricingJson = pricing.getBasicPricingJson();
+// String startingFareJson = pricing.getStartingFareJson();
+// String dynamicPricingJson = pricing.getDynamicPricingJson();
+// String priceRule = pricing.getPriceRule();
+// // 根据计价规则计算费用
+// BigDecimal startMoney = BigDecimal.ZERO;// 起步价
+// BigDecimal mileageMoney = BigDecimal.ZERO;// 里程费
+// BigDecimal durationMoney = BigDecimal.ZERO;// 时长费
+// BigDecimal waitMoney = BigDecimal.ZERO;// 等待费
+// BigDecimal longDistancemoney = BigDecimal.ZERO;// 远途费
+// BigDecimal redPacketMoney = BigDecimal.ZERO;// 红包抵扣金额
+// BigDecimal couponMoney = BigDecimal.ZERO;// 优惠券抵扣金额
+// if (pricingType == 1) {
+//
+// } else {
+//
+// }
+// if (org.springframework.util.StringUtils.hasLength(basicPricingJson)) {
+//
+// }
+// if (org.springframework.util.StringUtils.hasLength(startingFareJson)) {
+//
+// }
+// if (org.springframework.util.StringUtils.hasLength(dynamicPricingJson)) {
+//
+// }
+// if (org.springframework.util.StringUtils.hasLength(priceRule)) {
+//
+// }
- }
- if (org.springframework.util.StringUtils.hasLength(dynamicPricingJson)) {
-
- }
- if (org.springframework.util.StringUtils.hasLength(priceRule)) {
-
- }
- // 计算完价格后 挑选优惠券
- GetUserCouponDto getUserCouponDto = new GetUserCouponDto();
+ // 计算完价格后 挑选优惠券
+ GetUserCouponDto getUserCouponDto = new GetUserCouponDto();
getUserCouponDto.setUserId(Long.valueOf(uid));
getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue());
R<UserCouponVo> userCouponVoR = xpAppUserCouponClient.getUserCoupon(getUserCouponDto);
@@ -907,23 +958,43 @@
@Override
public R<FareBreakdownVo> fareBreakdown(Long orderId, String uid) {
XpOrder order = this.getById(orderId);
- FareBreakdownVo fareBreakdownVo = new FareBreakdownVo();
- BeanUtils.copyProperties(order, fareBreakdownVo);
- fareBreakdownVo.setTotalKilometers(
- BigDecimal.valueOf(order.getStartMileage() + order.getMileageKilometers() + order.getLongDistance())
+ // 查询订单轨迹
+ List<OrderTrajectory> trajectories = mongoTemplate.find(
+ new Query(Criteria.where("orderId").is(orderId))
+ .with(Sort.by(Sort.Direction.ASC, "locatetime")),
+ OrderTrajectory.class
);
- LocalDateTime createTime = order.getCreateTime();
- LocalDateTime tripEnd = order.getTripEnd();
- // 计算行程时间 单位分钟
+ // 计算订单总行驶距离,单位米
+ Double totalDistance = 0.00D;
+ for (OrderTrajectory trajectory : trajectories) {
- // 计算时间差
- Duration duration = Duration.between(createTime, tripEnd);
- // 转换为分钟并保留一位小数
- BigDecimal minutes = BigDecimal.valueOf(duration.getSeconds())
- .divide(BigDecimal.valueOf(60), 1, RoundingMode.HALF_UP);
+ }
+ FareBreakdownVo fareBreakdownVo = new FareBreakdownVo();
+// fareBreakdownVo.setStart();
+// fareBreakdownVo.setMileage();
+// fareBreakdownVo.setDuration();
+// fareBreakdownVo.setLongDistance();
+// fareBreakdownVo.setRedPacketMoney();
+// fareBreakdownVo.setCouponMoney();
+// fareBreakdownVo.setOrderMoney();
- fareBreakdownVo.setTotalTime(minutes);
+// BeanUtils.copyProperties(order, fareBreakdownVo);
+// fareBreakdownVo.setTotalKilometers(
+// BigDecimal.valueOf(order.getStartMileage() + order.getMileageKilometers() + order.getLongDistance())
+// );
+// LocalDateTime createTime = order.getCreateTime();
+// LocalDateTime tripEnd = order.getTripEnd();
+// // 计算行程时间 单位分钟
+//
+// // 计算时间差
+// Duration duration = Duration.between(createTime, tripEnd);
+//
+// // 转换为分钟并保留一位小数
+// BigDecimal minutes = BigDecimal.valueOf(duration.getSeconds())
+// .divide(BigDecimal.valueOf(60), 1, RoundingMode.HALF_UP);
+//
+// fareBreakdownVo.setTotalTime(minutes);
return R.ok(fareBreakdownVo);
}
@@ -938,6 +1009,7 @@
/**
* 添加订单
+ *
* @param xpOrder
* @return
*/
@@ -960,6 +1032,7 @@
/**
* 获取订单数量
+ *
* @param dto
* @return
*/
@@ -969,6 +1042,41 @@
return num.intValue();
}
+ @Override
+ public void saveVehicleLocation(OrderTrajectory orderTrajectory) {
+ // 查询订单信息
+ XpOrder xpOrder = this.getById(orderTrajectory.getOrderId());
+
+ // 计算距离
+ // 获取上一次定位
+ String oldLocation = redisService.getCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId());
+ if(StringUtils.isEmpty(oldLocation)){
+ // 首次定位
+ xpOrder.setMileageKilometers(0D);
+ this.updateById(xpOrder);
+ orderTrajectory.setDistance(0D);
+ // 存储mongo数据
+ orderTrajectoryService.create(orderTrajectory);
+ // 存储首次定位
+ redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation());
+ }else {
+ Map<String, Double> distance = GeodesyUtil.getDistance(orderTrajectory.getLocation(), oldLocation);
+ if(null != distance){
+ Double distance1 = distance.get("WGS84");
+ if(distance1 > 50 && xpOrder.getStatus() == 6){//大于50米表示在移动,且在服务中的时候记录里程
+ xpOrder.setMileageKilometers(BigDecimal.valueOf(xpOrder.getMileageKilometers()).add(new BigDecimal(distance1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+ this.updateById(xpOrder);
+ // 存储本次距离
+ orderTrajectory.setDistance(distance1);
+ // 存储mongo数据
+ orderTrajectoryService.create(orderTrajectory);
+ }
+ }else{
+ log.error("调用高德计算距离出错");
+ }
+ }
+ }
+
/**
* 获取当前用户正在执行的订单
--
Gitblit v1.7.1