Ver Fonte

调整2001扣量

yumeng há 1 semana atrás
pai
commit
86b0f0fa6d

+ 39 - 9
src/main/java/com/adx/tencent/conversionsync/ConversionSyncService.java

@@ -1132,7 +1132,7 @@ public class ConversionSyncService {
         if (!task.isTencent() || task.tencentBid == null) {
             return DeductionHandling.SEND;
         }
-        int deductionRate = resolveDeductionRate(task.tencentBid);
+        int deductionRate = resolveDeductionRate(task.tencentBid, task.payment.getAct());
         if (deductionRate <= 0) {
             return DeductionHandling.SEND;
         }
@@ -1191,9 +1191,9 @@ public class ConversionSyncService {
         record.setAttempt(1);
         record.setErrorMessage("deducted_by_new_link_rate");
         record.setDispatchStatus(MediaCallbackRecord.DISPATCH_STATUS_DEDUCTED);
-        record.setTrackingVersion(String.valueOf(resolveDeductionRate(task.tencentBid)));
+        record.setTrackingVersion(String.valueOf(resolveDeductionRate(task.tencentBid, task.payment.getAct())));
         record.setCreatedAt(now);
-        int deductionRate = resolveDeductionRate(task.tencentBid);
+        int deductionRate = resolveDeductionRate(task.tencentBid, task.payment.getAct());
         log.info("[ConversionSync] 腾讯转化扣量 | qk={} | act={} | rate={} | tagId={} | accountId={} | callbackKey={}",
                 task.payment.getQk(), task.payment.getAct(), deductionRate,
                 task.tencentBid.getTagId(), safe(task.tencentBid.getAccountId()), task.callbackKey);
@@ -1313,20 +1313,50 @@ public class ConversionSyncService {
         return (version == null || version.isBlank()) ? "v1" : version;
     }
 
-    private int resolveDeductionRate(BidRecord bid) {
+    private int resolveDeductionRate(BidRecord bid, int act) {
         if (bid == null || bid.getMediaParams() == null) {
             return 0;
         }
-        String rawRate = bid.getMediaParams().get(BidRecord.DEDUCTION_RATE_KEY);
-        if (rawRate != null && !rawRate.isBlank()) {
-            try {
-                return sanitizeDeductionRate(Integer.parseInt(rawRate.trim()));
-            } catch (NumberFormatException ignored) {
+        if (act == 2001) {
+            String rawActRate = firstParam(bid.getMediaParams(),
+                    BidRecord.ACT_2001_DEDUCTION_RATE_KEY,
+                    "act2001DeductionRate",
+                    "deductionRate2001",
+                    "deduction_rate_2001");
+            Integer actRate = parseDeductionRate(rawActRate);
+            if (actRate != null) {
+                return actRate;
             }
         }
+        String rawRate = bid.getMediaParams().get(BidRecord.DEDUCTION_RATE_KEY);
+        Integer rate = parseDeductionRate(rawRate);
+        if (rate != null) {
+            return rate;
+        }
         return 0;
     }
 
+    private static Integer parseDeductionRate(String rawRate) {
+        if (rawRate == null || rawRate.isBlank()) {
+            return null;
+        }
+        try {
+            return sanitizeDeductionRate(Integer.parseInt(rawRate.trim()));
+        } catch (NumberFormatException ignored) {
+            return null;
+        }
+    }
+
+    private static String firstParam(Map<String, String> params, String... keys) {
+        for (String key : keys) {
+            String value = params.get(key);
+            if (value != null && !value.isBlank()) {
+                return value.trim();
+            }
+        }
+        return null;
+    }
+
     private int resolveKuaishouDeductionRate(KuaishouBidRecord bid) {
         if (bid == null || bid.getMediaParams() == null) {
             return 0;

+ 9 - 1
src/main/java/com/adx/tencent/httpapi/TrackingController.java

@@ -316,11 +316,19 @@ public class TrackingController {
         return Map.of("qk", nvl(record.getQk()), "traceId", traceId);
     }
 
-    private static void markTrackingVersion(Map<String, String> params, String trackingVersion, int deductionRate) {
+    private void markTrackingVersion(Map<String, String> params, String trackingVersion, int deductionRate) {
         boolean isNewLink = !"v1".equalsIgnoreCase(trackingVersion);
         params.put(BidRecord.NEW_LINK_FLAG_KEY, Boolean.toString(isNewLink));
         params.put(BidRecord.TRACKING_VERSION_KEY, trackingVersion);
         params.put(BidRecord.DEDUCTION_RATE_KEY, String.valueOf(Math.max(deductionRate, 0)));
+        String act2001Rate = firstParam(params,
+                BidRecord.ACT_2001_DEDUCTION_RATE_KEY,
+                "act2001DeductionRate",
+                "deductionRate2001",
+                "deduction_rate_2001");
+        if (act2001Rate != null) {
+            params.put(BidRecord.ACT_2001_DEDUCTION_RATE_KEY, act2001Rate);
+        }
     }
 
     // ─── 私有工具方法 ────────────────────────────────────────────────────────

+ 4 - 1
src/main/java/com/adx/tencent/storage/model/BidRecord.java

@@ -13,6 +13,7 @@ public class BidRecord {
     public static final String NEW_LINK_FLAG_KEY = "is_new_link";
     public static final String TRACKING_VERSION_KEY = "tracking_version";
     public static final String DEDUCTION_RATE_KEY = "deduction_rate";
+    public static final String ACT_2001_DEDUCTION_RATE_KEY = "act_2001_deduction_rate";
 
     @JsonProperty("qk")           private String qk;
     @JsonProperty("media")        private String media;
@@ -144,7 +145,9 @@ public class BidRecord {
                 "hash_oaid", "hash_android_id",
                 "ip", "ua", "user_agent",
                 "callback", "click_id", "account_id",
-                NEW_LINK_FLAG_KEY, TRACKING_VERSION_KEY, DEDUCTION_RATE_KEY
+                NEW_LINK_FLAG_KEY, TRACKING_VERSION_KEY, DEDUCTION_RATE_KEY,
+                ACT_2001_DEDUCTION_RATE_KEY,
+                "act2001DeductionRate", "deductionRate2001", "deduction_rate_2001"
         );
         Map<String, String> slim = new LinkedHashMap<>();
         for (String key : deviceKeys) {

+ 30 - 4
src/main/java/com/adx/tencent/tencent/TencentClient.java

@@ -87,7 +87,7 @@ public class TencentClient {
         record.setPurchase(payment.getPayment());
         record.setAttempt(1);
         record.setDispatchStatus(MediaCallbackRecord.DISPATCH_STATUS_SENT);
-        record.setTrackingVersion(String.valueOf(resolveDeductionRate(bid)));
+        record.setTrackingVersion(String.valueOf(resolveDeductionRate(bid, payment.getAct())));
         record.setCreatedAt(Instant.now());
 
         // 取 callback URL
@@ -293,13 +293,29 @@ public class TencentClient {
         return (version == null || version.isBlank()) ? "v1" : version;
     }
 
-    private static int resolveDeductionRate(BidRecord bid) {
+    private static int resolveDeductionRate(BidRecord bid, int act) {
         if (bid == null || bid.getMediaParams() == null) {
             return 0;
         }
+        if (act == 2001) {
+            String rawActRate = firstParam(bid.getMediaParams(),
+                    BidRecord.ACT_2001_DEDUCTION_RATE_KEY,
+                    "act2001DeductionRate",
+                    "deductionRate2001",
+                    "deduction_rate_2001");
+            Integer actRate = parseDeductionRate(rawActRate);
+            if (actRate != null) {
+                return actRate;
+            }
+        }
         String rawRate = bid.getMediaParams().get(BidRecord.DEDUCTION_RATE_KEY);
+        Integer rate = parseDeductionRate(rawRate);
+        return rate == null ? 0 : rate;
+    }
+
+    private static Integer parseDeductionRate(String rawRate) {
         if (rawRate == null || rawRate.isBlank()) {
-            return 0;
+            return null;
         }
         try {
             int rate = Integer.parseInt(rawRate.trim());
@@ -308,10 +324,20 @@ public class TencentClient {
             }
             return Math.min(rate, 100);
         } catch (NumberFormatException ignored) {
-            return 0;
+            return null;
         }
     }
 
+    private static String firstParam(Map<String, String> params, String... keys) {
+        for (String key : keys) {
+            String value = params.get(key);
+            if (value != null && !value.isBlank()) {
+                return value.trim();
+            }
+        }
+        return null;
+    }
+
     private String buildOuterActionId(BidRecord bid, PaymentInfo payment, String actionType) {
         String source = String.join("|",
                 safe(payment.getQk()),