Ver Fonte

fix: settleOrder 增加兜底归属,弥补 createOrder 自动归属可能失效的缺口

新增 ensureUserStationBelonging 方法,在结算时检查用户是否仍无归属站,
若无则用当前消费站点补齐 t_user.station_id 和 Redis 缓存。
此方法不依赖 Session,可在 IoT 回调路径正常执行。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline há 1 dia atrás
pai
commit
959e6a4d18

+ 18 - 0
car-wash-service/src/main/java/com/kym/service/impl/OrderSettlementServiceImpl.java

@@ -99,6 +99,7 @@ public class OrderSettlementServiceImpl implements OrderSettlementService {
 
         washOrderService.updateById(washOrder);
 
+        ensureUserStationBelonging(washOrder.getUserId(), washOrder.getStationId());
         backfillUnattributedRecharges(washOrder.getUserId());
 
         if (orderInfo.getAmount() == 0) {
@@ -178,6 +179,23 @@ public class OrderSettlementServiceImpl implements OrderSettlementService {
         log.info("订单:{},跨店分账完成", washOrder.getOrderId());
     }
 
+    /**
+     * 兜底保障:如果 createOrder 的自动归属没有生效,在结算时补齐。
+     * IoT 回调路径没有用户 Session,同步写 Redis 缓存供后续使用。
+     */
+    private void ensureUserStationBelonging(Long userId, String orderStationId) {
+        var user = userService.getById(userId);
+        if (user == null || user.getStationId() != null) {
+            return;
+        }
+        userService.lambdaUpdate()
+                .set(User::getStationId, orderStationId)
+                .eq(User::getId, userId)
+                .update();
+        KymCache.INSTANCE.putUserId2StationId(Map.of(userId, orderStationId));
+        log.info("兜底归属:用户={} 归属站点={}", userId, orderStationId);
+    }
+
     private void backfillUnattributedRecharges(Long userId) {
         var userStationId = KymCache.INSTANCE.getUserStationId(userId);
         if (userStationId == null) {