Преглед на файлове

feat: 优化会员观看数据汇总统计表

caoliqin преди 1 седмица
родител
ревизия
d654fde66d

+ 3 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyMapper.java

@@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Update;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 企业Mapper接口
@@ -158,4 +159,6 @@ public interface CompanyMapper
 
     List<Company> selectCompanyAllList();
 
+    List<Company> selectCompanyByIds(@Param("companyIds") Set<Long> companyIds);
+
 }

+ 67 - 26
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserWatchStatisticsServiceImpl.java

@@ -1,13 +1,16 @@
 package com.fs.course.service.impl;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.company.domain.Company;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.mapper.FsUserCoursePeriodMapper;
 import com.fs.store.mapper.FsUserMapper;
 import com.google.common.collect.Lists;
@@ -15,6 +18,7 @@ import lombok.AllArgsConstructor;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsUserWatchStatisticsMapper;
@@ -39,6 +43,8 @@ public class FsUserWatchStatisticsServiceImpl extends ServiceImpl<FsUserWatchSta
     @Autowired
     private SqlSessionFactory sqlSessionFactory;
 
+    private final CompanyMapper companyMapper;
+
     /**
      * 查询会员看课统计-按营期统计
      *
@@ -115,33 +121,68 @@ public class FsUserWatchStatisticsServiceImpl extends ServiceImpl<FsUserWatchSta
     @Transactional
     public void insertStatistics() {
         // 1、获取统计结果
-        //获取会员数量和新增会员数量
-        List<FsUserWatchStatistics> userTotal = fsUserMapper.selectFsUserTotal();
-        FsUserWatchStatistics userTotalStatistics = new FsUserWatchStatistics();
-        if(!userTotal.isEmpty()){
-            userTotalStatistics = userTotal.get(0);
-        }
-
-        // 获取看课统计
+        // 获取所有的营期,并拆分公司id
+        FsUserCoursePeriod periodParam = new FsUserCoursePeriod();
+        List<FsUserCoursePeriod> fsUserCoursePeriods = fsUserCoursePeriodMapper.selectFsUserCoursePeriodList(periodParam);
+        Set<Long> companyIds = fsUserCoursePeriods.stream()
+                .flatMap(item -> Arrays.stream(item.getCompanyId().split(",")))
+                .map(Long::valueOf)
+                .collect(Collectors.toSet());
+
+        // 获取公司信息
+        List<Company> companies = companyMapper.selectCompanyByIds(companyIds);
+        Map<Long, Company> companyMap = companies.stream().collect(Collectors.toMap(Company::getCompanyId, Function.identity()));
+
+        // 获取看课统计(按营期按公司)
         List<FsUserWatchStatistics> courseWatchStatistics = baseMapper.getCourseWatchStatistics();
+        Map<String, FsUserWatchStatistics> courseWatchStatisticsMap = courseWatchStatistics.stream().collect(Collectors.toMap(k -> String.format("%s-%s", k.getPeriodId(), k.getCompanyId()), v -> v));
 
-//        // 转化map
-//        Map<Long, FsUserWatchStatistics> watchStatisticsMap = courseWatchStatistics.stream()
-//                .collect(Collectors.toMap(
-//                        FsUserWatchStatistics::getPeriodId,
-//                        Function.identity()
-//                ));
-        // 组装数据
-        for (FsUserWatchStatistics courseWatchStatistic : courseWatchStatistics) {
-            // 单独set,不用copy,避免copy出来的结果被前面的覆盖
-            courseWatchStatistic.setUserNum(userTotalStatistics.getUserNum() != null ? userTotalStatistics.getUserNum():0);
-            courseWatchStatistic.setNewUserNum(userTotalStatistics.getNewUserNum() != null ? userTotalStatistics.getNewUserNum():0);
-            courseWatchStatistic.setCreateTime(new Date());
-            courseWatchStatistic.setUpdateTime(new Date());
-        }
+        //获取公司的会员数量和今日新增会员数量
+        List<FsUserWatchStatistics> userTotal = fsUserMapper.selectFsUserTotal();
+        Map<String, FsUserWatchStatistics> userTotalMap = userTotal.stream().collect(Collectors.toMap(FsUserWatchStatistics::getCompanyId, Function.identity()));
+
+        List<FsUserWatchStatistics> list = fsUserCoursePeriods.stream()
+                .flatMap(item -> Arrays.stream(item.getCompanyId().split(","))
+                        .map(companyIdStr -> {
+                            Long companyId = Long.valueOf(companyIdStr.trim());
+                            Company company = companyMap.get(companyId);
+
+                            // 赋值
+                            FsUserWatchStatistics fsUserWatchStatistics = new FsUserWatchStatistics();
+                            BeanUtils.copyProperties(item, fsUserWatchStatistics);
+                            ZonedDateTime zonedDateTime = item.getPeriodStartingTime().atStartOfDay(ZoneId.systemDefault());
+                            fsUserWatchStatistics.setPeriodStartingTime(Date.from(zonedDateTime.toInstant()));
+                            fsUserWatchStatistics.setCompanyId(companyIdStr.trim());
+                            fsUserWatchStatistics.setCompanyName(company != null ? company.getCompanyName() : null);
+
+                            FsUserWatchStatistics userTotalData = userTotalMap.get(fsUserWatchStatistics.getCompanyId());
+
+                            String key = String.format("%s-%s", fsUserWatchStatistics.getPeriodId(), fsUserWatchStatistics.getCompanyId());
+                            FsUserWatchStatistics watchData = courseWatchStatisticsMap.get(key);
+
+                            if(userTotalData != null){
+                                fsUserWatchStatistics.setUserNum(userTotalData.getUserNum());
+                                fsUserWatchStatistics.setNewUserNum(userTotalData.getNewUserNum());
+                            } else {
+                                fsUserWatchStatistics.setUserNum(0);
+                                fsUserWatchStatistics.setNewUserNum(0);
+                            }
+
+                            if(watchData != null){
+                                fsUserWatchStatistics.setWatchNum(watchData.getWatchNum());
+                                fsUserWatchStatistics.setCompleteWatchNum(watchData.getCompleteWatchNum());
+                                fsUserWatchStatistics.setCompleteWatchRate(watchData.getCompleteWatchRate());
+                            } else {
+                                fsUserWatchStatistics.setWatchNum(0);
+                                fsUserWatchStatistics.setCompleteWatchNum(0);
+                                fsUserWatchStatistics.setCompleteWatchRate(BigDecimal.ZERO);
+                            }
+
+                            return fsUserWatchStatistics;
+                        })).collect(Collectors.toList());
 
         //2、分批次插入数据
-        this.batchInsert(courseWatchStatistics);
+        this.batchInsert(list);
     }
 
     private void batchInsert(List<FsUserWatchStatistics> list) {

+ 8 - 0
fs-service-system/src/main/resources/mapper/company/CompanyMapper.xml

@@ -163,4 +163,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+    <select id="selectCompanyByIds" parameterType="Long" resultType="Company">
+        <include refid="selectCompanyVo"/>
+        where company_id in
+        <foreach item="companyId" collection="companyIds" open="(" separator="," close=")">
+            #{companyId}
+        </foreach>
+    </select>
+
 </mapper>

+ 7 - 13
fs-service-system/src/main/resources/mapper/course/FsUserWatchStatisticsMapper.xml

@@ -104,27 +104,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.user_id END ) AS watchNum,
             count( DISTINCT CASE WHEN fwl.log_type = 2 THEN fwl.user_id END ) AS completeWatchNum,
             ifnull(
-                ROUND(
-                    (
-                        COUNT( DISTINCT CASE WHEN fwl.log_type = 2 THEN fwl.user_id END ) / count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.user_id END )) * 100,
-                    2
+                    ROUND(
+                            (
+                                COUNT( DISTINCT CASE WHEN fwl.log_type = 2 THEN fwl.user_id END ) / count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.user_id END )) * 100,
+                            2
                     ),
                     0
             ) AS completeWatchRate,
-            fwl.period_id
-            ,fs_user_course_period.period_name,
-            fs_user_course_period.period_starting_time,
-            fs_user_course_period.company_id,
-            GROUP_CONCAT(DISTINCT company.company_name) company_name
+            fwl.period_id,
+            fwl.company_id
         FROM
             fs_course_watch_log fwl
-                LEFT JOIN fs_user_course_period ON fwl.period_id = fs_user_course_period.period_id
-                LEFT JOIN company ON FIND_IN_SET( company.company_id, fs_user_course_period.company_id ) > 0
         WHERE
             fwl.send_type = 1
-            and fs_user_course_period.period_name is not null
         GROUP BY
-            fwl.period_id
+            fwl.period_id, fwl.company_id
     </select>
 
     <insert id="insertFsUserWatchStatisticsTask" parameterType="FsUserWatchStatistics" useGeneratedKeys="true" keyProperty="id">

+ 4 - 2
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -1585,15 +1585,17 @@
     <select id="selectFsUserTotal" resultType="FsUserWatchStatistics">
         SELECT
             count( fs_user.user_id ) as userNum,
-            count( DISTINCT CASE WHEN to_days( fs_user.create_time ) = to_days( now()) THEN fs_user.user_id END ) as newUserNum
+            count( DISTINCT CASE WHEN to_days( fs_user.create_time ) = to_days( now()) THEN fs_user.user_id END ) as newUserNum,
+            fs_user.company_id
         FROM
             fs_user
             LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
-            LEFT JOIN company ON company.company_id = fs_user.company_id
         WHERE
             fs_user.is_del = 0
           AND fs_user.`status` = 1
           AND company_user.user_id is not null
+        GROUP BY
+            fs_user.company_id
     </select>