zhouzeyu@c-top.com.cn %!s(int64=3) %!d(string=hai) anos
pai
achega
f9f4b1879e

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

@@ -241,7 +241,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/agent/**", "anon");
         filterChainDefinitionMap.put("/task/kuaishouHostingTask/**", "anon");
         filterChainDefinitionMap.put("/audienceReport/**", "anon");
-
+        filterChainDefinitionMap.put("/stare/**", "anon");
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<>(1);
         filterMap.put("jwt", new JwtFilter());

+ 1 - 1
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/JeecgBootMaterialApplication.java

@@ -10,7 +10,7 @@ import org.springframework.context.annotation.ComponentScan;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication(exclude = {ShiroAnnotationProcessorAutoConfiguration.class, ShiroAutoConfiguration.class, ShiroBeanAutoConfiguration.class})
-@ComponentScan(basePackages = {"org.jeecg", "cn.com.ctop"})
+@ComponentScan(basePackages = {"org.jeecg"})
 @EnableTransactionManagement
 public class JeecgBootMaterialApplication {
     public static void main(String[] args) {

+ 42 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/controller/MaterialStareController.java

@@ -0,0 +1,42 @@
+package org.jeecg.ctop.material.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.ctop.material.service.MaterialStareService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Set;
+
+/**
+ * 盯盘接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/stare")
+public class MaterialStareController {
+
+
+    @Autowired
+    MaterialStareService materialStareService;
+
+    /**
+     * 数据总览
+     */
+    @PostMapping("/sumData")
+    public Result<JSONObject> sumData(@RequestBody JSONObject params) {
+        Result<Set<JSONObject>> result = new Result<>();
+        return materialStareService.sumData(params.getInteger("mediaId"),
+                params.getInteger("userType"),
+                params.getString("userId"),
+                params.getString("startDate"),
+                params.getString("endDate"),
+                params.getInteger("type"));
+    }
+
+
+}

+ 25 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/MaterialStareMapper.java

@@ -0,0 +1,25 @@
+package org.jeecg.ctop.material.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Mapper
+public interface MaterialStareMapper {
+
+    List<Map> getCostByUserIdList(@Param("today") Long today, @Param("yesterday") Long yesterday, @Param("list") Set<String> operatorUserIds);
+
+    List<Map> getCostByUserIdListMoreDay(@Param("startDate")Long startDate, @Param("endDate")Long endDate, @Param("list")Set<String> operatorUserIds);
+
+    List<JSONObject> getCostByTop5List(@Param("startDate")Long start, @Param("list")Set<String> operatorUserIds);
+
+    List<JSONObject> getCostByTop5ListMoreDay(@Param("startDate")Long start, @Param("endDate")Long end, @Param("list")Set<String> operatorUserIds);
+
+    Set<String> getAffiliateId(@Param("leaderId")String userId);
+
+    Set<String> querySubordinateRecursive(@Param("leaderIds")Set<String> leaderIds);
+}

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

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.ctop.material.mapper.MaterialStareMapper">
+
+    <select id="getCostByUserIdList" resultType="Map">
+        SELECT t.`hour`,ROUND(SUM(charge),2) as todayCost,
+        (SELECT IFNULL(ROUND(SUM(charge),2),0)
+        from application.kuaishou_account_report_hourly_dw
+        WHERE stat_date =#{today}
+        and `hour`=t.`hour`) as yesterdayCost
+        from application.kuaishou_account_report_hourly_dw t
+        WHERE t.stat_date =#{yesterday}
+        <if test='list!=null'>
+            AND t.user_id IN
+            <foreach collection="list" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        GROUP BY t.`hour` ORDER BY t.`hour`
+    </select>
+
+    <select id="getCostByUserIdListMoreDay" resultType="Map">
+        SELECT DATE_FORMAT(t.stat_date,'%Y-%m-%d') as date,ROUND(SUM(charge),2) as cost
+        FROM application.kuaishou_account_report_daily_dw t
+        WHERE t.stat_date BETWEEN #{startDate} and #{endDate}
+        <if test='list!=null'>
+            AND t.user_id IN
+            <foreach collection="list" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        GROUP BY t.stat_date ORDER BY t.stat_date;
+    </select>
+
+    <select id="getCostByTop5List" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT SUM(t.charge)as cost,t.`hour` from
+        (SELECT user_id,SUM(charge) from application.kuaishou_account_report_hourly_dw
+        WHERE stat_date =#{startDate}
+        <if test='list!=null'>
+            AND user_id IN
+            <foreach collection="list" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        GROUP BY user_id ORDER BY SUM(charge) DESC LIMIT 5) tt
+        LEFT JOIN application.kuaishou_account_report_hourly_dw t
+        on tt.user_id=t.user_id
+        WHERE t.stat_date =#{startDate} GROUP BY t.`hour`,tt.user_id ORDER BY t.`hour`,SUM(t.charge) ASC
+    </select>
+
+
+    <select id="getCostByTop5ListMoreDay" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT SUM(t.charge)as cost,t.stat_date as statDate from
+        (SELECT user_id,SUM(charge) from application.kuaishou_account_report_daily_dw
+        WHERE stat_date BETWEEN #{startDate}  and #{endDate}
+        <if test='list!=null'>
+            AND user_id IN
+            <foreach collection="list" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        GROUP BY user_id ORDER BY SUM(charge) DESC LIMIT 5) tt
+        LEFT JOIN application.kuaishou_account_report_daily_dw t
+        on tt.user_id=t.user_id
+        WHERE t.stat_date BETWEEN #{startDate}  and #{endDate} GROUP BY t.stat_date,tt.user_id ORDER BY t.stat_date,SUM(t.charge) ASC
+    </select>
+
+    <select id="getAffiliateId" resultType="java.lang.String">
+        SELECT distinct id
+        FROM sys_user
+        WHERE leader_id = #{leaderId}
+          and status = 1
+          and del_flag = 0
+    </select>
+
+    <select id="querySubordinateRecursive" resultType="java.lang.String">
+        SELECT distinct id
+        FROM sys_user
+        WHERE
+        status = 1
+        and del_flag = 0
+        and leader_id in
+        <foreach collection="leaderIds" item="item" separator=","
+                 open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+</mapper>

+ 12 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/MaterialStareService.java

@@ -0,0 +1,12 @@
+package org.jeecg.ctop.material.service;
+
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+
+/**
+ * 盯盘接口
+ */
+public interface MaterialStareService {
+
+    Result<JSONObject> sumData(Integer mediaId, Integer userType, String userId, String startDate, String endDate, Integer type);
+}

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

@@ -0,0 +1,178 @@
+package org.jeecg.ctop.material.service.impl;
+
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.ctop.material.constants.CtopAdConstant;
+import org.jeecg.ctop.material.mapper.MaterialStareMapper;
+import org.jeecg.ctop.material.service.MaterialStareService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 盯盘接口
+ */
+@Slf4j
+@Service
+public class MaterialStareServiceImpl implements MaterialStareService {
+
+    @Resource
+    MaterialStareMapper materialStareMapper;
+
+
+    /**
+     * 数据总览
+     */
+    @Override
+    public Result<JSONObject> sumData(Integer mediaId, Integer userType, String userId, String startDate, String endDate, Integer type) {
+        Result result = new Result();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        Long start = Long.parseLong(startDate.replace("-", ""));
+        Long end = Long.parseLong(endDate.replace("-", ""));
+
+        if (mediaId == CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_INT) {
+            //头条
+            //功能待完善
+        } else if (mediaId == CtopAdConstant.PLATFORM_TYPE_KUAISHOU_INT) {
+            //快手
+            if (userType == 1) {  //运营经理界面
+                //查询当前人员所有下级
+                Set<String> operatorUserIds = getAffiliateId(userId);
+                if (type == 1) {  //汇总查看
+                    if (start.equals(end)) {  //查看当日
+                        Long beforeDay = dayBefore(start);
+                        //查询账户时报表当日数据
+                        List<Map> list = materialStareMapper.getCostByUserIdList(start, beforeDay, operatorUserIds);
+                        result.setResult(list);
+                        result.setSuccess(true);
+                        return result;
+                    } else { //查看多日
+                        //查询账户日报表当日数据
+                        List<Map> list = materialStareMapper.getCostByUserIdListMoreDay(start, end, operatorUserIds);
+                        result.setResult(list);
+                        result.setSuccess(true);
+                        return result;
+                    }
+
+                } else if (type == 2) {  //运营个人查看
+                    if (start.equals(end)) { //查看当日
+                        //查询个人top5当日时报
+                        List<JSONObject> resultList = new ArrayList<>();
+                        List<JSONObject> list = materialStareMapper.getCostByTop5List(start, operatorUserIds);
+                        int size = 0;
+                        int firstHour = list.get(0).getInteger("hour");
+                        //判断每个小时取出几条
+                        for (JSONObject jsonObject : list) {
+                            //判断每个小时取出几条
+                            Integer hour = jsonObject.getInteger("hour");
+                            if (hour == firstHour) {
+                                size++;
+                            }
+                        }
+                        for (int i = 0; i < list.size() / size; i++) {
+                            //没top条数据切割出来封装
+                            List<JSONObject> objects = list.subList(i * size, (i + 1) * size);
+                            JSONObject resultObj = new JSONObject();
+                            int j = 1;
+                            for (JSONObject object : objects) {
+                                resultObj.put("hours", object.getInteger("hour"));
+                                resultObj.put("top" + j, object.getBigDecimal("cost"));
+                                j++;
+                            }
+                            resultList.add(resultObj);
+                        }
+                        result.setResult(resultList);
+                        result.setSuccess(true);
+                        return result;
+                    } else {   //查看多日
+                        List<JSONObject> resultList = new ArrayList<>();
+                        //查询个人top5当日日报
+                        List<JSONObject> list = materialStareMapper.getCostByTop5ListMoreDay(start, end, operatorUserIds);
+                        int size = 0;
+                        int firstDate = list.get(0).getInteger("statDate");
+                        //判断每个小时取出几条
+                        for (JSONObject jsonObject : list) {
+                            //判断每个小时取出几条
+                            Integer hour = jsonObject.getInteger("statDate");
+                            if (hour == firstDate) {
+                                size++;
+                            }
+                        }
+                        for (int i = 0; i < list.size() / size; i++) {
+                            //没top条数据切割出来封装
+                            List<JSONObject> objects = list.subList(i * size, (i + 1) * size);
+                            JSONObject resultObj = new JSONObject();
+                            int j = 1;
+                            for (JSONObject object : objects) {
+                                resultObj.put("date", object.getInteger("statDate"));
+                                resultObj.put("top" + j, object.getBigDecimal("cost"));
+                                j++;
+                            }
+                            resultList.add(resultObj);
+                        }
+                        result.setResult(resultList);
+                        result.setSuccess(true);
+                        return result;
+                    }
+                }
+            } else if (userType == 2) {
+                //运营个人界面
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取指定日期前一日 LONG类型
+     */
+    public Long dayBefore(Long date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        Long beforeDay = null;
+        try {
+            Date parse = sdf.parse(date.toString());
+            Calendar c = Calendar.getInstance();
+            c.setTime(parse);
+            int day1 = c.get(Calendar.DATE);
+            c.set(Calendar.DATE, day1 - 1);
+            beforeDay = Long.parseLong(sdf.format(c.getTime()));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return beforeDay;
+    }
+
+    /**
+     * 查询当前人员所有下级 返回自己和下属id
+     */
+
+    public Set<String> getAffiliateId(String userId) {
+        Set<String> result;
+        //查询当前用户是否存在下级
+        Set<String> subordinate = materialStareMapper.getAffiliateId(userId);
+        if (subordinate.isEmpty()) {
+            subordinate.add(userId);
+            return subordinate;
+        } else {
+            result = querySubordinate(subordinate, subordinate);
+            result.add(userId);
+        }
+        return result;
+    }
+
+    //递归查询
+    private Set<String> querySubordinate(Set<String> leaderIds, Set<String> result) {
+        if (leaderIds.isEmpty()) {
+            return result;
+        }
+        Set<String> temp = materialStareMapper.querySubordinateRecursive(leaderIds);
+        result.addAll(temp);
+        querySubordinate(temp, result);
+        return result;
+    }
+}