Kaynağa Gözat

进线客户统计

xdd 3 hafta önce
ebeveyn
işleme
2784aa4deb
20 değiştirilmiş dosya ile 358 ekleme ve 79 silme
  1. 4 0
      fs-admin/pom.xml
  2. 8 0
      fs-admin/src/main/java/com/fs/task/StoreTask.java
  3. 20 0
      fs-admin/src/test/java/com/fs/task/StoreTaskTest.java
  4. 1 1
      fs-company/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java
  5. 1 1
      fs-service-system/src/main/java/com/fs/company/cache/impl/CompanyUserCacheServiceImpl.java
  6. 7 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  7. 2 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java
  8. 5 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  9. 25 13
      fs-service-system/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  10. 2 0
      fs-service-system/src/main/java/com/fs/course/param/FsCourseOverParam.java
  11. 2 1
      fs-service-system/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java
  12. 114 52
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  13. 6 4
      fs-service-system/src/main/java/com/fs/course/vo/FsCourseOverVO.java
  14. 3 0
      fs-service-system/src/main/java/com/fs/qw/domain/QwWatchLog.java
  15. 14 0
      fs-service-system/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java
  16. 1 0
      fs-service-system/src/main/java/com/fs/qw/service/IQwWatchLogService.java
  17. 19 7
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  18. 1 0
      fs-service-system/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java
  19. 114 0
      fs-service-system/src/main/resources/mapper/qw/QwWatchLogMapper.xml
  20. 9 0
      fs-service-system/src/test/java/com/fs/course/service/impl/FsCourseWatchLogServiceImplTest.java

+ 4 - 0
fs-admin/pom.xml

@@ -139,6 +139,10 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
 
 
     </dependencies>

+ 8 - 0
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -8,6 +8,8 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyService;
 import com.fs.core.security.SecurityUtils;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.service.impl.FsCourseWatchLogServiceImpl;
 import com.fs.crm.mapper.CrmCustomerMapper;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpGoods;
@@ -92,6 +94,8 @@ public class StoreTask
 
     @Autowired
     private CrmCustomerMapper crmCustomerMapper;
+    @Autowired
+    private IFsCourseWatchLogService fsCourseWatchLogService;
 
     //每5分钟执行一次
     public void deliveryOp()
@@ -368,6 +372,10 @@ public class StoreTask
 
     }
 
+    public void addQwWatchLog() throws Exception
+    {
+        fsCourseWatchLogService.addCourseWatchLogDay();
+    }
 
 
 }

+ 20 - 0
fs-admin/src/test/java/com/fs/task/StoreTaskTest.java

@@ -0,0 +1,20 @@
+package com.fs.task;
+
+
+import com.fs.FSAdminApplication;
+import com.fs.course.service.IFsCourseWatchLogService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@RunWith(value = org.springframework.test.context.junit4.SpringRunner.class)
+@SpringBootTest(classes = FSAdminApplication.class)
+public class StoreTaskTest {
+    @Autowired
+    private IFsCourseWatchLogService fsCourseWatchLogService;
+    @Test
+    public void addQwWatchLog() {
+        fsCourseWatchLogService.addCourseWatchLogDayNew();
+    }
+}

+ 1 - 1
fs-company/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java

@@ -88,7 +88,7 @@ public class FsCourseWatchLogController extends BaseController
         if (param.getSTime()==null||param.getETime()==null){
             return getDataTable(new ArrayList<>());
         }
-        List<QwWatchLogStatisticsListVO> list = qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
+        List<QwWatchLogStatisticsListVO> list = qwWatchLogService.selectQwWatchLogStatisticsListVONew(param);
         return getDataTable(list);
     }
     @GetMapping("/myQwWatchLogStatisticsList")

+ 1 - 1
fs-service-system/src/main/java/com/fs/company/cache/impl/CompanyUserCacheServiceImpl.java

@@ -27,6 +27,6 @@ public class CompanyUserCacheServiceImpl implements ICompanyUserCacheService {
             .build();
     @Override
     public CompanyUser selectCompanyUserById(Long userId) {
-        return USER_CACHE.get(userId,e-> companyUserService.selectCompanyUserById(userId));
+        return USER_CACHE.get(userId,e-> companyUserService.selectCompanyUserByUserId(userId));
     }
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -240,4 +240,11 @@ public interface CompanyUserMapper
     String selectQwUserIdsByCompany(Long companyUserId);
 
     List<String> selectCompanyUserNameByIds(@Param("companyUserIds")String companyUserIds);
+
+    @Select("select * from company_user where user_id=#{userId}")
+    CompanyUser selectCompanyUserByUserId(Long userId);
+
+
+    @Select("select * from company_user where company_id=#{companyId} and del_flag=0")
+    List<CompanyUser> selectCompanyUserByCompanyId(Long companyId);
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -124,4 +124,6 @@ public interface ICompanyUserService {
     List<OptionsVO> selectCompanyUserBySalesman();
 
     List<CompanyQwUserByIdsVo> selectCompanyQwUserByIds(List<Long> qwUserIdList);
+
+    CompanyUser selectCompanyUserByUserId(Long userId);
 }

+ 5 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -381,4 +381,9 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return companyUserMapper.selectCompanyQwUserByIds(ids);
     }
 
+    @Override
+    public CompanyUser selectCompanyUserByUserId(Long userId) {
+        return companyUserMapper.selectCompanyUserByUserId(userId);
+    }
+
 }

+ 25 - 13
fs-service-system/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -10,7 +10,9 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -227,31 +229,38 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     List<FsCourseUserStatisticsListVO> selectFsCourseUserStatisticsListVO(FsCourseUserStatisticsListParam param);
 
     @Select({"<script> " +
-            "select MIN(o.create_time) createTime,ANY_VALUE(qu.qw_user_name) qwUserName ,ext.name externalUserName,ext.create_time userCreateTime from fs_course_watch_log o LEFT JOIN qw_user qu on qu.id=o.qw_user_id LEFT JOIN qw_external_contact ext ON ext.id =  o.qw_external_contact_id where log_type=2 and o.company_id=#{companyId} " +
-            "<if test= 'sTime != null '> " +
-            "       and DATE(o.create_time) &gt;= DATE(#{sTime})\n" +
-            "</if>\n" +
-            "<if test='eTime != null '> " +
-            "      and DATE(o.create_time) &lt;= DATE(#{eTime})\n" +
-            "</if>" +
-            "<if test ='nickName !=null and nickName!=\"\"'>\n" +
-            "   and qu.qw_user_name like concat( #{nickName}, '%')\n" +
-            "</if>"+
-            " GROUP BY o.qw_external_contact_id"+
+            "SELECT" +
+            "    MIN(o.create_time) AS createTime," +
+            "    user.user_name as user_name," +
+            "    `user`.create_time AS userCreateTime" +
+            "FROM" +
+            "    fs_course_watch_log o" +
+            "LEFT JOIN" +
+            "\tcompany_user `user`" +
+            "ON o.company_user_id=`user`.user_id" +
+            "GROUP BY `user`.user_id"+
             "</script>"})
-    List<FsCourseOverVO> selectFsCourseWatchLogOverStatisticsListVO(FsCourseOverParam param);
+    List<FsCourseOverVO>    selectFsCourseWatchLogOverStatisticsListVO(FsCourseOverParam param);
 
 
     void batchUpdateWatchLogSendMsg(@Param("list") List<FsCourseWatchLog> logs);
 
-    @Select("SELECT l.qw_external_contact_id,l.log_type,l.qw_user_id,l.create_time ,u.first_time,u.create_time lineTime FROM fs_course_watch_log  l " +
+    @Select("SELECT l.qw_external_contact_id,l.log_type,l.qw_user_id,l.create_time,l.company_user_id as company_user_id,l.user_id as user_id,l.company_id as company_id,u.first_time,u.create_time lineTime FROM fs_course_watch_log  l " +
             "LEFT JOIN qw_external_contact u ON u.id=l.qw_external_contact_id  " +
             " WHERE  DATE(l.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) and l.video_id =#{videoId}")
     List<FsQwCourseWatchLogVO> selectFsCourseWatchLogByNoDayAndVoidId(Long videoId);
+
+    @Select("SELECT l.qw_external_contact_id,l.log_type,l.qw_user_id,l.create_time lineTime,l.company_user_id as company_user_id,l.user_id as user_id,l.company_id as company_id FROM fs_course_watch_log l" +
+            " WHERE DATE(l.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) and l.video_id =#{videoId}")
+    List<FsQwCourseWatchLogVO> selectFsCourseBeforeMonthWatchLogByVideoId(Long videoId);
+
+
+
     @Select("SELECT l.qw_external_contact_id,l.log_type,l.qw_user_id,l.create_time ,u.first_time,u.create_time lineTime FROM fs_course_watch_log  l " +
             "LEFT JOIN qw_external_contact u ON u.id=l.qw_external_contact_id  " +
             " WHERE  DATE(l.create_time) = DATE_SUB(CURDATE(), INTERVAL 2 DAY) and l.video_id =#{videoId}")
     List<FsQwCourseWatchLogVO> selectFsCourseWatchLogByNoDayAndVoidId2(Long videoId);
+
     @Select("SELECT l.qw_external_contact_id,l.log_type,l.qw_user_id,l.create_time ,u.first_time,u.create_time lineTime FROM fs_course_watch_log  l " +
             "LEFT JOIN qw_external_contact u ON u.id=l.qw_external_contact_id  " +
             " WHERE  DATE(l.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) and l.sop_id =#{videoId}")
@@ -261,4 +270,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     @Select("SELECT qw_external_contact_id FROM fs_course_watch_log  WHERE log_type=2 and DATE(create_time) = CURDATE() ")
     List<Long> selectFsCourseWatchLogByFinish();
 
+    @Select("SELECT min(create_time) FROM fs_course_watch_log WHERE user_id=#{userId} limit 1")
+    Date queryFirstWatchDateLogByVideoId(@Param("userId") Long userId);
+
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/course/param/FsCourseOverParam.java

@@ -14,4 +14,6 @@ public class FsCourseOverParam {
     private Date eTime;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date sTime;
+
+    private Long companyUserId;
 }

+ 2 - 1
fs-service-system/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java

@@ -96,9 +96,10 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
 
     List<FsCourseOverVO> selectFsCourseWatchLogOverStatisticsListVO(FsCourseOverParam param);
 
+    void addCourseWatchLogDayNew();
+
     void addCourseWatchLogDay();
 
-    void addCourseWatchLogDay2();
 
     FsCourseWatchLog getWatchCourseVideoH5(Long videoId,String qwUserId,Long externalId);
 }

+ 114 - 52
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -5,9 +5,12 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
+import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.company.domain.CompanyUser;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseFinishTemp;
 import com.fs.course.domain.FsCourseWatchLog;
@@ -34,11 +37,15 @@ import com.fs.qw.vo.QwSopCourseFinishTempSetting;
 import com.fs.qw.vo.QwSopTempSetting;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.mapper.SopUserLogsMapper;
+import com.fs.store.domain.FsUser;
+import com.fs.store.service.IFsUserService;
 import com.fs.system.service.ISysConfigService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.Duration;
 import java.time.LocalDate;
@@ -83,6 +90,13 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
     @Autowired
     private ConfigUtil configUtil;
 
+    @Autowired
+    private ICompanyUserCacheService companyUserCacheService;
+
+    @Autowired
+    private IFsUserService fsUserService;
+
+
     /**
      * 查询短链课程看课记录
      *
@@ -382,11 +396,39 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
 
     @Override
     public List<FsCourseOverVO> selectFsCourseWatchLogOverStatisticsListVO(FsCourseOverParam param) {
-        return fsCourseWatchLogMapper.selectFsCourseWatchLogOverStatisticsListVO(param);
+        QueryWrapper<FsCourseWatchLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("MIN(create_time) as createTime","company_user_id as companyUserId");
+        if(param.getCompanyId() != null) {
+            queryWrapper.eq("company_id", param.getCompanyId());
+        }
+        if(param.getSTime() != null) {
+            queryWrapper.apply("DATE(create_time) >= DATE({0})", param.getSTime());
+        }
+        if (param.getETime() != null) {
+            queryWrapper.apply("DATE(create_time) <= DATE({0})", param.getETime());
+        }
+        queryWrapper.groupBy("company_user_id");
+        List<FsCourseWatchLog> fsCourseWatchLogs = fsCourseWatchLogMapper.selectList(queryWrapper);
+        List<FsCourseOverVO> fsCourseOverVOS = new ArrayList<>();
+        for (FsCourseWatchLog fsCourseWatchLog : fsCourseWatchLogs) {
+            FsCourseOverVO overVO = new FsCourseOverVO();
+            overVO.setCreateTime(fsCourseWatchLog.getCreateTime());
+            if(fsCourseWatchLog.getCompanyUserId() != null) {
+                CompanyUser companyUser = companyUserCacheService.selectCompanyUserById(fsCourseWatchLog.getCompanyUserId());
+                if (companyUser != null) {
+                    overVO.setUserName(companyUser.getUserName());
+                    overVO.setUserCreateTime(companyUser.getCreateTime());
+                }
+            }
+            fsCourseOverVOS.add(overVO);
+        }
+        return fsCourseOverVOS;
     }
 
+
     @Override
-    public void addCourseWatchLogDay() {
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public void addCourseWatchLogDayNew() {
 
         List<FsUserCourse> courses = fsUserCourseMapper.selectFsUserCourseAllCourse();
         for (FsUserCourse course : courses) {
@@ -395,8 +437,21 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
             for (FsUserCourseVideo fsUserCourseVideo : fsUserCourseVideos) {
                 try {
                     ArrayList<QwWatchLog> QwWatchLogs = new ArrayList<>();
-                    List<FsQwCourseWatchLogVO> watchLogs = fsCourseWatchLogMapper.selectFsCourseWatchLogByNoDayAndVoidId(fsUserCourseVideo.getVideoId());
+                    List<FsQwCourseWatchLogVO> watchLogs = fsCourseWatchLogMapper.selectFsCourseBeforeMonthWatchLogByVideoId(fsUserCourseVideo.getVideoId());
+
                     for (FsQwCourseWatchLogVO fsCourseWatchLog : watchLogs) {
+
+                        // 获取进线时间
+                        FsUser fsUser = fsUserService.selectFsUserById(fsCourseWatchLog.getUserId());
+                        if (fsUser!=null){
+                            fsCourseWatchLog.setFirstTime(fsUser.getCreateTime());
+                        }
+                        // 查询首次观看时间
+                        Date date = fsCourseWatchLogMapper.queryFirstWatchDateLogByVideoId(fsCourseWatchLog.getUserId());
+                        if (date!=null){
+                            fsCourseWatchLog.setFirstTime(date);
+                        }
+
                         Date firstTime = fsCourseWatchLog.getFirstTime();
                         Long day=1L;
                         if (fsCourseWatchLog.getLineTime()==null){
@@ -410,18 +465,13 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                         }else {
                             //是先导课
                             if (fsUserCourseVideo.getIsFirst()!=null&&fsUserCourseVideo.getIsFirst()==1){
-                                int count = qwWatchLogMapper.selectQwWatchLogIsFirst(fsCourseWatchLog.getQwExternalContactId());
+                                // 如果存在第一次记录就跳过
+                                int count = qwWatchLogMapper.selectQwWatchLogIsFirstByUserId(fsCourseWatchLog.getUserId());
                                 if (count>0){
                                     continue;
                                 }
                                 day=0L;
                                 //不是先导课
-                            }else {
-                                day=1L;
-                                QwExternalContact qwExternalContact = new QwExternalContact();
-                                qwExternalContact.setId(fsCourseWatchLog.getQwExternalContactId());
-                                qwExternalContact.setFirstTime(fsCourseWatchLog.getCreateTime());
-                                qwExternalContactMapper.updateQwExternalContact(qwExternalContact);
                             }
                         }
                         QwWatchLog qwWatchLog = new QwWatchLog();
@@ -432,6 +482,10 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                         qwWatchLog.setStatus(fsCourseWatchLog.getLogType()==3?0:fsCourseWatchLog.getLogType()==2?2:1);
                         qwWatchLog.setProject(project);
                         qwWatchLog.setCreateTime(fsCourseWatchLog.getCreateTime());
+                        qwWatchLog.setCompanyId(fsCourseWatchLog.getCompanyId());
+                        qwWatchLog.setCompanyUserId(fsCourseWatchLog.getCompanyUserId());
+                        qwWatchLog.setFsUserId(fsCourseWatchLog.getUserId());
+
                         QwWatchLogs.add(qwWatchLog);
                     }
                     if (!QwWatchLogs.isEmpty()){
@@ -439,6 +493,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                     }
                 }catch (Exception e){
                     log.error("看课记录add异常:{}",course.getCourseId(),e);
+                    throw new RuntimeException(e);
                 }
 
 
@@ -447,66 +502,73 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
 
 
     }
+
     @Override
-    public void addCourseWatchLogDay2() {
+    public void addCourseWatchLogDay() {
 
         List<FsUserCourse> courses = fsUserCourseMapper.selectFsUserCourseAllCourse();
         for (FsUserCourse course : courses) {
             Long project = course.getProject();
             List<FsUserCourseVideo> fsUserCourseVideos = fsUserCourseVideoMapper.selectVideoByCourseId(course.getCourseId());
             for (FsUserCourseVideo fsUserCourseVideo : fsUserCourseVideos) {
-                ArrayList<QwWatchLog> QwWatchLogs = new ArrayList<>();
-                List<FsQwCourseWatchLogVO> watchLogs = fsCourseWatchLogMapper.selectFsCourseWatchLogByNoDayAndVoidId2(fsUserCourseVideo.getVideoId());
-                for (FsQwCourseWatchLogVO fsCourseWatchLog : watchLogs) {
-                    Date firstTime = fsCourseWatchLog.getFirstTime();
-                    Long day=1L;
-                    if (fsCourseWatchLog.getLineTime()==null){
-                        continue;
-                    }
-                    //不是第一次 看课程
-                    if (firstTime!=null){
-                        LocalDate firstLocalDate = firstTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-                        LocalDate currentDate = LocalDate.now();
-                        day = ChronoUnit.DAYS.between(firstLocalDate, currentDate);
-                        day=day-1;
-                    }else {
-                        //是先导课
-                        if (fsUserCourseVideo.getIsFirst()!=null&&fsUserCourseVideo.getIsFirst()==1){
-                            int count = qwWatchLogMapper.selectQwWatchLogIsFirst(fsCourseWatchLog.getQwExternalContactId());
-                            if (count>0){
-                                continue;
-                            }
-                            day=0L;
-                            //不是先导课
+                try {
+                    ArrayList<QwWatchLog> QwWatchLogs = new ArrayList<>();
+                    List<FsQwCourseWatchLogVO> watchLogs = fsCourseWatchLogMapper.selectFsCourseWatchLogByNoDayAndVoidId(fsUserCourseVideo.getVideoId());
+                    for (FsQwCourseWatchLogVO fsCourseWatchLog : watchLogs) {
+                        Date firstTime = fsCourseWatchLog.getFirstTime();
+                        Long day=1L;
+                        if (fsCourseWatchLog.getLineTime()==null){
+                            continue;
+                        }
+                        //不是第一次 看课程
+                        if (firstTime!=null){
+                            LocalDate firstLocalDate = firstTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                            LocalDate currentDate = LocalDate.now();
+                            day = ChronoUnit.DAYS.between(firstLocalDate, currentDate);
                         }else {
-                            day=1L;
-                            QwExternalContact qwExternalContact = new QwExternalContact();
-                            qwExternalContact.setId(fsCourseWatchLog.getQwExternalContactId());
-                            qwExternalContact.setFirstTime(fsCourseWatchLog.getCreateTime());
-                            qwExternalContactMapper.updateQwExternalContact(qwExternalContact);
+                            //是先导课
+                            if (fsUserCourseVideo.getIsFirst()!=null&&fsUserCourseVideo.getIsFirst()==1){
+                                int count = qwWatchLogMapper.selectQwWatchLogIsFirst(fsCourseWatchLog.getQwExternalContactId());
+                                if (count>0){
+                                    continue;
+                                }
+                                day=0L;
+                                //不是先导课
+                            }else {
+                                day=1L;
+                                QwExternalContact qwExternalContact = new QwExternalContact();
+                                qwExternalContact.setId(fsCourseWatchLog.getQwExternalContactId());
+                                qwExternalContact.setFirstTime(fsCourseWatchLog.getCreateTime());
+                                qwExternalContactMapper.updateQwExternalContact(qwExternalContact);
+                            }
                         }
+                        QwWatchLog qwWatchLog = new QwWatchLog();
+                        qwWatchLog.setExtId(fsCourseWatchLog.getQwExternalContactId());
+                        qwWatchLog.setLineTime(fsCourseWatchLog.getLineTime());
+                        qwWatchLog.setQwUserId(Long.parseLong(fsCourseWatchLog.getQwUserId()));
+                        qwWatchLog.setDay(day);
+                        qwWatchLog.setStatus(fsCourseWatchLog.getLogType()==3?0:fsCourseWatchLog.getLogType()==2?2:1);
+                        qwWatchLog.setProject(project);
+                        qwWatchLog.setCreateTime(fsCourseWatchLog.getCreateTime());
+                        qwWatchLog.setCompanyId(fsCourseWatchLog.getCompanyId());
+                        qwWatchLog.setCompanyUserId(fsCourseWatchLog.getCompanyUserId());
+                        qwWatchLog.setFsUserId(fsCourseWatchLog.getUserId());
+                        QwWatchLogs.add(qwWatchLog);
                     }
-                    QwWatchLog qwWatchLog = new QwWatchLog();
-                    qwWatchLog.setExtId(fsCourseWatchLog.getQwExternalContactId());
-                    qwWatchLog.setLineTime(fsCourseWatchLog.getLineTime());
-                    qwWatchLog.setQwUserId(Long.parseLong(fsCourseWatchLog.getQwUserId()));
-                    qwWatchLog.setDay(day);
-                    qwWatchLog.setStatus(fsCourseWatchLog.getLogType()==3?0:fsCourseWatchLog.getLogType()==2?2:1);
-                    qwWatchLog.setProject(project);
-                    qwWatchLog.setCreateTime(fsCourseWatchLog.getCreateTime());
-                    QwWatchLogs.add(qwWatchLog);
-                }
-                if (!QwWatchLogs.isEmpty()){
-                    qwWatchLogMapper.insertQwWatchLogBatch(QwWatchLogs);
+                    if (!QwWatchLogs.isEmpty()){
+                        qwWatchLogMapper.insertQwWatchLogBatch(QwWatchLogs);
+                    }
+                }catch (Exception e){
+                    log.error("看课记录add异常:{}",course.getCourseId(),e);
                 }
 
+
             }
         }
 
 
     }
 
-
     public Long getVideoDuration(Long videoId){
         //将视频时长也存到redis
         String videoRedisKey = "h5user:video:duration:" + videoId;

+ 6 - 4
fs-service-system/src/main/java/com/fs/course/vo/FsCourseOverVO.java

@@ -10,10 +10,12 @@ import java.util.Date;
 public class FsCourseOverVO {
 
 
-    @Excel(name = "企微客户")
-    private String qwUserName;
-    @Excel(name = "企业微信员工名称")
-    private String externalUserName;
+//    @Excel(name = "企微客户")
+//    private String qwUserName;
+//    @Excel(name = "企业微信员工名称")
+//    private String externalUserName;
+    @Excel(name = "用户名")
+    private String userName;
 
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd")

+ 3 - 0
fs-service-system/src/main/java/com/fs/qw/domain/QwWatchLog.java

@@ -44,4 +44,7 @@ public class QwWatchLog extends BaseEntity{
     private Date createTime;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date lineTime;
+    private Long fsUserId;
+    private Long companyId;
+    private Long companyUserId;
 }

+ 14 - 0
fs-service-system/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java

@@ -104,8 +104,22 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
             "COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over\n" +
             " from qw_watch_log where qw_user_id=#{id} and DATE(line_time) = DATE(#{createTime})")
     QwWatchLogStatisticsListVO selectQwWatchLogByQwUserId(@Param("id")Long id,@Param("createTime") Date createTime);
+    @Select("select \n" +
+            "COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline," +
+            "COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver," +
+            "COUNT(CASE WHEN day = 1 and status in (1,2) THEN 1 END) AS d1Online," +
+            "COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over," +
+            "COUNT(1) AS line" +
+            " from qw_watch_log where company_user_id=#{companyUserId} and DATE(line_time) between #{sTime} and #{dTime}")
+    QwWatchLogStatisticsListVO selectQwWatchLogByCompanyUserId(@Param("companyUserId") Long companyUserId,@Param("sTime") Date sTime,@Param("dTime") Date dTime);
+
+
     @Select("SELECT count(1) from qw_watch_log where ext_id=#{id} and `day`=0 ")
     int selectQwWatchLogIsFirst(Long id);
+
+    @Select("SELECT count(1) from qw_watch_log where fs_user_id=#{userId} and `day`=0")
+    int selectQwWatchLogIsFirstByUserId(Long userId);
+
     @Select("select \n" +
             "COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline,\n" +
             "COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver,\n" +

+ 1 - 0
fs-service-system/src/main/java/com/fs/qw/service/IQwWatchLogService.java

@@ -64,6 +64,7 @@ public interface IQwWatchLogService extends IService<QwWatchLog>{
     int deleteQwWatchLogById(Long id);
 
     List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVO(QwWatchLogStatisticsListParam param);
+    List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVONew(QwWatchLogStatisticsListParam param);
 
     List<QwWatchLogAllStatisticsListVO> selectQwWatchLogAllStatisticsListVO(QwWatchLogStatisticsListParam param);
 }

+ 19 - 7
fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.qw.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.utils.DateUtils;
+import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.qw.domain.QwWatchLog;
 import com.fs.qw.mapper.QwExternalContactMapper;
@@ -14,10 +15,7 @@ import com.fs.qw.vo.QwWatchLogStatisticsListVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * 企微看课Service业务层处理
@@ -131,11 +129,25 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
             vo.setFirstOver(stat.getFirstOver());
         }
 
+        return vos;
+    }
 
+    @Override
+    public List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVONew(QwWatchLogStatisticsListParam param) {
+        // 获取当前公司下的所有销售
+        List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
+
+        List<QwWatchLogStatisticsListVO> list = new ArrayList<>();
+        for (CompanyUser companyUser : companyUsers) {
+            // 统计销售下面的所有记录
+            QwWatchLogStatisticsListVO vo = qwWatchLogMapper.selectQwWatchLogByCompanyUserId(companyUser.getCompanyId(),
+                    param.getSTime(),param.getETime());
+            vo.setQwUserName(companyUser.getUserName());
+            vo.setCreateTime(companyUser.getCreateTime());
+            list.add(vo);
+        }
 
-
-
-        return vos;
+        return list;
     }
 
     @Override

+ 1 - 0
fs-service-system/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java

@@ -9,6 +9,7 @@ import java.util.Date;
 public class QwWatchLogStatisticsListVO {
     Long id;
     String qwUserName;
+
     @JsonFormat(pattern = "yyyy-MM-dd")
     Date createTime;
 

+ 114 - 0
fs-service-system/src/main/resources/mapper/qw/QwWatchLogMapper.xml

@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.qw.mapper.QwWatchLogMapper">
+
+    <resultMap type="QwWatchLog" id="QwWatchLogResult">
+        <result property="id"    column="id"    />
+        <result property="extId"    column="ext_id"    />
+        <result property="qwUserId"    column="qw_user_id"    />
+        <result property="status"    column="status"    />
+        <result property="day"    column="day"    />
+        <result property="project"    column="project"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="lineTime"    column="line_time"    />
+    </resultMap>
+
+    <sql id="selectQwWatchLogVo">
+        select id, ext_id, qw_user_id,line_time, status, day, project, create_time from qw_watch_log
+    </sql>
+
+    <select id="selectQwWatchLogList" parameterType="QwWatchLog" resultMap="QwWatchLogResult">
+        <include refid="selectQwWatchLogVo"/>
+        <where>
+            <if test="extId != null "> and ext_id = #{extId}</if>
+            <if test="qwUserId != null "> and qw_user_id = #{qwUserId}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="day != null "> and day = #{day}</if>
+            <if test="project != null "> and project = #{project}</if>
+        </where>
+    </select>
+
+    <select id="selectQwWatchLogById" parameterType="Long" resultMap="QwWatchLogResult">
+        <include refid="selectQwWatchLogVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertQwWatchLog" parameterType="QwWatchLog" useGeneratedKeys="true" keyProperty="id">
+        insert into qw_watch_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="extId != null">ext_id,</if>
+            <if test="qwUserId != null">qw_user_id,</if>
+            <if test="status != null">status,</if>
+            <if test="day != null">day,</if>
+            <if test="project != null">project,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="lineTime != null">line_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="extId != null">#{extId},</if>
+            <if test="qwUserId != null">#{qwUserId},</if>
+            <if test="status != null">#{status},</if>
+            <if test="day != null">#{day},</if>
+            <if test="project != null">#{project},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="lineTime != null">#{lineTime},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertQwWatchLogBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO qw_watch_log (
+        ext_id,
+        qw_user_id,
+        status,
+        day,
+        project,
+        create_time,
+        line_time,
+        fs_user_id,
+        company_id,
+        company_user_id
+        )
+        VALUES
+    <foreach collection="watchLogs" item="log" separator=",">
+            (
+            #{log.extId},
+            #{log.qwUserId},
+            #{log.status},
+            #{log.day},
+            #{log.project},
+            #{log.createTime},
+            #{log.lineTime},
+             #{log.fsUserId},
+             #{log.companyId},
+             #{log.companyUserId}
+            )
+    </foreach>
+    </insert>
+
+    <update id="updateQwWatchLog" parameterType="QwWatchLog">
+        update qw_watch_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="extId != null">ext_id = #{extId},</if>
+            <if test="qwUserId != null">qw_user_id = #{qwUserId},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="day != null">day = #{day},</if>
+            <if test="project != null">project = #{project},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="lineTime != null">line_time = #{lineTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteQwWatchLogById" parameterType="Long">
+        delete from qw_watch_log where id = #{id}
+    </delete>
+
+    <delete id="deleteQwWatchLogByIds" parameterType="String">
+        delete from qw_watch_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 9 - 0
fs-service-system/src/test/java/com/fs/course/service/impl/FsCourseWatchLogServiceImplTest.java

@@ -0,0 +1,9 @@
+package com.fs.course.service.impl;
+
+
+public class FsCourseWatchLogServiceImplTest {
+
+
+    void addCourseWatchLogDay() {
+    }
+}