|
|
@@ -103,6 +103,7 @@ public class ConversionSyncService {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// bid 不是腾讯,或没有设备标识
|
|
|
if (!"tencent".equals(bid.getMedia())) {
|
|
|
if (coldStore != null) {
|
|
|
@@ -119,13 +120,23 @@ public class ConversionSyncService {
|
|
|
try { coldStore.saveConversion(conversionRecord(payment, bid.getMedia())); } catch (Exception ignored) {}
|
|
|
}
|
|
|
|
|
|
+ String actionType = null;
|
|
|
+ if (tagEventResolver != null) {
|
|
|
+ actionType = tagEventResolver.resolveActionType(bid.getTagId(), payment.getAct());
|
|
|
+ }
|
|
|
+ if (actionType == null || actionType.isBlank()) {
|
|
|
+ actionType = tencentClient.conversionActionType(payment.getAct());
|
|
|
+ log.warn("[ConversionSync] 广告位回传方式未配置, 回退act-map | qk={} | tagId={} | act={} | actionType={}",
|
|
|
+ payment.getQk(), bid.getTagId(), payment.getAct(), actionType);
|
|
|
+ }
|
|
|
+
|
|
|
// 幂等检查
|
|
|
- String callbackKey = callbackDedupeKey(payment, bid.getMedia());
|
|
|
+ String callbackKey = callbackDedupeKey(payment, bid, actionType);
|
|
|
if (coldStore != null) {
|
|
|
try {
|
|
|
- String conversionKey = conversionDedupeKey(payment, bid.getMedia());
|
|
|
+ String legacyCallbackKey = legacyCallbackDedupeKey(payment, bid.getMedia());
|
|
|
boolean exists = coldStore.successfulCallbackExistsForEvent(
|
|
|
- callbackKey, conversionKey, payment.getAct());
|
|
|
+ callbackKey, legacyCallbackKey, payment.getAct());
|
|
|
if (exists) {
|
|
|
result.alreadySent.incrementAndGet();
|
|
|
return;
|
|
|
@@ -135,18 +146,8 @@ public class ConversionSyncService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 发送到腾讯
|
|
|
String platform = resolvePlatform(bid);
|
|
|
- // 根据广告位(tag_id)解析回传方式作为 action_type:Redis 优先,DB 兜底
|
|
|
- String actionTypeOverride = null;
|
|
|
- if (tagEventResolver != null) {
|
|
|
- actionTypeOverride = tagEventResolver.resolveEventType(bid.getTagId());
|
|
|
- }
|
|
|
- if (actionTypeOverride == null || actionTypeOverride.isBlank()) {
|
|
|
- log.warn("[ConversionSync] 广告位回传方式未配置, 回退act-map | qk={} | tagId={} | act={}",
|
|
|
- payment.getQk(), bid.getTagId(), payment.getAct());
|
|
|
- }
|
|
|
- MediaCallbackRecord callbackRecord = tencentClient.sendConversionEvent(bid, payment, platform, actionTypeOverride);
|
|
|
+ MediaCallbackRecord callbackRecord = tencentClient.sendConversionEvent(bid, payment, platform, actionType);
|
|
|
callbackRecord.setDedupeKey(callbackKey);
|
|
|
|
|
|
if (callbackRecord.getStatus() == 0 && callbackRecord.getErrorMessage() != null) {
|
|
|
@@ -218,7 +219,18 @@ public class ConversionSyncService {
|
|
|
return String.format("%s:%s:%s:%s:%d", media, p.getQk(), p.getDate(), p.getDeviceId(), p.getAct());
|
|
|
}
|
|
|
|
|
|
- static String callbackDedupeKey(PaymentInfo p, String media) {
|
|
|
+ static String callbackDedupeKey(PaymentInfo p, BidRecord bid, String actionType) {
|
|
|
+ return String.format("%s:%s:%s:%s:%s:%d:%s",
|
|
|
+ bid.getMedia(),
|
|
|
+ p.getQk(),
|
|
|
+ p.getDate(),
|
|
|
+ p.getDeviceId(),
|
|
|
+ bid.getTagId(),
|
|
|
+ p.getAct(),
|
|
|
+ actionType);
|
|
|
+ }
|
|
|
+
|
|
|
+ static String legacyCallbackDedupeKey(PaymentInfo p, String media) {
|
|
|
return conversionDedupeKey(p, media) + ":" + p.getAct();
|
|
|
}
|
|
|
|