Browse Source

应用功能提交

zhaoxian 4 years ago
parent
commit
623ecebf1d

+ 436 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/KuaishouAppPackageController.java

@@ -0,0 +1,436 @@
+package cn.com.ctop.kuaishou.modules.ai.controller;
+
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.ExportExcelUtils;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackage;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouAppPackageService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.PageHelper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.api.vo.Result;
+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.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目绑定的应用
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-05-12
+ */
+@Slf4j
+@Api(tags = "项目绑定的应用")
+@RestController
+@RequestMapping("/kuaishouAppPackage")
+public class KuaishouAppPackageController {
+    @Autowired
+    private IKuaishouAppPackageService kuaishouAppPackageService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param kuaishouAppPackage
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/list")
+    public Result<Object> queryPageList(KuaishouAppPackage kuaishouAppPackage, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+            return kuaishouAppPackageService.queryPageList(kuaishouAppPackage, pageNo, pageSize);
+        } catch (Exception e) {
+            log.error("查询应用列表异常", e);
+        }
+        return Result.error("查询应用列表失败");
+    }
+
+    /**
+     * 查询相关账户
+     *
+     * @param
+     * @return org.jeecg.common.api.vo.Result<java.lang.Object>
+     * @throws
+     * @author ZHAOXA
+     */
+    @GetMapping(value = "/getRelatedAccounts")
+    public Result<Object> getRelatedAccounts(Long id, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+            if (Check.isNull(id)) {
+                return Result.error("缺少参数");
+            }
+            PageHelper.startPage(pageNo, pageSize);
+            return kuaishouAppPackageService.getRelatedAccounts(id);
+        } catch (Exception e) {
+            log.error("查询异常", e);
+        }
+        return Result.error("查询失败");
+
+    }
+
+    /**
+     * 查询相关组
+     *
+     * @param
+     * @return org.jeecg.common.api.vo.Result<java.lang.Object>
+     * @throws
+     * @author ZHAOXA
+     */
+    @GetMapping(value = "/getRelatedGroups")
+    public Result<Object> getRelatedGroups(Long id, Long accountId, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+            if (Check.isNull(id)) {
+                return Result.error("缺少参数");
+            }
+            PageHelper.startPage(pageNo, pageSize);
+            return kuaishouAppPackageService.getRelatedGroups(id, accountId);
+        } catch (Exception e) {
+            log.error("查询异常", e);
+        }
+        return Result.error("查询失败");
+
+    }
+    /**
+     * 查询项目下有效账户
+     *
+     * @param projectId 账户ID
+     * @return org.jeecg.common.api.vo.Result<java.lang.Object>
+     * @throws
+     * @author ZHAOXA
+     */
+    @GetMapping(value = "/getAccountByProjectId")
+    public Result<Object> getAccountByProjectId(Long projectId, String id,
+                                                @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+            if (Check.isNull(projectId)) {
+                return Result.error("请选择项目");
+            }
+            if (Check.isNull(id)) {
+                return Result.error("请选择应用");
+            }
+            PageHelper.startPage(pageNo, pageSize);
+            return kuaishouAppPackageService.getAccountByProjectId(projectId, id);
+        } catch (Exception e) {
+            log.error("查询异常,", e.getMessage());
+            e.printStackTrace();
+        }
+        return Result.error("查询失败");
+    }
+    /**
+     * 推送应用
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/pushAppPackage")
+    public Result<Object> pushAppPackage(@RequestBody JSONObject requestJson) {
+        try {
+            Long id = requestJson.getLong("id");
+            JSONArray accountIds = requestJson.getJSONArray("accountIds");
+            if (Check.isNull(id)) {
+                return Result.error("请选择应用");
+            }
+            if (Check.isNull(accountIds)) {
+                return Result.error("请选择推送账户");
+            }
+            return kuaishouAppPackageService.pushAppPackage(id, accountIds);
+        } catch (Exception e) {
+            log.error("推送应用异常", e);
+        }
+        return Result.error("推送失败");
+    }
+
+    /**
+     * 查询推送结果
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/queryPushResults")
+    public Result<Object> queryPushResults(@RequestBody JSONObject requestJson) {
+        try {
+            String id = requestJson.getString("id");
+            JSONArray accountIds = requestJson.getJSONArray("accountIds");
+            if (Check.isNull(id)) {
+                return Result.error("请选择应用");
+            }
+            Integer pageNo = requestJson.getInteger("pageNo");
+            Integer pageSize = requestJson.getInteger("pageSize");
+            if (Check.isNull(pageNo)) {
+                pageNo = 1;
+            }
+            if (Check.isNull(pageSize)) {
+                pageSize = 10;
+            }
+            PageHelper.startPage(pageNo, pageSize);
+            return kuaishouAppPackageService.queryPushResults(id, accountIds, null);
+        } catch (Exception e) {
+            log.error("查询推送结果异常", e);
+        }
+        return Result.error("查询失败");
+    }
+
+    /**
+     * 查询推送历史
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/queryPushHistory")
+    public Result<Object> queryPushHistory(@RequestBody JSONObject requestJson) {
+        try {
+            String id = requestJson.getString("id");
+            JSONArray accountIds = requestJson.getJSONArray("accountIds");
+            if (Check.isNull(id)) {
+                return Result.error("请选择应用");
+            }
+            Integer pageNo = requestJson.getInteger("pageNo");
+            Integer pageSize = requestJson.getInteger("pageSize");
+            if (Check.isNull(pageNo)) {
+                pageNo = 1;
+            }
+            if (Check.isNull(pageSize)) {
+                pageSize = 10;
+            }
+            PageHelper.startPage(pageNo, pageSize);
+            return kuaishouAppPackageService.queryPushResults(id, accountIds, requestJson.getString("status"));
+        } catch (Exception e) {
+            log.error("查询推送历史异常", e);
+        }
+        return Result.error("查询失败");
+    }
+
+    /**
+     * 添加——填写链接
+     *
+     * @param kuaishouAppPackage
+     * @return
+     */
+    @PostMapping(value = "/fillInLink")
+    public Result<Object> fillInLink(@RequestBody KuaishouAppPackage kuaishouAppPackage) {
+        try {
+            if (Check.isNull(kuaishouAppPackage.getProjectId())) {
+                return Result.error("请选择项目");
+            } else if (Check.isNull(kuaishouAppPackage.getAppVersion())) {
+                return Result.error("请填写应用标记");
+            } else if (Check.isNull(kuaishouAppPackage.getAppName())) {
+                return Result.error("请填写应用名称");
+            } else if (Check.isNull(kuaishouAppPackage.getPlatform())) {
+                return Result.error("请选择应用类型");
+            } else {
+                Integer platform = kuaishouAppPackage.getPlatform();
+                if ((platform == 1 || platform == 3) && Check.isNull(kuaishouAppPackage.getImageToken())) {
+                    return Result.error("请上传图标");
+                }
+                if ((platform == 1 || platform == 2) && Check.isNull(kuaishouAppPackage.getAppPrivacyUrl())) {
+                    return Result.error("安卓类应用隐私政策url不为空");
+                }
+                if (platform == 1 && Check.isNull(kuaishouAppPackage.getPackageName())) {
+                    return Result.error("请填写应用包名");
+                }
+            }
+            kuaishouAppPackage.setDataStatus(1);//有效
+            kuaishouAppPackageService.saveOrUpdate(kuaishouAppPackage);
+            return Result.ok("操作成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return Result.error("操作失败");
+    }
+
+    /**
+     * 校验应用标记
+     *
+     * @param kuaishouAppPackage
+     * @return
+     */
+    @GetMapping(value = "/checkAppVersion")
+    public Result<Object> checkAppVersion(Long projectId, String appVersion, Long id) {
+        try {
+            if (Check.isNull(projectId) || Check.isNull(appVersion)) {
+                return Result.error("缺失参数");
+            }
+            List<Long> list = kuaishouAppPackageService.queryByAppVersion(projectId, appVersion);
+            if (Check.isNull(list)) {
+                return Result.ok("success");
+            } else {
+                //修改校验
+                if (!Check.isNull(id) && (list.size() == 1 && list.get(0) - id == 0)) {
+                    return Result.ok("success");
+                }
+                return Result.error("重复的应用标记");
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return Result.error("操作失败");
+    }
+
+    /**
+     * 逻辑删除,修改模板状态
+     *
+     * @param kuaishouAppPackage
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public Result<KuaishouAppPackage> delete(@RequestBody KuaishouAppPackage kuaishouAppPackage) {
+        Result<KuaishouAppPackage> result = new Result<KuaishouAppPackage>();
+        KuaishouAppPackage kuaishouAppPackageEntity = kuaishouAppPackageService.getById(kuaishouAppPackage.getId());
+        if (kuaishouAppPackageEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            kuaishouAppPackage.setDataStatus(0);
+            boolean ok = kuaishouAppPackageService.updateById(kuaishouAppPackage);
+            if (ok) {
+                result.success("刪除成功!");
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "项目绑定的应用-通过id删除")
+    @ApiOperation(value = "项目绑定的应用-通过id删除", notes = "项目绑定的应用-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            kuaishouAppPackageService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "项目绑定的应用-批量删除")
+    @ApiOperation(value = "项目绑定的应用-批量删除", notes = "项目绑定的应用-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<KuaishouAppPackage> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<KuaishouAppPackage> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.kuaishouAppPackageService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "项目绑定的应用-通过id查询")
+    @ApiOperation(value = "项目绑定的应用-通过id查询", notes = "项目绑定的应用-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<KuaishouAppPackage> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<KuaishouAppPackage> result = new Result<>();
+        KuaishouAppPackage kuaishouAppPackage = kuaishouAppPackageService.getById(id);
+        if (kuaishouAppPackage == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(kuaishouAppPackage);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出应用模板
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportAppTemplate")
+    public void exportXls(HttpServletRequest request, HttpServletResponse response) {
+        Map<String, Object> paramsMap = new HashMap<>();
+        try {
+            List<List<Object>> excelList = new ArrayList<>();
+            OutputStream os = response.getOutputStream();
+            ExportExcelUtils eeu = new ExportExcelUtils();
+            XSSFWorkbook workbook = new XSSFWorkbook();
+            String[] titles = {"应用名称", "应用包名", "应用标记", "隐私政策链接", "下载链接", "监测链接", "广告监测SDK"};
+            eeu.exportExcelForAttendance(workbook, 0, "Sheet1", titles, excelList);
+            HttpUtils.setResponseHeader(response, "AppTemplate.xlsx");
+            workbook.write(os);
+            os.flush();
+            os.close();
+        } catch (IOException e) {
+            log.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 导入应用程序excel
+     *
+     * @param
+     * @return org.jeecg.common.api.vo.Result<java.lang.Object>
+     * @throws
+     * @author ZHAOXA
+     */
+    @PostMapping(value = "/importAppExcel")
+    @ResponseBody
+    public Result<Object> importExcel(HttpServletResponse response,
+                                      @RequestParam("file") MultipartFile file,
+                                      @RequestParam("projectId") Long projectId,
+                                      @RequestParam("platform") Integer platform,
+                                      @RequestParam("imageToken") String imageToken,
+                                      @RequestParam("imageUrl") String imageUrl) {
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        try {
+            if (Check.isNull(file)) {
+                return Result.error("执行失败,请上传应用Excel文件");
+            } else if (Check.isNull(projectId)) {
+                return Result.error("请选择项目");
+            } else if (Check.isNull(imageToken) || Check.isNull(imageUrl)) {
+                return Result.error("请上传图标");
+            } else if (Check.isNull(platform)) {
+                return Result.error("请选择应用类型");
+            }
+            return kuaishouAppPackageService.importExcel(file, projectId, platform, imageToken, imageUrl);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("解析应用Excel文档异常", e);
+            return Result.error("解析应用Excel文档失败," + e.getMessage());
+        }
+    }
+
+}

+ 126 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/KuaishouAppPackage.java

@@ -0,0 +1,126 @@
+package cn.com.ctop.kuaishou.modules.ai.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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 org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 项目绑定的应用
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-05-12
+ */
+@Data
+@TableName("ctop_kuaishou_app_package")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_kuaishou_app_package对象", description = "项目绑定的应用")
+public class KuaishouAppPackage {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 项目ID
+     */
+    @Excel(name = "项目ID", width = 15)
+    @ApiModelProperty(value = "项目ID")
+    private Long projectId;
+    /**
+     * 应用唯一标识
+     */
+    @Excel(name = "应用唯一标识", width = 15)
+    @ApiModelProperty(value = "应用唯一标识")
+    private String appMd5;
+    /**
+     * 应用地址
+     */
+    @Excel(name = "应用地址", width = 15)
+    @ApiModelProperty(value = "应用地址")
+    private String url;
+    /**
+     * 应用标记
+     */
+    @Excel(name = "应用标记", width = 15)
+    @ApiModelProperty(value = "应用标记")
+    private String appVersion;
+    /**
+     * 应用名称
+     */
+    @Excel(name = "应用名称", width = 15)
+    @ApiModelProperty(value = "应用名称")
+    private String appName;
+    /**
+     * 应用图标链接地址
+     */
+    @Excel(name = "应用图标链接地址", width = 15)
+    @ApiModelProperty(value = "应用图标链接地址")
+    private String appIconUrl;
+    /**
+     * 安卓类应用必填 隐私政策链接
+     */
+    private String appPrivacyUrl;
+    /**
+     * 图片token
+     */
+    @Excel(name = "图片token", width = 15)
+    @ApiModelProperty(value = "图片token")
+    private String imageToken;
+    /**
+     * 应用包名
+     */
+    @Excel(name = "应用包名", width = 15)
+    @ApiModelProperty(value = "应用包名")
+    private String packageName;
+
+    /**
+     * 监测链接
+     */
+    private String trackUrl;
+    /**
+     * 应用类型 1: Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏
+     */
+    @Excel(name = "应用类型 1: Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏", width = 15)
+    @ApiModelProperty(value = "应用类型 1: Android 应用下载,2: Android 网页游戏,3: iOS 应用下载, 4:iOS 网页游戏")
+    private Integer platform;
+    /**
+     * 是否接入快手广告监测SDK	0:未接入,1:已接入
+     */
+    @Excel(name = "是否接入快手广告监测SDK	0:未接入,1:已接入", width = 15)
+    @ApiModelProperty(value = "是否接入快手广告监测SDK	0:未接入,1:已接入")
+    private Integer useSdk;
+    /**
+     * 0无效,1有效
+     */
+    private Integer dataStatus;
+    /**
+     * 创建时间
+     */
+    @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @Excel(name = "修改时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+}

+ 79 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/KuaishouAppPackageRel.java

@@ -0,0 +1,79 @@
+package cn.com.ctop.kuaishou.modules.ai.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 应用和账户关联表
+ * @author jeecg-boot
+ * @date   2021-05-13
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_kuaishou_app_package_rel")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_kuaishou_app_package_rel对象", description="应用和账户关联表")
+public class KuaishouAppPackageRel {
+
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	@ApiModelProperty(value = "id")
+	private Long id;
+	/**应用模板ID*/
+	@Excel(name = "应用模板ID", width = 15)
+	@ApiModelProperty(value = "应用模板ID")
+	private Long apptemId;
+	/**项目ID*/
+	@Excel(name = "项目ID", width = 15)
+	@ApiModelProperty(value = "项目ID")
+	private Long projectId;
+	/**账户ID*/
+	@Excel(name = "账户ID", width = 15)
+	@ApiModelProperty(value = "账户ID")
+	private Long accountId;
+	/**账户ID*/
+	@Excel(name = "账户ID", width = 15)
+	@ApiModelProperty(value = "账户ID")
+	private Long appId;
+	/**快手方-应用地址*/
+	@Excel(name = "快手方-应用地址", width = 15)
+	@ApiModelProperty(value = "快手方-应用地址")
+	private String returnUrl;
+
+	private Integer dataStatus;
+
+	private String appVersion;
+	/**返回信息*/
+	@Excel(name = "返回信息", width = 15)
+	@ApiModelProperty(value = "返回信息")
+	private String message;
+	/**更新时间*/
+	@Excel(name = "更新时间", width = 15)
+	@ApiModelProperty(value = "更新时间")
+	private String returnUpdateTime;
+	/**创建时间*/
+	@Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**修改时间*/
+	@Excel(name = "修改时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+}

+ 30 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/KuaishouAppPackageMapper.java

@@ -0,0 +1,30 @@
+package cn.com.ctop.kuaishou.modules.ai.mapper;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackage;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目绑定的应用
+ *
+ * @author: jeecg-boot
+ * @date: 2021-05-12
+ * @cersion: V1.0
+ */
+public interface KuaishouAppPackageMapper extends BaseMapper<KuaishouAppPackage> {
+
+    void replaceBatch(@Param("appList") List<KuaishouAppPackage> appList);
+
+    List<String> queryAppVersions(@Param("projectId") Long projectId);
+
+    List<Long> queryByAppVersion(@Param("projectId") Long projectId,@Param("appVersion") String appVersion);
+
+    List<JSONObject> queryPageList(@Param("appVersion") String appVersion, @Param("projectId") Long projectId, @Param("platform") Integer platform);
+
+    Long queryUnitCount(@Param("id") Long id);
+
+    List<JSONObject> getRelatedGroups(@Param("id") Long id, @Param("accountId") Long accountId);
+}

+ 29 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/KuaishouAppPackageRelMapper.java

@@ -0,0 +1,29 @@
+package cn.com.ctop.kuaishou.modules.ai.mapper;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackageRel;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 应用和账户关联表
+ *
+ * @author: jeecg-boot
+ * @date: 2021-05-13
+ * @cersion: V1.0
+ */
+public interface KuaishouAppPackageRelMapper extends BaseMapper<KuaishouAppPackageRel> {
+
+    void replaceBatch(@Param("relList") List<KuaishouAppPackageRel> relList);
+
+    KuaishouAppPackageRel queryEntityByAccountId(@Param("accountId") Long accountId, @Param("appVersion") String appVersion);
+
+    List<JSONObject> queryPushResults(@Param("id") String id, @Param("accountIds") JSONArray accountIds, @Param("status") String status);
+
+    List<JSONObject> getRelatedAccounts(@Param("id") Long id);
+
+    List<JSONObject> getAccountByProjectId(@Param("projectId") Long projectId, @Param("id") String id);
+}

+ 117 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/KuaishouAppPackageMapper.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouAppPackageMapper">
+
+    <insert id="replaceBatch">
+        replace into ctop_kuaishou_app_package(
+        id,
+        project_id,
+        app_md5,
+        url,
+        app_version,
+        app_name,
+        app_icon_url,
+        image_token,
+        package_name,
+        platform,
+        app_privacy_url,
+        use_sdk,
+        track_url,
+        data_status
+        )
+        values
+        <foreach collection="appList" item="app" separator=",">
+            (
+            #{app.id},
+            #{app.projectId},
+            #{app.appMd5},
+            #{app.url},
+            #{app.appVersion},
+            #{app.appName},
+            #{app.appIconUrl},
+            #{app.imageToken},
+            #{app.packageName},
+            #{app.platform},
+            #{app.appPrivacyUrl},
+            #{app.useSdk},
+            #{app.trackUrl},
+            #{app.dataStatus}
+            )
+        </foreach>
+    </insert>
+    <select id="queryAppVersions" resultType="java.lang.String">
+        SELECT app_version
+        FROM ctop_kuaishou_app_package
+        where project_id = #{projectId}
+    </select>
+
+    <select id="queryByAppVersion" resultType="java.lang.Long">
+        SELECT id
+        FROM ctop_kuaishou_app_package
+        where project_id = #{projectId}
+          and app_version = #{appVersion}
+    </select>
+
+    <select id="queryPageList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        t1.id,
+        t1.project_id 'projectId',
+        t1.app_name 'appName',
+        t1.app_version 'appVersion',
+        t1.platform,
+        CASE t1.platform
+        WHEN 1 THEN 'Android应用下载'
+        WHEN 2 THEN 'Android网页游戏'
+        WHEN 3 THEN 'iOS应用下载'
+        WHEN 4 THEN 'iOS网页游戏'
+        END 'platformStr',
+        t1.package_name 'packageName',
+        DATE_FORMAT(t1.create_time,'%Y-%m-%d') 'createTime',
+        t2.project_name 'projectName',
+        (SELECT COUNT(1) FROM ctop_kuaishou_app_package_rel WHERE apptem_id = t1.id AND data_status = 1)'accountCount'
+        FROM ctop_kuaishou_app_package t1
+        LEFT JOIN ctop_project = t2 on t1.project_id =t2.id
+        WHERE t1.data_status =1
+        <if test="appVersion!=null">
+            AND t1.app_version Like concat('%',#{appVersion},'%')
+        </if>
+        <if test="projectId!=null">
+            AND t1.project_id=#{projectId}
+        </if>
+        <if test="platform!=null">
+            AND t1.platform=#{platform}
+        </if>
+        order by t1.create_time desc
+    </select>
+
+    <select id="queryUnitCount" resultType="java.lang.Long">
+        SELECT IFNULL(COUNT(1), 0)
+        FROM ctop_kuaishou_app_group
+        where app_id IN
+              (SELECT app_id
+               FROM ctop_kuaishou_app_package_rel
+               WHERE data_status = 1
+                 AND apptem_id = #{id}
+              )
+    </select>
+
+    <select id="getRelatedGroups" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT t2.account_id as 'accountId',
+        t2.auth_name as 'authName',
+        t3.unit_name as 'unitName'
+        FROM ctop_kuaishou_app_group t1
+        INNER JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        INNER JOIN ctop_kuaishou_group t3 ON t1.unit_id = t3.unit_id
+        where t1.app_id IN
+        (SELECT DISTINCT app_id
+        FROM ctop_kuaishou_app_package_rel
+        WHERE data_status = 1
+        AND apptem_id =#{id}
+        <if test="accountId !=null">
+            AND account_id = #{accountId}
+        </if>
+        )
+        order by t1.create_time desc
+    </select>
+
+</mapper>

+ 95 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/KuaishouAppPackageRelMapper.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouAppPackageRelMapper">
+
+    <insert id="replaceBatch">
+        replace into ctop_kuaishou_app_package_rel(
+        id,
+        apptem_id,
+        project_id,
+        account_id,
+        app_id,
+        app_version,
+        data_status,
+        return_url,
+        message,
+        return_update_time
+        )
+        values
+        <foreach collection="relList" item="rel" separator=",">
+            (
+            #{rel.id},
+            #{rel.apptemId},
+            #{rel.projectId},
+            #{rel.accountId},
+            #{rel.appId},
+            #{rel.appVersion},
+            #{rel.dataStatus},
+            #{rel.returnUrl},
+            #{rel.message},
+            #{rel.returnUpdateTime}
+            )
+        </foreach>
+    </insert>
+
+    <select id="queryEntityByAccountId" resultType="cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackageRel">
+        SELECT apptem_id, app_id, project_id
+        FROM ctop_kuaishou_app_package_rel
+        where account_id = #{accountId}
+          and app_version = #{appVersion}
+          and data_status = 1
+    </select>
+
+    <select id="queryPushResults" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        apptem_id 'id',
+        IFNULL(t2.auth_name,'') as 'authName',
+        IFNULL(t2.account_id,'') as 'accountId',
+        IFNULL(t1.message,'-') as 'message',
+        CASE WHEN t1.data_status =1 THEN '推送成功' ELSE '推送失败' end as 'result'
+        FROM ctop_kuaishou_app_package_rel t1
+        LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        where apptem_id = #{id}
+        <if test=" status!=null">
+            AND  t1.data_status = #{status}
+        </if>
+        <if test="accountIds!=null">
+            AND t1.account_id IN
+            <foreach item="item" index="index" collection="accountIds"
+                     open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by t1.create_time desc
+    </select>
+
+    <select id="getRelatedAccounts" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT apptem_id as 'id',
+               IFNULL(t2.auth_name, '') as 'authName',
+               IFNULL(t2.account_id, '') as 'accountId',
+               (SELECT COUNT(1)
+                FROM ctop_kuaishou_app_list
+                where account_id = t1.account_id) as 'appCount'
+        FROM ctop_kuaishou_app_package_rel t1
+                 LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        where t1.apptem_id =#{id}
+          AND t1.data_status = 1
+        order by t1.create_time desc
+    </select>
+
+    <select id="getAccountByProjectId" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            t1.account_id as 'accountId',
+            CONCAT(t1.auth_name,'(',t1.account_id,')') as 'authName',
+            IFNULL(t2.data_status,0) as 'state'
+        FROM ctop_user_allocation t1
+                 LEFT JOIN (
+            SELECT account_id,data_status FROM ctop_kuaishou_app_package_rel
+            WHERE  project_id = #{projectId}
+              AND apptem_id = #{id}
+        ) t2 ON t1.account_id = t2.account_id
+        where t1.account_status = 0
+          AND t1.project_id = #{projectId}
+    </select>
+
+</mapper>

+ 14 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IKuaishouAppPackageRelService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackageRel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 应用和账户关联表
+ * @Author: jeecg-boot
+ * @Date:   2021-05-13
+ * @Version: V1.0
+ */
+public interface IKuaishouAppPackageRelService extends IService<KuaishouAppPackageRel> {
+
+}

+ 37 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IKuaishouAppPackageService.java

@@ -0,0 +1,37 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackage;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @Description: 项目绑定的应用
+ * @Author: jeecg-boot
+ * @Date: 2021-05-12
+ * @Version: V1.0
+ */
+public interface IKuaishouAppPackageService extends IService<KuaishouAppPackage> {
+
+    Result<Object> importExcel(MultipartFile file, Long projectId, Integer platform, String imageToken, String imageUrl) throws Exception;
+
+    Result<Object> pushAppPackage(Long id, JSONArray accountIds);
+
+    Result<Object> queryPushResults(String id, JSONArray accountIds, String status);
+
+    List<Long> queryByAppVersion(Long projectId,String appVersion);
+
+    void createAppAndGroupRel(JSONObject request);
+
+    Result<Object> queryPageList(KuaishouAppPackage kuaishouAppPackage, Integer pageNo, Integer pageSize);
+
+    Result<Object> getRelatedAccounts(Long id);
+
+    Result<Object> getRelatedGroups(Long id, Long accountId);
+
+    Result<Object> getAccountByProjectId(Long projectId, String id);
+}

+ 17 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/KuaishouAppPackageRelMapper.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+import java.util.List;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackageRel;
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 应用和账户关联表
+ * @author: jeecg-boot
+ * @date:   2021-05-13
+ * @cersion: V1.0
+ */
+public interface KuaishouAppPackageRelMapper extends BaseMapper<KuaishouAppPackageRel> {
+
+}

+ 19 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/KuaishouAppPackageRelServiceImpl.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackageRel;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouAppPackageRelMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouAppPackageRelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 应用和账户关联表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-05-13
+ */
+@Service
+public class KuaishouAppPackageRelServiceImpl extends ServiceImpl<KuaishouAppPackageRelMapper, KuaishouAppPackageRel> implements IKuaishouAppPackageRelService {
+
+}

+ 310 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/KuaishouAppPackageServiceImpl.java

@@ -0,0 +1,310 @@
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackage;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouAppPackageRel;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouAppGroupMapper;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouAppPackageMapper;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouAppPackageRelMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouAppPackageService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouMaterialUploadService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.MD5Util;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目绑定的应用
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-05-12
+ */
+@Service
+public class KuaishouAppPackageServiceImpl extends ServiceImpl<KuaishouAppPackageMapper, KuaishouAppPackage> implements IKuaishouAppPackageService {
+
+    @Autowired
+    private KuaishouAppPackageMapper appPackageMapper;
+
+    @Autowired
+    private KuaishouAppPackageRelMapper relMapper;
+
+    @Autowired
+    private KuaishouAppGroupMapper appGroupMapper;
+
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IKuaiShouMaterialUploadService materialUploadService;
+
+    @Override
+    public Result<Object> importExcel(MultipartFile file, Long projectId, Integer platform, String imageToken, String imageUrl) throws Exception {
+        JSONObject returnJson = new JSONObject();
+        Workbook workbook = null;
+        String fileName = file.getOriginalFilename();
+        String substring = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();
+        if (substring.equals("XLS")) {
+            workbook = new HSSFWorkbook(file.getInputStream());
+        } else if (substring.equals("XLSX")) {
+            workbook = new XSSFWorkbook(file.getInputStream());
+        } else {
+            throw new Exception("文件不是Excel文件");
+        }
+        Sheet sheet = workbook.getSheet("Sheet1");
+        if (Check.isNull(sheet)) {
+            throw new Exception("Sheet标题不是默认的Sheet1");
+        }
+        int rows = sheet.getLastRowNum();// 指的行数,一共有多少行+
+        if (rows == 0) {
+            throw new Exception("请填写数据");
+        }
+        //查询项目下的应用标记(同一账户下应用标记不能重复),在此视为同一项目不可重复
+        List<String> appVersions = appPackageMapper.queryAppVersions(projectId);
+        StringBuffer errAppVersions = new StringBuffer();
+        List<KuaishouAppPackage> appList = new ArrayList<>();
+        for (int i = 1; i <= rows + 1; i++) {
+            Row row = sheet.getRow(i);
+            if (row != null) {
+                KuaishouAppPackage appPackage = new KuaishouAppPackage();
+                String appName = getCellValue(row.getCell(0));
+                String packageName = getCellValue(row.getCell(1));
+                String appVersion = getCellValue(row.getCell(2));
+                String appPrivacyUrl = getCellValue(row.getCell(3));
+                String url = getCellValue(row.getCell(4));
+                String trackUrl = getCellValue(row.getCell(5));
+                String useSdk = getCellValue(row.getCell(6));
+                if ((platform == 1 || platform == 2) && Check.isNull(appPrivacyUrl)) {
+                    return Result.error("执行失败,您选择的是安卓类应用,请填写隐私政策链接");
+                } else if (Check.isNull(appVersion)) {
+                    return Result.error("解析失败,文档中应用标记列缺失数据");
+                } else if (platform == 1 && Check.isNull(packageName)) {
+                    return Result.error("解析失败,选择Android应用下载时,文档中应用包名列缺失数据");
+                } else if (Check.isNull(appName)) {
+                    return Result.error("解析失败,文档中应用名称列缺失数据");
+                } else if (Check.isNull(url)) {
+                    return Result.error("解析失败,文档中下载链接列缺失数据");
+                } else if (Check.isNull(trackUrl)) {
+                    return Result.error("解析失败,文档中监测链接列缺失数据");
+                }
+                if (appVersions.contains(appVersion)) {
+                    errAppVersions.append(appVersion).append("、");
+                }
+                appPackage.setProjectId(projectId);
+                appPackage.setAppName(appName);
+                appPackage.setAppVersion(appVersion);
+                appPackage.setAppIconUrl(imageUrl);
+                appPackage.setPackageName(packageName);
+                appPackage.setPlatform(platform);
+                appPackage.setImageToken(imageToken);
+                appPackage.setTrackUrl(trackUrl);
+                appPackage.setAppPrivacyUrl(appPrivacyUrl);
+                appPackage.setDataStatus(1);//有效
+                appPackage.setUrl(url);
+                String md5 = MD5Util.getMd5(url);
+                if (!Check.isNull(md5)) {
+                    appPackage.setAppMd5(md5);
+                }
+                if (!Check.isNull(useSdk)) {
+                    appPackage.setUseSdk(Integer.valueOf(useSdk));
+                }
+                appList.add(appPackage);
+            }
+        }
+        String errVersion = errAppVersions.toString();
+        if (!Check.isNull(errVersion)) {
+            return Result.error("数据异常,重复的应用标记:" + errVersion.substring(0, errVersion.length() - 1));
+        }
+        appPackageMapper.replaceBatch(appList);
+        return Result.ok("文件导入成功");
+    }
+
+    private String getCellValue(Cell cell) {
+        String value = "";
+        if (cell != null) {
+            // 以下是判断数据的类型
+            switch (cell.getCellType()) {
+                case HSSFCell.CELL_TYPE_NUMERIC: // 数字
+                    value = cell.getNumericCellValue() + "";
+                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
+                        Date date = cell.getDateCellValue();
+                        if (date != null) {
+                            value = new SimpleDateFormat("yyyy-MM-dd").format(date);
+                        } else {
+                            value = "";
+                        }
+                    } else {
+                        value = new DecimalFormat("0").format(cell.getNumericCellValue());
+                    }
+                    break;
+                case HSSFCell.CELL_TYPE_STRING: // 字符串
+                    value = cell.getStringCellValue();
+                    break;
+                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
+                    value = cell.getBooleanCellValue() + "";
+                    break;
+                case HSSFCell.CELL_TYPE_FORMULA: // 公式
+                    value = cell.getCellFormula() + "";
+                    break;
+                case HSSFCell.CELL_TYPE_BLANK: // 空值
+                    value = "";
+                    break;
+                case HSSFCell.CELL_TYPE_ERROR: // 故障
+                    value = "非法字符";
+                    break;
+                default:
+                    value = "未知类型";
+                    break;
+            }
+        }
+        return value.trim();
+    }
+
+    @Override
+    public Result<Object> pushAppPackage(Long id, JSONArray accountIds) {
+        KuaishouAppPackage appPackage = appPackageMapper.selectById(id);
+        if (Check.isNull(appPackage)) {
+            return Result.error("为获取到应用信息");
+        }
+        KuaishouAppPackageRel rel = new KuaishouAppPackageRel();
+        rel.setApptemId(appPackage.getId());
+        rel.setProjectId(appPackage.getProjectId());
+        rel.setAppVersion(appPackage.getAppVersion());
+        List<KuaishouAppPackageRel> list = new ArrayList<>();
+        for (Object account : accountIds) {
+            try {
+                Long accountId = Long.valueOf(String.valueOf(account));
+                KuaishouAppPackageRel entity = relMapper.queryEntityByAccountId(accountId, appPackage.getAppVersion());
+                if (!Check.isNull(entity)) {
+                    continue;
+                }
+                CtopOauthToken oauthToken = tokenService.getTokenByAccountId(accountId);
+                JSONObject requestJson = new JSONObject();
+                requestJson.put("advertiser_id", accountId);
+                requestJson.put("app_version", appPackage.getAppVersion());
+                requestJson.put("app_name", appPackage.getAppName());
+                requestJson.put("image_token", appPackage.getImageToken());
+                requestJson.put("package_name", appPackage.getPackageName());
+                requestJson.put("platform", appPackage.getPlatform());
+                requestJson.put("url", appPackage.getUrl());
+                requestJson.put("use_sdk", appPackage.getUseSdk());
+                requestJson.put("app_privacy_url", appPackage.getAppPrivacyUrl());
+                String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.APP_CREATE;
+                Map<String, String> headerMap = new HashMap<>();
+                headerMap.put("Content-Type", "multipart/form-data");
+                headerMap.put("Access-Token", oauthToken.getAccessToken());
+                String result = materialUploadService.exceptInfoForRestTemplate(url, requestJson, headerMap);
+                JSONObject resultJson = JSONObject.parseObject(result);
+                rel.setAccountId(accountId);
+                if (!Check.isNull(resultJson)) {
+                    Integer code = resultJson.getInteger("code");
+                    if (code == 0) {
+                        JSONObject data = resultJson.getJSONObject("data");
+                        rel.setAppId(data.getLong("app_id"));
+                        rel.setReturnUrl(data.getString("url"));
+                        rel.setMessage(resultJson.getString("message"));
+                        rel.setDataStatus(1);
+                    } else {
+                        rel.setDataStatus(0);
+                        rel.setMessage(resultJson.getString("message"));
+                    }
+                } else {
+                    rel.setDataStatus(0);
+                    rel.setMessage("上传应用返回结果为空");
+                }
+            } catch (Exception e) {
+                rel.setDataStatus(0);
+                rel.setMessage("上传应用异常");
+                log.error("上传应用异常,accountId=" + account, e);
+            }
+            list.add(rel);
+        }
+        if (!list.isEmpty()) {
+            relMapper.replaceBatch(list);
+        }
+        return Result.ok("推送完成");
+    }
+    @Override
+    public Result<Object> queryPushResults(String id, JSONArray accountIds, String status) {
+        List<JSONObject> lsit = relMapper.queryPushResults(id, accountIds, status);
+        return Result.ok(new PageInfo<JSONObject>(lsit));
+    }
+
+    @Override
+    public List<Long> queryByAppVersion(Long projectId,String appVersion) {
+        return appPackageMapper.queryByAppVersion(projectId,appVersion);
+    }
+
+    @Override
+    public void createAppAndGroupRel(JSONObject request) {
+        try {
+            appGroupMapper.replaceBatch(request);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("添加广告组和应用绑定关系异常");
+        }
+    }
+
+    @Override
+    public Result<Object> queryPageList(KuaishouAppPackage kuaishouAppPackage, Integer pageNo, Integer pageSize) {
+        PageHelper.startPage(pageNo, pageSize);
+        List<JSONObject> list = appPackageMapper.queryPageList(kuaishouAppPackage.getAppVersion(), kuaishouAppPackage.getProjectId(), kuaishouAppPackage.getPlatform());
+        for (JSONObject object : list) {
+            object.put("unitCount", appPackageMapper.queryUnitCount(object.getLong("id")));
+        }
+        return Result.ok(new PageInfo<JSONObject>(list));
+    }
+
+    @Override
+    public Result<Object> getRelatedAccounts(Long id) {
+        JSONObject result = new JSONObject();
+        KuaishouAppPackage appPackage = appPackageMapper.selectById(id);
+        List<JSONObject> list = relMapper.getRelatedAccounts(id);
+        result.put("app", appPackage);
+        result.put("page", new PageInfo<>(list));
+        return Result.ok(result);
+    }
+
+    @Override
+    public Result<Object> getRelatedGroups(Long id, Long accountId) {
+        JSONObject result = new JSONObject();
+        KuaishouAppPackage appPackage = appPackageMapper.selectById(id);
+        List<JSONObject> list = appPackageMapper.getRelatedGroups(id, accountId);
+        result.put("app", appPackage);
+        result.put("page", new PageInfo<>(list));
+        return Result.ok(result);
+    }
+
+    @Override
+    public Result<Object> getAccountByProjectId(Long projectId, String id) {
+        List<JSONObject> list = relMapper.getAccountByProjectId(projectId, id);
+        return Result.ok(new PageInfo<>(list));
+    }
+
+
+}