Kaynağa Gözat

fix: 停车券查询时主动对账僵死订单,避免用户无法领取停车券出场

用户洗车完成后若订单僵死(设备已关闭但服务端未收到回调),订单未结算导致
用户在 parking.html 查不到停车券。在 checkParkingCoupon 中新增主动对账:
查不到已支付订单时,通过 RRpc 查询设备实际状态,设备已关闭则立即结算。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 gün önce
ebeveyn
işleme
5db3380ec4

+ 41 - 5
car-wash-service/src/main/java/com/kym/service/impl/WashOrderServiceImpl.java

@@ -475,22 +475,58 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
     @Override
     public String checkParkingCoupon(String mobilePhone) {
         CommUtil.asserts(CommUtil.isNotEmptyAndNull(mobilePhone),"查询手机号不能为空");
-        // 查询xx时间内该用户的是否有满足消费金额的订单,如果有,取最近一条的场站
         var user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getMobilePhone, mobilePhone));
         if (user == null) {
             throw new BusinessException("请输入注册洗车小程序使用的手机号码!");
         }
 
-        // 优惠券有效期2小时
+        // 优惠券有效期2小时,先查已支付订单
         var orderList = lambdaQuery()
                 .eq(WashOrder::getUserId, user.getId())
                 .ge(WashOrder::getEndTime, LocalDateTime.now().minusHours(2))
                 .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_已支付)
                 .orderByDesc(WashOrder::getId).list();
-        if(orderList.isEmpty() || (orderList.stream().collect(Collectors.summarizingInt(WashOrder::getAmount)).getSum() < WashOrder.PARKING_COUPON_MIN_AMOUNT)){
-            throw new BusinessException("不符合优惠条件:订单完成超过2小时或洗车金额不足6元。");
+        if (!orderList.isEmpty() && orderList.stream().collect(Collectors.summarizingInt(WashOrder::getAmount)).getSum() >= WashOrder.PARKING_COUPON_MIN_AMOUNT) {
+            return KymCache.INSTANCE.getParkingQrCodeUrlByStationId(orderList.get(0).getStationId());
         }
-        return KymCache.INSTANCE.getParkingQrCodeUrlByStationId(orderList.get(0).getStationId());
+
+        // 未找到符合条件的已支付订单,尝试查找僵死订单并主动对账结算
+        var staleOrders = lambdaQuery()
+                .eq(WashOrder::getUserId, user.getId())
+                .ge(WashOrder::getStartTime, LocalDateTime.now().minusHours(2))
+                .eq(WashOrder::getOrderStatus, WashOrder.ORDER_STATUS_开机)
+                .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付)
+                .orderByDesc(WashOrder::getId).list();
+
+        if (!staleOrders.isEmpty()) {
+            boolean reconciled = false;
+            for (WashOrder staleOrder : staleOrders) {
+                try {
+                    OrderInfo orderInfo = awoaraService.queryOrder(staleOrder.getProductKey(), staleOrder.getDeviceName(), staleOrder.getOrderId());
+                    if (orderInfo != null && orderInfo.getClose_type() != null && !orderInfo.getClose_type().isEmpty()) {
+                        log.info("停车券查询-订单 {} 设备已关闭,主动结算", staleOrder.getOrderId());
+                        orderSettlementService.settleOrder(staleOrder, orderInfo);
+                        reconciled = true;
+                    }
+                } catch (Exception e) {
+                    log.warn("停车券查询-订单 {} 查询设备失败:{}", staleOrder.getOrderId(), e.getMessage());
+                }
+            }
+
+            if (reconciled) {
+                // 结算后重新查询已支付订单
+                orderList = lambdaQuery()
+                        .eq(WashOrder::getUserId, user.getId())
+                        .ge(WashOrder::getEndTime, LocalDateTime.now().minusHours(2))
+                        .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_已支付)
+                        .orderByDesc(WashOrder::getId).list();
+                if (!orderList.isEmpty() && orderList.stream().collect(Collectors.summarizingInt(WashOrder::getAmount)).getSum() >= WashOrder.PARKING_COUPON_MIN_AMOUNT) {
+                    return KymCache.INSTANCE.getParkingQrCodeUrlByStationId(orderList.get(0).getStationId());
+                }
+            }
+        }
+
+        throw new BusinessException("不符合优惠条件:订单完成超过2小时或洗车金额不足6元。");
     }
     //endregion
 }