Browse Source

Merge remote-tracking branch 'origin/master'

xw 3 days ago
parent
commit
dc6da4c74d
28 changed files with 180 additions and 48 deletions
  1. 3 0
      fs-ad-new-api/src/main/java/com/fs/app/controller/CallbackController.java
  2. 12 1
      fs-ad-new-api/src/main/java/com/fs/app/facade/CallbackProcessingFacadeServiceImpl.java
  3. 1 1
      fs-ad-new-api/src/main/java/com/fs/app/task/DataSyncTask.java
  4. 2 2
      fs-ad-new-api/src/main/resources/application.yml
  5. 2 2
      fs-company/src/main/resources/application.yml
  6. 3 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  7. 16 3
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  8. 1 1
      fs-service/src/main/java/com/fs/newAdv/domain/Lead.java
  9. 4 0
      fs-service/src/main/java/com/fs/newAdv/domain/Site.java
  10. 1 1
      fs-service/src/main/java/com/fs/newAdv/event/ConversionEventListener.java
  11. 1 1
      fs-service/src/main/java/com/fs/newAdv/integration/client/IApiClient.java
  12. 1 1
      fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/BaiduApiClient.java
  13. 1 1
      fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/IQIYIApiClient.java
  14. 1 1
      fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/OPPOApiClient.java
  15. 88 9
      fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/OceanEngineApiClient.java
  16. 1 1
      fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/TencentApiClient.java
  17. 1 1
      fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/VIVOApiClient.java
  18. 22 18
      fs-service/src/main/java/com/fs/newAdv/service/impl/LeadServiceImpl.java
  19. 4 4
      fs-service/src/main/java/com/fs/newAdv/service/impl/SiteStatisticsServiceImpl.java
  20. 1 0
      fs-service/src/main/resources/application-config-druid-cfryt-test.yml
  21. 1 0
      fs-service/src/main/resources/application-config-druid-cfryt.yml
  22. 1 0
      fs-service/src/main/resources/application-config-druid-fby.yml
  23. 1 0
      fs-service/src/main/resources/application-config-druid-gzzdy.yml
  24. 1 0
      fs-service/src/main/resources/application-config-druid-hat.yml
  25. 1 0
      fs-service/src/main/resources/application-config-druid-hst.yml
  26. 1 0
      fs-service/src/main/resources/application-config-druid-kyt.yml
  27. 1 0
      fs-service/src/main/resources/application-config-druid-qdtst.yml
  28. 7 0
      fs-service/src/main/resources/application-config-druid-sft.yml

+ 3 - 0
fs-ad-new-api/src/main/java/com/fs/app/controller/CallbackController.java

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
 
 
 /**
 /**
  * 广告商回调接口
  * 广告商回调接口
@@ -114,10 +115,12 @@ public class CallbackController {
                 .appId(byId.getAppId())
                 .appId(byId.getAppId())
                 .authCode(authCode)
                 .authCode(authCode)
                 .appSecret(byId.getAppSecret())
                 .appSecret(byId.getAppSecret())
+                .appSecret(byId.getAppSecret())
                 .build());
                 .build());
         if (ObjectUtil.isNotEmpty(accessToken)) {
         if (ObjectUtil.isNotEmpty(accessToken)) {
             byId.setAccessToken(accessToken.getAccessToken());
             byId.setAccessToken(accessToken.getAccessToken());
             byId.setRefreshToken(accessToken.getRefreshToken());
             byId.setRefreshToken(accessToken.getRefreshToken());
+            byId.setUpdateTime(LocalDateTime.now());
             promotionAccountService.updateById(byId);
             promotionAccountService.updateById(byId);
         } else {
         } else {
             log.error("获取accessToken失败:{}", byId.getId());
             log.error("获取accessToken失败:{}", byId.getId());

+ 12 - 1
fs-ad-new-api/src/main/java/com/fs/app/facade/CallbackProcessingFacadeServiceImpl.java

@@ -5,6 +5,8 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 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.adapter.IAdvertiserAdapter;
 import com.fs.newAdv.integration.factory.AdvertiserHandlerFactory;
 import com.fs.newAdv.integration.factory.AdvertiserHandlerFactory;
 import com.fs.common.exception.base.BusinessException;
 import com.fs.common.exception.base.BusinessException;
@@ -134,10 +136,13 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
         Lead byTraceId = leadService.getByTraceId(traceId);
         Lead byTraceId = leadService.getByTraceId(traceId);
         boolean isNewLead = ObjectUtil.isEmpty(byTraceId);
         boolean isNewLead = ObjectUtil.isEmpty(byTraceId);
         if (isNewLead) {
         if (isNewLead) {
-            byTraceId = new Lead();
+            IAdvertiserAdapter advertiserAdapter = handlerFactory.getAdapter(AdvertiserTypeEnum.getByCode(advertiserId));
+            byTraceId = advertiserAdapter.adaptCallbackData(allParams);
             byTraceId.setAdvertiserId(advertiserId);
             byTraceId.setAdvertiserId(advertiserId);
             byTraceId.setSiteId(siteId);
             byTraceId.setSiteId(siteId);
             byTraceId.setTraceId(traceId);
             byTraceId.setTraceId(traceId);
+            // 设置站点和落地页的关联
+            setSiteByIdeaId(siteId, byTraceId.getIdeaId());
         } else {
         } else {
             // 检查站点和广告商信息是否异常
             // 检查站点和广告商信息是否异常
             if (!Objects.equals(byTraceId.getSiteId(), siteId)) {
             if (!Objects.equals(byTraceId.getSiteId(), siteId)) {
@@ -182,6 +187,12 @@ public class CallbackProcessingFacadeServiceImpl implements CallbackProcessingFa
         return res;
         return res;
     }
     }
 
 
+    private void setSiteByIdeaId(Long siteId, String ideaId) {
+        siteService.update(new LambdaUpdateWrapper<Site>()
+                .eq(Site::getId, siteId)
+                .set(Site::getIdeaId, ideaId));
+    }
+
     /**
     /**
      * 更新模板中的二维码信息
      * 更新模板中的二维码信息
      */
      */

+ 1 - 1
fs-ad-new-api/src/main/java/com/fs/app/task/DataSyncTask.java

@@ -57,7 +57,7 @@ public class DataSyncTask {
      * 数据同步任务->当日数据
      * 数据同步任务->当日数据
      * cron: 每1小时统计站点数据
      * cron: 每1小时统计站点数据
      */
      */
-    @Scheduled(cron = "0 0 0/1 * * ?")
+    @Scheduled(cron = "0 0/1 * * * ?")
     public void syncTodayData() {
     public void syncTodayData() {
         String batchNo = DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd");
         String batchNo = DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd");
         statisticsService.syncData(batchNo, 1);
         statisticsService.syncData(batchNo, 1);

+ 2 - 2
fs-ad-new-api/src/main/resources/application.yml

@@ -4,6 +4,6 @@ server:
 # Spring配置
 # Spring配置
 spring:
 spring:
   profiles:
   profiles:
-#    active: dev
-    active: druid-ylrz
+    active: dev
+#    active: druid-ylrz
 
 

+ 2 - 2
fs-company/src/main/resources/application.yml

@@ -1,9 +1,9 @@
 server:
 server:
-  port: 7773
+  port: 8006
 # Spring配置
 # Spring配置
 spring:
 spring:
   profiles:
   profiles:
-    active: druid-ylrz
+    active: dev
 #    active: druid-jnsyj-test
 #    active: druid-jnsyj-test
 #    active: druid-jnmy-test
 #    active: druid-jnmy-test
 #    active: druid-jzzx-test
 #    active: druid-jzzx-test

+ 3 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -2621,10 +2621,13 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         }
         }
         // 项目看课数限制
         // 项目看课数限制
         if (!EXCLUDE_PROJECTS.contains(signProjectName) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
         if (!EXCLUDE_PROJECTS.contains(signProjectName) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
+            log.error("进入了看课限制:传入参数:={},watchCourseVideo={}",param, watchCourseVideo);
             Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), courseProject);
             Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), courseProject);
             if (Objects.isNull(watchCourseVideo) && logCount > 0) {
             if (Objects.isNull(watchCourseVideo) && logCount > 0) {
                 return ResponseResult.fail(504, "超过项目看课数量限制");
                 return ResponseResult.fail(504, "超过项目看课数量限制");
             }
             }
+        }else {
+            log.error("没有进入看课限制:传入参数:={},watchCourseVideo={}存在问题 ",param, watchCourseVideo);
         }
         }
         //添加判断:该用户是否已经存在此课程的看课记录,并且看课记录的销售id不是传入的销售id
         //添加判断:该用户是否已经存在此课程的看课记录,并且看课记录的销售id不是传入的销售id
         if (watchCourseVideo != null) {
         if (watchCourseVideo != null) {

+ 16 - 3
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -3111,10 +3111,23 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
 
             //获取运费模板区域列表按照城市排序
             //获取运费模板区域列表按照城市排序
             List<FsShippingTemplatesRegionScrm> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(StringUtils.join(tempIds, ","), StringUtils.join(citys, ","));
             List<FsShippingTemplatesRegionScrm> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(StringUtils.join(tempIds, ","), StringUtils.join(citys, ","));
-
+            boolean isQg = false;
+
+            if (CollectionUtils.isEmpty(shippingTemplatesRegionList)&&CollectionUtils.isNotEmpty(shippingTemplatesList)&&shippingTemplatesList.size()<2) {
+                List<RegionInfoDTO> regionList = JSONObject.parseArray(
+                        shippingTemplatesList.get(0).getRegionInfo(),
+                        RegionInfoDTO.class
+                );
+                if (regionList != null && !regionList.isEmpty()) {
+                    RegionInfoDTO regionDTO = regionList.get(0);
+                    if ("默认全国".equals(regionDTO.getRegionName())) {
+                        isQg = true;
+                    }
+                }
+            }
             // 有运费模板,但当前城市没有匹配的区域
             // 有运费模板,但当前城市没有匹配的区域
             if (shippingTemplatesList != null && !shippingTemplatesList.isEmpty()
             if (shippingTemplatesList != null && !shippingTemplatesList.isEmpty()
-                    && (shippingTemplatesRegionList == null || shippingTemplatesRegionList.isEmpty())) {
+                    && (shippingTemplatesRegionList == null || shippingTemplatesRegionList.isEmpty())&&!isQg) {
                 logger.error("运费模板存在,但城市不在运费模板区域内,cityId: {}", cityId);
                 logger.error("运费模板存在,但城市不在运费模板区域内,cityId: {}", cityId);
                 return badCode;
                 return badCode;
             }
             }
@@ -3143,7 +3156,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 // 如果商品有运费模板,但没有找到对应的区域配置,返回错误码
                 // 如果商品有运费模板,但没有找到对应的区域配置,返回错误码
                 if (shippingTemplatesList != null && !shippingTemplatesList.isEmpty()
                 if (shippingTemplatesList != null && !shippingTemplatesList.isEmpty()
                         && shippingTemplatesList.stream().anyMatch(t -> t.getId().equals(tempId))
                         && shippingTemplatesList.stream().anyMatch(t -> t.getId().equals(tempId))
-                        && shippingTemplatesRegion == null) {
+                        && shippingTemplatesRegion == null&&!isQg) {
                     logger.error("商品运费模板存在,但城市不在运费模板区域内,tempId: {}, cityId: {}", tempId, cityId);
                     logger.error("商品运费模板存在,但城市不在运费模板区域内,tempId: {}, cityId: {}", tempId, cityId);
                     return badCode;
                     return badCode;
                 }
                 }

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

@@ -148,7 +148,7 @@ public class Lead implements Serializable {
      */
      */
     private String unitId;
     private String unitId;
     /**
     /**
-     * 创意ID
+     * 广告投流的最小单元 创意ID
      */
      */
     private String ideaId;
     private String ideaId;
     /**
     /**

+ 4 - 0
fs-service/src/main/java/com/fs/newAdv/domain/Site.java

@@ -120,6 +120,10 @@ public class Site implements Serializable {
      */
      */
     private Long allocationRuleId;
     private Long allocationRuleId;
 
 
+    /**
+     * 广告投流的最小单元 创意ID
+     */
+    private String ideaId;
     /**
     /**
      * 创建时间
      * 创建时间
      */
      */

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/event/ConversionEventListener.java

@@ -35,7 +35,7 @@ public class ConversionEventListener {
      *
      *
      * @param event 转化事件
      * @param event 转化事件
      */
      */
-    @Async("asyncExecutor")
+    @Async
     @EventListener
     @EventListener
     public void handleConversionEvent(ConversionEvent event) {
     public void handleConversionEvent(ConversionEvent event) {
         String traceId = event.getTraceId();
         String traceId = event.getTraceId();

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/integration/client/IApiClient.java

@@ -20,6 +20,6 @@ public interface IApiClient {
 
 
     AdvertiserTypeEnum getAdvertiserType();
     AdvertiserTypeEnum getAdvertiserType();
 
 
-    SiteStatistics getDataReport(PromotionAccount account,String startDate,String endDate);
+    SiteStatistics getDataReport(PromotionAccount account,String ideaId,String startDate,String endDate);
 }
 }
 
 

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

@@ -118,7 +118,7 @@ public class BaiduApiClient extends AbstractApiClient implements IAccessTokenCli
     }
     }
 
 
     @Override
     @Override
-    public SiteStatistics getDataReport(PromotionAccount account, String startDate, String endDate) {
+    public SiteStatistics getDataReport(PromotionAccount account,String ideaId, String startDate, String endDate) {
         // 构建请求参数
         // 构建请求参数
         Map<String, Object> map = new HashMap<>();
         Map<String, Object> map = new HashMap<>();
         Map<String, Object> header = new HashMap<>();
         Map<String, Object> header = new HashMap<>();

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

@@ -70,7 +70,7 @@ public class IQIYIApiClient extends AbstractApiClient {
     }
     }
 
 
     @Override
     @Override
-    public SiteStatistics getDataReport(PromotionAccount account,String startDate,String endDate) {
+    public SiteStatistics getDataReport(PromotionAccount account,String ideaId,String startDate,String endDate) {
         return null;
         return null;
     }
     }
 }
 }

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

@@ -92,7 +92,7 @@ public class OPPOApiClient extends AbstractApiClient {
     }
     }
 
 
     @Override
     @Override
-    public SiteStatistics getDataReport(PromotionAccount account,String startDate,String endDate) {
+    public SiteStatistics getDataReport(PromotionAccount account,String ideaId,String startDate,String endDate) {
         return null;
         return null;
     }
     }
 }
 }

+ 88 - 9
fs-service/src/main/java/com/fs/newAdv/integration/client/advertiser/OceanEngineApiClient.java

@@ -3,22 +3,28 @@ package com.fs.newAdv.integration.client.advertiser;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
-import com.fs.newAdv.integration.client.AbstractApiClient;
-import com.fs.newAdv.integration.client.IAccessTokenClient;
+import com.baidu.dev2.thirdparty.jackson.core.JsonProcessingException;
+import com.baidu.dev2.thirdparty.jackson.databind.ObjectMapper;
 import com.fs.common.constant.SystemConstant;
 import com.fs.common.constant.SystemConstant;
 import com.fs.common.exception.ThirdPartyException;
 import com.fs.common.exception.ThirdPartyException;
 import com.fs.newAdv.domain.PromotionAccount;
 import com.fs.newAdv.domain.PromotionAccount;
 import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
+import com.fs.newAdv.integration.client.AbstractApiClient;
+import com.fs.newAdv.integration.client.IAccessTokenClient;
 import com.fs.newAdv.vo.AccessTokenByAuthCodeVo;
 import com.fs.newAdv.vo.AccessTokenByAuthCodeVo;
 import com.fs.newAdv.vo.AccessTokenVo;
 import com.fs.newAdv.vo.AccessTokenVo;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.utils.URIBuilder;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
-import java.util.HashMap;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.*;
 
 
 /**
 /**
  * 巨量引擎API客户端
  * 巨量引擎API客户端
@@ -35,7 +41,8 @@ public class OceanEngineApiClient extends AbstractApiClient implements IAccessTo
     /**
     /**
      * 巨量引擎转化回传API地址
      * 巨量引擎转化回传API地址
      */
      */
-    private static final String CONVERSION_API_URL = "https://ad.oceanengine.com/track/activate";
+    private static final String CONVERSION_API_URL = "https://ad.oceanengine.com/track/activate/";
+    private static final String REPORT_API_URL = "https://api.oceanengine.com/open_api/v3.0/report/custom/get/";
     /**
     /**
      * 获取Access Token
      * 获取Access Token
      */
      */
@@ -127,13 +134,83 @@ public class OceanEngineApiClient extends AbstractApiClient implements IAccessTo
     }
     }
 
 
     @Override
     @Override
-    public SiteStatistics getDataReport(PromotionAccount account,String startDate,String endDate) {
-        return null;
+    public SiteStatistics getDataReport(PromotionAccount account,String ideaId, String startDate, String endDate) {
+        // 构建请求参数
+        Map<String, Object> map = new HashMap<>();
+        map.put("advertiser_id", Long.valueOf(account.getAdAccountId()));
+        // 纬度--天
+        map.put("dimensions", Arrays.asList("stat_time_day"));
+        // 过滤条件
+        Map<String,Object> filters = new HashMap<>();
+        filters.put("field","cdp_promotion_id");
+        filters.put("type",2);
+        filters.put("operator",1);
+        filters.put("values ",Arrays.asList(ideaId));
+        map.put("filters", Arrays.asList(filters));
+        /**
+         * stat_cost 消耗(元)
+         * show_cnt 展示数
+         * cpm_platform 平均千次展现费用(元)
+         * click_cnt 点击数
+         * ctr 点击率
+         * cpc_platform 平均点击单价(元)
+         * convert_cnt 转化数
+         * conversion_cost 平均转化成本
+         * conversion_rate 转化率
+         */
+        map.put("metrics", Arrays.asList("stat_cost",
+                "show_cnt", "cpm_platform", "click_cnt", "ctr", "cpc_platform", "cpc_platform", "convert_cnt",
+                "conversion_cost", "conversion_rate"));
+        map.put("start_time", startDate);
+        map.put("end_time", endDate);
+        map.put("order_by", Collections.emptyList());
+        String url;
+        try {
+            URIBuilder ub = new URIBuilder(REPORT_API_URL);
+            ObjectMapper objectMapper = new ObjectMapper();
+            map.forEach((k, v) -> {
+                try {
+                    ub.addParameter(k, v instanceof String ? (String) v : objectMapper.writeValueAsString(v));
+                } catch (JsonProcessingException e) {
+                    throw new RuntimeException(e);
+                }
+            });
+            url = ub.build().toURL().toString();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        HttpResponse execute = HttpRequest.get(url)
+                .header("Access-Token", account.getAccessToken())
+                .timeout(SystemConstant.API_TIMEOUT)
+                .execute();
+        JSONObject jsonObject = JSONUtil.parseObj(execute.body());
+        if (jsonObject.getInt("code") != 0) {
+            // 刷新token重新请求
+            log.info("巨量刷新token重新请求");
+            AccessTokenVo accessTokenVo = refreshAccessToken(account.getAppId(), account.getAppSecret(), account.getRefreshToken());
+            execute = HttpRequest.get(url)
+                    .header("Access-Token", accessTokenVo.getAccessToken())
+                    .timeout(SystemConstant.API_TIMEOUT)
+                    .execute();
+            jsonObject = JSONUtil.parseObj(execute.body());
+        }
+        JSONObject data = jsonObject.getJSONObject("data");
+        JSONArray rows = data.getJSONArray("rows");
+        JSONObject jsonObject1 = rows.getJSONObject(0);
+        JSONObject jsonObject2 = jsonObject1.getJSONObject("metrics");
+        SiteStatistics siteStatistics = new SiteStatistics();
+        siteStatistics.setImpressionCount(Integer.valueOf(jsonObject2.getStr("show_cnt")));
+        siteStatistics.setClickCount(Integer.valueOf(jsonObject2.getStr("click_cnt")));
+        siteStatistics.setActualCost(new BigDecimal(jsonObject2.getStr("stat_cost")));
+        siteStatistics.setAccountCost(new BigDecimal(jsonObject2.getStr("stat_cost")));
+        siteStatistics.setClickRate(new BigDecimal(jsonObject2.getStr("ctr")));
+        siteStatistics.setAvgClickPrice(new BigDecimal(jsonObject2.getStr("cpc_platform")));
+        return siteStatistics;
     }
     }
 
 
     @Override
     @Override
     public AccessTokenVo refreshAccessToken(String appId, String appSecret, String refreshToken) {
     public AccessTokenVo refreshAccessToken(String appId, String appSecret, String refreshToken) {
-        Map<String,Object> map = new HashMap<>();
+        Map<String, Object> map = new HashMap<>();
         map.put("app_id", appId);
         map.put("app_id", appId);
         map.put("secret", appSecret);
         map.put("secret", appSecret);
         map.put("refresh_token", refreshToken);
         map.put("refresh_token", refreshToken);
@@ -157,7 +234,7 @@ public class OceanEngineApiClient extends AbstractApiClient implements IAccessTo
 
 
     @Override
     @Override
     public AccessTokenVo getAccessTokenByAuthCode(AccessTokenByAuthCodeVo request) {
     public AccessTokenVo getAccessTokenByAuthCode(AccessTokenByAuthCodeVo request) {
-        Map<String,Object> map = new HashMap<>();
+        Map<String, Object> map = new HashMap<>();
         map.put("app_id", request.getAppId());
         map.put("app_id", request.getAppId());
         map.put("secret", request.getAppSecret());
         map.put("secret", request.getAppSecret());
         map.put("auth_code", request.getAuthCode());
         map.put("auth_code", request.getAuthCode());
@@ -179,5 +256,7 @@ public class OceanEngineApiClient extends AbstractApiClient implements IAccessTo
         }
         }
         return null;
         return null;
     }
     }
+
+
 }
 }
 
 

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

@@ -83,7 +83,7 @@ public class TencentApiClient extends AbstractApiClient implements IAccessTokenC
     }
     }
 
 
     @Override
     @Override
-    public SiteStatistics getDataReport(PromotionAccount account, String startDate, String endDate) {
+    public SiteStatistics getDataReport(PromotionAccount account,String ideaId, String startDate, String endDate) {
         return null;
         return null;
     }
     }
 
 

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

@@ -86,7 +86,7 @@ public class VIVOApiClient extends AbstractApiClient {
     }
     }
 
 
     @Override
     @Override
-    public SiteStatistics getDataReport(PromotionAccount account,String startDate,String endDate) {
+    public SiteStatistics getDataReport(PromotionAccount account,String ideaId,String startDate,String endDate) {
         return null;
         return null;
     }
     }
 }
 }

+ 22 - 18
fs-service/src/main/java/com/fs/newAdv/service/impl/LeadServiceImpl.java

@@ -53,7 +53,7 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
     }
     }
 
 
     @Override
     @Override
-    @Async("asyncExecutor")
+    @Async
     public void updateGroupAddMemberLead(String userId, String chatId, String corpId, String unionid) {
     public void updateGroupAddMemberLead(String userId, String chatId, String corpId, String unionid) {
         // 末次归因逻辑
         // 末次归因逻辑
         Lead lead = this.getOne(new LambdaQueryWrapper<Lead>()
         Lead lead = this.getOne(new LambdaQueryWrapper<Lead>()
@@ -79,7 +79,7 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
     }
     }
 
 
     @Override
     @Override
-    @Async("asyncExecutor")
+    @Async
     public CompletableFuture<String> updateAddMemberLead(String externalUserID, String userID, String corpId, String state) {
     public CompletableFuture<String> updateAddMemberLead(String externalUserID, String userID, String corpId, String state) {
         QwExternalContactResult externalContactResult = qwApiService.getExternalcontact(externalUserID, corpId);
         QwExternalContactResult externalContactResult = qwApiService.getExternalcontact(externalUserID, corpId);
         String unionid = externalContactResult.getExternal_contact().getUnionid();
         String unionid = externalContactResult.getExternal_contact().getUnionid();
@@ -117,26 +117,30 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
     }
     }
 
 
     @Override
     @Override
-    @Async("asyncExecutor")
+    @Async
     public void weChatAuthorizationLead(String traceId, String unionId, String mpOpenId, String phone) {
     public void weChatAuthorizationLead(String traceId, String unionId, String mpOpenId, String phone) {
-        Lead byTraceId = this.getByTraceId(traceId);
-        if (byTraceId == null) {
-            return;
-        }
-        this.update(new LambdaUpdateWrapper<Lead>()
-                .eq(Lead::getTraceId, traceId)
-                .set(Lead::getUnionid, unionId)
-                .set(Lead::getPhone, phone)
-                .set(Lead::getOpenid, mpOpenId)
-                .set(Lead::getMiniAuth, 1));
-        if (ObjectUtil.isNotEmpty(byTraceId.getLandingPageTs()) && byTraceId.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
-            // 微信授权且当日创建事件
-            conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
-        }
+       try{
+           Lead byTraceId = this.getByTraceId(traceId);
+           if (byTraceId == null) {
+               return;
+           }
+           this.update(new LambdaUpdateWrapper<Lead>()
+                   .eq(Lead::getTraceId, traceId)
+                   .set(Lead::getUnionid, unionId)
+                   .set(Lead::getPhone, phone)
+                   .set(Lead::getOpenid, mpOpenId)
+                   .set(Lead::getMiniAuth, 1));
+           if (ObjectUtil.isNotEmpty(byTraceId.getLandingPageTs()) && byTraceId.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
+               // 微信授权且当日创建事件
+               conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
+           }
+       }catch (Exception e){
+           e.printStackTrace();
+       }
     }
     }
 
 
     @Override
     @Override
-    @Async("asyncExecutor")
+    @Async
     public void updateAuthIndex(String traceId, Integer type) {
     public void updateAuthIndex(String traceId, Integer type) {
         LambdaUpdateWrapper<Lead> eq = new LambdaUpdateWrapper<Lead>().eq(Lead::getTraceId, traceId);
         LambdaUpdateWrapper<Lead> eq = new LambdaUpdateWrapper<Lead>().eq(Lead::getTraceId, traceId);
         if (type == 1) {
         if (type == 1) {

+ 4 - 4
fs-service/src/main/java/com/fs/newAdv/service/impl/SiteStatisticsServiceImpl.java

@@ -82,7 +82,7 @@ public class SiteStatisticsServiceImpl extends ServiceImpl<SiteStatisticsMapper,
                                 log.warn("账户 {} 未关联站点,跳过同步", account.getAccountName());
                                 log.warn("账户 {} 未关联站点,跳过同步", account.getAccountName());
                                 return false;
                                 return false;
                             }
                             }
-                            syncAccountData(account, site.getId(), batchNo);
+                            syncAccountData(account, site.getId(),site.getIdeaId(), batchNo);
                             return true;
                             return true;
                         } catch (Exception e) {
                         } catch (Exception e) {
                             log.error("同步账户 {} 数据失败", account.getAccountName(), e);
                             log.error("同步账户 {} 数据失败", account.getAccountName(), e);
@@ -98,9 +98,9 @@ public class SiteStatisticsServiceImpl extends ServiceImpl<SiteStatisticsMapper,
     }
     }
 
 
     /**
     /**
-     * 同步账户数据
+     * 同步账户广告数据
      */
      */
-    private void syncAccountData(PromotionAccount account, Long siteId, String batchNo) {
+    private void syncAccountData(PromotionAccount account, Long siteId,String ideaId, String batchNo) {
         log.info("开始同步账户:{}", account.getAccountName());
         log.info("开始同步账户:{}", account.getAccountName());
 
 
         // 查询现有统计记录
         // 查询现有统计记录
@@ -115,7 +115,7 @@ public class SiteStatisticsServiceImpl extends ServiceImpl<SiteStatisticsMapper,
         if (Integer.valueOf(1).equals(account.getApiSwitch())) {
         if (Integer.valueOf(1).equals(account.getApiSwitch())) {
             IApiClient apiClient = advertiserHandlerFactory.getApiClient(AdvertiserTypeEnum.getByCode(account.getAdvertiserId()));
             IApiClient apiClient = advertiserHandlerFactory.getApiClient(AdvertiserTypeEnum.getByCode(account.getAdvertiserId()));
             try {
             try {
-                siteStatistics = apiClient.getDataReport(account, batchNo, batchNo);
+                siteStatistics = apiClient.getDataReport(account,ideaId, batchNo, batchNo);
             } catch (Exception e) {
             } catch (Exception e) {
                 siteStatistics = new SiteStatistics();
                 siteStatistics = new SiteStatistics();
                 log.error("获取账户数据失败:{} {}", account.getAccountName(), siteId, e);
                 log.error("获取账户数据失败:{} {}", account.getAccountName(), siteId, e);

+ 1 - 0
fs-service/src/main/resources/application-config-druid-cfryt-test.yml

@@ -77,6 +77,7 @@ cloud_host:
   company_name: 赤峰润
   company_name: 赤峰润
   projectCode: ryt
   projectCode: ryt
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-cfryt.yml

@@ -83,6 +83,7 @@ cloud_host:
   company_name: 赤峰润
   company_name: 赤峰润
   projectCode: ryt
   projectCode: ryt
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-fby.yml

@@ -107,6 +107,7 @@ cloud_host:
   company_name: 福本源
   company_name: 福本源
   projectCode: FBY
   projectCode: FBY
   spaceName:
   spaceName:
+  volcengineUrl:
 headerImg:
 headerImg:
   imgUrl: https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250730/1753840024082.png
   imgUrl: https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250730/1753840024082.png
 ipad:
 ipad:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-gzzdy.yml

@@ -84,6 +84,7 @@ cloud_host:
   company_name: 广州郑多燕
   company_name: 广州郑多燕
   projectCode: GZZDY
   projectCode: GZZDY
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl:
   imgUrl:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-hat.yml

@@ -88,6 +88,7 @@ cloud_host:
   company_name: 恒安图
   company_name: 恒安图
   projectCode: HAT
   projectCode: HAT
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl: https://hat-1323137866.cos.ap-chongqing.myqcloud.com/fs/20250928/hatlogo.png
   imgUrl: https://hat-1323137866.cos.ap-chongqing.myqcloud.com/fs/20250928/hatlogo.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-hst.yml

@@ -84,6 +84,7 @@ cloud_host:
   company_name: 鸿森堂
   company_name: 鸿森堂
   projectCode: HST
   projectCode: HST
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl:
   imgUrl:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-kyt.yml

@@ -84,6 +84,7 @@ cloud_host:
   company_name: 宽益堂
   company_name: 宽益堂
   projectCode: KYT
   projectCode: KYT
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl: https://kuanyitang-1317640934.cos.ap-shanghai.myqcloud.com/kuanyitang/20250813/6b3b62e01672407c98f0561b73e35f6a.jpg
   imgUrl: https://kuanyitang-1317640934.cos.ap-shanghai.myqcloud.com/kuanyitang/20250813/6b3b62e01672407c98f0561b73e35f6a.jpg

+ 1 - 0
fs-service/src/main/resources/application-config-druid-qdtst.yml

@@ -91,6 +91,7 @@ cloud_host:
   company_name: 同顺堂
   company_name: 同顺堂
   projectCode: QDTST
   projectCode: QDTST
   spaceName:
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl: https://qdtst-1360717104.cos.ap-nanjing.myqcloud.com/qdtst-1360717104/20250624/937019e4090f46788ef29c4e7df479c3.jpg
   imgUrl: https://qdtst-1360717104.cos.ap-nanjing.myqcloud.com/qdtst-1360717104/20250624/937019e4090f46788ef29c4e7df479c3.jpg

+ 7 - 0
fs-service/src/main/resources/application-config-druid-sft.yml

@@ -62,6 +62,12 @@ watch:
 fs :
 fs :
   commonApi: http://172.30.0.11:8010
   commonApi: http://172.30.0.11:8010
   h5CommonApi: http://119.29.195.254:8010
   h5CommonApi: http://119.29.195.254:8010
+  jwt:
+    # 加密秘钥
+    secret: 9a3f7b1c2e8d45a0f632b819e4c56d12
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
 nuonuo:
   key: 10924508
   key: 10924508
   secret: A2EB20764D304D16
   secret: A2EB20764D304D16
@@ -78,6 +84,7 @@ cloud_host:
   projectCode: SFT
   projectCode: SFT
   spaceName:
   spaceName:
   volcengineUrl:
   volcengineUrl:
+
 #看课授权时显示的头像
 #看课授权时显示的头像
 headerImg:
 headerImg:
   imgUrl: https://sft-1361917636.cos.ap-chongqing.myqcloud.com/sft/20250606/b08b1a6212f44f2998423c8c5d7712ee.png
   imgUrl: https://sft-1361917636.cos.ap-chongqing.myqcloud.com/sft/20250606/b08b1a6212f44f2998423c8c5d7712ee.png