Procházet zdrojové kódy

add(backend) [粉丝活跃度 1.0]

wangxiao před 4 roky
rodič
revize
9940a94df2

+ 14 - 7
operation-backend/src/main/java/com/idiot/operationbackend/controller/IndexController.java

@@ -142,7 +142,7 @@ public class IndexController {
         LocalDate start = LocalDate.parse(startDate);
         LocalDate end= LocalDate.parse(endDate);
         long days = end.toEpochDay() - start.toEpochDay();
-        List<GeneralStatData> statDataList = queryFansGrowthStatData(accountId, type, start, end);
+        List<GeneralStatData> statDataList = statFansGrowthData(accountId, type, start, end);
         long newNum =0;
         long addNum =0;
         long inactiveNum =0;
@@ -188,17 +188,16 @@ public class IndexController {
 
     @GetMapping("/inactive/{accountId}")
     @ApiOperation(value = "查询单个公众号--粉丝活跃度")
-    public ResponseEntity<JsonResult<Map<String,Object>>> getFansInactiveStat(@RequestHeader String token,
+    public ResponseEntity<JsonResult<List<AccountStat>>> getFansInactiveStat(@RequestHeader String token,
                                                                               @PathVariable String accountId,
                                                                               @RequestParam String startDate,
                                                                               @RequestParam String endDate) {
         String userId = JwtTokenUtil.getUserId(token);
+        checkDate(startDate,endDate);
         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);
+        List<AccountStat> accountStats = accountStatService.queryAccountStatByDate(accountId,startDate,endDate);
         logger.info("用户:{}查询首页单个公众号:{}粉丝活跃度,startDate:{},endDate:{} --->end",userId,accountId,startDate,endDate);
-        return ResponseEntity.ok(JsonResult.success(result));
+        return ResponseEntity.ok(JsonResult.success(accountStats));
     }
 
 
@@ -214,7 +213,7 @@ public class IndexController {
      * @param endDate
      * @return java.util.List<com.idiot.operationbackend.vo.StatData>
      */
-    private List<GeneralStatData> queryFansGrowthStatData(String accountId, String type, LocalDate startDate, LocalDate endDate) {
+    private List<GeneralStatData> statFansGrowthData(String accountId, String type, LocalDate startDate, LocalDate endDate) {
 
         // 粉丝增长数据 因为能选择今天 需要在 用户动作分析里面取数据。或者一小时分析一次数据
         long disValue = 0;
@@ -255,6 +254,14 @@ public class IndexController {
         return statDataList;
     }
 
+    /**
+     *  校验日期
+     * @author wangxiao
+     * @date 11:58 2020/9/17
+     * @param start
+     * @param end
+     * @return boolean
+     */
     private boolean checkDate (String start, String end) {
         return !(StringUtils.isEmpty(start) | StringUtils.isEmpty(end));
     }

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

@@ -30,6 +30,11 @@ public class ScheduledHandler {
 
     private final Logger logger = LoggerFactory.getLogger(ScheduledHandler.class);
 
+    /**
+     *  请求微信 同步用户统计数据
+     * @author wangxiao
+     * @date 12:09 2020/9/17
+     */
     @Scheduled(cron = "0 0 1 * * ?")
     public void  scheduled () {
         logger.info("开始同步微信用户分析数据----->start,时间:{}", LocalDateTime.now().toString());

+ 34 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/AccountStatService.java

@@ -2,6 +2,7 @@ package com.idiot.operationbackend.service.facade;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.idiot.operationbackend.entity.AccountStat;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -53,4 +54,37 @@ public interface AccountStatService extends IService<AccountStat> {
      * @return int
      */
     int inactiveFansNum (String accountId,String statDate);
+
+
+
+    /**
+     * 七天活跃数量
+     * @author wangxiao
+     * @date 10:28 2020/9/16
+     * @param accountId
+     * @param statDate
+     * @return int
+     */
+    int inactiveSevenFansNum (String accountId,String statDate);
+
+
+    /**
+     * 15天活跃数量
+     * @author wangxiao
+     * @date 10:28 2020/9/16
+     * @param accountId
+     * @param statDate
+     * @return int
+     */
+    int inactiveFifteenFansNum (String accountId,String statDate);
+    /**
+     *  查询区间内 粉丝数据统计
+     * @author wangxiao
+     * @date 12:00 2020/9/17
+     * @param accountId
+     * @param startDate
+     * @param endDate
+     * @return java.util.List<com.idiot.operationbackend.entity.AccountStat>
+     */
+    List<AccountStat> queryAccountStatByDate (String accountId, String startDate,String endDate);
 }

+ 32 - 4
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountStatServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.List;
 
@@ -79,9 +80,14 @@ public class AccountStatServiceImpl extends ServiceImpl<AccountStatMapper, Accou
         totalNum = jsonArrayTotal.getJSONObject(0).getInteger("cumulate_user");
 
         // 昨日和前日 数据
+        // fixme 查询次数过多可以放在 观察者模式中异步执行(先看时间后期优化)
         List<AccountStat> statData = baseMapper.selectByDateAndAccId(accountId,yesterday,beforeDay);
         // 昨日活跃数量
         long inactiveNum =  inactiveFansNum(accountId,yesterday);
+        // 7天
+        long sevenInactiveNum =  inactiveSevenFansNum(accountId,yesterday);
+        // 15 天
+        long fifteenInactiveNum =  inactiveSevenFansNum(accountId,yesterday);
         AccountStat ydData = statData.stream().filter(e->yesterday.equals(e.getStatDate())).findFirst().orElseGet(AccountStat::new);
         addNum = newNum-cancelNum;
         ydData.setTotalFansNum(totalNum);
@@ -91,7 +97,8 @@ public class AccountStatServiceImpl extends ServiceImpl<AccountStatMapper, Accou
         ydData.setAccountId(accountId);
         ydData.setAddNum(addNum);
         ydData.setInactiveNum(inactiveNum);
-
+        ydData.setSevenNum(sevenInactiveNum);
+        ydData.setFifteenNum(fifteenInactiveNum);
         statData.stream().filter(e->beforeDay.equals(e.getStatDate())).findFirst().map(e->{
             ydData.setAddRate(Constants.calcRate(ydData.getAddNum(), e.getAddNum()));
             ydData.setNewRate(Constants.calcRate(ydData.getNewNum(), e.getNewNum()));
@@ -107,12 +114,33 @@ public class AccountStatServiceImpl extends ServiceImpl<AccountStatMapper, Accou
 
     @Override
     public int inactiveFansNum(String accountId, String statDate) {
-        LocalDate localDate = LocalDate.parse(statDate,Constants.DATE_FORMATTER);
-        long start =  localDate.atTime(LocalTime.of(0,0,0)).toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
-        long end = localDate.atTime(LocalTime.of(23,59,59)).toInstant(Constants.DEFAULT_ZONE).getEpochSecond();
+        LocalDateTime localDate = Constants.toLocalDateTime(statDate);
+        long start =  localDate.toEpochSecond(Constants.DEFAULT_ZONE);
+        long end =  localDate.plusDays(1).toEpochSecond(Constants.DEFAULT_ZONE);
         return actionStatService.countInactiveFansNum(accountId,start,end);
     }
 
+    @Override
+    public int inactiveSevenFansNum(String accountId, String statDate) {
+        LocalDateTime localDate = Constants.toLocalDateTime(statDate);
+        long start =  localDate.plusDays(-7).toEpochSecond(Constants.DEFAULT_ZONE);
+        long end =  localDate.toEpochSecond(Constants.DEFAULT_ZONE);
+        return actionStatService.countInactiveFansNum(accountId,start,end);
+    }
 
+    @Override
+    public int inactiveFifteenFansNum(String accountId, String statDate) {
+        LocalDateTime localDate = Constants.toLocalDateTime(statDate);
+        long start =  localDate.plusDays(-15).toEpochSecond(Constants.DEFAULT_ZONE);
+        long end =  localDate.toEpochSecond(Constants.DEFAULT_ZONE);
+        return actionStatService.countInactiveFansNum(accountId,start,end);
+    }
 
+    @Override
+    public List<AccountStat> queryAccountStatByDate(String accountId, String startDate, String endDate) {
+        return list(Wrappers.<AccountStat>lambdaQuery()
+                .eq(AccountStat::getAccountId,accountId)
+                .ge(AccountStat::getStatDate,startDate)
+                .le(AccountStat::getStatDate,endDate));
+    }
 }

+ 1 - 2
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/FansActionStatServiceImpl.java

@@ -8,9 +8,8 @@ import com.idiot.operationbackend.service.facade.FansActionStatService;
 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;
 
 /**