Эх сурвалжийг харах

add(backend) [粉丝属性 2.0]

wangxiao 4 жил өмнө
parent
commit
aa090f8737

+ 50 - 66
operation-backend/src/main/java/com/idiot/operationbackend/controller/IndexController.java

@@ -1,11 +1,10 @@
 package com.idiot.operationbackend.controller;
 
 import com.idiot.operationbackend.entity.Account;
-import com.idiot.operationbackend.entity.AccountFans;
-import com.idiot.operationbackend.entity.AccountFansStat;
+import com.idiot.operationbackend.entity.AccountStat;
 import com.idiot.operationbackend.entity.FansActionStat;
 import com.idiot.operationbackend.service.facade.AccountFansService;
-import com.idiot.operationbackend.service.facade.AccountFansStatService;
+import com.idiot.operationbackend.service.facade.AccountStatService;
 import com.idiot.operationbackend.service.facade.AccountService;
 import com.idiot.operationbackend.service.facade.FansActionStatService;
 import com.idiot.operationbackend.support.Constants;
@@ -14,6 +13,7 @@ import com.idiot.operationbackend.support.JsonResult;
 import com.idiot.operationbackend.util.JwtTokenUtil;
 import com.idiot.operationbackend.vo.GeneralStatData;
 
+import com.idiot.operationbackend.vo.NumberStatData;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -29,7 +29,6 @@ import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -60,7 +59,7 @@ public class IndexController {
     private AccountService accountService;
 
     @Autowired
-    private AccountFansStatService fansStatService;
+    private AccountStatService accountStatService;
 
     @Autowired
     private AccountFansService fansService;
@@ -73,32 +72,32 @@ public class IndexController {
 
     @GetMapping("/summary")
     @ApiOperation(value = "查询公众号昨日统计数据概览")
-    public ResponseEntity<JsonResult<AccountFansStat>> getFansStat (@RequestHeader String token) {
+    public ResponseEntity<JsonResult<AccountStat>> getFansStat (@RequestHeader String token) {
         String userId = JwtTokenUtil.getUserId(token);
         logger.info("用户:{}查询首页数据统计概览---start",userId);
         List<Account> accounts = accountService.queryAccountByUserId(userId);
         List<String> accountIds =  accounts.stream().map(Account::getId).collect(Collectors.toList());
         // 查询数据  不知道怎么优化
         String yesterdayStr = Constants.DATE_FORMATTER.format(LocalDate.now().plusDays(-1));
-        List<AccountFansStat> ydStatData = fansStatService.queryByDateAndAccIds(accountIds,yesterdayStr);
+        List<AccountStat> ydStatData = accountStatService.queryByDateAndAccIds(accountIds,yesterdayStr);
         String beforeYesterdayStr = Constants.DATE_FORMATTER.format(LocalDate.now().plusDays(-2));
-        List<AccountFansStat> beforeYdStat = fansStatService.queryByDateAndAccIds(accountIds,beforeYesterdayStr);
+        List<AccountStat> beforeYdStat = accountStatService.queryByDateAndAccIds(accountIds,beforeYesterdayStr);
 
         logger.info("用户:{}首页概览数据计算中---ing",userId);
         // 所有公众号昨日数据
-        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();
+        long totalNum = ydStatData.stream().mapToLong(AccountStat::getTotalFansNum).sum();
+        long addNum = ydStatData.stream().mapToLong(AccountStat::getAddNum).sum();
+        long cancelNum = ydStatData.stream().mapToLong(AccountStat::getCancelNum).sum();
+        long newNum = ydStatData.stream().mapToLong(AccountStat::getNewNum).sum();
+        long inactiveNum = ydStatData.stream().mapToLong(AccountStat::getInactiveNum).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();
+        long bfCancelNum = beforeYdStat.stream().mapToLong(AccountStat::getCancelNum).sum();
+        long bfAddNum = beforeYdStat.stream().mapToLong(AccountStat::getAddNum).sum();
+        long bfNewNum = beforeYdStat.stream().mapToLong(AccountStat::getNewNum).sum();
+        long bfInactiveNum = beforeYdStat.stream().mapToLong(AccountStat::getInactiveNum).sum();
+        long bfTotalNum = beforeYdStat.stream().mapToLong(AccountStat::getTotalFansNum).sum();
 
-        AccountFansStat result = new AccountFansStat();
+        AccountStat result = new AccountStat();
         result.setAddNum(addNum);
         result.setNewNum(newNum);
         result.setCancelNum(cancelNum);
@@ -115,18 +114,18 @@ public class IndexController {
 
     @GetMapping("/single/{accountId}")
     @ApiOperation(value = "查询单个公众号昨日统计数据概览")
-    public ResponseEntity<JsonResult<AccountFansStat>> getSingleFansStat (@RequestHeader String token,
+    public ResponseEntity<JsonResult<AccountStat>> getSingleFansStat (@RequestHeader String token,
                                                                           @PathVariable String accountId) {
         String userId = JwtTokenUtil.getUserId(token);
         logger.info("用户:{}查询首页单个公众号:{}数据统计概览---start",userId,accountId);
         String yesterdayStr = Constants.DATE_FORMATTER.format(LocalDate.now().plusDays(-1));
-        AccountFansStat fansStat = fansStatService.queryByDateAndAccountId(accountId,yesterdayStr);
+        AccountStat fansStat = accountStatService.queryByDateAndAccountId(accountId,yesterdayStr);
         logger.info("用户:{}查询首页单个公众号:{}数据统计概览---end",userId,accountId);
         return ResponseEntity.ok(JsonResult.success(fansStat));
     }
 
 
-    @GetMapping("/fansGrowth/{accountId}")
+    @GetMapping("/growth/{accountId}")
     @ApiOperation(value = "查询单个公众号--粉丝增长")
     public ResponseEntity<JsonResult<Map<String,Object>>> getFansGrowthStat (@PathVariable String accountId,
                                                               @RequestHeader String token,
@@ -171,7 +170,7 @@ public class IndexController {
     }
 
 
-    @GetMapping("/fansProperty/{accountId}")
+    @GetMapping("/property/{accountId}")
     @ApiOperation(value = "查询单个公众号--粉丝属性")
     public ResponseEntity<JsonResult<Map<String,Object>>> getFansPropertyStat(
                                                                 @RequestHeader String token,
@@ -179,22 +178,32 @@ public class IndexController {
                                                                 @RequestParam(required = false) String startDate,
                                                                 @RequestParam(required = false) String endDate) {
         String userId = JwtTokenUtil.getUserId(token);
-        logger.info("用户:{}查询首页单个公众号:{}属性,startDate:{},endDate:{} --->start",userId,accountId,startDate,endDate);
-        List<AccountFans> accountFans;
+        logger.info("用户:{}查询首页单个公众号:{}粉丝属性,startDate:{},endDate:{} --->start",userId,accountId,startDate,endDate);
         Map<String,Object> result = new HashMap<>(4);
-        if (!StringUtils.isEmpty(startDate) && !StringUtils.isEmpty(endDate) ){
-           accountFans = fansService.queryFansByDateAndDate(accountId,startDate,endDate);
-        }else {
-
-        }
-
-        logger.info("用户:{}查询首页单个公众号:{}属性,startDate:{},endDate:{} --->end",userId,accountId,startDate,endDate);
-        return null;
+        List<NumberStatData> numberStatData = fansService.statByFansProperty(accountId,startDate,endDate);
+        statFansProperty(numberStatData,result);
+        logger.info("用户:{}查询首页单个公众号:{}粉丝属性,startDate:{},endDate:{} --->end",userId,accountId,startDate,endDate);
+        return ResponseEntity.ok(JsonResult.success(result));
+    }
 
+    @GetMapping("/inactive/{accountId}")
+    @ApiOperation(value = "查询单个公众号--粉丝活跃度")
+    public ResponseEntity<JsonResult<Map<String,Object>>> getFansInactiveStat(@RequestHeader String token,
+                                                                              @PathVariable String accountId,
+                                                                              @RequestParam String startDate,
+                                                                              @RequestParam String endDate) {
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}查询首页单个公众号:{}粉丝活跃度,startDate:{},endDate:{} --->start",userId,accountId,startDate,endDate);
+        Map<String,Object> result = new HashMap<>(4);
+        List<NumberStatData> numberStatData = fansService.statByFansProperty(accountId,startDate,endDate);
+        statFansProperty(numberStatData,result);
+        logger.info("用户:{}查询首页单个公众号:{}粉丝活跃度,startDate:{},endDate:{} --->end",userId,accountId,startDate,endDate);
+        return ResponseEntity.ok(JsonResult.success(result));
     }
 
 
 
+
     /**
      *  统计粉丝数据  好难受写不出完美的代码
      * @author wangxiao
@@ -221,8 +230,8 @@ public class IndexController {
         }else {
             throw new CustomException(500,"请你选择正确的时间统计类型!");
         }
-        LocalDateTime startLocalDate =  startDate.atTime(LocalTime.of(0,0,0));
-        LocalDateTime endLocalDate =  endDate.plusDays(1).atTime(LocalTime.of(0,0,0));
+        LocalDateTime startLocalDate =  startDate.atTime(Constants.DEFAULT_TIME);
+        LocalDateTime endLocalDate =  endDate.plusDays(1).atTime(Constants.DEFAULT_TIME);
         List<FansActionStat> fansActionStats = actionStatService.queryFansActionStat(accountId,startLocalDate,endLocalDate);
         if (CollectionUtils.isEmpty(fansActionStats)) {
             throw new CustomException(500,"暂无数据!");
@@ -298,40 +307,15 @@ public class IndexController {
      *  统计粉丝属性
      * @author wangxiao
      * @date 18:57 2020/9/16
-     * @param fans
+     * @param fansData
      * @param map
      * @return void
      */
-    private void statFansProperty(List<AccountFans> fans,Map<String,Object> map) {
-        long totalFansNum = 0;
-        long  manNum = 0;
-        BigDecimal manRate = BigDecimal.ZERO;
-        long  womanNum = 0;
-        BigDecimal womanRate = BigDecimal.ZERO;
-        Map<String,Long> subscribeScene = null;
-        if (!CollectionUtils.isEmpty(fans)) {
-            totalFansNum = fans.size();
-            manNum = fans.parallelStream().filter(e->1==e.getSex()).count();
-            womanNum = fans.parallelStream().filter(e->2==e.getSex()).count();
-            manRate = BigDecimal.valueOf((manNum*100)/totalFansNum).setScale(2);
-            womanRate = BigDecimal.valueOf((womanNum*100)/totalFansNum).setScale(2);
-            subscribeScene = fans.stream().collect(Collectors.groupingBy(AccountFans::getSubscribeScene,Collectors.reducing(0L,accountFans -> 1L,Long::sum)));
-        }
-        Map<String,Object> base = new HashMap<>(6);
-        base.put("totalFansNum",totalFansNum);
-        base.put("manNum",manNum);
-        base.put("womanNum",womanNum);
-        base.put("manRate",manRate);
-        base.put("womanRate",womanRate);
-        map.put("base",base);
-        Map<String,Object> sex = new HashMap<>(4);
-        sex.put("manNum",manNum);
-        sex.put("womanNum",womanNum);
-        sex.put("manRate",manRate);
-        sex.put("womanRate",womanRate);
-        map.put("sex",sex);
-        map.put("subscribeScene",subscribeScene);
-
+    private void statFansProperty(List<NumberStatData> fansData,Map<String,Object> map) {
+      if (!CollectionUtils.isEmpty(fansData)) {
+          Map<String,List<NumberStatData>> numData = fansData.stream().collect(Collectors.groupingBy(NumberStatData::getType));
+          map.putAll(numData);
+      }
     }
 
 

+ 20 - 0
operation-backend/src/main/java/com/idiot/operationbackend/entity/AccountFans.java

@@ -48,6 +48,10 @@ public class AccountFans {
 
     private Long lastInactiveTime;
 
+    private Long createTime;
+
+    private Boolean state;
+
     private String updateTime;
 
 
@@ -203,4 +207,20 @@ public class AccountFans {
     public void setGroupId(Integer groupId) {
         this.groupId = groupId;
     }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Boolean getState() {
+        return state;
+    }
+
+    public void setState(Boolean state) {
+        this.state = state;
+    }
 }

+ 28 - 2
operation-backend/src/main/java/com/idiot/operationbackend/entity/AccountFansStat.java → operation-backend/src/main/java/com/idiot/operationbackend/entity/AccountStat.java

@@ -10,8 +10,8 @@ import java.math.BigDecimal;
  * @author wang xiao
  * @date Created in 13:57 2020/9/15
  */
-@TableName("t_account_fans_stat")
-public class AccountFansStat {
+@TableName("t_account_stat")
+public class AccountStat {
 
     @TableId
     private String id;
@@ -82,6 +82,16 @@ public class AccountFansStat {
      */
     private BigDecimal pageReadRate;
 
+    /**
+     * 七天活跃
+     */
+    private Long sevenNum;
+
+    /**
+     * 15天活跃
+     */
+    private Long fifteenNum;
+
     /**
      * 统计日期 yyyy-MM-dd
      */
@@ -219,4 +229,20 @@ public class AccountFansStat {
     public void setCreateTime(String createTime) {
         this.createTime = createTime;
     }
+
+    public Long getSevenNum() {
+        return sevenNum;
+    }
+
+    public void setSevenNum(Long sevenNum) {
+        this.sevenNum = sevenNum;
+    }
+
+    public Long getFifteenNum() {
+        return fifteenNum;
+    }
+
+    public void setFifteenNum(Long fifteenNum) {
+        this.fifteenNum = fifteenNum;
+    }
 }

+ 2 - 2
operation-backend/src/main/java/com/idiot/operationbackend/handler/ScheduledHandler.java

@@ -2,7 +2,7 @@ package com.idiot.operationbackend.handler;
 
 
 import com.idiot.operationbackend.entity.Account;
-import com.idiot.operationbackend.service.facade.AccountFansStatService;
+import com.idiot.operationbackend.service.facade.AccountStatService;
 import com.idiot.operationbackend.service.facade.AccountService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,7 +22,7 @@ public class ScheduledHandler {
 
 
     @Autowired
-    private AccountFansStatService fansStatService;
+    private AccountStatService fansStatService;
 
 
     @Autowired

+ 73 - 0
operation-backend/src/main/java/com/idiot/operationbackend/mappers/AccountFansMapper.java

@@ -2,10 +2,83 @@ package com.idiot.operationbackend.mappers;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.idiot.operationbackend.entity.AccountFans;
+import com.idiot.operationbackend.vo.NumberStatData;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
 
 /**
  * @author wang xiao
  * @date Created in 19:23 2020/9/10
  */
 public interface AccountFansMapper extends BaseMapper<AccountFans> {
+
+
+    /**
+     *  粉丝属性 时间范围统计
+     * @author wangxiao
+     * @date 11:05 2020/9/17
+     * @param accountId
+     * @param start
+     * @param end
+     * @return java.util.List<com.idiot.operationbackend.vo.NumberStatData>
+     */
+    @Select("SELECT   " +
+            "  sex AS `key`,   " +
+            "  COUNT( sex ) AS `number`,   " +
+            "  'sex' AS `type`    " +
+            "FROM   " +
+            "  t_account_fans t    " +
+            "WHERE   " +
+            "  t.account_id = #{accountId}    " +
+            "  AND t.state = 1    " +
+            "  AND t.create_time >= #{start}    " +
+            "  AND t.create_time <= #{end}    " +
+            "GROUP BY   " +
+            "  t.sex UNION   " +
+            "SELECT   " +
+            "  province AS `key`,   " +
+            "  COUNT( province ) AS `number`,   " +
+            "  'province' AS `type`    " +
+            "FROM   " +
+            "  t_account_fans t    " +
+            "WHERE   " +
+            "  t.account_id = #{accountId}    " +
+            "  AND t.state = 1    " +
+            "  AND t.create_time >= #{start}    " +
+            "  AND t.create_time <= #{end}    " +
+            "GROUP BY   " +
+            "  t.province UNION   " +
+            "SELECT   " +
+            "  subscribe_scene AS `key`,   " +
+            "  COUNT( subscribe_scene ) AS `number`,   " +
+            "  'subscribeScene' AS `type`    " +
+            "FROM   " +
+            "  t_account_fans t    " +
+            "WHERE   " +
+            "  t.account_id = #{accountId}    " +
+            "  AND t.state = 1    " +
+            "  AND t.create_time >= #{start}    " +
+            "  AND t.create_time <= #{end}    " +
+            "GROUP BY   " +
+            "  t.subscribe_scene")
+    @Results(id = "NumberStatData",value = {
+                    @Result(column = "key",property = "key"),
+                    @Result(column = "number",property = "number"),
+                    @Result(column = "type",property = "type")
+            })
+    List<NumberStatData> statPropertyByDate(@Param("accountId") String accountId,@Param("start") long start,@Param("end")  long end);
+
+
+    /**
+     *  粉丝属性 全部统计 (不想写动态SQL)
+     * @author wangxiao
+     * @date 11:05 2020/9/17
+     * @param accountId
+     * @return java.util.List<com.idiot.operationbackend.vo.NumberStatData>
+     */
+    @ResultMap(value = "NumberStatData")
+    List<NumberStatData> statPropertyByAll(@Param("accountId") String accountId);
+
+
 }

+ 4 - 4
operation-backend/src/main/java/com/idiot/operationbackend/mappers/AccountFansStatMapper.java → operation-backend/src/main/java/com/idiot/operationbackend/mappers/AccountStatMapper.java

@@ -1,7 +1,7 @@
 package com.idiot.operationbackend.mappers;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.idiot.operationbackend.entity.AccountFansStat;
+import com.idiot.operationbackend.entity.AccountStat;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Result;
 import org.apache.ibatis.annotations.Results;
@@ -13,7 +13,7 @@ import java.util.List;
  * @author wang xiao
  * @date Created in 14:52 2020/9/15
  */
-public interface AccountFansStatMapper extends BaseMapper<AccountFansStat> {
+public interface AccountStatMapper extends BaseMapper<AccountStat> {
 
     /**
      *  查询 两个日期的统计数据
@@ -63,8 +63,8 @@ public interface AccountFansStatMapper extends BaseMapper<AccountFansStat> {
             @Result(column = "add_num",property = "addNum"),
             @Result(column = "stat_date",property = "statDate"),
     })
-    List<AccountFansStat> selectByDateAndAccId(@Param("accountId") String accountId, @Param("stateDate") String stateDate,
-                                               @Param("beforeDate")  String beforeDate);
+    List<AccountStat> selectByDateAndAccId(@Param("accountId") String accountId, @Param("stateDate") String stateDate,
+                                           @Param("beforeDate")  String beforeDate);
 
 
 

+ 14 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/AccountFansService.java

@@ -2,6 +2,7 @@ package com.idiot.operationbackend.service.facade;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.idiot.operationbackend.entity.AccountFans;
+import com.idiot.operationbackend.vo.NumberStatData;
 
 import java.util.List;
 
@@ -43,4 +44,17 @@ public interface AccountFansService extends IService<AccountFans> {
      * @return java.util.List<com.idiot.operationbackend.entity.AccountFans>
      */
     List<AccountFans> queryFansByDateAndDate (String accountId,String startDate,String endDate);
+
+
+    /**
+     *  粉丝属性得统计
+     * @author wangxiao
+     * @date 11:03 2020/9/17
+     * @param accountId
+     * @param startDate
+     * @param endDate
+     * @return java.util.List<com.idiot.operationbackend.vo.NumberStatData>
+     */
+    List<NumberStatData> statByFansProperty (String accountId,String startDate,String endDate);
+
 }

+ 4 - 4
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/AccountFansStatService.java → operation-backend/src/main/java/com/idiot/operationbackend/service/facade/AccountStatService.java

@@ -1,7 +1,7 @@
 package com.idiot.operationbackend.service.facade;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.idiot.operationbackend.entity.AccountFansStat;
+import com.idiot.operationbackend.entity.AccountStat;
 
 import java.util.List;
 
@@ -9,7 +9,7 @@ import java.util.List;
  * @author wang xiao
  * @date Created in 14:53 2020/9/15
  */
-public interface AccountFansStatService extends IService<AccountFansStat> {
+public interface AccountStatService extends IService<AccountStat> {
 
     /**
      *  查询 公众号列表下的 粉丝统计
@@ -19,7 +19,7 @@ public interface AccountFansStatService extends IService<AccountFansStat> {
      * @param statDate
      * @return java.util.List<com.idiot.operationbackend.entity.AccountFansStat>
      */
-    List<AccountFansStat> queryByDateAndAccIds(List<String> accountIds,String statDate);
+    List<AccountStat> queryByDateAndAccIds(List<String> accountIds,String statDate);
 
 
     /**
@@ -30,7 +30,7 @@ public interface AccountFansStatService extends IService<AccountFansStat> {
      * @param statDate
      * @return com.idiot.operationbackend.entity.AccountFansStat
      */
-    AccountFansStat queryByDateAndAccountId(String accountId,String statDate);
+    AccountStat queryByDateAndAccountId(String accountId, String statDate);
 
 
 

+ 25 - 6
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountFansServiceImpl.java

@@ -1,14 +1,15 @@
 package com.idiot.operationbackend.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.idiot.operationbackend.entity.AccountFans;
 import com.idiot.operationbackend.mappers.AccountFansMapper;
 import com.idiot.operationbackend.service.facade.AccountFansService;
 import com.idiot.operationbackend.support.Constants;
+import com.idiot.operationbackend.vo.NumberStatData;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -29,17 +30,35 @@ public class AccountFansServiceImpl extends ServiceImpl<AccountFansMapper, Accou
 
     @Override
     public int countFansByAccountId(String accountId) {
-        return count(Wrappers.<AccountFans>lambdaQuery().eq(AccountFans::getAccountId,accountId));
+        return count(Wrappers.<AccountFans>lambdaQuery().eq(AccountFans::getAccountId,accountId)
+                .eq(AccountFans::getState,1));
     }
 
 
     @Override
     public List<AccountFans> queryFansByDateAndDate(String accountId, String startDate, String endDate) {
-        LocalDate end = LocalDate.parse(endDate).plusDays(1);
-        String endStr = end.format(Constants.DATE_FORMATTER);
+        long  end = Constants.toLocalDateTime(endDate).plusDays(1)
+                .toEpochSecond(Constants.DEFAULT_ZONE);
+        long  start =Constants.toLocalDateTime(endDate)
+                .toEpochSecond(Constants.DEFAULT_ZONE);
         return list(Wrappers.<AccountFans>lambdaQuery()
                 .eq(AccountFans::getAccountId,accountId)
-                .ge(AccountFans::getUpdateTime,startDate)
-                .le(AccountFans::getUpdateTime,endStr));
+                .eq(AccountFans::getState,1)
+                .ge(AccountFans::getCreateTime,start)
+                .le(AccountFans::getCreateTime,end));
+    }
+
+
+    @Override
+    public List<NumberStatData> statByFansProperty(String accountId, String startDate, String endDate) {
+        List<NumberStatData> numberStatData = null;
+        if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
+            long start = Constants.toEpochSecond(Constants.toLocalDateTime(startDate));
+            long end = Constants.toEpochSecond(Constants.toLocalDateTime(endDate).plusDays(1));
+            numberStatData = baseMapper.statPropertyByDate(accountId,start,end);
+        }else {
+            numberStatData = baseMapper.statPropertyByAll(accountId);
+        }
+        return numberStatData;
     }
 }

+ 14 - 14
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountFansStatServiceImpl.java → operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountStatServiceImpl.java

@@ -4,9 +4,9 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.idiot.operationbackend.entity.AccountFansStat;
-import com.idiot.operationbackend.mappers.AccountFansStatMapper;
-import com.idiot.operationbackend.service.facade.AccountFansStatService;
+import com.idiot.operationbackend.entity.AccountStat;
+import com.idiot.operationbackend.mappers.AccountStatMapper;
+import com.idiot.operationbackend.service.facade.AccountStatService;
 import com.idiot.operationbackend.service.facade.FansActionStatService;
 import com.idiot.operationbackend.service.facade.WeChatService;
 import com.idiot.operationbackend.support.Constants;
@@ -24,8 +24,8 @@ import java.util.List;
  * @date Created in 14:54 2020/9/15
  */
 @Service
-public class AccountFansStatServiceImpl extends ServiceImpl<AccountFansStatMapper, AccountFansStat>
-        implements AccountFansStatService {
+public class AccountStatServiceImpl extends ServiceImpl<AccountStatMapper, AccountStat>
+        implements AccountStatService {
 
 
 
@@ -38,17 +38,17 @@ public class AccountFansStatServiceImpl extends ServiceImpl<AccountFansStatMappe
 
 
     @Override
-    public List<AccountFansStat> queryByDateAndAccIds(List<String> accountIds, String statDate) {
-        return list(Wrappers.<AccountFansStat>lambdaQuery().eq(AccountFansStat::getStatDate,statDate)
-                .in(AccountFansStat::getAccountId,accountIds));
+    public List<AccountStat> queryByDateAndAccIds(List<String> accountIds, String statDate) {
+        return list(Wrappers.<AccountStat>lambdaQuery().eq(AccountStat::getStatDate,statDate)
+                .in(AccountStat::getAccountId,accountIds));
     }
 
 
     @Override
-    public AccountFansStat queryByDateAndAccountId(String accountId, String statDate) {
-        return getOne(Wrappers.<AccountFansStat>lambdaQuery()
-                .eq(AccountFansStat::getAccountId,accountId)
-                .eq(AccountFansStat::getStatDate,statDate));
+    public AccountStat queryByDateAndAccountId(String accountId, String statDate) {
+        return getOne(Wrappers.<AccountStat>lambdaQuery()
+                .eq(AccountStat::getAccountId,accountId)
+                .eq(AccountStat::getStatDate,statDate));
     }
 
 
@@ -79,10 +79,10 @@ public class AccountFansStatServiceImpl extends ServiceImpl<AccountFansStatMappe
         totalNum = jsonArrayTotal.getJSONObject(0).getInteger("cumulate_user");
 
         // 昨日和前日 数据
-        List<AccountFansStat> statData = baseMapper.selectByDateAndAccId(accountId,yesterday,beforeDay);
+        List<AccountStat> statData = baseMapper.selectByDateAndAccId(accountId,yesterday,beforeDay);
         // 昨日活跃数量
         long inactiveNum =  inactiveFansNum(accountId,yesterday);
-        AccountFansStat ydData = statData.stream().filter(e->yesterday.equals(e.getStatDate())).findFirst().orElseGet(AccountFansStat::new);
+        AccountStat ydData = statData.stream().filter(e->yesterday.equals(e.getStatDate())).findFirst().orElseGet(AccountStat::new);
         addNum = newNum-cancelNum;
         ydData.setTotalFansNum(totalNum);
         ydData.setNewNum(newNum);

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

@@ -32,10 +32,9 @@ public class FansActionStatServiceImpl extends ServiceImpl<FansActionStatMapper,
 
     @Override
     public List<FansActionStat> queryFansActionStat(String accountId, String startDate, String endDate) {
-        LocalDate var1 =LocalDate.parse(startDate, Constants.DATE_FORMATTER);
-        LocalDate var2 =LocalDate.parse(endDate, Constants.DATE_FORMATTER);
-        long start =  var1.atTime(LocalTime.of(0,0,0)).toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
-        long end = var2.atTime(LocalTime.of(23,59,59)).toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
+
+        long start =  Constants.toLocalDateTime(startDate).toEpochSecond(Constants.DEFAULT_ZONE);
+        long end = Constants.toLocalDateTime(endDate).plusDays(1).toEpochSecond(Constants.DEFAULT_ZONE);
         return list(Wrappers.<FansActionStat>lambdaQuery().eq(FansActionStat::getAccountId,accountId)
                 .ge(FansActionStat::getCreateTime,start)
                 .le(FansActionStat::getCreateTime,end)
@@ -45,8 +44,8 @@ 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();
+        long start =  startDate.toEpochSecond(Constants.DEFAULT_ZONE);
+        long end = endDate.toEpochSecond(Constants.DEFAULT_ZONE);
         return list(Wrappers.<FansActionStat>lambdaQuery().eq(FansActionStat::getAccountId,accountId)
                 .ge(FansActionStat::getCreateTime,start)
                 .le(FansActionStat::getCreateTime,end)

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

@@ -2,8 +2,7 @@ package com.idiot.operationbackend.support;
 
 import java.math.BigDecimal;
 import java.net.URLDecoder;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.Locale;
 
@@ -47,6 +46,7 @@ public class Constants {
 
     public static final String LOCK_SYNC_TAG = "LOCK_SYNC_TAG_%s";
 
+    public static final LocalTime DEFAULT_TIME = LocalTime.of(0,0,0);
 
     public static final BigDecimal ZERO_RATE = BigDecimal.valueOf(0.00);
 
@@ -65,7 +65,14 @@ public class Constants {
 
     public static final int MENU = 5;
 
-
+    /**
+     *  计算 比率
+     * @author wangxiao
+     * @date 10:58 2020/9/17
+     * @param now
+     * @param before
+     * @return java.math.BigDecimal
+     */
     public static BigDecimal calcRate(long now, long before) {
         if (0 == before) {
             return BigDecimal.valueOf((now*100.0)/1.0);
@@ -75,4 +82,44 @@ public class Constants {
             return BigDecimal.valueOf(((now - before) * 100) / before).setScale(2);
         }
     }
+
+    // 以下三个方法 感觉是多余 但是懒得删除 --- start
+    /**
+     *  时间格式是yyyy-mm-dd
+     * @author wangxiao
+     * @date 10:45 2020/9/17
+     * @param dateStr
+     * @return java.time.LocalDateTime
+     */
+    public static LocalDateTime toLocalDateTime (String dateStr) {
+        return LocalDate.parse(dateStr,Constants.DATE_FORMATTER).atTime(0,0,0);
+    }
+
+    /**
+     *  描述转时间(多余)
+     * @author wangxiao
+     * @date 10:57 2020/9/17
+     * @param epochSecond
+     * @return java.time.LocalDateTime
+     */
+    public static LocalDateTime toLocalDateTime (long epochSecond ) {
+        return LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond),Constants.DEFAULT_ZONE);
+
+    }
+
+    /**
+     *  时间转秒数(多余)
+     * @author wangxiao
+     * @date 10:57 2020/9/17
+     * @param dateTime
+     * @return java.time.LocalDateTime
+     */
+    public static long toEpochSecond (LocalDateTime dateTime) {
+        return dateTime.toEpochSecond(Constants.DEFAULT_ZONE);
+    }
+    // 以上三个方法 感觉是多余 但是懒得删除 --- end
+
+
+
+
 }

+ 48 - 0
operation-backend/src/main/java/com/idiot/operationbackend/vo/NumberStatData.java

@@ -0,0 +1,48 @@
+package com.idiot.operationbackend.vo;
+
+/**
+ * @author wang xiao
+ * @date Created in 10:41 2020/9/17
+ */
+public class NumberStatData {
+
+    private String key;
+
+    private Long number;
+
+    private String type;
+
+
+    public NumberStatData() {
+    }
+
+    public NumberStatData(String key, Long number, String type) {
+        this.key = key;
+        this.number = number;
+        this.type = type;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Long getNumber() {
+        return number;
+    }
+
+    public void setNumber(Long number) {
+        this.number = number;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}

+ 6 - 3
sql/dataBase.sql

@@ -67,6 +67,8 @@ CREATE TABLE `t_account_fans`  (
   `last_inactive_time` bigint(0) NULL DEFAULT NULL COMMENT '最后互动时间',
   `group_id` int(0) NULL DEFAULT NULL COMMENT '分组',
   `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
+  `state` tinyint(1) NULL DEFAULT NULL COMMENT '状态码',
+  `create_time` bigint(0) NULL DEFAULT NULL COMMENT '创建时间 秒数时间戳',
   `update_time` datetime(0) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公众号粉丝' ROW_FORMAT = Dynamic;
@@ -91,8 +93,8 @@ CREATE TABLE `t_account_tag`  (
 -- ----------------------------
 -- Table structure for 公众号粉丝统计
 -- ----------------------------
-DROP TABLE IF EXISTS `t_account_fans_stat`;
-CREATE TABLE `t_account_fans_stat`  (
+DROP TABLE IF EXISTS `t_account_stat`;
+CREATE TABLE `t_account_stat`  (
   `id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'id',
   `account_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '公众号id',
   `new_num` int(0) NULL DEFAULT 0 COMMENT '新增数量',
@@ -107,11 +109,12 @@ CREATE TABLE `t_account_fans_stat`  (
   `total_fans_rate` decimal(5, 2) NULL DEFAULT NULL COMMENT '总粉丝比例',
   `add_rate` decimal(5, 2) NULL DEFAULT NULL COMMENT '净增比例',
   `page_read_rate` decimal(5, 2) NULL DEFAULT NULL COMMENT '阅读比例',
+  `seven_num` int(0) NULL DEFAULT NULL COMMENT '七天',
+  `fifteen_num` int(0) NULL DEFAULT NULL COMMENT '15天',
   `stat_date` date NULL DEFAULT NULL COMMENT '统计日期',
   `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公众号粉丝统计' ROW_FORMAT = Dynamic;
-
 -- ----------------------------
 -- Table structure for 粉丝动作统计
 -- ----------------------------