|
|
@@ -79,15 +79,29 @@ public class TrackingController {
|
|
|
public Object tencentImpressionV2(HttpServletRequest request) throws Exception {
|
|
|
impressionSemaphore.acquire();
|
|
|
try {
|
|
|
- return doImpression(request, true);
|
|
|
+ return doImpression(request, "v2", 20);
|
|
|
+ } finally {
|
|
|
+ impressionSemaphore.release();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @GetMapping("/tencent/v3/impression")
|
|
|
+ public Object tencentImpressionV3(HttpServletRequest request) throws Exception {
|
|
|
+ impressionSemaphore.acquire();
|
|
|
+ try {
|
|
|
+ return doImpression(request, "v3", 50);
|
|
|
} finally {
|
|
|
impressionSemaphore.release();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private Object doImpression(HttpServletRequest request, boolean isNewLink) throws Exception {
|
|
|
+ return doImpression(request, isNewLink ? "v2" : "v1", isNewLink ? 20 : 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Object doImpression(HttpServletRequest request, String trackingVersion, int deductionRate) throws Exception {
|
|
|
Map<String, String> params = flatQueryParams(request);
|
|
|
- markTrackingVersion(params, isNewLink);
|
|
|
+ markTrackingVersion(params, trackingVersion, deductionRate);
|
|
|
String traceId = mediaTraceId(params);
|
|
|
if (traceId == null || traceId.isBlank()) {
|
|
|
log.warn("[腾讯][曝光] 缺少 traceId, params={}", params.keySet());
|
|
|
@@ -151,7 +165,18 @@ public class TrackingController {
|
|
|
throws Exception {
|
|
|
clickSemaphore.acquire();
|
|
|
try {
|
|
|
- return doClick(request, response, true);
|
|
|
+ return doClick(request, response, "v2", 20);
|
|
|
+ } finally {
|
|
|
+ clickSemaphore.release();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @GetMapping("/tencent/v3/click")
|
|
|
+ public Object tencentClickV3(HttpServletRequest request, HttpServletResponse response)
|
|
|
+ throws Exception {
|
|
|
+ clickSemaphore.acquire();
|
|
|
+ try {
|
|
|
+ return doClick(request, response, "v3", 50);
|
|
|
} finally {
|
|
|
clickSemaphore.release();
|
|
|
}
|
|
|
@@ -164,12 +189,18 @@ public class TrackingController {
|
|
|
|
|
|
private Object doClick(HttpServletRequest request, HttpServletResponse response, boolean isNewLink)
|
|
|
throws Exception {
|
|
|
+ return doClick(request, response, isNewLink ? "v2" : "v1", isNewLink ? 20 : 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Object doClick(HttpServletRequest request, HttpServletResponse response,
|
|
|
+ String trackingVersion, int deductionRate)
|
|
|
+ throws Exception {
|
|
|
if (tencentPlacement == null) {
|
|
|
throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE, "tencent placement not configured");
|
|
|
}
|
|
|
|
|
|
Map<String, String> params = flatQueryParams(request);
|
|
|
- markTrackingVersion(params, isNewLink);
|
|
|
+ markTrackingVersion(params, trackingVersion, deductionRate);
|
|
|
String traceId = mediaTraceId(params);
|
|
|
if (traceId == null || traceId.isBlank()) {
|
|
|
log.warn("[腾讯][点击] 缺少 traceId, params={}", params.keySet());
|
|
|
@@ -225,9 +256,11 @@ public class TrackingController {
|
|
|
return Map.of("qk", nvl(record.getQk()), "traceId", traceId);
|
|
|
}
|
|
|
|
|
|
- private static void markTrackingVersion(Map<String, String> params, boolean isNewLink) {
|
|
|
+ private static 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, isNewLink ? "v2" : "v1");
|
|
|
+ params.put(BidRecord.TRACKING_VERSION_KEY, trackingVersion);
|
|
|
+ params.put(BidRecord.DEDUCTION_RATE_KEY, String.valueOf(Math.max(deductionRate, 0)));
|
|
|
}
|
|
|
|
|
|
// ─── 私有工具方法 ────────────────────────────────────────────────────────
|