yumeng 2 hafta önce
ebeveyn
işleme
0bbfbde18e

+ 9 - 4
src/main/java/com/adx/tencent/honor/controller/HonorTrackingController.java

@@ -325,7 +325,7 @@ public class HonorTrackingController {
                                             HonorPlacement.Resolved resolved,
                                             BaiduRtaDecision decision) {
         HonorBidRecord record = new HonorBidRecord();
-        record.setQk(blockedQk("honor", decision.getRequestId(), traceId));
+        record.setQk(blockedQk("honor", decision.getQk(), decision.getRequestId(), traceId));
         record.setMedia("honor");
         record.setMediaTraceId(traceId);
         record.setPlatform(resolved.platform());
@@ -358,6 +358,7 @@ public class HonorTrackingController {
         putIfNotBlank(enriched, "rta_tu", decision.getTu());
         putIfNotBlank(enriched, "rta_order_id", firstNonBlank(decision.getOrderIds(), decision.getRequestOrderIds()));
         putIfNotBlank(enriched, "rta_request_order_id", decision.getRequestOrderIds());
+        putIfNotBlank(enriched, "rta_qk", decision.getQk());
         putIfNotBlank(enriched, "rta_request_id", decision.getRequestId());
         if (decision.getCode() != null) {
             enriched.put("rta_code", String.valueOf(decision.getCode()));
@@ -378,6 +379,7 @@ public class HonorTrackingController {
             body.put("rtaApplied", decision != null && decision.isApplied());
             body.put("rtaMatched", decision == null ? null : decision.isMatched());
             body.put("rtaCode", decision == null ? null : decision.getCode());
+            body.put("rtaQk", decision == null ? null : decision.getQk());
             body.put("rtaRequestId", decision == null ? null : decision.getRequestId());
             body.put("rtaRequestOrderId", decision == null ? null : decision.getRequestOrderIds());
             body.put("rtaOrderId", decision == null ? null : decision.getOrderIds());
@@ -587,8 +589,11 @@ public class HonorTrackingController {
         return value == null ? 0 : value;
     }
 
-    private static String blockedQk(String media, String requestId, String traceId) {
-        String suffix = requestId != null && !requestId.isBlank() ? requestId : md5Hex(traceId == null ? media : traceId + "-" + Instant.now().toEpochMilli());
-        return "rta-" + media + "-" + suffix;
+    private static String blockedQk(String media, String rtaQk, String requestId, String traceId) {
+        String qk = firstNonBlank(rtaQk, requestId);
+        if (qk != null) {
+            return qk;
+        }
+        return md5Hex(traceId == null ? media : traceId + "-" + Instant.now().toEpochMilli());
     }
 }

+ 7 - 2
src/main/java/com/adx/tencent/rta/BaiduRtaDecision.java

@@ -4,6 +4,7 @@ public class BaiduRtaDecision {
     private final boolean applied;
     private final boolean matched;
     private final Integer code;
+    private final String qk;
     private final String requestId;
     private final String tu;
     private final String requestOrderIds;
@@ -14,6 +15,7 @@ public class BaiduRtaDecision {
     private BaiduRtaDecision(boolean applied,
                              boolean matched,
                              Integer code,
+                             String qk,
                              String requestId,
                              String tu,
                              String requestOrderIds,
@@ -23,6 +25,7 @@ public class BaiduRtaDecision {
         this.applied = applied;
         this.matched = matched;
         this.code = code;
+        this.qk = qk;
         this.requestId = requestId;
         this.tu = tu;
         this.requestOrderIds = requestOrderIds;
@@ -32,23 +35,25 @@ public class BaiduRtaDecision {
     }
 
     public static BaiduRtaDecision bypass() {
-        return new BaiduRtaDecision(false, true, null, null, null, null, null, 0L, null);
+        return new BaiduRtaDecision(false, true, null, null, null, null, null, null, 0L, null);
     }
 
     public static BaiduRtaDecision of(boolean matched,
                                       Integer code,
+                                      String qk,
                                       String requestId,
                                       String tu,
                                       String requestOrderIds,
                                       String orderIds,
                                       long latencyMs,
                                       String errorMessage) {
-        return new BaiduRtaDecision(true, matched, code, requestId, tu, requestOrderIds, orderIds, latencyMs, errorMessage);
+        return new BaiduRtaDecision(true, matched, code, qk, requestId, tu, requestOrderIds, orderIds, latencyMs, errorMessage);
     }
 
     public boolean isApplied() { return applied; }
     public boolean isMatched() { return matched; }
     public Integer getCode() { return code; }
+    public String getQk() { return qk; }
     public String getRequestId() { return requestId; }
     public String getTu() { return tu; }
     public String getRequestOrderIds() { return requestOrderIds; }

+ 4 - 3
src/main/java/com/adx/tencent/rta/BaiduRtaService.java

@@ -111,10 +111,11 @@ public class BaiduRtaService {
                 log.info("[RTA][{}][未命中][请求] requestId={} body={}", mediaLabel(media), requestId, requestBody);
                 log.info("[RTA][{}][未命中][返回] requestId={} status={} headers={} body={}",
                         mediaLabel(media), requestId, response.statusCode(), response.headers().map(), responseBody);
-                return BaiduRtaDecision.of(false, null, requestId, tu, requestOrderId, null, latencyMs, "httpStatus=" + response.statusCode());
+                return BaiduRtaDecision.of(false, null, null, requestId, tu, requestOrderId, null, latencyMs, "httpStatus=" + response.statusCode());
             }
             JsonNode root = objectMapper.readTree(responseBody);
             Integer code = root.hasNonNull("code") ? root.get("code").asInt() : null;
+            String qk = root.hasNonNull("qk") ? trimToNull(root.get("qk").asText()) : null;
             String orderIds = root.hasNonNull("order_id") ? trimToNull(root.get("order_id").asText()) : null;
             boolean matched = code != null && code == 200 && orderIds != null && !orderIds.isBlank();
             if (code != null && code == 4010 && latencyMs > 2_000L) {
@@ -129,14 +130,14 @@ public class BaiduRtaService {
                 log.info("[RTA][{}][命中] requestId={} matched=true allowBid=true code={} requestOrderIds={} responseOrderIds={} latencyMs={} msg=命中,参与竞价",
                         mediaLabel(media), requestId, code, requestOrderId, orderIds, latencyMs);
             }
-            return BaiduRtaDecision.of(matched, code, requestId, tu, requestOrderId, orderIds, latencyMs, null);
+            return BaiduRtaDecision.of(matched, code, qk, requestId, tu, requestOrderId, orderIds, latencyMs, null);
         } catch (Exception e) {
             long latencyMs = (System.nanoTime() - startedAt) / 1_000_000L;
             String error = e.getClass().getSimpleName() + ": " + (e.getMessage() == null ? "" : e.getMessage());
             log.warn("[RTA][{}][异常] requestId={} matched=false allowBid=false code=null requestOrderIds={} responseOrderIds=null latencyMs={} errorType={} errorMessage={}",
                     mediaLabel(media), requestId, requestOrderId, latencyMs, e.getClass().getName(), e.getMessage(), e);
             log.info("[RTA][{}][未命中][请求] requestId={} body={}", mediaLabel(media), requestId, toJson(body));
-            return BaiduRtaDecision.of(false, null, requestId, tu, requestOrderId, null, latencyMs, error);
+            return BaiduRtaDecision.of(false, null, null, requestId, tu, requestOrderId, null, latencyMs, error);
         }
     }
 

+ 9 - 4
src/main/java/com/adx/tencent/vivo/controller/VivoTrackingController.java

@@ -397,7 +397,7 @@ public class VivoTrackingController {
                                            VivoPlacement.Resolved resolved,
                                            BaiduRtaDecision decision) {
         VivoBidRecord record = new VivoBidRecord();
-        record.setQk(blockedQk("vivo", decision.getRequestId(), traceId));
+        record.setQk(blockedQk("vivo", decision.getQk(), decision.getRequestId(), traceId));
         record.setMedia("vivo");
         record.setMediaTraceId(traceId);
         record.setPlatform(resolved.platform());
@@ -430,6 +430,7 @@ public class VivoTrackingController {
         putIfNotBlank(enriched, "rta_tu", decision.getTu());
         putIfNotBlank(enriched, "rta_order_id", firstNonBlank(decision.getOrderIds(), decision.getRequestOrderIds()));
         putIfNotBlank(enriched, "rta_request_order_id", decision.getRequestOrderIds());
+        putIfNotBlank(enriched, "rta_qk", decision.getQk());
         putIfNotBlank(enriched, "rta_request_id", decision.getRequestId());
         if (decision.getCode() != null) {
             enriched.put("rta_code", String.valueOf(decision.getCode()));
@@ -450,6 +451,7 @@ public class VivoTrackingController {
             body.put("rtaApplied", decision != null && decision.isApplied());
             body.put("rtaMatched", decision == null ? null : decision.isMatched());
             body.put("rtaCode", decision == null ? null : decision.getCode());
+            body.put("rtaQk", decision == null ? null : decision.getQk());
             body.put("rtaRequestId", decision == null ? null : decision.getRequestId());
             body.put("rtaRequestOrderId", decision == null ? null : decision.getRequestOrderIds());
             body.put("rtaOrderId", decision == null ? null : decision.getOrderIds());
@@ -811,9 +813,12 @@ public class VivoTrackingController {
         return value == null ? 0 : value;
     }
 
-    private static String blockedQk(String media, String requestId, String traceId) {
-        String suffix = requestId != null && !requestId.isBlank() ? requestId : md5Hex(traceId == null ? media : traceId + "-" + Instant.now().toEpochMilli());
-        return "rta-" + media + "-" + suffix;
+    private static String blockedQk(String media, String rtaQk, String requestId, String traceId) {
+        String qk = firstNonBlank(rtaQk, requestId);
+        if (qk != null) {
+            return qk;
+        }
+        return md5Hex(traceId == null ? media : traceId + "-" + Instant.now().toEpochMilli());
     }
 
     private void requireVivoParams(Map<String, String> params) {