Przeglądaj źródła

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

huangpingkang 1 rok temu
rodzic
commit
955086fe1d
22 zmienionych plików z 1023 dodań i 189 usunięć
  1. 31 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java
  2. 5 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/FeishuController.java
  3. 312 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAgentAdvertiserList.java
  4. 9 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/AdminAdvertiserListMapper.java
  5. 15 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/FeishuMapper.java
  6. 70 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/AdminAdvertiserListMapper.xml
  7. 22 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/FeishuMapper.xml
  8. 62 26
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ReportsAdPushMapper.xml
  9. 8 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IAdminAdvertiserListService.java
  10. 0 6
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IDianzhongConfigService.java
  11. 8 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IFeishuService.java
  12. 58 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/AdminAdvertiserListServiceImpl.java
  13. 20 7
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/DateReportsPushServiceImpl.java
  14. 5 125
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/DianzhongConfigServiceImpl.java
  15. 257 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/FeishuServiceImpl.java
  16. 20 7
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsAdPushServiceImpl.java
  17. 18 6
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsByBusinessPushServiceImpl.java
  18. 5 5
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java
  19. 34 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AdminAdvertiserListJob.java
  20. 12 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java
  21. 4 4
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ToolsSiteJob.java
  22. 48 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/utils/FeishuRobotUtil.java

+ 31 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java

@@ -6,11 +6,13 @@ import cn.com.ctop.job.bytedance.data.service.*;
 import cn.com.ctop.job.bytedance.data.utils.Check;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
 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.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
@@ -30,7 +32,7 @@ public class BytedanceController {
     @Autowired
     private IBytedanceProductReportService productReportService;
 
-    private static final ExecutorService dailyRetrExecutorService = Executors.newFixedThreadPool(5);
+    private static final ExecutorService dailyRetrExecutorService = Executors.newFixedThreadPool(3);
 
     @Autowired
     private IAdminAdvertiserListService adminAdvertiserListService;
@@ -54,6 +56,34 @@ public class BytedanceController {
     private IBytedanceMaterialReportService bytedanceMaterialReportService;
 
 
+    @GetMapping("/agentData")
+    public void agentData() {
+        List<JSONObject> adminAdvertiserList = adminAdvertiserListService.getNotAgentAdvertiserList();
+
+        for (JSONObject adminAdvertiserJson : adminAdvertiserList) {
+            Long adminAdvertiserId = adminAdvertiserJson.getLong("adminAdvertiserId");
+            String accessToken = adminAdvertiserJson.getString("accessToken");
+            Long advertiserId = adminAdvertiserJson.getLong("advertiserId");
+            List<Long> ids = new ArrayList<>();
+            ids.add(advertiserId);
+            dailyRetrExecutorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    if (!Check.isNull(accessToken)) {
+                        try {
+                            adminAdvertiserListService.getAgentInfo(adminAdvertiserId, accessToken, ids);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+
+                    }
+                }
+            });
+
+        }
+    }
+
+
     @GetMapping("/accountReport")
     public void getChannel() {
 

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

@@ -40,6 +40,8 @@ public class FeishuController {
     CsjResoureJob csjResoureJob;
     @Autowired
     IDianzhongConfigService dianzhongConfigService;
+    @Autowired
+    IFeishuService feishuService;
 
     @Autowired
     IUserLoginRecordService userLoginRecordService;
@@ -54,13 +56,14 @@ public class FeishuController {
 //        unbindWarnPushService.send();
 //        cutGroupRankPushService.send();
 //        reportsByBusinessPushService.test();
-
+        feishuService.uploadAvatar();
 //        csjResoureJob.csjResourceOssJob();
 //    dianzhongConfigService.pullMovieInfo("2025-08-08", 78012L);
 //        dianzhongConfigService.pullChannelInfo();
 //        dianzhongConfigService.pullMovieInfo(str);
 //        dianzhongConfigService.pullMovie();
-    dianzhongConfigService.syncPromoteLinkInfo();
+//        dianzhongConfigService.movieImageToOss();
+//    dianzhongConfigService.syncPromoteLinkInfo();
     }
 
 

+ 312 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAgentAdvertiserList.java

@@ -0,0 +1,312 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 【请填写功能名称】对象 bytedance_agent_advertiser_list
+ *
+ * @author ruoyi
+ * @date 2025-08-28
+ */
+public class BytedanceAgentAdvertiserList {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 管家账户ID
+     */
+    private Long adminAdvertiserId;
+
+    /**
+     * 广告主公司ID
+     */
+    private Long advCompanyId;
+
+    /**
+     * 广告主公司名称
+     */
+    private String advCompanyName;
+
+    /**
+     * 广告主ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 广告主名称
+     */
+    private String advertiserName;
+
+    /**
+     * 广告主账户状态
+     */
+    private String advertiserStatus;
+
+    /**
+     * 对公认证过期时间
+     */
+    private String authExpireDate;
+
+    /**
+     * 联系人姓名
+     */
+    private String contactName;
+
+    /**
+     * 直客销售名称
+     */
+    private String customerSaleName;
+
+    /**
+     * 一代代理商公司ID
+     */
+    private Long firstAgentCompanyId;
+
+    /**
+     * 一代代理商公司名称
+     */
+    private String firstAgentCompanyName;
+
+    /**
+     * 一级代理商账户ID
+     */
+    private Long firstAgentId;
+    private String firstAgentName;
+
+    /**
+     * 一级行业名称
+     */
+    private String firstIndustryName;
+
+    /**
+     * 二级行业名称
+     */
+    private String secondIndustryName;
+
+    /**
+     * 销售ID
+     */
+    private Long saleId;
+
+    /**
+     * 销售名称
+     */
+    private String saleName;
+
+    /**
+     * 账户报备类型
+     */
+    private String selfOperationTag;
+    private String createTime;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createAt;
+
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateAt;
+
+    public Long getAdminAdvertiserId() {
+        return adminAdvertiserId;
+    }
+
+    public void setAdminAdvertiserId(Long adminAdvertiserId) {
+        this.adminAdvertiserId = adminAdvertiserId;
+    }
+
+    public Long getAdvCompanyId() {
+        return advCompanyId;
+    }
+
+    public void setAdvCompanyId(Long advCompanyId) {
+        this.advCompanyId = advCompanyId;
+    }
+
+    public String getAdvCompanyName() {
+        return advCompanyName;
+    }
+
+    public void setAdvCompanyName(String advCompanyName) {
+        this.advCompanyName = advCompanyName;
+    }
+
+    public Long getAdvertiserId() {
+        return advertiserId;
+    }
+
+    public void setAdvertiserId(Long advertiserId) {
+        this.advertiserId = advertiserId;
+    }
+
+    public String getAdvertiserName() {
+        return advertiserName;
+    }
+
+    public void setAdvertiserName(String advertiserName) {
+        this.advertiserName = advertiserName;
+    }
+
+    public String getAdvertiserStatus() {
+        return advertiserStatus;
+    }
+
+    public void setAdvertiserStatus(String advertiserStatus) {
+        this.advertiserStatus = advertiserStatus;
+    }
+
+    public String getAuthExpireDate() {
+        return authExpireDate;
+    }
+
+    public void setAuthExpireDate(String authExpireDate) {
+        this.authExpireDate = authExpireDate;
+    }
+
+    public String getContactName() {
+        return contactName;
+    }
+
+    public void setContactName(String contactName) {
+        this.contactName = contactName;
+    }
+
+    public String getCustomerSaleName() {
+        return customerSaleName;
+    }
+
+    public void setCustomerSaleName(String customerSaleName) {
+        this.customerSaleName = customerSaleName;
+    }
+
+    public Long getFirstAgentCompanyId() {
+        return firstAgentCompanyId;
+    }
+
+    public void setFirstAgentCompanyId(Long firstAgentCompanyId) {
+        this.firstAgentCompanyId = firstAgentCompanyId;
+    }
+
+    public String getFirstAgentCompanyName() {
+        return firstAgentCompanyName;
+    }
+
+    public void setFirstAgentCompanyName(String firstAgentCompanyName) {
+        this.firstAgentCompanyName = firstAgentCompanyName;
+    }
+
+    public Long getFirstAgentId() {
+        return firstAgentId;
+    }
+
+    public void setFirstAgentId(Long firstAgentId) {
+        this.firstAgentId = firstAgentId;
+    }
+
+    public String getFirstAgentName() {
+        return firstAgentName;
+    }
+
+    public void setFirstAgentName(String firstAgentName) {
+        this.firstAgentName = firstAgentName;
+    }
+
+    public String getFirstIndustryName() {
+        return firstIndustryName;
+    }
+
+    public void setFirstIndustryName(String firstIndustryName) {
+        this.firstIndustryName = firstIndustryName;
+    }
+
+    public String getSecondIndustryName() {
+        return secondIndustryName;
+    }
+
+    public void setSecondIndustryName(String secondIndustryName) {
+        this.secondIndustryName = secondIndustryName;
+    }
+
+    public Long getSaleId() {
+        return saleId;
+    }
+
+    public void setSaleId(Long saleId) {
+        this.saleId = saleId;
+    }
+
+    public String getSaleName() {
+        return saleName;
+    }
+
+    public void setSaleName(String saleName) {
+        this.saleName = saleName;
+    }
+
+    public String getSelfOperationTag() {
+        return selfOperationTag;
+    }
+
+    public void setSelfOperationTag(String selfOperationTag) {
+        this.selfOperationTag = selfOperationTag;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getCreateAt() {
+        return createAt;
+    }
+
+    public void setCreateAt(Date createAt) {
+        this.createAt = createAt;
+    }
+
+    public Date getUpdateAt() {
+        return updateAt;
+    }
+
+    public void setUpdateAt(Date updateAt) {
+        this.updateAt = updateAt;
+    }
+
+    @Override
+    public String toString() {
+        return "BytedanceAgentAdvertiserList{" +
+                "adminAdvertiserId=" + adminAdvertiserId +
+                ", advCompanyId=" + advCompanyId +
+                ", advCompanyName='" + advCompanyName + '\'' +
+                ", advertiserId=" + advertiserId +
+                ", advertiserName='" + advertiserName + '\'' +
+                ", advertiserStatus='" + advertiserStatus + '\'' +
+                ", authExpireDate='" + authExpireDate + '\'' +
+                ", contactName='" + contactName + '\'' +
+                ", customerSaleName='" + customerSaleName + '\'' +
+                ", firstAgentCompanyId=" + firstAgentCompanyId +
+                ", firstAgentCompanyName='" + firstAgentCompanyName + '\'' +
+                ", firstAgentId=" + firstAgentId +
+                ", firstAgentName='" + firstAgentName + '\'' +
+                ", firstIndustryName='" + firstIndustryName + '\'' +
+                ", secondIndustryName='" + secondIndustryName + '\'' +
+                ", saleId=" + saleId +
+                ", saleName='" + saleName + '\'' +
+                ", selfOperationTag='" + selfOperationTag + '\'' +
+                ", createTime='" + createTime + '\'' +
+                ", createAt=" + createAt +
+                ", updateAt=" + updateAt +
+                '}';
+    }
+}

+ 9 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/AdminAdvertiserListMapper.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.job.bytedance.data.mapper;
 
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserList;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAgentAdvertiserList;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import org.apache.ibatis.annotations.Param;
@@ -16,4 +17,12 @@ public interface AdminAdvertiserListMapper {
 
     @DS("selectdb")
     List<JSONObject> getAdvertiserInfosByAdminIds();
+
+    List<Long> getAgentAdvertiserList(@Param("adminAdvertiserId") Long adminAdvertiserId);
+
+    List<JSONObject> getAdminAdvertiserList();
+
+    void addAgentList(@Param("adds") List<BytedanceAgentAdvertiserList> adds);
+
+    List<JSONObject> getNotAgentAdvertiserList();
 }

+ 15 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/FeishuMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface FeishuMapper {
+
+    List<String> getPhoneNumbers();
+
+    int updateAvatar1(@Param("phone") String phonenumber, @Param("avatar") String avatarUrl);
+    int updateAvatar2(@Param("phone") String phonenumber, @Param("avatar") String avatarUrl);
+    int updateAvatar3(@Param("phone") String phonenumber, @Param("avatar") String avatarUrl);
+}

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

@@ -22,6 +22,54 @@
         on duplicate key update
         advertiser_name= VALUES(advertiser_name)
     </insert>
+    <insert id="addAgentList">
+        replace into deepthink.bytedance_agent_advertiser_list(
+        admin_advertiser_id,
+        adv_company_id,
+        adv_company_name,
+        advertiser_id,
+        advertiser_name,
+        advertiser_status,
+        auth_expire_date,
+        contact_name,
+        create_time,
+        customer_sale_name,
+        first_agent_company_id,
+        first_agent_company_name,
+        first_agent_id,
+        first_agent_name,
+        first_industry_name,
+        second_industry_name,
+        sale_id,
+        sale_name,
+        self_operation_tag
+        )
+        values
+        <foreach collection="adds" item="add" separator=",">
+            (
+            #{add.adminAdvertiserId},
+            #{add.advCompanyId},
+            #{add.advCompanyName},
+            #{add.advertiserId},
+            #{add.advertiserName},
+            #{add.advertiserStatus},
+            #{add.authExpireDate},
+            #{add.contactName},
+            #{add.createTime},
+            #{add.customerSaleName},
+            #{add.firstAgentCompanyId},
+            #{add.firstAgentCompanyName},
+            #{add.firstAgentId},
+            #{add.firstAgentName},
+            #{add.firstIndustryName},
+            #{add.secondIndustryName},
+            #{add.saleId},
+            #{add.saleName},
+            #{add.selfOperationTag}
+            )
+        </foreach>
+
+    </insert>
     <update id="batchUpdateAdvertiserName">
         <foreach collection="infos" item="info" separator=";">
             UPDATE deepthink.advertiser_bind_info
@@ -52,4 +100,26 @@
         WHERE t.advertiserId IS NOT NULL
 
     </select>
+    <select id="getAgentAdvertiserList" resultType="java.lang.Long">
+        select t1.advertiser_id
+        from deepthink.bytedance_advertiser_list t1
+                 left join deepthink.bytedance_agent_advertiser_list t2
+                           on t1.advertiser_id = t2.advertiser_id
+
+        where t1.admin_advertiser_id = #{adminAdvertiserId}
+          and t2.advertiser_id is null
+    </select>
+    <select id="getAdminAdvertiserList" resultType="com.alibaba.fastjson.JSONObject">
+        select admin_advertiser_id as 'adminAdvertiserId',access_token as 'accessToken'
+        from deepthink.bytedance_auth_list
+        group by admin_advertiser_id
+    </select>
+    <select id="getNotAgentAdvertiserList" resultType="com.alibaba.fastjson.JSONObject">
+        select t1.advertiser_id as 'advertiserId', t1.admin_advertiser_id as 'adminAdvertiserId', t3.access_token as 'accessToken'
+        from deepthink.bytedance_advertiser_list t1
+                 left join deepthink.bytedance_agent_advertiser_list t2
+                           on t1.advertiser_id = t2.advertiser_id
+                 left join deepthink.bytedance_auth_list t3 on t1.admin_advertiser_id = t3.admin_advertiser_id
+        where t2.advertiser_id is null
+    </select>
 </mapper>

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

@@ -0,0 +1,22 @@
+<?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.FeishuMapper">
+    <update id="updateAvatar1">
+        update deepthink.sys_user set avatar = #{avatar} where phonenumber = #{phone}
+    </update>
+    <update id="updateAvatar2">
+        update thirtpart.ly_admin set profile_photo = #{avatar} where phone = #{phone}
+    </update>
+    <update id="updateAvatar3">
+        update thirtpart.ly_responsibility_person set profile_photo = #{avatar} where phone = #{phone}
+    </update>
+
+
+    <select id="getPhoneNumbers" resultType="java.lang.String">
+        select phonenumber from deepthink.sys_user where phonenumber is not null and phonenumber != ''
+        union all
+        select phone from thirtpart.ly_admin where phone is not null and phone != ''
+        union all
+        select phone from thirtpart.ly_responsibility_person where phone is not null and phone != ''
+    </select>
+</mapper>

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

@@ -93,7 +93,7 @@
         ) tb2
     </select>
     <select id="tmpTopMovie" resultType="java.util.Map">
-        select tb4.standard_movie_name as movie_name,
+        select tb4.standard_movie_name as movie_name, tb4.movie_project_source, tb5.dict_name as movie_project_source_name,
         group_concat(distinct case tb4.movie_source when 2 then '2' else '1' end) as movie_source,
         rank() over (order by sum(iaa_amount)+sum(pay_amount) desc) as rk,
         <include refid="endAmount"/>,
@@ -131,12 +131,15 @@
         group by movie_id
         ) tb3 on tb1.product_id=tb3.movie_id
         left join
-        (select moive_id, standard_movie_id, standard_movie_name, movie_source from tidb.deepthink.all_moive
+        (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
+        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'
-        group by tb4.standard_movie_name
+        group by tb4.standard_movie_name, tb4.movie_project_source, tb5.dict_name
         order by sum(iaa_amount)+sum(pay_amount) desc
-        limit 10
+        limit 20
     </select>
 
     <select id="adDailyData" resultType="java.util.Map">
@@ -164,7 +167,7 @@
 
     <select id="todayTopMovie" resultType="com.alibaba.fastjson.JSONObject" >
         select
-        tb4.standard_movie_name as movie_name,
+        tb4.standard_movie_name as movie_name, tb4.movie_project_source, tb6.dict_name as movie_project_source_name,
         group_concat(distinct case tb4.movie_source when 2 then '2' else '1' end) as movie_source,
         <include refid="endAmount"/>,
         <include refid="waterEndAmount"/>,
@@ -201,21 +204,24 @@
         group by movie_id
         ) tb3 on tb1.product_id=tb3.movie_id
         left join
-        (select moive_id, standard_movie_id, standard_movie_name, movie_source from tidb.deepthink.all_moive
+        (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
         left join
         (select product_id, ifnull(sum(cost_amount), 0) as hour_cost_amount from application.media_product_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
+        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'
-        group by tb4.standard_movie_name
+        group by tb4.standard_movie_name, tb4.movie_project_source, tb6.dict_name
         order by end_amount desc
-        limit 10
+        limit 20
     </select>
 
 
     <select id="optimizerCostRank" resultType="java.util.Map">
-        select tb1.user_id, tb4.phonenumber, tb4.nick_name, tb4.dept_id, tb5.dept_name,
+        select tb1.user_id, tb4.phonenumber, tb4.nick_name, tb5.dept_id, tb5.dept_name,
         rank() over (order by sum(cost_amount) desc) as rk,
         <include refid="costAmount"/>,
         <include refid="iaaRoi"/>,
@@ -247,14 +253,20 @@
         on tb1.advertiser_id = tb3.advertiser_id
         left join (select user_id, nick_name, phonenumber, dept_id from tidb.deepthink.sys_user) tb4
         on tb1.user_id=tb4.user_id
-        left join (select dept_id, dept_name from tidb.deepthink.sys_dept) tb5
-        on tb4.dept_id = tb5.dept_id
-        group by tb1.user_id, tb4.phonenumber, tb4.nick_name, tb4.dept_id, tb5.dept_name
+        left join (
+            select dp.dept_id, dp.dept_name, ifnull(subdp.dept_id, dp.dept_id) as sub_dept_id, ifnull(subdp.dept_name, dp.dept_name) as sub_dept_name from (select * from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)) dp
+            right join tidb.deepthink.sys_dept subdp on dp.dept_id=subdp.parent_id
+            where dp.dept_id is not null
+            union all
+            select dept_id, dept_name, dept_id as sub_dept_id, dept_name as sub_dept_name from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)
+        ) tb5
+        on tb4.dept_id = tb5.sub_dept_id
+        group by tb1.user_id, tb4.phonenumber, tb4.nick_name, tb5.dept_id, tb5.dept_name
         having sum(cost_amount)>1
         order by rk asc
     </select>
     <select id="optimizerDateData" resultType="java.util.Map">
-        select tb1.user_id,tb4.phonenumber,tb4.nick_name, tb4.dept_id,
+        select tb1.user_id,tb4.phonenumber,tb4.nick_name, tb5.dept_id,
         <include refid="costAmount"/>,
         <include refid="iaaAmount"/>,
         <include refid="payAmount"/>,
@@ -275,7 +287,15 @@
         group by advertiser_id) tb3 on tb1.advertiser_id = tb3.advertiser_id
         left join (select user_id, nick_name, phonenumber, dept_id from tidb.deepthink.sys_user) tb4
         on tb1.user_id=tb4.user_id
-        group by tb1.user_id, tb4.phonenumber, tb4.nick_name, tb4.dept_id
+        left join (
+        select dp.dept_id, dp.dept_name, ifnull(subdp.dept_id, dp.dept_id) as sub_dept_id, ifnull(subdp.dept_name, dp.dept_name) as sub_dept_name from (select * from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)) dp
+        right join tidb.deepthink.sys_dept subdp on dp.dept_id=subdp.parent_id
+        where dp.dept_id is not null
+        union all
+        select dept_id, dept_name, dept_id as sub_dept_id, dept_name as sub_dept_name from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)
+        ) tb5
+        on tb4.dept_id = tb5.sub_dept_id
+        group by tb1.user_id, tb4.phonenumber, tb4.nick_name, tb5.dept_id
         having sum(cost_amount)>0
     </select>
     <select id="optimizerHourData" resultType="java.util.Map">
@@ -305,7 +325,7 @@
 
 
     <select id="deptCostRank" resultType="java.util.Map">
-        select tb4.dept_id, tb5.dept_name,
+        select tb5.dept_id, tb5.dept_name,
         rank() over (order by sum(cost_amount) desc) as rk,
         <include refid="costAmount"/>,
         ifnull(sum(cost_amount_hour), 0) as cost_amount_hour
@@ -321,9 +341,15 @@
         on tb1.advertiser_id = tb3.advertiser_id
         left join (select user_id, nick_name, phonenumber, dept_id from tidb.deepthink.sys_user) tb4
         on tb1.user_id=tb4.user_id
-        left join (select dept_id, dept_name from tidb.deepthink.sys_dept) tb5
-        on tb4.dept_id = tb5.dept_id
-        group by tb4.dept_id, tb5.dept_name
+        left join (
+        select dp.dept_id, dp.dept_name, ifnull(subdp.dept_id, dp.dept_id) as sub_dept_id, ifnull(subdp.dept_name, dp.dept_name) as sub_dept_name from (select * from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)) dp
+        right join tidb.deepthink.sys_dept subdp on dp.dept_id=subdp.parent_id
+        where dp.dept_id is not null
+        union all
+        select dept_id, dept_name, dept_id as sub_dept_id, dept_name as sub_dept_name from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)
+        ) tb5
+        on tb4.dept_id = tb5.sub_dept_id
+        group by tb5.dept_id, tb5.dept_name
         having sum(cost_amount)>1
         order by rk asc
         limit 10
@@ -393,7 +419,7 @@
         order by tb2.user_id
     </select>
     <select id="deptRank2" resultType="java.util.Map">
-        select tb4.dept_id, tb5.dept_name,
+        select tb5.dept_id, tb5.dept_name,
         rank() over (order by sum(cost_amount) desc) as rk,
         <include refid="costAmount"/>,
         <include refid="iaaRoi"/>,
@@ -425,9 +451,15 @@
         on tb1.advertiser_id = tb3.advertiser_id
         left join (select user_id, nick_name, phonenumber, dept_id from tidb.deepthink.sys_user) tb4
         on tb1.user_id=tb4.user_id
-        left join (select dept_id, dept_name from tidb.deepthink.sys_dept) tb5
-        on tb4.dept_id = tb5.dept_id
-        group by tb4.dept_id, tb5.dept_name
+        left join (
+            select dp.dept_id, dp.dept_name, ifnull(subdp.dept_id, dp.dept_id) as sub_dept_id, ifnull(subdp.dept_name, dp.dept_name) as sub_dept_name from (select * from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)) dp
+            right join tidb.deepthink.sys_dept subdp on dp.dept_id=subdp.parent_id
+            where dp.dept_id is not null
+            union all
+            select dept_id, dept_name, dept_id as sub_dept_id, dept_name as sub_dept_name from tidb.deepthink.sys_dept where parent_id in (select dept_id from tidb.deepthink.sys_dept where parent_id=300)
+        ) tb5
+        on tb4.dept_id = tb5.sub_dept_id
+        group by tb5.dept_id, tb5.dept_name
         having sum(cost_amount)>1
         order by rk
     </select>
@@ -484,7 +516,8 @@
         ) tb2
     </select>
     <select id="allBusinessTopMovie" resultType="java.util.Map">
-        select tb4.standard_movie_name as movie_name, group_concat(distinct case tb4.movie_source when 2 then '2' else '1' end) as movie_source,
+        select tb4.standard_movie_name as movie_name, tb4.movie_project_source, tb5.dict_name as movie_project_source_name,
+        group_concat(distinct case tb4.movie_source when 2 then '2' else '1' end) as movie_source,
         rank() over (order by sum(share_iaa_amount)+sum(share_pay_amount) desc) as rk,
         <include refid="endAmount"/>,
         <include refid="costAmount"/>
@@ -507,12 +540,15 @@
         group by movie_id
         ) tb3 on tb1.product_id=tb3.movie_id
         left join
-        (select moive_id, standard_movie_id, standard_movie_name, movie_source from tidb.deepthink.all_moive
+        (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
+        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'
-        group by tb4.standard_movie_name
+        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 10
+        limit 20
     </select>
     <select id="businessTypeData" resultType="com.alibaba.fastjson.JSONObject">
         select

+ 8 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IAdminAdvertiserListService.java

@@ -14,4 +14,12 @@ public interface IAdminAdvertiserListService {
     void batchUpdateAdvertiserName(List<JSONObject> infos);
 
     List<JSONObject> getAdvertiserInfosByAdminIds();
+
+    List<Long> getAgentAdvertiserList(Long adminAdvertiserId);
+
+    List<JSONObject> getAdminAdvertiserList();
+
+    void getAgentInfo(Long adminAdvertiserId, String accessToken, List<Long> longs) throws InterruptedException;
+
+    List<JSONObject> getNotAgentAdvertiserList();
 }

+ 0 - 6
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IDianzhongConfigService.java

@@ -4,16 +4,10 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 
 public interface IDianzhongConfigService {
-    /**
-     * 同步剧目信息
-     */
-    void pullMovieInfo(String str) throws IOException;
 
     void pullChannelInfo();
 
     void pullMovie() throws IOException;
 
     void syncPromoteLinkInfo();
-
-    void movieImageToOss();
 }

+ 8 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IFeishuService.java

@@ -0,0 +1,8 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import java.io.IOException;
+
+public interface IFeishuService {
+
+    void uploadAvatar() throws IOException;
+}

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

@@ -1,6 +1,7 @@
 package cn.com.ctop.job.bytedance.data.service.impl;
 
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserList;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAgentAdvertiserList;
 import cn.com.ctop.job.bytedance.data.mapper.AdminAdvertiserListMapper;
 import cn.com.ctop.job.bytedance.data.service.IAdminAdvertiserListService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
@@ -118,6 +119,63 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         return adminAdvertiserListMapper.getAdvertiserInfosByAdminIds();
     }
 
+    @Override
+    public List<Long> getAgentAdvertiserList(Long adminAdvertiserId) {
+        return adminAdvertiserListMapper.getAgentAdvertiserList(adminAdvertiserId);
+    }
+
+    @Override
+    public List<JSONObject> getAdminAdvertiserList() {
+        return adminAdvertiserListMapper.getAdminAdvertiserList();
+    }
+
+    @Override
+    public void getAgentInfo(Long adminAdvertiserId, String accessToken, List<Long> longs) throws InterruptedException {
+        Thread.sleep(300L);
+        String url = "https://api.oceanengine.com/open_api/2/agent/advertiser_info/query/";
+        Map<String, Object> paramsMap = new HashMap<>();
+        paramsMap.put("account_ids", longs);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", accessToken);
+        headers.put("Content-Type", "application/json");
+
+        String s = HttpUtils.httpGet(url, paramsMap, headers);
+        JSONObject jsonObject = JSONObject.parseObject(s);
+
+        List<BytedanceAgentAdvertiserList> adds = new ArrayList<>();
+        if (!Check.isNull(jsonObject)) {
+            Integer code = jsonObject.getInteger("code");
+            if (code == 0) {
+                JSONObject data = jsonObject.getJSONObject("data");
+                if (!Check.isNull(data)) {
+                    JSONArray accountDetailList = data.getJSONArray("account_detail_list");
+                    if (!Check.isNull(accountDetailList)) {
+                        for (int i = 0; i < accountDetailList.size(); i++) {
+                            JSONObject accountDetail = accountDetailList.getJSONObject(i);
+                            BytedanceAgentAdvertiserList javaObject = JSONObject.toJavaObject(accountDetail, BytedanceAgentAdvertiserList.class);
+                            javaObject.setAdminAdvertiserId(adminAdvertiserId);
+                            adds.add(javaObject);
+                        }
+
+                    }
+                }
+            } else {
+                log.error("获取代理商接口失败,account_ids:{},返回信息:{}", longs, jsonObject);
+            }
+
+        }
+        if (!Check.isNull(adds)) {
+            adminAdvertiserListMapper.addAgentList(adds);
+        }
+
+
+    }
+
+    @Override
+    public List<JSONObject> getNotAgentAdvertiserList() {
+        return adminAdvertiserListMapper.getNotAgentAdvertiserList();
+    }
+
     // 分页结果包装类
     static class PageResult {
         private final int pageNumber;

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

@@ -7,6 +7,7 @@ import cn.com.ctop.job.bytedance.data.utils.DateUtils;
 import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.ImmutableMap;
 import javafx.util.Pair;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpEntity;
@@ -33,7 +34,7 @@ public class DateReportsPushServiceImpl implements IDateReportsPushService {
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
-    private static final String TEMPLATE_VERSION = "1.0.13";
+    private static final String TEMPLATE_VERSION = "1.0.17";
     private static final String TEMPLATE_ID = "AAqRhJzMBoO0E";
 
     /**
@@ -168,17 +169,29 @@ public class DateReportsPushServiceImpl implements IDateReportsPushService {
         JSONArray movieRankTable = new JSONArray();
         for (Map<String, String> movie : movieData){
             JSONObject obj = new JSONObject();
-            String movieSource = String.valueOf(movie.get("movie_source"));
+
             String movieName = String.valueOf(movie.get("movie_name"));
-            if (!Check.isNull(movieSource) && movieSource.contains("1")){
-                obj.put("movieNameColor", "blue");
+//            String movieSource = String.valueOf(movie.get("movie_source"));
+//            if (!Check.isNull(movieSource) && movieSource.contains("1")){
+//                obj.put("movieNameColor", "blue");
+//            }else {
+//                obj.put("movieNameColor", "grey");
+//            }
+            String movieProjectSource = String.valueOf(movie.get("movie_project_source"));
+            String movieProjectSourceName = String.valueOf(movie.get("movie_project_source_name"));
+            JSONArray ms = new JSONArray();
+            if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("1")){
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "grey"));
+            }else if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("2")){
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "green"));
             }else {
-                obj.put("movieNameColor", "grey");
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "blue"));
             }
+            obj.put("movieProjectSource", ms);
             obj.put("rank", String.valueOf(movie.get("rk")));
             obj.put("movieName", movieName);
             obj.put("endAmount", String.valueOf(movie.get("end_amount")));
-            obj.put("realROI", String.valueOf(movie.get("real_roi")));
+//            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")));
             movieRankTable.add(obj);
@@ -202,7 +215,7 @@ public class DateReportsPushServiceImpl implements IDateReportsPushService {
         template_variable.put("todayDate", today);
         template_variable.put("lastDayDate", lastDay);
         template_variable.put("dateIndicatorTable", dateIndicatorTable);
-        template_variable.put("movieRankTable", movieRankTable);
+        template_variable.put("table_raw_array_2", movieRankTable);
         template_variable.put("deptRank", deptRank);
         template_variable.put("description", description);
 

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

@@ -84,13 +84,8 @@ public class DianzhongConfigServiceImpl implements IDianzhongConfigService {
 
     @Override
     public void pullMovie() throws IOException {
-        pullMoviePage(0, 100);
-    }
-
-    @Override
-    public void syncPromoteLinkInfo() {
         try {
-            String url = "https://api.deepthink.artlinkworld.cn/dianzhong/syncAll";
+            String url = "https://api.deepthink.artlinkworld.cn/dianzhong/syncMovie";
             String s = HttpUtils.httpPostRequest(url, null, null);
         }catch (Exception ignored){
 
@@ -98,132 +93,17 @@ public class DianzhongConfigServiceImpl implements IDianzhongConfigService {
     }
 
     @Override
-    public void movieImageToOss() {
-        List<DianzhongMovieConfig> movieConfigs = dianzhongConfigMapper.toUploadImageList();
-        for (DianzhongMovieConfig config : movieConfigs) {
-            String coverImgUrl = config.getCoverImgUrl();
-            if (StringUtils.isEmpty(coverImgUrl) || StringUtils.isEmpty(config.getMovieId())){
-                continue;
-            }
-            String ossUrl = toOssUrl(coverImgUrl);
-            if (StringUtils.isEmpty(ossUrl) || Objects.equals(ossUrl, coverImgUrl)){
-                continue;
-            }
-            config.setCoverImgUrl(ossUrl);
-            log.info("点众剧目封面图片上传OSS成功,movieId: {}, url: {}", config.getMovieId(), ossUrl);
-            dianzhongConfigMapper.updateMovieImage(config);
-        }
-    }
-
-    private void pullMoviePage(int offset, int limit) throws IOException {
-        log.info("拉取: 点众剧目,offset: {}, limit: {}", offset, limit);
-        String url = "https://vip.wqxsw.com/admin/referral/book/index?sort=idx&order=desc&offset="+offset+"&limit="+limit+"&filter=%7B%7D&op=%7B%7D&_="+System.currentTimeMillis();
-        //免费付费剧目ID相同,拉一次就可以
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Cookie", "PHPSESSID=rugckd38052ap4nolfddg8hqb0; keeplogin=29581%7C604800%7C1756117312%7Cb3589600a14a145812da60e005c31943");
-        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
-        headers.put("Accept", "application/json, text/javascript, */*; q=0.01");
-        headers.put("x-requested-with", "XMLHttpRequest");
-        headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0");
-            String res = HttpUtils.httpGet(url, null, headers);
-            if (StringUtils.isNotEmpty(res)){
-                pullMovieInfo(res);
-                if (offset < 200){ //每次只拉最近300个
-                    pullMoviePage(offset+limit, limit);
-                }
-            }
-    }
-
-
-    @Override
-    public void pullMovieInfo(String str) throws IOException {
-        JSONObject res = JSON.parseObject(str);
-        JSONArray rows = res.getJSONArray("rows");
-        if (rows==null || rows.isEmpty()){
-            return;
-        }
-        List<String> movieIds = dianzhongConfigMapper.getAllMovieIds();
-        for (int i = 0; i < rows.size(); i++) {
-            JSONObject minfo = rows.getJSONObject(i);
-            String movieId = minfo.getString("bookId");
-            if (movieIds.contains(movieId)){ //已经录入过的 跳过
-                continue;
-            }
-            DianzhongMovieConfig config = new DianzhongMovieConfig();
-            config.setMovieId(movieId);
-            config.setMovieName(minfo.getString("bookName"));
-            config.setCoverImgUrl(toOssUrl(minfo.getString("coverCutWap")));
-            config.setChapterCount(minfo.getInteger("totalChapterNum"));
-            config.setFreeChapterCount(minfo.getInteger("freeChapterNum"));
-            config.setType1(minfo.getString("bookTypeOne"));
-            config.setType2(minfo.getString("bookTypeTwo"));
-            config.setType3(minfo.getString("bookTypeThree"));
-            config.setFirstShelfTime(minfo.getString("firstShelfTime"));
-            config.setInfoJson(minfo.toJSONString());
-
-            dianzhongConfigMapper.insertConfigSelective(config);
-            movieIds.add(movieId);
-        }
-    }
-
-    private String toOssUrl(String fileUrl){
+    public void syncPromoteLinkInfo() {
         try {
-            String url = "https://api.deepthink.artlinkworld.cn/ossUp/uploadFileByUrl";
-            Map<String, Object> paramsMap = new HashMap<>();
-            paramsMap.put("url", fileUrl);
-            String s = HttpUtils.httpGet(url, paramsMap, null);
-            if (StringUtils.isEmpty(s)){
-                log.error("点众封面图片上传OSS失败,url: {}", fileUrl);
-                return fileUrl;
-            }
-            JSONObject res = JSON.parseObject(s);
-            if (res.getInteger("code") != 200 && res.getInteger("code")!= 0){
-                log.error("点众封面图片上传OSS失败,url: {}, msg: {}", fileUrl, res.getString("msg"));
-                return fileUrl;
-            }
-            return res.getString("result");
+            String url = "https://api.deepthink.artlinkworld.cn/dianzhong/syncAll";
+            String s = HttpUtils.httpPostRequest(url, null, null);
         }catch (Exception ignored){
-            return fileUrl;
+
         }
     }
 
 
 
-    private void tt() throws Exception {
-        String loginUrl = "https://vip.wqxsw.com/admin/index/login?url=%2Fadmin%2Findex%2Findex";
-        //免费付费剧目ID相同,拉一次就可以
-        HttpPost httpPost = new HttpPost(loginUrl);
-        //PHPSESSID=a2t3dp59hn92sjm0a7spe82b2s; keeplogin=29581%7C604800%7C1755853777%7Cea024be2fbc5c0604c25514f216e178f
-        httpPost.setHeader("Cookie", "PHPSESSID=n3620u5ck12dplrbqfmvslegt2");
-        httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
-        httpPost.setHeader("Accept", "application/json, text/javascript, */*; q=0.01");
-        httpPost.setHeader("x-requested-with", "XMLHttpRequest");
-        List<NameValuePair> params = new ArrayList<>();
-        params.add(new BasicNameValuePair("username", "tjxldyvip1"));
-        params.add(new BasicNameValuePair("password", "Aa112233"));
-        params.add(new BasicNameValuePair("keeplogin", "1"));
-        HttpEntity httpEntity = new UrlEncodedFormEntity(params);
-        httpPost.setEntity(httpEntity);
-
-        HttpClient httpclient = HttpUtils.getHttpclient();
-        HttpResponse response = httpclient.execute(httpPost);
-        int statusCode = response.getStatusLine().getStatusCode();
-        if (statusCode != 200) {
-            log.error("点众登录失败,状态码: {}", statusCode);
-            return;
-        }
-        Header[] headers = response.getHeaders("Set-Cookie");
-        //获取其中的keeplogin
-        String cookie = null;
-        for (Header header : headers) {
-            String value = header.getValue();
-            if (value.contains("keeplogin")) {
-                cookie = value;
-                break;
-            }
-        }
-    }
-
 
 
 

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

@@ -0,0 +1,257 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.mapper.FeishuMapper;
+import cn.com.ctop.job.bytedance.data.service.IFeishuService;
+import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
+import cn.com.ctop.job.bytedance.utils.OssProperties;
+import cn.com.ctop.job.bytedance.utils.OssUtil;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class FeishuServiceImpl implements IFeishuService {
+
+    @Autowired
+    OssUtil ossUtil;
+    @Autowired
+    OssProperties ossProperties;
+    @Autowired
+    FeishuMapper feishuMapper;
+    FeishuRobotUtil feishuRobotUtil;
+
+
+    /*
+    电话号码-飞书用户id-头像-oss头像链接
+    ossPath: feishuAvatar/
+    ossName: {phonenumber}.jpg
+    拼接为oss链接 分别存储在sys_user, ly_admin, ly_responsibility_person
+     */
+    public void uploadAvatar() throws IOException {
+        //从三个表里取电话号码
+        List<String> phones = feishuMapper.getPhoneNumbers();
+        //根据电话号码取飞书用户id和头像
+        String token = FeishuRobotUtil.getFsZtTenantToken();
+        Map<String, String> phoneUserId = FeishuRobotUtil.getFsUserIds(token, phones);
+        Map<String, String> userIdPhone = phoneUserId.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey, (v1, v2) -> v1));
+        List<String> userIds = phoneUserId.values().stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        Map<String, JSONObject> userInfoMap = FeishuRobotUtil.batchGetUserInfo(token, userIds);
+
+        for (String userId : userIds){
+            JSONObject info = userInfoMap.get(userId);
+            String phone = userIdPhone.get(userId);
+            if (info == null){
+                continue;
+            }
+            JSONObject avatar = info.getJSONObject("avatar");
+            String avatar240Url = avatar.getString("avatar_240");
+            //上传头像到oss
+            String fileName = userId+".jpg";
+            String url = uploadToOss(avatar240Url, fileName);
+            if (url == null){
+                log.error("上传头像失败, userId: "+userId+", phone: "+phone);
+                continue;
+            }
+            //更新三个表的头像oss链接
+            String ossPath = url;
+            String ossUrl = ossProperties.getCsjDomain() + ossPath;
+
+            System.out.println("userId: "+userId+", ossUrl: "+ossUrl);
+
+//            feishuMapper.updateAvatar1(phone, ossUrl);
+            feishuMapper.updateAvatar2(phone, ossUrl);
+            feishuMapper.updateAvatar3(phone, ossUrl);
+        }
+
+    }
+
+
+
+
+    private String uploadToOss(String url, String fileName){
+        String objectKey = "feishu/avatar/" + fileName;
+        try {
+            System.out.println("文件: "+fileName + ", from: " + url);
+            ossUtil.uploadFromUrl(objectKey, url);
+            log.info("上传成功: " + objectKey);
+            return objectKey;
+        } catch (Exception e) {
+            log.error("上传失败: " + e.getMessage(), e);
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+
+        String[] s1 = s.split("\n");
+        for (String s2 : s1) {
+            String[] s3 = s2.split("\t");
+            String name = s3[0];
+            String phone = s3[1].replace("+86", "");
+//            String sql = "update thirtpart.ly_responsibility_person set phone='"+phone+"' where (phone is null or phone = '') and name = '"+name+"';";
+            String sql = "update thirtpart.ly_admin set phone='"+phone+"' where (phone is null or phone = '') and name = '"+name+"';";
+            System.out.println(sql);
+        }
+    }
+
+    public static final String s = "马玲\t18145044665\n" +
+            "王建宁\t13718876769\n" +
+            "钱佳伊\t15801252586\n" +
+            "赵枳程\t15601231113\n" +
+            "胡正康\t13260852137\n" +
+            "孙博\t18618376179\n" +
+            "刘思敏\t19520087962\n" +
+            "栾家峰\t18612878117\n" +
+            "杨家丰\t13810483501\n" +
+            "金虎哲\t15011428926\n" +
+            "任东\t17611198869\n" +
+            "张韦\t18600831511\n" +
+            "张雯\t15801310402\n" +
+            "于洋\t15810643158\n" +
+            "王舒\t18513680330\n" +
+            "李亮\t18734678338\n" +
+            "安高奇\t13121136226\n" +
+            "黄平康\t18640301560\n" +
+            "赵彤鑫\t15110062501\n" +
+            "许圣琪\t13052877377\n" +
+            "武超\t18515555712\n" +
+            "赵西安\t15510197549\n" +
+            "李宁\t13264077236\n" +
+            "任宇鹏\t15011435553\n" +
+            "贺立强\t18533203386\n" +
+            "于蒙\t15611695226\n" +
+            "胡晓俞\t15544803608\n" +
+            "赵子淼\t13040310068\n" +
+            "杨宗霖\t17611102020\n" +
+            "刘峰\t18062736618\n" +
+            "郭昶\t13722875115\n" +
+            "张洺滈\t15841381153\n" +
+            "赵世佳\t13501271209\n" +
+            "葛涛\t15157189122\n" +
+            "陈玲\t18759876639\n" +
+            "陶梦茹\t19155507268\n" +
+            "杨莎莎\t18852018037\n" +
+            "蒋嘉毅\t18012940131\n" +
+            "冯晨晨\t17384433521\n" +
+            "王春燕\t15155674035\n" +
+            "沈晓娜\t17310795053\n" +
+            "张馨予\t18684153114\n" +
+            "王玉玉\t17801127515\n" +
+            "丁洁\t15339986105\n" +
+            "蓝宜琛\t18892686218\n" +
+            "汤睿涵\t13520520058\n" +
+            "叶美怡\t18318339538\n" +
+            "冯金懿\t17611486863\n" +
+            "唐玥\t17326031406\n" +
+            "廉宏磊\t15601170707\n" +
+            "隆玮琦\t18519745840\n" +
+            "郭东来\t17600800810\n" +
+            "刘柏泽\t15561868553\n" +
+            "祝圣航\t19850422714\n" +
+            "闻博\t18909474827\n" +
+            "董兵雨\t18298159075\n" +
+            "杨晓磊\t18901224561\n" +
+            "陈思琪\t18651887447\n" +
+            "李思雨\t17808273888\n" +
+            "康飞飞\t17610801133\n" +
+            "陈佳意\t13916766029\n" +
+            "杨佳\t18710735504\n" +
+            "王圣瑜\t13204076867\n" +
+            "席晓丹\t18519356022\n" +
+            "刘思彤\t19562219208\n" +
+            "岳淑慧\t15901502680\n" +
+            "任雪莹\t19932670047\n" +
+            "余洋\t18851137676\n" +
+            "朱宇静\t15180042624\n" +
+            "周友涛\t18852095505\n" +
+            "王烁然\t15663307215\n" +
+            "朱胜龙\t15855961836\n" +
+            "宋欣璐\t15643952579\n" +
+            "唐东明\t19551817275\n" +
+            "陈雨露\t13851725710\n" +
+            "戴阳\t18260066836\n" +
+            "张雅倩\t15703825517\n" +
+            "何梦豪\t15056329515\n" +
+            "张凯雯\t13321459366\n" +
+            "毛君\t18655362672\n" +
+            "孔雨婷\t18351101822\n" +
+            "章明\t17315099711\n" +
+            "靳丁敏\t15513003950\n" +
+            "刘青\t19155354441\n" +
+            "葛磊\t13813234249\n" +
+            "杨煜轩\t17602543482\n" +
+            "刘舒琪\t18361530973\n" +
+            "郑曦\t17630310601\n" +
+            "宋婷\t17314133931\n" +
+            "鞠智铭\t15251887302\n" +
+            "何露雪\t17312306192\n" +
+            "楼子君\t19539901510\n" +
+            "董俊豪\t17538390824\n" +
+            "朱敏\t17879020865\n" +
+            "宗心悦\t18136838690\n" +
+            "周彤\t17352409890\n" +
+            "王俊\t18537458195\n" +
+            "骆思琪\t15250820552\n" +
+            "韩浩宇\t13470792981\n" +
+            "王自宏\t18325522259\n" +
+            "续明博\t18804537866\n" +
+            "莫汇英\t15676289201\n" +
+            "朱康杰\t18792151759\n" +
+            "吴思璇\t13142993638\n" +
+            "徐泽文\t18601547309\n" +
+            "高瑞\t18839620432\n" +
+            "黄楷馨\t17730150686\n" +
+            "顾娜\t18552231120\n" +
+            "庄妍\t15205161268\n" +
+            "杨鑫\t18646418170\n" +
+            "张雨珊\t17703281898\n" +
+            "李想\t15189835867\n" +
+            "韦楚同\t15578918553\n" +
+            "马帅豪\t13673848676\n" +
+            "李一鸣\t18951990712\n" +
+            "王心语\t17365305808\n" +
+            "包珊珊\t15380941833\n" +
+            "张悦\t19804872392\n" +
+            "刘玥\t18061671282\n" +
+            "孙耀赟\t15371042110\n" +
+            "刘衍昱\t15344274064\n" +
+            "李雨婷\t13016987885\n" +
+            "金桐\t18652671227\n" +
+            "强梦琴\t18255302095\n" +
+            "杨杰\t18255807384\n" +
+            "仲硕硕\t17206162976\n" +
+            "汪燕\t15806256629\n" +
+            "滕龙\t17543763466\n" +
+            "范丽霖\t19156737841\n" +
+            "贾纽约\t17397141992\n" +
+            "雷晓敏\t15367356747\n" +
+            "郑子硕\t13083003533\n" +
+            "王雪婷\t15867845856\n" +
+            "梅立雪\t15312826900\n" +
+            "王费琴\t19967515231\n" +
+            "刘恩麟\t17623814254\n" +
+            "周婧\t15357340060\n" +
+            "钱皇豆\t17355745996\n" +
+            "唐晓姣\t18661246593\n" +
+            "叶娴\t15655688786\n" +
+            "方晓\t18755007520\n" +
+            "吴雁玲\t18752056147\n" +
+            "杨诚\t13914690448\n" +
+            "程丽彤\t13263319362\n" +
+            "赵桓宇\t13039272034\n" +
+            "安珏佳\t15810255852\n" +
+            "余星怡\t18735616226\n" +
+            "姜燚佳\t13954106358\n" +
+            "郝永峰\t17370233721\n" +
+            "张啸枫\t18612227794\n" +
+            "苏晨欢\t13301269557";
+
+}

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

@@ -2,10 +2,12 @@ package cn.com.ctop.job.bytedance.data.service.impl;
 
 import cn.com.ctop.job.bytedance.data.mapper.ReportsAdPushMapper;
 import cn.com.ctop.job.bytedance.data.service.IReportsAdPushService;
+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.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.ImmutableMap;
 import javafx.util.Pair;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpEntity;
@@ -30,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.13";
+    public static final String TEMPLATE_VERSION = "1.0.15";
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
@@ -117,19 +119,30 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
         List<JSONObject> topMovies = reportsPushMapper.todayTopMovie(todayLong, String.valueOf(lastHour));
         JSONArray object_list_2 = new JSONArray();
         for (JSONObject m : topMovies){
-            int movieSource = m.getIntValue("movie_source");
-            String movieNameColor = movieSource==2?"grey":"blue";
+//            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("movieEndAmount", m.get("water_end_amount"));
-            obj.put("movieRealRoi", m.get("real_roi"));
+//            obj.put("movieNameColor", movieNameColor);
+            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"));
+            String movieProjectSource = String.valueOf(m.get("movie_project_source"));
+            String movieProjectSourceName = String.valueOf(m.get("movie_project_source_name"));
+            JSONArray ms = new JSONArray();
+            if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("1")){
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "grey"));
+            }else if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("2")){
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "green"));
+            }else {
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "blue"));
+            }
+            obj.put("movieProjectSource", ms);
             object_list_2.add(obj);
         }
-        template_variables.put("object_list_2", object_list_2);
+        template_variables.put("table_raw_array_1", object_list_2);
 
         String token;
         try {

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

@@ -7,6 +7,7 @@ import cn.com.ctop.job.bytedance.data.utils.DateUtils;
 import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.ImmutableMap;
 import javafx.util.Pair;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpEntity;
@@ -35,7 +36,7 @@ public class ReportsByBusinessPushServiceImpl implements IReportsByBusinessPushS
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
-    private static final String TEMPLATE_VERSION = "1.0.3";
+    private static final String TEMPLATE_VERSION = "1.0.6";
     private static final String TEMPLATE_ID = "AAq4oeDXECopo";
 
 
@@ -154,13 +155,24 @@ public class ReportsByBusinessPushServiceImpl implements IReportsByBusinessPushS
         JSONArray movieRankTable = new JSONArray();
         for (Map<String, String> movie : movieData){
             JSONObject obj = new JSONObject();
-            String movieSource = String.valueOf(movie.get("movie_source"));
+//            String movieSource = String.valueOf(movie.get("movie_source"));
             String movieName = String.valueOf(movie.get("movie_name"));
-            if (!Check.isNull(movieSource) && movieSource.contains("1")){
-                obj.put("movieNameColor", "blue");
+//            if (!Check.isNull(movieSource) && movieSource.contains("1")){
+//                obj.put("movieNameColor", "blue");
+//            }else {
+//                obj.put("movieNameColor", "grey");
+//            }
+            String movieProjectSource = String.valueOf(movie.get("movie_project_source"));
+            String movieProjectSourceName = String.valueOf(movie.get("movie_project_source_name"));
+            JSONArray ms = new JSONArray();
+            if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("1")){
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "grey"));
+            }else if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("2")){
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "green"));
             }else {
-                obj.put("movieNameColor", "grey");
+                ms.add(ImmutableMap.of("text", movieProjectSourceName, "color", "blue"));
             }
+            obj.put("movieProjectSource", ms);
             obj.put("rank", String.valueOf(movie.get("rk")));
             obj.put("movieName", movieName);
             obj.put("endAmount", String.valueOf(movie.get("end_amount")));
@@ -213,7 +225,7 @@ public class ReportsByBusinessPushServiceImpl implements IReportsByBusinessPushS
         template_variable.put("todayDate", today);
         template_variable.put("lastDayDate", lastDay);
         template_variable.put("dateIndicatorTable", dateIndicatorTable);
-        template_variable.put("movieRankTable", movieRankTable);
+        template_variable.put("table_raw_array_1", movieRankTable);
         template_variable.put("deptRank", deptRank);
         template_variable.put("description", description);
         template_variable.put("businessTypeList", businessTypeTable);

Plik diff jest za duży
+ 5 - 5
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java


+ 34 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AdminAdvertiserListJob.java

@@ -3,13 +3,17 @@ package cn.com.ctop.job.bytedance.handler;
 
 import cn.com.ctop.job.bytedance.data.service.IAdminAdvertiserListService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
 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;
+import org.springframework.web.bind.annotation.GetMapping;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -26,6 +30,36 @@ public class AdminAdvertiserListJob {
     @Autowired
     private IAdminAdvertiserListService adminAdvertiserListService;
     private static ExecutorService adminService = Executors.newFixedThreadPool(2);
+    private static ExecutorService agentExecutorService = Executors.newFixedThreadPool(3);
+
+
+    @XxlJob("agentData")
+    public void agentData() {
+        List<JSONObject> adminAdvertiserList = adminAdvertiserListService.getNotAgentAdvertiserList();
+
+        for (JSONObject adminAdvertiserJson : adminAdvertiserList) {
+            Long adminAdvertiserId = adminAdvertiserJson.getLong("adminAdvertiserId");
+            String accessToken = adminAdvertiserJson.getString("accessToken");
+            Long advertiserId = adminAdvertiserJson.getLong("advertiserId");
+            List<Long> ids = new ArrayList<>();
+            ids.add(advertiserId);
+            agentExecutorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    if (!Check.isNull(accessToken)) {
+                        try {
+                            adminAdvertiserListService.getAgentInfo(adminAdvertiserId, accessToken, ids);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+
+                    }
+                }
+            });
+
+        }
+    }
+
 
     @XxlJob("getAdminAdvertiserList")
     public void getAdminAdvertiserList() throws Exception {

+ 12 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.job.bytedance.handler;
 
 import cn.com.ctop.job.bytedance.data.service.*;
+import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +28,8 @@ public class FeishuPushJob {
     ICutGroupRankPushService cutGroupRankPushService;
     @Autowired
     IReportsByBusinessPushService reportsByBusinessPushService;
+    @Autowired
+    IFeishuService feishuService;
 
     @XxlJob("unbindWarnPush")
     public void unbindWarnPush(){
@@ -88,4 +91,13 @@ public class FeishuPushJob {
     public void loginRecordPush(){
         userLoginRecordService.queryUserLoginRecord();
     }
+
+    @XxlJob("pullFeishuAvatar")
+    public void pullFeishuAvatar(){
+        try {
+            feishuService.uploadAvatar();
+        }catch (Exception e){
+            log.error("pullFeishuAvatar error: "+e.getMessage(), e);
+        }
+    }
 }

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

@@ -106,16 +106,16 @@ public class ToolsSiteJob {
     @XxlJob("regularUpdatesState")
     public void regularUpdatesState() throws Exception {
         log.info("执行更新短剧上下架状态...");
-        //更新短剧上下架状态	当前域名为测试域名TODO
-        String url = "http://test.api.cms.artlinkworld.cn/videoAppletShow/regularUpdatesState";
+        //更新短剧上下架状态
+        String url = "https://api.cms.artlinkworld.cn/videoAppletShow/regularUpdatesState";
         HttpUtils.httpGet(String.format("%s?id=%s", url, KEY), null, null);
     }
 
     @XxlJob("regularUpdateVideoInfo")
     public void regularUpdateVideoInfo() throws Exception {
         log.info("定期更新短剧审核信息...");
-        //定期更新短剧审核信息 当前域名为测试域名TODO
-        String url = "http://test.api.cms.artlinkworld.cn/thirtPartVideo/regularUpdateVideoInfo";
+        //定期更新短剧审核信息
+        String url = "https://api.cms.artlinkworld.cn/thirtPartVideo/regularUpdateVideoInfo";
         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);
     }

+ 48 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/utils/FeishuRobotUtil.java

@@ -1,11 +1,13 @@
 package cn.com.ctop.job.bytedance.utils;
 
 import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
@@ -132,6 +134,52 @@ public class FeishuRobotUtil {
         }
     }
 
+    /**
+     * 批量获取用户信息
+     * return: userId -> userInfo
+     */
+    public static Map<String, JSONObject> batchGetUserInfo(String token, List<String> userIds) throws IOException{
+        Map<String, JSONObject> map = new HashMap<>();
+        int size = userIds.size();
+        int pageSize = 50;
+        int pageNum = size / pageSize + (size % pageSize == 0 ? 0 : 1);
+        for (int i = 0; i < pageNum; i++) {
+            int start = i * pageSize;
+            int end = Math.min(start + pageSize, size);
+            List<String> subList = userIds.subList(start, end);
+            Map<String, JSONObject> subMap = batchGetUserInfoOnePage(token, subList);
+            if (!Check.isNull(subMap)){
+                map.putAll(subMap);
+            }
+        }
+        return map;
+    }
+
+    private static Map<String, JSONObject> batchGetUserInfoOnePage(String token, List<String> userIds) throws IOException{
+        String url = "https://open.feishu.cn/open-apis/contact/v3/users/batch?user_id_type=user_id&department_id_type=open_department_id";
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", "Bearer "+token);
+        for (String u : userIds){
+            url = url + "&user_ids="+u;
+        }
+        String res = HttpUtils.httpGet(url, null, headers);
+        JSONObject obj = JSON.parseObject(res);
+        if (obj != null && obj.getInteger("code") == 0){
+            Map<String, JSONObject> map = new HashMap<>();
+            JSONObject data = obj.getJSONObject("data");
+            JSONArray items = data.getJSONArray("items");
+            for (int i = 0; i < items.size(); i++) {
+                JSONObject user = items.getJSONObject(i);
+                String userId = user.getString("user_id");
+                map.put(userId, user);
+            }
+            return map;
+        }else {
+            System.out.println(obj);
+        }
+        return null;
+    }
+
     public static void sendTextToDt(String text, List<String> userIds) throws IOException {
         JSONObject content = new JSONObject();
         content.put("text", text);