فهرست منبع

Merge branch 'master' of codeup.aliyun.com:60c06368dbbed34fe0f0c263/job/hr_job-bytedance into pingkang

hpk 1 سال پیش
والد
کامیت
99bf970fd4
35فایلهای تغییر یافته به همراه1196 افزوده شده و 402 حذف شده
  1. 3 0
      .gitignore
  2. 14 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/FeishuController.java
  3. 61 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/HistoryDataController.java
  4. 39 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AigcProductAlbum.java
  5. 33 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AigcProductPlatform.java
  6. 2 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAccountReportMapper.java
  7. 21 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAppletTokenRefreshMapper.java
  8. 9 5
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceProductUpdateMapper.java
  9. 14 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/CPSReportMapper.java
  10. 6 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAccountReportMapper.xml
  11. 33 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAppletTokenRefreshMapper.xml
  12. 30 14
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceProductUpdateMapper.xml
  13. 342 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/CPSReportMapper.xml
  14. 1 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/PromoteLinkRefreshMapper.xml
  15. 61 39
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ReportsAdPushMapper.xml
  16. 10 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/BytedanceAppletTokenRefreshService.java
  17. 2 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceAccountReportService.java
  18. 5 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceRefreshTokenService.java
  19. 3 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/ICPSReportService.java
  20. 13 8
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceAccountReportServiceImpl.java
  21. 72 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceAppletTokenRefreshServiceImpl.java
  22. 266 299
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceProductUpdateServiceImpl.java
  23. 5 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceRefreshTokenServiceImpl.java
  24. 34 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/CPSReportServiceImpl.java
  25. 1 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/CutGroupRankPushServiceImpl.java
  26. 5 5
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/DateReportsPushServiceImpl.java
  27. 1 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/FeishuServiceImpl.java
  28. 1 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/OptimizerRankPushServiceImpl.java
  29. 39 15
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsAdPushServiceImpl.java
  30. 3 3
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsByBusinessPushServiceImpl.java
  31. 1 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java
  32. 7 7
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/UnbindWarnPushServiceImpl.java
  33. 32 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAppletTokenRefreshJob.java
  34. 18 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/CPSReportJob.java
  35. 9 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ToolsSiteJob.java

+ 3 - 0
.gitignore

@@ -32,3 +32,6 @@ gen
 hs_err_pid*
 **/target/
 #application.yml
+
+
+/http

+ 14 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/FeishuController.java

@@ -42,13 +42,15 @@ public class FeishuController {
     IDianzhongConfigService dianzhongConfigService;
     @Autowired
     IFeishuService feishuService;
+    @Autowired
+    private ICPSReportService cpsReportService;
 
     @Autowired
     IUserLoginRecordService userLoginRecordService;
     @PostMapping("/test")
     public void test(@RequestBody String str) throws Exception {
 //        bytedanceProductUpdateService.initNew();
-//        bytedanceProductUpdateService.run();
+        bytedanceProductUpdateService.run();
 //        reportsAdPushService.test();
 //        totalRankPushService.test();
 //        dateReportsPushService.preSend();
@@ -56,7 +58,7 @@ public class FeishuController {
 //        unbindWarnPushService.send();
 //        cutGroupRankPushService.send();
 //        reportsByBusinessPushService.test();
-        feishuService.uploadAvatar();
+//        feishuService.uploadAvatar();
 //        csjResoureJob.csjResourceOssJob();
 //    dianzhongConfigService.pullMovieInfo("2025-08-08", 78012L);
 //        dianzhongConfigService.pullChannelInfo();
@@ -64,6 +66,16 @@ public class FeishuController {
 //        dianzhongConfigService.pullMovie();
 //        dianzhongConfigService.movieImageToOss();
 //    dianzhongConfigService.syncPromoteLinkInfo();
+
+//        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        //2025-08-01 ~ 2025-08-31 foreach
+//        String nowDate = "2025-09-01";
+//        for (int i = 1; i <= 16; i++) {
+//            String date = "2025-09-" + (i < 10 ? "0" + i : i);
+//            System.out.println("处理日期:" + date);
+//            cpsReportService.runCPSSettlementData(date);
+//            System.out.println("\n\n");
+//        }
     }
 
 

+ 61 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/HistoryDataController.java

@@ -0,0 +1,61 @@
+package cn.com.ctop.job.bytedance.controller;
+
+import cn.com.ctop.job.bytedance.data.enums.AccountTypeEnum;
+import cn.com.ctop.job.bytedance.data.service.*;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+/**
+ * zian Y
+ * 2022/2/9
+ **/
+
+@RestController
+@RequestMapping("/history")
+@Api(tags = "头条")
+@Slf4j
+public class HistoryDataController {
+    @Autowired
+    private IBytedanceProductReportService productReportService;
+
+    private static final ExecutorService dailyRetrExecutorService = Executors.newFixedThreadPool(3);
+    @Autowired
+    private IByteDanceFlowDetailsReportService byteDanceFlowDetailsReportService;
+
+    @Autowired
+    private IBytedanceAccountReportService accountReportService;
+
+    @Autowired
+    private IBytedancePromoterReportService promoterReportService;
+
+    @GetMapping("/getData")
+    public JSONObject getData(Long advertiserId, String startDate, String endDate) {
+        JSONObject json = new JSONObject();
+        dailyRetrExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+
+                String token = accountReportService.getTokenByAdvertiserId(advertiserId);
+                if (Check.isNull(token)) {
+                    return;
+                }
+                accountReportService.getBytedanceAccountDaily(advertiserId, token, startDate, endDate, 1, 1);
+                promoterReportService.getBytedancePromoterDaily(advertiserId, token, startDate, endDate, 1, 1);
+                byteDanceFlowDetailsReportService.getBytedanceFlowDetailsDailyReport(advertiserId, token, AccountTypeEnum.AD.getValue(), startDate, endDate, 1, null);
+            }
+        });
+        json.put("code", 200);
+        json.put("message", "成功");
+        return json;
+    }
+
+
+}

+ 39 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AigcProductAlbum.java

@@ -0,0 +1,39 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import lombok.Data;
+
+@Data
+public class AigcProductAlbum {
+    /*
+    third.album_id, third.platform_type, detail.platform_config, video.id as video_id, detail.id as video_detail_id, video.name as name, video.cover_img as img,ifnull(category.name, '其他') as 'theme', video.play_platform,
+        '天津星链视界信息技术有限公司' as copyright_owner, '其他' as playlet_gender, video.update_sort as playlet_num, '2' as playlet_duration,
+        payinfo.sort as start_pay_playlet, '5' as membership_types, '2' as has_motivation_types,
+        payinfo.maxpay as max_charge, payinfo.minpay as min_charge, maxpay as recommended_charge, maxpay as price,
+         1 as has_motivation_content
+     */
+    private String albumId;
+    private String platformType;
+    private String platformConfig;
+    private Long videoId;
+    private Long videoDetailId;
+    private String name;
+    private String img;
+    private String theme;
+    private String playPlatform;
+    private String copyrightOwner;
+    private String playletGender;
+    private Integer playletNum;
+    private String playletDuration;
+    private Integer startPayPlaylet;
+    private String membershipTypes;
+    private String hasMotivationTypes;
+    private Integer maxCharge;
+    private Integer minCharge;
+    private Integer recommendedCharge;
+    private Integer price;
+    private Integer hasMotivationContent;
+
+    private Integer startingUnlockEpisode;
+
+    private Integer source;
+}

+ 33 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AigcProductPlatform.java

@@ -0,0 +1,33 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import lombok.Data;
+
+@Data
+public class AigcProductPlatform {
+    private String platformId;//商品库ID
+    private String advertiserId;//所属主账户ID
+    private Integer type;//商品库类型 1:免费 2:付费
+    private Integer platformType;//商品库定位分类 1:抖音小程序(+微信小程序) 2:仅微信小程序
+    private String platformName;//商品库名称
+    private String miniInstanceId;//字节小程序实例ID
+    private String updateTime;//更新时间
+    private String createTime;//创建时间
+    private String miAppid;//使用的小程序ID
+    private Integer membershipTypes;//设置的字节会员类型
+    private Double maxCharge;//最大充值金额
+    private Double minCharge;//最小充值金额
+    private Double recommendedCharge;//推荐充值金额
+    private Double singlePrice;//单价
+    private Integer status;//状态 0:使用中 1:废弃
+    private String socialCreditCode;//管家账号社会信用代码
+    private Integer movieAuthStatus;//剧目认证状态,0-未认证,1-已认证
+    private Integer isBytedance;//投放载体-字节小程序 1:开启 0:关闭
+    private Integer isWechat;//投放载体-微信小程序 1:开启 0:关闭
+    private Integer isDys;//投放载体-端原生 1:开启 0:关闭
+    private Integer source;//短剧来源:1-自投;2-穿山甲,3-爱奇艺
+    private String accessToken;//商品库主账户access_token
+
+    private String miniAppAdvertiserId;//小程序主账户ID
+
+
+}

+ 2 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAccountReportMapper.java

@@ -19,4 +19,6 @@ public interface BytedanceAccountReportMapper {
 
     void replaceErrorInfo(BytedanceErrorLog errorInfo);
     void deleteInfoByErrorId(@Param("errorId") Long errorId);
+
+    String getTokenByAdvertiserId(@Param("advertiserId") Long advertiserId);
 }

+ 21 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAppletTokenRefreshMapper.java

@@ -0,0 +1,21 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 头条项目列Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+public interface BytedanceAppletTokenRefreshMapper {
+
+    List<JSONObject> queryAppletList();
+
+    void refreshAppletTokens(@Param("list") List<JSONObject> list);
+
+}

+ 9 - 5
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceProductUpdateMapper.java

@@ -1,5 +1,7 @@
 package cn.com.ctop.job.bytedance.data.mapper;
 
+import cn.com.ctop.job.bytedance.data.entity.AigcProductAlbum;
+import cn.com.ctop.job.bytedance.data.entity.AigcProductPlatform;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.ibatis.annotations.Param;
 
@@ -7,15 +9,17 @@ import java.util.List;
 
 public interface BytedanceProductUpdateMapper {
 
-    List<JSONObject> getIAPPlatformList();
-    List<JSONObject> getIAPVideoList();
+    List<AigcProductPlatform> getIAPPlatformInitList();
+    List<AigcProductPlatform> getIAPPlatformList();
+    List<AigcProductAlbum> getIAPVideoList();
     List<JSONObject> getIAPProductTypeEnums();
 
-    List<JSONObject> getIAAPlatformList();
-    List<JSONObject> getIAAVideoList();
+    List<AigcProductPlatform> getIAAPlatformInitList();
+    List<AigcProductPlatform> getIAAPlatformList();
+    List<AigcProductAlbum> getIAAVideoList();
     List<JSONObject> getIAAProductTypeEnums();
 
-    int updateInstanceId(@Param("advertiserId") String advertiserId, @Param("instanceId") String instanceId);
+    int updateInstanceId(@Param("advertiserId") String advertiserId, @Param("instanceId") String instanceId, @Param("source") Integer source);
 
     JSONObject getVideoInfo(@Param("videoId") Long videoId);
     List<JSONObject> getVideoDetail(@Param("videoId") Long videoId);

+ 14 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/CPSReportMapper.java

@@ -14,6 +14,20 @@ public interface CPSReportMapper {
     List<JSONObject> queryCPSIaaDaily(@Param("nowDate") Integer nowDate, @Param("dateStr") String dateStr);
 
     boolean cleanCPSIaaDailyReportsDS(@Param("list") List<JSONObject> list);
+    @DS("selectdb")
+    int runCPSDysSettlementData(@Param("dateStr") String dateStr, @Param("dateLong") String dateLong, @Param("st") Long st);
+
+    int runCPSIapSettlementData(@Param("dateStr") String dateStr, @Param("dateLong") String dateLong, @Param("st") Long st);
+    @DS("selectdb")
+    List<JSONObject> runCPSIaaDySettlementData(@Param("dateStr") String dateStr, @Param("dateLong") String dateLong, @Param("st") Long st);
+    @DS("selectdb")
+    List<JSONObject> runCPSIaaWxSettlementData(@Param("dateStr") String dateStr, @Param("dateLong") String dateLong, @Param("st") Long st);
+
+//    int saveDysSettlementData(List<JSONObject> list);
+//    int saveIapSettlementData(List<JSONObject> list);
+    int saveIaaWxSettlementData(List<JSONObject> list);
+    int saveIaaDySettlementData(List<JSONObject> list);
+
 
 
 }

+ 6 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAccountReportMapper.xml

@@ -273,4 +273,10 @@
         FROM bytedance_error_log
         WHERE id = #{errorId}
     </delete>
+    <select id="getTokenByAdvertiserId" resultType="java.lang.String">
+        select t2.access_token
+        from deepthink.bytedance_advertiser_list t1
+                 left join deepthink.bytedance_auth_list t2 on t1.admin_advertiser_id = t2.admin_advertiser_id
+        where t1.advertiser_id = #{advertiserId}
+    </select>
 </mapper>

+ 33 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAppletTokenRefreshMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.ctop.job.bytedance.data.mapper.BytedanceAppletTokenRefreshMapper">
+
+    <select id="queryAppletList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT t1.id,
+               t1.name,
+               t1.app_id AS 'appId', t1.app_secret AS 'appSecret', t2.id as 'officialAccountId'
+        FROM thirtpart.ly_applet t1
+                 LEFT JOIN thirtpart.ly_official_accounts t2 ON t1.id = t2.applet_id
+        WHERE t1.source != 2
+	AND t1.type =2
+    </select>
+
+    <insert id="refreshAppletTokens">
+        replace into thirtpart.applet_tokens (
+        app_id,
+        official_account_id,
+        applet_id,
+        token
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.appId},
+            #{item.officialAccountId},
+            #{item.id},
+            #{item.token}
+            )
+        </foreach>
+    </insert>
+
+</mapper>

+ 30 - 14
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceProductUpdateMapper.xml

@@ -10,7 +10,7 @@
     <update id="updateInstanceId">
         update deepthink.bytedance_product_main_advertiser
         set mini_instance_id = #{instanceId}
-        where advertiser_id = #{advertiserId}
+        where advertiser_id = #{advertiserId} and source=#{source}
     </update>
     <update id="updateAlbumInfo">
         update deepthink.bytedance_upload_album
@@ -24,28 +24,42 @@
     </update>
 
 
-    <select id="getIAPPlatformList" resultType="com.alibaba.fastjson.JSONObject">
-        select t1.*, t3.access_token
+    <select id="getIAPPlatformList" resultType="cn.com.ctop.job.bytedance.data.entity.AigcProductPlatform">
+        select t1.platform_id, t1.advertiser_id, t1.type, t1.platform_type, t1.platform_name, t1.mini_instance_id, t1.update_time, t1.create_time, t1.mi_appid, t1.membership_types, t1.max_charge, t1.min_charge, t1.recommended_charge, t1.single_price, t1._status, t1.social_credit_code, t1.movie_auth_status, t1.is_bytedance, t1.is_wechat, t1.is_dys, t1.source, ifnull(t1.mini_app_advertiser_id,t1.advertiser_id) as mini_app_advertiser_id, t3.access_token
+        FROM deepthink.bytedance_product_main_advertiser t1
+                 left join deepthink.bytedance_advertiser_list t2 on t1.advertiser_id=t2.advertiser_id
+                 left join deepthink.bytedance_auth_list t3 on t2.admin_advertiser_id=t3.admin_advertiser_id
+        where t1.`type`=2 and t1.`_status`=0 and platform_type=1 and t1.mini_instance_id is not null
+    </select>
+    <select id="getIAPPlatformInitList" resultType="cn.com.ctop.job.bytedance.data.entity.AigcProductPlatform">
+        select t1.platform_id, t1.advertiser_id, t1.type, t1.platform_type, t1.platform_name, t1.mini_instance_id, t1.update_time, t1.create_time, t1.mi_appid, t1.membership_types, t1.max_charge, t1.min_charge, t1.recommended_charge, t1.single_price, t1._status, t1.social_credit_code, t1.movie_auth_status, t1.is_bytedance, t1.is_wechat, t1.is_dys, t1.source, ifnull(t1.mini_app_advertiser_id,t1.advertiser_id) as mini_app_advertiser_id, t3.access_token
         FROM deepthink.bytedance_product_main_advertiser t1
         left join deepthink.bytedance_advertiser_list t2 on t1.advertiser_id=t2.advertiser_id
         left join deepthink.bytedance_auth_list t3 on t2.admin_advertiser_id=t3.admin_advertiser_id
-        where t1.`type`=2 and t1.`_status`=0 and platform_type=1 and t1.mini_instance_id is not null
+        where t1.`type`=2 and t1.`_status`=0 and platform_type=1
     </select>
-    <select id="getIAAPlatformList" resultType="com.alibaba.fastjson.JSONObject">
-        select t1.*, t3.access_token
+    <select id="getIAAPlatformList" resultType="cn.com.ctop.job.bytedance.data.entity.AigcProductPlatform">
+        select t1.platform_id, t1.advertiser_id, t1.type, t1.platform_type, t1.platform_name, t1.mini_instance_id, t1.update_time, t1.create_time, t1.mi_appid, t1.membership_types, t1.max_charge, t1.min_charge, t1.recommended_charge, t1.single_price, t1._status, t1.social_credit_code, t1.movie_auth_status, t1.is_bytedance, t1.is_wechat, t1.is_dys, t1.source, ifnull(t1.mini_app_advertiser_id,t1.advertiser_id) as mini_app_advertiser_id, t3.access_token
         FROM deepthink.bytedance_product_main_advertiser t1
         left join deepthink.bytedance_advertiser_list t2 on t1.advertiser_id=t2.advertiser_id
         left join deepthink.bytedance_auth_list t3 on t2.admin_advertiser_id=t3.admin_advertiser_id
         where t1.`type`=1 and t1.`_status`=0 and platform_type=1 and t1.mini_instance_id is not null
     </select>
-    <select id="getIAPVideoList" resultType="com.alibaba.fastjson.JSONObject">
+    <select id="getIAAPlatformInitList" resultType="cn.com.ctop.job.bytedance.data.entity.AigcProductPlatform">
+        select t1.platform_id, t1.advertiser_id, t1.type, t1.platform_type, t1.platform_name, t1.mini_instance_id, t1.update_time, t1.create_time, t1.mi_appid, t1.membership_types, t1.max_charge, t1.min_charge, t1.recommended_charge, t1.single_price, t1._status, t1.social_credit_code, t1.movie_auth_status, t1.is_bytedance, t1.is_wechat, t1.is_dys, t1.source, ifnull(t1.mini_app_advertiser_id,t1.advertiser_id) as mini_app_advertiser_id, t3.access_token
+        FROM deepthink.bytedance_product_main_advertiser t1
+        left join deepthink.bytedance_advertiser_list t2 on t1.advertiser_id=t2.advertiser_id
+        left join deepthink.bytedance_auth_list t3 on t2.admin_advertiser_id=t3.admin_advertiser_id
+        where t1.`type`=1 and t1.`_status`=0 and platform_type=1
+    </select>
+    <select id="getIAPVideoList" resultType="cn.com.ctop.job.bytedance.data.entity.AigcProductAlbum">
         select third.album_id, third.platform_type, detail.platform_config, video.id as video_id, detail.id as video_detail_id, video.name as name, video.cover_img as img,ifnull(category.name, '其他') as 'theme', video.play_platform,
         '天津星链视界信息技术有限公司' as copyright_owner, '其他' as playlet_gender, video.update_sort as playlet_num, '2' as playlet_duration,
         payinfo.sort as start_pay_playlet, '5' as membership_types, '2' as has_motivation_types,
         payinfo.maxpay as max_charge, payinfo.minpay as min_charge, maxpay as recommended_charge, maxpay as price,
-         1 as has_motivation_content
+         1 as has_motivation_content, video.source
         FROM (select video_id, album_id, 1 as platform_type from thirtpart.ly_third_videos where submission_status=2 and platform=2
-        and video_id in (select video_id from thirtpart.ly_video_audit_records where audit_status=2)
+        and video_id in (select video_id from thirtpart.ly_video_audit_records where audit_status=2 and platform=2)
         union select ly_video_id as video_id, album_id, 2 as platform_type from deepthink.bytedance_upload_album where can_promotion=1
         ) third
         LEFT JOIN (select * from thirtpart.ly_video_details where platform_config is not null group by video_id) detail ON third.video_id = detail.video_id
@@ -53,21 +67,23 @@
         LEFT JOIN thirtpart.ly_video_category category ON video.category_id = category.id
         LEFT JOIN (select video_id, min(sort) as sort, max(pay_amount/100.0) as maxpay, min(pay_amount/100.0) as minpay from thirtpart.ly_video_details where is_pay=1 group by video_id) payinfo ON video.id = payinfo.video_id
         where (video.is_free = 1 or (payinfo.sort is not null and maxpay>0))
-        and video.source=1 and video.created_at > unix_timestamp(date_sub(now(), interval 7 day))
+        and video.created_at > 1743436800
+        and video.source in (1,3)
     </select>
-    <select id="getIAAVideoList" resultType="com.alibaba.fastjson.JSONObject">
+    <select id="getIAAVideoList" resultType="cn.com.ctop.job.bytedance.data.entity.AigcProductAlbum">
         select third.album_id, third.platform_type, detail.platform_config, video.id as video_id, detail.id as video_detail_id, video.name as name, video.cover_img as img,ifnull(category.name, '其他') as 'theme', video.play_platform,
         '天津星链视界信息技术有限公司' as copyright_owner, '其他' as playlet_gender, video.update_sort as playlet_num, '2' as playlet_duration,
-        '5' as membership_types, '1' as has_paid_content, '2' as has_motivation_types,payinfo.sort as starting_unlock_episode
+        '5' as membership_types, '1' as has_paid_content, '2' as has_motivation_types,payinfo.sort as starting_unlock_episode, video.source
         FROM (select video_id, album_id, 1 as platform_type from thirtpart.ly_third_videos where submission_status=2 and platform=2
-        and video_id in (select video_id from thirtpart.ly_video_audit_records where audit_status=2)
+        and video_id in (select video_id from thirtpart.ly_video_audit_records where audit_status=2 and platform=2)
         union select ly_video_id as video_id, album_id, 2 as platform_type from deepthink.bytedance_upload_album where can_promotion=1
         ) third
         LEFT JOIN (select * from thirtpart.ly_video_details where platform_config is not null group by video_id) detail ON third.video_id = detail.video_id
         LEFT JOIN (select * from thirtpart.ly_videos where play_platform like '%2%') video ON third.video_id = video.id
         LEFT JOIN thirtpart.ly_video_category category ON video.category_id = category.id
         LEFT JOIN (select video_id, max(sort) as sort from thirtpart.ly_video_details where is_pay=0 group by video_id) payinfo ON video.id = payinfo.video_id
-        where video.is_free = 0 and video_source=1
+        where video.is_iaa_show=1 and video.created_at > 1743436800
+        and video.source in (1,3)
     </select>
     <select id="getIAPProductTypeEnums" resultType="com.alibaba.fastjson.JSONObject">
         select first_type_name, first_type_id, second_type_name, second_type_id, third_type_name, third_type_id

+ 342 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/CPSReportMapper.xml

@@ -110,7 +110,7 @@
               FROM (SELECT DATE_FORMAT(activation_time, '%Y%m%d') AS 'date', link_id,
                            count(DISTINCT uid) AS 'new_users'
                     FROM thirtpart.ly_user_activation_info
-                    WHERE created_at >= unix_timestamp(#{nowDate})
+                    WHERE created_at &gt;= unix_timestamp(#{nowDate})
                       AND created_at &lt; unix_timestamp(DATE_ADD(#{nowDate}, INTERVAL 1 day))
                     GROUP BY link_id) t3
                        LEFT JOIN thirtpart.ly_link t0 ON t0.id = t3.link_id
@@ -210,7 +210,7 @@
                                    count(DISTINCT t.uid) AS 'new_users'
                             FROM tidb.thirtpart.ly_user_activation_info t
                                      LEFT JOIN tidb.thirtpart.ly_link t0 ON t.link_id = t0.id
-                            WHERE t.created_at >= unix_timestamp(#{nowDate})
+                            WHERE t.created_at &gt;= unix_timestamp(#{nowDate})
                               AND t.created_at &lt; unix_timestamp(DATE_ADD(#{nowDate}, INTERVAL 1 day))
                             GROUP BY 1, 2, 3, 4) t1 ON tt.id = t1.id
                  LEFT JOIN (SELECT link_id,
@@ -283,4 +283,344 @@
         </foreach>
     </insert>
 
+
+    <insert id="runCPSDysSettlementData">
+        insert into media_api.playlet_distribution_income_detail
+        (playlet_id, stat_date, playlet_name, distributor_id, distributor_name, iaa_income, iap_income, refund_amount, iaa_income_after_scale, iap_income_after_scale)
+        select a.playlet_id,
+        stat_date,
+        playlet_name,
+        a.distributor_id,
+        distributor_name,
+        iaa_income,
+        iap_income,
+        refund_amount,
+        ifnull(c.reback_iaa_income, iaa_income)   as reback_iaa_income,
+        ifnull(b.reback_iap_income, a.iap_income) as reback_iap_income
+        from (select playlet_id,
+        stat_date,
+        playlet_name,
+        distributor_id,
+        distributor_name,
+        iaa_income,
+        iap_income,
+        refund_amount
+        from media_api.playlet_distribution_income_detail
+        where stat_date = #{dateLong}) a
+        left join
+        (select playlet_id, distributor_id, reback_iap_income
+        from (select playlet_id,
+        playlet_name,
+        distributor_id,
+        scale,
+        commission_scale,
+        a.iap_income * (1 - commission_scale / 100) * (scale / 100) as reback_iap_income,
+        stat_date,
+        start_time,
+        end_time
+        from (select playlet_id,
+        playlet_name,
+        distributor_id,
+        distributor_name,
+        iaa_income,
+        iap_income,
+        refund_amount,
+        stat_date
+        from media_api.playlet_distribution_income_detail
+        where stat_date = #{dateLong}) a
+        left join
+        (select company_id,
+        name,
+        scale,
+        commission_scale,
+        source,
+        dis_id,
+        start_time,
+        end_time
+        from (select a.company_id,
+        a.name,
+        b.source                                         as source,
+        b.scale,
+        b.commission_scale,
+        original_id,
+        date_format(from_unixtime(start_time), '%Y%m%d') as start_time,
+        date_format(from_unixtime(end_time), '%Y%m%d')   as end_time
+        from tidb.thirtpart.ly_responsibility_person a
+        left join tidb.thirtpart.ly_responsibility_person_scale b
+        on a.company_id = b.company_id
+        where b.source = 10) t LATERAL VIEW EXPLODE(split_by_string(original_id,','))dis_id AS dis_id
+        group by 1, 2, 3, 4, 5, 6, 7, 8) c
+        on a.distributor_id = c.dis_id) t
+        where stat_date &gt;= start_time
+        and stat_date &lt;= end_time) b
+        on a.playlet_id = b.playlet_id and a.distributor_id = b.distributor_id
+        left join (select playlet_id, reback_iaa_income, distributor_id
+        from (select playlet_id,
+        playlet_name,
+        distributor_id,
+        scale,
+        commission_scale,
+        a.iaa_income * (scale / 100) as reback_iaa_income,
+        stat_date,
+        start_time,
+        end_time
+        from (select playlet_id,
+        playlet_name,
+        distributor_id,
+        distributor_name,
+        iaa_income,
+        iap_income,
+        refund_amount,
+        stat_date
+        from media_api.playlet_distribution_income_detail
+        where stat_date = #{dateLong}) a
+        left join
+        (select company_id,
+        name,
+        scale,
+        commission_scale,
+        source,
+        dis_id,
+        start_time,
+        end_time
+        from (select a.company_id,
+        a.name,
+        b.source                                         as source,
+        b.scale,
+        b.commission_scale,
+        original_id,
+        date_format(from_unixtime(start_time), '%Y%m%d') as start_time,
+        date_format(from_unixtime(end_time), '%Y%m%d')   as end_time
+        from tidb.thirtpart.ly_responsibility_person a
+        left join tidb.thirtpart.ly_responsibility_person_scale b
+        on a.company_id = b.company_id
+        where b.source = 11) t LATERAL VIEW EXPLODE(split_by_string(original_id,','))dis_id AS dis_id
+        group by 1, 2, 3, 4, 5, 6, 7, 8) c
+        on a.distributor_id = c.dis_id) t
+        where stat_date &gt;= start_time
+        and stat_date &lt;= end_time) c
+        on a.playlet_id = c.playlet_id and a.distributor_id = c.distributor_id
+    </insert>
+
+    <insert id="runCPSIapSettlementData">
+        replace into deepthink.distribution_iap_settlement
+        (stat_date, link_id, app_id, person_id, person_pid, company_id, all_pay_amount, all_refund_amount, all_settlement_amount, virtual_pay_amount, virtual_commission_amount, virtual_refund_amount, virtual_settlement_amount, un_virtual_pay_amount, un_virtual_commission_amount, un_virtual_refund_amount, un_virtual_settlement_amount)
+        select
+        #{dateLong} as stat_date,
+        ifnull(link_id, 0) as link_id,
+        ifnull(app_id, '') as app_id,
+        ifnull(person_id, 0) as person_id,
+        ifnull(person_pid, 0) as person_pid,
+        ifnull(company_id, 0) as company_id,
+        all_pay_amount,
+        all_refund_amount,
+        (wx_virtual_pay_amount-wx_virtual_commission_amount-wx_virtual_refund_amount) * wx_virtual_scale_rate + (wx_common_pay_amount-wx_common_commission_amount-wx_common_refund_amount) * wx_common_scale_rate
+        + (tt_common_pay_amount-tt_common_commission_amount-tt_common_refund_amount) * tt_common_scale_rate as all_settlement_amount,
+        wx_virtual_pay_amount as virtual_pay_amount,
+        wx_virtual_commission_amount as virtual_commission_amount,
+        wx_virtual_refund_amount as virtual_refund_amount,
+        (wx_virtual_pay_amount-wx_virtual_commission_amount-wx_virtual_refund_amount) * wx_virtual_scale_rate as virtual_settlement_amount,
+        (wx_common_pay_amount+tt_common_pay_amount) un_virtual_pay_amount,
+        (wx_common_commission_amount+tt_common_commission_amount) un_virtual_commission_amount,
+        (wx_common_refund_amount+tt_common_refund_amount) un_virtual_refund_amount,
+        (wx_common_pay_amount-wx_common_commission_amount-wx_common_refund_amount) * wx_common_scale_rate
+        + (tt_common_pay_amount-tt_common_commission_amount-tt_common_refund_amount) * tt_common_scale_rate as un_virtual_settlement_amount
+        from
+        (select
+        stat_date, t2.*,
+        ifnull(sum(t3.all_pay_amount),0) as all_pay_amount,
+        ifnull(sum(t4.refund_amount), 0) as all_refund_amount,
+        ifnull(sum(case when t1.pay_merchant=15 then ifnull(t3.all_pay_amount,0) else 0 end), 0) as wx_virtual_pay_amount,
+        ifnull(sum(case when t1.pay_merchant=15 then (ifnull(t3.all_pay_amount,0)-ifnull(t4.refund_amount,0))* wx_virtual_commission_rate else 0 end), 0) as wx_virtual_commission_amount,
+        ifnull(sum(case when t1.pay_merchant=15 then ifnull(t4.refund_amount,0) else 0 end), 0) as wx_virtual_refund_amount,
+        ifnull(sum(case when t1.pay_merchant in (22,23) then ifnull(t3.all_pay_amount,0) else 0 end), 0) as wx_common_pay_amount,
+        ifnull(sum(case when t1.pay_merchant in (22,23) then (ifnull(t3.all_pay_amount,0)-ifnull(t4.refund_amount,0))* wx_common_commission_rate else 0 end), 0) as wx_common_commission_amount,
+        ifnull(sum(case when t1.pay_merchant in (22,23) then ifnull(t4.refund_amount,0) else 0 end), 0) as wx_common_refund_amount,
+        ifnull(sum(case when t1.pay_merchant=30 then ifnull(t3.all_pay_amount,0) else 0 end), 0) as tt_common_pay_amount,
+        ifnull(sum(case when t1.pay_merchant=30 then (ifnull(t3.all_pay_amount,0)-ifnull(t4.refund_amount,0))* tt_common_commission_rate else 0 end), 0) as tt_common_commission_amount,
+        ifnull(sum(case when t1.pay_merchant=30 then ifnull(t4.refund_amount,0) else 0 end), 0) as tt_common_refund_amount
+
+        from
+        (
+        select consume_date stat_date, link_id, pay_merchant
+        from thirtpart.ly_pay_record p
+        where consume_date=#{dateLong} and status=1
+        group by 1,2,3
+        union
+        select date_format(refund_time,'%Y%m%d') stat_date,link_id, pay_merchant
+        from thirtpart.ly_refund_record lrr
+        where refund_time &gt;= concat(#{dateStr}, ' 00:00:00') and refund_time &lt;= concat(#{dateStr}, ' 23:59:59')
+        and status = 1
+        group by 1,2,3
+        ) t1
+        inner join
+        (
+        select l.id link_id,
+        l.responsibility_person_id person_id,
+        p.pid person_pid,
+        p.company_id,
+        la.app_id,
+        ifnull(scale_wx_virtual.scale/100.0, 0) as wx_virtual_scale_rate,
+        ifnull(scale_wx_virtual.commission_scale/100.0, 0) as wx_virtual_commission_rate,
+        ifnull(scale_wx_common.scale/100.0, 0) as wx_common_scale_rate,
+        ifnull(scale_wx_common.commission_scale/100.0, 0) as wx_common_commission_rate,
+        ifnull(scale_tt_common.scale/100.0, 0) as tt_common_scale_rate,
+        ifnull(scale_tt_common.commission_scale/100.0, 0) as tt_common_commission_rate
+        from thirtpart.ly_link l
+        join thirtpart.ly_responsibility_person p on l.responsibility_person_id = p.id
+        left join thirtpart.ly_official_accounts a on l.official_account_id = a.id
+        left join thirtpart.ly_applet la on a.applet_id = la.id
+        left join (select company_id, scale, ifnull(commission_scale, 10) as commission_scale from thirtpart.ly_responsibility_person_scale where source=7
+        and #{st} &gt;= start_time and #{st} &lt;= end_time
+        ) scale_wx_virtual on p.company_id = scale_wx_virtual.company_id
+        left join (select company_id, scale, ifnull(commission_scale, 1) as commission_scale from thirtpart.ly_responsibility_person_scale where source=1
+        and #{st} &gt;= start_time and #{st} &lt;= end_time
+        ) scale_wx_common on p.company_id = scale_wx_virtual.company_id
+        left join (select company_id, scale, ifnull(commission_scale, 1) as commission_scale from thirtpart.ly_responsibility_person_scale where source=2
+        and #{st} &gt;= start_time and #{st} &lt;= end_time
+        ) scale_tt_common on p.company_id = scale_tt_common.company_id
+<!--        where p.is_distributor = 1 or p.pid in (select id from thirtpart.ly_responsibility_person where is_distributor=1)-->
+        group by 1,2,3,4,5,6,7,8,9,10,11
+        ) t2 on t1.link_id = t2.link_id
+        left join
+        (
+        select consume_date,link_id,pay_merchant, sum(total_fee) all_pay_amount
+        from thirtpart.ly_pay_record p
+        where consume_date=#{dateLong} and status=1
+        group by 1,2,3
+        )t3 on t1.stat_date = t3.consume_date and t1.link_id = t3.link_id and t1.pay_merchant=t3.pay_merchant
+        left join
+        (
+        select date_format(refund_time,'%Y%m%d') refund_date,link_id, pay_merchant, sum(refund_price) refund_amount
+        from thirtpart.ly_refund_record r
+        where refund_time &gt;= concat(#{dateStr}, ' 00:00:00') and refund_time &lt;= concat(#{dateStr}, ' 23:59:59')
+        and status = 1
+        group by 1,2,3
+        )t4 on t1.stat_date = t4.refund_date and t1.link_id = t4.link_id and t1.pay_merchant=t4.pay_merchant
+        group by consume_date, t2.person_id) tb
+
+    </insert>
+    <select id="runCPSIaaDySettlementData" resultType="com.alibaba.fastjson.JSONObject">
+        select stat_date, link_id, app_id, person_id, person_pid, company_id,
+        ad_total_income,
+        ad_total_income*scale/100.0 ad_settlement_amount,
+        ad_original_income, ad_platform_subsidy, pre_ecpm,
+        round(if(ad_total_income=0, 0, (pre_ecpm-ad_total_income)/ad_total_income), 4) data_gap
+        from
+        (select t1.stat_date,t1.link_id,t1.app_id,t1.person_id,t1.person_pid, t1.company_id,ifnull(t1.scale,0) scale,
+        link_cost/100000/0.7 pre_ecpm,
+        (ifnull(income,0) + ifnull(incentive_fund_cost,0))/100*(link_cost/all_cost) ad_total_income,
+        income/100*(link_cost/all_cost) ad_original_income,
+        incentive_fund_cost/100*(link_cost/all_cost) ad_platform_subsidy
+        from
+        (
+        select stat_date,app_id,link_id,ll.responsibility_person_id as person_id, lrp.pid as person_pid, lrp.company_id, scale.scale, sum(cost) link_cost
+        from media_api.bytedance_webhook_ma_ecpm bwme
+        left join tidb.thirtpart.ly_link ll on bwme.link_id=ll.id
+        left join tidb.thirtpart.ly_responsibility_person lrp on ll.responsibility_person_id=lrp.id
+        left join (select company_id, scale, ifnull(commission_scale, 10) as commission_scale from tidb.thirtpart.ly_responsibility_person_scale
+        where source=9 and #{st} &gt;= start_time and #{st} &lt;= end_time
+        ) scale on lrp.company_id = scale.company_id
+        where stat_date = #{dateLong} and link_id is not null
+<!--        and (lrp.is_distributor=1 or lrp.pid in (select id from tidb.thirtpart.ly_responsibility_person where is_distributor=1))-->
+        group by 1,2,3,4,5,6,7
+        )t1
+        left join
+        (
+        select stat_date,app_id,sum(cost) all_cost
+        from media_api.bytedance_webhook_ma_ecpm bwme
+        where stat_date = #{dateLong}
+        group by 1,2
+        )t2 on t1.stat_date = t2.stat_date and t1.app_id = t2.app_id
+        left join
+        (
+        select stat_date,ma_appid,income,incentive_fund_cost
+        from tidb.media_api.bytedance_miniapp_ad_income
+        where stat_date = #{dateLong}
+        )t3 on t1.stat_date = t3.stat_date and t1.app_id = t3.ma_appid
+        )tb
+    </select>
+    <select id="runCPSIaaWxSettlementData" resultType="com.alibaba.fastjson.JSONObject">
+        select stat_date, link_id, app_id, person_id, person_pid, company_id,
+        ad_total_income, ad_play_user_count,
+        ad_total_income*scale/100.0 ad_settlement_amount
+        from
+        (select t1.stat_date, t1.link_id,t1.app_id, lrp.id as person_id, lrp.pid as person_pid, lrp.company_id, scale.scale,
+        (ifnull(income,0))/100*(link_count/all_count) ad_total_income,
+        ifnull(user_count, 0) ad_play_user_count
+        from (
+        select m.stat_date,m.app_id,coalesce(m.link_id,t1.link_id,u.link_id) link_id, count(*) link_count,
+        count(distinct m.login_id) user_count
+        from hr_playlet.mp_event m
+        left join
+        (
+        select app_id,uid, link_id
+        from (
+        select app_id,uid, link_id,row_number() over (partition by app_id,uid order by created_at ) r
+        from hr_playlet.server_event se
+        where stat_date = #{dateLong} and event = 'ACTIVATION' and link_id is not null
+        )t  where r = 1
+        )t1 on m.app_id = t1.app_id and m.login_id = t1.uid
+        left join hr_playlet.user_event u on m.app_id = u.app_id and m.login_id= u.uid
+        where m.stat_date = #{dateLong} and media_type = 'wx' and event = 'ADSHOW'
+        and coalesce(m.link_id,t1.link_id,u.link_id) is not null
+        group by 1,2,3
+        )t1
+        left join
+        (
+        select m.stat_date,m.app_id,count(*) all_count
+        from hr_playlet.mp_event m
+        where m.stat_date = #{dateLong} and media_type = 'wx' and event = 'ADSHOW'
+        group by 1,2
+        )t2 on t1.stat_date = t2.stat_date and t1.app_id = t2.app_id
+        left join
+        (
+        select stat_date,app_id,sum(income) income
+        from tidb.media_api.adq_publisher_adunit_general
+        where stat_date = #{dateLong}
+        group by 1,2
+        )t3 on t1.stat_date = t3.stat_date and t1.app_id = t3.app_id
+        left join tidb.thirtpart.ly_link ll on t1.link_id=ll.id
+        left join tidb.thirtpart.ly_responsibility_person lrp on ll.responsibility_person_id=lrp.id
+        left join (select company_id, scale, ifnull(commission_scale, 10) as commission_scale from tidb.thirtpart.ly_responsibility_person_scale
+        where source=8 and #{st} &gt;= start_time and #{st} &lt;= end_time
+        ) scale on lrp.company_id = scale.company_id
+        where link_id is not null
+        )tb
+    </select>
+
+
+
+    <update id="saveIaaWxSettlementData">
+        replace into deepthink.distrubution_iaa_weixin_settlement
+        (stat_date, link_id, app_id, person_id, person_pid, company_id,
+        ad_total_income, ad_play_user_count, ad_settlement_amount)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.stat_date},
+            #{item.link_id},
+            #{item.app_id},
+            #{item.person_id},
+            #{item.person_pid},
+            #{item.company_id},
+            #{item.ad_total_income},
+            #{item.ad_play_user_count},
+            #{item.ad_settlement_amount}
+            )
+        </foreach>
+    </update>
+    <update id="saveIaaDySettlementData">
+        replace into deepthink.distrubution_iaa_douyin_settlement
+        (stat_date, link_id, app_id, person_id, person_pid, company_id,
+        ad_total_income, ad_settlement_amount, ad_original_income, ad_platform_subsidy, pre_ecpm, data_gap)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.stat_date}, #{item.link_id}, #{item.app_id}, #{item.person_id}, #{item.person_pid}, #{item.company_id},
+            #{item.ad_total_income}, #{item.ad_settlement_amount}, #{item.ad_original_income}, #{item.ad_platform_subsidy},
+            #{item.pre_ecpm}, #{item.data_gap}
+            )
+        </foreach>
+    </update>
 </mapper>

+ 1 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/PromoteLinkRefreshMapper.xml

@@ -19,7 +19,7 @@
         (select *
         from deepthink.bytedance_advertiser_task_link
         where link_uuid is not null and status=1) tb1
-        left join deepthink.bytedance_advertiser_task tb2
+        inner join deepthink.bytedance_advertiser_task tb2
         on tb1.task_id=tb2.task_id and tb1.advertiser_id = tb2.advertiser_id
         left join deepthink.bytedance_advertiser_task_template tb3
         on tb1.task_id=tb3.task_id

+ 61 - 39
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ReportsAdPushMapper.xml

@@ -33,6 +33,9 @@
     <sql id="shareIaaAmount">
         round(ifnull(sum(share_iaa_amount), 0), 2) as share_iaa_amount
     </sql>
+    <sql id="shareIaaAmount3">
+        round(ifnull(sum(share_iaa_amount_3), 0), 2) as share_iaa_amount_3
+    </sql>
     <sql id="iaaAmount">
         round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount
     </sql>
@@ -48,6 +51,18 @@
     <sql id="iapRoi">
         concat(round(if(ifnull(sum(iap_real_cost_amount),0)=0, 0, ifnull(sum(share_pay_amount), 0)/sum(iap_real_cost_amount)*100), 2), '%') AS iap_roi
     </sql>
+    <sql id="iaaCostAmount">
+        round(ifnull(sum(iaa_cost_amount), 0), 2) as iaa_cost_amount
+    </sql>
+    <sql id="iapCostAmount">
+        round(ifnull(sum(iap_cost_amount), 0), 2) as iap_cost_amount
+    </sql>
+    <sql id="iaaRealCostAmount">
+        round(ifnull(sum(iaa_real_cost_amount), 0), 2) as iaa_real_cost_amount
+    </sql>
+    <sql id="iapRealCostAmount">
+        round(ifnull(sum(iap_real_cost_amount), 0), 2) as iap_real_cost_amount
+    </sql>
 
     <select id="tmpPushData" resultType="java.util.Map">
         select
@@ -100,27 +115,29 @@
         <include refid="costAmount"/>,
         <include refid="realCostAmount"/>,
         <include refid="iaaRoi"/>,
-        <include refid="iapRoi"/>
+        <include refid="iapRoi"/>,
+        <include refid="iaaRealCostAmount"/>,
+        <include refid="iapRealCostAmount"/>
         from
-        (select product_id from application.media_product_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
+        (select movie_id from application.media_ad_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
         union select movie_id from application.user_data_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
         ) tb1
         left join
-        (select product_id, sum(iaa_cost_amount) as iaa_cost_amount, sum(iaa_real_cost_amount) as iaa_real_cost_amount,
+        (select movie_id, sum(iaa_cost_amount) as iaa_cost_amount, sum(iaa_real_cost_amount) as iaa_real_cost_amount,
         sum(iap_cost_amount) as iap_cost_amount, sum(iap_real_cost_amount) as iap_real_cost_amount,
         sum(iaa_cost_amount)+sum(iap_cost_amount) as cost_amount,
         sum(iaa_real_cost_amount)+sum(iap_real_cost_amount) as real_cost_amount
         from
-        (select product_id, round(ifnull(sum(cost_amount),0),2) as iaa_cost_amount, sum(real_cost_amount) as iaa_real_cost_amount, 0 as iap_cost_amount, 0 as iap_real_cost_amount
-        from application.media_product_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAA')
-        group by product_id
+        (select movie_id, round(ifnull(sum(cost_amount),0),2) as iaa_cost_amount, sum(real_cost_amount) as iaa_real_cost_amount, 0 as iap_cost_amount, 0 as iap_real_cost_amount
+        from application.media_ad_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAA')
+        group by movie_id
         union all
-        select product_id, 0 as iaa_cost_amount, 0 as iaa_real_cost_amount,
+        select movie_id, 0 as iaa_cost_amount, 0 as iaa_real_cost_amount,
         round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
-        from application.media_product_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAP')
-        group by product_id) subt2
-        group by product_id
-        ) tb2 on tb1.product_id=tb2.product_id
+        from application.media_ad_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAP')
+        group by movie_id) subt2
+        group by movie_id
+        ) tb2 on tb1.movie_id=tb2.movie_id
         left join
         (select movie_id, ifnull(sum(iaa_amount), 0) as iaa_amount,
         ifnull(sum(pay_amount), 0) as pay_amount,
@@ -129,14 +146,14 @@
         round(ifnull(sum(share_iaa_amount_3), 0),2) as share_iaa_amount_3
         from application.user_data_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
         group by movie_id
-        ) tb3 on tb1.product_id=tb3.movie_id
+        ) tb3 on tb1.movie_id=tb3.movie_id
         left join
         (select moive_id, standard_movie_id, standard_movie_name, movie_source, movie_project_source from tidb.deepthink.all_moive
-        ) tb4 on tb1.product_id=tb4.moive_id
+        ) tb4 on tb1.movie_id=tb4.moive_id
         left join
         (select dict_key, dict_name from tidb.deepthink.dt_dictionary where select_key='movie_project_source'
         ) tb5 on tb4.movie_project_source=tb5.dict_key
-        where 1=1 and tb1.product_id!='-9999'
+        where 1=1 and tb1.movie_id!='-9999'
         group by tb4.standard_movie_name, tb4.movie_project_source, tb5.dict_name
         order by sum(iaa_amount)+sum(pay_amount) desc
         limit 20
@@ -175,26 +192,28 @@
         <include refid="realCostAmount"/>,
         <include refid="iaaRoi"/>,
         <include refid="iapRoi"/>,
+        <include refid="sharePayAmount"/>,
+        <include refid="shareIaaAmount3"/>,
         round(ifnull(sum(hour_cost_amount), 0), 2) as hour_cost_amount
         from
-        (select product_id from application.media_product_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
+        (select movie_id from application.media_ad_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
         union select movie_id from application.user_data_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))) tb1
         left join
         (
-        select product_id, sum(iaa_cost_amount) as iaa_cost_amount, sum(iaa_real_cost_amount) as iaa_real_cost_amount,
+        select movie_id, sum(iaa_cost_amount) as iaa_cost_amount, sum(iaa_real_cost_amount) as iaa_real_cost_amount,
         sum(iap_cost_amount) as iap_cost_amount, sum(iap_real_cost_amount) as iap_real_cost_amount,
         sum(iaa_cost_amount)+sum(iap_cost_amount) as cost_amount,
         sum(iaa_real_cost_amount)+sum(iap_real_cost_amount) as real_cost_amount
         from
-        (select product_id, round(ifnull(sum(cost_amount),0),2) as iaa_cost_amount, sum(real_cost_amount) as iaa_real_cost_amount, 0 as iap_cost_amount, 0 as iap_real_cost_amount
-        from application.media_product_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAA')
-        group by product_id
+        (select movie_id, round(ifnull(sum(cost_amount),0),2) as iaa_cost_amount, sum(real_cost_amount) as iaa_real_cost_amount, 0 as iap_cost_amount, 0 as iap_real_cost_amount
+        from application.media_ad_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAA')
+        group by movie_id
         union all
-        select product_id, 0 as iaa_cost_amount, 0 as iaa_real_cost_amount,round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
-        from application.media_product_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAP')
-        group by product_id) subt2
-        group by product_id
-        ) tb2 on tb1.product_id=tb2.product_id
+        select movie_id, 0 as iaa_cost_amount, 0 as iaa_real_cost_amount,round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
+        from application.media_ad_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6) and business_method='IAP')
+        group by movie_id) subt2
+        group by movie_id
+        ) tb2 on tb1.movie_id=tb2.movie_id
         left join
         (select movie_id, sum(iaa_amount) as iaa_amount, sum(pay_amount) as pay_amount,
         sum(share_iaa_amount_3) as share_iaa_amount_3,
@@ -202,18 +221,18 @@
         ifnull(sum(share_pay_amount), 0) as share_pay_amount
         from application.user_data_report_daily where stat_date=${date} and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
         group by movie_id
-        ) tb3 on tb1.product_id=tb3.movie_id
+        ) tb3 on tb1.movie_id=tb3.movie_id
         left join
         (select moive_id, standard_movie_id, standard_movie_name, movie_source, movie_project_source from tidb.deepthink.all_moive
-        ) tb4 on tb1.product_id=tb4.moive_id
+        ) tb4 on tb1.movie_id=tb4.moive_id
         left join
-        (select product_id, ifnull(sum(cost_amount), 0) as hour_cost_amount from application.media_product_report_hourly
+        (select movie_id, ifnull(sum(cost_amount), 0) as hour_cost_amount from application.media_ad_report_hourly
         where stat_date=${date} and `hour`=${hour}  and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type not in (2,4,6))
-        group by product_id) tb5 on tb1.product_id=tb5.product_id
+        group by movie_id) tb5 on tb1.movie_id=tb5.movie_id
         left join
         (select dict_key, dict_name from tidb.deepthink.dt_dictionary where select_key='movie_project_source'
         ) tb6 on tb4.movie_project_source=tb6.dict_key
-        where 1=1 and tb1.product_id != '-9999'
+        where 1=1 and tb1.movie_id != '-9999'
         group by tb4.standard_movie_name, tb4.movie_project_source, tb6.dict_name
         order by end_amount desc
         limit 20
@@ -303,7 +322,8 @@
         <include refid="costAmount"/>,
         <include refid="iaaAmount"/>,
         <include refid="payAmount"/>,
-        <include refid="endAmount"/>
+        <include refid="endAmount"/>,
+        max(tb2.update_time) as update_time
         from
         (select cast(advertiser_id as char) advertiser_id, user_id from tidb.deepthink.advertiser_bind_info) tb1
         left join
@@ -374,7 +394,7 @@
         (select advertiser_id, ifnull(sum(cost_amount),0) as ca from application.media_ad_report_daily
         where stat_date &gt;= #{last90Day} and stat_date &lt;= #{date} group by advertiser_id) tb3
         on tb1.advertiser_id = tb3.advertiser_id
-        where tb3.ca > 10
+        where tb3.ca > 0
         order by tb3.ca desc
     </select>
     <select id="selectUserList" resultType="com.alibaba.fastjson.JSONObject">
@@ -422,6 +442,8 @@
         select tb5.dept_id, tb5.dept_name,
         rank() over (order by sum(cost_amount) desc) as rk,
         <include refid="costAmount"/>,
+        <include refid="sharePayAmount"/>,
+        <include refid="shareIaaAmount3"/>,
         <include refid="iaaRoi"/>,
         <include refid="iapRoi"/>
         from
@@ -522,14 +544,14 @@
         <include refid="endAmount"/>,
         <include refid="costAmount"/>
         from
-        (select product_id from application.media_product_report_daily where stat_date=${date}
+        (select movie_id from application.media_ad_report_daily where stat_date=${date}
         union select movie_id from application.user_data_report_daily where stat_date=${date}
         ) tb1
         left join
-        (select product_id, round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
-        from application.media_product_report_daily where stat_date=${date}
-        group by product_id
-        ) tb2 on tb1.product_id=tb2.product_id
+        (select movie_id, round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
+        from application.media_ad_report_daily where stat_date=${date}
+        group by movie_id
+        ) tb2 on tb1.movie_id=tb2.movie_id
         left join
         (select movie_id,
         ifnull(sum(iaa_amount), 0) as iaa_amount,
@@ -538,14 +560,14 @@
         ifnull(sum(share_iaa_amount), 0) as share_iaa_amount
         from application.user_data_report_daily where stat_date=${date}
         group by movie_id
-        ) tb3 on tb1.product_id=tb3.movie_id
+        ) tb3 on tb1.movie_id=tb3.movie_id
         left join
         (select moive_id, standard_movie_id, standard_movie_name, movie_source, movie_project_source from tidb.deepthink.all_moive
-        ) tb4 on tb1.product_id=tb4.moive_id
+        ) tb4 on tb1.movie_id=tb4.moive_id
         left join
         (select dict_key, dict_name from tidb.deepthink.dt_dictionary where select_key='movie_project_source'
         ) tb5 on tb4.movie_project_source=tb5.dict_key
-        where 1=1 and tb1.product_id!='-9999'
+        where 1=1 and tb1.movie_id!='-9999'
         group by tb4.standard_movie_name, tb4.movie_project_source, tb5.dict_name
         order by sum(share_iaa_amount)+sum(share_pay_amount) desc
         limit 20

+ 10 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/BytedanceAppletTokenRefreshService.java

@@ -0,0 +1,10 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+
+public interface BytedanceAppletTokenRefreshService {
+
+    void buildAppletTokens();
+}

+ 2 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceAccountReportService.java

@@ -8,4 +8,6 @@ public interface IBytedanceAccountReportService {
     void getBytedanceAccountHour(Long advertiserId, String accessToken, String startDate, String ebdDate, Integer page, Integer isLog);
 
     void getBytedanceAccountDaily(Long advertiserId, String accessToken, String startDate, String ebdDate, Integer page, Integer isLog);
+
+    String getTokenByAdvertiserId(Long advertiserId);
 }

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceRefreshTokenService.java

@@ -1,9 +1,14 @@
 package cn.com.ctop.job.bytedance.data.service;
 
+import redis.clients.jedis.Jedis;
+
 public interface IBytedanceRefreshTokenService {
+
     void bytedanceRefreshToken();
 
     void refreshBaiduYunToken();
 
     void refreshAppletTokens();
+
+    Jedis getJedisToken();
 }

+ 3 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/ICPSReportService.java

@@ -3,4 +3,7 @@ package cn.com.ctop.job.bytedance.data.service;
 public interface ICPSReportService {
 
     void cleanCPSDailyReports(String nowDate);
+
+
+    void runCPSSettlementData(String nowDate);
 }

+ 13 - 8
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceAccountReportServiceImpl.java

@@ -71,7 +71,7 @@ public class BytedanceAccountReportServiceImpl implements IBytedanceAccountRepor
                             advertiserReportHour.setHour(hour);
                             hours.add(advertiserReportHour);
 
-                            dorisLoadManager.add("media_api","bytedance_advertiser_report_hour", advertiserReportHour);
+                            dorisLoadManager.add("media_api", "bytedance_advertiser_report_hour", advertiserReportHour);
 
                         }
                     }
@@ -145,7 +145,7 @@ public class BytedanceAccountReportServiceImpl implements IBytedanceAccountRepor
                             advertiserReportDaily.setStatTimeDay(statTimeDay);
                             dailyList.add(advertiserReportDaily);
 
-                            dorisLoadManager.add("media_api","bytedance_advertiser_report_daily", advertiserReportDaily);
+                            dorisLoadManager.add("media_api", "bytedance_advertiser_report_daily", advertiserReportDaily);
                         }
                     }
                 }
@@ -228,7 +228,7 @@ public class BytedanceAccountReportServiceImpl implements IBytedanceAccountRepor
                             advertiserReportHour.setHour(hour);
                             hours.add(advertiserReportHour);
 
-                            dorisLoadManager.add("media_api","bytedance_advertiser_report_hour", advertiserReportHour);
+                            dorisLoadManager.add("media_api", "bytedance_advertiser_report_hour", advertiserReportHour);
                         }
                     } else {
                         log.info("账户id:{},日期:{}广告时报(账户粒度)请求结果为空", advertiserId, startDate);
@@ -288,7 +288,7 @@ public class BytedanceAccountReportServiceImpl implements IBytedanceAccountRepor
             String s = HttpUtils.httpGet(url, paramsMap, headers);
             JSONObject result = JSONObject.parseObject(s);
             if (Check.isNull(result)) {
-                log.info("账户id:{},日期:{},广告时报(账户粒度)请求结果返回为空", advertiserId, startDate);
+                log.info("账户id:{},日期:{},账户日报(账户粒度)请求结果返回为空", advertiserId, startDate);
                 if (isLog == 1) {
                     BytedanceErrorLog errorInfo = new BytedanceErrorLog();
                     errorInfo.setAdvertiserId(advertiserId);
@@ -317,15 +317,15 @@ public class BytedanceAccountReportServiceImpl implements IBytedanceAccountRepor
                             advertiserReportDaily.setStatTimeDay(statTimeDay);
                             dailyList.add(advertiserReportDaily);
 
-                            dorisLoadManager.add("media_api","bytedance_advertiser_report_daily", advertiserReportDaily);
+                            dorisLoadManager.add("media_api", "bytedance_advertiser_report_daily", advertiserReportDaily);
                         }
                     } else {
-                        log.info("账户id:{},日期:{},广告日报(账户粒度)请求结果为空", advertiserId, startDate);
+                        log.info("账户id:{},开始日期:{},结束日期:{},账户日报(账户粒度)请求结果为空", advertiserId, startDate, endDate);
                         return;
                     }
                 }
             } else {
-                log.info("账户id:{},日期:{},广告日报(账户粒度)请求结果失败,返回数据:{}", advertiserId, startDate, result);
+                log.info("账户id:{},日期:{},账户日报(账户粒度)请求结果失败,返回数据:{}", advertiserId, startDate, result);
                 if (isLog == 1) {
                     BytedanceErrorLog errorInfo = new BytedanceErrorLog();
                     errorInfo.setAdvertiserId(advertiserId);
@@ -350,11 +350,16 @@ public class BytedanceAccountReportServiceImpl implements IBytedanceAccountRepor
                 }
                 getBytedanceAccountDaily(advertiserId, accessToken, startDate, endDate, page + 1, isLog);
             } else {
-                log.info("账户ID:{},日期:{},广告日报(账户粒度)数据请求成功", advertiserId, startDate);
+                log.info("账户ID:{},开始日期:{},结束日期:{},账户日报(账户粒度)数据请求成功", advertiserId, startDate, endDate);
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
+    @Override
+    public String getTokenByAdvertiserId(Long advertiserId) {
+        return accountReportMapper.getTokenByAdvertiserId(advertiserId);
+    }
+
 }

+ 72 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceAppletTokenRefreshServiceImpl.java

@@ -0,0 +1,72 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAppletTokenRefreshMapper;
+import cn.com.ctop.job.bytedance.data.service.BytedanceAppletTokenRefreshService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceRefreshTokenService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import redis.clients.jedis.Jedis;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class BytedanceAppletTokenRefreshServiceImpl implements BytedanceAppletTokenRefreshService {
+
+    @Autowired
+    private BytedanceAppletTokenRefreshMapper tokenRefreshMapper;
+
+    @Autowired
+    private IBytedanceRefreshTokenService refreshTokenService;
+
+    @Override
+    public void buildAppletTokens() {
+        Jedis jedis = refreshTokenService.getJedisToken();
+        List<JSONObject> list = tokenRefreshMapper.queryAppletList();
+        for (JSONObject applet : list) {
+            buildAppletToken(applet, jedis, 0);
+        }
+        tokenRefreshMapper.refreshAppletTokens(list);
+        jedis.close();
+    }
+
+    //构建小程序token
+    private void buildAppletToken(JSONObject applet, Jedis jedis, int count) {
+        String name = applet.getString("name");
+        try {
+            Map<String, Object> param = new HashMap<>();
+            String appId = applet.getString("appId");
+            param.put("client_key", appId);
+            param.put("client_secret", applet.getString("appSecret"));
+            param.put("grant_type", "client_credential");
+            String result = HttpUtils.httpPostRequest("https://open.douyin.com/oauth/client_token/", param, null);
+            JSONObject tokenInfo = JSONObject.parseObject(result);
+            if (!Check.isNull(tokenInfo)) {
+                JSONObject data = tokenInfo.getJSONObject("data");
+                if (!Check.isNull(data) && data.getInteger("error_code") == 0) {
+                    String accessToken = data.getString("access_token");
+                    jedis.setex("client-token-key_" + appId, 3600, accessToken);
+                    log.info("小程序:{},获取token完成", name);
+                    applet.put("token", accessToken);
+                } else {
+                    if (count < 3) {
+                        Thread.sleep(5000L);
+                        buildAppletToken(applet, jedis, count + 1);
+                    } else {
+                        log.error("小程序:{},获取token失败!结果:{}", name, tokenInfo);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("小程序:{},获取token异常!", name);
+        }
+    }
+
+}

+ 266 - 299
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceProductUpdateServiceImpl.java

@@ -1,5 +1,7 @@
 package cn.com.ctop.job.bytedance.data.service.impl;
 
+import cn.com.ctop.job.bytedance.data.entity.AigcProductAlbum;
+import cn.com.ctop.job.bytedance.data.entity.AigcProductPlatform;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceProductUpdateMapper;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceProductUpdateService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
@@ -27,6 +29,12 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
 
     public static final String DOUYIN_MOVIE_SOURCE_APP="ttd652a0ef496310bd01";
 
+    //枚举值:is_pay: IAA, IAP
+    enum BusinessType {
+        IAA,
+        IAP
+    }
+
 
     //商品上传结果通知群
     public static final String HOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/92e2445e-76df-44fb-8f61-f55ac94f49bd";
@@ -35,11 +43,33 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
     public void run() throws Exception {
         Set<String> errors = new HashSet<>();
         log.info("付费商品库更新中...");
-        iapProductUpdate(errors);
+        List<AigcProductPlatform> iapPlatformList = bytedanceProductUpdateMapper.getIAPPlatformList(); //商品库列表
+        List<AigcProductAlbum> iapVideoList = bytedanceProductUpdateMapper.getIAPVideoList(); //剧目列表
+        List<JSONObject> iapProductTypeEnums = bytedanceProductUpdateMapper.getIAPProductTypeEnums(); //商品类型
+        Map<String, JSONObject> iapProductTypeMap = iapProductTypeEnums.stream().collect(Collectors.toMap(
+                obj -> obj.getString("third_type_name"),
+                obj -> obj,
+                (existing, replacement) -> replacement
+        ));
+        runProductTask(iapPlatformList, iapVideoList, iapProductTypeMap, errors, BusinessType.IAP);
         log.info("付费商品库更新完成");
+
+
+
         log.info("免费商品库更新中...");
-//        iaaProductUpdate(errors);
+        List<AigcProductPlatform> iaaPlatformList = bytedanceProductUpdateMapper.getIAAPlatformList(); //商品库列表
+        List<AigcProductAlbum> iaaVideoList = bytedanceProductUpdateMapper.getIAAVideoList(); //剧目列表
+        List<JSONObject> iaaProductTypeEnums = bytedanceProductUpdateMapper.getIAAProductTypeEnums(); //商品类型
+        Map<String, JSONObject> iaaProductTypeMap = iaaProductTypeEnums.stream().collect(Collectors.toMap(
+                obj -> obj.getString("third_type_name"),
+                obj -> obj,
+                (existing, replacement) -> replacement
+        ));
+        runProductTask(iaaPlatformList, iaaVideoList, iaaProductTypeMap, errors, BusinessType.IAA);
         log.info("免费商品库更新完成");
+
+
+        errors.removeIf(s -> s.contains("剧目不可用"));
         if (!Check.isNull(errors)){
             List<String> info = new ArrayList<>();
             info.add("商品上传报错通知");
@@ -48,6 +78,100 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
         }
     }
 
+    private void runProductTask(List<AigcProductPlatform> platformList, List<AigcProductAlbum> albums, Map<String, JSONObject> productTypeMap, Set<String> errors, BusinessType businessType) throws IOException {
+        for (AigcProductPlatform platform : platformList){
+            // 拉取已上传剧目,对比,得到未上传剧目列表
+            List<String> hasUpload = hasUploadProductList(platform);
+            System.out.println("已上传剧目数: "+hasUpload.size() + ", 商品库ID: "+platform.getPlatformId()+", 来源:"+platform.getSource());
+            List<AigcProductAlbum> toUpload = albums.stream()
+                    .filter(o -> Objects.equals(o.getSource(), platform.getSource()))
+                    .filter(o -> Objects.equals(o.getPlatformType(), String.valueOf(platform.getPlatformType())))
+                    .filter(o -> !hasUpload.contains(o.getAlbumId())).collect(Collectors.toList());
+            System.out.println("待上传剧目数: "+toUpload.size() + ", 商品库ID: "+platform.getPlatformId()+", 来源:"+platform.getSource());
+            if (toUpload.isEmpty()){
+                continue;
+            }
+            //获取未上传剧目的推广链接
+            List<AigcProductAlbum> douyinUploadList = toUpload.stream().filter(o -> Objects.equals(o.getPlatformType(), "1")).collect(Collectors.toList());
+            Map<String, String> albumIdToLinkMap = getBytedancePlayletPromoteLink(platform.getMiniAppAdvertiserId(), platform.getAccessToken(), platform.getMiniInstanceId(), douyinUploadList, errors);
+            //未上传剧目:对比平台类型;确定商品分类;获取推广链接
+            for (AigcProductAlbum album : toUpload){
+                if (!Objects.equals(album.getPlatformType(), String.valueOf(platform.getPlatformType()))){
+                    continue;
+                }
+                if (!productTypeMap.containsKey(album.getTheme())){
+//                    errors.add("上传商品:没有找到对应的产品类型:" + album.getTheme());
+                    System.out.println(">>>>没有找到对应的产品类型:" + album.getTheme());
+                    System.out.println("\n\n\n");
+                    continue;
+                }
+                String schemaLink = null;
+                if (platform.getIsBytedance()==1){
+                    if (!albumIdToLinkMap.containsKey(album.getAlbumId())){
+//                        errors.add("上传商品:没有找到对应的推广链接,无法上传商品,剧目ID:" + album.getAlbumId() + ", 剧目名称:" + album.getName());
+                        System.out.println(">>>>没有找到对应的推广链接,无法上传商品,剧目ID:" + album.getAlbumId() + ", 剧目名称:" + album.getName());
+                        System.out.println("\n\n\n");
+                        continue;
+                    }else {
+                        schemaLink = albumIdToLinkMap.get(album.getAlbumId());
+                    }
+                }
+                uploadProduct(platform, album, schemaLink, errors, productTypeMap.get(album.getTheme()), businessType);
+            }
+        }
+    }
+
+    /**
+     * 当前商品库中,已经上传的商品列表
+     * @param platform
+     * @return
+     */
+    private List<String> hasUploadProductList(AigcProductPlatform platform){
+        return hasUploadProductPageList(platform, 1, 100);
+    }
+
+    private List<String> hasUploadProductPageList(AigcProductPlatform platform, int page, int pageSize){
+        String url = "https://api.oceanengine.com/open_api/2/dpa/detail/get/";
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", platform.getAccessToken());
+        Map<String, Object> params = new HashMap<>();
+        params.put("advertiser_id", Long.valueOf(platform.getAdvertiserId()));
+        params.put("product_platform_id", Long.valueOf(platform.getPlatformId()));
+        params.put("page", String.valueOf(page));
+        params.put("page_size", String.valueOf(pageSize));
+        String res = HttpUtils.httpGet(url, params, headers);
+        if (res == null || res.isEmpty()) {
+            System.out.println("获取已上传商品列表失败, 广告账号ID:" + platform.getAdvertiserId() + ", 商品库ID:" + platform.getPlatformId());
+            return new ArrayList<>();
+        }else {
+            JSONObject jsonObject = JSONObject.parseObject(res);
+            int code = jsonObject.getIntValue("code");
+            if (code != 0) {
+                System.out.println("获取已上传商品列表失败,code: " + code + ", msg: " + jsonObject.getString("message") + ", 广告账号ID:" + platform.getAdvertiserId() + ", 商品库ID:" + platform.getPlatformId());
+                return new ArrayList<>();
+            }else {
+                JSONArray list = jsonObject.getJSONObject("data").getJSONArray("list");
+                if (list == null || list.isEmpty()){
+                    return new ArrayList<>();
+                }
+                List<String> resList = new ArrayList<>(list.size());
+                for (int i = 0; i < list.size(); i++) {
+                    JSONObject obj = list.getJSONObject(i);
+                    resList.add(String.valueOf(obj.getLongValue("product_id")));
+                }
+                JSONObject page_info = jsonObject.getJSONObject("data").getJSONObject("page_info");
+                int total_page = page_info.getIntValue("total_page");
+                if (total_page > page){
+                    //递归获取下一页
+                    List<String> nextPage = hasUploadProductPageList(platform, page + 1, pageSize);
+                    resList.addAll(nextPage);
+                }
+                return resList;
+            }
+        }
+    }
+
+
     @Override
     public void authMovieResource() {
         //原片授权
@@ -57,7 +181,7 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
                 String tokenKey = "client-token-key_"+ DOUYIN_MOVIE_SOURCE_APP;
                 String token = (String) redis2Template_db5.opsForValue().get(tokenKey);
                 if (Check.isNull(token)){
-                    log.warn("没有找到字节小程序access_token,无法进行原片授权");
+                    log.warn("没有找到字节小程序access_token,无法进行  原片授权");
                     return;
                 }
                 for (JSONObject obj : authList){
@@ -101,10 +225,10 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
      */
     @Override
     public void initNew(){
-        List<JSONObject> iapPlatformList = bytedanceProductUpdateMapper.getIAPPlatformList();
-        List<JSONObject> iaaPlatformList = bytedanceProductUpdateMapper.getIAAPlatformList();
+        List<AigcProductPlatform> iapPlatformList = bytedanceProductUpdateMapper.getIAPPlatformInitList();
+        List<AigcProductPlatform> iaaPlatformList = bytedanceProductUpdateMapper.getIAAPlatformInitList();
         initNew(iaaPlatformList);
-//        initNew(iapPlatformList);
+        initNew(iapPlatformList);
         authMovieResource();
     }
 
@@ -120,23 +244,22 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
 
     }
 
-    public void initNew(List<JSONObject> platformList)  {
+    public void initNew(List<AigcProductPlatform> platformList)  {
         //为广告主账户创建新的字节小程序
         //step1 查询表里广告主是否都有自己的字节小程序、
         //step2 如果没有,创建新的字节小程序
-        for (JSONObject obj : platformList){
-            if (obj.containsKey("mini_instance_id") && !Check.isNull(obj.get("mini_instance_id"))){
+        for (AigcProductPlatform obj : platformList){
+            if (!Check.isNull(obj.getMiniInstanceId())){
                 //已经有字节小程序了
                 continue;
             }
             String createLinkUrl = "https://api.oceanengine.com/open_api/v3.0/tools/micro_app/create/";
-            String advertiser_id = obj.getString("advertiser_id");
-            String access_token = obj.getString("access_token");
+            String access_token = obj.getAccessToken();
             Map<String, String> headers = new HashMap<>();
             headers.put("Access-Token", access_token);
             JSONObject requestBody = new JSONObject();
-            requestBody.put("advertiser_id", Long.parseLong(advertiser_id));
-            requestBody.put("app_id", obj.getString("mi_appid"));
+            requestBody.put("advertiser_id", Long.parseLong(obj.getMiniAppAdvertiserId()));
+            requestBody.put("app_id", obj.getMiAppid());
             requestBody.put("remark", "商品库管理用");
             requestBody.put("tag_info", "1050107001");
             JSONObject app_page = new JSONObject();
@@ -148,95 +271,45 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
 
             String res = HttpUtils.httpPostRequest(createLinkUrl, requestBody, headers);
             if (res == null || res.isEmpty()){
-                System.out.println("创建字节小程序失败,advertiser_id:"+advertiser_id);
+                System.out.println("创建字节小程序失败,advertiser_id:"+obj.getMiniAppAdvertiserId());
             }else {
                 JSONObject jsonObject = JSONObject.parseObject(res);
                 System.out.println("创建字节小程序响应: " + jsonObject.toJSONString());
                 int code = jsonObject.getIntValue("code");
                 if (code != 0) {
-                    System.out.println("创建字节小程序失败,advertiser_id: "+advertiser_id+",code: " + code + ", msg: " + jsonObject.getString("message"));
+                    System.out.println("创建字节小程序失败,advertiser_id: "+obj.getMiniAppAdvertiserId()+",code: " + code + ", msg: " + jsonObject.getString("message"));
                 }else {
                     String instanceId = jsonObject.getJSONObject("data").getString("instance_id");
                     //更新表
-                    bytedanceProductUpdateMapper.updateInstanceId(advertiser_id, instanceId);
-                    System.out.println("创建字节小程序成功,广告主ID: " + advertiser_id + ", 实例ID: " + instanceId);
+                    bytedanceProductUpdateMapper.updateInstanceId(obj.getAdvertiserId(), instanceId, obj.getSource());
+                    System.out.println("创建字节小程序成功,广告主ID: " + obj.getMiniAppAdvertiserId() + ", 实例ID: " + instanceId);
                 }
             }
         }
     }
 
     /**
-     * 付费短剧更新
-     * @param errorBlanket
-     */
-    private void iapProductUpdate(Set<String> errorBlanket){
-        //IAP
-        List<JSONObject> iapPlatformList = bytedanceProductUpdateMapper.getIAPPlatformList(); //商品库列表
-        List<JSONObject> iapVideoList = bytedanceProductUpdateMapper.getIAPVideoList(); //剧目列表
-        List<JSONObject> iapProductTypeEnums = bytedanceProductUpdateMapper.getIAPProductTypeEnums(); //商品类型
-        Map<String, Map<String, String>> advertiserToLinkMap = new HashMap<>();
-
-        for (JSONObject obj : iapPlatformList){
-            String advertiserId = obj.getString("advertiser_id");
-            String accessToken = obj.getString("access_token");
-            String instanceId = obj.getString("mini_instance_id");
-            List<JSONObject> iapVideoDouyinList = iapVideoList.stream().filter(obj1 -> "1".equals(obj1.getString("platform_type"))).collect(Collectors.toList());
-            Map<String, String> albumIdToLinkMap = getBytedancePlayletPromoteLink(advertiserId, accessToken, instanceId, iapVideoDouyinList, errorBlanket);
-            advertiserToLinkMap.put(advertiserId, albumIdToLinkMap);
-        }
-
-        Map<String, JSONObject> iapProductTypeMap = iapProductTypeEnums.stream().collect(Collectors.toMap(
-                obj -> obj.getString("third_type_name"),
-                obj -> obj,
-                (existing, replacement) -> replacement
-        ));
-        for (JSONObject obj : iapVideoList){
-            String theme = obj.getString("theme");
-            if (!iapProductTypeMap.containsKey(theme)){
-                errorBlanket.add("上传商品:没有找到对应的产品类型:" + theme);
-                System.out.println(">>>>没有找到对应的产品类型:" + theme);
-                System.out.println("\n\n\n");
-                continue;
-            }
-            Integer platformType1 = obj.getInteger("platform_type");
-
-            for (JSONObject platform : iapPlatformList) {
-                Integer platformType2 = platform.getInteger("platform_type");
-                if (!Objects.equals(platformType1, platformType2)){
-                    continue;
-                }
-                int rescode = uploadIapProduct(platform, obj, advertiserToLinkMap, errorBlanket, iapProductTypeMap.get(theme));
-                if (rescode!= 0){
-//                    return;
-                }
-//                System.out.println("\n\n\n");
-            }
-        }
-    }
-
-    /**
-     * 付费短剧更新
+     * 短剧更新
      * @param platform 商品库信息
      * @param album 剧信息
-     * @param advertiserToLinkMap
+     * @param schemaLink 小程序推广链接 schemaLink(sslocal://sxxxxx
      * @param errorBlanket
      * @param productType 商品短剧类型
      */
-    private int uploadIapProduct(JSONObject platform, JSONObject album,
-                                  Map<String, Map<String, String>> advertiserToLinkMap,
-                                  Set<String> errorBlanket,
-                                  JSONObject productType){
+    private void uploadProduct(AigcProductPlatform platform, AigcProductAlbum album,
+                                  String schemaLink, Set<String> errorBlanket, JSONObject productType,
+                              BusinessType businessType){
         String url = "https://ad.oceanengine.com/open_api/2/dpa/product/update/";
         Map<String, String> headers = new HashMap<>();
-        headers.put("Access-Token", platform.getString("access_token"));
+        headers.put("Access-Token", platform.getAccessToken());
         headers.put("Content-Type", "application/json");
 
         JSONObject request = new JSONObject();
-        String album_id = album.getString("album_id");
-        request.put("product_id", album.getLongValue("album_id"));
+        String album_id = album.getAlbumId();
+        request.put("product_id", Long.valueOf(album_id));
         JSONObject product_info = new JSONObject();
-        product_info.put("name", album.getString("name"));
-        product_info.put("image_url", album.getString("img"));
+        product_info.put("name", album.getName());
+        product_info.put("image_url", album.getImg());
         product_info.put("status", 1);
         product_info.put("stock", 1);
         product_info.put("first_category_id", productType.getString("first_type_id"));
@@ -245,65 +318,55 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
         product_info.put("first_category", productType.getString("first_type_name"));
         product_info.put("sub_category", productType.getString("second_type_name"));
         product_info.put("third_category", productType.getString("third_type_name"));
-        request.put("advertiser_id", platform.getLongValue("advertiser_id"));
-        request.put("platform_id", platform.getLongValue("platform_id"));
+        request.put("advertiser_id", Long.valueOf(platform.getAdvertiserId()));
+        request.put("platform_id", Long.valueOf(platform.getPlatformId()));
         JSONObject profession = new JSONObject();
-        profession.put("copyright_owner", album.getString("copyright_owner"));
+        profession.put("copyright_owner", album.getCopyrightOwner());
         profession.put("playlet_gender", "3");
-        profession.put("playlet_num", album.getString("playlet_num"));
-        profession.put("playlet_duration", album.getString("playlet_duration"));
-        profession.put("start_pay_playlet", album.getString("start_pay_playlet"));
-        if (platform.getDouble("max_charge") > 0.0){
-            profession.put("max_charge", platform.getString("max_charge"));
-        }
-        if (platform.getDouble("min_charge") > 0.0){
-            profession.put("min_charge", platform.getString("min_charge"));
-        }
-        if (platform.getDouble("recommended_charge") > 0.0){
-            profession.put("recommended_charge", platform.getString("recommended_charge"));
-        }
-        profession.put("has_paid_content", "1");
-        profession.put("has_motivation_content", "2");
-        profession.put("membership_types", platform.getString("membership_types"));
-        Map<String, String> linkObj = advertiserToLinkMap.get(platform.getString("advertiser_id"));
-        String play_platform = album.getString("play_platform");
+        profession.put("playlet_num", String.valueOf(album.getPlayletNum()));
+        profession.put("playlet_duration", album.getPlayletDuration());
+        if (businessType==BusinessType.IAP){
+            profession.put("start_pay_playlet", String.valueOf(album.getStartPayPlaylet()));
+            if (platform.getMaxCharge() > 0.0){
+                profession.put("max_charge", String.valueOf(platform.getMaxCharge()));
+            }
+            if (platform.getMinCharge() > 0.0){
+                profession.put("min_charge", String.valueOf(platform.getMinCharge()));
+            }
+            if (platform.getRecommendedCharge() > 0.0){
+                profession.put("recommended_charge", String.valueOf(platform.getRecommendedCharge()));
+            }
+            profession.put("has_paid_content", "1");
+            profession.put("has_motivation_content", "2");
+            profession.put("membership_types", String.valueOf(platform.getMembershipTypes()));
+
+            //price_info
+            JSONObject price_info = new JSONObject();
+            price_info.put("price", platform.getSinglePrice());
+            product_info.put("price_info", price_info);
+        }else { //IAA
+            profession.put("has_paid_content", "2");
+            profession.put("has_motivation_content", "2");
+            profession.put("membership_types", "5");
+            profession.put("starting_unlock_episode", String.valueOf(album.getStartingUnlockEpisode()));
+        }
+//        String play_platform = album.getPlay_platform();
         List<String> ad_carrier = new ArrayList<>();
-//        if (linkObj != null){
-//            profession.put("micro_app_link", linkObj.get(album_id));
-//            ad_carrier.add("字节小程序");
-//            if (play_platform.contains("1")){
-//                if (bytedanceProductUpdateMapper.getWeixinAuditStatus(album.getLong("video_id"))>0){
-//                    ad_carrier.add("微信小程序");
-//                }
-//            }
-//        }else {
-//            profession.put("album_id", album_id);
-//            ad_carrier.add("微信小程序");
-//        }
-        Integer is_bytedance = platform.getInteger("is_bytedance");
-        Integer is_wechat = platform.getInteger("is_wechat");
-        Integer is_dys = platform.getInteger("is_dys");
-        if (is_bytedance == 1){
+        if (platform.getIsBytedance() == 1){
             ad_carrier.add("字节小程序");
         }
-        if (is_wechat == 1){
+        if (platform.getIsWechat() == 1){
             ad_carrier.add("微信小程序");
         }
-        if (is_dys == 1){
+        if (platform.getIsDys() == 1){
             ad_carrier.add("端原生组件");
         }
-
-        if (is_bytedance == 1){
-            profession.put("micro_app_link", linkObj.get(album_id));
+        if (platform.getIsBytedance() == 1){
+            profession.put("micro_app_link", schemaLink);
         }else {
             profession.put("album_id", album_id);
         }
         profession.put("ad_carrier", JSON.toJSONString(ad_carrier));
-
-        //price_info
-        JSONObject price_info = new JSONObject();
-        price_info.put("price", platform.getDoubleValue("single_price"));
-        product_info.put("price_info", price_info);
         product_info.put("profession", profession);
         request.put("product_info", product_info);
 
@@ -315,136 +378,9 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
         JSONObject btRes = JSONObject.parseObject(res);
         int code = btRes.getIntValue("code");
         if (code != 0){
-            errorBlanket.add("上传付费商品失败,code: " + code + ", msg: " + btRes.getString("message")+", 关联剧目: " + album.getString("name"));
+            String payName = businessType==BusinessType.IAP?"付费":"免费";
+            errorBlanket.add("上传"+payName+"商品失败,code: " + code + ", msg: " + btRes.getString("message")+", 关联剧目: " + album.getName());
         }
-        return code;
-    }
-
-    private void iaaProductUpdate(Set<String> errorBlanket){
-        //IAA
-        List<JSONObject> iaaPlatformList = bytedanceProductUpdateMapper.getIAAPlatformList();
-        List<JSONObject> iaaVideoList = bytedanceProductUpdateMapper.getIAAVideoList();
-        List<JSONObject> iaaProductTypeEnums = bytedanceProductUpdateMapper.getIAAProductTypeEnums();
-
-        Map<String, Map<String, String>> advertiserToLinkMap = new HashMap<>();
-
-        for (JSONObject obj : iaaPlatformList){
-            String advertiserId = obj.getString("advertiser_id");
-            String accessToken = obj.getString("access_token");
-            String instanceId = obj.getString("mini_instance_id");
-
-            List<JSONObject> iaaVideoDouyinList = iaaVideoList.stream().filter(obj1 -> "1".equals(obj1.getString("platform_type"))).collect(Collectors.toList());
-            Map<String, String> albumIdToLinkMap = getBytedancePlayletPromoteLink(advertiserId, accessToken, instanceId, iaaVideoDouyinList, errorBlanket);
-            advertiserToLinkMap.put(advertiserId, albumIdToLinkMap);
-        }
-
-        Map<String, JSONObject> iaaProductTypeMap = iaaProductTypeEnums.stream().collect(Collectors.toMap(
-                obj -> obj.getString("third_type_name"),
-                obj -> obj,
-                (existing, replacement) -> replacement
-        ));
-        for (JSONObject obj : iaaVideoList){
-            String theme = obj.getString("theme");
-            if (!iaaProductTypeMap.containsKey(theme)){
-                errorBlanket.add("上传商品:没有找到对应的产品类型:" + theme);
-                System.out.println(">>>>没有找到对应的产品类型:" + theme);
-                System.out.println("\n\n\n");
-                continue;
-            }
-            Integer platformType1 = obj.getInteger("platform_type");
-
-            for (JSONObject platform : iaaPlatformList) {
-                Integer platformType2 = platform.getInteger("platform_type");
-                if (!Objects.equals(platformType1, platformType2)){
-                    continue;
-                }
-                int code = uploadIaaProduct(platform, obj, advertiserToLinkMap, errorBlanket, iaaProductTypeMap.get(theme));
-                if (code !=0){
-
-                }
-//                System.out.println(res);
-//                System.out.println("\n\n\n");
-            }
-        }
-    }
-
-    private int uploadIaaProduct(JSONObject platform, JSONObject album, Map<String,
-            Map<String, String>> advertiserToLinkMap,
-                                  Set<String> errorBlanket,
-                                  JSONObject productType){
-        String url = "https://ad.oceanengine.com/open_api/2/dpa/product/update/";
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Access-Token", platform.getString("access_token"));
-        headers.put("Content-Type", "application/json");
-        String album_id = album.getString("album_id");
-        JSONObject request = new JSONObject();
-        request.put("product_id", album.getLongValue("album_id"));
-        JSONObject product_info = new JSONObject();
-        product_info.put("name", album.getString("name"));
-        product_info.put("image_url", album.getString("img"));
-        product_info.put("status", 1);
-        product_info.put("stock", 1);
-        product_info.put("first_category_id", productType.getString("first_type_id"));
-        product_info.put("sub_category_id", productType.getString("second_type_id"));
-        product_info.put("third_category_id", productType.getString("third_type_id"));
-        product_info.put("first_category", productType.getString("first_type_name"));
-        product_info.put("sub_category", productType.getString("second_type_name"));
-        product_info.put("third_category", productType.getString("third_type_name"));
-        JSONObject profession = new JSONObject();
-        profession.put("copyright_owner", album.getString("copyright_owner"));
-        profession.put("playlet_gender", "3");
-        profession.put("playlet_num", album.getString("playlet_num"));
-        profession.put("playlet_duration", album.getString("playlet_duration"));
-        profession.put("has_paid_content", "2");
-        profession.put("has_motivation_content", "2");
-        profession.put("membership_types", "5");
-        profession.put("starting_unlock_episode", album.getString("starting_unlock_episode"));
-        Map<String, String> linkObj = advertiserToLinkMap.get(platform.getString("advertiser_id"));
-        List<String> ad_carrier = new ArrayList<>();
-//        if (linkObj != null){
-//            profession.put("micro_app_link", linkObj.get(album_id));
-//            ad_carrier.add("字节小程序");
-//        }else {
-//            profession.put("album_id", album_id);
-//            ad_carrier.add("微信小程序");
-//        }
-        Integer is_bytedance = platform.getInteger("is_bytedance");
-        Integer is_wechat = platform.getInteger("is_wechat");
-        Integer is_dys = platform.getInteger("is_dys");
-        if (is_bytedance == 1){
-            ad_carrier.add("字节小程序");
-        }
-        if (is_wechat == 1){
-            ad_carrier.add("微信小程序");
-        }
-        if (is_dys == 1){
-            ad_carrier.add("端原生组件");
-        }
-
-        if (is_bytedance == 1){
-            profession.put("micro_app_link", linkObj.get(album_id));
-        }else {
-            profession.put("album_id", album_id);
-        }
-
-        profession.put("ad_carrier", JSON.toJSONString(ad_carrier));
-
-        product_info.put("profession", profession);
-        request.put("product_info", product_info);
-        request.put("advertiser_id", platform.getLongValue("advertiser_id"));
-        request.put("platform_id", platform.getLongValue("platform_id"));
-
-//                System.out.println("请求地址:" + url);
-//                System.out.println("请求头:" + headers);
-//                System.out.println("请求参数:" + request.toJSONString());
-        String res = HttpUtils.httpPostRequest(url, request, headers);
-        JSONObject btRes = JSONObject.parseObject(res);
-        int code = btRes.getIntValue("code");
-        if (code != 0){
-            System.out.println("上传免费商品失败,code: " + code + ", msg: " + btRes.getString("message")+", 关联剧目: " + album.getString("name"));
-            errorBlanket.add("上传免费商品失败,code: " + code + ", msg: " + btRes.getString("message")+", 关联剧目: " + album.getString("name"));
-        }
-        return code;
     }
 
     /**
@@ -454,33 +390,48 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
      * @param instanceId 字节小程序的实例ID
      * @return map key: album_id, value: 对应的字节小程序推广链接,sslocal开头
      */
-    private Map<String, String> getBytedancePlayletPromoteLink(String advertiserId, String accessToken, String instanceId, List<JSONObject> requests, Set<String> errorBlanket){
-        JSONArray playletDetailInfo = getPlayletDetail(advertiserId, accessToken, instanceId, errorBlanket,1);
-        if (playletDetailInfo == null || playletDetailInfo.isEmpty()){
-            return null;
-        }
+    private Map<String, String> getBytedancePlayletPromoteLink(String advertiserId, String accessToken, String instanceId, List<AigcProductAlbum> requests, Set<String> errorBlanket){
         List<String> reqAlbumIds = requests.stream()
-                .map(obj -> obj.getString("album_id"))
+                .map(obj -> obj.getAlbumId())
                 .collect(Collectors.toList());
         Map<String, String> res = new HashMap<>(reqAlbumIds.size());
 
-        for (int i = 0; i < playletDetailInfo.size(); i++) {
-            JSONObject obj = playletDetailInfo.getJSONObject(i);
-            String startParam = obj.getString("start_param");
-            for (String album_id : reqAlbumIds){
-                if (startParam.contains("tt_album_id="+album_id)){
-                    res.put(album_id, obj.getString("link"));
+        List<AigcProductAlbum> unfound = new ArrayList<>(requests);
+        for (int page=1; page<=20; page++){
+            JSONArray playletDetailInfo = getPlayletDetail(advertiserId, accessToken, instanceId, errorBlanket,page);
+            if (playletDetailInfo == null || playletDetailInfo.isEmpty()){
+                break;
+            }
+            for (int i = 0; i < playletDetailInfo.size(); i++) {
+                JSONObject obj = playletDetailInfo.getJSONObject(i);
+                String startParam = obj.getString("start_param");
+                for (String album_id : reqAlbumIds){
+                    if (startParam.contains("tt_album_id="+album_id)){
+                        res.put(album_id, obj.getString("link"));
+                    }
                 }
             }
+             unfound = requests.stream()
+                    .filter(obj -> !res.containsKey(obj.getAlbumId()))
+                    .collect(Collectors.toList());
+            if (unfound.isEmpty()){
+                break;
+            }
+            try {
+                Thread.sleep(500);
+            }catch (Exception ignored){
+
+            }
         }
-        List<JSONObject> unfound = requests.stream()
-                .filter(obj -> !res.containsKey(obj.getString("album_id")))
-                .collect(Collectors.toList());
+
         if (unfound.isEmpty()){
+            System.out.println("所有剧目都找到了对应的推广链接");
             return res;
+        }else {
+            System.out.println("有" + unfound.size() + "个剧目没有找到对应的推广链接,准备新建链接");
         }
         //没有找到对应的album_id,需要新建链接
-        for (JSONObject obj : unfound){
+        for (AigcProductAlbum obj : unfound){
             String editLinkUrl = "https://api.oceanengine.com/open_api/v3.0/tools/micro_app/update/";
             Map<String, String> headers = new HashMap<>();
             headers.put("Access-Token", accessToken);
@@ -488,16 +439,16 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
             requestBody.put("advertiser_id", Long.parseLong(advertiserId));
             requestBody.put("instance_id", Long.parseLong(instanceId));
             JSONObject app_page = new JSONObject();
-            String name = obj.getString("name");
+            String name = obj.getName();
             app_page.put("link", "");
             app_page.put("remark", "生成商品用-"+name);
             app_page.put("link_remark", "生成商品用-"+name);
             app_page.put("operate_type", "NEW");
             app_page.put("start_page", "pages/index/index");
-            String video_id = obj.getString("video_id");
-            String album_id = obj.getString("album_id");
-            String video_detail_id = obj.getString("video_detail_id");
-            String platform_config = obj.getString("platform_config");
+            String video_id = String.valueOf(obj.getVideoId());
+            String album_id = obj.getAlbumId();
+            String video_detail_id = String.valueOf(obj.getVideoDetailId());
+            String platform_config = obj.getPlatformConfig();
             JSONObject pconfig = JSONObject.parseObject(platform_config);
             String tt_episode_id = pconfig.getJSONObject("douyinyun").getString("episode_id");
             String start_param = "tt_album_id=" + album_id + "&video_id=" + video_id + "&video_detail_id=" + video_detail_id + "&tt_episode_id=" + tt_episode_id + "&source=link&type=1";
@@ -506,9 +457,6 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
             app_page_list.add(app_page);
             requestBody.put("app_page", app_page_list);
             requestBody.put("tag_info", "1050107001");
-//            System.out.println("\n\n请求地址:" + editLinkUrl);
-//            System.out.println("请求头:" + headers);
-//            System.out.println("请求参数:" + requestBody.toJSONString());
 
             String rr = HttpUtils.httpPostRequest(editLinkUrl, requestBody, headers);
             if (rr == null || rr.isEmpty()){
@@ -519,21 +467,36 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
                 JSONObject jsonObject = JSONObject.parseObject(rr);
                 int code = jsonObject.getIntValue("code");
                 if (code != 0) {
-                    errorBlanket.add("创建字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message") + ", 广告账号ID:" + advertiserId + ", 小程序资产ID:" + instanceId);
-                    System.out.println("创建字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message"));
-                    continue;
-                }else {
-                    String instanceid = jsonObject.getJSONObject("data").getString("instance_id");
-                    JSONArray newPlayletDetailInfo = getPlayletDetail(advertiserId, accessToken, instanceid, errorBlanket,1);
-                    if (newPlayletDetailInfo == null || newPlayletDetailInfo.isEmpty()){
+                    String message = jsonObject.getString("message");
+                    if (message.contains("资产非审核成功")){
+                        errorBlanket.add("字节小程序"+instanceId+"未通过审核,等待下次再试");
+                        break;
+                    }else if (message.contains("请求频率超限")){
+                        errorBlanket.add("广告账号"+advertiserId+"请求频率超限");
+                        continue;
+                    } else {
+                        errorBlanket.add("创建字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message") + ", 广告账号ID:" + advertiserId + ", 小程序资产ID:" + instanceId);
+                        System.out.println("创建字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message"));
                         continue;
                     }
-                    for (int i = 0; i < newPlayletDetailInfo.size(); i++) {
-                        JSONObject link = newPlayletDetailInfo.getJSONObject(i);
-                        String startParam = link.getString("start_param");
-                        if (startParam.contains("tt_album_id="+album_id)){
-                            res.put(album_id, link.getString("link"));
-                        }
+
+                }else {
+
+                }
+            }
+        }
+        int maxPage = unfound.size() / 100 + 1;
+        for (int p = 0; p < maxPage; p++) {
+            JSONArray newPlayletDetailInfo = getPlayletDetail(advertiserId, accessToken, instanceId, errorBlanket,p+1);
+            if (newPlayletDetailInfo == null || newPlayletDetailInfo.isEmpty()){
+                break;
+            }
+            for (int i = 0; i < newPlayletDetailInfo.size(); i++) {
+                JSONObject obj = newPlayletDetailInfo.getJSONObject(i);
+                String startParam = obj.getString("start_param");
+                for (AigcProductAlbum album : unfound){
+                    if (startParam.contains("tt_album_id="+album.getAlbumId())){
+                        res.put(album.getAlbumId(), obj.getString("link"));
                     }
                 }
             }
@@ -552,7 +515,7 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
      * @return
      */
     private JSONArray getPlayletDetail(String advertiserId, String accessToken, String instanceId, Set<String> errorBlanket, Integer pageNum) {
-        if (pageNum >50){
+        if (pageNum >60){
             return new JSONArray();
         }
         String getPlayletDetailUrl = "https://api.oceanengine.com/open_api/v3.0/tools/asset_link/list/";
@@ -568,23 +531,27 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
         String res = HttpUtils.httpGet(getPlayletDetailUrl, params, headers);
         if (res == null || res.isEmpty()) {
             errorBlanket.add("获取字节小程序推广链接失败, 广告账号ID:" + advertiserId + ", 小程序资产ID:" + instanceId);
+            System.out.println("获取字节小程序推广链接失败, 广告账号ID:" + advertiserId + ", 小程序资产ID:" + instanceId);
             return new JSONArray();
         }else {
             JSONObject jsonObject = JSONObject.parseObject(res);
             int code = jsonObject.getIntValue("code");
             if (code != 0) {
                 errorBlanket.add("获取字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message") + ", 广告账号ID:" + advertiserId + ", 小程序资产ID:" + instanceId);
-                System.out.println("获取字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message"));
+                System.out.println("获取字节小程序推广链接失败,code: " + code + ", msg: " + jsonObject.getString("message") + ", 广告账号ID:" + advertiserId + ", 小程序资产ID:" + instanceId);
                 return new JSONArray();
             }else {
                 JSONArray list = jsonObject.getJSONObject("data").getJSONArray("list");
-                JSONObject page_info = jsonObject.getJSONObject("data").getJSONObject("page_info");
-                int total_page = page_info.getIntValue("total_page");
-                if (total_page > pageNum){
-                    //递归获取下一页
-                    JSONArray nextPage = getPlayletDetail(advertiserId, accessToken, instanceId, errorBlanket, pageNum + 1);
-                    list.addAll(nextPage);
+                if (list.size() > 0){
+                    return list;
                 }
+//                JSONObject page_info = jsonObject.getJSONObject("data").getJSONObject("page_info");
+//                int total_page = page_info.getIntValue("total_page");
+//                if (total_page > pageNum){
+//                    //递归获取下一页
+//                    JSONArray nextPage = getPlayletDetail(advertiserId, accessToken, instanceId, errorBlanket, pageNum + 1);
+//                    list.addAll(nextPage);
+//                }
                 return list;
             }
         }
@@ -607,7 +574,7 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
         }
         for (JSONObject vi : wxVideoInfos){
             Long videoId = vi.getLong("id");
-            String albumId = uploadAlbum(videoId, appId, appAccessToken);
+            String albumId = uploadWxAlbum(videoId, appId, appAccessToken);
             if (albumId == null){
                 info.add("上传短剧失败,videoId: " + videoId + ", 剧目名称: " + vi.getString("name"));
             }else {
@@ -685,7 +652,7 @@ public class BytedanceProductUpdateServiceImpl implements IBytedanceProductUpdat
      * @param videoId from ly_videos
      * @return albumId
      */
-    private String uploadAlbum(long videoId, Long appId, String appAccessToken){
+    private String uploadWxAlbum(long videoId, Long appId, String appAccessToken){
         JSONObject video = bytedanceProductUpdateMapper.getVideoInfo(videoId);
         if (video == null){
             System.out.println("没有找到视频信息,videoId: " + videoId);

+ 5 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceRefreshTokenServiceImpl.java

@@ -91,6 +91,9 @@ public class BytedanceRefreshTokenServiceImpl implements IBytedanceRefreshTokenS
                     if (app.getString("app_id").startsWith("wx")) {
                         key = "wechat-applet-access-token-key-" + app.getString("applet_id");
                     }
+                    if (Check.isNull(key)) {
+                        continue;
+                    }
                     String token = jedis.get(key);
                     if (!Check.isNull(token)) {
                         app.put("token", token);
@@ -104,7 +107,8 @@ public class BytedanceRefreshTokenServiceImpl implements IBytedanceRefreshTokenS
     }
 
     //获取token
-    private Jedis getJedisToken() {
+    @Override
+    public Jedis getJedisToken() {
         Jedis jedis = null;
         try {
             String ip = "r-2zelacjrljt205nsb1pd.redis.rds.aliyuncs.com";

+ 34 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/CPSReportServiceImpl.java

@@ -2,10 +2,15 @@ package cn.com.ctop.job.bytedance.data.service.impl;
 
 import cn.com.ctop.job.bytedance.data.mapper.CPSReportMapper;
 import cn.com.ctop.job.bytedance.data.service.ICPSReportService;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+import java.util.List;
+
 @Service
 @Slf4j
 public class CPSReportServiceImpl implements ICPSReportService {
@@ -23,4 +28,33 @@ public class CPSReportServiceImpl implements ICPSReportService {
             log.error("CPS数据清洗异常");
         }
     }
+
+    @Override
+    public void runCPSSettlementData(String nowDate) {
+        try {
+            //根据nowDate获取这一天开始和结束的时间戳(10位)
+            Date date = DateUtils.getDateByPattern(nowDate, "yyyy-MM-dd");
+            Long st = date.getTime() / 1000 + 3600;
+            String dateLong = nowDate.replaceAll("-", "");
+            int count = cpsReportMapper.runCPSIapSettlementData(nowDate, dateLong, st);
+            log.info("CPSIAP结算数据处理完成,影响行数:{}", count);
+            List<JSONObject> dyList =cpsReportMapper.runCPSIaaDySettlementData(nowDate, dateLong, st);
+            count = dyList==null ? 0: dyList.size();
+            if (count>0){
+                cpsReportMapper.saveIaaDySettlementData(dyList);
+            }
+            log.info("CPSIaa(抖音)结算数据处理完成,影响行数:{}", count);
+            List<JSONObject> wxList = cpsReportMapper.runCPSIaaWxSettlementData(nowDate, dateLong, st);
+            count = wxList==null ? 0: wxList.size();
+            if (count>0){
+                cpsReportMapper.saveIaaWxSettlementData(wxList);
+            }
+            log.info("CPSIaa(微信)结算数据处理完成,影响行数:{}", count);
+            count = cpsReportMapper.runCPSDysSettlementData(nowDate, dateLong, st);
+            log.info("CPSDYS结算数据处理完成,影响行数:{}", count);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("CPSIAP结算数据处理异常");
+        }
+    }
 }

+ 1 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/CutGroupRankPushServiceImpl.java

@@ -44,6 +44,7 @@ public class CutGroupRankPushServiceImpl implements ICutGroupRankPushService {
                 ,"ebeeced9" //yumeng
                 ,"aca3ef75" //renyupeng
                 ,"265g9ef1" //wangshu
+                ,"fbgd2d2f"//xuweiwei
                 ,"d834552b" //hemenghao
                 ,"a3235a61" //louzijun
         );

+ 5 - 5
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/DateReportsPushServiceImpl.java

@@ -34,7 +34,7 @@ public class DateReportsPushServiceImpl implements IDateReportsPushService {
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
-    private static final String TEMPLATE_VERSION = "1.0.17";
+    private static final String TEMPLATE_VERSION = "1.0.20";
     private static final String TEMPLATE_ID = "AAqRhJzMBoO0E";
 
     /**
@@ -192,8 +192,8 @@ public class DateReportsPushServiceImpl implements IDateReportsPushService {
             obj.put("movieName", movieName);
             obj.put("endAmount", String.valueOf(movie.get("end_amount")));
 //            obj.put("realROI", String.valueOf(movie.get("real_roi")));
-            obj.put("iapRoi", String.valueOf(movie.get("iap_roi")));
-            obj.put("iaaRoi", String.valueOf(movie.get("iaa_roi")));
+            obj.put("iapRoi", String.valueOf(movie.get("iap_roi"))+"\n"+String.valueOf(movie.get("iap_real_cost_amount")));
+            obj.put("iaaRoi", String.valueOf(movie.get("iaa_roi")+"\n"+String.valueOf(movie.get("iaa_real_cost_amount"))));
             movieRankTable.add(obj);
         }
 
@@ -205,8 +205,8 @@ public class DateReportsPushServiceImpl implements IDateReportsPushService {
             obj.put("deptName", String.valueOf(dept.get("dept_name")));
             obj.put("todayCost", String.valueOf(dept.get("cost_amount")));
             obj.put("ROI", String.valueOf(dept.get("real_roi")));
-            obj.put("iapRoi", String.valueOf(dept.get("iap_roi")));
-            obj.put("iaaRoi", String.valueOf(dept.get("iaa_roi")));
+            obj.put("iapRoi", String.valueOf(dept.get("iap_roi"))+"\n"+String.valueOf(dept.get("share_pay_amount")));
+            obj.put("iaaRoi", String.valueOf(dept.get("iaa_roi"))+"\n"+String.valueOf(dept.get("share_iaa_amount_3")));
             deptRank.add(obj);
         }
 

+ 1 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/FeishuServiceImpl.java

@@ -66,7 +66,7 @@ public class FeishuServiceImpl implements IFeishuService {
 
             System.out.println("userId: "+userId+", ossUrl: "+ossUrl);
 
-//            feishuMapper.updateAvatar1(phone, ossUrl);
+            feishuMapper.updateAvatar1(phone, ossUrl);
             feishuMapper.updateAvatar2(phone, ossUrl);
             feishuMapper.updateAvatar3(phone, ossUrl);
         }

+ 1 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/OptimizerRankPushServiceImpl.java

@@ -112,6 +112,7 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
             String userId = String.valueOf(optToday.get("user_id"));
             String costAmount = "";
             template_variable.put("myRank", rank);
+            template_variable.put("updateTime", String.valueOf(optHour.get("update_time")));
             for (Pair<String, String> column : columns){
                 JSONObject object = new JSONObject();
                 object.put("indicatorName", column.getValue());

+ 39 - 15
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsAdPushServiceImpl.java

@@ -32,7 +32,7 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
     public static final String APP_KEY = "OUlg7WTa6UWZItfTmJw2JdQvhVI4VcRj";
 
     public static final String TEMPLATE_ID = "AAqBGlVblKabY";
-    public static final String TEMPLATE_VERSION = "1.0.15";
+    public static final String TEMPLATE_VERSION = "1.0.23";
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
@@ -50,6 +50,8 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
                 ,"58e7a98a"  //xsq
                 ,"2ga9669f"  //xsq
                 ,"ga91e5d5" //yangcheng
+                ,"ddbc7b71" //qianjiayi
+                ,"11a45882" //chenglitong
         );
         send(userIds);
     }
@@ -58,10 +60,10 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
     public void test() {
         List<String> userIds = Arrays.asList(
                 "44fbaed6" //zhaotx
-                ,"ebeeced9" //yumeng
-                ,"58e7a98a"  //xsq
-                ,"2ga9669f" //angaoqi
-                ,"43gb7fbc" //huangpingkang
+//                ,"ebeeced9" //yumeng
+//                ,"58e7a98a"  //xsq
+//                ,"2ga9669f" //angaoqi
+//                ,"43gb7fbc" //huangpingkang
         );
         send(userIds);
     }
@@ -104,14 +106,24 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
         for (Pair<String, String> cp : columns) {
             String c = cp.getKey();
             String cn = cp.getValue();
-            String todayNum = String.valueOf(todayData.get(c));
-            String lastHourNum = String.valueOf(lastHourData.get(c));
-            String lastLastHourNum = String.valueOf(lastLastHourData.get(c));
             JSONObject obj = new JSONObject();
             obj.put("IndicatorName", cn);
+            String todayNum = String.valueOf(todayData.get(c));
             obj.put("todayData", todayNum);
-            obj.put("thisHourData", lastHourNum);
-            obj.put("lastHourData", lastLastHourNum);
+            if (c.equals("cost_amount")){
+                Double lastHourNumD = Double.parseDouble(String.valueOf(lastHourData.get(c)));
+                if (lastHourNumD >= 100000){
+                    obj.put("thisHourData", "<font color='red'>"+lastHourNumD+"(起量)</font>");
+                }else {
+                    obj.put("thisHourData", ""+lastHourNumD);
+                }
+                obj.put("lastHourData", String.valueOf(lastLastHourData.get(c)));
+            }else {
+                String lastHourNum = String.valueOf(lastHourData.get(c));
+                obj.put("thisHourData", lastHourNum);
+                String lastLastHourNum = String.valueOf(lastLastHourData.get(c));
+                obj.put("lastHourData", lastLastHourNum);
+            }
             object_list_1.add(obj);
         }
         template_variables.put("object_list_1", object_list_1);
@@ -122,13 +134,25 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
 //            int movieSource = m.getIntValue("movie_source");
 //            String movieNameColor = movieSource==2?"grey":"blue";
             JSONObject obj = new JSONObject();
-            obj.put("movieName", m.getString("movie_name"));
+
 //            obj.put("movieNameColor", movieNameColor);
-            obj.put("endAmount", m.get("water_end_amount"));
+//            obj.put("endAmount", m.get("water_end_amount"));
 //            obj.put("movieRealRoi", m.get("real_roi"));
-            obj.put("hourCostAmount", m.get("hour_cost_amount"));
-            obj.put("iaaRoi", m.get("iaa_roi"));
-            obj.put("iapRoi", m.get("iap_roi"));
+            Double hourCostAmount = m.getDoubleValue("hour_cost_amount");
+            if (hourCostAmount >= 40000){
+                obj.put("movieName", "<font color='red'>"+m.getString("movie_name")+"(起量)</font>");
+                obj.put("hourCostAmount", "<font color='red'>"+hourCostAmount+"</font>");
+            }else {
+                obj.put("movieName", m.getString("movie_name"));
+                obj.put("hourCostAmount", ""+hourCostAmount);
+            }
+
+            String iaaRoi = String.valueOf(m.get("iaa_roi"));
+            String iapRoi = String.valueOf(m.get("iap_roi"));
+            String iaaAmount = String.valueOf(m.get("share_iaa_amount_3"));
+            String iapAmount = String.valueOf(m.get("share_pay_amount"));
+            obj.put("iaaRoi", iaaRoi+"\n"+iaaAmount);
+            obj.put("iapRoi", iapRoi+"\n"+iapAmount);
             String movieProjectSource = String.valueOf(m.get("movie_project_source"));
             String movieProjectSourceName = String.valueOf(m.get("movie_project_source_name"));
             JSONArray ms = new JSONArray();

+ 3 - 3
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsByBusinessPushServiceImpl.java

@@ -36,7 +36,7 @@ public class ReportsByBusinessPushServiceImpl implements IReportsByBusinessPushS
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
-    private static final String TEMPLATE_VERSION = "1.0.6";
+    private static final String TEMPLATE_VERSION = "1.0.7";
     private static final String TEMPLATE_ID = "AAq4oeDXECopo";
 
 
@@ -187,8 +187,8 @@ public class ReportsByBusinessPushServiceImpl implements IReportsByBusinessPushS
             obj.put("deptName", String.valueOf(dept.get("dept_name")));
             obj.put("todayCost", String.valueOf(dept.get("cost_amount")));
             obj.put("ROI", String.valueOf(dept.get("real_roi")));
-            obj.put("iaaRoi", String.valueOf(dept.get("iaa_roi")));
-            obj.put("iapRoi", String.valueOf(dept.get("iap_roi")));
+            obj.put("iapRoi", String.valueOf(dept.get("iap_roi"))+"\n"+String.valueOf(dept.get("share_pay_amount")));
+            obj.put("iaaRoi", String.valueOf(dept.get("iaa_roi"))+"\n"+String.valueOf(dept.get("share_iaa_amount_3")));
             deptRank.add(obj);
         }
 

+ 1 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java

@@ -44,6 +44,7 @@ public class TotalRankPushServiceImpl implements ITotalRankPushService {
         "c5f6b59d",//余洋
         "a3235a61",//楼子君
         "265g9ef1",//王舒
+        "fbgd2d2f",//xuweiwei
         "d834552b",//何梦豪
         "59g6d358",//陈秋灵
         "13dfc1gg",//刘恩麟

+ 7 - 7
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/UnbindWarnPushServiceImpl.java

@@ -55,7 +55,7 @@ public class UnbindWarnPushServiceImpl implements IUnbindWarnPushService {
         Long todayLong = Long.parseLong(today.replaceAll("-", ""));
         String last30Day = DateUtils.getNowAddDate("yyyy-MM-dd", -30);
         Long last30DayLong = Long.parseLong(last30Day.substring(0, 10).replaceAll("-", ""));
-        String last90Day = DateUtils.getNowAddDate("yyyy-MM-dd", -90);
+        String last90Day = DateUtils.getNowAddDate("yyyy-MM-dd", -60);
         Long last90DayLong = Long.parseLong(last90Day.substring(0, 10).replaceAll("-", ""));
 
         int unFindCount = 0;
@@ -217,12 +217,12 @@ public class UnbindWarnPushServiceImpl implements IUnbindWarnPushService {
         if (advertiserName.contains(ub.getName())){
             return true;
         }
-        if (!Check.isNull(ub.getRemark())){
-            String lower = ub.getRemark().toLowerCase();
-            String upper = ub.getRemark().toUpperCase();
-            String firstUpper = ub.getRemark().substring(0, 1).toUpperCase() + ub.getRemark().substring(1).toLowerCase();
-            return advertiserName.contains(lower) || advertiserName.contains(upper) || advertiserName.contains(firstUpper);
-        }
+//        if (!Check.isNull(ub.getRemark())){
+//            String lower = ub.getRemark().toLowerCase();
+//            String upper = ub.getRemark().toUpperCase();
+//            String firstUpper = ub.getRemark().substring(0, 1).toUpperCase() + ub.getRemark().substring(1).toLowerCase();
+//            return advertiserName.contains(lower) || advertiserName.contains(upper) || advertiserName.contains(firstUpper);
+//        }
         return false;
     }
 

+ 32 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAppletTokenRefreshJob.java

@@ -0,0 +1,32 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.job.bytedance.data.service.BytedanceAppletTokenRefreshService;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 抖音小程序clientToke刷新
+ */
+@Slf4j
+@Component
+public class BytedanceAppletTokenRefreshJob {
+
+    @Autowired
+    private BytedanceAppletTokenRefreshService tokenRefreshService;
+
+    @XxlJob("bytedanceAppletTokenRefreshJob")
+    public void bytedanceAppletTokenRefreshJob() {
+        log.info("[bytedanceAppletTokenRefreshJob] 任务开始");
+        try {
+            // 生成小程序token
+            tokenRefreshService.buildAppletTokens();
+        } catch (Exception e) {
+            XxlJobHelper.handleFail("[bytedanceAppletTokenRefreshJob] 异常 + " + e.getMessage());
+        }
+    }
+
+
+}

+ 18 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/CPSReportJob.java

@@ -51,4 +51,22 @@ public class CPSReportJob {
         }
     }
 
+
+    @XxlJob("runCPSIapSettlementData")
+    public void runCPSIapSettlementData() throws Exception {
+        log.info("[runCPSIapSettlementData] 任务启动...");
+        try {
+            String nowDate = DateUtils.getNowAddDate("yyyy-MM-dd", -1);
+            cpsReportService.runCPSSettlementData(nowDate);
+            nowDate = DateUtils.getNowAddDate("yyyy-MM-dd", -2);
+            cpsReportService.runCPSSettlementData(nowDate);
+            nowDate = DateUtils.getNowAddDate("yyyy-MM-dd", -3);
+            cpsReportService.runCPSSettlementData(nowDate);
+            log.info("[runCPSIapSettlementData] 任务完成");
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
 }

+ 9 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ToolsSiteJob.java

@@ -119,4 +119,13 @@ public class ToolsSiteJob {
         HttpUtils.httpGet(String.format("%s?platform=1&id=%s", url, KEY), null, null);
         HttpUtils.httpGet(String.format("%s?platform=2&id=%s", url, KEY), null, null);
     }
+
+    @XxlJob("regularUpdateUploadEpisodesStatus")
+    public void regularUpdateUploadEpisodesStatus() throws Exception {
+        log.info("定期更新短剧剧集上传状态信息...");
+        //定期更新短剧剧集上传状态信息
+        String url = "https://api.cms.artlinkworld.cn/thirtPartVideo/regularUpdateUploadEpisodesStatus";
+        HttpUtils.httpGet(String.format("%s?platform=1&id=%s", url, KEY), null, null);
+        HttpUtils.httpGet(String.format("%s?platform=2&id=%s", url, KEY), null, null);
+    }
 }