ソースを参照

Merge branch 'test'

# Conflicts:
#	jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-dev.yml
zhaoxian 2 年 前
コミット
fc1e4f45d2
28 ファイル変更2935 行追加20 行削除
  1. 1 0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
  2. 106 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/controller/KuaiShouOperationRecordController.java
  3. 557 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/entity/KuaishouUnitReportDailyPojo.java
  4. 587 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/entity/KuaishouUnitReportHourlyPojo.java
  5. 54 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/KuaishouOperationRecordMapper.java
  6. 78 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/xml/KuaishouOperationRecordMapper.xml
  7. 27 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/KuaishouOperationRecordService.java
  8. 140 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/impl/KuaishouOperationRecordServiceImpl.java
  9. 83 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/utils/FeidNotNullUtils.java
  10. 4 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/mapper/MaterialTagInfoMapper.java
  11. 5 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialTagInfoMapper.xml
  12. 3 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/IMaterialTagInfoService.java
  13. 2 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/IMessageTemplate.java
  14. 5 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/impl/MaterialTagInfoServiceImpl.java
  15. 22 2
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/impl/MessageTemplateImpl.java
  16. 57 1
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/HttpUtils.java
  17. 57 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/KuaishouDuXiaoManAPIConstant.java
  18. 22 3
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java
  19. 39 1
      jeecg-boot-module-system/src/main/java/cn/com/ctop/shiwan/modules/FileUtil.java
  20. 282 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/controller/DuxiaomanMaterialInfoController.java
  21. 174 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/entity/DuxiaomanMaterialInfo.java
  22. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/mapper/DuxiaomanMaterialInfoMapper.java
  23. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/mapper/xml/DuxiaomanMaterialInfoMapper.xml
  24. 39 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/service/IDuxiaomanMaterialInfoService.java
  25. 543 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/service/impl/DuxiaomanMaterialInfoServiceImpl.java
  26. 16 11
      jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-dev.yml
  27. 6 1
      jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-prod.yml
  28. 6 1
      jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-test.yml

+ 1 - 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java

@@ -251,6 +251,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/product/material/**", "anon");
         filterChainDefinitionMap.put("/ctop/materialInfo/**", "anon");
         filterChainDefinitionMap.put("/summary/report/**", "anon");
+        filterChainDefinitionMap.put("/duxiaoman/materialInfo/**", "anon");
 
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<>(1);

+ 106 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/controller/KuaiShouOperationRecordController.java

@@ -0,0 +1,106 @@
+package org.jeecg.ctop.material.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.ctop.material.constants.Check;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateAccountVo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateProjectVo;
+import org.jeecg.ctop.material.mapper.MaterialStareMapper;
+import org.jeecg.ctop.material.service.KuaishouOperationRecordService;
+import org.jeecg.ctop.material.service.MaterialStareService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 快手-账户操作记录
+ */
+@Slf4j
+@RestController
+@RequestMapping("/kuaiShouOpreate/kuaiShouOperationRecordController")
+public class KuaiShouOperationRecordController {
+
+
+    @Autowired
+    MaterialStareService materialStareService;
+
+    @Autowired
+    private MaterialStareMapper materialStareMapper;
+
+    @Autowired
+    private KuaishouOperationRecordService kuaishouOperationRecordService;
+
+
+
+
+    /**
+     *
+     * @description: 运营人员账户查询成功
+     *
+     * @param userId
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     */
+    @GetMapping("/getAllSubordinateAccountByUserId")
+    public Result<JSONObject> getAllSubordinateAccountByUserId(@RequestParam(name="userId") String userId) {
+        return kuaishouOperationRecordService.getAllSubordinateAccountByUserId(userId);
+    }
+
+
+
+    /**
+     *
+     * @description: 消耗前10的广告组
+     *
+     * @param userId
+     * @param advertiserId
+     * @param startTime
+     * @param endTime
+     * @return: org.jeecg.common.api.vo.Result<com.alibaba.fastjson.JSONObject>
+     * @author: zianY
+     */
+    @GetMapping("/getKuaishouUnitChargeTopTenByAccountId")
+    public Result<JSONObject> getKuaishouUnitChargeTopTenByAccountId(@RequestParam(name="userId") String userId,
+                                                                    @RequestParam(name="advertiserId") long advertiserId,
+                                                                     @RequestParam(name="startTime") String startTime,
+                                                                     @RequestParam(name="endTime") String endTime) throws Exception{
+
+
+        return kuaishouOperationRecordService.getKuaishouUnitChargeTopTenByAccountId(userId,advertiserId,startTime,endTime);
+    }
+
+
+
+    @GetMapping("/getKuaishouOperationRecordByUnit")
+    public Result<JSONObject> getKuaishouOperationRecordByUnit(@RequestParam(name="advertiserId") long advertiserId,
+                                                                    @RequestParam(name="unitId") long unitId,
+                                                                     @RequestParam(name="startTime") String startTime,
+                                                                     @RequestParam(name="endTime") String endTime) throws Exception{
+
+
+        return kuaishouOperationRecordService.getKuaishouOperationRecordByUnit(advertiserId,unitId,startTime,endTime);
+    }
+
+
+
+
+
+
+}

+ 557 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/entity/KuaishouUnitReportDailyPojo.java

@@ -0,0 +1,557 @@
+package org.jeecg.ctop.material.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 快手-组-日报
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2022-02-22
+ */
+@Data
+@TableName("kuaishou_unit_report_daily")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "kuaishou_unit_report_daily", description = "快手-组-日报")
+public class KuaishouUnitReportDailyPojo {
+
+    /** 广告主id */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /** 数据日期,格式:YYYYMMDD */
+    @Excel(name = "数据日期,格式:YYYYMMDD", width = 15)
+    @ApiModelProperty(value = "数据日期,格式:YYYYMMDD")
+    private Integer statDate;
+    /** 广告计划ID */
+    @Excel(name = "广告计划ID", width = 15)
+    @ApiModelProperty(value = "广告计划ID")
+    private Long campaignId;
+    /** 广告计划名称 */
+    @Excel(name = "广告计划名称", width = 15)
+    @ApiModelProperty(value = "广告计划名称")
+    private String campaignName;
+    /** 广告组ID */
+    @Excel(name = "广告组ID", width = 15)
+    @ApiModelProperty(value = "广告组ID")
+    private Long unitId;
+    /** 广告组名称 */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String unitName;
+    /** 花费(元) */
+    @Excel(name = "花费(元)", width = 15)
+    @ApiModelProperty(value = "花费(元)")
+    private java.math.BigDecimal charge;
+    /** 封面曝光数 */
+    @Excel(name = "封面曝光数", width = 15)
+    @ApiModelProperty(value = "封面曝光数")
+    private Long show;
+    /** 封面点击数 */
+    @Excel(name = "封面点击数", width = 15)
+    @ApiModelProperty(value = "封面点击数")
+    private Long photoClick;
+    /** 素材曝光数 */
+    @Excel(name = "素材曝光数", width = 15)
+    @ApiModelProperty(value = "素材曝光数")
+    private Long aclick;
+    /** 行为数 */
+    @Excel(name = "行为数", width = 15)
+    @ApiModelProperty(value = "行为数")
+    private Long bclick;
+    /** 封面点击率 */
+    @Excel(name = "封面点击率", width = 15)
+    @ApiModelProperty(value = "封面点击率")
+    private java.math.BigDecimal photoClickRatio;
+    /** 3s播放率 */
+    @Excel(name = "3s播放率", width = 15)
+    @ApiModelProperty(value = "3s播放率")
+    private java.math.BigDecimal play3sRatio;
+    /** 行为率 */
+    @Excel(name = "行为率", width = 15)
+    @ApiModelProperty(value = "行为率")
+    private java.math.BigDecimal actionRatio;
+    /** 平均千次曝光花费(元) */
+    @Excel(name = "平均千次曝光花费(元)", width = 15)
+    @ApiModelProperty(value = "平均千次曝光花费(元)")
+    private java.math.BigDecimal impression1kCost;
+    /** 平均点击单价(元) */
+    @Excel(name = "平均点击单价(元)", width = 15)
+    @ApiModelProperty(value = "平均点击单价(元)")
+    private java.math.BigDecimal photoClickCost;
+    /** 平均行为单价(元) */
+    @Excel(name = "平均行为单价(元)", width = 15)
+    @ApiModelProperty(value = "平均行为单价(元)")
+    private java.math.BigDecimal actionCost;
+    /** 分享数 */
+    @Excel(name = "分享数", width = 15)
+    @ApiModelProperty(value = "分享数")
+    private Long share;
+    /** 评论数 */
+    @Excel(name = "评论数", width = 15)
+    @ApiModelProperty(value = "评论数")
+    private Long comment;
+    /** 点赞数 */
+    @Excel(name = "点赞数", width = 15)
+    @ApiModelProperty(value = "点赞数")
+    private Long like;
+    /** 新增关注数 */
+    @Excel(name = "新增关注数", width = 15)
+    @ApiModelProperty(value = "新增关注数")
+    private Long follow;
+    /** 取消关注数 */
+    @Excel(name = "取消关注数", width = 15)
+    @ApiModelProperty(value = "取消关注数")
+    private Long cancelFollow;
+    /** 举报数 */
+    @Excel(name = "举报数", width = 15)
+    @ApiModelProperty(value = "举报数")
+    private Long report;
+    /** 拉黑数 */
+    @Excel(name = "拉黑数", width = 15)
+    @ApiModelProperty(value = "拉黑数")
+    private Long block;
+    /** 减少此类作品数 */
+    @Excel(name = "减少此类作品数", width = 15)
+    @ApiModelProperty(value = "减少此类作品数")
+    private Long negative;
+    /** 提交按钮点击数(历史字段,同下方“表单提交数”,预计年底删除该字段) */
+    @Excel(name = "提交按钮点击数(历史字段,同下方“表单提交数”,预计年底删除该字段)", width = 15)
+    @ApiModelProperty(value = "提交按钮点击数(历史字段,同下方“表单提交数”,预计年底删除该字段)")
+    private Long submit;
+    /** 应用下载数据-安卓下载开始数 */
+    @Excel(name = "应用下载数据-安卓下载开始数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-安卓下载开始数")
+    private Long downloadStarted;
+    /** 应用下载数据-安卓下载完成数 */
+    @Excel(name = "应用下载数据-安卓下载完成数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-安卓下载完成数")
+    private Long downloadCompleted;
+    /** 应用下载数据-激活数 */
+    @Excel(name = "应用下载数据-激活数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-激活数")
+    private Long activation;
+    /** 应用下载数据-首日付费次数 */
+    @Excel(name = "应用下载数据-首日付费次数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-首日付费次数")
+    private Long eventPayFirstDay;
+    /** 应用下载数据-首日付费金额 */
+    @Excel(name = "应用下载数据-首日付费金额", width = 15)
+    @ApiModelProperty(value = "应用下载数据-首日付费金额")
+    private java.math.BigDecimal eventPayPurchaseAmountFirstDay;
+    /** 应用下载数据-首日ROI */
+    @Excel(name = "应用下载数据-首日ROI", width = 15)
+    @ApiModelProperty(value = "应用下载数据-首日ROI")
+    private java.math.BigDecimal eventPayFirstDayRoi;
+    /** 应用下载数据-付费次数 */
+    @Excel(name = "应用下载数据-付费次数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付费次数")
+    private Long eventPay;
+    /** 应用下载数据-付费金额 */
+    @Excel(name = "应用下载数据-付费金额", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付费金额")
+    private java.math.BigDecimal eventPayPurchaseAmount;
+    /** 应用下载数据-ROI */
+    @Excel(name = "应用下载数据-ROI", width = 15)
+    @ApiModelProperty(value = "应用下载数据-ROI")
+    private java.math.BigDecimal eventPayRoi;
+    /** 应用下载数据-注册数 */
+    @Excel(name = "应用下载数据-注册数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-注册数")
+    private Long eventRegister;
+    /** 应用下载数据-注册成本 */
+    @Excel(name = "应用下载数据-注册成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-注册成本")
+    private java.math.BigDecimal eventRegisterCost;
+    /** 应用下载数据-注册率 */
+    @Excel(name = "应用下载数据-注册率", width = 15)
+    @ApiModelProperty(value = "应用下载数据-注册率")
+    private java.math.BigDecimal eventRegisterRatio;
+    /** 应用下载数据-完件数 */
+    @Excel(name = "应用下载数据-完件数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-完件数")
+    private Long eventJinJianApp;
+    /** 应用下载数据-完件成本 */
+    @Excel(name = "应用下载数据-完件成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-完件成本")
+    private java.math.BigDecimal eventJinJianAppCost;
+    /** 应用下载数据-授信数 */
+    @Excel(name = "应用下载数据-授信数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-授信数")
+    private Long eventCreditGrantApp;
+    /** 应用下载数据-授信成本 */
+    @Excel(name = "应用下载数据-授信成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-授信成本")
+    private java.math.BigDecimal eventCreditGrantAppCost;
+    /** 应用下载数据-授信率 */
+    @Excel(name = "应用下载数据-授信率", width = 15)
+    @ApiModelProperty(value = "应用下载数据-授信率")
+    private java.math.BigDecimal eventCreditGrantAppRatio;
+    /** 应用下载数据-付款成功数 */
+    @Excel(name = "应用下载数据-付款成功数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付款成功数")
+    private Long eventOrderPaid;
+    /** 应用下载数据-付款成功金额 */
+    @Excel(name = "应用下载数据-付款成功金额", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付款成功金额")
+    private java.math.BigDecimal eventOrderPaidPurchaseAmount;
+    /** 应用下载数据-单次付款成本 */
+    @Excel(name = "应用下载数据-单次付款成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-单次付款成本")
+    private java.math.BigDecimal eventOrderPaidCost;
+    /** 应用下载数据-次留数(仅支持分日查询) */
+    @Excel(name = "应用下载数据-次留数(仅支持分日查询)", width = 15)
+    @ApiModelProperty(value = "应用下载数据-次留数(仅支持分日查询)")
+    private Long eventNextDayStay;
+    /** 应用下载数据-次留成本(仅支持分日查询) */
+    @Excel(name = "应用下载数据-次留成本(仅支持分日查询)", width = 15)
+    @ApiModelProperty(value = "应用下载数据-次留成本(仅支持分日查询)")
+    private java.math.BigDecimal eventNextDayStayCost;
+    /** 应用下载数据-次留率(仅支持分日查询) */
+    @Excel(name = "应用下载数据-次留率(仅支持分日查询)", width = 15)
+    @ApiModelProperty(value = "应用下载数据-次留率(仅支持分日查询)")
+    private java.math.BigDecimal eventNextDayStayRatio;
+    /** 落地页数据-表单提交数 */
+    @Excel(name = "落地页数据-表单提交数", width = 15)
+    @ApiModelProperty(value = "落地页数据-表单提交数")
+    private Long formCount;
+    /** 落地页数据-表单提交单价 */
+    @Excel(name = "落地页数据-表单提交单价", width = 15)
+    @ApiModelProperty(value = "落地页数据-表单提交单价")
+    private java.math.BigDecimal formCost;
+    /** 落地页数据-表单提交点击率 */
+    @Excel(name = "落地页数据-表单提交点击率", width = 15)
+    @ApiModelProperty(value = "落地页数据-表单提交点击率")
+    private java.math.BigDecimal formActionRatio;
+    /** 落地页数据-落地页完件数 */
+    @Excel(name = "落地页数据-落地页完件数", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页完件数")
+    private Long eventJinJianLandingPage;
+    /** 落地页数据-落地页完件成本 */
+    @Excel(name = "落地页数据-落地页完件成本", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页完件成本")
+    private java.math.BigDecimal eventJinJianLandingPageCost;
+    /** 落地页数据-落地页授信数 */
+    @Excel(name = "落地页数据-落地页授信数", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页授信数")
+    private Long eventCreditGrantLandingPage;
+    /** 落地页数据-落地页授信成本 */
+    @Excel(name = "落地页数据-落地页授信成本", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页授信成本")
+    private java.math.BigDecimal eventCreditGrantLandingPageCost;
+    /** 落地页数据-落地页授信率 */
+    @Excel(name = "落地页数据-落地页授信率", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页授信率")
+    private java.math.BigDecimal eventCreditGrantLandingPageRatio;
+    /** 落地页数据-有效线索数 */
+    @Excel(name = "落地页数据-有效线索数", width = 15)
+    @ApiModelProperty(value = "落地页数据-有效线索数")
+    private Long eventValidClues;
+    /** 落地页数据-有效线索成本 */
+    @Excel(name = "落地页数据-有效线索成本", width = 15)
+    @ApiModelProperty(value = "落地页数据-有效线索成本")
+    private java.math.BigDecimal eventValidCluesCost;
+    /** 微信复制数 */
+    @Excel(name = "微信复制数", width = 15)
+    @ApiModelProperty(value = "微信复制数")
+    private Long eventAddWechat;
+    /** 微信复制成本 */
+    @Excel(name = "微信复制成本", width = 15)
+    @ApiModelProperty(value = "微信复制成本")
+    private java.math.BigDecimal eventAddWechatCost;
+    /** 微信复制率 */
+    @Excel(name = "微信复制率", width = 15)
+    @ApiModelProperty(value = "微信复制率")
+    private java.math.BigDecimal eventAddWechatRatio;
+    /** 智能电话-确认接通数 */
+    @Excel(name = "智能电话-确认接通数", width = 15)
+    @ApiModelProperty(value = "智能电话-确认接通数")
+    private Long eventGetThrough;
+    /** 智能电话-确认接通成本 */
+    @Excel(name = "智能电话-确认接通成本", width = 15)
+    @ApiModelProperty(value = "智能电话-确认接通成本")
+    private java.math.BigDecimal eventGetThroughCost;
+    /** 智能电话-确认接通率 */
+    @Excel(name = "智能电话-确认接通率", width = 15)
+    @ApiModelProperty(value = "智能电话-确认接通率")
+    private java.math.BigDecimal eventGetThroughRatio;
+    /** 唤醒应用数 */
+    @Excel(name = "唤醒应用数", width = 15)
+    @ApiModelProperty(value = "唤醒应用数")
+    private Long eventAppInvoked;
+    /** 唤醒应用成本 */
+    @Excel(name = "唤醒应用成本", width = 15)
+    @ApiModelProperty(value = "唤醒应用成本")
+    private java.math.BigDecimal eventAppInvokedCost;
+    /** 唤醒应用率 */
+    @Excel(name = "唤醒应用率", width = 15)
+    @ApiModelProperty(value = "唤醒应用率")
+    private java.math.BigDecimal eventAppInvokedRatio;
+    /** 落地页授信率 */
+    @Excel(name = "落地页授信率", width = 15)
+    @ApiModelProperty(value = "落地页授信率")
+    private java.math.BigDecimal eventCreditGrantLandingRatio;
+    /** 5s播放率 */
+    @Excel(name = "5s播放率", width = 15)
+    @ApiModelProperty(value = "5s播放率")
+    private java.math.BigDecimal play5sRatio;
+    /** 完播率 */
+    @Excel(name = "完播率", width = 15)
+    @ApiModelProperty(value = "完播率")
+    private java.math.BigDecimal playEndRatio;
+    /** 新增付费人数 */
+    @Excel(name = "新增付费人数", width = 15)
+    @ApiModelProperty(value = "新增付费人数")
+    private java.math.BigDecimal eventNewUserPay;
+    /** 新增付费人数成本 */
+    @Excel(name = "新增付费人数成本", width = 15)
+    @ApiModelProperty(value = "新增付费人数成本")
+    private java.math.BigDecimal eventNewUserPayCost;
+    /** 新增付费人数率 */
+    @Excel(name = "新增付费人数率", width = 15)
+    @ApiModelProperty(value = "新增付费人数率")
+    private java.math.BigDecimal eventNewUserPayRatio;
+    /** 平均千次素材曝光花费(元) */
+    @Excel(name = "平均千次素材曝光花费(元)", width = 15)
+    @ApiModelProperty(value = "平均千次素材曝光花费(元)")
+    private java.math.BigDecimal click1kCost;
+    /** 商品成交数 */
+    @Excel(name = "商品成交数", width = 15)
+    @ApiModelProperty(value = "商品成交数")
+    private Long adProductCnt;
+    /** 商品访问数 */
+    @Excel(name = "商品访问数", width = 15)
+    @ApiModelProperty(value = "商品访问数")
+    private Long eventGoodsView;
+    /** 涨粉量 */
+    @Excel(name = "涨粉量", width = 15)
+    @ApiModelProperty(value = "涨粉量")
+    private Long merchantRecoFans;
+    /** 小店推广roi */
+    @Excel(name = "小店推广roi", width = 15)
+    @ApiModelProperty(value = "小店推广roi")
+    private java.math.BigDecimal eventOrderAmountRoi;
+    /** 商品访问成本 */
+    @Excel(name = "商品访问成本", width = 15)
+    @ApiModelProperty(value = "商品访问成本")
+    private java.math.BigDecimal eventGoodsViewCost;
+    /** 涨粉成本 */
+    @Excel(name = "涨粉成本", width = 15)
+    @ApiModelProperty(value = "涨粉成本")
+    private java.math.BigDecimal merchantRecoFansCost;
+    /** 按钮点击数 */
+    @Excel(name = "按钮点击数", width = 15)
+    @ApiModelProperty(value = "按钮点击数")
+    private Long eventButtonClick;
+    /** 按钮点击成本 */
+    @Excel(name = "按钮点击成本", width = 15)
+    @ApiModelProperty(value = "按钮点击成本")
+    private java.math.BigDecimal eventButtonClickCost;
+    /** 按钮点击率 */
+    @Excel(name = "按钮点击率", width = 15)
+    @ApiModelProperty(value = "按钮点击率")
+    private java.math.BigDecimal eventButtonClickRatio;
+    /** 订单支付率 */
+    @Excel(name = "订单支付率", width = 15)
+    @ApiModelProperty(value = "订单支付率")
+    private java.math.BigDecimal eventOrderPaidRoi;
+    /** 新增完件人数 */
+    @Excel(name = "新增完件人数", width = 15)
+    @ApiModelProperty(value = "新增完件人数")
+    private Long eventNewUserJinjianApp;
+    /** 新增完件成本 */
+    @Excel(name = "新增完件成本", width = 15)
+    @ApiModelProperty(value = "新增完件成本")
+    private java.math.BigDecimal eventNewUserJinjianAppCost;
+    /** 新增完件人数率 */
+    @Excel(name = "新增完件人数率", width = 15)
+    @ApiModelProperty(value = "新增完件人数率")
+    private java.math.BigDecimal eventNewUserJinjianAppRoi;
+    /** 新增授信人数 */
+    @Excel(name = "新增授信人数", width = 15)
+    @ApiModelProperty(value = "新增授信人数")
+    private Long eventNewUserCreditGrantApp;
+    /** 新增授信人数成本 */
+    @Excel(name = "新增授信人数成本", width = 15)
+    @ApiModelProperty(value = "新增授信人数成本")
+    private java.math.BigDecimal eventNewUserCreditGrantAppCost;
+    /** 新增授信人数率 */
+    @Excel(name = "新增授信人数率", width = 15)
+    @ApiModelProperty(value = "新增授信人数率")
+    private java.math.BigDecimal eventNewUserCreditGrantAppRoi;
+    /** eventNewUserJinjianPage */
+    @Excel(name = "eventNewUserJinjianPage", width = 15)
+    @ApiModelProperty(value = "eventNewUserJinjianPage")
+    private Long eventNewUserJinjianPage;
+    /** eventNewUserJinjianPageCost */
+    @Excel(name = "eventNewUserJinjianPageCost", width = 15)
+    @ApiModelProperty(value = "eventNewUserJinjianPageCost")
+    private java.math.BigDecimal eventNewUserJinjianPageCost;
+    /** eventNewUserJinjianPageRoi */
+    @Excel(name = "eventNewUserJinjianPageRoi", width = 15)
+    @ApiModelProperty(value = "eventNewUserJinjianPageRoi")
+    private java.math.BigDecimal eventNewUserJinjianPageRoi;
+    /** eventNewUserCreditGrantPage */
+    @Excel(name = "eventNewUserCreditGrantPage", width = 15)
+    @ApiModelProperty(value = "eventNewUserCreditGrantPage")
+    private Long eventNewUserCreditGrantPage;
+    /** eventNewUserCreditGrantPageCost */
+    @Excel(name = "eventNewUserCreditGrantPageCost", width = 15)
+    @ApiModelProperty(value = "eventNewUserCreditGrantPageCost")
+    private java.math.BigDecimal eventNewUserCreditGrantPageCost;
+    /** eventNewUserCreditGrantPageRoi */
+    @Excel(name = "eventNewUserCreditGrantPageRoi", width = 15)
+    @ApiModelProperty(value = "eventNewUserCreditGrantPageRoi")
+    private java.math.BigDecimal eventNewUserCreditGrantPageRoi;
+    /** 预约表单数 */
+    @Excel(name = "预约表单数", width = 15)
+    @ApiModelProperty(value = "预约表单数")
+    private Long eventAppointForm;
+    /** 预约表单点击成本 */
+    @Excel(name = "预约表单点击成本", width = 15)
+    @ApiModelProperty(value = "预约表单点击成本")
+    private java.math.BigDecimal eventAppointFormCost;
+    /** 预约表单点击率 */
+    @Excel(name = "预约表单点击率", width = 15)
+    @ApiModelProperty(value = "预约表单点击率")
+    private java.math.BigDecimal eventAppointFormRatio;
+    /** 预约跳转点击数 */
+    @Excel(name = "预约跳转点击数", width = 15)
+    @ApiModelProperty(value = "预约跳转点击数")
+    private Long eventAppointJumpClick;
+    /** 预约跳转点击成本 */
+    @Excel(name = "预约跳转点击成本", width = 15)
+    @ApiModelProperty(value = "预约跳转点击成本")
+    private java.math.BigDecimal eventAppointJumpClickCost;
+    /** 预约跳转点击率 */
+    @Excel(name = "预约跳转点击率", width = 15)
+    @ApiModelProperty(value = "预约跳转点击率")
+    private java.math.BigDecimal eventAppointJumpClickRatio;
+    /** 联盟广告收入 */
+    @Excel(name = "联盟广告收入", width = 15)
+    @ApiModelProperty(value = "联盟广告收入")
+    private Long unionEventPayPurchaseAmount7d;
+    /** 联盟变现ROI */
+    @Excel(name = "联盟变现ROI", width = 15)
+    @ApiModelProperty(value = "联盟变现ROI")
+    private java.math.BigDecimal unionEventPayPurchaseAmount7dRoi;
+    /** placementType */
+    @Excel(name = "placementType", width = 15)
+    @ApiModelProperty(value = "placementType")
+    private String placementType;
+    /** adScene */
+    @Excel(name = "adScene", width = 15)
+    @ApiModelProperty(value = "adScene")
+    private String adScene;
+    /** eventOrderSuccessed */
+    @Excel(name = "eventOrderSuccessed", width = 15)
+    @ApiModelProperty(value = "eventOrderSuccessed")
+    private Long eventOrderSuccessed;
+    /** adPhotoPlayed10sRatio */
+    @Excel(name = "adPhotoPlayed10sRatio", width = 15)
+    @ApiModelProperty(value = "adPhotoPlayed10sRatio")
+    private java.math.BigDecimal adPhotoPlayed10sRatio;
+    /** keyActionCost */
+    @Excel(name = "keyActionCost", width = 15)
+    @ApiModelProperty(value = "keyActionCost")
+    private java.math.BigDecimal keyActionCost;
+    /** 添加购物车成本 */
+    @Excel(name = "添加购物车成本", width = 15)
+    @ApiModelProperty(value = "添加购物车成本")
+    private java.math.BigDecimal eventAddShoppingCartCost;
+    /** 广告观看次数转化率 */
+    @Excel(name = "广告观看次数转化率", width = 15)
+    @ApiModelProperty(value = "广告观看次数转化率")
+    private java.math.BigDecimal eventAdWatchTimesRatio;
+    /** eventOutboundCallCost */
+    @Excel(name = "eventOutboundCallCost", width = 15)
+    @ApiModelProperty(value = "eventOutboundCallCost")
+    private java.math.BigDecimal eventOutboundCallCost;
+    /** eventOutboundCall */
+    @Excel(name = "eventOutboundCall", width = 15)
+    @ApiModelProperty(value = "eventOutboundCall")
+    private Long eventOutboundCall;
+    /** actionNewRatio */
+    @Excel(name = "actionNewRatio", width = 15)
+    @ApiModelProperty(value = "actionNewRatio")
+    private java.math.BigDecimal actionNewRatio;
+    /** 广告观看 */
+    @Excel(name = "广告观看", width = 15)
+    @ApiModelProperty(value = "广告观看")
+    private Long eventWatchAppAd;
+    /** 落地页多转化成本 */
+    @Excel(name = "落地页多转化成本", width = 15)
+    @ApiModelProperty(value = "落地页多转化成本")
+    private java.math.BigDecimal eventMultiConversionCost;
+    /** eventPhoneCardActivate */
+    @Excel(name = "eventPhoneCardActivate", width = 15)
+    @ApiModelProperty(value = "eventPhoneCardActivate")
+    private Long eventPhoneCardActivate;
+    /** adPhotoPlayed75percentRatio */
+    @Excel(name = "adPhotoPlayed75percentRatio", width = 15)
+    @ApiModelProperty(value = "adPhotoPlayed75percentRatio")
+    private java.math.BigDecimal adPhotoPlayed75percentRatio;
+    /** keyActionRatio */
+    @Excel(name = "keyActionRatio", width = 15)
+    @ApiModelProperty(value = "keyActionRatio")
+    private java.math.BigDecimal keyActionRatio;
+    /** 广告观看次数成本 */
+    @Excel(name = "广告观看次数成本", width = 15)
+    @ApiModelProperty(value = "广告观看次数成本")
+    private java.math.BigDecimal eventAdWatchTimesCost;
+    /** 添加购物车数 */
+    @Excel(name = "添加购物车数", width = 15)
+    @ApiModelProperty(value = "添加购物车数")
+    private Long eventAddShoppingCart;
+    /** keyAction */
+    @Excel(name = "keyAction", width = 15)
+    @ApiModelProperty(value = "keyAction")
+    private Long keyAction;
+    /** 落地页多转化次数 */
+    @Excel(name = "落地页多转化次数", width = 15)
+    @ApiModelProperty(value = "落地页多转化次数")
+    private Long eventMultiConversion;
+    /** eventWechatConnected */
+    @Excel(name = "eventWechatConnected", width = 15)
+    @ApiModelProperty(value = "eventWechatConnected")
+    private Long eventWechatConnected;
+    /** 附加组件表单提交 */
+    @Excel(name = "附加组件表单提交", width = 15)
+    @ApiModelProperty(value = "附加组件表单提交")
+    private Long eventDspGiftForm;
+    /** eventIntentionConfirmed */
+    @Excel(name = "eventIntentionConfirmed", width = 15)
+    @ApiModelProperty(value = "eventIntentionConfirmed")
+    private Long eventIntentionConfirmed;
+    /** eventPhoneGetThrough */
+    @Excel(name = "eventPhoneGetThrough", width = 15)
+    @ApiModelProperty(value = "eventPhoneGetThrough")
+    private Long eventPhoneGetThrough;
+    /** 落地页多转化率 */
+    @Excel(name = "落地页多转化率", width = 15)
+    @ApiModelProperty(value = "落地页多转化率")
+    private java.math.BigDecimal eventMultiConversionRatio;
+    /** eventMeasurementHouse */
+    @Excel(name = "eventMeasurementHouse", width = 15)
+    @ApiModelProperty(value = "eventMeasurementHouse")
+    private java.math.BigDecimal eventMeasurementHouse;
+    /** adPhotoPlayed2sRatio */
+    @Excel(name = "adPhotoPlayed2sRatio", width = 15)
+    @ApiModelProperty(value = "adPhotoPlayed2sRatio")
+    private java.math.BigDecimal adPhotoPlayed2sRatio;
+    /** eventOutboundCallRatio */
+    @Excel(name = "eventOutboundCallRatio", width = 15)
+    @ApiModelProperty(value = "eventOutboundCallRatio")
+    private java.math.BigDecimal eventOutboundCallRatio;
+    /** 广告观看次数 */
+    @Excel(name = " 广告观看次数", width = 15)
+    @ApiModelProperty(value = " 广告观看次数")
+    private Long eventAdWatchTimes;
+}

+ 587 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/entity/KuaishouUnitReportHourlyPojo.java

@@ -0,0 +1,587 @@
+package org.jeecg.ctop.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 快手-组-时报
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2022-02-22
+ */
+@Data
+@TableName("kuaishou_unit_report_hourly")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "kuaishou_unit_report_hourly对象", description = "快手-组-时报")
+public class KuaishouUnitReportHourlyPojo {
+
+    /** 广告主id */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /** 数据日期,格式:YYYYMMDD */
+    @Excel(name = "数据日期,格式:YYYYMMDD", width = 15)
+    @ApiModelProperty(value = "数据日期,格式:YYYYMMDD")
+    private Integer statDate;
+    /** 广告计划ID */
+    @Excel(name = "广告计划ID", width = 15)
+    @ApiModelProperty(value = "广告计划ID")
+    private Long campaignId;
+    /** 广告计划名称 */
+    @Excel(name = "广告计划名称", width = 15)
+    @ApiModelProperty(value = "广告计划名称")
+    private String campaignName;
+    /** 广告组ID */
+    @Excel(name = "广告组ID", width = 15)
+    @ApiModelProperty(value = "广告组ID")
+    private Long unitId;
+    /** 广告组名称 */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String unitName;
+    /** 小时 */
+    @Excel(name = "小时", width = 15)
+    @ApiModelProperty(value = "小时")
+    private Integer hour;
+    /** 花费(元) */
+    @Excel(name = "花费(元)", width = 15)
+    @ApiModelProperty(value = "花费(元)")
+    private java.math.BigDecimal charge;
+    /** 封面曝光数 */
+    @Excel(name = "封面曝光数", width = 15)
+    @ApiModelProperty(value = "封面曝光数")
+    private Long show;
+    /** 封面点击数 */
+    @Excel(name = "封面点击数", width = 15)
+    @ApiModelProperty(value = "封面点击数")
+    private Long photoClick;
+    /** 素材曝光数 */
+    @Excel(name = "素材曝光数", width = 15)
+    @ApiModelProperty(value = "素材曝光数")
+    private Long aclick;
+    /** 行为数 */
+    @Excel(name = "行为数", width = 15)
+    @ApiModelProperty(value = "行为数")
+    private Long bclick;
+    /** 封面点击率 */
+    @Excel(name = "封面点击率", width = 15)
+    @ApiModelProperty(value = "封面点击率")
+    private java.math.BigDecimal photoClickRatio;
+    /** 3s播放率 */
+    @Excel(name = "3s播放率", width = 15)
+    @ApiModelProperty(value = "3s播放率")
+    private java.math.BigDecimal play3sRatio;
+    /** 行为率 */
+    @Excel(name = "行为率", width = 15)
+    @ApiModelProperty(value = "行为率")
+    private java.math.BigDecimal actionRatio;
+    /** 平均千次曝光花费(元) */
+    @Excel(name = "平均千次曝光花费(元)", width = 15)
+    @ApiModelProperty(value = "平均千次曝光花费(元)")
+    private java.math.BigDecimal impression1kCost;
+    /** 平均点击单价(元) */
+    @Excel(name = "平均点击单价(元)", width = 15)
+    @ApiModelProperty(value = "平均点击单价(元)")
+    private java.math.BigDecimal photoClickCost;
+    /** 平均行为单价(元) */
+    @Excel(name = "平均行为单价(元)", width = 15)
+    @ApiModelProperty(value = "平均行为单价(元)")
+    private java.math.BigDecimal actionCost;
+    /** 分享数 */
+    @Excel(name = "分享数", width = 15)
+    @ApiModelProperty(value = "分享数")
+    private Long share;
+    /** 评论数 */
+    @Excel(name = "评论数", width = 15)
+    @ApiModelProperty(value = "评论数")
+    private Long comment;
+    /** 点赞数 */
+    @Excel(name = "点赞数", width = 15)
+    @ApiModelProperty(value = "点赞数")
+    private Long like;
+    /** 新增关注数 */
+    @Excel(name = "新增关注数", width = 15)
+    @ApiModelProperty(value = "新增关注数")
+    private Long follow;
+    /** 取消关注数 */
+    @Excel(name = "取消关注数", width = 15)
+    @ApiModelProperty(value = "取消关注数")
+    private Long cancelFollow;
+    /** 举报数 */
+    @Excel(name = "举报数", width = 15)
+    @ApiModelProperty(value = "举报数")
+    private Long report;
+    /** 拉黑数 */
+    @Excel(name = "拉黑数", width = 15)
+    @ApiModelProperty(value = "拉黑数")
+    private Long block;
+    /** 减少此类作品数 */
+    @Excel(name = "减少此类作品数", width = 15)
+    @ApiModelProperty(value = "减少此类作品数")
+    private Long negative;
+    /** 提交按钮点击数(历史字段,同下方“表单提交数”,预计年底删除该字段) */
+    @Excel(name = "提交按钮点击数(历史字段,同下方“表单提交数”,预计年底删除该字段)", width = 15)
+    @ApiModelProperty(value = "提交按钮点击数(历史字段,同下方“表单提交数”,预计年底删除该字段)")
+    private Long submit;
+    /** 应用下载数据-安卓下载开始数 */
+    @Excel(name = "应用下载数据-安卓下载开始数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-安卓下载开始数")
+    private Long downloadStarted;
+    /** 应用下载数据-安卓下载完成数 */
+    @Excel(name = "应用下载数据-安卓下载完成数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-安卓下载完成数")
+    private Long downloadCompleted;
+    /** 应用下载数据-激活数 */
+    @Excel(name = "应用下载数据-激活数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-激活数")
+    private Long activation;
+    /** 应用下载数据-首日付费次数 */
+    @Excel(name = "应用下载数据-首日付费次数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-首日付费次数")
+    private Long eventPayFirstDay;
+    /** 应用下载数据-首日付费金额 */
+    @Excel(name = "应用下载数据-首日付费金额", width = 15)
+    @ApiModelProperty(value = "应用下载数据-首日付费金额")
+    private java.math.BigDecimal eventPayPurchaseAmountFirstDay;
+    /** 应用下载数据-首日ROI */
+    @Excel(name = "应用下载数据-首日ROI", width = 15)
+    @ApiModelProperty(value = "应用下载数据-首日ROI")
+    private java.math.BigDecimal eventPayFirstDayRoi;
+    /** 应用下载数据-付费次数 */
+    @Excel(name = "应用下载数据-付费次数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付费次数")
+    private Long eventPay;
+    /** 应用下载数据-付费金额 */
+    @Excel(name = "应用下载数据-付费金额", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付费金额")
+    private java.math.BigDecimal eventPayPurchaseAmount;
+    /** 应用下载数据-ROI */
+    @Excel(name = "应用下载数据-ROI", width = 15)
+    @ApiModelProperty(value = "应用下载数据-ROI")
+    private java.math.BigDecimal eventPayRoi;
+    /** 应用下载数据-注册数 */
+    @Excel(name = "应用下载数据-注册数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-注册数")
+    private Long eventRegister;
+    /** 应用下载数据-注册成本 */
+    @Excel(name = "应用下载数据-注册成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-注册成本")
+    private java.math.BigDecimal eventRegisterCost;
+    /** 应用下载数据-注册率 */
+    @Excel(name = "应用下载数据-注册率", width = 15)
+    @ApiModelProperty(value = "应用下载数据-注册率")
+    private java.math.BigDecimal eventRegisterRatio;
+    /** 应用下载数据-完件数 */
+    @Excel(name = "应用下载数据-完件数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-完件数")
+    private Long eventJinJianApp;
+    /** 应用下载数据-完件成本 */
+    @Excel(name = "应用下载数据-完件成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-完件成本")
+    private java.math.BigDecimal eventJinJianAppCost;
+    /** 应用下载数据-授信数 */
+    @Excel(name = "应用下载数据-授信数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-授信数")
+    private Long eventCreditGrantApp;
+    /** 应用下载数据-授信成本 */
+    @Excel(name = "应用下载数据-授信成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-授信成本")
+    private java.math.BigDecimal eventCreditGrantAppCost;
+    /** 应用下载数据-授信率 */
+    @Excel(name = "应用下载数据-授信率", width = 15)
+    @ApiModelProperty(value = "应用下载数据-授信率")
+    private java.math.BigDecimal eventCreditGrantAppRatio;
+    /** 应用下载数据-付款成功数 */
+    @Excel(name = "应用下载数据-付款成功数", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付款成功数")
+    private Long eventOrderPaid;
+    /** 应用下载数据-付款成功金额 */
+    @Excel(name = "应用下载数据-付款成功金额", width = 15)
+    @ApiModelProperty(value = "应用下载数据-付款成功金额")
+    private java.math.BigDecimal eventOrderPaidPurchaseAmount;
+    /** 应用下载数据-单次付款成本 */
+    @Excel(name = "应用下载数据-单次付款成本", width = 15)
+    @ApiModelProperty(value = "应用下载数据-单次付款成本")
+    private java.math.BigDecimal eventOrderPaidCost;
+    /** 应用下载数据-次留数(仅支持分日查询) */
+    @Excel(name = "应用下载数据-次留数(仅支持分日查询)", width = 15)
+    @ApiModelProperty(value = "应用下载数据-次留数(仅支持分日查询)")
+    private Long eventNextDayStay;
+    /** 应用下载数据-次留成本(仅支持分日查询) */
+    @Excel(name = "应用下载数据-次留成本(仅支持分日查询)", width = 15)
+    @ApiModelProperty(value = "应用下载数据-次留成本(仅支持分日查询)")
+    private java.math.BigDecimal eventNextDayStayCost;
+    /** 应用下载数据-次留率(仅支持分日查询) */
+    @Excel(name = "应用下载数据-次留率(仅支持分日查询)", width = 15)
+    @ApiModelProperty(value = "应用下载数据-次留率(仅支持分日查询)")
+    private java.math.BigDecimal eventNextDayStayRatio;
+    /** 落地页数据-表单提交数 */
+    @Excel(name = "落地页数据-表单提交数", width = 15)
+    @ApiModelProperty(value = "落地页数据-表单提交数")
+    private Long formCount;
+    /** 落地页数据-表单提交单价 */
+    @Excel(name = "落地页数据-表单提交单价", width = 15)
+    @ApiModelProperty(value = "落地页数据-表单提交单价")
+    private java.math.BigDecimal formCost;
+    /** 落地页数据-表单提交点击率 */
+    @Excel(name = "落地页数据-表单提交点击率", width = 15)
+    @ApiModelProperty(value = "落地页数据-表单提交点击率")
+    private java.math.BigDecimal formActionRatio;
+    /** 落地页数据-落地页完件数 */
+    @Excel(name = "落地页数据-落地页完件数", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页完件数")
+    private Long eventJinJianLandingPage;
+    /** 落地页数据-落地页完件成本 */
+    @Excel(name = "落地页数据-落地页完件成本", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页完件成本")
+    private java.math.BigDecimal eventJinJianLandingPageCost;
+    /** 落地页数据-落地页授信数 */
+    @Excel(name = "落地页数据-落地页授信数", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页授信数")
+    private Long eventCreditGrantLandingPage;
+    /** 落地页数据-落地页授信成本 */
+    @Excel(name = "落地页数据-落地页授信成本", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页授信成本")
+    private java.math.BigDecimal eventCreditGrantLandingPageCost;
+    /** 落地页数据-落地页授信率 */
+    @Excel(name = "落地页数据-落地页授信率", width = 15)
+    @ApiModelProperty(value = "落地页数据-落地页授信率")
+    private java.math.BigDecimal eventCreditGrantLandingPageRatio;
+    /** 落地页数据-有效线索数 */
+    @Excel(name = "落地页数据-有效线索数", width = 15)
+    @ApiModelProperty(value = "落地页数据-有效线索数")
+    private Long eventValidClues;
+    /** 落地页数据-有效线索成本 */
+    @Excel(name = "落地页数据-有效线索成本", width = 15)
+    @ApiModelProperty(value = "落地页数据-有效线索成本")
+    private java.math.BigDecimal eventValidCluesCost;
+    /** 微信复制数 */
+    @Excel(name = "微信复制数", width = 15)
+    @ApiModelProperty(value = "微信复制数")
+    private Long eventAddWechat;
+    /** 微信复制成本 */
+    @Excel(name = "微信复制成本", width = 15)
+    @ApiModelProperty(value = "微信复制成本")
+    private java.math.BigDecimal eventAddWechatCost;
+    /** 微信复制率 */
+    @Excel(name = "微信复制率", width = 15)
+    @ApiModelProperty(value = "微信复制率")
+    private java.math.BigDecimal eventAddWechatRatio;
+    /** 智能电话-确认接通数 */
+    @Excel(name = "智能电话-确认接通数", width = 15)
+    @ApiModelProperty(value = "智能电话-确认接通数")
+    private Long eventGetThrough;
+    /** 智能电话-确认接通成本 */
+    @Excel(name = "智能电话-确认接通成本", width = 15)
+    @ApiModelProperty(value = "智能电话-确认接通成本")
+    private java.math.BigDecimal eventGetThroughCost;
+    /** 智能电话-确认接通率 */
+    @Excel(name = "智能电话-确认接通率", width = 15)
+    @ApiModelProperty(value = "智能电话-确认接通率")
+    private java.math.BigDecimal eventGetThroughRatio;
+    /** 唤醒应用数 */
+    @Excel(name = "唤醒应用数", width = 15)
+    @ApiModelProperty(value = "唤醒应用数")
+    private Long eventAppInvoked;
+    /** 唤醒应用成本 */
+    @Excel(name = "唤醒应用成本", width = 15)
+    @ApiModelProperty(value = "唤醒应用成本")
+    private java.math.BigDecimal eventAppInvokedCost;
+    /** 唤醒应用率 */
+    @Excel(name = "唤醒应用率", width = 15)
+    @ApiModelProperty(value = "唤醒应用率")
+    private java.math.BigDecimal eventAppInvokedRatio;
+    /** 落地页授信率 */
+    @Excel(name = "落地页授信率", width = 15)
+    @ApiModelProperty(value = "落地页授信率")
+    private java.math.BigDecimal eventCreditGrantLandingRatio;
+    /** 5s播放率 */
+    @Excel(name = "5s播放率", width = 15)
+    @ApiModelProperty(value = "5s播放率")
+    private java.math.BigDecimal play5sRatio;
+    /** 完播率 */
+    @Excel(name = "完播率", width = 15)
+    @ApiModelProperty(value = "完播率")
+    private java.math.BigDecimal playEndRatio;
+    /** 新增付费人数 */
+    @Excel(name = "新增付费人数", width = 15)
+    @ApiModelProperty(value = "新增付费人数")
+    private java.math.BigDecimal eventNewUserPay;
+    /** 新增付费人数成本 */
+    @Excel(name = "新增付费人数成本", width = 15)
+    @ApiModelProperty(value = "新增付费人数成本")
+    private java.math.BigDecimal eventNewUserPayCost;
+    /** 新增付费人数率 */
+    @Excel(name = "新增付费人数率", width = 15)
+    @ApiModelProperty(value = "新增付费人数率")
+    private java.math.BigDecimal eventNewUserPayRatio;
+    /** 平均千次素材曝光花费(元) */
+    @Excel(name = "平均千次素材曝光花费(元)", width = 15)
+    @ApiModelProperty(value = "平均千次素材曝光花费(元)")
+    private java.math.BigDecimal click1kCost;
+    /** 商品成交数 */
+    @Excel(name = "商品成交数", width = 15)
+    @ApiModelProperty(value = "商品成交数")
+    private Long adProductCnt;
+    /** 商品访问数 */
+    @Excel(name = "商品访问数", width = 15)
+    @ApiModelProperty(value = "商品访问数")
+    private Long eventGoodsView;
+    /** 涨粉量 */
+    @Excel(name = "涨粉量", width = 15)
+    @ApiModelProperty(value = "涨粉量")
+    private Long merchantRecoFans;
+    /** 小店推广roi */
+    @Excel(name = "小店推广roi", width = 15)
+    @ApiModelProperty(value = "小店推广roi")
+    private java.math.BigDecimal eventOrderAmountRoi;
+    /** 商品访问成本 */
+    @Excel(name = "商品访问成本", width = 15)
+    @ApiModelProperty(value = "商品访问成本")
+    private java.math.BigDecimal eventGoodsViewCost;
+    /** 涨粉成本 */
+    @Excel(name = "涨粉成本", width = 15)
+    @ApiModelProperty(value = "涨粉成本")
+    private java.math.BigDecimal merchantRecoFansCost;
+    /** 按钮点击数 */
+    @Excel(name = "按钮点击数", width = 15)
+    @ApiModelProperty(value = "按钮点击数")
+    private Long eventButtonClick;
+    /** 按钮点击成本 */
+    @Excel(name = "按钮点击成本", width = 15)
+    @ApiModelProperty(value = "按钮点击成本")
+    private java.math.BigDecimal eventButtonClickCost;
+    /** 按钮点击率 */
+    @Excel(name = "按钮点击率", width = 15)
+    @ApiModelProperty(value = "按钮点击率")
+    private java.math.BigDecimal eventButtonClickRatio;
+    /** 订单支付率 */
+    @Excel(name = "订单支付率", width = 15)
+    @ApiModelProperty(value = "订单支付率")
+    private java.math.BigDecimal eventOrderPaidRoi;
+    /** 新增完件人数 */
+    @Excel(name = "新增完件人数", width = 15)
+    @ApiModelProperty(value = "新增完件人数")
+    private Long eventNewUserJinjianApp;
+    /** 新增完件成本 */
+    @Excel(name = "新增完件成本", width = 15)
+    @ApiModelProperty(value = "新增完件成本")
+    private java.math.BigDecimal eventNewUserJinjianAppCost;
+    /** 新增完件人数率 */
+    @Excel(name = "新增完件人数率", width = 15)
+    @ApiModelProperty(value = "新增完件人数率")
+    private java.math.BigDecimal eventNewUserJinjianAppRoi;
+    /** 新增授信人数 */
+    @Excel(name = "新增授信人数", width = 15)
+    @ApiModelProperty(value = "新增授信人数")
+    private Long eventNewUserCreditGrantApp;
+    /** 新增授信人数成本 */
+    @Excel(name = "新增授信人数成本", width = 15)
+    @ApiModelProperty(value = "新增授信人数成本")
+    private java.math.BigDecimal eventNewUserCreditGrantAppCost;
+    /** 新增授信人数率 */
+    @Excel(name = "新增授信人数率", width = 15)
+    @ApiModelProperty(value = "新增授信人数率")
+    private java.math.BigDecimal eventNewUserCreditGrantAppRoi;
+    /** eventNewUserJinjianPage */
+    @Excel(name = "eventNewUserJinjianPage", width = 15)
+    @ApiModelProperty(value = "eventNewUserJinjianPage")
+    private Long eventNewUserJinjianPage;
+    /** eventNewUserJinjianPageCost */
+    @Excel(name = "eventNewUserJinjianPageCost", width = 15)
+    @ApiModelProperty(value = "eventNewUserJinjianPageCost")
+    private java.math.BigDecimal eventNewUserJinjianPageCost;
+    /** eventNewUserJinjianPageRoi */
+    @Excel(name = "eventNewUserJinjianPageRoi", width = 15)
+    @ApiModelProperty(value = "eventNewUserJinjianPageRoi")
+    private java.math.BigDecimal eventNewUserJinjianPageRoi;
+    /** eventNewUserCreditGrantPage */
+    @Excel(name = "eventNewUserCreditGrantPage", width = 15)
+    @ApiModelProperty(value = "eventNewUserCreditGrantPage")
+    private Long eventNewUserCreditGrantPage;
+    /** eventNewUserCreditGrantPageCost */
+    @Excel(name = "eventNewUserCreditGrantPageCost", width = 15)
+    @ApiModelProperty(value = "eventNewUserCreditGrantPageCost")
+    private java.math.BigDecimal eventNewUserCreditGrantPageCost;
+    /** eventNewUserCreditGrantPageRoi */
+    @Excel(name = "eventNewUserCreditGrantPageRoi", width = 15)
+    @ApiModelProperty(value = "eventNewUserCreditGrantPageRoi")
+    private java.math.BigDecimal eventNewUserCreditGrantPageRoi;
+    /** 预约表单数 */
+    @Excel(name = "预约表单数", width = 15)
+    @ApiModelProperty(value = "预约表单数")
+    private Long eventAppointForm;
+    /** 预约表单点击成本 */
+    @Excel(name = "预约表单点击成本", width = 15)
+    @ApiModelProperty(value = "预约表单点击成本")
+    private java.math.BigDecimal eventAppointFormCost;
+    /** 预约表单点击率 */
+    @Excel(name = "预约表单点击率", width = 15)
+    @ApiModelProperty(value = "预约表单点击率")
+    private java.math.BigDecimal eventAppointFormRatio;
+    /** 预约跳转点击数 */
+    @Excel(name = "预约跳转点击数", width = 15)
+    @ApiModelProperty(value = "预约跳转点击数")
+    private Long eventAppointJumpClick;
+    /** 预约跳转点击成本 */
+    @Excel(name = "预约跳转点击成本", width = 15)
+    @ApiModelProperty(value = "预约跳转点击成本")
+    private java.math.BigDecimal eventAppointJumpClickCost;
+    /** 预约跳转点击率 */
+    @Excel(name = "预约跳转点击率", width = 15)
+    @ApiModelProperty(value = "预约跳转点击率")
+    private java.math.BigDecimal eventAppointJumpClickRatio;
+    /** 联盟广告收入 */
+    @Excel(name = "联盟广告收入", width = 15)
+    @ApiModelProperty(value = "联盟广告收入")
+    private Long unionEventPayPurchaseAmount7d;
+    /** 联盟变现ROI */
+    @Excel(name = "联盟变现ROI", width = 15)
+    @ApiModelProperty(value = "联盟变现ROI")
+    private java.math.BigDecimal unionEventPayPurchaseAmount7dRoi;
+    /** placementType */
+    @Excel(name = "placementType", width = 15)
+    @ApiModelProperty(value = "placementType")
+    private String placementType;
+    /** adScene */
+    @Excel(name = "adScene", width = 15)
+    @ApiModelProperty(value = "adScene")
+    private String adScene;
+    /** eventOrderSuccessed */
+    @Excel(name = "eventOrderSuccessed", width = 15)
+    @ApiModelProperty(value = "eventOrderSuccessed")
+    private Long eventOrderSuccessed;
+    /** adPhotoPlayed10sRatio */
+    @Excel(name = "adPhotoPlayed10sRatio", width = 15)
+    @ApiModelProperty(value = "adPhotoPlayed10sRatio")
+    private java.math.BigDecimal adPhotoPlayed10sRatio;
+    /** keyActionCost */
+    @Excel(name = "keyActionCost", width = 15)
+    @ApiModelProperty(value = "keyActionCost")
+    private java.math.BigDecimal keyActionCost;
+    /** 添加购物车成本 */
+    @Excel(name = "添加购物车成本", width = 15)
+    @ApiModelProperty(value = "添加购物车成本")
+    private java.math.BigDecimal eventAddShoppingCartCost;
+    /** 广告观看次数转化率 */
+    @Excel(name = "广告观看次数转化率", width = 15)
+    @ApiModelProperty(value = "广告观看次数转化率")
+    private java.math.BigDecimal eventAdWatchTimesRatio;
+    /** eventOutboundCallCost */
+    @Excel(name = "eventOutboundCallCost", width = 15)
+    @ApiModelProperty(value = "eventOutboundCallCost")
+    private java.math.BigDecimal eventOutboundCallCost;
+    /** eventOutboundCall */
+    @Excel(name = "eventOutboundCall", width = 15)
+    @ApiModelProperty(value = "eventOutboundCall")
+    private Long eventOutboundCall;
+    /** actionNewRatio */
+    @Excel(name = "actionNewRatio", width = 15)
+    @ApiModelProperty(value = "actionNewRatio")
+    private java.math.BigDecimal actionNewRatio;
+    /** 广告观看 */
+    @Excel(name = "广告观看", width = 15)
+    @ApiModelProperty(value = "广告观看")
+    private Long eventWatchAppAd;
+    /** 落地页多转化成本 */
+    @Excel(name = "落地页多转化成本", width = 15)
+    @ApiModelProperty(value = "落地页多转化成本")
+    private java.math.BigDecimal eventMultiConversionCost;
+    /** eventPhoneCardActivate */
+    @Excel(name = "eventPhoneCardActivate", width = 15)
+    @ApiModelProperty(value = "eventPhoneCardActivate")
+    private Long eventPhoneCardActivate;
+    /** adPhotoPlayed75percentRatio */
+    @Excel(name = "adPhotoPlayed75percentRatio", width = 15)
+    @ApiModelProperty(value = "adPhotoPlayed75percentRatio")
+    private java.math.BigDecimal adPhotoPlayed75percentRatio;
+    /** keyActionRatio */
+    @Excel(name = "keyActionRatio", width = 15)
+    @ApiModelProperty(value = "keyActionRatio")
+    private java.math.BigDecimal keyActionRatio;
+    /** 广告观看次数成本 */
+    @Excel(name = "广告观看次数成本", width = 15)
+    @ApiModelProperty(value = "广告观看次数成本")
+    private java.math.BigDecimal eventAdWatchTimesCost;
+    /** 添加购物车数 */
+    @Excel(name = "添加购物车数", width = 15)
+    @ApiModelProperty(value = "添加购物车数")
+    private Long eventAddShoppingCart;
+    /** keyAction */
+    @Excel(name = "keyAction", width = 15)
+    @ApiModelProperty(value = "keyAction")
+    private Long keyAction;
+    /** 落地页多转化次数 */
+    @Excel(name = "落地页多转化次数", width = 15)
+    @ApiModelProperty(value = "落地页多转化次数")
+    private Long eventMultiConversion;
+    /** eventWechatConnected */
+    @Excel(name = "eventWechatConnected", width = 15)
+    @ApiModelProperty(value = "eventWechatConnected")
+    private Long eventWechatConnected;
+    /** 附加组件表单提交 */
+    @Excel(name = "附加组件表单提交", width = 15)
+    @ApiModelProperty(value = "附加组件表单提交")
+    private Long eventDspGiftForm;
+    /** eventIntentionConfirmed */
+    @Excel(name = "eventIntentionConfirmed", width = 15)
+    @ApiModelProperty(value = "eventIntentionConfirmed")
+    private Long eventIntentionConfirmed;
+    /** eventPhoneGetThrough */
+    @Excel(name = "eventPhoneGetThrough", width = 15)
+    @ApiModelProperty(value = "eventPhoneGetThrough")
+    private Long eventPhoneGetThrough;
+    /** 落地页多转化率 */
+    @Excel(name = "落地页多转化率", width = 15)
+    @ApiModelProperty(value = "落地页多转化率")
+    private java.math.BigDecimal eventMultiConversionRatio;
+    /** eventMeasurementHouse */
+    @Excel(name = "eventMeasurementHouse", width = 15)
+    @ApiModelProperty(value = "eventMeasurementHouse")
+    private java.math.BigDecimal eventMeasurementHouse;
+    /** adPhotoPlayed2sRatio */
+    @Excel(name = "adPhotoPlayed2sRatio", width = 15)
+    @ApiModelProperty(value = "adPhotoPlayed2sRatio")
+    private java.math.BigDecimal adPhotoPlayed2sRatio;
+    /** eventOutboundCallRatio */
+    @Excel(name = "eventOutboundCallRatio", width = 15)
+    @ApiModelProperty(value = "eventOutboundCallRatio")
+    private java.math.BigDecimal eventOutboundCallRatio;
+    /** 广告观看次数 */
+    @Excel(name = " 广告观看次数", width = 15)
+    @ApiModelProperty(value = " 广告观看次数")
+    private Long eventAdWatchTimes;
+
+    @ApiModelProperty(value = " 安卓下载开始率=安卓下载开始数/行为数")
+    private String downloadStartRate;
+
+    @ApiModelProperty(value = " 安卓下载开始单价=安卓下载开始数/行为数")
+    private String downloadStartCost;
+
+    @ApiModelProperty(value = " 安卓下载完成率=安卓下载完成数/安卓下载开始数")
+    private String downloadFinishRate;
+
+    @ApiModelProperty(value = " 安卓下载完成单价=花费/安卓下载完成数")
+    private String downloadFinishCost;
+
+    @ApiModelProperty(value = " 激活单价=花费/激活数")
+    private String activeCost;
+
+    @ApiModelProperty(value = " 下载完成激活率=激活数/安卓下载完成数")
+    private String activeRate;
+
+    @ApiModelProperty(value = " 首日付费成本=消耗/首日付费次数")
+    private String firstDayPayCost;
+
+
+
+}

+ 54 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/KuaishouOperationRecordMapper.java

@@ -0,0 +1,54 @@
+package org.jeecg.ctop.material.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.ctop.material.entity.KuaishouUnitReportDailyPojo;
+import org.jeecg.ctop.material.entity.KuaishouUnitReportHourlyPojo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouAccountPieVo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateAccountVo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateProjectVo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateVo;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Mapper
+public interface KuaishouOperationRecordMapper {
+
+
+    /**
+     * 查询快手组 时报 消耗前10
+     * @param advertiserId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<KuaishouUnitReportHourlyPojo> getKuaishouUnitReportHourly(@Param("advertiserId") long advertiserId, @Param("startTime") long startTime, @Param("endTime") long endTime);
+
+    /**
+     * 查询快手组 日报 消耗前10
+     * @param advertiserId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<KuaishouUnitReportHourlyPojo> getKuaishouUnitReportDaily(@Param("advertiserId") long advertiserId, @Param("startTime") long startTime, @Param("endTime") long endTime);
+
+
+    /**
+     * 查询 账户操作类型
+     * @param advertiserId 账户id
+     * @param operationType 操作目标类型1:账户 2:计划 3:广告组 4:创意 5:视频 6:应用 7:人群包
+     *                   warning:!!!   根据磁力引擎api得知 状态为3时 字段 objectId 对应为计划id-unitId
+     *                      but but but 状态为2时 对应的是组id unitId
+     * @param objectId 操作对象id
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<JSONObject> getKuaishouOperationRecordByAdvertiserId(@Param("advertiserId") long advertiserId,@Param("objectId") long objectId,@Param("operationType") int operationType,  @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+
+}

+ 78 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/xml/KuaishouOperationRecordMapper.xml

@@ -0,0 +1,78 @@
+<?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="org.jeecg.ctop.material.mapper.KuaishouOperationRecordMapper">
+
+
+<!-- 查询快手组 时报 消耗前10 -->
+    <select id="getKuaishouUnitReportHourly" resultType="org.jeecg.ctop.material.entity.KuaishouUnitReportHourlyPojo">
+        SELECT
+            *,
+            CONCAT(ROUND(download_started / bclick * 100,2) ,'%') as downloadStartRate,
+            ROUND(download_started / bclick * 100,2) as downloadStartCost,
+            CONCAT(ROUND(download_completed / download_started * 100,2) ,'%') as downloadFinishRate,
+            ROUND(charge / download_completed * 100,2) as downloadFinishCost,
+            ROUND(charge / activation * 100,2) as activeCost,
+            CONCAT(ROUND(activation / download_completed * 100,2) ,'%') as activeRate,
+            ROUND(charge / event_pay_first_day * 100,2) as firstDayPayCost
+        FROM
+            media_api.`kuaishou_unit_report_hourly`
+        WHERE
+         stat_date >= #{startTime}
+        AND stat_date &lt;= #{endTime}
+        AND advertiser_id = #{advertiserId}
+        ORDER BY charge DESC
+        LIMIT 10
+    </select>
+
+
+
+    <!-- 查询快手组 日报 消耗前10  -->
+    <select id="getKuaishouUnitReportDaily" resultType="org.jeecg.ctop.material.entity.KuaishouUnitReportHourlyPojo">
+        SELECT
+            *,
+            CONCAT(ROUND(download_started / bclick * 100,2) ,'%') as downloadStartRate,
+            ROUND(download_started / bclick * 100,2) as downloadStartCost,
+            CONCAT(ROUND(download_completed / download_started * 100,2) ,'%') as downloadFinishRate,
+            ROUND(charge / download_completed * 100,2) as downloadFinishCost,
+            ROUND(charge / activation * 100,2) as activeCost,
+            CONCAT(ROUND(activation / download_completed * 100,2) ,'%') as activeRate,
+            ROUND(charge / event_pay_first_day * 100,2) as firstDayPayCost
+        FROM
+            media_api.`kuaishou_unit_report_daily`
+        WHERE
+            stat_date &gt;= #{startTime}
+          AND stat_date &lt;= #{endTime}
+          AND advertiser_id = #{advertiserId}
+        ORDER BY charge DESC
+            LIMIT 10
+    </select>
+
+
+    <!-- 查看账户操作记录 -->
+    <select id="getKuaishouOperationRecordByAdvertiserId" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            advertiser_id,
+            object_id,
+            object_name,
+            operation_type,
+            operation_target,
+            role_type,
+            operation_time,
+            content_log,
+            create_time
+        FROM
+            media_api.`kuaishou_tools_advertiser_operation_record_list`
+        WHERE
+            advertiser_id = #{advertiserId}
+            AND operation_type = #{operationType}
+            AND object_id = #{objectId}
+            AND operation_time &gt;= #{startTime}
+            AND operation_time &lt;= #{endTime}
+
+
+    </select>
+
+
+
+
+</mapper>

+ 27 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/KuaishouOperationRecordService.java

@@ -0,0 +1,27 @@
+package org.jeecg.ctop.material.service;
+
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateAccountVo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateProjectVo;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 快手-账户操作记录
+ */
+public interface KuaishouOperationRecordService {
+
+    Result getAllSubordinateAccountByUserId(String userId);
+
+    Result getKuaishouUnitChargeTopTenByAccountId(String userId,long advertiserId,String startTime,String endTime) throws NoSuchFieldException;
+
+
+    Result getKuaishouOperationRecordByUnit(long advertiserId,long unitId,String startTime,String endTime);
+
+
+}

+ 140 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/impl/KuaishouOperationRecordServiceImpl.java

@@ -0,0 +1,140 @@
+package org.jeecg.ctop.material.service.impl;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.ctop.material.constants.Check;
+import org.jeecg.ctop.material.entity.AccountTrendPojo;
+import org.jeecg.ctop.material.entity.KuaishouUnitReportDailyPojo;
+import org.jeecg.ctop.material.entity.KuaishouUnitReportHourlyPojo;
+import org.jeecg.ctop.material.entity.vo.KuaiShouOperateProjectVo;
+import org.jeecg.ctop.material.mapper.BossDataExhibitionMapper;
+import org.jeecg.ctop.material.mapper.KuaishouOperationRecordMapper;
+import org.jeecg.ctop.material.mapper.MaterialStareMapper;
+import org.jeecg.ctop.material.service.IBossDataExhibitionService;
+import org.jeecg.ctop.material.service.KuaishouOperationRecordService;
+import org.jeecg.ctop.material.service.MaterialStareService;
+import org.jeecg.ctop.material.utils.FeidNotNullUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class KuaishouOperationRecordServiceImpl implements KuaishouOperationRecordService {
+
+
+    @Autowired
+    private KuaishouOperationRecordMapper kuaishouOperationRecordMapper;
+
+
+    @Resource
+    MaterialStareMapper materialStareMapper;
+
+
+    @Autowired
+    MaterialStareService materialStareService;
+
+
+
+    /**
+     *
+     * @description: 运营人员账户查询成功
+     *
+     * @param userId
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     */
+    @Override
+    public Result getAllSubordinateAccountByUserId(String userId) {
+        Set<String> userIds = null;
+        //查询用户角色
+        String roleCode = materialStareMapper.getRoleCodeByUserId(userId);
+        //角色 不为 管理员
+        if (!"admin".equals(roleCode)) {
+            //获取所有下级
+            Result resultUserIds = materialStareService.getCompanyAllSubordinateByUserId(userId);
+            if (resultUserIds.isSuccess()) {
+                userIds = (Set<String>) resultUserIds.getResult();
+            }
+        }
+        //根据运营 项目 查询账户
+        List<JSONObject> jsonList = materialStareMapper.getAccountListByProjectListSubordinate(userIds,null);
+        return Result.successMsg("运营人员账户查询成功",jsonList);
+    }
+
+
+
+
+    /**
+     *
+     * @description: 消耗前10的广告组
+     *
+     * @param userId
+     * @param advertiserId
+     * @param startTime
+     * @param endTime
+     * @return: org.jeecg.common.api.vo.Result<com.alibaba.fastjson.JSONObject>
+     * @author: zianY
+     */
+    @Override
+    public Result getKuaishouUnitChargeTopTenByAccountId(String userId,long advertiserId, String startTime, String endTime) throws NoSuchFieldException {
+
+        //用户查询自定义列数据
+        JSONObject jsonObject = materialStareMapper.getColumnInfo(userId,"1111");
+        if (Check.isNull(jsonObject)){
+            return Result.errorMsg("暂无自定义列。");
+        }
+        JSONArray array = jsonObject.getJSONArray("json");
+
+        List<KuaishouUnitReportHourlyPojo> resultList = new ArrayList<>();
+        //计算两个日期的差值
+        long day = DateUtils.getDiscrepantDays(startTime,endTime);
+
+        //时间转换 2022-08-20 ===>>> 20220820
+        long stratDate = DateUtils.getDateInteger(startTime);
+        long endDate = DateUtils.getDateInteger(endTime);
+
+        //查询 日报
+        if (day != 0){
+            resultList = kuaishouOperationRecordMapper.getKuaishouUnitReportDaily(advertiserId,stratDate,endDate);
+        }
+        //查询 时报
+        resultList = kuaishouOperationRecordMapper.getKuaishouUnitReportHourly(advertiserId,stratDate,endDate);
+
+        //自定义列数据
+        List<Map<String,Object>> list = FeidNotNullUtils.getCustomDateColumnList(resultList,array);
+
+        return Result.successMsg("查询成功",list);
+    }
+
+
+
+    /**
+     *
+     * @description: 查看组的操作记录
+     *
+     * @param advertiserId
+     * @param unitId
+     * @param startTime
+     * @param endTime
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     */
+    @Override
+    public Result getKuaishouOperationRecordByUnit(long advertiserId,long unitId,String startTime,String endTime){
+
+        List<JSONObject> list =  kuaishouOperationRecordMapper.getKuaishouOperationRecordByAdvertiserId(advertiserId,unitId,2,startTime+" 00:00:00",endTime+" 23:59:59");
+
+        return Result.successMsg("查询成功",list);
+    }
+
+
+}

+ 83 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/utils/FeidNotNullUtils.java

@@ -1,7 +1,17 @@
 package org.jeecg.ctop.material.utils;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.poi.ss.formula.functions.T;
+import org.jeecg.ctop.material.constants.Check;
+import org.jeecg.ctop.material.entity.KuaishouUnitReportHourlyPojo;
+
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Administrator
@@ -34,4 +44,77 @@ public class FeidNotNullUtils {
         }
 
     }
+
+    /**
+     *
+     * @description: 获取自定义列数据
+     * @param dateList 数据详情 example:[
+     *         {
+     *
+     *             "realname": 2,
+     *             "roleType": 3,
+     *             "create_time": "2022-08-23 01:01:33",
+     *             "authName": "202206-智能托管",
+     *             "content_log": "测试测试测试123"
+     *         },{
+     *
+     *             "realname": 2,
+     *             "roleType": 3,
+     *             "create_time": "2022-08-23 01:01:33",
+     *             "authName": "20220619-促活-优选-RTA-sf_ks-ocpm-视频-低价-单品-0619-智能托管",
+     *             "content_log": "测试测试测试123"
+     *         }]
+     *
+     *
+     *
+     * @param array 自定义列信息
+     *              example: [{
+     *         "title":"账户名称",
+     *         "dataIndex":"authName",
+     *         "align":"center",
+     *         "key":"date",
+     *         "width":150,
+     *         "fixed":"left"
+     *     },{
+     *         "title":"运营人员",
+     *         "dataIndex":"realname",
+     *         "align":"center",
+     *         "width":150,
+     *         "fixed":"left"
+     *     }]
+     *
+     *  最终返回的结果数据 example:[{
+     *             "realname": 2,
+     *             "authName": "202206-智能托管"
+     *         },{
+     *             "realname": 2,
+     *             "authName": "20220619-促活-优选-RTA-sf_ks-ocpm-视频-低价-单品-0619-智能托管"
+     *         }]
+     *
+     *
+     * @return: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
+     * @author: zianY
+     */
+    public static List<Map<String,Object>> getCustomDateColumnList(List dateList, JSONArray array) throws NoSuchFieldException{
+        List<Map<String,Object>> resultList = new ArrayList<>();
+        for (int j = 0; j < dateList.size(); j++) {
+            Object obj = dateList.get(j);
+            Map unitMap = Check.parseObj2Map(obj);
+            Map<String,Object> map = new HashMap<>();
+            for (int k =0;k < array.size();k++) {
+                JSONObject json = (JSONObject)array.get(k);
+                String fieldName = obj.getClass().getDeclaredField(json.getString("dataIndex")).getName();
+                unitMap.get(fieldName);
+                map.put(fieldName, unitMap.get(fieldName));
+            }
+            resultList.add(map);
+        }
+        return resultList;
+    }
+
+
+
+
+
+
 }

+ 4 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/mapper/MaterialTagInfoMapper.java

@@ -2,6 +2,9 @@ package cn.com.ctop.common.module.mapper;
 
 import cn.com.ctop.common.module.entity.MaterialTagInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 素材标签信息
@@ -11,4 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface MaterialTagInfoMapper extends BaseMapper<MaterialTagInfo> {
 
+    List<String> getByCode(@Param("signature") String signature);
 }

+ 5 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialTagInfoMapper.xml

@@ -2,4 +2,9 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.common.module.mapper.MaterialTagInfoMapper">
 
+    <select id="getByCode" resultType="java.lang.String">
+        select  tag_name  from  ctop_material_tag_info
+        where code = #{signature}
+    </select>
+
 </mapper>

+ 3 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/IMaterialTagInfoService.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.system.vo.LoginUser;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -19,4 +20,6 @@ public interface IMaterialTagInfoService extends IService<MaterialTagInfo> {
     Map<String, Object> getTagDetail(MaterialTagInfo materialTagInfo);
 
     void deleteByCode(String code);
+
+    List<String> getByCode(String signature);
 }

+ 2 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/IMessageTemplate.java

@@ -85,4 +85,6 @@ public interface IMessageTemplate {
     String getCopyCampaignMessage(String oldName, String state);
 
     String getTrackMessage(Long accountId, Long unitId);
+
+    String getDuXiaoManMaterialTemplate(String productName, String projectName, String materialName, String refuseReason, boolean success);
 }

+ 5 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/impl/MaterialTagInfoServiceImpl.java

@@ -103,4 +103,9 @@ public class MaterialTagInfoServiceImpl extends ServiceImpl<MaterialTagInfoMappe
         wrapper.eq("code",code);
         materialTagInfoMapper.delete(wrapper);
     }
+
+    @Override
+    public List<String> getByCode(String signature) {
+        return materialTagInfoMapper.getByCode(signature);
+    }
 }

+ 22 - 2
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/impl/MessageTemplateImpl.java

@@ -168,7 +168,7 @@ public class MessageTemplateImpl implements IMessageTemplate {
      */
 
     @Override
-    public String getKuaiShouBidTypeMessage(String projectName, Long advertiserId, Long unitId, String unit_name,String msgType) {
+    public String getKuaiShouBidTypeMessage(String projectName, Long advertiserId, Long unitId, String unit_name, String msgType) {
         StringBuilder text = new StringBuilder();
         text.append("出价方式错误预警").append("<br/>")
                 .append("您的项目:").append(projectName + ",").append("<br/>")
@@ -182,7 +182,7 @@ public class MessageTemplateImpl implements IMessageTemplate {
     }
 
     @Override
-    public String getKuaiShouBidMessage(String projectName, Long advertiserId, Long unitId, String unit_name,String msgBid) {
+    public String getKuaiShouBidMessage(String projectName, Long advertiserId, Long unitId, String unit_name, String msgBid) {
         StringBuilder text = new StringBuilder();
         text.append("出价过高预警").append("<br/>")
                 .append("您的项目:").append(projectName + ",").append("<br/>")
@@ -221,5 +221,25 @@ public class MessageTemplateImpl implements IMessageTemplate {
         return text.toString();
     }
 
+    @Override
+    public String getDuXiaoManMaterialTemplate(String productName, String projectName, String materialName, String refuseReason, boolean success) {
+        StringBuilder text = new StringBuilder();
+        text.append("脚本审核结果通知").append("<br/>")
+                .append("您的产品:").append(productName + ",").append("<br/>")
+                .append("下的项目:").append(projectName + ",").append("<br/>")
+                .append("脚本名为:").append(materialName).append("<br/>");
+        if (success) {
+            text.append("已通过审核");
+        } else {
+            text.append("已被驳回。").append("<br/>");
+        }
+        if (!Check.isNull(refuseReason)) {
+            text.append("驳回原因为:").append(refuseReason).append("</br>");
+
+        }
+        text.append("请您联系相关同学及时调整");
+        return text.toString();
+    }
+
 
 }

+ 57 - 1
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/HttpUtils.java

@@ -22,6 +22,8 @@ import org.apache.http.conn.ssl.TrustStrategy;
 import org.apache.http.cookie.Cookie;
 import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
 import org.apache.http.impl.client.BasicCookieStore;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
@@ -34,6 +36,7 @@ import org.apache.http.util.EntityUtils;
 import javax.net.ssl.SSLContext;
 import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.URI;
@@ -659,7 +662,7 @@ public class HttpUtils {
                 String value = entry.getValue().toString();
                 result += (key + "=" + value + seperator);
             }
-          result = result.substring(0, result.length() - seperator.length());
+            result = result.substring(0, result.length() - seperator.length());
         }
         return result;
     }
@@ -997,4 +1000,57 @@ public class HttpUtils {
         }
         return null;
     }
+
+    /**
+     * POST上传file文件
+     *
+     * @Param localUrl 文件本地地址
+     * @Param url 调用链接
+     * @Param params 非file文件格式的其他参数
+     */
+    public static JSONObject fileUpload(String url, String localUrl, JSONObject params) {
+        CloseableHttpResponse response = null;
+        CloseableHttpClient client = null;
+        // 构造请求
+        HttpPost httpPost = new HttpPost(url);
+        // 文件参数
+        try {
+            FileBody file = new FileBody(new File(localUrl));
+            MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create()
+                    .addPart("file", file);
+            // 其他参数
+            for (String key : params.keySet()) {
+                entityBuilder.addTextBody(key, params.getString(key));
+            }
+            HttpEntity entity = entityBuilder.build();
+            client = HttpClientBuilder.create().build();
+            httpPost.setURI(URI.create(url));
+            httpPost.setEntity(entity);
+            response = client.execute(httpPost);
+            if (response != null && response.getStatusLine().getStatusCode() == 200) {
+                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
+                StringBuilder result = new StringBuilder();
+                String line = "";
+                while ((line = bufferedReader.readLine()) != null) {
+                    result.append(line);
+                }
+                bufferedReader.close();
+                return JSONObject.parseObject(result.toString());
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                if (null != client) {
+                    client.close();
+                }
+            } catch (IOException e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return null;
+    }
 }

+ 57 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/KuaishouDuXiaoManAPIConstant.java

@@ -0,0 +1,57 @@
+package cn.com.ctop.common.module.utils;
+
+/**
+ * 快手 度小满 API接口常量
+ */
+public class KuaishouDuXiaoManAPIConstant {
+
+    /**
+     * 查询渠道
+     * GET方式
+     */
+    public static final String MATERIAL_CHANNEL = "/client/api/material_channel";
+
+    /**
+     * 查询通用素材分类
+     * GET方式
+     */
+    public static final String MATERIAL_TYPE = "/client/api/material_type";
+
+    /**
+     * 上传单个文件,用于后续提交报备
+     * POST方式
+     */
+    public static final String MATERIAL_UPLOAD = "/client/api/material_upload";
+
+    /**
+     * 素材报备
+     * POST方式
+     */
+    public static final String MATERIAL_REPORT = "/client/api/material_report";
+
+    /**
+     * 查询报备状态
+     * Get方式
+     */
+    public static final String MATERIAL_DETAIL = "/client/api/material_detail";
+
+    /**
+     * 审核图片预览
+     * Get方式
+     */
+    public static final String MATERIAL_BOS = "/client/api/material_bos";
+
+    /**
+     * 撤回审核任务
+     * POST方式
+     */
+    public static final String MATERIAL_REVOKE = "/client/api/material_revoke";
+
+    /**
+     * 更新任务信息
+     * POST方式
+     */
+    public static final String MATERIAL_UPDATE = "/client/api/material_update";
+
+
+}

+ 22 - 3
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java

@@ -2,11 +2,19 @@ package cn.com.ctop.common.module.utils;
 
 import org.apache.commons.codec.digest.DigestUtils;
 import org.jeecg.common.util.encryption.AesEncryptUtil;
-
-import java.io.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.security.MessageDigest;
 import java.util.Map;
 
 public class LoadFileUtil {
@@ -68,7 +76,7 @@ public class LoadFileUtil {
      * @return
      * @throws IOException
      */
-    public static String downLoadFromUrlAndName(String urlStr, String savePath,String fileName) {
+    public static String downLoadFromUrlAndName(String urlStr, String savePath, String fileName) {
         try {
             URL url = new URL(urlStr);
 
@@ -235,5 +243,16 @@ public class LoadFileUtil {
         return null;
     }
 
+    public static String getMd5ByFile(MultipartFile file) {
+        try {
+            byte[] uploadBytes = file.getBytes();
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte[] digest = md5.digest(uploadBytes);
+            return new BigInteger(1, digest).toString(16);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 
 }

+ 39 - 1
jeecg-boot-module-system/src/main/java/cn/com/ctop/shiwan/modules/FileUtil.java

@@ -10,6 +10,7 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import java.io.*;
 import java.net.URL;
+import java.net.URLConnection;
 import java.util.Date;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
@@ -225,6 +226,43 @@ public class FileUtil {
             }
         }
     }
-
+    /**
+     * url资源转化为file流
+     * @param url
+     * @return
+     */
+    public static File urlToFile(URL url) {
+        InputStream is = null;
+        File file = null;
+        FileOutputStream fos = null;
+        try {
+            file = File.createTempFile("tmp", null);
+            URLConnection urlConn = null;
+            urlConn = url.openConnection();
+            is = urlConn.getInputStream();
+            fos = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int length;
+            while ((length = is.read(buffer)) > 0) {
+                fos.write(buffer, 0, length);
+            }
+            return file;
+        } catch (IOException e) {
+            return null;
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                }
+            }
+            if (fos != null) {
+                try {
+                    fos.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
 
 }

+ 282 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/controller/DuxiaomanMaterialInfoController.java

@@ -0,0 +1,282 @@
+package org.jeecg.modules.duxiaoman.controller;
+
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.MD5Util;
+import org.jeecg.modules.duxiaoman.entity.DuxiaomanMaterialInfo;
+import org.jeecg.modules.duxiaoman.service.IDuxiaomanMaterialInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 度小满素材信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2022-08-15
+ */
+@Slf4j
+@Api(tags = "度小满素材信息")
+@RestController
+@RequestMapping("/duxiaoman/materialInfo")
+public class DuxiaomanMaterialInfoController {
+    @Autowired
+    private IDuxiaomanMaterialInfoService duxiaomanMaterialInfoService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param duxiaomanMaterialInfo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "度小满素材信息-分页列表查询", notes = "度小满素材信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<DuxiaomanMaterialInfo>> queryPageList(DuxiaomanMaterialInfo duxiaomanMaterialInfo,
+                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                              HttpServletRequest req) {
+        String materialName = duxiaomanMaterialInfo.getMaterialName();
+        duxiaomanMaterialInfo.setMaterialName(null);
+        Result<IPage<DuxiaomanMaterialInfo>> result = new Result<>();
+        QueryWrapper<DuxiaomanMaterialInfo> queryWrapper = QueryGenerator.initQueryWrapper(duxiaomanMaterialInfo, req.getParameterMap());
+        if (!Check.isNull(materialName)) {
+            queryWrapper.like("material_name", materialName);
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getUserId())) {
+            queryWrapper.eq("user_id", duxiaomanMaterialInfo.getUserId());
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getType())) {
+            queryWrapper.eq("type", duxiaomanMaterialInfo.getType());
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getStatus())) {
+            queryWrapper.eq("status", duxiaomanMaterialInfo.getStatus());
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getProductId())) {
+            queryWrapper.eq("product_id", duxiaomanMaterialInfo.getProductId());
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getProjectId())) {
+            queryWrapper.eq("project_id", duxiaomanMaterialInfo.getProjectId());
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getSignature())) {
+            queryWrapper.eq("signature", duxiaomanMaterialInfo.getSignature());
+        }
+        if (!Check.isNull(duxiaomanMaterialInfo.getEndDate())) {
+            queryWrapper.le("stat_date", duxiaomanMaterialInfo.getEndDate());
+            queryWrapper.gt("stat_date", duxiaomanMaterialInfo.getStartDate());
+        }
+        queryWrapper.orderByDesc("create_time");
+        Page<DuxiaomanMaterialInfo> page = new Page<DuxiaomanMaterialInfo>(pageNo, pageSize);
+        IPage<DuxiaomanMaterialInfo> pageList = duxiaomanMaterialInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     */
+    @PostMapping(value = "/add")
+    public Result<Object> add(@RequestBody JSONObject json) {
+        try {
+            return duxiaomanMaterialInfoService.add(json);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return Result.error("失败");
+    }
+
+    /**
+     * 批量添加
+     */
+    @PostMapping(value = "/addMore")
+    public Result<Object> addMore(@RequestBody JSONObject json) {
+        try {
+            JSONArray array = json.getJSONArray("videoArray");
+            Long projectId = json.getLong("projectId");
+            for (int i = 0; i < array.size(); i++) {
+                JSONObject data = array.getJSONObject(i);
+                String url = "https:" + data.getString("url");
+                data.put("url", url);
+                data.put("signature", MD5Util.md5ByUrl(url));
+                data.put("projectId", projectId);
+                duxiaomanMaterialInfoService.add(data);
+                Thread.sleep(1000);
+            }
+            return Result.ok("成功");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return Result.error("失败");
+    }
+
+    /**
+     * 上传素材
+     */
+    @PostMapping(value = "/upload")
+    public Result<Object> upload(@RequestBody DuxiaomanMaterialInfo materialInfo) {
+        try {
+            return duxiaomanMaterialInfoService.upload(materialInfo);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return Result.error("失败");
+    }
+
+    /**
+     * 编辑
+     */
+    @ApiOperation(value = "度小满素材信息-编辑", notes = "度小满素材信息-编辑")
+    @PostMapping(value = "/edit")
+    public Result<DuxiaomanMaterialInfo> edit(@RequestBody DuxiaomanMaterialInfo duxiaomanMaterialInfo) {
+        Result<DuxiaomanMaterialInfo> result = new Result<DuxiaomanMaterialInfo>();
+        DuxiaomanMaterialInfo duxiaomanMaterialInfoEntity = duxiaomanMaterialInfoService.getById(duxiaomanMaterialInfo.getId());
+        if (duxiaomanMaterialInfoEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = duxiaomanMaterialInfoService.updateById(duxiaomanMaterialInfo);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * 编辑
+     */
+    @PostMapping(value = "/editMore")
+    public Result<DuxiaomanMaterialInfo> editMore(@RequestBody JSONObject data) {
+        Result<DuxiaomanMaterialInfo> result = null;
+        try {
+            JSONArray array = data.getJSONArray("array");
+            result = new Result<DuxiaomanMaterialInfo>();
+            List<DuxiaomanMaterialInfo> list = JSONArray.parseObject(array.toJSONString(), List.class);
+            boolean ok = duxiaomanMaterialInfoService.updateBatchById(list);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.error500("修改失败");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "度小满素材信息-通过id删除", notes = "度小满素材信息-通过id删除")
+    @GetMapping(value = "/deleteById")
+    public Result<?> delete(@RequestParam(name = "id") String id) {
+        try {
+            duxiaomanMaterialInfoService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @ApiOperation(value = "度小满素材信息-批量删除", notes = "度小满素材信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<DuxiaomanMaterialInfo> deleteBatch(@RequestParam(name = "ids") String ids) {
+        Result<DuxiaomanMaterialInfo> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.duxiaomanMaterialInfoService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "度小满素材信息-通过id查询", notes = "度小满素材信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<Object> queryById(@RequestParam(name = "id", required = true) String id) {
+        JSONObject obj = new JSONObject();
+        DuxiaomanMaterialInfo duxiaomanMaterialInfo = duxiaomanMaterialInfoService.getById(id);
+        if (Check.isNull(duxiaomanMaterialInfo)) {
+            return Result.error("未查询到实体");
+        }
+        return duxiaomanMaterialInfoService.getPersonnelInfo(duxiaomanMaterialInfo);
+    }
+
+
+    /**
+     * 将1-待上传状态的素材 进行 上传媒体
+     */
+    @GetMapping(value = "/uploadMaterial")
+    public void uploadMaterial(String id) {
+        DuxiaomanMaterialInfo materialInfo = duxiaomanMaterialInfoService.getById(id);
+        duxiaomanMaterialInfoService.uploadMaterial(materialInfo);
+    }
+
+    /**
+     * 将7-上传成功状态的素材 进行 素材报备
+     */
+    @GetMapping(value = "/materialReport")
+    public void materialReport(String id) {
+        DuxiaomanMaterialInfo materialInfo = duxiaomanMaterialInfoService.getById(id);
+        duxiaomanMaterialInfoService.materialReport(materialInfo);
+    }
+
+
+    /**
+     * 将2-审批中状态的素材 进行 更新报备状态
+     */
+    @GetMapping(value = "/materialDetail")
+    public void materialDetail(String id) {
+        DuxiaomanMaterialInfo materialInfo = duxiaomanMaterialInfoService.getById(id);
+        duxiaomanMaterialInfoService.materialDetail(materialInfo);
+    }
+
+    /**
+     * 将2-审批中状态的素材 进行 更新报备状态
+     */
+    @GetMapping(value = "/getMaterialChannelAndType")
+    public Result<Object> getMaterialChannelAndType(String id) {
+        JSONObject obj = new JSONObject();
+        obj.put("channel", duxiaomanMaterialInfoService.getMaterialChannel());
+        obj.put("type", duxiaomanMaterialInfoService.getMaterialType());
+        return Result.ok(obj);
+    }
+
+}

+ 174 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/entity/DuxiaomanMaterialInfo.java

@@ -0,0 +1,174 @@
+package org.jeecg.modules.duxiaoman.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 度小满素材信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2022-08-15
+ */
+@Data
+@TableName("ctop_duxiaoman_material_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_duxiaoman_material_info对象", description = "度小满素材信息")
+public class DuxiaomanMaterialInfo {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * signature
+     */
+    @Excel(name = "signature", width = 15)
+    @ApiModelProperty(value = "signature")
+    private String signature;
+    /**
+     * 上传日期
+     */
+    @Excel(name = "statDate", width = 15)
+    @ApiModelProperty(value = "statDate")
+    private String statDate;
+    /**
+     * url
+     */
+    @Excel(name = "url", width = 15)
+    @ApiModelProperty(value = "url")
+    private String url;
+
+    /**
+     * 封面url
+     */
+    @Excel(name = "coverUrl", width = 15)
+    @ApiModelProperty(value = "coverUrl")
+    private String coverUrl;
+    /**
+     * 报备文件id
+     */
+    @Excel(name = "fileId", width = 15)
+    @ApiModelProperty(value = "fileId")
+    private String fileId;
+    /**
+     * 审核任务ID
+     */
+    @Excel(name = "auditTaskId", width = 15)
+    @ApiModelProperty(value = "auditTaskId")
+    private String auditTaskId;
+    /**
+     * 素材名称
+     */
+    @Excel(name = "素材名称", width = 15)
+    @ApiModelProperty(value = "素材名称")
+    private String materialName;
+    /**
+     * 项目id
+     */
+    @Excel(name = "项目id", width = 15)
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称", width = 15)
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+    /**
+     * 产品id
+     */
+    @Excel(name = "产品id", width = 15)
+    @ApiModelProperty(value = "产品id")
+    private Long productId;
+    /**
+     * 产品名
+     */
+    @Excel(name = "产品名", width = 15)
+    @ApiModelProperty(value = "产品名")
+    private String productName;
+    /**
+     * 创建人id
+     */
+    @Excel(name = "创建人id", width = 15)
+    @ApiModelProperty(value = "创建人id")
+    private String userId;
+    /**
+     * 审核人
+     */
+    @Excel(name = "审核人", width = 15)
+    @ApiModelProperty(value = "审核人")
+    private String auditorId;
+    /**
+     * 0-待审核,1-预审核,2-待上传,3-上传成功,4-预审拒绝,5-媒体拒绝
+     */
+    @Excel(name = "0-待审核,1-待上传,2-审批中,3-审核通过,4-审核不通过,5-预审核,6-预审核拒绝,7-上传成功,8-上传失败", width = 15)
+    @ApiModelProperty(value = "0-待审核,1-待上传,2-审批中,3-审核通过,4-审核不通过,5-预审核,6-预审核拒绝,7-上传成功,8-上传失败")
+    private Integer status;
+    /**
+     * 通过审核时间
+     */
+    @Excel(name = "通过审核时间", width = 15)
+    @ApiModelProperty(value = "通过审核时间")
+    private String confirmTime;
+    /**
+     * 拒绝原因
+     */
+    @Excel(name = "拒绝原因", width = 15)
+    @ApiModelProperty(value = "拒绝原因")
+    private String refuseReason;
+
+    /**
+     * 文案
+     */
+    @Excel(name = "文案", width = 15)
+    @ApiModelProperty(value = "文案")
+    private String creativeCopywriter;
+    /**
+     * 素材类型,VIDEO-视频,SCRIPT-脚本
+     */
+    @Excel(name = "素材类型", width = 15)
+    @ApiModelProperty(value = "素材类型")
+    private String type;
+    /**
+     * 视频描述
+     */
+    @Excel(name = "视频描述", width = 15)
+    @ApiModelProperty(value = "视频描述")
+    private String materialDescribe;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    /**
+     * 开始时间
+     */
+    @TableField(exist = false)
+    private String startDate;
+
+    /**
+     * 结束时间
+     */
+    @TableField(exist = false)
+    private String endDate;
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/mapper/DuxiaomanMaterialInfoMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.duxiaoman.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.duxiaoman.entity.DuxiaomanMaterialInfo;
+
+/**
+ * 度小满素材信息
+ *
+ * @author jeecg-boot
+ * 2022-08-15
+ * @version V1.0
+ */
+public interface DuxiaomanMaterialInfoMapper extends BaseMapper<DuxiaomanMaterialInfo> {
+
+}

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/mapper/xml/DuxiaomanMaterialInfoMapper.xml

@@ -0,0 +1,5 @@
+<?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="org.jeecg.modules.duxiaoman.mapper.DuxiaomanMaterialInfoMapper">
+
+</mapper>

+ 39 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/service/IDuxiaomanMaterialInfoService.java

@@ -0,0 +1,39 @@
+package org.jeecg.modules.duxiaoman.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.duxiaoman.entity.DuxiaomanMaterialInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 度小满素材信息
+ *
+ * @author jeecg-boot
+ * 2022-08-15
+ * @version V1.0
+ */
+public interface IDuxiaomanMaterialInfoService extends IService<DuxiaomanMaterialInfo> {
+
+    /**
+     *查询渠道
+     */
+    JSONObject getMaterialChannel();
+
+    /**
+     *查询渠道
+     */
+     JSONObject getMaterialType();
+
+    Result<Object> upload(DuxiaomanMaterialInfo materialInfo);
+
+    void uploadMaterial(DuxiaomanMaterialInfo materialInfo);
+
+    void materialReport(DuxiaomanMaterialInfo materialInfo);
+
+    void materialDetail(DuxiaomanMaterialInfo materialInfo);
+
+    Result<Object> add(JSONObject json);
+
+    Result<Object> getPersonnelInfo(DuxiaomanMaterialInfo duxiaomanMaterialInfo);
+}

+ 543 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/duxiaoman/service/impl/DuxiaomanMaterialInfoServiceImpl.java

@@ -0,0 +1,543 @@
+package org.jeecg.modules.duxiaoman.service.impl;
+
+import cn.com.ctop.common.module.entity.MaterialAscription;
+import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.common.module.entity.MaterialParameter;
+import cn.com.ctop.common.module.entity.MaterialTagInfo;
+import cn.com.ctop.common.module.entity.Product;
+import cn.com.ctop.common.module.entity.Project;
+import cn.com.ctop.common.module.entity.TagInfo;
+import cn.com.ctop.common.module.mapper.MaterialAscriptionMapper;
+import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
+import cn.com.ctop.common.module.mapper.MaterialParameterMapper;
+import cn.com.ctop.common.module.service.IMaterialCutFrameService;
+import cn.com.ctop.common.module.service.IMaterialImageInfoService;
+import cn.com.ctop.common.module.service.IMaterialInfoService;
+import cn.com.ctop.common.module.service.IMaterialTagInfoService;
+import cn.com.ctop.common.module.service.IMessageTemplate;
+import cn.com.ctop.common.module.service.IProductService;
+import cn.com.ctop.common.module.service.IProjectService;
+import cn.com.ctop.common.module.service.ISendMessageService;
+import cn.com.ctop.common.module.service.ISysUserService;
+import cn.com.ctop.common.module.service.ITagInfoService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.CloudVideoProcessUtil;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.common.module.utils.KuaishouDuXiaoManAPIConstant;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import it.sauronsoftware.jave.Encoder;
+import it.sauronsoftware.jave.MultimediaInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.entity.SysUser;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.duxiaoman.entity.DuxiaomanMaterialInfo;
+import org.jeecg.modules.duxiaoman.mapper.DuxiaomanMaterialInfoMapper;
+import org.jeecg.modules.duxiaoman.service.IDuxiaomanMaterialInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLDecoder;
+import java.nio.channels.FileChannel;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 度小满素材信息
+ *
+ * @author jeecg-boot
+ * 2022-08-15
+ * @version V1.0
+ */
+@Slf4j
+@Service
+public class DuxiaomanMaterialInfoServiceImpl extends ServiceImpl<DuxiaomanMaterialInfoMapper, DuxiaomanMaterialInfo> implements IDuxiaomanMaterialInfoService {
+
+    @Value("${duxiaoman.url}")
+    private String duUrl;
+
+    @Value("${duxiaoman.appId}")
+    private String duAppId;
+
+    @Value("${duxiaoman.token}")
+    private String duToken;
+
+    @Value("${oss.replace.download}")
+    private String downloadUrl;
+
+    @Autowired
+    private IMaterialInfoService materialInfoService;
+
+    @Autowired
+    private IMaterialImageInfoService materialImageInfoService;
+
+    @Resource
+    private IMaterialCutFrameService materialCutFrameService;
+
+    @Autowired
+    private IMaterialTagInfoService materialTagInfoService;
+
+    @Autowired
+    private ITagInfoService tagInfoService;
+
+    @Resource
+    private MaterialParameterMapper materialParameterMapper;
+
+    @Resource
+    private MaterialInfoMapper materialInfoMapper;
+
+    @Resource
+    private MaterialAscriptionMapper materialAscriptionMapper;
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private IProjectService projectService;
+
+    @Autowired
+    private IProductService productService;
+
+    @Autowired
+    private IMessageTemplate messageTemplate;
+
+    @Autowired
+    private ISendMessageService sendMessageService;
+
+
+    static ExecutorService uploadService = Executors.newFixedThreadPool(3);
+    private static ExecutorService uploadExecutorService = Executors.newFixedThreadPool(5);
+
+    @Override
+    public JSONObject getMaterialChannel() {
+        String datetime = new Date().getTime() + "";
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("app_id", duAppId);
+        params.put("datetime", datetime);
+        StringBuffer md5Str = new StringBuffer();
+        md5Str.append("app_id=").append(duAppId)
+                .append("&datetime=").append(datetime).append(duToken);
+        String sign = DigestUtils.md5Hex(md5Str.toString());
+        params.put("sign", sign);
+        String resultStr = HttpUtils.httpGetRequest(duUrl + KuaishouDuXiaoManAPIConstant.MATERIAL_CHANNEL, null, params);
+        JSONObject resultJson = JSONObject.parseObject(resultStr);
+        log.info("----------查询渠道:{}", resultJson);
+        return resultJson;
+    }
+
+    @Override
+    public JSONObject getMaterialType() {
+        String datetime = new Date().getTime() + "";
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("app_id", duAppId);
+        params.put("datetime", datetime);
+        StringBuffer md5Str = new StringBuffer();
+        md5Str.append("app_id=").append(duAppId)
+                .append("&datetime=").append(datetime).append(duToken);
+        String sign = DigestUtils.md5Hex(md5Str.toString());
+        params.put("sign", sign);
+        String resultStr = HttpUtils.httpGetRequest(duUrl + KuaishouDuXiaoManAPIConstant.MATERIAL_TYPE, null, params);
+        JSONObject resultJson = JSONObject.parseObject(resultStr);
+        log.info("----------查询通用素材分类:{}", resultJson);
+        return resultJson;
+    }
+
+    @Override
+    public Result<Object> upload(DuxiaomanMaterialInfo materialInfo) {
+        try {
+            String fileConfigId = "5";
+            if ("VIDEO".equals(materialInfo.getType())) {
+                fileConfigId = "3";
+            }
+            String requestUrl = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.VIDEO_UPLOAD;
+            String localUrl = LoadFileUtil.downLoadFromUrl(materialInfo.getUrl(), downloadUrl);
+            String md5 = LoadFileUtil.getMD5(localUrl);
+            String datetime = new Date().getTime() + "";
+            JSONObject params = new JSONObject();
+            params.put("app_id", duAppId);
+            params.put("datetime", datetime);
+            params.put("signature", md5);
+            params.put("file_config_id", fileConfigId);
+            StringBuffer md5Str = new StringBuffer();
+            md5Str.append("app_id=").append(duAppId)
+                    .append("&datetime=").append(datetime)
+                    .append("&file_config_id=").append(fileConfigId)
+                    .append("&signature=").append(md5).append(duToken);
+            String sign = DigestUtils.md5Hex(md5Str.toString());
+            params.put("sign", sign);
+            JSONObject resultJson = HttpUtils.fileUpload(duUrl + KuaishouDuXiaoManAPIConstant.MATERIAL_UPLOAD, localUrl, params);
+            log.info("----------素材上传:{}", resultJson);
+            if (!Check.isNull(resultJson) && resultJson.getInteger("retCode") == 0) {
+                JSONObject result = resultJson.getJSONObject("result");
+                materialInfo.setFileId(result.getString("file_id"));
+                materialReport(materialInfo);
+                //7:上传成功
+                materialInfo.setStatus(7);
+            } else {
+                //8:上传失败
+                materialInfo.setStatus(8);
+            }
+            baseMapper.updateById(materialInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return Result.ok();
+    }
+
+
+    /**
+     * 素材报备
+     */
+    @Override
+    public void materialReport(DuxiaomanMaterialInfo materialInfo) {
+        try {
+            //素材分类: 1110004-视频,1110006-脚本
+            String type = "1110006";
+            if ("VIDEO".equals(materialInfo.getType())) {
+                type = "1110004";
+            }
+
+            String datetime = new Date().getTime() + "";
+            TreeMap<String, Object> params = new TreeMap<>();
+            params.put("app_id", duAppId);
+            params.put("datetime", datetime);
+            //渠道id 快手-3715834215185534246 ,今日头条-3715778792927469631, 微信支付-3715834386984222891
+            params.put("channel_id", "3715834215185534246");
+            //素材分类: 1110004-视频,1110006-脚本
+            params.put("type", type);
+            //素材文件id
+            params.put("file_ids", materialInfo.getFileId());
+            //素材中使用的版权内容已获得有效书面授权书 默认值 1
+            params.put("authorize", "1");
+            StringBuffer md5Str = new StringBuffer();
+            md5Str.append("app_id=").append(duAppId)
+                    .append("&authorize=1")
+                    .append("&channel_id=").append("3715834215185534246")
+                    .append("&datetime=").append(datetime)
+                    .append("&file_ids=").append(materialInfo.getFileId())
+                    .append("&type=").append(type).append(duToken);
+            String sign = DigestUtils.md5Hex(md5Str.toString());
+            params.put("sign", sign);
+            String resultStr = HttpUtils.httpPostRequest(duUrl + KuaishouDuXiaoManAPIConstant.MATERIAL_REPORT, params, null);
+            JSONObject resultJson = JSONObject.parseObject(resultStr);
+            log.info("----------素材报备:{}", resultJson);
+            if ((!Check.isNull(resultJson) && resultJson.getInteger("retCode") == 0)
+                    || (!Check.isNull(resultJson) && resultJson.getInteger("retCode") == 1 && resultJson.getString("retMsg").contains("已送审"))) {
+                //2:审批中
+                materialInfo.setStatus(2);
+                materialInfo.setAuditTaskId(resultJson.getString("result"));
+                baseMapper.updateById(materialInfo);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 查询报备状态
+     */
+    @Override
+    public void materialDetail(DuxiaomanMaterialInfo materialInfo) {
+        try {
+            String datetime = new Date().getTime() + "";
+            TreeMap<String, Object> params = new TreeMap<>();
+            params.put("app_id", duAppId);
+            params.put("datetime", datetime);
+            //审核任务 id
+            params.put("id", materialInfo.getAuditTaskId());
+            StringBuffer md5Str = new StringBuffer();
+            md5Str.append("app_id=").append(duAppId)
+                    .append("&datetime=").append(datetime)
+                    .append("&id=").append(materialInfo.getAuditTaskId()).append(duToken);
+            String sign = DigestUtils.md5Hex(md5Str.toString());
+            params.put("sign", sign);
+            String resultStr = HttpUtils.httpPostRequest(duUrl + KuaishouDuXiaoManAPIConstant.MATERIAL_DETAIL, params, null);
+            JSONObject resultJson = JSONObject.parseObject(resultStr);
+            log.info("----------查询报备状态:{}", resultJson);
+            if (!Check.isNull(resultJson) && resultJson.getInteger("retCode") == 0) {
+                JSONObject result = resultJson.getJSONObject("result");
+                Integer auditStatus = result.getInteger("audit_status");
+
+                materialInfo.setStatus(auditStatus);
+                materialInfo.setConfirmTime(result.getString("audit_time"));
+                materialInfo.setRefuseReason(result.getString("audit_reason"));
+                //3 审核通过 同步到素材表
+                if (auditStatus == 3) {
+                    syncMaterial(materialInfo);
+                }
+                if ("SCRIPT".equals(materialInfo.getType())) {
+                    Project project = projectService.getById(materialInfo.getProjectId());
+                    String text = messageTemplate.getDuXiaoManMaterialTemplate(materialInfo.getProductName(), project.getProjectName(), materialInfo.getMaterialName(), materialInfo.getRefuseReason(), true);
+                    sendMessageService.sendMessage(materialInfo.getUserId(), text);
+                }
+            } else {
+                JSONObject result = resultJson.getJSONObject("result");
+                materialInfo.setStatus(result.getInteger("audit_status"));
+                materialInfo.setConfirmTime(result.getString("audit_time"));
+                materialInfo.setRefuseReason(result.getString("audit_reason"));
+                if ("SCRIPT".equals(materialInfo.getType()) && materialInfo.getStatus() == 4) {
+                    Project project = projectService.getById(materialInfo.getProjectId());
+                    String text = messageTemplate.getDuXiaoManMaterialTemplate(materialInfo.getProductName(), project.getProjectName(), materialInfo.getMaterialName(), materialInfo.getRefuseReason(), false);
+                    sendMessageService.sendMessage(materialInfo.getUserId(), text);
+                }
+            }
+            baseMapper.updateById(materialInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 将审核通过的素材同步到 ctop_material_info 表中
+     */
+    private void syncMaterial(DuxiaomanMaterialInfo materialInfo) {
+        MaterialInfo info = new MaterialInfo();
+        BeanUtil.copyProperties(materialInfo, info);
+        info.setStatus(1);
+        info.setCode(materialInfo.getSignature());
+        info.setType("VIDEO");
+        info.setId(UUID.randomUUID().toString());
+        materialInfoService.save(info);
+        getFile(info);
+
+    }
+
+    @Override
+    public void uploadMaterial(DuxiaomanMaterialInfo materialInfo) {
+        uploadService.submit(new Runnable() {
+            @Override
+            public void run() {
+                upload(materialInfo);
+            }
+        });
+    }
+
+
+    @Override
+    public Result<Object> add(JSONObject json) {
+        try {
+            String userId = json.getString("userId");
+            String signature = json.getString("signature");
+            String url = json.getString("url");
+            if (!json.getString("url").contains("https")) {
+                url = "https:" + json.getString("url");
+            }
+            DuxiaomanMaterialInfo info = new DuxiaomanMaterialInfo();
+            Long projectId = json.getLong("projectId");
+            Project project = projectService.getById(projectId);
+            if (!Check.isNull(project)) {
+                info.setProductId(project.getProductId());
+                info.setProjectName(project.getProjectName());
+                Product product = productService.getById(info.getProductId());
+                if (!Check.isNull(product)) {
+                    info.setProductName(product.getProductName());
+                }
+            }
+
+            info.setId(UUID.randomUUID().toString().replace("-", ""));
+            info.setStatDate(DateUtils.formatDate(new Date()));
+            info.setSignature(signature);
+            info.setUrl(url);
+            info.setUserId(userId);
+            info.setProjectId(projectId);
+            info.setStatus(0);
+            info.setMaterialName(json.getString("materialName"));
+            info.setMaterialDescribe(json.getString("materialDescribe"));
+            info.setType(json.getString("type"));
+            String videoUrl = URLDecoder.decode(info.getUrl()).replace("https://media-1301855440.cos.ap-chongqing.myqcloud.com/", "");
+            String loadImage = "cutFrame/" + signature + "/zero.jpg";
+            try {
+                String coverUrl = CloudVideoProcessUtil.videoCutPictureHandle(videoUrl, loadImage);
+                info.setCoverUrl(coverUrl);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            this.save(info);
+
+            Map<String, Object> deleteMap = new HashMap<>();
+            deleteMap.put("material_id", info.getSignature());
+            JSONObject ascription = json.getJSONObject("ascription");
+            if (!Check.isNull(ascription)) {
+                MaterialAscription materialAscription = new MaterialAscription();
+                materialAscription.setMaterialId(info.getSignature());
+                String clipId = ascription.getString("clipId");
+                if (null != clipId && !"".equals(clipId.trim())) {
+                    materialAscription.setClipId(clipId);
+                }
+                materialAscription.setShotId(ascription.getString("shotId"));
+                materialAscription.setPlanId(ascription.getString("planId"));
+                materialAscription.setPlaneId(ascription.getString("planeId"));
+                materialAscription.setCode(info.getSignature());
+                materialAscriptionMapper.deleteByMap(deleteMap);
+                //TODO 需要添加获取设计负责人代码
+                SysUser clip = userService.getById(clipId);
+                String roleCode = userService.getRoleCodeByUserId(clipId);
+                String leaderName = "";
+                String leaderId = "";
+                if ("designTeamLeader".equals(roleCode)) {
+                    leaderId = clipId;
+
+                    leaderName = clip.getRealname();
+                } else {
+                    leaderId = clip.getLeaderId();
+                    leaderName = clip.getLeaderName();
+                }
+                materialAscription.setLeaderName(leaderName);
+                materialAscription.setLeaderId(leaderId);
+                int result = materialAscriptionMapper.insert(materialAscription);
+            }
+            materialTagInfoService.deleteByCode(signature);
+            JSONArray modalityTagList = json.getJSONArray("modalityTagList");
+            insertTagList(signature, userId, modalityTagList);
+            JSONArray contentTagList = json.getJSONArray("contentTagList");
+            insertTagList(signature, userId, contentTagList);
+            JSONArray senceTagList = json.getJSONArray("senceTagList");
+            insertTagList(signature, userId, senceTagList);
+            JSONArray modTagList = json.getJSONArray("modTagList");
+            insertTagList(signature, userId, modTagList);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("fail," + e.getMessage());
+        }
+        return Result.ok("success");
+    }
+
+
+    /**
+     * 添加标签
+     */
+    private void insertTagList(String code, String userId, JSONArray tagList) {
+        if (null != tagList && !tagList.isEmpty()) {
+            for (int m = 0; m < tagList.size(); m++) {
+                Long tagId = tagList.getLong(m);
+                TagInfo tagInfo = tagInfoService.getById(tagId);
+                MaterialTagInfo setTag = new MaterialTagInfo(code, tagInfo, userId);
+                setTag.setCategoryId(tagInfo.getTagCategoryId());
+                materialTagInfoService.save(setTag);
+            }
+        }
+    }
+
+
+    /**
+     * 录入素材信息
+     */
+    public void getFile(MaterialInfo materialInfo) {
+        uploadExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                log.info("获取素材基本信息,code:{}", materialInfo.getCode());
+                String url = materialInfo.getUrl();
+                log.info("replaceUrl:{}", url);
+                String localUrl = null;
+                MultimediaInfo m = null;
+                FileInputStream fis = null;
+                try {
+                    localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+                    File file = new File(localUrl);
+                    it.sauronsoftware.jave.Encoder encoder = new Encoder();
+                    m = encoder.getInfo(file);
+                    long duration = m.getDuration();
+                    long secondDuration = duration / 1000;
+                    MaterialParameter materialParameter = new MaterialParameter();
+                    materialParameter.setMaterialId(materialInfo.getCode());
+                    // 视频秒数
+                    materialParameter.setSecond(secondDuration);
+                    // 视频格式
+                    materialParameter.setFormat(m.getFormat());
+                    // 视频宽
+                    String width = String.valueOf(m.getVideo().getSize().getWidth());
+                    materialParameter.setWidth(width);
+                    // 视频高
+                    String height = String.valueOf(m.getVideo().getSize().getHeight());
+                    materialParameter.setHeight(height);
+                    fis = new FileInputStream(file);
+                    FileChannel fc = fis.getChannel();
+                    BigDecimal fileSize = new BigDecimal(fc.size());
+                    String size = fileSize.divide(new BigDecimal(1048576), 2, RoundingMode.HALF_UP) + "MB";
+                    materialParameter.setSize(size);
+                    materialParameter.setUpdateTime(new Date());
+
+                    Map<String, Object> deleteMap = new HashMap<>();
+                    deleteMap.put("material_id", materialInfo.getId());
+                    materialParameterMapper.deleteByMap(deleteMap);
+                    int insert = materialParameterMapper.insert(materialParameter);
+                    // 默认抽帧 素造供应商
+                 /*   Long templateId = MaterialSupplierEnum.getTemplateIdBySize(Integer.valueOf(width), Integer.valueOf(height));
+                    if (!Check.isNull(templateId)) {
+                        Thread thread = new Thread() {
+                            @Override
+                            public void run() {
+                                watermarkVideoBySupplierCode(materialInfo.getCode(), materialInfo.getUrl(), templateId);
+                            }
+                        };
+                        thread.start();
+                    }*/
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    try {
+                        if (fis != null) {
+                            fis.close();
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                    LoadFileUtil.delFile(localUrl);
+                }
+            }
+        });
+    }
+
+    @Override
+    public Result<Object> getPersonnelInfo(DuxiaomanMaterialInfo info) {
+        JSONObject obj = new JSONObject();
+        if (!Check.isNull(info.getAuditorId())) {
+            String auditorName = materialInfoMapper.selectUserNameById(info.getAuditorId());
+            obj.put("auditorName", auditorName);
+        } else {
+            obj.put("auditorName", "");
+        }
+        obj.put("info", info);
+        List<String> tagList = materialTagInfoService.getByCode(info.getSignature());
+        if (!Check.isNull(tagList)) {
+            obj.put("tag", tagList);
+        }
+        QueryWrapper<MaterialParameter> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("material_id", info.getSignature());
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
+        MaterialParameter materialParameter = materialParameterMapper.selectOne(queryWrapper);
+        if (!Check.isNull(materialParameter)) {
+            obj.put("parameter", materialParameter);
+        }
+        JSONObject ascriptionJson = materialAscriptionMapper.selectByMaterialId(info.getSignature());
+        if (!Check.isNull(ascriptionJson)) {
+            obj.put("ascription", ascriptionJson);
+        }
+        return Result.ok(obj);
+    }
+}

+ 16 - 11
jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-dev.yml

@@ -76,10 +76,10 @@ spring:
   autoconfigure:
     exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
   datasource:
-#---------------------线上库
-#    url: jdbc:mysql://139.186.27.96:3390/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
-#    username: readonly
-#    password: hcst@2021
+    #---------------------线上库
+    #    url: jdbc:mysql://139.186.27.96:3390/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
+    #    username: readonly
+    #    password: hcst@2021
     #---------------------测试库
     url: jdbc:mysql://139.186.165.84:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&allowMultiQueries=true
     username: hcst
@@ -122,13 +122,13 @@ spring:
       datasource:
         master:
 #---------------------线上库
-          url: jdbc:mysql://139.186.27.96:3390/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
-          username: readonly
-          password: hcst@2021
+#          url: jdbc:mysql://139.186.27.96:3390/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
+#          username: readonly
+#          password: hcst@2021
 #---------------------测试库
-#          url: jdbc:mysql://139.186.165.84:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&allowMultiQueries=true
-#          username: hcst
-#          password: hcst@2020
+          url: jdbc:mysql://139.186.165.84:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&allowMultiQueries=true
+          username: hcst
+          password: hcst@2020
           driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
   redis:
@@ -277,4 +277,9 @@ ai:
 xxl-job:
   requestUrl: http://jiaoyangapi.shyouteng.com.cn
 rule:
-  bytedanceUrl: http://139.186.165.84:8808/
+  bytedanceUrl: http://139.186.165.84:8808/
+
+duxiaoman:
+  url: https://dev-liang.duxiaoman.com
+  appId: 1660011893128
+  token: 99e6dfa5ff790437200521fd13d6128c

+ 6 - 1
jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-prod.yml

@@ -266,4 +266,9 @@ ai:
 xxl-job:
   requestUrl: http://jiaoyangapi.shyouteng.com.cn
 rule:
-  bytedanceUrl: http://118.24.244.213:8808/
+  bytedanceUrl: http://118.24.244.213:8808/
+
+duxiaoman:
+  url: http://liang.duxiaoman.com
+  appId: 1660012052762
+  token: 1f8a5a1cbd4d626a2aa197b86f6cab8a

+ 6 - 1
jeecg-cloud-module/jeecg-cloud-system-start/src/main/resources/application-test.yml

@@ -275,4 +275,9 @@ elasticsearch:
   max-connect-per-route: 100
 
 rule:
-  bytedanceUrl: http://139.186.165.84:8808/
+  bytedanceUrl: http://139.186.165.84:8808/
+
+duxiaoman:
+  url: https://dev-liang.duxiaoman.com
+  appId: 1660011893128
+  token: 99e6dfa5ff790437200521fd13d6128c