|
|
@@ -1,156 +1,104 @@
|
|
|
package com.fs.app.facade;
|
|
|
|
|
|
-import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
-import com.fs.app.enums.AdvertiserTypeEnum;
|
|
|
-import com.fs.app.enums.ConversionTypeEnum;
|
|
|
-import com.fs.app.event.ConversionEventPublisher;
|
|
|
+import com.fs.app.integration.adapter.IAdvertiserAdapter;
|
|
|
import com.fs.app.integration.client.IAccessTokenClient;
|
|
|
import com.fs.app.integration.client.IApiClient;
|
|
|
import com.fs.app.integration.factory.AdvertiserHandlerFactory;
|
|
|
-import com.fs.app.mq.message.ClickMessage;
|
|
|
import com.fs.common.exception.base.BusinessException;
|
|
|
-import com.fs.newAdv.domain.*;
|
|
|
-import com.fs.newAdv.dto.req.LeadSubmitRequest;
|
|
|
+import com.fs.newAdv.domain.LandingPageTemplate;
|
|
|
+import com.fs.newAdv.domain.Lead;
|
|
|
+import com.fs.newAdv.domain.PromotionAccount;
|
|
|
+import com.fs.newAdv.domain.Site;
|
|
|
import com.fs.newAdv.dto.res.LandingIndexRes;
|
|
|
-import com.fs.newAdv.service.*;
|
|
|
+import com.fs.newAdv.enums.AdvertiserTypeEnum;
|
|
|
+import com.fs.newAdv.service.ILandingPageTemplateService;
|
|
|
+import com.fs.newAdv.service.ILeadService;
|
|
|
+import com.fs.newAdv.service.IPromotionAccountService;
|
|
|
+import com.fs.newAdv.service.ISiteService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
|
|
|
@Service
|
|
|
@Slf4j
|
|
|
public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFacadeService {
|
|
|
-
|
|
|
@Autowired
|
|
|
private AdvertiserHandlerFactory handlerFactory;
|
|
|
-
|
|
|
@Autowired
|
|
|
private ILeadService leadService;
|
|
|
@Autowired
|
|
|
private ISiteService siteService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private ConversionEventPublisher conversionEventPublisher;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IClickTraceService iClickTraceService;
|
|
|
@Autowired
|
|
|
private ILandingPageTemplateService landingPageTemplateService;
|
|
|
@Autowired
|
|
|
private IPromotionAccountService promotionAccountService;
|
|
|
|
|
|
@Override
|
|
|
- public void saveClickTrace(AdvertiserTypeEnum trackType, Map<String, String> allParams) {
|
|
|
- ClickTrace trace = new ClickTrace();
|
|
|
- // 提取不同平台的参数
|
|
|
- extractPlatformParams(trace, trackType, allParams);
|
|
|
- // 保存原始参数
|
|
|
- trace.setRawParams(JSONUtil.toJsonStr(allParams));
|
|
|
- // 状态初始化
|
|
|
- trace.setIsConverted(0);
|
|
|
- trace.setSource(trackType.getName());
|
|
|
- // 时间
|
|
|
- trace.setCreateTime(LocalDateTime.now());
|
|
|
- trace.setUpdateTime(LocalDateTime.now());
|
|
|
-
|
|
|
- iClickTraceService.save(trace);
|
|
|
- log.info("点击追踪记录保存成功:traceId={}", trace.getTraceId());
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取traceId和source平台信息
|
|
|
- *
|
|
|
- * @param allParams
|
|
|
- * @return traceId 线索id
|
|
|
- */
|
|
|
- private Map<String, String> getTraceIdByPlatformParams(Long advertiserId, Map<String, String> allParams) {
|
|
|
- Map<String, String> traceId = new HashMap<>();
|
|
|
- if (Objects.equals(AdvertiserTypeEnum.getByCode(advertiserId), AdvertiserTypeEnum.BAIDU) && StrUtil.isNotEmpty(allParams.get("bd_vid"))) {
|
|
|
- traceId.put("traceId", allParams.get("bd_vid"));
|
|
|
- } else if (Objects.equals(AdvertiserTypeEnum.getByCode(advertiserId), AdvertiserTypeEnum.OCEANENGINE) && StrUtil.isNotEmpty(allParams.get("bd_vid"))) {
|
|
|
- traceId.put("traceId", allParams.get("bd_vid"));
|
|
|
- }else if (Objects.equals(AdvertiserTypeEnum.getByCode(advertiserId), AdvertiserTypeEnum.GDT) && StrUtil.isNotEmpty(allParams.get("bd_vid"))) {
|
|
|
- traceId.put("traceId", allParams.get("bd_vid"));
|
|
|
- }else if (Objects.equals(AdvertiserTypeEnum.getByCode(advertiserId), AdvertiserTypeEnum.OPPO) && StrUtil.isNotEmpty(allParams.get("pageId"))) {
|
|
|
- traceId.put("traceId", allParams.get("pageId"));
|
|
|
- }else if (Objects.equals(AdvertiserTypeEnum.getByCode(advertiserId), AdvertiserTypeEnum.VIVO) && StrUtil.isNotEmpty(allParams.get("bd_vid"))) {
|
|
|
- traceId.put("traceId", allParams.get("bd_vid"));
|
|
|
- }else if (Objects.equals(AdvertiserTypeEnum.getByCode(advertiserId), AdvertiserTypeEnum.iQIYI) && StrUtil.isNotEmpty(allParams.get("bd_vid"))) {
|
|
|
- traceId.put("traceId", allParams.get("bd_vid"));
|
|
|
+ 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());
|
|
|
}
|
|
|
- return traceId;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void updateClickTrace(ClickMessage clickMessage) {
|
|
|
- Map<String, String> params = getTraceIdByPlatformParams(null,clickMessage.getAllParams());
|
|
|
- Site site = siteService.getById(clickMessage.getSiteId());
|
|
|
- ClickTrace byTraceId = iClickTraceService.getByTraceId(params.get("traceId"));
|
|
|
- byTraceId.setSiteId(site.getId());
|
|
|
- byTraceId.setAdvertiserId(site.getAdvertiserId());
|
|
|
- byTraceId.setAdvertiserName(site.getAdvertiserName());
|
|
|
- byTraceId.setViewUrl(clickMessage.getViewUrl());
|
|
|
- siteService.updateById(site);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 提取不同平台的参数
|
|
|
- */
|
|
|
- private void extractPlatformParams(ClickTrace trace,
|
|
|
- AdvertiserTypeEnum trackType,
|
|
|
- Map<String, String> allParams) {
|
|
|
- switch (trackType) {
|
|
|
- case BAIDU:
|
|
|
- trace.setTraceId(allParams.get("bd_vid"));
|
|
|
- trace.setClickId(allParams.get("click_id"));
|
|
|
- trace.setCreativeId(allParams.get("aid"));
|
|
|
- trace.setCampaignId(allParams.get("pid"));
|
|
|
- trace.setIp(allParams.get("ip"));
|
|
|
- break;
|
|
|
- case OCEANENGINE:
|
|
|
- break;
|
|
|
+ lead.setStatus(0);
|
|
|
+ lead.setClickTrigger(1);
|
|
|
+ lead.setTraceRawParams(JSONUtil.toJsonStr(allParams));
|
|
|
+ boolean saved = leadService.save(lead);
|
|
|
+ if (!saved) {
|
|
|
+ log.error("线索保存失败:{}", lead);
|
|
|
+ throw new RuntimeException("线索保存失败");
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void submitForm(LeadSubmitRequest request) {
|
|
|
- Site byId = siteService.getById(request.getSiteId());
|
|
|
- if (byId == null) {
|
|
|
- throw new BusinessException("站点不存在");
|
|
|
+ public void saveLandingIndexTrace(Long siteId, Map<String, String> allParams) {
|
|
|
+ Site byId = siteService.getById(siteId);
|
|
|
+ Long advertiserId = byId.getAdvertiserId();
|
|
|
+ String traceId = getTraceIdByAdvertiser(Objects.requireNonNull(AdvertiserTypeEnum.getByCode(advertiserId)), allParams);
|
|
|
+ Lead byTraceId = leadService.getByTraceId(traceId);
|
|
|
+ if (ObjectUtil.isEmpty(byTraceId)) {
|
|
|
+ byTraceId = new Lead();
|
|
|
+ byTraceId.setAdvertiserId(advertiserId);
|
|
|
+ byTraceId.setSiteId(siteId);
|
|
|
+ leadService.save(byTraceId);
|
|
|
}
|
|
|
- Map<String, String> params = getTraceIdByPlatformParams(byId.getAdvertiserId(), request.getRawParams());
|
|
|
- String traceId = params.get("traceId");
|
|
|
- if (StrUtil.isEmpty(traceId)) {
|
|
|
- throw new BusinessException("缺少traceId");
|
|
|
+ if (!Objects.equals(byTraceId.getSiteId(), siteId)) {
|
|
|
+ log.info("落地页站点信息异常:{}---{}", byTraceId.getSiteId(), siteId);
|
|
|
}
|
|
|
- // 2. 构建Lead对象
|
|
|
- Lead lead = new Lead();
|
|
|
- lead.setSiteId(request.getSiteId());
|
|
|
- lead.setViewUrl(request.getViewUrl());
|
|
|
- lead.setAdvertiserId(byId.getAdvertiserId());
|
|
|
- lead.setAdvertiserName(byId.getAdvertiserName());
|
|
|
- lead.setTraceId(traceId);
|
|
|
- lead.setStatus(0); // 新线索
|
|
|
-
|
|
|
- // 3. 保存原始参数JSON(优先使用前端传递的完整参数)
|
|
|
- Map<String, Object> rawParams = new HashMap<>();
|
|
|
- if (request.getRawParams() != null && !request.getRawParams().isEmpty()) {
|
|
|
- // 使用前端传递的所有URL参数(包括bd_vid等平台特定参数)
|
|
|
- rawParams.putAll(request.getRawParams());
|
|
|
+ if (!Objects.equals(byTraceId.getAdvertiserId(), advertiserId)) {
|
|
|
+ log.info("落地页站点信息异常:{}---{}", byTraceId.getAdvertiserId(), advertiserId);
|
|
|
}
|
|
|
- lead.setRawParams(JSONUtil.toJsonStr(rawParams));
|
|
|
-
|
|
|
- // 4. 获取客户端信息
|
|
|
+ byTraceId.setLandingPageRawParams(JSONUtil.toJsonStr(allParams));
|
|
|
+ byTraceId.setLandingPageTrigger(1);
|
|
|
+ byTraceId.setLandingPageTs(LocalDateTime.now());
|
|
|
+ byTraceId.setUpdateTime(LocalDateTime.now());
|
|
|
+ leadService.updateById(byTraceId);
|
|
|
+ }
|
|
|
|
|
|
- // 5. 保存线索并触发转化事件
|
|
|
- saveLeadAndTriggerConversion(lead);
|
|
|
+ private String getTraceIdByAdvertiser(AdvertiserTypeEnum byCode, Map<String, String> allParams) {
|
|
|
+ switch (byCode) {
|
|
|
+ case OCEANENGINE:
|
|
|
+ return allParams.get("click_id");
|
|
|
+ case TENCENT:
|
|
|
+ return allParams.get("click_id");
|
|
|
+ case OPPO:
|
|
|
+ return allParams.get("traceId");
|
|
|
+ case BAIDU:
|
|
|
+ return allParams.get("bdVid");
|
|
|
+ case VIVO:
|
|
|
+ return allParams.get("requestId");
|
|
|
+ case IQIYI:
|
|
|
+ return allParams.get("traceId");
|
|
|
+ default:
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -164,40 +112,19 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
|
|
|
|
|
|
@Override
|
|
|
public void gdtGetAuthCode(Integer code, Long state) {
|
|
|
- if (code == null || state == null) {
|
|
|
+ /* if (code == null || state == null) {
|
|
|
return;
|
|
|
}
|
|
|
PromotionAccount byId = promotionAccountService.getById(state);
|
|
|
if (byId == null) {
|
|
|
return;
|
|
|
}
|
|
|
- IApiClient apiClient = handlerFactory.getApiClient(AdvertiserTypeEnum.GDT);
|
|
|
+ IApiClient apiClient = handlerFactory.getApiClient(AdvertiserTypeEnum.TENCENT);
|
|
|
if (apiClient instanceof IAccessTokenClient) {
|
|
|
IAccessTokenClient tokenClient = (IAccessTokenClient) apiClient;
|
|
|
Map<String, String> accessToken = tokenClient.getAccessToken(code, byId.getAppId(), byId.getAppSecret(), byId.getCallbackUrl());
|
|
|
byId.setAccessToken(accessToken.get("access_token"));
|
|
|
byId.setRefreshToken(accessToken.get("refresh_token"));
|
|
|
- }
|
|
|
-
|
|
|
+ }*/
|
|
|
}
|
|
|
-
|
|
|
- public void saveLeadAndTriggerConversion(Lead lead) {
|
|
|
- // 1. 保存线索到数据库
|
|
|
- boolean saved = leadService.save(lead);
|
|
|
- if (!saved) {
|
|
|
- log.error("线索保存失败 | phone={}", lead.getPhone());
|
|
|
- throw new RuntimeException("线索保存失败");
|
|
|
- }
|
|
|
- // 2. 如果有点击ID和来源,触发转化事件
|
|
|
- // 发布转化事件(会自动发送到MQ)
|
|
|
- conversionEventPublisher.publishConversionEvent(
|
|
|
- lead.getSiteId(), // 站点ID
|
|
|
- lead.getTraceId(), // 点击ID
|
|
|
- AdvertiserTypeEnum.getByCode(lead.getAdvertiserId()), // 广告商(BAIDU/OCEANENGINE/SINA/GDT)
|
|
|
- ConversionTypeEnum.FORM_SUBMIT, // 事件类型:提交表单
|
|
|
- null, // 转化价值(可选)
|
|
|
- lead.getId() // 线索ID
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
}
|