Browse Source

1、新增看课项目未插入问题处理
2、定时任务统计看课人数,完课人数的调整
3、统计看课人数,完课人数的调整
4、项目会员管理接口新增
5、答题人数,正确人数统计调整
6、会员头部数量展示调整

yfh 2 weeks ago
parent
commit
d06c1a2b13

+ 13 - 0
fs-admin/src/main/java/com/fs/store/controller/FsUserController.java

@@ -59,6 +59,19 @@ public class FsUserController extends BaseController
         return getDataTable(list);
     }
 
+    @PreAuthorize("@ss.hasPermi('store:user:list')")
+    @GetMapping("/listProject")
+    public TableDataInfo listProject(FsUser fsUser)
+    {
+        startPage();
+        List<FSUserVO> list = fsUserService.selectFsUserVOListByProject(fsUser);
+        for (FSUserVO vo : list){
+            vo.setPhone(ParseUtils.parsePhone(vo.getPhone()));
+        }
+        return getDataTable(list);
+    }
+
+
     /**
      * 导出用户列表
      */

+ 1 - 0
fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java

@@ -29,6 +29,7 @@ public class UserCourseWatchCountTask {
     /**
      * 每20分钟执行一次
      */
+//    @Scheduled(fixedRate = 1000)
     @Scheduled(cron = "0 */15 * * * ?")  // 每15分钟执行一次
     public void userCourseCountTask() {
         try {

+ 14 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsUserCourseCount.java

@@ -57,6 +57,11 @@ public class FsUserCourseCount extends BaseEntity
     @Excel(name = "用户状态,1-正常;2-停止;3-未看")
     private Long status;
 
+    /**
+     * 项目id
+     */
+    private Long projectId;
+
     /** 停课天数(如果状态是停止) */
     @Excel(name = "停课天数", readConverterExp = "如=果状态是停止")
     private Long stopWatchDays;
@@ -83,6 +88,15 @@ public class FsUserCourseCount extends BaseEntity
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date lastDate;
 
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public FsUserCourseCount setProjectId(Long projectId) {
+        this.projectId = projectId;
+        return this;
+    }
+
     public void setId(Long id)
     {
         this.id = id;

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -318,4 +318,6 @@ public interface FsUserMapper
     List<FsUserWatchCourseStatistics> selectFsUserDetail();
 
     List<FsUser> selectFsUserListByJointUserNameKey(String userNameKey);
+
+    List<FSUserVO> selectFsUserVOListByProject(@Param("maps") FsUser fsUser);
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -260,4 +260,11 @@ public interface IFsUserService
      */
     List<FsUser> selectFsUserListByJointUserNameKey(String userNameKey);
 
+    /**
+     * 查询项目会员数据
+     *
+     * @param fsUser
+     * @return
+     */
+    List<FSUserVO> selectFsUserVOListByProject(FsUser fsUser);
 }

+ 2 - 2
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -121,10 +121,10 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
         // 查询用户-每天的最新的看课状态,和最后的心跳时间
         List<FsUserCourseCount> userStatusAndLastWatchDate = fsUserCourseCountMapper.getUserStatusAndLastWatchDate();
         Map<String, FsUserCourseCount> map = userStatusAndLastWatchDate.stream()
-                .collect(Collectors.toMap(k -> String.format("%s-%s", k.getUserId(), k.getLastDate()), v -> v));
+                .collect(Collectors.toMap(k -> String.format("%s-%s-%s", k.getUserId(),k.getProjectId(), k.getLastDate()), v -> v));
 
         for (FsUserCourseCount data : countResult) {
-            String key = String.format("%s-%s",data.getUserId(), data.getLastDate());
+            String key = String.format("%s-%s-%s", data.getUserId(),data.getProjectId(), data.getLastDate());
             FsUserCourseCount fsUserCourseCount = map.get(key);
             if(fsUserCourseCount != null){
                 data.setLastWatchDate(fsUserCourseCount.getLastWatchDate());

+ 6 - 1
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -633,7 +633,7 @@ public class FsUserServiceImpl implements IFsUserService
         }
         List<UserListCountVO> list = fsUserMapper.getUserNumber(userId, companyId);
         Map<String, Integer> map = list.stream()
-                .collect(Collectors.toMap(UserListCountVO::getStatus, UserListCountVO::getNum, (v1, v2) -> v1));
+                .collect(Collectors.toMap(UserListCountVO::getStatus, UserListCountVO::getNum, (v1, v2) -> v1 + v2));
         UserListPageVO pageVO = new UserListPageVO();
         Integer normalNum = map.getOrDefault("1", 0);
         Integer blackNum = map.getOrDefault("0", 0);
@@ -1005,6 +1005,11 @@ public class FsUserServiceImpl implements IFsUserService
         return fsUserMapper.selectFsUserListByJointUserNameKey(userNameKey);
     }
 
+    @Override
+    public List<FSUserVO> selectFsUserVOListByProject(FsUser fsUser) {
+        return fsUserMapper.selectFsUserVOListByProject(fsUser);
+    }
+
     /**
      * 查询会员选项列表
      * @param params    参数

+ 11 - 2
fs-service-system/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -24,6 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="sendFinishMsg"    column="send_finish_msg"    />
         <result property="campPeriodTime"    column="camp_period_time"    />
         <result property="lastHeartbeatTime"    column="last_heartbeat_time"    />
+        <result property="project"    column="project"    />
     </resultMap>
 
     <sql id="selectFsCourseWatchLogVo">
@@ -44,6 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null "> and course_id = #{courseId}</if>
             <if test="sendType != null "> and send_type = #{sendType}</if>
             <if test="campPeriodTime != null "> and camp_period_time = #{campPeriodTime}</if>
+            <if test="project != null "> and project = #{project}</if>
         </where>
     </select>
 
@@ -285,6 +287,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sendFinishMsg != null">send_finish_msg,</if>
             <if test="campPeriodTime != null">camp_period_time,</if>
             <if test="periodId != null">period_id,</if>
+            <if test="project != null">project,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -305,6 +308,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sendFinishMsg != null">#{sendFinishMsg},</if>
             <if test="campPeriodTime != null">#{campPeriodTime},</if>
             <if test="periodId != null">#{periodId},</if>
+            <if test="project != null">#{project},</if>
         </trim>
     </insert>
 
@@ -328,6 +332,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time,</if>
             <if test="sendFinishMsg != null">send_finish_msg,</if>
             <if test="campPeriodTime != null">camp_period_time,</if>
+            <if test="project != null">project,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -347,6 +352,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">#{finishTime},</if>
             <if test="sendFinishMsg != null">#{sendFinishMsg},</if>
             <if test="campPeriodTime != null">#{campPeriodTime},</if>
+            <if test="project != null">#{project},</if>
         </trim>
         on duplicate key update
         <trim suffixOverrides=",">
@@ -371,7 +377,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         send_type,
         reward_type,
         sop_id,
-        camp_period_time
+        camp_period_time,
+        project
         )
         VALUES
         <foreach collection="watchLogs" item="log" separator=",">
@@ -390,7 +397,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{log.sendType},
             #{log.rewardType},
             #{log.sopId},
-            #{log.campPeriodTime}
+            #{log.campPeriodTime},
+            #{log.project}
             )
         </foreach>
         ON DUPLICATE KEY UPDATE
@@ -420,6 +428,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sendFinishMsg != null">send_finish_msg = #{sendFinishMsg},</if>
             <if test="lastHeartbeatTime != null">last_heartbeat_time = #{lastHeartbeatTime},</if>
             <if test="periodId != null">period_id = #{periodId},</if>
+            <if test="project != null">project = #{project},</if>
         </trim>
         where log_id = #{logId}
     </update>

+ 12 - 4
fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -24,6 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="completeWatchCount"    column="complete_watch_count"    />
         <result property="watchTimes"    column="watch_times"    />
         <result property="createDate"    column="create_date"    />
+        <result property="projectId"    column="project_id"    />
     </resultMap>
 
     <sql id="selectFsUserCourseCountVo">
@@ -151,6 +152,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getCountResult" resultType="FsUserCourseCount">
         SELECT
             fwl.user_id,
+            ucu.project_id,
             count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.video_id END ) AS watchCourseCount,
             count( DISTINCT CASE WHEN fwl.log_type = 3 THEN fwl.video_id END ) AS missCourseCount,
             IF
@@ -166,14 +168,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             DATE (fwl.create_time ) AS lastDate
         FROM
             fs_course_watch_log fwl
-            where fwl.send_type = 1 and fwl.create_time &gt;= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+            left join fs_user_company_user ucu on ucu.user_id = fwl.user_id
+            where fwl.send_type = 1 and fwl.create_time &gt;= DATE_SUB(CURDATE(), INTERVAL 7 DAY) and fwl.project = ucu.project_id
         GROUP BY
-            fwl.user_id, date(fwl.create_time)
+            fwl.user_id, date(fwl.create_time),ucu.project_id
     </select>
 
     <select id="getUserStatusAndLastWatchDate" resultType="FsUserCourseCount">
         SELECT
             fs_course_watch_log.user_id,
+            ucu.project_id,
             Max( fs_course_watch_log.last_heartbeat_time ) AS lastWatchDate,
             Max( DATE ( fs_course_watch_log.create_time ) ) AS lastDate,
             CASE
@@ -191,11 +195,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     DATE_FORMAT( fs_course_watch_log.last_heartbeat_time, '%Y-%m-%d' )) AS stop_watch_days
         FROM
             fs_course_watch_log
+                left join fs_user_company_user ucu on ucu.user_id = fs_course_watch_log.user_id
         WHERE
             fs_course_watch_log.send_type = 1
-          AND fs_course_watch_log.create_time >= DATE_SUB( CURDATE(), INTERVAL 7 DAY )
+          AND fs_course_watch_log.create_time >= DATE_SUB( CURDATE(), INTERVAL 7 DAY ) and fs_course_watch_log.project = ucu.project_id
         GROUP BY
-            fs_course_watch_log.user_id, date(fs_course_watch_log.create_time)
+            fs_course_watch_log.user_id, date(fs_course_watch_log.create_time),ucu.project_id
     </select>
 
 
@@ -218,6 +223,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="completeWatchCount != null">complete_watch_count,</if>
             <if test="watchTimes != null">watch_times,</if>
             <if test="createDate != null">create_date,</if>
+            <if test="projectId != null">project_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -236,9 +242,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="completeWatchCount != null">#{completeWatchCount},</if>
             <if test="watchTimes != null">#{watchTimes},</if>
             <if test="createDate != null">#{createDate},</if>
+            <if test="projectId != null">#{projectId},</if>
         </trim>
         on duplicate key update
         <trim suffixOverrides=",">
+
             <if test="watchCourseCount != null">watch_course_count = #{watchCourseCount},</if>
             <if test="missCourseCount != null">miss_course_count = #{missCourseCount},</if>
             <if test="missCourseStatus != null">miss_course_status = #{missCourseStatus},</if>

+ 93 - 24
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -240,12 +240,81 @@
     </select>
 
     <select id="selectFsUserVOList" resultType="com.fs.store.vo.FSUserVO">
+        SELECT
+        b.total_amount,b.last_buy_time,p.pay_money as number,p.payment_id,p.pay_time,
+        u.*,
+        fcc.watch_course_count, fcc.part_course_count, company_user.nick_name AS companyUserNickName, fcc.last_watch_date
+        ,company.company_name
+        FROM
+        fs_user u
+        LEFT JOIN (
+        SELECT max( payment_id ) AS payment_id, max( pay_time ) AS last_buy_time, SUM( pay_money ) AS total_amount,
+        user_id
+        FROM
+        fs_store_payment
+        WHERE
+        STATUS = 1
+        AND user_id IS NOT NULL
+        GROUP BY
+        user_id
+        ) b ON u.user_id = b.user_id
+        LEFT JOIN fs_store_payment p ON u.user_id = p.user_id
+        AND b.last_buy_time = p.pay_time
+        AND b.payment_id = p.payment_id
+        LEFT JOIN (
+        SELECT
+        fs_user_course_count.user_id,Max( fs_user_course_count.last_watch_date ) AS last_watch_date,fs_user_course_count.watch_course_count,
+        fs_user_course_count.part_course_count
+        FROM
+        fs_user_course_count
+        GROUP BY fs_user_course_count.user_id
+        ) fcc ON fcc.user_id = u.user_id
+        LEFT JOIN company_user ON company_user.user_id = u.company_user_id
+        LEFT JOIN company on company.company_id = company_user.company_id
+        <where>
+            1 = 1
+            <if test = "maps.nickname != null and  maps.nickname !='' " >
+                AND u.nickname LIKE CONCAT("%",#{maps.nickname},"%")
+            </if >
+            <if test = "maps.phone != null   and  maps.phone !='' " >
+                AND u.phone LIKE CONCAT("%",#{maps.phone},"%")
+            </if >
+            <if test = "maps.startCreateTime != null and maps.endCreateTime != null" >
+                AND (DATE_FORMAT( u.create_time, "%Y-%m-%d" ) &gt;= DATE_FORMAT(#{maps.startCreateTime}, "%Y-%m-%d")
+                and DATE_FORMAT( u.create_time, "%Y-%m-%d" ) &lt;= DATE_FORMAT(#{maps.endCreateTime}, "%Y-%m-%d")
+                )
+            </if >
+            <if test = "maps.registerCode != null  and  maps.registerCode !=''  " >
+                AND u.register_code = #{maps.registerCode}
+            </if >
+            <if test = "maps.status != null" >
+                AND u.STATUS = #{maps.status}
+            </if >
+            <if test = "maps.companyUserNickName != null and maps.companyUserNickName != '' " >
+                AND company_user.nick_name like CONCAT ("%",#{maps.companyUserNickName},"%")
+            </if >
+            <if test = "maps.companyName != null and maps.companyName != '' " >
+                AND company.company_name like CONCAT ("%",#{maps.companyName},"%")
+            </if >
+            <if test = "maps.level != null  and  maps.level !=''" >
+                AND u.LEVEL = #{maps.level}
+            </if >
+            <if test = "maps.isPromoter != null  and  maps.isPromoter !=''" >
+                AND u.is_promoter = #{maps.isPromoter}
+            </if >
+        </where>
+        ORDER BY
+        user_id DESC
+    </select>
+
+
+    <select id="selectFsUserVOListByProject" resultType="com.fs.store.vo.FSUserVO">
         SELECT distinct
         b.total_amount,b.last_buy_time,p.pay_money as number,p.payment_id,p.pay_time,
         u.*,
         fcc.watch_course_count, fcc.part_course_count, company_user.nick_name AS companyUserNickName, fcc.last_watch_date
         ,company.company_name,
-         ucu.project_id
+        ucu.project_id
         FROM
         fs_user u
         LEFT JOIN (
@@ -650,7 +719,7 @@
             and fs_user_company_user.company_id = #{companyId}
         </if>
         GROUP BY
-            fs_user.`status`
+            fs_user.`status`,fs_user_company_user.project_id
     </select>
 
     <select id="getRepeatUserNumber" resultType="int">
@@ -867,16 +936,15 @@
 
     <select id="countUserCourse" resultType="Map">
         SELECT
-            (
-                SELECT
-                    count(distinct fcc.user_id )
-                FROM
-                    fs_user_course_count fcc
-                        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
-                        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
-                        LEFT JOIN company_user ON ucu.company_user_id = company_user.user_id
-                        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0
+        (SELECT COUNT(*) FROM (
+        SELECT 1
+        FROM fs_user_course_count fcc
+        JOIN fs_user ON fs_user.user_id = fcc.user_id
+        JOIN fs_user_company_user ucu ON ucu.user_id = fs_user.user_id
+        JOIN company_user ON ucu.company_user_id = company_user.user_id
+        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0
                 <where>
+                    fcc.project_id = ucu.project_id
                     <if test="userId != null and userId != 0 ">
                         and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
                     </if>
@@ -900,17 +968,17 @@
                         AND company_user.user_id = #{companyUserId}
                     </if>
                 </where>
-            ) as courseWatchNum,
-            (
-                SELECT
-                    count(distinct fcc.user_id )
-                FROM
-                    fs_user_course_count fcc
-                        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
-                        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
-                        LEFT JOIN company_user ON ucu.company_user_id = company_user.user_id
-                        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0
+        GROUP BY fcc.user_id, ucu.project_id
+        ) AS watch_counts) as courseWatchNum,
+        (SELECT COUNT(*) FROM (
+        SELECT 1
+        FROM fs_user_course_count fcc
+        JOIN fs_user ON fs_user.user_id = fcc.user_id
+        JOIN fs_user_company_user ucu ON ucu.user_id = fs_user.user_id
+        JOIN company_user ON ucu.company_user_id = company_user.user_id
+        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0
                 <where>
+                    fcc.project_id = ucu.project_id
                     <if test="userId != null and userId != 0 ">
                         and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
                     </if>
@@ -935,14 +1003,15 @@
                         AND company_user.user_id = #{companyUserId}
                     </if>
                 </where>
-            ) as courseCompleteNum
+        GROUP BY fcc.user_id, ucu.project_id
+        ) AS complete_counts ) as courseCompleteNum
     </select>
 
     <select id="countUserAnswer" resultType="Map">
         SELECT
         (
         SELECT
-        count(distinct fs_user.user_id )
+        count(fs_user.user_id )
         FROM
         fs_course_answer_logs
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
@@ -974,7 +1043,7 @@
         ) AS answerNum,
         (
         SELECT
-        count(distinct fs_user.user_id )
+        count(fs_user.user_id )
         FROM
         fs_course_answer_logs
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id