瀏覽代碼

Merge branch 'master' into test

wangyunpeng 2 月之前
父節點
當前提交
767c8b3026
共有 37 個文件被更改,包括 699 次插入87 次删除
  1. 6 0
      api-module/src/main/java/com/tzld/piaoquan/api/common/enums/ExceptionEnum.java
  2. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/controller/FileController.java
  3. 55 0
      api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformApiController.java
  4. 6 6
      api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformDatastatController.java
  5. 2 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformDataStatMapperExt.java
  6. 3 1
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.java
  7. 47 16
      api-module/src/main/java/com/tzld/piaoquan/api/job/ContentPlatformDatastatJob.java
  8. 9 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/api/GetContentPageParam.java
  9. 14 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/api/GetTokenParam.java
  10. 25 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/api/GetVideoPageUrlParam.java
  11. 13 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/api/VideoIdTitleVO.java
  12. 30 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/api/VideoPageUrlVO.java
  13. 1 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/CgiReplyService.java
  14. 2 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformAccountService.java
  15. 19 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformApiService.java
  16. 2 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformCooperateAccountService.java
  17. 2 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformPlanService.java
  18. 2 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformAccountServiceImpl.java
  19. 188 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformApiServiceImpl.java
  20. 7 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformCooperateAccountServiceImpl.java
  21. 5 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformDatastatServiceImpl.java
  22. 8 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java
  23. 8 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/impl/CgiReplyServiceImpl.java
  24. 3 0
      api-module/src/main/resources/application.properties
  25. 5 3
      api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformDataStatMapperExt.xml
  26. 16 0
      api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.xml
  27. 0 1
      common-module/src/main/java/com/tzld/piaoquan/growth/common/common/constant/WeComConstant.java
  28. 2 0
      common-module/src/main/java/com/tzld/piaoquan/growth/common/component/HttpPoolClient.java
  29. 109 0
      common-module/src/main/java/com/tzld/piaoquan/growth/common/component/ProxyHttpPoolClient.java
  30. 23 1
      common-module/src/main/java/com/tzld/piaoquan/growth/common/config/HttpClientConfig.java
  31. 37 42
      common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/MessageAttachmentServiceImpl.java
  32. 6 2
      common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/MessageServiceImpl.java
  33. 12 2
      common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/WeComAccessTokenServiceImpl.java
  34. 5 1
      common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/WeComUserServiceImpl.java
  35. 13 5
      offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComHistoryDataJob.java
  36. 5 1
      offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComStaffDataJob.java
  37. 8 2
      offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComUserDataJob.java

+ 6 - 0
api-module/src/main/java/com/tzld/piaoquan/api/common/enums/ExceptionEnum.java

@@ -38,6 +38,12 @@ public enum ExceptionEnum {
     QW_PLAN_NOT_EXISTS(3003, "企微计划不存在"),
     GZH_ACCOUNT_NOT_EXISTS(3004, "公众号不存在"),
     GZH_ACCOUNT_NOT_AUTH(3005, "公众号未授权,无法使用平台发布"),
+
+    // api
+    API_TOKEN_ERROR(4000, "token无效"),
+    API_PAGE_PARAM_ERROR(4001, "请输入正确的分页参数"),
+    API_PAGE_SIZE_TOO_LARGE(4002, "每页获取数量不能超过500条"),
+    API_PAGE_URL_SIZE_TOO_LARGE(4002, "获取视频嵌入路径 每次最多3条"),
     ;
     private int code;
     private String msg;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/controller/FileController.java

@@ -20,9 +20,9 @@ import java.io.IOException;
 
 @RestController
 @RequestMapping("/file")
-@CrossOrigin(origins = "*")
 public class FileController {
 
+    @CrossOrigin(origins = "*")
     @PostMapping("/upload")
     public CommonResponse<FileInfo> fileUpload(@Validated FileUploadParam param, BindingResult bindingResult) throws IOException {
         if (bindingResult.hasErrors()) {

+ 55 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformApiController.java

@@ -0,0 +1,55 @@
+package com.tzld.piaoquan.api.controller.contentplatform;
+
+import com.tzld.piaoquan.api.annotation.JwtIgnore;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetContentPageParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetTokenParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetVideoPageUrlParam;
+import com.tzld.piaoquan.api.model.vo.contentplatform.api.VideoIdTitleVO;
+import com.tzld.piaoquan.api.model.vo.contentplatform.api.VideoPageUrlVO;
+import com.tzld.piaoquan.api.service.contentplatform.ContentPlatformApiService;
+import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@RestController
+@RequestMapping("/contentPlatform/api")
+public class ContentPlatformApiController {
+
+    @Autowired
+    ContentPlatformApiService apiService;
+
+    @ApiOperation(value = "获取token")
+    @PostMapping("/getToken")
+    @JwtIgnore
+    public CommonResponse<String> getToken(@RequestBody GetTokenParam param) {
+        return CommonResponse.success(apiService.getToken(param));
+    }
+
+    @ApiOperation(value = "分页获取内容库内容")
+    @PostMapping("/getContent")
+    @JwtIgnore
+    public CommonResponse<Page<VideoIdTitleVO>> getContent(HttpServletRequest request,
+                                                           @RequestBody GetContentPageParam param) {
+        String token = request.getHeader("token");
+        return CommonResponse.success(apiService.getContent(token, param));
+    }
+
+    @ApiOperation(value = "获取视频嵌入路径")
+    @PostMapping("/getVideoPageUrl")
+    @JwtIgnore
+    public CommonResponse<List<VideoPageUrlVO>> getVideoPageUrl(HttpServletRequest request,
+                                                                                      @RequestBody GetVideoPageUrlParam param) {
+        String token = request.getHeader("token");
+        return CommonResponse.success(apiService.getVideoPageUrl(token, param));
+    }
+
+
+}

+ 6 - 6
api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformDatastatController.java

@@ -51,24 +51,24 @@ public class ContentPlatformDatastatController {
     @ApiOperation(value = "公众号数据统计同步任务", hidden = true)
     @GetMapping("/job/syncGzhDatastat")
     @JwtIgnore
-    public CommonResponse<String> syncContentPlatformGzhDatastatJob() {
-        job.syncContentPlatformGzhDatastatJob(null);
+    public CommonResponse<String> syncContentPlatformGzhDatastatJob(String dateStr) {
+        job.syncContentPlatformGzhDatastatJob(dateStr);
         return CommonResponse.success();
     }
 
     @ApiOperation(value = "企微数据统计同步任务", hidden = true)
     @GetMapping("/job/syncQwDatastat")
     @JwtIgnore
-    public CommonResponse<String> syncContentPlatformQwDatastatJob() {
-        job.syncContentPlatformQwDatastatJob(null);
+    public CommonResponse<String> syncContentPlatformQwDatastatJob(String dateStr) {
+        job.syncContentPlatformQwDatastatJob(dateStr);
         return CommonResponse.success();
     }
 
     @ApiOperation(value = "企微数据统计总计同步任务", hidden = true)
     @GetMapping("/job/syncQwDatastatTotal")
     @JwtIgnore
-    public CommonResponse<String> syncContentPlatformQwDatastatTotalJob() {
-        job.syncContentPlatformQwDatastatTotalJob(null);
+    public CommonResponse<String> syncContentPlatformQwDatastatTotalJob(String dateStr) {
+        job.syncContentPlatformQwDatastatTotalJob(dateStr);
         return CommonResponse.success();
     }
 

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformDataStatMapperExt.java

@@ -63,4 +63,6 @@ public interface ContentPlatformDataStatMapperExt {
     void batchInsertQwDatastatTotal(@Param("records") List<ContentPlatformQwDataStatTotal> saveList);
 
     List<ContentPlatformQwDataStatTotal> getQwTotalDatastatScoreList(@Param("dt") String dt, @Param("channels") List<String> channels);
+
+    void deleteQwDatastatTotal(@Param("dt") String dt);
 }

+ 3 - 1
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.java

@@ -61,5 +61,7 @@ public interface ContentPlatformPlanMapperExt {
 
     void updateVideoAggStatus(@Param("videoId") Long videoId, @Param("now") Long now);
 
-    List<ContentPlatformVideoAgg> getVideoAggList(List<String> dtList);
+    List<ContentPlatformVideoAgg> getVideoAggList(@Param("dtList") List<String> dtList);
+
+    List<ContentPlatformVideo> getVideoListByIds(@Param("videoIds") List<Long> videoIds);
 }

+ 47 - 16
api-module/src/main/java/com/tzld/piaoquan/api/job/ContentPlatformDatastatJob.java

@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -53,6 +54,9 @@ public class ContentPlatformDatastatJob {
     @XxlJob("syncContentPlatformGzhDatastatJob")
     public ReturnT<String> syncContentPlatformGzhDatastatJob(String param) {
         String dt = DateUtil.getBeforeDayDateString("yyyyMMdd");
+        if (StringUtils.hasText(param)) {
+            dt = param;
+        }
         long count = getGzhDatastatCount(dt);
         if (count > 0) {
             return ReturnT.SUCCESS;
@@ -120,10 +124,11 @@ public class ContentPlatformDatastatJob {
                         size += videoList.size();
                     }
                 }
-
-                BigDecimal num = BigDecimal.valueOf(score / size);
-                BigDecimal rounded = num.setScale(2, RoundingMode.HALF_UP);
-                item.setScore(rounded.doubleValue());
+                if (size > 0) {
+                    BigDecimal num = BigDecimal.valueOf(score / size);
+                    BigDecimal rounded = num.setScale(2, RoundingMode.HALF_UP);
+                    item.setScore(rounded.doubleValue());
+                }
                 item.setCreateTimestamp(now);
                 saveList.add(item);
             }
@@ -146,10 +151,10 @@ public class ContentPlatformDatastatJob {
         return gzhDataStatMapper.countByExample(example);
     }
 
-    private long getQwDatastatCount(String dt) {
+    private List<ContentPlatformQwDataStat> getQwDatastatCount(String dt) {
         ContentPlatformQwDataStatExample example = new ContentPlatformQwDataStatExample();
         example.createCriteria().andDateStrEqualTo(dt);
-        return qwDataStatMapper.countByExample(example);
+        return qwDataStatMapper.selectByExample(example);
     }
 
     private long getQwDatastatTotalCount(String dt) {
@@ -161,14 +166,15 @@ public class ContentPlatformDatastatJob {
     @XxlJob("syncContentPlatformQwDatastatJob")
     public ReturnT<String> syncContentPlatformQwDatastatJob(String param) {
         String dt = DateUtil.getBeforeDayDateString("yyyyMMdd");
-        long count = getQwDatastatCount(dt);
-        if (count > 0) {
-            return ReturnT.SUCCESS;
+        if (StringUtils.hasText(param)) {
+            dt = param;
         }
         List<ContentPlatformQwPlan> qwPlanList = getAllQwPlan();
         if (CollectionUtils.isEmpty(qwPlanList)) {
             return ReturnT.SUCCESS;
         }
+        List<ContentPlatformQwDataStat> existList = getQwDatastatCount(dt);
+        List<String> existRootSourceIds = existList.stream().map(ContentPlatformQwDataStat::getRootSourceId).collect(Collectors.toList());
         Map<String, Long> rootSourceIdMap = qwPlanList.stream()
             .collect(Collectors.toMap(ContentPlatformQwPlan::getRootSourceId, ContentPlatformQwPlan::getId));
         List<Long> planIds = qwPlanList.stream().map(ContentPlatformQwPlan::getId).collect(Collectors.toList());
@@ -191,6 +197,9 @@ public class ContentPlatformDatastatJob {
                 if (!rootSourceIds.contains(rootSourceId)) {
                     continue;
                 }
+                if (existRootSourceIds.contains(rootSourceId)) {
+                    continue;
+                }
                 int firstLevelCount = Integer.parseInt((String) record.get(8));
                 if (firstLevelCount == 0) {
                     continue;
@@ -219,6 +228,9 @@ public class ContentPlatformDatastatJob {
                 if (!rootSourceIds.contains(rootSourceId)) {
                     continue;
                 }
+                if (existRootSourceIds.contains(rootSourceId)) {
+                    continue;
+                }
                 int firstLevelCount = Integer.parseInt((String) record.get(8));
                 if (firstLevelCount == 0) {
                     continue;
@@ -253,25 +265,32 @@ public class ContentPlatformDatastatJob {
     @XxlJob("syncContentPlatformQwDatastatTotalJob")
     public ReturnT<String> syncContentPlatformQwDatastatTotalJob(String param) {
         String dt = DateUtil.getBeforeDayDateString("yyyyMMdd");
-        long count = getQwDatastatTotalCount(dt);
-        if (count > 0) {
-            return ReturnT.SUCCESS;
+        if (StringUtils.hasText(param)) {
+            dt = param;
         }
+        dataStatMapperExt.deleteQwDatastatTotal(dt);
         Map<String, ContentPlatformQwDataStatTotal> saveMap = new HashMap<>();
         String outSql = String.format("SELECT * FROM loghubods.qw_out_touliu_behavior_total WHERE dt=%s;", dt);
         List<Record> outDataList = OdpsUtil.getOdpsData(outSql);
         Long now = System.currentTimeMillis();
         if (CollectionUtils.isNotEmpty(outDataList)) {
             for (Record record : outDataList) {
-                ContentPlatformQwDataStatTotal item = new ContentPlatformQwDataStatTotal();
+                String type = (String) record.get(1);
+                if (!"社群".equals(type) && !"自动回复".equals(type)) {
+                    continue;
+                }
                 String channel = (String) record.get(33);
                 int firstLevelCount = Integer.parseInt((String) record.get(6));
                 if (firstLevelCount == 0) {
                     continue;
                 }
+                ContentPlatformQwDataStatTotal item = saveMap.getOrDefault(channel, new ContentPlatformQwDataStatTotal());
                 item.setDateStr(dt);
                 item.setChannel(channel);
-                item.setFirstLevelCount(firstLevelCount);
+                if (item.getFirstLevelCount() == null) {
+                    item.setFirstLevelCount(0);
+                }
+                item.setFirstLevelCount(item.getFirstLevelCount() + firstLevelCount);
                 item.setCreateTimestamp(now);
                 saveMap.put(channel, item);
             }
@@ -279,17 +298,29 @@ public class ContentPlatformDatastatJob {
         String out2Sql = String.format("SELECT * FROM loghubods.qw_out2_touliu_behavior_total WHERE dt=%s;", dt);
         List<Record> out2DataList = OdpsUtil.getOdpsData(out2Sql);
         if (CollectionUtils.isNotEmpty(out2DataList)) {
+            List<String> out2Channels = new ArrayList<>();
             for (Record record : out2DataList) {
-                ContentPlatformQwDataStatTotal item = new ContentPlatformQwDataStatTotal();
+                String type = (String) record.get(1);
+                if (!"社群".equals(type) && !"自动回复".equals(type)) {
+                    continue;
+                }
                 String channel = (String) record.get(33);
                 int firstLevelCount = Integer.parseInt((String) record.get(6));
                 if (firstLevelCount == 0) {
                     continue;
                 }
+                if (saveMap.containsKey(channel) && !out2Channels.contains(channel)) {
+                    saveMap.remove(channel);
+                }
+                ContentPlatformQwDataStatTotal item = saveMap.getOrDefault(channel, new ContentPlatformQwDataStatTotal());
                 item.setDateStr(dt);
                 item.setChannel(channel);
-                item.setFirstLevelCount(firstLevelCount);
+                if (item.getFirstLevelCount() == null) {
+                    item.setFirstLevelCount(0);
+                }
+                item.setFirstLevelCount(item.getFirstLevelCount() + firstLevelCount);
                 item.setCreateTimestamp(now);
+                out2Channels.add(channel);
                 saveMap.put(channel, item);
             }
         }

+ 9 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/api/GetContentPageParam.java

@@ -0,0 +1,9 @@
+package com.tzld.piaoquan.api.model.param.contentplatform.api;
+
+import com.tzld.piaoquan.api.model.param.PageParam;
+import lombok.Data;
+
+@Data
+public class GetContentPageParam extends PageParam {
+
+}

+ 14 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/api/GetTokenParam.java

@@ -0,0 +1,14 @@
+package com.tzld.piaoquan.api.model.param.contentplatform.api;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class GetTokenParam {
+
+    @ApiModelProperty(value = "telNum")
+    private String telNum;
+
+    @ApiModelProperty(value = "密码md5")
+    private String password;
+}

+ 25 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/api/GetVideoPageUrlParam.java

@@ -0,0 +1,25 @@
+package com.tzld.piaoquan.api.model.param.contentplatform.api;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GetVideoPageUrlParam {
+
+    @ApiModelProperty(value = "待嵌入视频列表")
+    private List<PlanItem> planList;
+
+    @Data
+    public static class PlanItem {
+        @ApiModelProperty(value = "id")
+        private String id;
+        @ApiModelProperty(value = "嵌入场景 0-自动回复 1-服务号定期推送")
+        private Integer type;
+        @ApiModelProperty(value = "公众号ghId")
+        private String ghId;
+        @ApiModelProperty(value = "videoIds")
+        private List<Long> videoIds;
+    }
+}

+ 13 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/api/VideoIdTitleVO.java

@@ -0,0 +1,13 @@
+package com.tzld.piaoquan.api.model.vo.contentplatform.api;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class VideoIdTitleVO {
+
+    @ApiModelProperty(value = "videoId")
+    private Long videoId;
+    @ApiModelProperty(value = "标题")
+    private String title;
+}

+ 30 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/api/VideoPageUrlVO.java

@@ -0,0 +1,30 @@
+package com.tzld.piaoquan.api.model.vo.contentplatform.api;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class VideoPageUrlVO {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    private int code = 0;
+    private String msg = "success";
+    private List<VideoPageUrlItem> data;
+
+    @Data
+    public static class VideoPageUrlItem {
+
+        @ApiModelProperty(value = "videoId")
+        private Long videoId;
+        @ApiModelProperty(value = "标题")
+        private String title;
+        @ApiModelProperty(value = "封面")
+        private String cover;
+        @ApiModelProperty(value = "嵌入小程序页面路径")
+        private String pageUrl;
+    }
+}

+ 1 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/CgiReplyService.java

@@ -13,4 +13,5 @@ public interface CgiReplyService {
 
     List<CgiReplyBucketData> getCgiReplyBucketDataListByVideoId(Long videoId);
 
+    List<CgiReplyBucketData> getCgiReplyBucketDataListByGhIdVideoId(String ghId, List<Long> videoIds, String strategy);
 }

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformAccountService.java

@@ -11,6 +11,8 @@ import java.util.List;
 public interface ContentPlatformAccountService {
     AccountLoginVO login(AccountLoginParam param);
 
+    ContentPlatformAccount getAccountByTelNum(String telNum);
+
     void sendMessageVerifyCode(AccountSendMessageParam param);
 
     Page<AccountVO> pageAccount(AccountListParam param);

+ 19 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformApiService.java

@@ -0,0 +1,19 @@
+package com.tzld.piaoquan.api.service.contentplatform;
+
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetContentPageParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetTokenParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetVideoPageUrlParam;
+import com.tzld.piaoquan.api.model.vo.contentplatform.api.VideoIdTitleVO;
+import com.tzld.piaoquan.api.model.vo.contentplatform.api.VideoPageUrlVO;
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+
+import java.util.List;
+
+public interface ContentPlatformApiService {
+
+    String getToken(GetTokenParam param);
+
+    Page<VideoIdTitleVO> getContent(String token, GetContentPageParam param);
+
+    List<VideoPageUrlVO> getVideoPageUrl(String token, GetVideoPageUrlParam param);
+}

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformCooperateAccountService.java

@@ -38,4 +38,6 @@ public interface ContentPlatformCooperateAccountService {
     ContentPlatformGzhAccount getGzhAccount(String ghId);
 
     List<ContentPlatformGzhAccount> getAccountListByCreatorId(Long creatorId);
+
+    List<ContentPlatformGzhAccount> getAccountListByGhIds(List<String> ghIds, Long creatorId);
 }

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/ContentPlatformPlanService.java

@@ -71,4 +71,6 @@ public interface ContentPlatformPlanService {
     void gzhUpdateStagePublishStatus(Long id, Integer stagePublishStatus);
 
     String getGzhChannel(String ghId);
+
+    void saveQwPlanVideo(QwPlanSaveVideoParam videoParam, Long planId, Long loginAccountId);
 }

+ 2 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformAccountServiceImpl.java

@@ -88,7 +88,8 @@ public class ContentPlatformAccountServiceImpl implements ContentPlatformAccount
         return result;
     }
 
-    private ContentPlatformAccount getAccountByTelNum(String telNum) {
+    @Override
+    public ContentPlatformAccount getAccountByTelNum(String telNum) {
         ContentPlatformAccountExample example = new ContentPlatformAccountExample();
         example.createCriteria().andTelNumEqualTo(telNum);
         List<ContentPlatformAccount> accountList = accountMapper.selectByExample(example);

+ 188 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformApiServiceImpl.java

@@ -0,0 +1,188 @@
+package com.tzld.piaoquan.api.service.contentplatform.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.tzld.piaoquan.api.common.enums.ExceptionEnum;
+import com.tzld.piaoquan.api.common.enums.contentplatform.AccountStatusEnum;
+import com.tzld.piaoquan.api.common.enums.contentplatform.PublishStageEnum;
+import com.tzld.piaoquan.api.common.exception.CommonException;
+import com.tzld.piaoquan.api.dao.mapper.contentplatform.ext.ContentPlatformPlanMapperExt;
+import com.tzld.piaoquan.api.model.config.LoginUserContext;
+import com.tzld.piaoquan.api.model.param.contentplatform.GzhPlanSaveParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.GzhPlanVideoContentItemParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.VideoContentListParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetContentPageParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetTokenParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.api.GetVideoPageUrlParam;
+import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccount;
+import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformGzhAccount;
+import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformVideo;
+import com.tzld.piaoquan.api.model.vo.contentplatform.api.VideoIdTitleVO;
+import com.tzld.piaoquan.api.model.vo.contentplatform.api.VideoPageUrlVO;
+import com.tzld.piaoquan.api.service.CgiReplyService;
+import com.tzld.piaoquan.api.service.contentplatform.ContentPlatformAccountService;
+import com.tzld.piaoquan.api.service.contentplatform.ContentPlatformApiService;
+import com.tzld.piaoquan.api.service.contentplatform.ContentPlatformCooperateAccountService;
+import com.tzld.piaoquan.api.service.contentplatform.ContentPlatformPlanService;
+import com.tzld.piaoquan.growth.common.model.po.CgiReplyBucketData;
+import com.tzld.piaoquan.growth.common.utils.RedisUtils;
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class ContentPlatformApiServiceImpl implements ContentPlatformApiService {
+
+    @Autowired
+    private ContentPlatformAccountService accountService;
+    @Autowired
+    private ContentPlatformPlanService planService;
+    @Autowired
+    private ContentPlatformPlanMapperExt planMapperExt;
+    @Autowired
+    private ContentPlatformCooperateAccountService gzhAccountService;
+    @Autowired
+    private CgiReplyService cgiReplyService;
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @Value("${video.min.score:0.6}")
+    private Double videoMinScore;
+
+    @Override
+    public String getToken(GetTokenParam param) {
+        ContentPlatformAccount account = accountService.getAccountByTelNum(param.getTelNum());
+        if (Objects.isNull(account)) {
+            throw new CommonException(ExceptionEnum.ACCOUNT_NOT_EXISTS_WRONG);
+        }
+        if (account.getStatus() == AccountStatusEnum.FORBIDDEN.getVal()) {
+            throw new CommonException(ExceptionEnum.ACCOUNT_BANNED);
+        }
+        if (!account.getPassword().equals(param.getPassword())) {
+            throw new CommonException(ExceptionEnum.LOGIN_PASSWORD_WRONG);
+        }
+        String token = UUID.randomUUID().toString().replace("-", "");
+        saveTokenToRedis(account, token, 4 * 60 * 60L);
+        return token;
+    }
+
+    private void saveTokenToRedis(ContentPlatformAccount account, String token, Long expireTime) {
+        String tokenPrefix = "api.{token}";
+        String redisKey = tokenPrefix.replace("{token}", token);
+        redisUtils.setValueWithExpire(redisKey, JSON.toJSONString(account), expireTime);
+    }
+
+    @Override
+    public Page<VideoIdTitleVO> getContent(String token, GetContentPageParam param) {
+        checkToken(token);
+        if (Objects.isNull(param.getPageNum()) || Objects.isNull(param.getPageSize())
+                || param.getPageNum() <= 0 || param.getPageSize() <= 0) {
+            throw new CommonException(ExceptionEnum.API_PAGE_PARAM_ERROR);
+        }
+        if (param.getPageSize() > 500) {
+            throw new CommonException(ExceptionEnum.API_PAGE_SIZE_TOO_LARGE);
+        }
+        Page<VideoIdTitleVO> result = new Page<>(param.getPageNum(), param.getPageSize());
+        int offset = (param.getPageNum() - 1) * param.getPageSize();
+        String dt = planMapperExt.getVideoMaxDt();
+        VideoContentListParam listParam = new VideoContentListParam();
+        int count = planMapperExt.getVideoCount(listParam, dt, videoMinScore);
+        result.setTotalSize(count);
+        if (count == 0) {
+            return result;
+        }
+        List<ContentPlatformVideo> videoList = planMapperExt.getVideoList(listParam, dt, videoMinScore, offset, param.getPageSize());
+        List<VideoIdTitleVO> list = videoList.stream().map(video -> {
+            VideoIdTitleVO vo = new VideoIdTitleVO();
+            vo.setVideoId(video.getVideoId());
+            vo.setTitle(video.getTitle());
+            return vo;
+        }).collect(Collectors.toList());
+        result.setObjs(list);
+        return result;
+    }
+
+    private ContentPlatformAccount checkToken(String token) {
+        String tokenPrefix = "api.{token}";
+        String redisKey = tokenPrefix.replace("{token}", token);
+        String value = redisUtils.getString(redisKey);
+        if (StringUtils.isBlank(value)) {
+            throw new CommonException(ExceptionEnum.API_TOKEN_ERROR);
+        }
+        return JSON.parseObject(value, ContentPlatformAccount.class);
+    }
+
+    @Override
+    public List<VideoPageUrlVO> getVideoPageUrl(String token, GetVideoPageUrlParam param) {
+        ContentPlatformAccount account = checkToken(token);
+        if (CollectionUtils.isEmpty(param.getPlanList()) || param.getPlanList().size() > 3) {
+            throw new CommonException(ExceptionEnum.API_PAGE_URL_SIZE_TOO_LARGE);
+        }
+        List<VideoPageUrlVO> result = new ArrayList<>();
+        List<Long> videoIds = param.getPlanList().stream().flatMap(o -> o.getVideoIds().stream()).collect(Collectors.toList());
+        List<ContentPlatformVideo> videoList = planMapperExt.getVideoListByIds(videoIds);
+        Map<Long, ContentPlatformVideo> videoMap = videoList.stream().collect(Collectors.toMap(ContentPlatformVideo::getVideoId, video -> video));
+        List<String> ghIds = param.getPlanList().stream().map(GetVideoPageUrlParam.PlanItem::getGhId).collect(Collectors.toList());
+        List<ContentPlatformGzhAccount> gzhAccountList = gzhAccountService.getAccountListByGhIds(ghIds, account.getId());
+        Map<String, ContentPlatformGzhAccount> gzhAccountMap = gzhAccountList.stream()
+                .collect(Collectors.toMap(ContentPlatformGzhAccount::getGhId, gzhAccount -> gzhAccount));
+        LoginUserContext.setLoginUser(account);
+        for (GetVideoPageUrlParam.PlanItem item : param.getPlanList()) {
+            int code = 0;
+            String msg = "";
+            List<VideoPageUrlVO.VideoPageUrlItem> data = new ArrayList<>();
+            try {
+                GzhPlanSaveParam saveParam = new GzhPlanSaveParam();
+                saveParam.setPublishStage(PublishStageEnum.USER.getVal());
+                ContentPlatformGzhAccount gzhAccount = gzhAccountMap.get(item.getGhId());
+                if (Objects.isNull(gzhAccount)) {
+                    throw new CommonException(ExceptionEnum.GZH_ACCOUNT_NOT_EXISTS);
+                }
+                saveParam.setAccountId(gzhAccount.getId());
+                saveParam.setScene(0);
+                saveParam.setType(item.getType());
+                saveParam.setSelectVideoType(0);
+                List<GzhPlanVideoContentItemParam> videoItemList = new ArrayList<>();
+                for (Long videoId : item.getVideoIds()) {
+                    ContentPlatformVideo video = videoMap.get(videoId);
+                    GzhPlanVideoContentItemParam videoItem = new GzhPlanVideoContentItemParam();
+                    videoItem.setVideoId(video.getVideoId());
+                    videoItem.setTitle(video.getTitle());
+                    videoItem.setCover(video.getCover());
+                    videoItem.setVideo(video.getVideo());
+                    videoItemList.add(videoItem);
+                }
+                saveParam.setVideoList(videoItemList);
+                planService.gzhPlanSave(saveParam);
+                List<CgiReplyBucketData> replyBucketDataList = cgiReplyService.getCgiReplyBucketDataListByGhIdVideoId(
+                        gzhAccount.getGhId(), item.getVideoIds(), "manual");
+                for (CgiReplyBucketData cgiReplyBucketData : replyBucketDataList) {
+                    VideoPageUrlVO.VideoPageUrlItem vo = new VideoPageUrlVO.VideoPageUrlItem();
+                    vo.setVideoId(cgiReplyBucketData.getMiniVideoId());
+                    vo.setTitle(cgiReplyBucketData.getTitle());
+                    vo.setCover(cgiReplyBucketData.getCoverUrl());
+                    vo.setPageUrl(cgiReplyBucketData.getMiniPagePath());
+                    data.add(vo);
+                }
+            } catch (Exception e) {
+                code = -1;
+                msg = e.getMessage();
+            } finally {
+                VideoPageUrlVO response = new VideoPageUrlVO();
+                response.setId(item.getId());
+                response.setCode(code);
+                response.setMsg(msg);
+                response.setData(data);
+                result.add(response);
+            }
+        }
+        LoginUserContext.remove();
+        return result;
+    }
+}

+ 7 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformCooperateAccountServiceImpl.java

@@ -180,6 +180,13 @@ public class ContentPlatformCooperateAccountServiceImpl implements ContentPlatfo
         return gzhAccountMapper.selectByExample(example);
     }
 
+    @Override
+    public List<ContentPlatformGzhAccount> getAccountListByGhIds(List<String> ghIds, Long creatorId) {
+        ContentPlatformGzhAccountExample example = new ContentPlatformGzhAccountExample();
+        example.createCriteria().andGhIdIn(ghIds).andCreateAccountIdEqualTo(creatorId);
+        return gzhAccountMapper.selectByExample(example);
+    }
+
     @Override
     public ContentPlatformGzhAccount getById(Long id) {
         return gzhAccountMapper.selectByPrimaryKey(id);

+ 5 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformDatastatServiceImpl.java

@@ -220,7 +220,11 @@ public class ContentPlatformDatastatServiceImpl implements ContentPlatformDatast
             QwDatastatItemVO vo = new QwDatastatItemVO();
             vo.setDateStr(datastat.getDateStr());
             vo.setFirstLevel(datastat.getFirstLevelCount());
-            vo.setScore(datastat.getScore());
+            if (Objects.nonNull(datastat.getScore())) {
+                BigDecimal num = BigDecimal.valueOf(datastat.getScore());
+                BigDecimal rounded = num.setScale(2, RoundingMode.HALF_UP);
+                vo.setScore(rounded.doubleValue());
+            }
             Long planId = qwPlanMap.get(datastat.getRootSourceId());
             if (Objects.nonNull(planId)) {
                 List<ContentPlatformQwPlanVideo> planVideoList = qwPlanVideoMap.get(planId);

+ 8 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java

@@ -558,7 +558,8 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         return buildQwPlanItemVOList(list);
     }
 
-    private void saveQwPlanVideo(QwPlanSaveVideoParam videoParam, Long planId, Long loginAccountId) {
+    @Override
+    public void saveQwPlanVideo(QwPlanSaveVideoParam videoParam, Long planId, Long loginAccountId) {
         ContentPlatformQwPlanVideo item = new ContentPlatformQwPlanVideo();
         item.setPlanId(planId);
         item.setVideoId(videoParam.getVideoId());
@@ -630,6 +631,9 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
                     .collect(Collectors.toMap(ContentPlatformGzhAccount::getGhId, Function.identity()));
             for (GhDetail ghDetail : ghDetailList) {
                 ContentPlatformGzhAccount gzhAccount = gzhAccountMap.get(ghDetail.getGhId());
+                if (Objects.isNull(gzhAccount)) {
+                    continue;
+                }
                 ContentPlatformGzhPlan gzhPlan = new ContentPlatformGzhPlan();
                 if (existsAccountIds.contains(gzhAccount.getId())) {
                     continue;
@@ -656,6 +660,9 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
                     continue;
                 }
                 List<Long> videoIds = JSONObject.parseArray(ghDetail.getVideoIds(), Long.class);
+                if (CollectionUtils.isEmpty(videoIds)) {
+                    continue;
+                }
                 Map<Long, VideoDetail> videoMap = messageAttachmentService.getVideoDetail(new HashSet<>(videoIds));
                 for (Map.Entry<Long, VideoDetail> entry : videoMap.entrySet()) {
                     Long videoId = entry.getKey();

+ 8 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/CgiReplyServiceImpl.java

@@ -106,4 +106,12 @@ public class CgiReplyServiceImpl implements CgiReplyService {
         example.createCriteria().andMiniVideoIdEqualTo(videoId).andIsDeleteEqualTo(0);
         return cgiReplyBucketDataMapper.selectByExample(example);
     }
+
+    @Override
+    public List<CgiReplyBucketData> getCgiReplyBucketDataListByGhIdVideoId(String ghId, List<Long> videoIds, String strategy) {
+        CgiReplyBucketDataExample example = new CgiReplyBucketDataExample();
+        example.createCriteria().andGhIdEqualTo(ghId).andMiniVideoIdIn(videoIds)
+                .andStrategyEqualTo(strategy).andIsDeleteEqualTo(0);
+        return cgiReplyBucketDataMapper.selectByExample(example);
+    }
 }

+ 3 - 0
api-module/src/main/resources/application.properties

@@ -21,6 +21,9 @@ spring.redis.lettuce.pool.max-wait=-1
 spring.redis.lettuce.pool.max-idle=8
 spring.redis.lettuce.pool.min-idle=0
 
+spring.servlet.multipart.max-file-size=100MB
+spring.servlet.multipart.max-request-size=100MB
+
 datalog=/datalog
 
 xxl.job.accessToken=

+ 5 - 3
api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformDataStatMapperExt.xml

@@ -108,7 +108,7 @@
         from content_platform_qw_datastat cpqd
          join content_platform_qw_plan cpqp on cpqp.root_source_id = cpqd.root_source_id
         where cpqp.create_account_id = #{createAccountId}
-          and cpqp.type = 0
+          and cpqp.type = 1
         group by cpqd.date_str) t
     </select>
 
@@ -118,7 +118,7 @@
         from content_platform_qw_datastat cpqd
          join content_platform_qw_plan cpqp on cpqp.root_source_id = cpqd.root_source_id
         where cpqp.create_account_id = #{createAccountId}
-          and cpqp.type = 0
+          and cpqp.type = 1
         group by cpqd.date_str
         order by cpqd.date_str desc
         limit #{offset}, #{pageSize}
@@ -160,5 +160,7 @@
         group by cpa.channel
     </select>
 
-
+    <delete id="deleteQwDatastatTotal">
+        delete from content_platform_qw_datastat_total where date_str = #{dt}
+    </delete>
 </mapper>

+ 16 - 0
api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.xml

@@ -237,4 +237,20 @@
         where video_id = #{videoId}
     </update>
 
+    <select id="getVideoListByIds"
+            resultType="com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformVideo">
+        SELECT t1.*
+        FROM content_platform_video t1
+        INNER JOIN (
+        SELECT video_id, MAX(dt) AS max_dt
+        FROM content_platform_video
+        WHERE video_id IN
+        <foreach collection="videoIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        GROUP BY video_id
+        ) t2 ON t1.video_id = t2.video_id AND t1.dt = t2.max_dt
+        ORDER BY t1.dt DESC
+    </select>
+
 </mapper>

+ 0 - 1
common-module/src/main/java/com/tzld/piaoquan/growth/common/common/constant/WeComConstant.java

@@ -38,7 +38,6 @@ public interface WeComConstant {
     //发送新客户欢迎语
     String POST_WE_COM_SEND_WELCOME_MSG = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_welcome_msg";
 
-
     //用户增加新标签
     String POST_WE_COM_ADD_USER_TAG = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag";
 }

+ 2 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/component/HttpPoolClient.java

@@ -10,6 +10,7 @@ import org.apache.http.entity.mime.MultipartEntityBuilder;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
 import java.io.File;
@@ -22,6 +23,7 @@ import java.nio.charset.StandardCharsets;
 public class HttpPoolClient {
 
     @Autowired
+    @Qualifier("httpClient")
     private CloseableHttpClient httpClient;
 
     public String get(String url) throws IOException {

+ 109 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/component/ProxyHttpPoolClient.java

@@ -0,0 +1,109 @@
+package com.tzld.piaoquan.growth.common.component;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.*;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.nio.charset.StandardCharsets;
+
+@Slf4j
+@Component
+public class ProxyHttpPoolClient {
+
+    @Autowired
+    @Qualifier("proxyHttpClient")
+    private CloseableHttpClient httpClient;
+
+    public String get(String url) throws IOException {
+        HttpGet httpGet = new HttpGet(url);
+        return request(httpGet);
+    }
+
+    public String post(String url) throws IOException {
+        HttpPost httpPost = new HttpPost(url);
+        return request(httpPost);
+    }
+
+
+    public String post(String url, String json) throws IOException {
+        HttpPost httpPost = new HttpPost(url);
+        if (StringUtils.isBlank(json)) {
+            return request(httpPost);
+        }
+        StringEntity entity = new StringEntity(json, StandardCharsets.UTF_8);
+        entity.setContentEncoding("UTF-8");
+        entity.setContentType("application/json");
+        httpPost.setEntity(entity);
+        return request(httpPost);
+    }
+
+
+    public String post(String url, String json, String contentType) throws IOException {
+        HttpPost httpPost = new HttpPost(url);
+        if (StringUtils.isBlank(json)) {
+            return request(httpPost);
+        }
+        StringEntity entity = new StringEntity(json, StandardCharsets.UTF_8);
+        entity.setContentEncoding("UTF-8");
+        entity.setContentType(contentType);
+        httpPost.setEntity(entity);
+        return request(httpPost);
+    }
+
+    public String post(String url, File file) throws IOException {
+        HttpPost uploadFile = new HttpPost(url);
+        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+        builder.addBinaryBody("media", file);
+        uploadFile.setEntity(builder.build());
+        return request(uploadFile);
+    }
+
+    public String request(HttpRequestBase request) throws IOException {
+
+        HttpEntity entity = null;
+        CloseableHttpResponse response = request((HttpUriRequest) request);
+        if (response == null) {
+            log.error("call api exception no response");
+            throw new RuntimeException("call api exception no response");
+        }
+        entity = response.getEntity();
+        String content = null;
+        if (entity != null) {
+            content = EntityUtils.toString(entity, "UTF-8");
+        }
+        int httpStatus = response.getStatusLine().getStatusCode();
+        if (httpStatus == HttpStatus.SC_OK) {
+            return content;
+        }
+        String path = request.getURI().toString();
+        log.error("http call api {} fail response status {} content {}", path, httpStatus, content);
+        return null;
+    }
+
+
+    public CloseableHttpResponse request(HttpUriRequest request) {
+        try {
+            return httpClient.execute(request);
+        } catch (Exception e) {
+            String path = request.getURI().toString();
+            if (e instanceof SocketTimeoutException) {
+                log.error(String.format("http timeout request url = %s .", path));
+            }
+            throw new RuntimeException(String.format("http exception request url = %s ", path), e);
+        }
+    }
+
+
+}

+ 23 - 1
common-module/src/main/java/com/tzld/piaoquan/growth/common/config/HttpClientConfig.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.growth.common.config;
 
+import org.apache.http.HttpHost;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
@@ -42,7 +43,7 @@ public class HttpClientConfig {
     private static final int CONNECTION_WAIT_TIMEOUT = 5000;
 
 
-    @Bean
+    @Bean(name = "httpClient")
     public CloseableHttpClient httpClient() {
 
         RequestConfig requestConfig = RequestConfig.custom()
@@ -61,4 +62,25 @@ public class HttpClientConfig {
                 .setRetryHandler(new DefaultHttpRequestRetryHandler(RETRY_COUNT, false))
                 .build();
     }
+
+    @Bean(name = "proxyHttpClient")
+    public CloseableHttpClient proxyHttpClient() {
+        HttpHost proxy = new HttpHost("121.43.150.231", 3128, "http");
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setConnectTimeout(CONNECTION_TIMEOUT)
+                .setSocketTimeout(SOCKET_TIMEOUT)
+                .setConnectionRequestTimeout(CONNECTION_WAIT_TIMEOUT)
+                .build();
+
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+        connectionManager.setMaxTotal(MAX_TOTAL); // 设置最大连接数
+        connectionManager.setDefaultMaxPerRoute(MAX_PER_ROUTE); // 每个路由的最大连接数
+
+        return HttpClientBuilder.create()
+                .setProxy(proxy)
+                .setDefaultRequestConfig(requestConfig)
+                .setConnectionManager(connectionManager)
+                .setRetryHandler(new DefaultHttpRequestRetryHandler(RETRY_COUNT, false))
+                .build();
+    }
 }

+ 37 - 42
common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/MessageAttachmentServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import com.tzld.piaoquan.growth.common.common.enums.MessageAttachmentTypeEnum;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.GuaranteesVideoMapper;
 import com.tzld.piaoquan.growth.common.dao.mapper.MessageAttachmentMapper;
 import com.tzld.piaoquan.growth.common.model.bo.AdPutFlowParam;
@@ -52,6 +53,9 @@ public class MessageAttachmentServiceImpl implements MessageAttachmentService {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
     @Autowired
     private WeComAccessTokenService weComAccessTokenService;
 
@@ -329,52 +333,43 @@ public class MessageAttachmentServiceImpl implements MessageAttachmentService {
         if (StringUtils.isNotEmpty(mediaId)) {
             return mediaId;
         }
-        if (corpId == 1L) {
-            String filePath = UUID.randomUUID() + ".jpg"; // 临时文件路径
-            try {
-                HttpURLConnection httpUrl = (HttpURLConnection) new URL(cover).openConnection();
-                httpUrl.connect();
-                InputStream inputStream = httpUrl.getInputStream();
-
-                // 将文件内容写入临时文件
-                try (OutputStream outputStream = Files.newOutputStream(Paths.get(filePath))) {
-                    byte[] buffer = new byte[4096];
-                    int bytesRead;
-                    while ((bytesRead = inputStream.read(buffer)) != -1) {
-                        outputStream.write(buffer, 0, bytesRead);
-                    }
-                }
-                inputStream.close();
-                httpUrl.disconnect();
-                File file = new File(filePath);
-                String weComAccessToken = weComAccessTokenService.getWeComAccessToken(corpId);
-                String url = String.format(POST_WE_COM_MEDIA_UPLOAD + "?access_token=%s&type=%s", weComAccessToken, "image");
-                String res = httpPoolClient.post(url, file);
-                JSONObject jsonObject = JSONObject.parseObject(res);
-                if (jsonObject != null && jsonObject.getInteger("errcode") == 0) {
-                    mediaId = jsonObject.getString("media_id");
-                    redisTemplate.opsForValue().set(key, mediaId, 2, TimeUnit.DAYS);
+
+        String filePath = UUID.randomUUID() + ".jpg"; // 临时文件路径
+        try {
+            HttpURLConnection httpUrl = (HttpURLConnection) new URL(cover).openConnection();
+            httpUrl.connect();
+            InputStream inputStream = httpUrl.getInputStream();
+
+            // 将文件内容写入临时文件
+            try (OutputStream outputStream = Files.newOutputStream(Paths.get(filePath))) {
+                byte[] buffer = new byte[4096];
+                int bytesRead;
+                while ((bytesRead = inputStream.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, bytesRead);
                 }
-                Files.delete(Paths.get(filePath));
-            } catch (Exception e) {
-                log.error("getPicMediaId error", e);
             }
-            return mediaId;
-        } else {
-            try {
-                String weComAccessToken = weComAccessTokenService.getWeComAccessToken(corpId);
-                String url = String.format(POST_WE_COM_MEDIA_UPLOAD + "?access_token=%s&type=%s", weComAccessToken, "image");
-                String res = weComSendService.sendPostFile(url, cover);
-                JSONObject jsonObject = JSONObject.parseObject(res);
-                if (jsonObject != null && jsonObject.getInteger("errcode") == 0) {
-                    mediaId = jsonObject.getString("media_id");
-                    redisTemplate.opsForValue().set(key, mediaId, 2, TimeUnit.DAYS);
-                }
-            } catch (Exception e) {
-                log.error("getPicMediaId error", e);
+            inputStream.close();
+            httpUrl.disconnect();
+            File file = new File(filePath);
+            String weComAccessToken = weComAccessTokenService.getWeComAccessToken(corpId);
+            String url = String.format(POST_WE_COM_MEDIA_UPLOAD + "?access_token=%s&type=%s", weComAccessToken, "image");
+            String res;
+            if (corpId == 1L) {
+                res = httpPoolClient.post(url, file);
+            } else {
+                res = proxyHttpPoolClient.post(url, file);
             }
-            return mediaId;
+            JSONObject jsonObject = JSONObject.parseObject(res);
+            if (jsonObject != null && jsonObject.getInteger("errcode") == 0) {
+                mediaId = jsonObject.getString("media_id");
+                redisTemplate.opsForValue().set(key, mediaId, 2, TimeUnit.DAYS);
+            }
+            Files.delete(Paths.get(filePath));
+        } catch (Exception e) {
+            log.error("getPicMediaId error", e);
         }
+        return mediaId;
+
     }
 
 

+ 6 - 2
common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/MessageServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import com.tzld.piaoquan.growth.common.common.constant.MessageConstant;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.PreSpecialSendMessageMapper;
 import com.tzld.piaoquan.growth.common.model.bo.MsgResult;
 import com.tzld.piaoquan.growth.common.model.po.PreSpecialSendMessage;
@@ -31,6 +32,9 @@ public class MessageServiceImpl implements MessageService {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
     @Autowired
     private WeComAccessTokenService weComAccessTokenService;
 
@@ -51,7 +55,7 @@ public class MessageServiceImpl implements MessageService {
             if (corpId == 1L) {
                 s = httpPoolClient.post(url, jsonObject.toJSONString());
             } else {
-                s = weComSendService.sendPost(url, jsonObject.toJSONString());
+                s = proxyHttpPoolClient.post(url, jsonObject.toJSONString());
             }
             JSONObject res = JSONObject.parseObject(s);
             log.info("pushWeComMessage res={}", res);
@@ -100,7 +104,7 @@ public class MessageServiceImpl implements MessageService {
             if (corpId == 1L) {
                 s = httpPoolClient.post(url, jsonObject.toJSONString());
             } else {
-                s = weComSendService.sendPost(url, jsonObject.toJSONString());
+                s = proxyHttpPoolClient.post(url, jsonObject.toJSONString());
             }
             JSONObject res = JSONObject.parseObject(s);
             log.info("sendAutoReplyMessage res={}", res);

+ 12 - 2
common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/WeComAccessTokenServiceImpl.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.growth.common.service.Impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.CorpMapper;
 import com.tzld.piaoquan.growth.common.model.po.Corp;
 import com.tzld.piaoquan.growth.common.model.po.CorpExample;
@@ -28,6 +29,9 @@ public class WeComAccessTokenServiceImpl implements WeComAccessTokenService {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
@@ -52,8 +56,14 @@ public class WeComAccessTokenServiceImpl implements WeComAccessTokenService {
             Corp corp = corps.get(0);
             String cropId = corp.getCorpId();
             String secret = corp.getSecret();
-            String res = httpPoolClient.get(String.format(GET_WE_COM_ACCESS_TOKEN_URL +
-                    "?corpid=%s&corpsecret=%s", cropId, secret));
+            String res;
+            if (corpId == 1L) {
+                res = httpPoolClient.get(String.format(GET_WE_COM_ACCESS_TOKEN_URL +
+                        "?corpid=%s&corpsecret=%s", cropId, secret));
+            } else {
+                res = proxyHttpPoolClient.get(String.format(GET_WE_COM_ACCESS_TOKEN_URL +
+                        "?corpid=%s&corpsecret=%s", cropId, secret));
+            }
             JSONObject jsonObject = JSONObject.parseObject(res);
             Long expiresIn = jsonObject.getLong("expires_in");
             String newAccessToken = jsonObject.getString("access_token");

+ 5 - 1
common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/WeComUserServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import com.tzld.piaoquan.growth.common.common.enums.PreSpecialStatusEnum;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.*;
 import com.tzld.piaoquan.growth.common.dao.mapper.ext.WeComUserMapperExt;
 import com.tzld.piaoquan.growth.common.model.bo.GroupSendWeComUserParam;
@@ -40,6 +41,9 @@ public class WeComUserServiceImpl implements WeComUserService {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
     @Autowired
     private WeComAccessTokenService weComAccessTokenService;
 
@@ -241,7 +245,7 @@ public class WeComUserServiceImpl implements WeComUserService {
             if (corpId == 1L) {
                 res = httpPoolClient.get(url);
             } else {
-                res = weComSendService.sendGet(url);
+                res = proxyHttpPoolClient.get(url);
             }
             JSONObject jsonObject = JSONObject.parseObject(res);
             Integer errcode = jsonObject.getInteger("errcode");

+ 13 - 5
offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComHistoryDataJob.java

@@ -7,6 +7,7 @@ import com.tzld.piaoquan.growth.common.common.constant.MessageConstant;
 import com.tzld.piaoquan.growth.common.common.constant.TimeConstant;
 import com.tzld.piaoquan.growth.common.common.enums.MessageAttachmentTypeEnum;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.*;
 import com.tzld.piaoquan.growth.common.model.bo.ExternalUser;
 import com.tzld.piaoquan.growth.common.model.bo.MiniprogramRecord;
@@ -45,6 +46,9 @@ public class WeComHistoryDataJob {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
     @Autowired
     private WeComAccessTokenService weComAccessTokenService;
 
@@ -113,12 +117,16 @@ public class WeComHistoryDataJob {
         for (Corp corp : corps) {
             selectGroupMsgList(startTime, endTime, corp.getId(), null);
         }
+        boolean isAllSend = true;
         for (Corp corp : corps) {
             long notSentCount = newSelectAlertHistoryMessage(startTime, endTime + TimeConstant.HOUR, corp.getId(), corp.getName());
-            if (notSentCount == 0) {
-                redisTemplate.opsForValue().set(START_TIME_KEY, endTime, 1, TimeUnit.DAYS);
+            if (notSentCount > 0) {
+                isAllSend = false;
             }
         }
+        if (isAllSend) {
+            redisTemplate.opsForValue().set(START_TIME_KEY, endTime, 1, TimeUnit.DAYS);
+        }
         return ReturnT.SUCCESS;
     }
 
@@ -454,7 +462,7 @@ public class WeComHistoryDataJob {
         if (corpId == 1L) {
             return httpPoolClient.post(url, param.toJSONString());
         } else {
-            return weComSendService.sendPost(url, param.toJSONString());
+            return proxyHttpPoolClient.post(url, param.toJSONString());
         }
     }
 
@@ -498,7 +506,7 @@ public class WeComHistoryDataJob {
         if (corpId == 1L) {
             return httpPoolClient.post(url, param.toJSONString());
         } else {
-            return weComSendService.sendPost(url, param.toJSONString());
+            return proxyHttpPoolClient.post(url, param.toJSONString());
         }
     }
 
@@ -635,7 +643,7 @@ public class WeComHistoryDataJob {
         if (corpId == 1L) {
             return httpPoolClient.post(url, param.toJSONString());
         } else {
-            return weComSendService.sendPost(url, param.toJSONString());
+            return proxyHttpPoolClient.post(url, param.toJSONString());
         }
     }
 

+ 5 - 1
offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComStaffDataJob.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.offline.job;
 
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.CorpMapper;
 import com.tzld.piaoquan.growth.common.dao.mapper.StaffMapper;
 import com.tzld.piaoquan.growth.common.model.bo.XxlJobParam;
@@ -33,6 +34,9 @@ public class WeComStaffDataJob {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
     @Autowired
     private WeComAccessTokenService weComAccessTokenService;
 
@@ -92,7 +96,7 @@ public class WeComStaffDataJob {
         if (corpId == 1L) {
             res = httpPoolClient.get(url);
         } else {
-            res = weComSendService.sendGet(url);
+            res = proxyHttpPoolClient.get(url);
         }
         log.info("getCarrierIdList corp = {}, res={}", corpId, res);
         JSONObject jsonObject = JSONObject.parseObject(res);

+ 8 - 2
offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComUserDataJob.java

@@ -3,6 +3,7 @@ package com.tzld.piaoquan.offline.job;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.growth.common.component.HttpPoolClient;
+import com.tzld.piaoquan.growth.common.component.ProxyHttpPoolClient;
 import com.tzld.piaoquan.growth.common.dao.mapper.*;
 import com.tzld.piaoquan.growth.common.model.bo.XxlJobParam;
 import com.tzld.piaoquan.growth.common.model.po.*;
@@ -36,6 +37,10 @@ public class WeComUserDataJob {
     @Autowired
     private HttpPoolClient httpPoolClient;
 
+    @Autowired
+    private ProxyHttpPoolClient proxyHttpPoolClient;
+
+
     @Autowired
     private StaffMapper staffMapper;
 
@@ -188,7 +193,7 @@ public class WeComUserDataJob {
         if (corpId == 1L) {
             return httpPoolClient.post(url, param.toJSONString());
         } else {
-            return weComSendService.sendPost(url, param.toJSONString());
+            return proxyHttpPoolClient.post(url, param.toJSONString());
         }
     }
 
@@ -249,7 +254,7 @@ public class WeComUserDataJob {
         if (corpId == 1L) {
             res = httpPoolClient.get(url);
         } else {
-            res = weComSendService.sendGet(url);
+            res = proxyHttpPoolClient.get(url);
         }
         JSONObject jsonObject = JSONObject.parseObject(res);
         Integer errcode = jsonObject.getInteger("errcode");
@@ -263,6 +268,7 @@ public class WeComUserDataJob {
     public ReturnT<String> statisticsUserCount(String param) {
         refreshTag();
         StaffExample staffExample = new StaffExample();
+        staffExample.createCriteria().andIsDeleteEqualTo(0);
         List<Staff> staffList = staffMapper.selectByExample(staffExample);
         String date;
         if (StringUtils.isEmpty(param)) {