Browse Source

coding:广告线索

zhangqin 8 giờ trước cách đây
mục cha
commit
fada176423

+ 2 - 1
fs-ad-new-api/src/main/java/com/fs/app/controller/WeChatController.java

@@ -50,7 +50,8 @@ public class WeChatController {
             try {
                 String access_token = advMiniConfig.getAccessToken();
                 // 判断token是否过期
-                if (advMiniConfig.getExpiresIn().isBefore(LocalDateTime.now().plusMinutes(10))) {
+                if (LocalDateTime.now().plusMinutes(10).isAfter(advMiniConfig.getExpiresIn())) {
+                    // 提前10分钟刷新Token
                     HttpResponse execute2 = HttpRequest.get("https://api.weixin.qq.com/cgi-bin/token")
                             .form("grant_type", "client_credential")
                             .form("appid", advMiniConfig.getAppId())

+ 41 - 37
fs-ad-new-api/src/main/java/com/fs/app/facade/CallbackProcessingFacadeServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.app.facade;
 
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
@@ -8,6 +9,7 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fs.common.exception.base.BusinessException;
 import com.fs.common.utils.RedisUtil;
+import com.fs.common.utils.SnowflakeUtil;
 import com.fs.newAdv.domain.LandingPageTemplate;
 import com.fs.newAdv.domain.Lead;
 import com.fs.newAdv.domain.Site;
@@ -72,47 +74,48 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
     public void saveClickTrace(Long advertiserCode, Map<String, String> allParams) {
         IAdvertiserAdapter advertiserAdapter = handlerFactory.getAdapter(AdvertiserTypeEnum.getByCode(advertiserCode));
         Lead lead = advertiserAdapter.adaptCallbackData(allParams);
-        Lead byTraceId = leadService.getByTraceId(lead.getTraceId());
-        if (ObjectUtil.isNotEmpty(byTraceId)) {
-            throw new BusinessException("监测信息已存在: " + lead.getTraceId());
+        Lead byClickId = leadService.getByClickId(lead.getTraceId());
+        if (ObjectUtil.isNotEmpty(byClickId)) {
+            log.info("线索已存在:{}", lead.getTraceId());
+            return;
         }
         lead.setStatus(0);
         lead.setClickTrigger(1);
         lead.setTraceRawParams(JSONUtil.toJsonStr(allParams));
+        lead.setTraceId(SnowflakeUtil.randomUUID());
         boolean saved = leadService.save(lead);
         if (!saved) {
             log.error("线索保存失败:{}", lead);
-            throw new RuntimeException("线索保存失败");
         }
     }
 
     private String getTraceIdByAdvertiser(AdvertiserTypeEnum byCode, Map<String, String> allParams) {
-        String traceId;
+        String clickId;
         switch (byCode) {
             case OCEANENGINE:
             case TENCENT:
-                traceId = allParams.get("clickid");
+                clickId = allParams.get("clickid");
                 break;
             case OPPO:
-                traceId = allParams.get("tid");
+                clickId = allParams.get("tid");
                 break;
             case BAIDU:
-                traceId = allParams.get("bd_vid");
+                clickId = allParams.get("bd_vid");
                 break;
             case VIVO:
-                traceId = allParams.get("requestId");
+                clickId = allParams.get("requestId");
                 break;
             case IQIYI:
-                traceId = allParams.get("traceId");
+                clickId = allParams.get("traceId");
                 break;
             default:
-                traceId = "ylrz_test";
+                clickId = "ylrz_test";
         }
-        if (StrUtil.isEmpty(traceId)) {
-            traceId = "ylrz_test";
+        if (StrUtil.isEmpty(clickId)) {
+            clickId = "ylrz_test"+ IdUtil.randomUUID();
         }
 
-        return traceId;
+        return clickId;
     }
 
     @Override
@@ -133,25 +136,25 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
         // 广告商信息
         Long advertiserId = byId.getAdvertiserId();
         // 访问链路id
-        String traceId = getTraceIdByAdvertiser(Objects.requireNonNull(AdvertiserTypeEnum.getByCode(advertiserId)), allParams);
+        String clickId = getTraceIdByAdvertiser(Objects.requireNonNull(AdvertiserTypeEnum.getByCode(advertiserId)), allParams);
         // 线索信息
-        Lead byTraceId = leadService.getByTraceId(traceId);
-        boolean isNewLead = ObjectUtil.isEmpty(byTraceId);
+        Lead lead = leadService.getByClickId(clickId);
+        boolean isNewLead = ObjectUtil.isEmpty(lead);
         if (isNewLead) {
             IAdvertiserAdapter advertiserAdapter = handlerFactory.getAdapter(AdvertiserTypeEnum.getByCode(advertiserId));
-            byTraceId = advertiserAdapter.adaptCallbackData(allParams);
-            byTraceId.setAdvertiserId(advertiserId);
-            byTraceId.setSiteId(siteId);
-            byTraceId.setTraceId(traceId);
+            lead = advertiserAdapter.adaptCallbackData(allParams);
+            lead.setAdvertiserId(advertiserId);
+            lead.setSiteId(siteId);
+            lead.setClickId(clickId);
             // 设置站点和落地页的关联
-            setSiteByIdeaId(siteId, byTraceId.getIdeaId());
+            setSiteByIdeaId(siteId, lead.getIdeaId());
         } else {
             // 检查站点和广告商信息是否异常
-            if (!Objects.equals(byTraceId.getSiteId(), siteId)) {
-                log.info("落地页站点信息异常:{}---{}", byTraceId.getSiteId(), siteId);
+            if (!Objects.equals(lead.getSiteId(), siteId)) {
+                log.info("落地页站点信息异常:{}---{}", lead.getSiteId(), siteId);
             }
-            if (!Objects.equals(byTraceId.getAdvertiserId(), advertiserId)) {
-                log.info("落地页广告商信息异常:{}---{}", byTraceId.getAdvertiserId(), advertiserId);
+            if (!Objects.equals(lead.getAdvertiserId(), advertiserId)) {
+                log.info("落地页广告商信息异常:{}---{}", lead.getAdvertiserId(), advertiserId);
             }
         }
         // 模板缓存
@@ -172,27 +175,28 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
         LandingPageTemplate landingPageTemplate = landingPageTemplateService.getById(byId.getLaunchPageId());
         JSONObject jsonObject = JSONUtil.parseObj(landingPageTemplate.getTemplateData());
         // 替换二维码链接
-        updateQrCodeInTemplate(jsonObject, traceId, byId, byTraceId);
+        updateQrCodeInTemplate(jsonObject, byId, lead);
         String templateData = JSONUtil.toJsonStr(jsonObject);
 
         // 保存或更新 线索信息
         LocalDateTime now = LocalDateTime.now();
-        byTraceId.setLandingPageRawParams(JSONUtil.toJsonStr(allParams));
-        byTraceId.setLandingPageTrigger(1);
-        byTraceId.setLandingPageTs(now);
-        byTraceId.setUpdateTime(now);
-        byTraceId.setViewUrl(viewUrl);
+        lead.setLandingPageRawParams(JSONUtil.toJsonStr(allParams));
+        lead.setLandingPageTrigger(1);
+        lead.setLandingPageTs(now);
+        lead.setUpdateTime(now);
+        lead.setViewUrl(viewUrl);
         if (isNewLead) {
-            leadService.save(byTraceId);
+            lead.setTraceId(SnowflakeUtil.randomUUID());
+            leadService.save(lead);
         } else {
-            leadService.updateById(byTraceId);
+            leadService.updateById(lead);
         }
 
         // 封装返回结果
         LandingIndexRes res = new LandingIndexRes();
-        redisUtil.set(TEMPLATE_DATA + traceId, templateData, 24, TimeUnit.HOURS);
+        redisUtil.set(TEMPLATE_DATA + lead.getTraceId(), templateData, 24, TimeUnit.HOURS);
         res.setTemplateData(templateData);
-        res.setTraceId(byTraceId.getTraceId());
+        res.setTraceId(lead.getTraceId());
         return res;
     }
 
@@ -205,7 +209,7 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
     /**
      * 更新模板中的二维码信息
      */
-    private void updateQrCodeInTemplate(JSONObject templateData, String traceId, Site site, Lead lead) {
+    private void updateQrCodeInTemplate(JSONObject templateData, Site site, Lead lead) {
         JSONArray configList = templateData.getJSONArray("configList");
         if (configList == null || configList.isEmpty()) {
             return;

+ 3 - 1
fs-service/src/main/java/com/fs/newAdv/domain/Lead.java

@@ -31,10 +31,12 @@ public class Lead implements Serializable {
     private Long siteId;
 
     /**
-     * 链路id唯一(clickId)
+     * 链路id唯一
      */
     private String traceId;
 
+    private String clickId;
+
     /**
      * 来源平台
      */

+ 1 - 2
fs-service/src/main/java/com/fs/newAdv/integration/adapter/BaiduAdapter.java

@@ -28,9 +28,8 @@ public class BaiduAdapter implements IAdvertiserAdapter {
      */
     @Override
     public Lead adaptCallbackData(Map<String, String> rawData) {
-        log.info("百度数据适配:{}", rawData);
         Lead lead = new Lead();
-        lead.setTraceId(rawData.get("bd_vid"));
+        lead.setClickId(rawData.get("bd_vid"));
         lead.setAdvertiserId(AdvertiserTypeEnum.BAIDU.getCode());
         lead.setIp(rawData.get("ip"));
         lead.setIdeaId(rawData.get("aid"));

+ 2 - 2
fs-service/src/main/java/com/fs/newAdv/integration/adapter/OPPOAdapter.java

@@ -30,8 +30,8 @@ public class OPPOAdapter implements IAdvertiserAdapter {
     @Override
     public Lead adaptCallbackData(Map<String, String> rawData) {
         Lead lead = new Lead();
-        lead.setTraceId(rawData.get("request_id"));
-        lead.setAdvertiserId(AdvertiserTypeEnum.TENCENT.getCode());
+        lead.setClickId(rawData.get("request_id"));
+        lead.setAdvertiserId(AdvertiserTypeEnum.OPPO.getCode());
         lead.setIp(rawData.get("ip"));
         if (StrUtil.isNotEmpty(rawData.get("dynamic_creative_id"))){
             lead.setIdeaId(rawData.get("dynamic_creative_id"));

+ 1 - 2
fs-service/src/main/java/com/fs/newAdv/integration/adapter/OceanEngineAdapter.java

@@ -29,9 +29,8 @@ public class OceanEngineAdapter implements IAdvertiserAdapter {
      */
     @Override
     public Lead adaptCallbackData(Map<String, String> rawData) {
-        log.info("巨量引擎数据适配:{}", rawData);
         Lead lead = new Lead();
-        lead.setTraceId(rawData.get("track_id"));
+        lead.setClickId(rawData.get("track_id"));
         lead.setAdvertiserId(AdvertiserTypeEnum.OCEANENGINE.getCode());
         if (StrUtil.isNotEmpty(rawData.get("cid"))) {
             lead.setIdeaId(rawData.get("cid"));

+ 1 - 2
fs-service/src/main/java/com/fs/newAdv/integration/adapter/TencentAdapter.java

@@ -28,9 +28,8 @@ public class TencentAdapter implements IAdvertiserAdapter {
      */
     @Override
     public Lead adaptCallbackData(Map<String, String> rawData) {
-        log.info("腾讯数据适配:{}", rawData);
         Lead lead = new Lead();
-        lead.setTraceId(rawData.get("request_id"));
+        lead.setClickId(rawData.get("request_id"));
         lead.setAdvertiserId(AdvertiserTypeEnum.TENCENT.getCode());
         lead.setIp(rawData.get("ip"));
         if (StrUtil.isNotEmpty(rawData.get("dynamic_creative_id"))){

+ 1 - 2
fs-service/src/main/java/com/fs/newAdv/integration/adapter/VIVOAdapter.java

@@ -28,9 +28,8 @@ public class VIVOAdapter implements IAdvertiserAdapter {
      */
     @Override
     public Lead adaptCallbackData(Map<String, String> rawData) {
-        log.info("VIVO适配:{}", rawData);
         Lead lead = new Lead();
-        lead.setTraceId(rawData.get("requestId"));
+        lead.setClickId(rawData.get("requestId"));
         lead.setAdvertiserId(AdvertiserTypeEnum.VIVO.getCode());
         lead.setIp(rawData.get("ip"));
         lead.setIdeaId(rawData.get("creativeId"));

+ 1 - 2
fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/OPPOApiClient.java

@@ -53,7 +53,6 @@ public class OPPOApiClient extends AbstractApiClient {
             String appKey = (String) conversionData.get("appSecret");
             String sign = Hashing.sha1().hashString(appId + appKey + timestamp, Charset.defaultCharset()).toString();
             String token = BaseEncoding.base64().encode((ownerId + "," + appId + "," + timestamp + "," + sign).getBytes());
-            log.info("OPPO API请求参数:{}", requestBody);
             // 发送HTTP请求
             return HttpRequest.post(CONVERSION_API_URL)
                     .header("Content-Type", "application/json")
@@ -78,7 +77,7 @@ public class OPPOApiClient extends AbstractApiClient {
         // 广告主id:对应广告主自提供
         params.put("ownerId", conversionData.get("adAccountId"));
         // 用户IP:广告主收集
-        params.put("ip", conversionData.get("ip"));
+        params.put("ip", "127.0.0.1");
         // traceId:播放时追加在url上
         params.put("tid", conversionData.get("traceId"));
         // 流量号:播放时追加在URL上

+ 1 - 0
fs-service/src/main/java/com/fs/newAdv/service/ILeadService.java

@@ -16,6 +16,7 @@ import java.util.concurrent.CompletableFuture;
 public interface ILeadService extends IService<Lead> {
 
     Lead getByTraceId(String traceId);
+    Lead getByClickId(String clickId);
 
     /**
      * 用户加企业群线索处理

+ 10 - 0
fs-service/src/main/java/com/fs/newAdv/service/impl/LeadServiceImpl.java

@@ -49,6 +49,16 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
         return list.isEmpty() ? null : list.get(0);
     }
 
+    @Override
+    public Lead getByClickId(String clickId) {
+        List<Lead> list = this.list(new LambdaQueryWrapper<Lead>()
+                .eq(Lead::getClickId, clickId));
+        if (list.size() > 1) {
+            log.error("查询投流点击信息不唯一:{}", clickId);
+        }
+        return list.isEmpty() ? null : list.get(0);
+    }
+
     @Override
     @Async
     public void updateGroupAddMemberLead(String userId, String chatId, String corpId, String unionid) {