Bläddra i källkod

fix: 优化暴力清理策略,仅在创建失败时触发且高精度扫描

- 主动清理不再运行暴力扫描(太慢),只做DB+Redis快速清理
- 创建失败时才触发暴力扫描:5分钟内每1秒,1小时内每15秒
- 扫描该用户所有历史设备后缀

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 veckor sedan
förälder
incheckning
703ea12ff3

+ 29 - 24
haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

@@ -915,8 +915,6 @@ public class PayScoreServiceImpl implements PayScoreService {
             }
         }
 
-        // 3. 暴力扫描:尝试取消当前设备最近一段时间内可能存在的孤儿订单
-        bruteForceCancelRecentOrders(userId, deviceId);
     }
 
     /**
@@ -1001,35 +999,42 @@ public class PayScoreServiceImpl implements PayScoreService {
             log.debug("[支付分服务] 查询用户设备列表异常: {}", e.getMessage());
         }
 
-        log.info("[支付分服务] 暴力扫描 {} 个设备后缀,窗口4小时", suffixes.size());
+        log.info("[支付分服务] 暴力扫描 {} 个设备后缀", suffixes.size());
 
         long nowSec = System.currentTimeMillis() / 1000;
         int cancelledCount = 0;
         int totalAttempts = 0;
 
-        // 扫描过去4小时,每15秒一个时间点
-        for (int i = 0; i < 960; i++) {
-            long ts = nowSec - (i * 15L);
-            for (String suffix : suffixes) {
-                totalAttempts++;
-                String outOrderNo = "PS" + ts + suffix;
-                try {
-                    PayScoreCancelRequest cancelReq = new PayScoreCancelRequest();
-                    cancelReq.setOutOrderNo(outOrderNo);
-                    cancelReq.setReason("自动清理孤儿订单");
-                    PayScoreResult cancelResult = payScoreStrategy.cancelServiceOrder(cancelReq);
-                    if (cancelResult.isSuccess()) {
-                        cancelledCount++;
-                        if (cancelledCount <= 5) {
-                            log.info("[支付分服务] 暴力清理成功 - outOrderNo: {}", outOrderNo);
+        // 高精度扫描最近5分钟(每1秒),覆盖密集重试场景
+        // 之后每15秒扫描到1小时,覆盖较早的孤儿订单
+        int[][] scanStages = {
+            {0, 300, 1},      // 0-5min, 每1秒 (300次/设备)
+            {300, 3600, 15},   // 5min-1h, 每15秒 (220次/设备)
+        };
+
+        for (int[] stage : scanStages) {
+            int startSec = stage[0];
+            int endSec = stage[1];
+            int interval = stage[2];
+
+            for (int s = startSec; s < endSec; s += interval) {
+                long ts = nowSec - s;
+                for (String suffix : suffixes) {
+                    totalAttempts++;
+                    String outOrderNo = "PS" + ts + suffix;
+                    try {
+                        PayScoreCancelRequest cancelReq = new PayScoreCancelRequest();
+                        cancelReq.setOutOrderNo(outOrderNo);
+                        cancelReq.setReason("自动清理孤儿订单");
+                        PayScoreResult cancelResult = payScoreStrategy.cancelServiceOrder(cancelReq);
+                        if (cancelResult.isSuccess()) {
+                            cancelledCount++;
+                            if (cancelledCount <= 5) {
+                                log.info("[支付分服务] 暴力清理成功 - outOrderNo: {}", outOrderNo);
+                            }
                         }
+                    } catch (Exception ignored) {
                     }
-                } catch (Exception ignored) {
-                }
-
-                if (totalAttempts % 500 == 0 && cancelledCount > 0) {
-                    log.info("[支付分服务] 暴力清理进度 - 已尝试 {} 次, 成功取消 {} 笔",
-                            totalAttempts, cancelledCount);
                 }
             }
         }