Ver Fonte

add(backend) [粉丝增长 未测试版 1.0]

wangxiao há 4 anos atrás
pai
commit
947ec886d2

+ 105 - 74
operation-backend/src/main/java/com/idiot/operationbackend/controller/IndexController.java

@@ -23,6 +23,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -83,17 +84,17 @@ public class IndexController {
 
         logger.info("用户:{}首页概览数据计算中---ing",userId);
         // 所有公众号昨日数据
-        int totalNum = ydStatData.stream().mapToInt(AccountFansStat::getTotalFansNum).sum();
-        int addNum = ydStatData.stream().mapToInt(AccountFansStat::getAddNum).sum();
-        int cancelNum = ydStatData.stream().mapToInt(AccountFansStat::getCancelNum).sum();
-        int newNum = ydStatData.stream().mapToInt(AccountFansStat::getNewNum).sum();
-        int inactiveNum = ydStatData.stream().mapToInt(AccountFansStat::getInactiveNum).sum();
+        long totalNum = ydStatData.stream().mapToLong(AccountFansStat::getTotalFansNum).sum();
+        long addNum = ydStatData.stream().mapToLong(AccountFansStat::getAddNum).sum();
+        long cancelNum = ydStatData.stream().mapToLong(AccountFansStat::getCancelNum).sum();
+        long newNum = ydStatData.stream().mapToLong(AccountFansStat::getNewNum).sum();
+        long inactiveNum = ydStatData.stream().mapToLong(AccountFansStat::getInactiveNum).sum();
         // 所有公众号前日数据
-        int bfCancelNum = beforeYdStat.stream().mapToInt(AccountFansStat::getCancelNum).sum();
-        int bfAddNum = beforeYdStat.stream().mapToInt(AccountFansStat::getAddNum).sum();
-        int bfNewNum = beforeYdStat.stream().mapToInt(AccountFansStat::getNewNum).sum();
-        int bfInactiveNum = beforeYdStat.stream().mapToInt(AccountFansStat::getInactiveNum).sum();
-        int bfTotalNum = beforeYdStat.stream().mapToInt(AccountFansStat::getTotalFansNum).sum();
+        long bfCancelNum = beforeYdStat.stream().mapToLong(AccountFansStat::getCancelNum).sum();
+        long bfAddNum = beforeYdStat.stream().mapToLong(AccountFansStat::getAddNum).sum();
+        long bfNewNum = beforeYdStat.stream().mapToLong(AccountFansStat::getNewNum).sum();
+        long bfInactiveNum = beforeYdStat.stream().mapToLong(AccountFansStat::getInactiveNum).sum();
+        long bfTotalNum = beforeYdStat.stream().mapToLong(AccountFansStat::getTotalFansNum).sum();
 
         AccountFansStat result = new AccountFansStat();
         result.setAddNum(addNum);
@@ -131,11 +132,39 @@ public class IndexController {
                                                               @RequestParam(required = false) String startDate,
                                                               @RequestParam(required = false) String endDate) {
         String userId = JwtTokenUtil.getUserId(token);
-        Map<String,Object> result = new HashMap<>(2);
-        logger.info("用户:{}查询首页单个公众号:{}粉丝增长---start",userId,accountId);
-        List<StatData> statData = queryFansGrowthStatData(accountId, type, startDate, endDate);
-        result.put("tableData",statData);
-        logger.info("用户:{}查询首页单个公众号:{}粉丝增长---end",userId,accountId);
+        if (!checkDate(startDate,endDate)){
+            throw new CustomException(500,"请选择开始和结束时间!");
+        }
+        Map<String,Object> result = new HashMap<>(8);
+        logger.info("用户:{}查询首页单个公众号:{}粉丝增长,type:{},startDate:{},endDate:{} --->start",
+                userId,accountId,type,startDate,endDate);
+        LocalDate start = LocalDate.parse(startDate);
+        LocalDate end= LocalDate.parse(endDate);
+        long days = end.toEpochDay() - start.toEpochDay();
+        List<StatData> statDataList = queryFansGrowthStatData(accountId, type, start, end);
+        long newNum =0;
+        long addNum =0;
+        long inactiveNum =0;
+        long cancelNum =0;
+        BigDecimal ave =BigDecimal.ZERO;
+        if (CollectionUtils.isEmpty(statDataList)) {
+            newNum = statDataList.parallelStream().mapToLong(StatData::getNewNum).sum();
+            addNum = statDataList.parallelStream().mapToLong(StatData::getAddNum).sum();
+            inactiveNum = statDataList.parallelStream().mapToLong(StatData::getInactiveNum).sum();
+            cancelNum = statDataList.parallelStream().mapToLong(StatData::getCancelNum).sum();
+            if (days == 0){
+                days = 1;
+            }
+            ave = new BigDecimal(newNum/days).setScale(0);
+        }
+        result.put("newNum",newNum);
+        result.put("addNum",addNum);
+        result.put("inactiveNum",inactiveNum);
+        result.put("cancelNum",cancelNum);
+        result.put("aveNum",ave);
+        result.put("tableData",statDataList);
+        logger.info("用户:{}查询首页单个公众号:{}粉丝增长,type:{},startDate:{},endDate:{} --->end",
+                userId,accountId,type,startDate,endDate);
         return ResponseEntity.ok(JsonResult.success(result));
     }
 
@@ -149,42 +178,45 @@ public class IndexController {
      * @param endDate
      * @return java.util.List<com.idiot.operationbackend.vo.StatData>
      */
-    private List<StatData> queryFansGrowthStatData(String accountId, String type, String startDate, String endDate) {
+    private List<StatData> queryFansGrowthStatData(String accountId, String type, LocalDate startDate, LocalDate endDate) {
 
-        int totalNum  = fansService.countFansByAccountId(accountId);
-        if (HOUR.equals(type)) {
-            // 小时数据 需要在粉丝 动作中统计
-            if (!checkDate(startDate,endDate)){
-                throw new CustomException(500,"请选择开始和结束时间");
-            }
 
-            long start =  LocalDate.parse(startDate).atTime(LocalTime.of(0,0,0))
-                    .toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
-            long end = LocalDate.parse(endDate).atTime(LocalTime.of(23,59,59))
-                    .toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
-            // 查询时间段内的值 
-            List<FansActionStat> fansActionStats = actionStatService.queryFansActionStat(accountId,start,end);
-            if (CollectionUtils.isEmpty(fansActionStats)) {
-                throw new CustomException(500,"暂无数据");
-            }
-            List<StatData> statDataList = new ArrayList<>();
-            StatData statData =  null;
-            List<FansActionStat> tempStatList = null;
-            while (start<=end){
-                long finalStart = start;
-                // 过滤两小时内
-                tempStatList = fansActionStats.stream()
-                        .filter(e->e.getCreateTime() >= finalStart && e.getCreateTime()<=  finalStart +7200)
-                        .sorted(Comparator.comparingLong(FansActionStat::getCreateTime))
-                        .collect(Collectors.toList());
-                statData = countStatData(tempStatList,finalStart,finalStart+7200);
-                statDataList.add(statData);
-                start += 7200;
-            }
-            return statDataList;
+        long disValue = 0;
+        if (HOUR.equals(type)) {
+            disValue = 7200;
+        }else if (DAY.equals(type)){
+            disValue = 86400;
+        }else if (WEEK.equals(type)){
+            disValue = 604800;
+        }else if (MONTH.equals(type)){
+            // 默认 30 天
+            disValue = 2592000;
+        }else {
+            throw new CustomException(500,"请你选择正确的时间统计类型!");
         }
-        return null;
-    
+        LocalDateTime startLocalDate =  startDate.atTime(LocalTime.of(0,0,0));
+        LocalDateTime endLocalDate =  endDate.plusDays(1).atTime(LocalTime.of(0,0,0));
+        List<FansActionStat> fansActionStats = actionStatService.queryFansActionStat(accountId,startLocalDate,endLocalDate);
+        if (CollectionUtils.isEmpty(fansActionStats)) {
+            throw new CustomException(500,"暂无数据!");
+        }
+        long start = startLocalDate.toEpochSecond(Constants.DEFAULT_ZONE);
+        long end = endLocalDate.toEpochSecond(Constants.DEFAULT_ZONE);
+        List<StatData> statDataList = new ArrayList<>();
+        StatData statData =  null;
+        List<FansActionStat> tempStatList = null;
+        while (start<=end){
+            long finalStart = start;
+            long finalDisValue = disValue;
+            tempStatList = fansActionStats.stream()
+                    .filter(e->e.getCreateTime() >= finalStart && e.getCreateTime()<=  finalStart + finalDisValue)
+                    .sorted(Comparator.comparingLong(FansActionStat::getCreateTime))
+                    .collect(Collectors.toList());
+            statData = countStatData(tempStatList,finalStart,finalStart+finalDisValue,type);
+            statDataList.add(statData);
+            start += finalDisValue;
+        }
+        return statDataList;
     }
 
     private boolean checkDate (String start, String end) {
@@ -192,42 +224,40 @@ public class IndexController {
     }
 
     /**
-     *  
+     *  统计
      * @author wangxiao
-     * @date 16:03 2020/9/16 
+     * @date 16:45 2020/9/16
      * @param fansActionStats
      * @param start
      * @param end
+     * @param type
      * @return com.idiot.operationbackend.vo.StatData
      */
-    private StatData countStatData (List<FansActionStat> fansActionStats,long start,long end) {
+    private StatData countStatData (List<FansActionStat> fansActionStats,long start,long end,String type) {
 
-        LocalDateTime startTime =LocalDateTime.ofInstant(Instant.ofEpochSecond(start),Constants.DEFAULT_ZONE);
-        LocalDateTime endTime =LocalDateTime.ofInstant(Instant.ofEpochSecond(end),Constants.DEFAULT_ZONE);
+        LocalDateTime startDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(start),Constants.DEFAULT_ZONE);
+        LocalDateTime endDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(end),Constants.DEFAULT_ZONE);
         StatData statData = new StatData();
-        int newNum = 0;
-        int cancelNum = 0;
-        int inactiveNum = 0;
+        long newNum = 0;
+        long cancelNum = 0;
+        long inactiveNum = 0;
         if (!CollectionUtils.isEmpty(fansActionStats)) {
-            int size = fansActionStats.size();
-            FansActionStat temp = null;
-            for (int i = 0; i < size; i++) {
-                temp = fansActionStats.get(i);
-                switch (temp.getAction()){
-                    case Constants.NEW:
-                        newNum += 1;
-                        break;
-                    case Constants.CANCEL:
-                        cancelNum += 1;
-                        break;
-                    default:
-                        inactiveNum += 1;
-                        break;
-                }
-            }
+            newNum = fansActionStats.parallelStream().filter(e->Constants.NEW == e.getAction()).count();
+            cancelNum = fansActionStats.parallelStream().filter(e->Constants.CANCEL == e.getAction()).count();
+            inactiveNum = fansActionStats.parallelStream().filter(e->Constants.NEW != e.getAction() && Constants.CANCEL != e.getAction()).count();
+        }
+        String label = "";
+
+        if (HOUR.equals(type)) {
+            label = String.format("%s %s:%s-%s:%s",startDateTime.toLocalDate(),startDateTime.getHour(),"00",endDateTime.getHour(),"00");
+        }else if (DAY.equals(type)){
+            label = String.format("%s",startDateTime.toLocalDate());
+        }else if (WEEK.equals(type)){
+            label = String.format("%s/%s-%s/%s",startDateTime.getMonthValue(),startDateTime.getDayOfMonth()
+                    ,endDateTime.getMonthValue(),endDateTime.getDayOfMonth());
+        }else if (MONTH.equals(type)){
+            label =  String.format("%s-%s",startDateTime.getYear(),startDateTime.getMonthValue());
         }
-        String label = String.format("%s %s:%s-%s:%s",
-                startTime.toLocalDate(),startTime.getHour(),"00",endTime.getHour(),"00");
         statData.setDateLabel(label);
         statData.setAddNum(newNum-cancelNum);
         statData.setCancelNum(cancelNum);
@@ -239,4 +269,5 @@ public class IndexController {
 
 
 
+
 }

+ 18 - 20
operation-backend/src/main/java/com/idiot/operationbackend/entity/AccountFansStat.java

@@ -21,32 +21,32 @@ public class AccountFansStat {
     /**
      * 新增
      */
-    private Integer newNum;
+    private  Long newNum;
 
     /**
      * 取关
      */
-    private Integer cancelNum;
+    private  Long cancelNum;
 
     /**
      * 活跃
      */
-    private Integer inactiveNum;
+    private  Long inactiveNum;
 
     /**
      * 总粉丝数
      */
-    private Integer totalFansNum;
+    private  Long totalFansNum;
 
     /**
      * 净增
      */
-    private Integer addNum;
+    private  Long addNum;
 
     /**
      * 阅读数量
      */
-    private Integer pageReadNum;
+    private  Long pageReadNum;
 
 
     /**
@@ -92,7 +92,6 @@ public class AccountFansStat {
      */
     private String createTime;
 
-
     public String getId() {
         return id;
     }
@@ -109,51 +108,51 @@ public class AccountFansStat {
         this.accountId = accountId;
     }
 
-    public Integer getNewNum() {
+    public Long getNewNum() {
         return newNum;
     }
 
-    public void setNewNum(Integer newNum) {
+    public void setNewNum(Long newNum) {
         this.newNum = newNum;
     }
 
-    public Integer getCancelNum() {
+    public Long getCancelNum() {
         return cancelNum;
     }
 
-    public void setCancelNum(Integer cancelNum) {
+    public void setCancelNum(Long cancelNum) {
         this.cancelNum = cancelNum;
     }
 
-    public Integer getInactiveNum() {
+    public Long getInactiveNum() {
         return inactiveNum;
     }
 
-    public void setInactiveNum(Integer inactiveNum) {
+    public void setInactiveNum(Long inactiveNum) {
         this.inactiveNum = inactiveNum;
     }
 
-    public Integer getTotalFansNum() {
+    public Long getTotalFansNum() {
         return totalFansNum;
     }
 
-    public void setTotalFansNum(Integer totalFansNum) {
+    public void setTotalFansNum(Long totalFansNum) {
         this.totalFansNum = totalFansNum;
     }
 
-    public Integer getAddNum() {
+    public Long getAddNum() {
         return addNum;
     }
 
-    public void setAddNum(Integer addNum) {
+    public void setAddNum(Long addNum) {
         this.addNum = addNum;
     }
 
-    public Integer getPageReadNum() {
+    public Long getPageReadNum() {
         return pageReadNum;
     }
 
-    public void setPageReadNum(Integer pageReadNum) {
+    public void setPageReadNum(Long pageReadNum) {
         this.pageReadNum = pageReadNum;
     }
 
@@ -205,7 +204,6 @@ public class AccountFansStat {
         this.pageReadRate = pageReadRate;
     }
 
-
     public String getStatDate() {
         return statDate;
     }

+ 15 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/FansActionStatService.java

@@ -3,6 +3,7 @@ package com.idiot.operationbackend.service.facade;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.idiot.operationbackend.entity.FansActionStat;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 
@@ -38,6 +39,20 @@ public interface FansActionStatService extends IService<FansActionStat> {
     List<FansActionStat> queryFansActionStat(String accountId, String startDate, String endDate);
 
 
+    /**
+     * 查询区间内 粉丝活跃数量 (秒级时间戳)
+     *
+     * @param accountId
+     * @param startDate
+     * @param endDate
+     * @return int
+     * @author wangxiao
+     * @date 11:39 2020/9/16
+     */
+    List<FansActionStat> queryFansActionStat(String accountId, LocalDateTime startDate, LocalDateTime endDate);
+
+
+
     /**
      * 查询区间内 粉丝活跃数量 (秒级时间戳)
      *

+ 5 - 5
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountFansStatServiceImpl.java

@@ -61,9 +61,9 @@ public class AccountFansStatServiceImpl extends ServiceImpl<AccountFansStatMappe
         JSONObject jsonObject = JSONObject.parseObject(jsonStr);
         JSONArray jsonArray = jsonObject.getJSONArray("list");
         int size  = jsonArray.size();
-        int newNum = 0;
-        int cancelNum = 0;
-        int addNum = 0;
+        long newNum = 0;
+        long cancelNum = 0;
+        long addNum = 0;
         JSONObject tempObject = null;
         // 昨日增减
         for (int i = 0; i < size; i++) {
@@ -71,7 +71,7 @@ public class AccountFansStatServiceImpl extends ServiceImpl<AccountFansStatMappe
             newNum += tempObject.getInteger("new_user");
             cancelNum += tempObject.getInteger("cancel_user");
         }
-        int totalNum = 0;
+        long totalNum = 0;
         // 昨日汇总
         String jsonStrTotal = weChatService.getFansCumulate(accountId,yesterday,yesterday);
         JSONObject jsonObjectTotal = JSONObject.parseObject(jsonStrTotal);
@@ -81,7 +81,7 @@ public class AccountFansStatServiceImpl extends ServiceImpl<AccountFansStatMappe
         // 昨日和前日 数据
         List<AccountFansStat> statData = baseMapper.selectByDateAndAccId(accountId,yesterday,beforeDay);
         // 昨日活跃数量
-        int inactiveNum =  inactiveFansNum(accountId,yesterday);
+        long inactiveNum =  inactiveFansNum(accountId,yesterday);
         AccountFansStat ydData = statData.stream().filter(e->yesterday.equals(e.getStatDate())).findFirst().orElseGet(AccountFansStat::new);
         addNum = newNum-cancelNum;
         ydData.setTotalFansNum(totalNum);

+ 11 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/FansActionStatServiceImpl.java

@@ -9,6 +9,7 @@ import com.idiot.operationbackend.support.Constants;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.List;
 
@@ -42,6 +43,16 @@ public class FansActionStatServiceImpl extends ServiceImpl<FansActionStatMapper,
     }
 
 
+    @Override
+    public List<FansActionStat> queryFansActionStat(String accountId, LocalDateTime startDate, LocalDateTime endDate) {
+        long start =  startDate.toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
+        long end = endDate.toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
+        return list(Wrappers.<FansActionStat>lambdaQuery().eq(FansActionStat::getAccountId,accountId)
+                .ge(FansActionStat::getCreateTime,start)
+                .le(FansActionStat::getCreateTime,end)
+                .orderByAsc(FansActionStat::getCreateTime));
+    }
+
     @Override
     public List<FansActionStat> queryFansActionStat(String accountId, long start, long end) {
           return list(Wrappers.<FansActionStat>lambdaQuery().eq(FansActionStat::getAccountId,accountId)

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/support/Constants.java

@@ -66,7 +66,7 @@ public class Constants {
     public static final int MENU = 5;
 
 
-    public static BigDecimal calcRate(int now, int before) {
+    public static BigDecimal calcRate(long now, long before) {
         if (0 == before) {
             return BigDecimal.valueOf((now*100.0)/1.0);
         } else if (0 == now) {

+ 12 - 15
operation-backend/src/main/java/com/idiot/operationbackend/vo/StatData.java

@@ -11,15 +11,13 @@ public class StatData {
 
     private String dateLabel;
 
-    private Integer newNum;
+    private Long newNum;
 
-    private Integer cancelNum;
-
-    private Integer addNum;
-
-    private Integer inactiveNum;
+    private Long cancelNum;
 
+    private Long addNum;
 
+    private Long inactiveNum;
 
     public String getDateLabel() {
         return dateLabel;
@@ -29,36 +27,35 @@ public class StatData {
         this.dateLabel = dateLabel;
     }
 
-    public Integer getNewNum() {
+    public Long getNewNum() {
         return newNum;
     }
 
-    public void setNewNum(Integer newNum) {
+    public void setNewNum(Long newNum) {
         this.newNum = newNum;
     }
 
-    public Integer getCancelNum() {
+    public Long getCancelNum() {
         return cancelNum;
     }
 
-    public void setCancelNum(Integer cancelNum) {
+    public void setCancelNum(Long cancelNum) {
         this.cancelNum = cancelNum;
     }
 
-
-    public Integer getAddNum() {
+    public Long getAddNum() {
         return addNum;
     }
 
-    public void setAddNum(Integer addNum) {
+    public void setAddNum(Long addNum) {
         this.addNum = addNum;
     }
 
-    public Integer getInactiveNum() {
+    public Long getInactiveNum() {
         return inactiveNum;
     }
 
-    public void setInactiveNum(Integer inactiveNum) {
+    public void setInactiveNum(Long inactiveNum) {
         this.inactiveNum = inactiveNum;
     }
 }