From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
---
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java | 280 ++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 244 insertions(+), 36 deletions(-)
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
index 8c2e281..7948881 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -5,9 +5,9 @@
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.DesensitizedUtil;
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.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xiaopeng.api.dto.QueryOrderRouteDTO;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
@@ -15,22 +15,31 @@
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
+import com.xiaopeng.api.dto.vehicleConvoy.BleInfoResponseDto;
import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
+import com.xiaopeng.api.feignClient.frdXfipEvent.XpFrdXfipEventClient;
+import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient;
import com.xiaopeng.api.feignClient.operation.XpWhiteListClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.BluetoothUnlockClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleMacClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.operation.XpOfficialPartner;
+import com.xiaopeng.api.model.operation.XpSystemSetting;
import com.xiaopeng.api.model.operation.XpWhitelist;
+import com.xiaopeng.api.model.order.OrderTrajectory;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.account.LoginUser;
+import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.operation.NavigationVo;
import com.xiaopeng.api.vo.operation.NearestNextVo;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.*;
import com.xiaopeng.api.vo.vehicleConvoy.GetBleInfoVo;
import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.SensitiveDataCryptoUtil;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
@@ -41,7 +50,9 @@
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.order.config.BluetoothDebugConfig;
import com.xiaopeng.order.dto.OrderNavigationDto;
+import com.xiaopeng.order.model.dto.*;
import com.xiaopeng.api.model.order.OrderTrajectory;
+import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderOperateDTO;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
@@ -50,10 +61,12 @@
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.vo.CreditPayCallVo;
import com.xiaopeng.order.model.vo.XpOrderDetailVO;
import com.xiaopeng.order.model.vo.XpOrderHistoryVO;
import com.xiaopeng.order.model.vo.XpOrderPageVO;
import com.xiaopeng.order.service.IXpOrderService;
+import com.xiaopeng.order.service.impl.BootCommonService;
import com.xiaopeng.order.vo.BluetoothTokenVo;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.order.vo.UpdateOrderStatusVo;
@@ -86,6 +99,9 @@
import java.util.*;
import java.util.stream.Collectors;
+import static org.bouncycastle.asn1.x500.style.RFC4519Style.o;
+import static org.bouncycastle.asn1.x500.style.RFC4519Style.uid;
+
/**
* <p>
* 订单 前端控制器
@@ -108,8 +124,6 @@
@Resource
private VehicleMacClient vehicleMacClient;
- @Resource
- private SysGroupMenuClient groupMenuClient;
@Resource
private XpWhiteListClient xpWhiteListClient;
@@ -119,6 +133,14 @@
@Autowired
private BluetoothDebugConfig bluetoothDebugConfig;
+
+ @Resource
+ private XpSystemSettingClient xpSystemSettingClient;
+
+ @Resource
+ @Lazy
+ private BootCommonService bootCommonService;
+
@@ -148,6 +170,23 @@
}
return R.ok(0L);
+ }
+
+ /**
+ * 查询是否有未支付订单
+ * 返回0 可以下单,非0为未支付订单ID
+ */
+ @PostMapping("/logan/inner/order/has-unpay-order")
+ @ApiOperation(value = "查询是否有未支付订单", tags = {"内部接口"})
+ public R<Long> hasUnPayOrder(String uid) {
+ XpOrder order = xpOrderService.getOne(new LambdaQueryWrapper<XpOrder>()
+ .eq(XpOrder::getAppUserId, Long.parseLong(uid))
+ .eq(XpOrder::getStatus, 8)
+ .last("LIMIT 1"));
+ if (order != null) {
+ return R.ok(order.getId());
+ }
+ return R.ok(0L);
}
/**
@@ -281,6 +320,12 @@
*/
@ApiOperation(value = "删除订单", tags = {"管理后台-交易管理-订单管理"})
@DeleteMapping("/api/v1/order/deleteById")
+ @AdminOperationLog(
+ businessType = AdminBusinessType.ORDER_MANAGEMENT,
+ operationType = AdminOperationType.DELETE,
+ contentExpression = "'删除订单,id=' + #p0",
+ appendRequestData = false
+ )
public R<?> deleteById(@ApiParam(value = "订单id", required = true) @RequestParam Long id) {
xpOrderService.deleteOrder(id);
return R.ok();
@@ -293,6 +338,12 @@
*/
@ApiOperation(value = "订单导出", tags = {"管理后台-交易管理-订单管理"})
@PostMapping("/api/v1/order/exportExcel")
+ @AdminOperationLog(
+ businessType = AdminBusinessType.ORDER_MANAGEMENT,
+ operationType = AdminOperationType.EXPORT,
+ content = "订单导出",
+ appendRequestData = true
+ )
public void exportExcel(@RequestBody XpOrderExcelQuery query) {
// 1. 查询导出数据
List<XpOrderPageVO> dataList = xpOrderService.exportList(query);
@@ -334,6 +385,12 @@
*/
@ApiOperation(value = "取消/关闭订单", tags = {"管理后台-交易管理-订单管理"})
@PostMapping("/api/v1/order/cancelAndCloseById")
+ @AdminOperationLog(
+ businessType = AdminBusinessType.ORDER_MANAGEMENT,
+ operationType = AdminOperationType.EDIT,
+ content = "取消/关闭订单",
+ appendRequestData = true
+ )
public R<?> cancelAndCloseById(@Validated @RequestBody XpOrderOperateDTO dto) {
xpOrderService.cancelOrCloseOrder(dto.getOrderId(), dto.getType(),dto.getIsFree());
return R.ok();
@@ -347,6 +404,12 @@
*/
@ApiOperation(value = "改派订单", tags = {"管理后台-交易管理-订单管理"}, notes = "车辆列表在 vehicleConvoy.availableList 服务")
@PostMapping("/api/v1/order/reassignById")
+ @AdminOperationLog(
+ businessType = AdminBusinessType.ORDER_MANAGEMENT,
+ operationType = AdminOperationType.EDIT,
+ content = "改派订单",
+ appendRequestData = true
+ )
public R<?> reassignById(@Validated @RequestBody XpOrderReassignDTO dto) {
xpOrderService.reassignOrder(
dto.getOrderId(),
@@ -363,6 +426,12 @@
@ApiImplicitParam(name = "id", value = "订单ID", required = true, dataType = "Long"),
@ApiImplicitParam(name = "amount", value = "新的订单金额", required = true, dataType = "BigDecimal")
})
+ @AdminOperationLog(
+ businessType = AdminBusinessType.ORDER_MANAGEMENT,
+ operationType = AdminOperationType.EDIT,
+ contentExpression = "'订单改价,id=' + #p0 + ',amount=' + #p1",
+ appendRequestData = false
+ )
public R<?> changeAmount(@RequestParam("id") Long id, @RequestParam("amount") BigDecimal amount) {
xpOrderService.changeAmount(id, amount);
return R.ok();
@@ -395,7 +464,8 @@
@XpClientCheck(checkToken = false, checkOtpToken = true)
public R<NearestNextVo> quickCapsule(@RequestParam Long startPointId,HttpServletRequest request) {
String uid = request.getHeader("XP-Uid");
- return R.ok(xpOrderService.quickCapsule(uid,startPointId));
+ NearestNextVo nearestNextVo = xpOrderService.quickCapsule(uid, startPointId);
+ return R.ok(nearestNextVo);
}
@@ -520,12 +590,56 @@
String uid = request.getHeader("XP-Uid");
try {
Boolean b = xpOrderService.endTrip(orderId, uid);
+ //判断是否测试免费
+ XpSystemSetting xpSystemSetting = xpSystemSettingClient.getSystemSettingOne().getData();
+ if (xpSystemSetting != null && xpSystemSetting.getOperateFree() == 1) {
+ //将支付金额修改成0 并将状态修改成 订单状态9
+ XpOrder xpOrder1 = new XpOrder();
+ xpOrder1.setId(orderId);
+ xpOrder1.setIsFree(true);//豁免
+ xpOrder1.setPayMoney(BigDecimal.ZERO);
+ xpOrder1.setStatus(OrderStatusEnum.PENDING_PAYMENT.getCode());
+ xpOrder1.setUpdateTime(LocalDateTime.now());
+ xpOrderService.updateById(xpOrder1);
+ xpOrder1.setAppUserId(Long.parseLong(uid));
+ bootCommonService.setCache_orderStatus(xpOrder1.getId(), xpOrder1, null);
+ }
return R.ok(b);
} catch (Exception e) {
return R.ok();
}
}
+
+
+
+ @PutMapping("/base/v1/order/testEndTrip/{orderId}")
+ @ApiOperation(value = "结束行程", tags = {"小程序-结束行程"})
+ public R<?> testEndTrip(@PathVariable("orderId") Long orderId, HttpServletRequest request) {
+ XpOrder xpOrder = xpOrderService.getById(orderId);
+ try {
+ Boolean b = xpOrderService.endTrip(orderId, xpOrder.getAppUserId().toString());
+ //判断是否测试免费
+ XpSystemSetting xpSystemSetting = xpSystemSettingClient.getSystemSettingOne().getData();
+ if (xpSystemSetting != null && xpSystemSetting.getOperateFree() == 1) {
+ //将支付金额修改成0 并将状态修改成 订单状态9
+ XpOrder xpOrder1 = new XpOrder();
+ xpOrder1.setId(orderId);
+ xpOrder1.setIsFree(true);//豁免
+ xpOrder1.setPayMoney(BigDecimal.ZERO);
+ xpOrder1.setStatus(OrderStatusEnum.PENDING_PAYMENT.getCode());
+ xpOrder1.setUpdateTime(LocalDateTime.now());
+ xpOrderService.updateById(xpOrder1);
+ xpOrder1.setAppUserId(xpOrder.getAppUserId());
+ bootCommonService.setCache_orderStatus(xpOrder1.getId(), xpOrder1, null);
+ }
+ return R.ok(b);
+
+ } catch (Exception e) {
+ return R.ok();
+ }
+ }
+
/**
@@ -585,9 +699,8 @@
@ApiOperation(value = "订单状态推送修改")
@PostMapping("/logan/inner/v1/order/updateOrderStatus")
public R<String> updateOrderStatus(@RequestParam Long orderId,
- @RequestParam Integer status,
- @RequestParam Boolean orderException) {
- return xpOrderService.updateOrderStatus(orderId, status, orderException);
+ @RequestParam Integer status) {
+ return xpOrderService.updateOrderStatus(orderId, status);
}
/**
@@ -636,9 +749,6 @@
String uid = request.getHeader("XP-Uid");
// 查询订单信息
XpOrder xpOrder = xpOrderService.getById(dto.getOrderId());
- // 获取路线规划
-// RouteVo routeVo = redisService.getCacheObject(CacheConstants.ORDER_ROUTE_CAPTURE + "_" + dto.getOrderId() + "_" +dto.getRouteType());
-
String key = "";
//接驾情况,获取车辆位置到起点的导航
if (xpOrder.getStatus() < 5) {
@@ -651,16 +761,11 @@
Object cacheObject = redisService.getCacheObject(key);
RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
-// VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
-// routeVo.setDirection(null != vehiclePosition ? vehiclePosition.getCourse() : 90);
-
- Long vehicleId = xpOrder.getVehicleId();
- XpOrder one = xpOrderService.getOne(new QueryWrapper<XpOrder>().eq("vehicle_id", vehicleId).in("status", Arrays.asList(6, 7)).eq("is_deleted", 0));
- if(null != one){
- routeVo.setEndLongitude(one.getEndLon());
- routeVo.setEndLatitude(one.getEndLat());
- }
-
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ routeVo.setDirection(null != vehiclePosition ? vehiclePosition.getCourse() : 90);
+ routeVo.setEndLongitude(xpOrder.getEndLon());
+ routeVo.setEndLatitude(xpOrder.getEndLat());
return R.ok(routeVo);
}
@@ -692,6 +797,11 @@
}
}
routeVo.setPolyline(polyline);
+ XpOrder xpOrder = xpOrderService.getById(orderId);
+ XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ routeVo.setDirection(null != vehiclePosition ? vehiclePosition.getCourse() : 0);
return R.ok(routeVo);
}
@@ -702,14 +812,25 @@
* @param
* @return 订单数量
*/
- @PostMapping("/inner/order/todayCancellationCount")
- public R<Integer> todayCancellationCount(@RequestParam Long userId) {
+ @PostMapping("/logan/inner/order/todayCancellationCount")
+ public R<Integer> todayCancellationCount(@RequestParam Long userId){
long count = xpOrderService.count(new QueryWrapper<XpOrder>().eq("app_user_id", userId).eq("status", 0)
.eq("is_deleted", 0).last(" and DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')"));
return R.ok((int) count);
}
+ /**
+ * 创建巡游单和推送车端报文
+ * @param orderId
+ * @return
+ */
+ @PostMapping("/logan/inner/order/addNewCruiseMission")
+ public R<?> addNewCruiseMission(@RequestParam("orderId") String orderId){
+ XpOrder xpOrder = xpOrderService.getById(orderId);
+ xpOrderService.addCruiseMission(xpOrder.getVehicleId(), xpOrder);
+ return R.ok();
+ }
@ApiOperation(value = "通过订单id获取蓝牙开锁秘钥", tags = {"小程序-业务流程"})
@GetMapping("/api/v1/mini-program/bluetooth/getUnlocktToken/{orderId}")
@@ -740,17 +861,18 @@
return R.ok();
}
XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
GetBleInfoVo getBleInfoVo = new GetBleInfoVo();
- getBleInfoVo.setVin(xpVehicle.getVehicleVin());
- BaseVehicleUserDto baseVehicleUserDto = vehicleMacClient.getBleInfo(uid, getBleInfoVo);
- if(null == baseVehicleUserDto || 200 != baseVehicleUserDto.getCode()){
+ getBleInfoVo.setVin(vin);
+ BleInfoResponseDto bleInfoResponseDto = vehicleMacClient.getBleInfo(uid, getBleInfoVo);
+ if (null == bleInfoResponseDto || 200 != bleInfoResponseDto.getCode()) {
throw new ServiceException("获取蓝牙信息失败");
}
- JSONObject jsonObject = JSON.parseObject(baseVehicleUserDto.getData().toString());
BluetoothTokenVo vo = new BluetoothTokenVo();
vo.setToken(token);
- vo.setMacAddress(jsonObject.getString("macAddress"));
- vo.setSlaveMacList(jsonObject.getList("slaveMacList", String.class));
+ vo.setMacAddress(bleInfoResponseDto.getData().getMacAddress());
+ vo.setSlaveMacList(bleInfoResponseDto.getData().getSlaveMacList().stream()
+ .map(s -> s.getMac()).collect(java.util.stream.Collectors.toList()));
return R.ok(vo);
}
@@ -882,6 +1004,26 @@
}
+ @GetMapping("/test/bluetooth/getBleInfo")
+ @ApiOperation(value = "[测试] 直接调用蓝牙信息接口验证DTO解析", notes = "仅用于本地联调验证,生产环境请勿使用")
+ public R<BleInfoResponseDto> testGetBleInfo(@RequestParam String uid, @RequestParam String vin) {
+ GetBleInfoVo vo = new GetBleInfoVo();
+ vo.setVin(vin);
+ BleInfoResponseDto result = vehicleMacClient.getBleInfo(uid, vo);
+ return R.ok(result);
+ }
+
+
+ @Resource
+ private BluetoothUnlockClient bluetoothUnlockClient;
+
+ @PostMapping("/test/bluetooth/deliver")
+ @ApiOperation(value = "[测试] 直接调用蓝牙token下发接口验证响应", notes = "仅用于本地联调验证,生产环境请勿使用")
+ public R<BaseVehicleUserDto> testDeliver(@RequestBody com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo vo) {
+ BaseVehicleUserDto result = bluetoothUnlockClient.deliver(vo);
+ return R.ok(result);
+ }
+
@PostMapping("/drainage/v1/order/getOrderInfo")
@ApiOperation(value = "获取订单详情", notes = "流量接入-订单信息")
@ApiImplicitParams({
@@ -903,14 +1045,80 @@
@GetMapping("/api/v1/mini-program/order/queryOrderStatusFromOrderId")
@XpClientCheck(checkToken = false, checkOtpToken = true)
public R<OrderStatusFromOrderIdVo> queryOrderStatusFromOrderId(Long orderId) {
-
- XpOrder order = xpOrderService.getById(orderId);
-
- OrderStatusFromOrderIdVo orderStatusFromOrderIdVo = new OrderStatusFromOrderIdVo();
- orderStatusFromOrderIdVo.setOrderId(order.getId());
- orderStatusFromOrderIdVo.setStatus(order.getStatus());
- return R.ok( xpOrderService.queryOrderStatusFromOrderId(orderId));
-
+ return R.ok(xpOrderService.queryOrderStatusFromOrderId(orderId));
}
+
+
+ /**
+ * 将订单推单状态还原重新推单
+ * @param orderId
+ * @return
+ */
+ @PostMapping("/logan/inner/order/againPushOrder")
+ public R<?> againPushOrder(@RequestParam("orderId") String orderId){
+ XpOrder xpOrder = xpOrderService.getById(orderId);
+ String firstElement = redisService.getFirstElement(xpOrder.getQueueName());
+ String[] split = firstElement.split("_");
+ if (split[2].equals("1")) {
+ String value = split[0] + "_" + split[1] + "_0" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
+ // 状态改为处理中
+ redisService.updateFirst(xpOrder.getQueueName(), value);
+ }
+ return R.ok();
+ }
+
+
+
+
+ /**
+ * 信用支付下单回调
+ */
+ @PostMapping("/base/v1/mini-program/order/creditPayCall")
+ @ApiOperation(value = "信用支付下单回调", tags = {"小程序-发起支付"}, response = CreditPayCallVo.class)
+ public R<CreditPayCallVo> creditPayCall(@RequestBody CreditPayCallDto dto) {
+ CreditPayCallVo vo = new CreditPayCallVo();
+ vo.setRetCode("0");
+ vo.setRetMsg("成功");
+
+ if (dto == null || (StringUtils.isBlank(dto.getAuthOrderId()) || StringUtils.isBlank(dto.getBusinessOrderId()))) {
+ return R.ok(vo);
+ }
+
+ LambdaQueryWrapper<XpOrder> wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(XpOrder::getAuthOrderId, dto.getAuthOrderId());
+ XpOrder order = xpOrderService.getOne(wrapper.last("LIMIT 1"));
+ if (order == null) {
+ return R.ok(vo);
+ }
+ if ("SUCCESS".equals(dto.getCreditOrderStatus())) {
+ // 发起扣款
+ xpOrderService.creditPayCall(order);
+ }
+ return R.ok(vo);
+ }
+
+ /**
+ * 信用扣款回调
+ */
+ @PostMapping("/base/v1/mini-program/order/creditPaySuccessCall")
+ @ApiOperation(value = "信用扣款回调", tags = {"小程序-发起支付"}, response = CreditPayCallVo.class)
+ public R<CreditPayCallVo> creditPaySuccessCall(@RequestBody CreditPaySuccessCallDto dto) {
+ CreditPayCallVo vo = xpOrderService.creditPaySuccessCall(dto);
+ return R.ok(vo);
+ }
+
+
+
+ /**
+ * 根据车辆id查询正在服务的订单
+ * @param vehicleId
+ * @return
+ */
+ @PostMapping("/logan/inner/order/getOrderByVehicleId")
+ public R<XpOrder> getOrderByVehicleId(@RequestParam("vehicleId") String vehicleId){
+ XpOrder one = xpOrderService.getOne(new LambdaUpdateWrapper<XpOrder>().eq(XpOrder::getVehicleId, vehicleId)
+ .in(XpOrder::getStatus, Arrays.asList(2, 3, 4, 5, 6, 7)));
+ return R.ok(one);
+ }
}
--
Gitblit v1.7.1