Przeglądaj źródła

批量开户状态同步

zhaotx 9 miesięcy temu
rodzic
commit
7af5aade87

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

@@ -10,4 +10,6 @@ public interface PromoteLinkRefreshMapper {
     List<JSONObject> refreshList(@Param("expireTime") Long expireTime);
 
     int updateLink(@Param("uuid") String uuid, @Param("url") String url, @Param("expireTime") Long expireTime);
+
+    int updateRunStatus(@Param("startTime") String startTime, @Param("endTime") String endTime);
 }

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

@@ -7,6 +7,55 @@
         expire_time = #{expireTime}
         where uuid = #{uuid}
     </update>
+    <update id="updateRunStatus">
+        replace into deepthink.bytedance_advertiser_task
+        (id, task_id, task_name, task_status, task_type, advertiser_id, advertiser_name, advertiser_name_update, template_value_name, advertiser_avatar_url, avatar_signature, media_type, app_id, app_name, instance_id, stat_date, site_id, movie_id, distributor_id, recharge_template_id, recharge_template_name, callback_id, callback_name, user_id, lift_assistant, rewarded_ad, remark, `index`, create_time, update_time, run_status, fail_reason, movie_name)
+        select id, task_id, task_name, task_status, task_type, advertiser_id, advertiser_name, advertiser_name_update, template_value_name, advertiser_avatar_url, avatar_signature, media_type, app_id, app_name, instance_id, stat_date, site_id, movie_id, distributor_id, recharge_template_id, recharge_template_name, callback_id, callback_name, user_id, lift_assistant, rewarded_ad, remark, `index`, create_time, update_time,
+               case when plat_type=7 and ('AUDIT_PASS' = avatar_status and 'STATUS_ENABLE' = advertiser_status) then 1
+                    when plat_type=7 and ('FAIL' = advertiser_status or 'STATUS_CONFIRM_FAIL_END' = advertiser_status or 'AUDIT_REJECT' = avatar_status or 'FAIL' = avatar_status) then -1
+                    when plat_type=7 then 0
+                    when media_type=1 and (('AUDIT_ACCEPTED' = app_status or 'ADD_LINK_SUCCESS' = app_status or 'SHARE_SUCCESS' = app_status) and 'AUDIT_ACCEPTED' = site_status and (avatar_status is null or 'AUDIT_PASS'= avatar_status) and (advertiser_status is null or 'STATUS_ENABLE' = advertiser_status)) then 1
+                    when media_type=1 and (app_status is null or 'AUDIT_REJECTED' = app_status or 'FAIL' = app_status or 'ADD_LINK_FAIL' = app_status or 'SHARE_FAIL' = app_status or site_status is null or 'AUDIT_REJECTED' = site_status or 'AUDIT_REJECT' = avatar_status or 'FAIL' = avatar_status or 'FAIL' = advertiser_status or 'STATUS_CONFIRM_FAIL_END' = advertiser_status) then -1
+                    when media_type=1 then 0
+                    when media_type=3 and ('ENABLE' = site_status or 'AUDIT_ACCEPTED' = site_status) AND '1'=link_status then 1
+                    when media_type=3 and ('CREATE_FAILED' = site_status OR 'AUDIT_REJECTED' = site_status) then -1
+                    else 0 end as run_status,
+               concat(
+                       case when plat_type=7 and ( 'FAIL' = advertiser_status or 'STATUS_CONFIRM_FAIL_END' = advertiser_status) then '账户 '
+                            when plat_type != 7 and media_type=1 and ('FAIL' = advertiser_status or 'STATUS_CONFIRM_FAIL_END' = advertiser_status) then '账户 '
+                            else '' end,
+                       case when plat_type=7 and ( 'AUDIT_REJECT' = avatar_status or 'FAIL' = avatar_status) then '头像 '
+                            when plat_type != 7 and media_type=1 and ('AUDIT_REJECT' = avatar_status or 'FAIL' = avatar_status) then '头像 '
+                            else '' end,
+                       case when plat_type != 7 and media_type=1 and (app_status is null or 'AUDIT_REJECTED' = app_status or 'FAIL' = app_status or 'ADD_LINK_FAIL' = app_status or 'SHARE_FAIL' = app_status) then '小程序 '
+                            else '' end,
+                       case when plat_type != 7 and media_type=1 and (site_status is null or 'AUDIT_REJECTED' = site_status) then '落地页 '
+                            when plat_type != 7 and media_type=3 and ('CREATE_FAILED' = site_status OR 'AUDIT_REJECTED' = site_status) then '落地页 '
+                            else '' end
+               ) as fail_reason, standard_movie_name
+        from (select t1.*, t7.standard_movie_name,
+                     t2.audit_status as 'app_status',
+                     t3.`status` as 'site_status',
+                     t4.avatar_status as 'avatar_status',
+                     t5.advertiser_status as 'advertiser_status',
+                     t6.status as 'link_status',
+                     app.plat_type
+              from (select * from deepthink.bytedance_advertiser_task where create_time &gt;= #{startTime} and create_time &lt;= #{endTime}) t1
+                       left join deepthink.mini_app_info app on t1.app_id = app.app_id
+                       LEFT JOIN (select * from deepthink.advertiser_app_list where create_time &gt;= #{startTime} and create_time &lt;= #{endTime}) t2
+                                 ON t1.instance_id = t2.instance_id AND t1.advertiser_id = t2.advertiser_id and t1.task_id = t2.task_id
+                       LEFT JOIN (select * from deepthink.advertiser_tools_site where create_time &gt;= #{startTime} and create_time &lt;= #{endTime}) t3
+                                 ON t1.site_id = t3.site_id AND t1.advertiser_id = t3.advertiser_id
+                       LEFT JOIN (select * from deepthink.advertiser_avatar where create_time &gt;= #{startTime} and create_time &lt;= #{endTime}) t4
+                                 ON t1.advertiser_id = t4.advertiser_id
+                       LEFT JOIN (select * from deepthink.advertiser_name_info where create_time &gt;= #{startTime} and create_time &lt;= #{endTime}) t5
+                                 ON t1.advertiser_id = t5.advertiser_id
+                       LEFT JOIN (select * from deepthink.bytedance_advertiser_task_link where create_time &gt;= #{startTime} and create_time &lt;= #{endTime}) t6
+                                 ON t1.task_id = t6.task_id AND t1.advertiser_id = t6.advertiser_id
+                       LEFT JOIN (select standard_movie_id, standard_movie_name from deepthink.all_moive group by standard_movie_id, standard_movie_name) t7
+                                 on t1.movie_id = t7.standard_movie_id
+             ) t
+    </update>
 
 
     <select id="refreshList" resultType="com.alibaba.fastjson.JSONObject">

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

@@ -12,4 +12,6 @@ public interface IBytedancePromoteRefreshService {
     List<JSONObject> getRefreshList();
 
     JSONObject refreshLink(JSONObject linkInfo);
+
+    void runAdvertiserTaskStatus(String startTime, String endTime);
 }

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

@@ -201,6 +201,11 @@ public class BytedancePromoteRefreshServiceImpl implements IBytedancePromoteRefr
         return response(0, null);
     }
 
+    @Override
+    public void runAdvertiserTaskStatus(String startTime, String endTime) {
+        promoteLinkRefreshMapper.updateRunStatus(startTime, endTime);
+    }
+
     private JSONObject response(int code, String msg) {
         JSONObject response = new JSONObject();
         response.put("code", code);

+ 55 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/PromoteLinkRefreshJob.java

@@ -3,6 +3,7 @@ package cn.com.ctop.job.bytedance.handler;
 import cn.com.ctop.job.bytedance.data.service.IBytedancePromoteRefreshService;
 
 import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
 import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -11,10 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -78,5 +76,58 @@ public class PromoteLinkRefreshJob {
 //        }
     }
 
+    @XxlJob("runAdvertiserTaskStatus")
+    public void runAdvertiserTaskStatusJob() throws IOException {
+        try {
+            // 生成当前时间三小时前的时间字符串(格式:yyyy-MM-dd HH:mm:ss)
+            java.util.Calendar cal = java.util.Calendar.getInstance();
+            cal.add(java.util.Calendar.HOUR_OF_DAY, -3);
+            String startTime = DateUtils.formatDate(cal.getTime(), "yyyy-MM-dd HH:mm:ss");
+            String endTime = DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
+            log.info("startTime: " + startTime + ", endTime: " + endTime);
 
+            bytedancePromoteRefreshService.runAdvertiserTaskStatus(startTime, endTime);
+        }catch (Exception e){
+            FeishuRobotUtil.sendTextToWebhook("批量开户执行状态更新任务-失败", HOOK_URL);
+        }
+    }
+
+    /**
+     * runAdvertiserTaskStatus任务未正常运行时,恢复历史数据用
+     */
+    public void runHistoryAdvertiserTaskStatus(){
+        //恢复数据
+        // 生成从 2025-04-01 开始的 2 天窗口,直到 2026-01-04(end 不超过 2026-01-04 23:59:59)
+        java.time.LocalDate endLimitDate = java.time.LocalDate.of(2026, 1, 4);
+        java.time.LocalDateTime endLimit = endLimitDate.atTime(23, 59, 59);
+
+        // 初始 start 日
+        java.time.LocalDate current = java.time.LocalDate.of(2025, 4, 1);
+
+        while (true) {
+            java.time.LocalDateTime startDateTime = current.atStartOfDay(); // 当天 00:00:00
+            java.time.LocalDateTime endDateTime = current.plusDays(1).atTime(23, 59, 59); // 下一天 23:59:59
+
+            // 若计算出的 end 超过限制,截断到限制时间
+            if (endDateTime.isAfter(endLimit)) {
+                endDateTime = endLimit;
+            }
+
+            // 将时间格式化为 "yyyy-MM-dd HH:mm:ss"
+            String startTime = startDateTime.format(cn.com.ctop.job.bytedance.data.utils.DateUtils.FORMATTER_DATETIME_SECOND);
+            String endTime = endDateTime.format(cn.com.ctop.job.bytedance.data.utils.DateUtils.FORMATTER_DATETIME_SECOND);
+
+            // 使用 startTime / endTime 做你需要的操作(示例:打印或调用方法)
+            System.out.println("startTime=" + startTime + ", endTime=" + endTime);
+            // 例: cpsReportService.runCPSSettlementDataRange(startTime, endTime);
+
+            // 如果已经到达或超过限制,就退出
+            if (!current.plusDays(1).isBefore(endLimitDate)) { // 若 current+1 >= endLimitDate,说明已达到最后一段
+                break;
+            }
+
+            // 步进 2 天
+            current = current.plusDays(2);
+        }
+    }
 }