فهرست منبع

企微看课统计和会员看课统计)加一个上线客户完播率和流失人数&进线时间后面需要加一个沟通内容

lxb 2 هفته پیش
والد
کامیت
e3acfcad86

+ 9 - 0
fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java

@@ -16,6 +16,7 @@ import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.mapper.FsUserCourseMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.param.FsCourseRedPacketLogParam;
+import com.fs.course.param.FsCourseWatchLogStatisticsListParam;
 import com.fs.course.service.IFsCourseRedPacketLogService;
 import com.fs.course.vo.FsCourseRedPacketLogListPVO;
 import com.fs.framework.security.LoginUser;
@@ -229,6 +230,14 @@ public class FsCourseRedPacketLogController extends BaseController
         List<OptionsVO> optionsVOS = fsUserCourseMapper.selectFsUserCourseByCompany(loginUser.getCompany().getCompanyId());
         return R.ok().put("list", optionsVOS);
     }
+    @GetMapping("/courseLost")
+    public R courseLost(FsCourseWatchLogStatisticsListParam param)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long trainingCampId = param.getCourseId();//训练营id
+        int num = fsCourseRedPacketLogService.courseLost(trainingCampId,loginUser.getCompany().getCompanyId());
+        return R.ok().put("data", num);
+    }
 
     @GetMapping(value = "/videoList/{id}")
     public R videoList(@PathVariable("id") Long id)

+ 11 - 0
fs-company/src/main/java/com/fs/company/controller/course/FsUserCourseTrainingCampController.java

@@ -55,4 +55,15 @@ public class FsUserCourseTrainingCampController {
         return AjaxResult.success(new PageInfo<>(list));
     }
 
+    @GetMapping("/shortList")
+    public AjaxResult shortList()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Map<String, Object> params = new HashMap<>();
+        params.put("companyId", loginUser.getCompany().getCompanyId());
+        //只拉取营期进行中的数据
+        params.put("periodStatus",2);
+        List<FsUserCourseTrainingCampVO> list = fsUserCourseTrainingCampService.selectFsUserCourseTrainingCampVOListByMap(params);
+        return AjaxResult.success(list);
+    }
 }

+ 29 - 0
fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java

@@ -1,8 +1,10 @@
 package com.fs.company.controller.course.qw;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
@@ -16,11 +18,16 @@ import com.fs.course.vo.FsCourseWatchLogListVO;
 import com.fs.course.vo.FsCourseWatchLogStatisticsListVO;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.param.QwWatchLogStatisticsListParam;
 import com.fs.qw.service.IQwWatchLogService;
 import com.fs.qw.vo.QwWatchLogAllStatisticsListVO;
 import com.fs.qw.vo.QwWatchLogStatisticsListVO;
+import com.fs.sop.domain.SopUserLogsInfo;
+import com.fs.sop.mapper.SopUserLogsInfoMapper;
 import com.fs.sop.mapper.SopUserLogsMapper;
+import com.fs.statis.dto.StatsWatchLogPageListDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -28,6 +35,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 短链课程看课记录Controller
@@ -47,6 +55,10 @@ public class FsQwCourseWatchLogController extends BaseController
     private SopUserLogsMapper sopUserLogsMapper;
     @Autowired
     private IQwWatchLogService qwWatchLogService;
+    @Autowired
+    private SopUserLogsInfoMapper sopUserLogsInfoMapper;
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
 
     @Value("${cloud_host.company_name}")
     private String signProjectName;
@@ -302,4 +314,21 @@ public class FsQwCourseWatchLogController extends BaseController
         List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectListBytrainingCampId(param);
         return getDataTable(list);
     }
+    //@PreAuthorize("@ss.hasPermi('course:courseWatchLog:courseLost')")
+    @PostMapping("/courseLost")
+    public R courseLost(@RequestBody StatsWatchLogPageListDTO param)
+    {
+        List<String> periodList = param.getPeriodList();
+        //sop用户数据
+        List<SopUserLogsInfo> sopUserLogsInfos = sopUserLogsInfoMapper.selectByUserLogIds(periodList);
+        List<Long> list = sopUserLogsInfos.stream().map(SopUserLogsInfo::getExternalId).collect(Collectors.toList());
+
+        //最后查看是否被拉黑
+        QueryWrapper<QwExternalContact> queryWrapper=new QueryWrapper<>();
+        queryWrapper.eq("'status'",3);
+        queryWrapper.select("id");
+        queryWrapper.in("id",list);
+        List<QwExternalContact> qwExternalContacts = qwExternalContactMapper.selectList(queryWrapper);
+        return R.ok().put("data", qwExternalContacts.size());
+    }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseWatchLog.java

@@ -91,4 +91,8 @@ public class FsCourseWatchLog extends BaseEntity
     /** im发送消息详情id */
     private Long imMsgSendDetailId;
 
+    /**
+     * 沟通内容
+     */
+    private String interflowContent;
 }

+ 8 - 2
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -217,7 +217,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
             "AND finish_time < CURRENT_DATE + INTERVAL 1 DAY")
     List<FsCourseWatchLog> selectFsCourseWatchLogFinish();
 
-    @Select({"<script> " +
+/*    @Select({"<script> " +
             "select t.* " +
             "<if test= 'sendType != 1 '> " +
             " ,concat(round(if(t.send_number=0,0,(t.on_line_num/t.send_number)*100),2),'%') on_line_rate" +
@@ -292,7 +292,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
             "DATE(o.create_time)\n" +
             "ORDER BY o.video_id ,DATE(o.create_time) " +
             ") t \n"+
-            "</script>"})
+            "</script>"})*/
     List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVO(FsCourseWatchLogStatisticsListParam param);
 
     @Select({"<script> " +
@@ -605,6 +605,12 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      */
     Integer getUserCountByCampId(@Param("trainingCampId") Long trainingCampId);
 
+    /**
+     * 查询训练营看课人id列表
+     * @param trainingCampId
+     * @return
+     */
+    Integer getUserBlackCountByCampId(@Param("trainingCampId") Long trainingCampId,@Param("companyId")Long companyId);
     List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param);
 
     /**

+ 1 - 0
fs-service/src/main/java/com/fs/course/service/IFsCourseRedPacketLogService.java

@@ -87,4 +87,5 @@ public interface IFsCourseRedPacketLogService
     void sendRedPacketBf();
 
     void queryRedPacketResult(String startTime, String endTime);
+    int courseLost(Long trainingCampId,Long companyId);
 }

+ 14 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsCourseRedPacketLogServiceImpl.java

@@ -62,6 +62,8 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private  FsCourseWatchLogMapper fsCourseWatchLogMapper;
     /**
      * 查询短链课程看课记录
      *
@@ -370,7 +372,6 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
         }
     }
 
-
     private void processRedPacket(FsCourseRedPacketLog redPacket, CourseConfig config) {
         // 获取用户信息
         FsUser user = fsUserMapper.selectFsUserByUserId(redPacket.getUserId());
@@ -462,4 +463,16 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
                 company.getCompanyId(), moneyLog.getMoney());
     }
 
+    /***
+     *流失人数
+     * @return
+     */
+    @Override
+    public int courseLost(Long trainingCampId,Long companyId) {
+        //查询训练营看课拉黑人数
+        //companyId 5 有数据
+        Integer userBlackCountByCampId = fsCourseWatchLogMapper.getUserBlackCountByCampId(trainingCampId,companyId);
+        return userBlackCountByCampId;
+    }
+
 }

+ 4 - 1
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java

@@ -137,5 +137,8 @@ public class FsCourseWatchLogListVO extends BaseEntity
      */
     private Long imMsgSendDetailId;
 
-
+    /**
+     * 沟通内容
+     */
+    private String interflowContent;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListVO.java

@@ -64,4 +64,6 @@ public class FsCourseWatchLogStatisticsListVO {
 
     /** 消耗红包金额 */
     private String  redAmount;
+
+    private String onLineCompleteRate;
 }

+ 3 - 2
fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsInfoMapper.java

@@ -155,9 +155,10 @@ public interface SopUserLogsInfoMapper {
 
 
     @DataSource(DataSourceType.SOP)
-    void batchInsertSopUserLogsInfo(@Param("SopUserLogsInfo") List<SopUserLogsInfo> logsToInsert);
-
+    public List<SopUserLogsInfo> selectByUserLogIds(@Param("userLogsIds") List<String> userLogsIds);
 
+    @DataSource(DataSourceType.SOP)
+    void batchInsertSopUserLogsInfo(@Param("SopUserLogsInfo") List<SopUserLogsInfo> logsToInsert);
     @DataSource(DataSourceType.SOP)
     @Update("<script>" +
             "UPDATE sop_user_logs_info " +

+ 92 - 1
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -56,7 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="selectFsCourseWatchLogListVO" resultType="com.fs.course.vo.FsCourseWatchLogListVO">
-        select l.log_id,l.project,l.period_id,l.user_id,uc.course_name,v.title as video_name,qec.avatar as external_user_avatar,
+        select l.interflow_content, l.log_id,l.project,l.period_id,l.user_id,uc.course_name,v.title as video_name,qec.avatar as external_user_avatar,
         l.log_type,SEC_TO_TIME(l.duration) as duration,c.company_name,l.camp_period_time,l.finish_time,
         cu.nick_name as company_user_name ,l.send_type,l.create_time,l.update_time,l.last_heartbeat_time,
         qu.qw_user_name,qec.name as external_user_name,c.company_id,u.avatar as fsAvatar,u.nick_name as fsNickName,qec.create_time as qec_create_time,
@@ -407,6 +407,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="lastHeartbeatTime != null">last_heartbeat_time = #{lastHeartbeatTime},</if>
             <if test="periodId != null">period_id = #{periodId},</if>
             <if test="project != null">project = #{project},</if>
+            <if test="interflowContent != null">interflow_content = #{interflowContent},</if>
         </trim>
         where log_id = #{logId}
     </update>
@@ -999,5 +1000,95 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             o.company_id,
             o.send_type
     </select>
+    <select id="selectFsCourseWatchLogStatisticsListVO"
+            resultType="com.fs.course.vo.FsCourseWatchLogStatisticsListVO">
+            select t.*
+            <if test="sendType != 1">
+                ,concat(round(if(t.send_number=0,0,(t.on_line_num/t.send_number)*100),2),'%') on_line_rate
+                ,concat(round(if(t.send_number=0,0,(t.type2/t.send_number)*100),2),'%') finished_rate
+            </if>
+            from (
+            SELECT
+            o.video_id,o.company_id,o.qw_user_id,DATE(o.create_time) create_time,
+            <if test="sendType != 1">
+                qu.qw_user_name qw_user_name,
+            </if>
+            <if test="sendType == 1">
+                cu.nick_name qw_user_name,
+            </if>
+            v.title videoName,uc.course_name,
+            SUM(CASE WHEN o.log_type = '1' THEN 1 ELSE 0 END) AS type1,
+            SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END) AS type2,
+            SUM(CASE WHEN o.log_type = '3' THEN 1 ELSE 0 END) AS type3,
+            SUM(CASE WHEN o.log_type = '4' THEN 1 ELSE 0 END) AS type4,
+            (
+            SUM(CASE WHEN o.log_type = '1' THEN 1 ELSE 0 END) +
+            SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END) +
+            SUM(CASE WHEN o.log_type = '4' THEN 1 ELSE 0 END)
+            ) AS on_line_num,
+
+        concat(round(if( SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END)=0,0,( SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END)/SUM(CASE WHEN o.log_type = '1' THEN 1 ELSE 0 END) +
+        SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END) +
+        SUM(CASE WHEN o.log_type = '4' THEN 1 ELSE 0 END))*100),2),'%') as  on_line_complete_rate
+            <if test="sendType != 1">
+                ,count(o.log_id) send_number
+                ,sum(if((o.user_id is not null or o.user_id>0) and o.log_type=3,1,0)) is_user_wait_number
+                ,sum(if((o.user_id is null or o.user_id=0) and o.log_type=3,1,0)) no_user_wait_number
+                ,(SELECT SUM(amount) FROM fs_course_red_packet_log
+                WHERE user_id = o.user_id AND video_id = o.video_id) as red_amount
+            </if>
+            FROM fs_course_watch_log o
+            <if test="sendType != 1">
+                LEFT JOIN qw_user qu on qu.id=o.qw_user_id
+            </if>
+            LEFT JOIN fs_user_course_video v on v.video_id=o.video_id
+            LEFT JOIN fs_user_course uc on uc.course_id=v.course_id
+            <if test="sendType == 1">
+                LEFT JOIN company_user cu on cu.user_id=o.company_user_id
+            </if>
+            where o.company_id=#{companyId}
+            <if test="sendType != null">
+                and send_type= #{sendType}
+            </if>
+            <if test="sTime != null">
+                and DATE(o.create_time) &gt;= DATE(#{sTime})
+            </if>
+            <if test="eTime != null">
+                and DATE(o.create_time) &lt;= DATE(#{eTime})
+            </if>
+            <if test="sendType != 1 and nickName != null and nickName != ''">
+                and qu.qw_user_name like concat(#{nickName}, '%')
+            </if>
+            <if test="sendType == 1 and nickName != null and nickName != ''">
+                and cu.nick_name like concat(#{nickName}, '%')
+            </if>
+            <if test="courseId != null">
+                and o.course_id = #{courseId}
+            </if>
+            <if test="videoId != null">
+                and o.video_id = #{videoId}
+            </if>
+            GROUP BY o.video_id,
+            <if test="sendType != 1">
+                o.qw_user_id,
+            </if>
+            <if test="sendType == 1">
+                o.company_user_id,
+            </if>
+            DATE(o.create_time)
+            ORDER BY o.video_id ,DATE(o.create_time)
+            ) t
+    </select>
+    <select id="getUserBlackCountByCampId" resultType="java.lang.Integer">
+        SELECT COUNT(id) FROM fs_user_company_user WHERE `status`=2
+                                                     and company_id=#{companyId}
+        <if test="trainingCampId != null and trainingCampId !=''">
+            AND user_id IN(select distinct cwl.user_id
+            from fs_user_course_period ucp
+            inner join fs_course_watch_log cwl on ucp.period_id = cwl.period_id
+            where ucp.training_camp_id = #{trainingCampId})
+        </if>
+
+    </select>
 
 </mapper>

+ 3 - 0
fs-service/src/main/resources/mapper/course/FsUserCourseTrainingCampMapper.xml

@@ -31,6 +31,9 @@
             <if test="params.userId != null and params.userId != ''">
                 and cu.user_id = #{params.userId}
             </if>
+            <if test="params.periodStatus != null and params.periodStatus != ''">
+                and ctp.period_status = #{params.periodStatus}
+            </if>
         </where>
         group by ctc.training_camp_id, ctc.training_camp_name, ctc.order_number
         order by

+ 10 - 0
fs-service/src/main/resources/mapper/sop/SopUserLogsInfoMapper.xml

@@ -348,5 +348,15 @@
     <select id="selectSopUserLogsInfoListByUserLogsId"  resultMap="SopUserLogsInfoResult">
         select * from sop_user_logs_info where user_logs_id=#{id}
     </select>
+    <select id="selectByUserLogIds" resultType="com.fs.sop.domain.SopUserLogsInfo">
+        SELECT * FROM sop_user_logs_info
+        <if test="userLogsIds != null and userLogsIds.size() > 0">
+            where user_logs_id in
+            <foreach collection="userLogsIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+
+    </select>
 
 </mapper>