zhangqin 12 часов назад
Родитель
Сommit
f2196d76a8

+ 13 - 2
fs-ad-new-api/src/main/java/com/fs/app/controller/TrackingController.java

@@ -1,6 +1,8 @@
 package com.fs.app.controller;
 
 import com.fs.app.facade.CallbackProcessingFacadeService;
+import com.fs.common.result.Result;
+import com.fs.newAdv.dto.req.QwExternalIdBindTrackReq;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -29,14 +31,14 @@ public class TrackingController {
      * @param response  HTTP响应
      */
     @GetMapping("/click/{advertiserCode}")
-    public void trackBaidu(
+    public void track(
             @RequestParam Map<String, String> allParams,
             @PathVariable("advertiserCode") Long advertiserCode,
             HttpServletResponse response) {
         log.info("接收监测请求 | params={}", allParams);
         try {
             // 2. 保存点击追踪记录
-            facadeService.saveClickTrace(advertiserCode,allParams);
+            facadeService.saveClickTrace(advertiserCode, allParams);
             // 3. 返回 200 OK
             response.setStatus(HttpServletResponse.SC_OK);
         } catch (Exception e) {
@@ -45,4 +47,13 @@ public class TrackingController {
         }
     }
 
+    /**
+     * 绑定企微用户与线索
+     */
+    @PostMapping("/bind/qwTrack")
+    public Result<String> qwExternalIdBindTrack(@RequestBody QwExternalIdBindTrackReq req) {
+        facadeService.qwExternalIdBindTrack(req);
+        return Result.success();
+    }
+
 }

+ 6 - 1
fs-ad-new-api/src/main/java/com/fs/app/facade/CallbackProcessingFacadeService.java

@@ -1,5 +1,6 @@
 package com.fs.app.facade;
 
+import com.fs.newAdv.dto.req.QwExternalIdBindTrackReq;
 import com.fs.newAdv.dto.req.WeChatLandingIndexReq;
 import com.fs.newAdv.dto.res.LandingIndexRes;
 
@@ -10,9 +11,11 @@ public interface CallbackProcessingFacadeService {
 
     /**
      * 链化追踪点击
+     *
      * @param allParams
      */
-    void saveClickTrace(Long advertiserCode,Map<String,String> allParams);
+    void saveClickTrace(Long advertiserCode, Map<String, String> allParams);
+
     /**
      * 根据站点ID获取落地页信息
      *
@@ -26,4 +29,6 @@ public interface CallbackProcessingFacadeService {
 
 
     LandingIndexRes getWxLandingIndexBySiteId(WeChatLandingIndexReq req);
+
+    void qwExternalIdBindTrack(QwExternalIdBindTrackReq req);
 }

+ 11 - 5
fs-ad-new-api/src/main/java/com/fs/app/facade/CallbackProcessingFacadeServiceImpl.java

@@ -6,17 +6,17 @@ import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.fs.newAdv.integration.adapter.IAdvertiserAdapter;
-import com.fs.newAdv.integration.factory.AdvertiserHandlerFactory;
 import com.fs.common.exception.base.BusinessException;
 import com.fs.common.utils.RedisUtil;
 import com.fs.newAdv.domain.LandingPageTemplate;
 import com.fs.newAdv.domain.Lead;
 import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.dto.req.QwExternalIdBindTrackReq;
 import com.fs.newAdv.dto.req.WeChatLandingIndexReq;
 import com.fs.newAdv.dto.res.LandingIndexRes;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
+import com.fs.newAdv.integration.adapter.IAdvertiserAdapter;
+import com.fs.newAdv.integration.factory.AdvertiserHandlerFactory;
 import com.fs.newAdv.service.ILandingPageTemplateService;
 import com.fs.newAdv.service.ILeadService;
 import com.fs.newAdv.service.ISiteService;
@@ -227,7 +227,7 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
                                                Integer allocationRule,
                                                Long allocationRuleId,
                                                Lead byTraceId) {
-        log.info("开始获取广告二维码: {} {} {} {}", launchType, allocationRule, allocationRuleId ,byTraceId);
+        log.info("开始获取广告二维码: {} {} {} {}", launchType, allocationRule, allocationRuleId, byTraceId);
         // 二维码
         String qrCode = "";
         if (allocationRule == 1) {
@@ -285,10 +285,16 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
     @Override
     public LandingIndexRes getWxLandingIndexBySiteId(WeChatLandingIndexReq req) {
         // 更新授权页访问信息记录
-        leadService.updateAuthIndex(req.getTraceId(),req.getType());
+        leadService.updateAuthIndex(req.getTraceId(), req.getType());
         String templateData = String.valueOf(redisUtil.get(TEMPLATE_DATA + req.getTraceId()));
         LandingIndexRes landingIndexRes = new LandingIndexRes();
         landingIndexRes.setTemplateData(templateData);
         return landingIndexRes;
     }
+
+    @Override
+    public void qwExternalIdBindTrack(QwExternalIdBindTrackReq req) {
+        // 广告线索处理
+        leadService.updateAddMemberLead(req.getQwExternalId(), req.getUnionid());
+    }
 }

+ 1 - 29
fs-qw-api/src/main/java/com/fs/app/service/QwDataCallbackService.java

@@ -1,7 +1,6 @@
 package com.fs.app.service;
 
 import cn.hutool.core.util.RandomUtil;
-import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.app.util.WXBizMsgCrypt;
 import com.fs.common.core.domain.AjaxResult;
@@ -9,7 +8,6 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.PubFun;
 import com.fs.company.service.ICompanyConfigService;
-import com.fs.newAdv.service.ILeadService;
 import com.fs.qw.domain.*;
 import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qw.mapper.QwExternalContactMapper;
@@ -94,8 +92,6 @@ public class QwDataCallbackService {
     private RedisCache redisCache;
     @Autowired
     private QwCompanyMapper qwCompanyMapper;
-    @Autowired
-    private ILeadService leadService;
 
     @Async
     public void dataCallback( Document document,String corpId,QwCompany qwCompany) throws Exception {
@@ -228,32 +224,10 @@ public class QwDataCallbackService {
                                     String qwApiExternal = redisCache.getCacheObject(cacheKey);
                                     if (StringUtil.strIsNullOrEmpty(qwApiExternal)) {
                                         try {
-                                            String externalUserID = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
-                                            String userID = root.getElementsByTagName("UserID").item(0).getTextContent();
                                             // 5. 新增用户
-                                            qwExternalContactService.insertQwExternalContactByExternalUserId(externalUserID,userID,null,corpId,State,WelcomeCode);
+                                            qwExternalContactService.insertQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),null,corpId,State,WelcomeCode);
                                             // 6. 业务逻辑执行成功后,写入 Redis 缓存(有效期 10 分钟)
                                             redisCache.setCacheObject(cacheKey, "1", 10, TimeUnit.MINUTES);
-
-                                            // 广告线索处理
-                                            leadService.updateAddMemberLead(externalUserID,userID,corpId,State)
-                                                    .thenAccept(result -> {
-                                                        if (StrUtil.isNotEmpty(result)) {
-                                                            QwExternalContact qwExternalContact = qwExternalContactMapper.selectQwExternalByExternalIdAndCompanyIdToIdAndFs(externalUserID, userID, corpId);
-                                                            if (qwExternalContact == null){
-                                                                try {
-                                                                    Thread.sleep(2000);
-                                                                } catch (InterruptedException e) {
-                                                                    throw new RuntimeException(e);
-                                                                }
-                                                                qwExternalContact = qwExternalContactMapper.selectQwExternalByExternalIdAndCompanyIdToIdAndFs(externalUserID, userID, corpId);
-                                                            }
-                                                            QwExternalContact temp = new QwExternalContact();
-                                                            temp.setId(qwExternalContact.getId());
-                                                            temp.setTraceId(result);
-                                                            qwExternalContactMapper.updateById(temp);
-                                                        }
-                                                    });
                                         } catch (Exception e) {
                                             // 7. 业务逻辑失败时,删除缓存
                                             redisCache.deleteObject(cacheKey);
@@ -430,8 +404,6 @@ public class QwDataCallbackService {
 
                                     if (qwGroupChatUserOld==null) {
                                         qwGroupChatUserService.insertQwGroupChatUser(qwGroupChatUser);
-                                        // 群员入群 广告判断记录
-                                        leadService.updateGroupAddMemberLead(qwGroupChatUser.getUserId(),qwGroupChatUser.getChatId(),qwGroupChatUser.getCorpId(),qwGroupChatUser.getUnionid());
                                     }else {
                                         qwGroupChatUserOld.setIsOut(1L);
                                         qwGroupChatUserOld.setCorpId(corpId);

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

@@ -76,12 +76,7 @@ public class Lead implements Serializable {
     /**
      * 外部联系人id 添加人id
      */
-    private String externalUserId;
-    /**
-     * 属于用户id 被添加的id
-     */
-    private String userId;
-    private String corpId;
+    private Long externalId;
     /**
      * 群Id
      */

+ 12 - 0
fs-service/src/main/java/com/fs/newAdv/dto/req/QwExternalIdBindTrackReq.java

@@ -0,0 +1,12 @@
+package com.fs.newAdv.dto.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QwExternalIdBindTrackReq implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private Long qwExternalId;
+    private String unionid;
+}

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

@@ -28,12 +28,8 @@ public interface ILeadService extends IService<Lead> {
 
     /**
      * 用户添加企业微信线索处理
-     * @param externalUserID
-     * @param userID
-     * @param corpId
-     * @param state
      */
-    CompletableFuture<String> updateAddMemberLead(String externalUserID, String userID, String corpId, String state);
+    void updateAddMemberLead(Long externalId, String unionId);
     /**
      * 小程序授权线索处理
      * @param traceId

+ 37 - 48
fs-service/src/main/java/com/fs/newAdv/service/impl/LeadServiceImpl.java

@@ -11,17 +11,14 @@ import com.fs.newAdv.mapper.LeadMapper;
 import com.fs.newAdv.service.ILeadService;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.mapper.QwExternalContactMapper;
-import com.fs.qwApi.domain.QwExternalContactResult;
-import com.fs.qwApi.service.QwApiService;
+import com.fs.qw.service.IQwExternalContactService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
-import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 
 /**
  * 域名管理Service实现类
@@ -36,9 +33,9 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
 
     @Autowired
     private ConversionEventPublisher conversionEventPublisher;
-
     @Autowired
-    private QwApiService qwApiService;
+    private IQwExternalContactService qwExternalContactService;
+
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
 
@@ -61,9 +58,7 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
                 .eq(Lead::getAddContactQw, 0)
                 .last("LIMIT 1"));
         if (lead != null) {
-            lead.setCorpId(corpId);
             lead.setChatId(chatId);
-            lead.setUserId(userId);
             lead.setAddContactQw(1);
             this.updateById(lead);
 
@@ -80,65 +75,59 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
 
     @Override
     @Async
-    public CompletableFuture<String> updateAddMemberLead(String externalUserID, String userID, String corpId, String state) {
-        QwExternalContactResult externalContactResult = qwApiService.getExternalcontact(externalUserID, corpId);
-        String unionid = externalContactResult.getExternal_contact().getUnionid();
+    public void updateAddMemberLead(Long externalId, String unionid) {
+        QwExternalContact qwExternalContact = qwExternalContactService.selectQwExternalContactById(externalId);
+        if (qwExternalContact == null) {
+            log.info("外部联系人信息不存在:{}", externalId);
+            return;
+        }
         // 末次归因逻辑
         Lead lead = this.getOne(new LambdaQueryWrapper<Lead>()
                 .eq(Lead::getUnionid, unionid)
                 .eq(Lead::getAddContactQwGroup, 0)
                 .last("LIMIT 1"));
         if (lead != null) {
-            lead.setExternalUserId(externalUserID);
-            lead.setCorpId(corpId);
-            lead.setUserId(userID);
+            lead.setExternalId(externalId);
             lead.setAddContactQwGroup(1);
             this.updateById(lead);
-
             // 绑定企微用户线索关系
-            QwExternalContact qwExternalContact = qwExternalContactMapper.selectQwExternalByExternalIdAndCompanyIdToIdAndFs(externalUserID, userID, corpId);
-            if (qwExternalContact != null){
-                QwExternalContact temp = new QwExternalContact();
-                temp.setId(qwExternalContact.getId());
-                temp.setTraceId(lead.getTraceId());
-                qwExternalContactMapper.updateById(temp);
-            }else {
-                log.info("广告归因企微用户信息不存在:{} {} {} ", externalUserID, userID,corpId);
-            }
+            QwExternalContact temp = new QwExternalContact();
+            temp.setId(qwExternalContact.getId());
+            temp.setTraceId(lead.getTraceId());
+            qwExternalContactMapper.updateById(temp);
             if (ObjectUtil.isNotEmpty(lead.getLandingPageTs()) && lead.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
                 // 当日加微事件回调
                 conversionEventPublisher.publishConversionEvent(lead.getTraceId(), SystemEventTypeEnum.WEI_CHAT_TODAY);
             }
-            return CompletableFuture.completedFuture(lead.getTraceId());
+
         } else {
-            log.info("广告归因线索不存在:{} {} {}", externalUserID, userID,corpId);
+            log.info("广告归因线索不存在:{} {}", externalId, unionid);
         }
-        return CompletableFuture.completedFuture(null);
     }
 
     @Override
     @Async
     public void weChatAuthorizationLead(String traceId, String unionId, String maOpenId, String phone) {
-       try{
-           log.info("用户微信授权线索信息:{}", traceId);
-           Lead byTraceId = this.getByTraceId(traceId);
-           if (byTraceId == null) {
-               return;
-           }
-           this.update(new LambdaUpdateWrapper<Lead>()
-                   .eq(Lead::getTraceId, traceId)
-                   .set(ObjectUtil.isNotEmpty(unionId),Lead::getUnionid, unionId)
-                   .set(ObjectUtil.isNotEmpty(phone),Lead::getPhone, phone)
-                   .set(ObjectUtil.isNotEmpty(maOpenId),Lead::getOpenid, maOpenId)
-                   .set(Lead::getMiniAuth, 1));
-           if (ObjectUtil.isNotEmpty(byTraceId.getLandingPageTs()) && byTraceId.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
-               // 微信授权且当日创建事件
-               log.info("用户微信授权线索事件回传:{}", traceId);
-               conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
-           }
-       }catch (Exception e){
-           e.printStackTrace();
-       }
+        try {
+            log.info("用户微信授权线索信息:{}", traceId);
+            Lead byTraceId = this.getByTraceId(traceId);
+            if (byTraceId == null) {
+                return;
+            }
+            this.update(new LambdaUpdateWrapper<Lead>()
+                    .eq(Lead::getTraceId, traceId)
+                    .set(ObjectUtil.isNotEmpty(unionId), Lead::getUnionid, unionId)
+                    .set(ObjectUtil.isNotEmpty(phone), Lead::getPhone, phone)
+                    .set(ObjectUtil.isNotEmpty(maOpenId), Lead::getOpenid, maOpenId)
+                    .set(Lead::getMiniAuth, 1));
+            if (ObjectUtil.isNotEmpty(byTraceId.getLandingPageTs()) && byTraceId.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
+                // 微信授权且当日创建事件
+                log.info("用户微信授权线索事件回传:{}", traceId);
+                conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
@@ -161,7 +150,7 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
         boolean update = this.update(new LambdaUpdateWrapper<Lead>()
                 .eq(Lead::getTraceId, traceId)
                 .set(Lead::getMiniLaunchIndexCount, 1));
-        if (!update){
+        if (!update) {
             log.error("发起进入小程序失败:{}", traceId);
         }
     }