Procházet zdrojové kódy

人群包2.0功能提交

zhaoxian před 4 roky
rodič
revize
9c3ba70780

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

@@ -0,0 +1,364 @@
+package cn.com.ctop.kuaishou.modules.ai.controller;
+
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.QueryGenerator;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackage;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouPopulationPackageService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+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.util.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+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.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目绑定的人群包模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-05-06
+ */
+@Slf4j
+@Api(tags = "项目绑定的人群包模板")
+@RestController
+@RequestMapping("/kuaishouPopulationPackage")
+public class KuaishouPopulationPackageController {
+    @Autowired
+    private IKuaishouPopulationPackageService kuaishouPopulationPackageService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param kuaishouPopulationPackage
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "项目绑定的人群包模板-分页列表查询", notes = "项目绑定的人群包模板-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<Object> queryPageList(KuaishouPopulationPackage kuaishouPopulationPackage,
+                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+            return kuaishouPopulationPackageService.queryPageList(kuaishouPopulationPackage, pageNo, pageSize);
+        } catch (Exception e) {
+            log.error("查询人群包列表异常", e);
+        }
+        return Result.error("查询人群包列表失败");
+    }
+
+    /**
+     * 查询推送结果
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/queryPushResults")
+    public Result<Object> queryPushResults(@RequestBody JSONObject requestJson) {
+        try {
+            Long id = requestJson.getLong("id");
+            JSONArray accountIds = requestJson.getJSONArray("accountIds");
+            if (Check.isNull(accountIds) || 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 kuaishouPopulationPackageService.queryPushResults(id, accountIds);
+        } catch (Exception e) {
+            log.error("查询推送结果异常", e);
+        }
+        return Result.error("查询失败");
+    }
+
+    /**
+     * 查询推送历史
+     *
+     * @param
+     * @return
+     */
+    @GetMapping(value = "/queryPushHistory")
+    public Result<Object> queryPushHistory(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 kuaishouPopulationPackageService.queryPushHistory(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 = "/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 kuaishouPopulationPackageService.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 kuaishouPopulationPackageService.getRelatedGroups(id,accountId);
+        } catch (Exception e) {
+            log.error("查询异常", e);
+        }
+        return Result.error("查询失败");
+
+    }
+
+    /**
+     * 添加
+     *
+     * @param kuaishouPopulationPackage
+     * @return
+     */
+    @ApiOperation(value = "项目绑定的人群包模板-添加", notes = "项目绑定的人群包模板-添加")
+    @PostMapping(value = "/add")
+    public Result<Object> add(@RequestBody KuaishouPopulationPackage kuaishouPopulationPackage) {
+        Result<KuaishouPopulationPackage> result = new Result<>();
+        try {
+            if (Check.isNull(kuaishouPopulationPackage.getType())) {
+                return Result.error("请选择匹配类型");
+            }
+            if (Check.isNull(kuaishouPopulationPackage.getOrientationName())) {
+                return Result.error("请填写人群包名称");
+            }
+            if (Check.isNull(kuaishouPopulationPackage.getUrl())) {
+                return Result.error("请填写文件路径");
+            }
+            if (Check.isNull(kuaishouPopulationPackage.getProjectId())) {
+                return Result.error("请选择项目");
+            }
+            return kuaishouPopulationPackageService.createEntity(kuaishouPopulationPackage);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("上传异常");
+        }
+        return Result.error("上传失败");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param kuaishouPopulationPackage
+     * @return
+     */
+    @ApiOperation(value = "项目绑定的人群包模板-编辑", notes = "项目绑定的人群包模板-编辑")
+    @PostMapping(value = "/push")
+    public Result<Object> push(@RequestBody JSONObject request) {
+        try {
+            JSONArray accountIds = request.getJSONArray("accountIds");
+            Long id = request.getLong("id");
+            if (Check.isNull(accountIds) || Check.isNull(id)) {
+                return Result.error("缺少参数");
+            }
+            return kuaishouPopulationPackageService.push(accountIds, id);
+        } catch (Exception e) {
+            log.error("查询异常,", e.getMessage());
+            e.printStackTrace();
+        }
+        return Result.error("推送失败");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "项目绑定的人群包模板-通过id删除", notes = "项目绑定的人群包模板-通过id删除")
+    @GetMapping(value = "/delete")
+    public Result<Object> delete(Long id) {
+        try {
+            if (Check.isNull(id)) {
+                return Result.error("参数为空");
+            }
+            KuaishouPopulationPackage populationPackage = new KuaishouPopulationPackage();
+            populationPackage.setId(id);
+            populationPackage.setDataStatus(0);//逻辑删除
+            boolean b = kuaishouPopulationPackageService.updateById(populationPackage);
+            if (b) {
+                return Result.ok("删除成功!");
+            }
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+        }
+        return Result.error("删除失败!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @ApiOperation(value = "项目绑定的人群包模板-批量删除", notes = "项目绑定的人群包模板-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<KuaishouPopulationPackage> deleteBatch(@RequestParam(name = "ids") String ids) {
+        Result<KuaishouPopulationPackage> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.kuaishouPopulationPackageService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "项目绑定的人群包模板-通过id查询", notes = "项目绑定的人群包模板-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<KuaishouPopulationPackage> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<KuaishouPopulationPackage> result = new Result<>();
+        KuaishouPopulationPackage kuaishouPopulationPackage = kuaishouPopulationPackageService.getById(id);
+        if (kuaishouPopulationPackage == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(kuaishouPopulationPackage);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<KuaishouPopulationPackage> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                KuaishouPopulationPackage kuaishouPopulationPackage = JSON.parseObject(deString, KuaishouPopulationPackage.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(kuaishouPopulationPackage, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<KuaishouPopulationPackage> pageList = kuaishouPopulationPackageService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "项目绑定的人群包模板列表");
+        mv.addObject(NormalExcelConstants.CLASS, KuaishouPopulationPackage.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("项目绑定的人群包模板列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<KuaishouPopulationPackage> listKuaishouPopulationPackages = ExcelImportUtil.importExcel(file.getInputStream(), KuaishouPopulationPackage.class, params);
+                kuaishouPopulationPackageService.saveBatch(listKuaishouPopulationPackages);
+                return Result.ok("文件导入成功!数据行数:" + listKuaishouPopulationPackages.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,93 @@
+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
+ * @version V1.0
+ * @date 2021-05-06
+ */
+@Data
+@TableName("ctop_kuaishou_population_package")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_kuaishou_population_package对象", description = "项目绑定的人群包模板")
+public class KuaishouPopulationPackage {
+
+    /**
+     * 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 orientationName;
+    /**
+     * 链接
+     */
+    @Excel(name = "链接", width = 15)
+    @ApiModelProperty(value = "链接")
+    private String url;
+
+    private String statDate;
+    /**
+     * 0 删除,1 有效
+     */
+    @Excel(name = "0 删除,1 有效", width = 15)
+    @ApiModelProperty(value = "0 删除,1 有效")
+    private Integer dataStatus;
+    /**
+     * 匹配类型 1:IMEI;2:IDFA;3:IMEI_MD5;4:IDFA_MD5;5:手机号-MD5;7:OAID;8:OAID_MD5
+     */
+    @Excel(name = "匹配类型 1:IMEI;2:IDFA;3:IMEI_MD5;4:IDFA_MD5;5:手机号-MD5;7:OAID;8:OAID_MD5", width = 15)
+    @ApiModelProperty(value = "匹配类型 1:IMEI;2:IDFA;3:IMEI_MD5;4:IDFA_MD5;5:手机号-MD5;7:OAID;8:OAID_MD5")
+    private Integer type;
+    /**
+     * signature
+     */
+    @Excel(name = "signature", width = 15)
+    @ApiModelProperty(value = "signature")
+    private String signature;
+    /**
+     * 创建时间
+     */
+    @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;
+}

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

@@ -0,0 +1,102 @@
+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-07
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_kuaishou_population_package_rel")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_kuaishou_population_package_rel对象", description="人群包模板和账户绑定关系表")
+public class KuaishouPopulationPackageRel {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+	private Long id;
+	/**本地人群模板ID*/
+	@Excel(name = "本地人群模板ID", width = 15)
+    @ApiModelProperty(value = "本地人群模板ID")
+	private Long popId;
+	/**项目ID*/
+	@Excel(name = "项目ID", width = 15)
+    @ApiModelProperty(value = "项目ID")
+	private Long projectId;
+	/**账户ID*/
+	@Excel(name = "账户ID", width = 15)
+    @ApiModelProperty(value = "账户ID")
+	private Long accountId;
+	/**上传日期*/
+	@Excel(name = "上传日期", width = 15)
+    @ApiModelProperty(value = "上传日期")
+	private String statDate;
+	/**人群包ID*/
+	@Excel(name = "人群包ID", width = 15)
+    @ApiModelProperty(value = "人群包ID")
+	private Long orientationId;
+	/**人群包名称*/
+	@Excel(name = "人群包名称", width = 15)
+    @ApiModelProperty(value = "人群包名称")
+	private String orientationName;
+	/**人群包类型 1上传人群,2广告人群,3主题专区,4逻辑规则,5人群扩展,6平台定制,7定制付费...*/
+	@Excel(name = "人群包类型 1上传人群,2广告人群,3主题专区,4逻辑规则,5人群扩展,6平台定制,7定制付费...", width = 15)
+    @ApiModelProperty(value = "人群包类型 1上传人群,2广告人群,3主题专区,4逻辑规则,5人群扩展,6平台定制,7定制付费...")
+	private String populationType;
+	/**匹配类型 1:IMEI;2:IDFA;3:IMEI_MD5;4:IDFA_MD5;5:手机号-MD5;7:OAID;8:OAID_MD5*/
+	@Excel(name = "匹配类型 1:IMEI;2:IDFA;3:IMEI_MD5;4:IDFA_MD5;5:手机号-MD5;7:OAID;8:OAID_MD5", width = 15)
+    @ApiModelProperty(value = "匹配类型 1:IMEI;2:IDFA;3:IMEI_MD5;4:IDFA_MD5;5:手机号-MD5;7:OAID;8:OAID_MD5")
+	private Integer type;
+	/**状态 0计算中,1已生效,2已删除,3推送中,4已推送,5计算失败,6推送失败,7已失效*/
+	@Excel(name = "状态 0计算中,1已生效,2已删除,3推送中,4已推送,5计算失败,6推送失败,7已失效", width = 15)
+    @ApiModelProperty(value = "状态 0计算中,1已生效,2已删除,3推送中,4已推送,5计算失败,6推送失败,7已失效")
+	private Integer status;
+	/**0成功,1失败*/
+	private Integer dataStatus;
+	/**覆盖人群*/
+	@Excel(name = "覆盖人群", width = 15)
+    @ApiModelProperty(value = "覆盖人群")
+	private Long coverNum;
+	/**上传数量*/
+	@Excel(name = "上传数量", width = 15)
+    @ApiModelProperty(value = "上传数量")
+	private Long recordSize;
+	/**匹配数量*/
+	@Excel(name = "匹配数量", width = 15)
+    @ApiModelProperty(value = "匹配数量")
+	private Long matchSize;
+	/**创建时间*/
+	@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;
+	/**执行结果反馈*/
+	@Excel(name = "执行结果反馈", width = 15)
+    @ApiModelProperty(value = "执行结果反馈")
+	private String message;
+	private String signature;
+}

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

@@ -0,0 +1,26 @@
+package cn.com.ctop.kuaishou.modules.ai.mapper;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackage;
+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
+ * 2021-05-06
+ * @version V1.0
+ */
+public interface KuaishouPopulationPackageMapper extends BaseMapper<KuaishouPopulationPackage> {
+
+    Long queryPageListTotal(@Param("projectId") Long projectId, @Param("orientationName") String orientationName);
+
+    List<JSONObject> queryPageList(@Param("projectId") Long projectId, @Param("orientationName") String orientationName);
+
+    Long queryUnitCount(@Param("id")  Long id);
+
+    List<JSONObject> getRelatedGroups(@Param("id") Long id,@Param("accountId") Long accountId);
+}

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

@@ -0,0 +1,34 @@
+package cn.com.ctop.kuaishou.modules.ai.mapper;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackageRel;
+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
+ * 2021-05-07
+ * @version V1.0
+ */
+public interface KuaishouPopulationPackageRelMapper extends BaseMapper<KuaishouPopulationPackageRel> {
+
+    /**
+     * 查询账户同一主题下可推送的该人群包ID
+     */
+    KuaishouPopulationPackageRel queryPushableCrowdPackage(@Param("accountId") Long accountId, @Param("id") Long id);
+
+    KuaishouPopulationPackageRel queryByAccountId(@Param("accountId") Long accountId, @Param("orientationId") Long orientationId);
+
+    void replaceBatch(@Param("packageRels") List<KuaishouPopulationPackageRel> packageRels);
+
+    List<JSONObject> queryPushResults(@Param("id") Long id, @Param("accountIds") JSONArray accountIds);
+
+    List<JSONObject> getRelatedAccounts(@Param("id") Long id);
+
+    KuaishouPopulationPackageRel queryEntity(@Param("accountId") Long accountId, @Param("id") Long id);
+}

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

@@ -0,0 +1,79 @@
+<?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.KuaishouPopulationPackageMapper">
+
+    <select id="queryPageListTotal" resultType="java.lang.Long">
+        SELECT IFNULL(COUNT(1), 0)
+        FROM ctop_kuaishou_population_package t1
+        WHERE data_status = 1
+        <if test="orientationName !=null">
+            AND orientation_name LIKE CONCAT('%', #{orientationName}, '%')
+        </if>
+        <if test="projectId !=null">
+            AND t1.product_id =#{projectId}
+        </if>
+    </select>
+
+    <select id="queryPageList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        t1.orientation_name 'orientationName',
+        IFNULL(t1.type,'') as 'type',
+        CASE t1.type
+        WHEN 1 THEN 'IMEI'
+        WHEN 2 THEN 'IDFA'
+        WHEN 3 THEN 'IMEI_MD5'
+        WHEN 4 THEN 'IDFA_MD5'
+        WHEN 5 THEN '手机号-MD5'
+        WHEN 7 THEN 'OAID'
+        WHEN 8 THEN 'OAID_MD5'
+        ELSE ''
+        END as 'typeStr',
+        t1.id,
+        t1.stat_date 'statDate',
+        t2.project_name 'projectName',
+        t1.project_id 'projectId',
+        (SELECT COUNT(1) FROM ctop_kuaishou_population_package_rel
+        WHERE pop_id = t1.id
+        AND data_status = 1)as 'accountCount'
+        FROM
+        ctop_kuaishou_population_package t1
+        LEFT JOIN ctop_project t2 ON t1.project_id = t2.id
+        WHERE data_status = 1
+        <if test="orientationName !=null">
+            AND orientation_name LIKE CONCAT(CONCAT('%', #{orientationName}), '%')
+        </if>
+        <if test="projectId !=null">
+            AND t1.product_id =#{projectId}
+        </if>
+    </select>
+
+    <select id="queryUnitCount" resultType="java.lang.Long">
+        SELECT IFNULL(COUNT(1), 0)
+        FROM ctop_kuaishou_population_group
+        where orientation_id IN
+              (SELECT orientation_id
+               FROM ctop_kuaishou_population_package_rel
+               WHERE data_status = 1
+                 AND pop_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_population_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 orientation_id IN
+        (SELECT DISTINCT orientation_id
+        FROM ctop_kuaishou_population_package_rel
+        WHERE data_status = 1
+        AND pop_id = #{id}
+        <if test="accountId !=null">
+            AND account_id = #{accountId}
+        </if>
+        )
+    </select>
+
+</mapper>

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

@@ -0,0 +1,129 @@
+<?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.KuaishouPopulationPackageRelMapper">
+
+    <select id="queryPushableCrowdPackage"
+            resultType="cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackageRel">
+        SELECT t1.*
+        FROM ctop_kuaishou_population_package_rel t1
+        WHERE `status` = 4
+          AND pop_id = #{id}
+          AND orientation_id is not null
+          AND account_id IN (
+            SELECT account_id
+            FROM ctop_kuaishou_advertiser_base_info
+            WHERE user_id = (SELECT user_id FROM ctop_kuaishou_advertiser_base_info WHERE account_id = #{accountId})
+        )
+            limit 1
+    </select>
+
+    <select id="queryByAccountId" resultType="cn.com.ctop.kuaishou.modules.ai.entity.KuaishouCrowdPack">
+        SELECT *
+        FROM ctop_kuaishou_population_package_rel
+        where data_status = 1
+        <if test="accountId!=null">
+            AND account_id = #{accountId}
+        </if>
+        <if test="orientationId!=null">
+            AND orientation_id = #{orientationId}
+        </if>
+        limit 1
+    </select>
+
+    <select id="queryPushResults" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        pop_id as '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_population_package_rel t1
+        LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        where t1.pop_id = #{id}
+        <if test="accountIds!=null">
+            AND t1.account_id IN
+            <foreach item="item" index="index" collection="accountIds"
+                     open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getRelatedAccounts" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT pop_id as 'id',
+               IFNULL(t2.auth_name, '') as 'authName',
+               IFNULL(t2.account_id, '') as 'accountId',
+               t1.`status`,
+               CASE t1.`status`
+                   WHEN 0 THEN '计算中'
+                   WHEN 1 THEN '已生效'
+                   WHEN 3 THEN '推送中'
+                   WHEN 4 THEN '已推送'
+                   WHEN 5 THEN '计算失败'
+                   WHEN 6 THEN '推送失败'
+                   WHEN 7 THEN '已失效'
+                   ELSE ''
+                   END as 'statusStr',
+               cover_num 'coverNum',
+               (SELECT COUNT(1)
+                FROM ctop_kuaishou_template
+                where account_id = t1.account_id) as 'populationCount'
+        FROM ctop_kuaishou_population_package_rel t1
+                 LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        where t1.pop_id = #{id}
+          AND t1.data_status = 1
+    </select>
+
+    <select id="queryEntity" resultType="cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackageRel">
+        SELECT pop_id,
+               account_id,
+               orientation_id
+        FROM ctop_kuaishou_population_package_rel
+        WHERE pop_id = #{id}
+          AND data_status = 1
+          AND account_id = #{accountId}
+    </select>
+
+    <insert id="replaceBatch">
+        replace into ctop_kuaishou_population_package_rel(
+        id,
+        pop_id,
+        project_id,
+        account_id,
+        stat_date,
+        orientation_id,
+        signature,
+        orientation_name,
+        population_type,
+        `type`,
+        status,
+        cover_num,
+        record_size,
+        match_size,
+        message,
+        data_status
+        )
+        values
+        <foreach collection="packageRels" item="package" separator=",">
+            (
+            #{package.id},
+            #{package.popId},
+            #{package.projectId},
+            #{package.accountId},
+            #{package.statDate},
+            #{package.orientationId},
+            #{package.signature},
+            #{package.orientationName},
+            #{package.populationType},
+            #{package.type},
+            #{package.status},
+            #{package.coverNum},
+            #{package.recordSize},
+            #{package.matchSize},
+            #{package.message},
+            #{package.dataStatus}
+            )
+        </foreach>
+    </insert>
+
+</mapper>

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

@@ -0,0 +1,15 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackageRel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 人群包模板和账户绑定关系表
+ *
+ * @author jeecg-boot
+ * 2021-05-07
+ * @version V1.0
+ */
+public interface IKuaishouPopulationPackageRelService extends IService<KuaishouPopulationPackageRel> {
+
+}

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

@@ -0,0 +1,31 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackage;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
+
+/**
+ * 项目绑定的人群包模板
+ *
+ * @author jeecg-boot
+ * 2021-05-06
+ * @version V1.0
+ */
+public interface IKuaishouPopulationPackageService extends IService<KuaishouPopulationPackage> {
+
+    Result<Object> createEntity(KuaishouPopulationPackage kuaishouPopulationPackage);
+
+    Result<Object> push(JSONArray accountIds, Long id);
+
+    Result<Object> queryPageList(KuaishouPopulationPackage kuaishouPopulationPackage, Integer pageNo, Integer pageSize);
+
+    Result<Object> queryPushResults(Long id, JSONArray accountIds);
+
+    Result<Object> queryPushHistory(Long id);
+
+    Result<Object> getRelatedAccounts(Long id);
+
+    Result<Object> getRelatedGroups(Long id,Long accountId);
+}

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

@@ -0,0 +1,19 @@
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackageRel;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouPopulationPackageRelMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouPopulationPackageRelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 人群包模板和账户绑定关系表
+ *
+ * @author jeecg-boot
+ * 2021-05-07
+ * @version V1.0
+ */
+@Service
+public class KuaishouPopulationPackageRelServiceImpl extends ServiceImpl<KuaishouPopulationPackageRelMapper, KuaishouPopulationPackageRel> implements IKuaishouPopulationPackageRelService {
+
+}

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

@@ -0,0 +1,275 @@
+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.LoadFileUtil;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouCrowdPack;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackage;
+import cn.com.ctop.kuaishou.modules.ai.entity.KuaishouPopulationPackageRel;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouPopulationPackageMapper;
+import cn.com.ctop.kuaishou.modules.ai.mapper.KuaishouPopulationPackageRelMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouPopulationGroupService;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouPopulationPackageRelService;
+import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouPopulationPackageService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouPopulationService;
+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 com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 项目绑定的人群包模板
+ *
+ * @author jeecg-boot
+ * 2021-05-06
+ * @version V1.0
+ */
+@Service
+public class KuaishouPopulationPackageServiceImpl extends ServiceImpl<KuaishouPopulationPackageMapper, KuaishouPopulationPackage> implements IKuaishouPopulationPackageService {
+
+    @Autowired
+    private KuaishouPopulationPackageMapper KuaishouPopulationPackageMapper;
+    @Autowired
+    private KuaishouPopulationPackageRelMapper relMapper;
+    @Autowired
+    private IKuaishouPopulationPackageRelService relService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IKuaishouPopulationService kuaishouPopulationService;
+    @Autowired
+    private IKuaishouPopulationGroupService populationGroupService;
+    @Value("${zip.local.download-path}")
+    private String downloadPath;
+
+    @Override
+    public Result<Object> createEntity(KuaishouPopulationPackage kuaishouPopulationPackage) {
+        QueryWrapper<KuaishouPopulationPackage> wrapper = new QueryWrapper<>();
+        wrapper.eq("project_id", kuaishouPopulationPackage.getProjectId());
+        wrapper.eq("orientation_name", kuaishouPopulationPackage.getOrientationName());
+        wrapper.eq("data_status", 1);
+        wrapper.last("limit 1");
+        KuaishouPopulationPackage checkName = KuaishouPopulationPackageMapper.selectOne(wrapper);
+        if (!Check.isNull(checkName)) {
+            return Result.error("该项目下已存在人群包名,请重新输入!");
+        }
+
+        String url = kuaishouPopulationPackage.getUrl();
+        String newFileUrl = getDownloadPath(url);
+        if (Check.isNull(newFileUrl)) {
+            return Result.error("本地下载文件失败,路径:" + url);
+        }
+        String md5 = null;
+        try {
+            md5 = LoadFileUtil.getMD5(newFileUrl);
+        } catch (IOException e) {
+            log.error("获取MD5签名失败", e);
+        }
+
+        QueryWrapper<KuaishouPopulationPackage> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("project_id", kuaishouPopulationPackage.getProjectId());
+        queryWrapper.eq("signature", md5);
+        queryWrapper.eq("data_status", 1);
+        queryWrapper.last("limit 1");
+        KuaishouPopulationPackage one = KuaishouPopulationPackageMapper.selectOne(queryWrapper);
+        if (!Check.isNull(one)) {
+            return Result.error("该项目已上传过此人群包,人群包名为:" + one.getOrientationName());
+        }
+        kuaishouPopulationPackage.setSignature(md5);
+        kuaishouPopulationPackage.setDataStatus(1);
+        kuaishouPopulationPackage.setStatDate(DateUtils.formatDate(new Date()));
+        this.save(kuaishouPopulationPackage);
+        LoadFileUtil.delFile(newFileUrl);
+        return Result.ok("上传成功");
+    }
+
+    /**
+     * 文件下载到本地的路径
+     */
+    private String getDownloadPath(String url) {
+        StringBuffer path = new StringBuffer();
+        path.append(downloadPath).append(DateUtils.getNowDate(DateUtils.WEB_FORMAT)).append("/").append(UUID.randomUUID().toString()).append("/");
+        if (!url.contains("http")) {
+            url = "https:".concat(url);
+        }
+        return LoadFileUtil.downLoadFromUrl(url, path.toString());
+    }
+
+    @Override
+    public Result<Object> push(JSONArray accountIds, Long id) {
+        KuaishouPopulationPackage pPackage = KuaishouPopulationPackageMapper.selectById(id);
+        if (Check.isNull(pPackage)) {
+            return Result.error("没有获取到人群包");
+        }
+        String newFileUrl = getDownloadPath(pPackage.getUrl());
+        if (Check.isNull(newFileUrl)) {
+            return Result.error("本地下载文件失败,路径:" + pPackage.getUrl());
+        }
+        for (Object account : accountIds) {
+            Long accountId = Long.valueOf(String.valueOf(account));
+            KuaishouPopulationPackageRel relEntity = relMapper.queryEntity(accountId, pPackage.getId());
+            //查询该定向模板下是否存在有效的账户数据,不存在执行推送或者上传。
+            if (Check.isNull(relEntity)) {
+                //查询账户同一主题下可推送的该人群包ID
+                KuaishouPopulationPackageRel populationPackageRel = relMapper.queryPushableCrowdPackage(accountId, pPackage.getId());
+                if (Check.isNull(populationPackageRel)) {
+                    //执行上传操作
+                    uploadAccount(pPackage, accountId, newFileUrl);
+                } else {
+                    //执行跨账户推送操作
+                    pushAccount(populationPackageRel, pPackage, accountId);
+                }
+            }
+        }
+        LoadFileUtil.delFile(newFileUrl);
+        return Result.ok("推送结束");
+    }
+
+
+    /**
+     * 执行推送操作
+     */
+    private void pushAccount(KuaishouPopulationPackageRel populationPackageRel, KuaishouPopulationPackage pPackage, Long accountId) {
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        JSONArray array = new JSONArray();
+        array.add(accountId);
+        JSONObject jsonObject = kuaishouPopulationService.pushAccountsPopulation(token, populationPackageRel.getOrientationId(), array);
+        if (jsonObject.getInteger("code") == 0) {
+            List<KuaishouCrowdPack> list = new ArrayList<>();
+            JSONObject data = jsonObject.getJSONObject("data");
+            if (!Check.isNull(data)) {
+                JSONArray success = data.getJSONArray("success");
+                if (!Check.isNull(success)) {
+                    populationPackageRel.setProjectId(pPackage.getProjectId());
+                    populationPackageRel.setPopId(pPackage.getId());
+                    populationPackageRel.setAccountId(Long.valueOf(String.valueOf(accountId)));
+                    populationPackageRel.setMessage("OK");
+                    populationPackageRel.setStatDate(DateUtils.formatDate(new Date()));
+                }
+                JSONArray fail = data.getJSONArray("fail");
+                if (!Check.isNull(fail)) {
+                    KuaishouPopulationPackageRel fRel = relMapper.queryByAccountId(accountId, populationPackageRel.getOrientationId());
+                    if (Check.isNull(fRel)) {
+                        populationPackageRel = new KuaishouPopulationPackageRel();
+                        populationPackageRel.setProjectId(pPackage.getProjectId());
+                        populationPackageRel.setPopId(pPackage.getId());
+                        populationPackageRel.setSignature(pPackage.getSignature());
+                        populationPackageRel.setDataStatus(0);
+                        populationPackageRel.setOrientationName(pPackage.getOrientationName());
+                        populationPackageRel.setAccountId(accountId);
+                        populationPackageRel.setMessage("推送失败");
+                        populationPackageRel.setStatDate(DateUtils.formatDate(new Date()));
+                    }
+                }
+            }
+        } else {
+            populationPackageRel = new KuaishouPopulationPackageRel();
+            populationPackageRel.setProjectId(pPackage.getProjectId());
+            populationPackageRel.setPopId(pPackage.getId());
+            populationPackageRel.setDataStatus(0);
+            populationPackageRel.setSignature(pPackage.getSignature());
+            populationPackageRel.setAccountId(accountId);
+            populationPackageRel.setOrientationName(pPackage.getOrientationName());
+            populationPackageRel.setMessage(jsonObject.getString("message"));
+            populationPackageRel.setStatDate(DateUtils.formatDate(new Date()));
+        }
+        List<KuaishouPopulationPackageRel> packageRels = new ArrayList(1);
+        packageRels.add(populationPackageRel);
+        relMapper.replaceBatch(packageRels);
+    }
+
+    //**执行上传操作*/
+    private void uploadAccount(KuaishouPopulationPackage pPackage, Long accountId, String newFileUrl) {
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        KuaishouPopulationPackageRel packageRel = null;
+        JSONObject jsonObject = kuaishouPopulationService.updatePopulation(token, pPackage.getType(), pPackage.getOrientationName(), newFileUrl);
+        if (!Check.isNull(jsonObject)) {
+            if (jsonObject.getInteger("code") == 0) {
+                packageRel = JSONObject.toJavaObject(jsonObject.getJSONObject("data"), KuaishouPopulationPackageRel.class);
+                packageRel.setSignature(pPackage.getSignature());
+                packageRel.setMessage(jsonObject.getString("message"));
+                packageRel.setStatDate(DateUtils.formatDate(new Date()));
+                packageRel.setProjectId(pPackage.getProjectId());
+                packageRel.setPopId(pPackage.getId());
+                packageRel.setDataStatus(1);//成功
+            } else {
+                packageRel = new KuaishouPopulationPackageRel();
+                packageRel.setAccountId(accountId);
+                packageRel.setOrientationName(pPackage.getOrientationName());
+                packageRel.setSignature(pPackage.getSignature());
+                packageRel.setMessage(jsonObject.getString("message"));
+                packageRel.setStatDate(DateUtils.formatDate(new Date()));
+                packageRel.setProjectId(pPackage.getProjectId());
+                packageRel.setPopId(pPackage.getId());
+                packageRel.setDataStatus(0);
+            }
+        } else {
+            packageRel = new KuaishouPopulationPackageRel();
+            packageRel.setAccountId(accountId);
+            packageRel.setOrientationName(pPackage.getOrientationName());
+            packageRel.setSignature(pPackage.getSignature());
+            packageRel.setMessage("上传失败,返回结果为空");
+            packageRel.setStatDate(DateUtils.formatDate(new Date()));
+            packageRel.setProjectId(pPackage.getProjectId());
+            packageRel.setPopId(pPackage.getId());
+            packageRel.setDataStatus(0);
+        }
+        List<KuaishouPopulationPackageRel> packageRels = new ArrayList(1);
+        packageRels.add(packageRel);
+        relMapper.replaceBatch(packageRels);
+    }
+
+    @Override
+    public Result<Object> queryPageList(KuaishouPopulationPackage kuaishouPopulationPackage, Integer pageNo, Integer pageSize) {
+        Long total = KuaishouPopulationPackageMapper.queryPageListTotal(kuaishouPopulationPackage.getProjectId(), kuaishouPopulationPackage.getOrientationName());
+        PageHelper.startPage(pageNo, pageSize, false);
+        List<JSONObject> list = KuaishouPopulationPackageMapper.queryPageList(kuaishouPopulationPackage.getProjectId(), kuaishouPopulationPackage.getOrientationName());
+        if (!Check.isNull(list)) {
+            for (JSONObject object : list) {
+                object.put("unitCount", KuaishouPopulationPackageMapper.queryUnitCount(object.getLong("id")));
+            }
+        }
+        PageInfo pageInfo = new PageInfo(list);
+        pageInfo.setTotal(total);
+        return Result.ok(pageInfo);
+    }
+
+    @Override
+    public Result<Object> queryPushResults(Long id, JSONArray accountIds) {
+        List<JSONObject> list = relMapper.queryPushResults(id, accountIds);
+        return Result.ok(new PageInfo<>(list));
+    }
+
+    @Override
+    public Result<Object> queryPushHistory(Long id) {
+        List<JSONObject> list = relMapper.queryPushResults(id, null);
+        return Result.ok(new PageInfo<>(list));
+    }
+
+    @Override
+    public Result<Object> getRelatedAccounts(Long id) {
+        List<JSONObject> list = relMapper.getRelatedAccounts(id);
+        return Result.ok(new PageInfo<>(list));
+    }
+
+    @Override
+    public Result<Object> getRelatedGroups(Long id, Long accountId) {
+        List<JSONObject> list = KuaishouPopulationPackageMapper.getRelatedGroups(id, accountId);
+        return Result.ok(new PageInfo<>(list));
+    }
+
+}