瀏覽代碼

会员催课面板

xdd 1 月之前
父節點
當前提交
8a2ccb4da1

+ 9 - 25
fs-admin/src/main/java/com/fs/task/FsCourseTask.java

@@ -27,38 +27,22 @@ public class FsCourseTask {
     }
 
     /**
-     * 会员任务定时更新
-     * @throws Exception
-     */
-    public void hyWorkTask1() throws Exception
-    {
-        hyWorkTaskService.addHyWorkByCourse4();
-        hyWorkTaskService.addHyWorkByCourseLastTime();
-    }
-    /**
-     * 会员待看课和先导课
-     * @throws Exception
-     */
-    public void hyWorkTask2() throws Exception
-    {
-        hyWorkTaskService.addHyWorkByCourse();
-        hyWorkTaskService.addHyWorkByFirstCourse();
-    }
-    /**
-     * 用户大小转
+     * 删除过期数据
      * @throws Exception
      */
-    public void hyWorkTask3() throws Exception
+    public void hyWorkTask4() throws Exception
     {
-        hyWorkTaskService.addHyWorkByConversionDay();
+        // 更新已完课的催课看板
+        hyWorkTaskService.delHyWorkTaskByOver();
     }
+
     /**
-     * 删除过期数据
+     * 会员查看催课面板 获取看课中断和待看的先导课
      * @throws Exception
      */
-    public void hyWorkTask4() throws Exception
-    {
-        hyWorkTaskService.delHyWorkTaskByOver();
+    public void hyWorkTask(){
+
+        hyWorkTaskService.hyWorkTask();
     }
 
 }

+ 37 - 6
fs-common/src/main/java/com/fs/common/utils/DateUtils.java

@@ -3,13 +3,17 @@ package com.fs.common.utils;
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.Calendar;
 import java.util.Date;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
  * 时间工具类
- * 
+ *
 
  */
 public class DateUtils extends org.apache.commons.lang3.time.DateUtils
@@ -23,15 +27,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
-    
+
     private static String[] parsePatterns = {
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
     /**
      * 获取当前Date型日期
-     * 
+     *
      * @return Date() 当前日期
      */
     public static Date getNowDate()
@@ -41,7 +45,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     /**
      * 获取当前日期, 默认格式为yyyy-MM-dd
-     * 
+     *
      * @return String
      */
     public static String getDate()
@@ -122,7 +126,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             return null;
         }
     }
-    
+
     /**
      * 获取服务器启动时间
      */
@@ -186,4 +190,31 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         }
         return age;
     }
+    /**
+     * 计算给定日期与当前日期相差的天数 (基于日历日期)。
+     * 例如:昨天 23:59 和 今天 00:01 相差 1 天。
+     *
+     * @param createTime 起始时间 (java.util.Date)
+     * @return 相差的天数 (long)。如果 createTime 为 null,返回 0。
+     *         如果 createTime 在当前时间之后,结果为负数。
+     */
+    public static long getDaysDifferenceFromNow(Date createTime) {
+        if (createTime == null) {
+            return 0; // 或者根据业务抛出异常或返回特定值
+        }
+        // 1. 将 java.util.Date 转换为 Instant (时间线上的一个点)
+        Instant createInstant = createTime.toInstant();
+        // 2. 获取当前时间的 Instant
+        Instant nowInstant = Instant.now();
+        // 3. 指定时区 (非常重要!否则会使用系统默认时区,可能导致不一致)
+        //    建议使用一个明确的时区,例如服务器所在时区或业务标准时区
+        ZoneId zoneId = ZoneId.systemDefault(); // 或者 ZoneId.of("Asia/Shanghai");
+        // 4. 将 Instant 转换为 LocalDate (只包含年月日,忽略时分秒)
+        LocalDate createDate = createInstant.atZone(zoneId).toLocalDate();
+        LocalDate nowDate = nowInstant.atZone(zoneId).toLocalDate(); // 使用相同的时区
+        // 5. 使用 ChronoUnit.DAYS.between 计算两个 LocalDate 之间的天数差
+        long daysBetween = ChronoUnit.DAYS.between(createDate, nowDate);
+        return daysBetween;
+    }
+
 }

+ 7 - 6
fs-company/src/main/java/com/fs/qw/QwQwWorkTaskController.java

@@ -12,6 +12,7 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.qw.domain.HyWorkTask;
 import com.fs.qw.domain.QwWorkTask;
 import com.fs.qw.param.QwWorkTaskListParam;
 import com.fs.qw.service.IHyWorkTaskService;
@@ -71,10 +72,10 @@ public class QwQwWorkTaskController extends BaseController
     @PreAuthorize("@ss.hasPermi('qw:QwWorkTask:export')")
     @Log(title = "企微任务看板", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(QwWorkTask qwWorkTask)
+    public AjaxResult export(HyWorkTask qwWorkTask)
     {
-        List<QwWorkTask> list = hyWorkTaskService.selectHyWorkTaskList(qwWorkTask);
-        ExcelUtil<QwWorkTask> util = new ExcelUtil<QwWorkTask>(QwWorkTask.class);
+        List<HyWorkTask> list = hyWorkTaskService.selectHyWorkTaskList(qwWorkTask);
+        ExcelUtil<HyWorkTask> util = new ExcelUtil<HyWorkTask>(HyWorkTask.class);
         return util.exportExcel(list, "企微任务看板数据");
     }
 
@@ -94,7 +95,7 @@ public class QwQwWorkTaskController extends BaseController
     @PreAuthorize("@ss.hasPermi('qw:QwWorkTask:add')")
     @Log(title = "企微任务看板", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody QwWorkTask qwWorkTask)
+    public AjaxResult add(@RequestBody HyWorkTask qwWorkTask)
     {
         return toAjax(hyWorkTaskService.insertHyWorkTask(qwWorkTask));
     }
@@ -105,9 +106,9 @@ public class QwQwWorkTaskController extends BaseController
     @PreAuthorize("@ss.hasPermi('qw:QwWorkTask:edit')")
     @Log(title = "企微任务看板处理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody QwWorkTask qwWorkTask)
+    public AjaxResult edit(@RequestBody HyWorkTask qwWorkTask)
     {
-        QwWorkTask task = new QwWorkTask();
+        HyWorkTask task = new HyWorkTask();
         task.setId(qwWorkTask.getId());
         task.setRemark(qwWorkTask.getRemark());
         task.setStatus(1);

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -139,6 +139,9 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
 
     @Select("select l.qw_external_contact_id,l.company_id,l.company_user_id,l.log_type,ext.`level`,l.qw_user_id FROM fs_course_watch_log l LEFT JOIN qw_external_contact ext ON ext.id =l.qw_external_contact_id  where l.sop_id=#{SopId} and  date(l.create_time)= CURDATE() and l.log_type =4 and l.video_id not in (select video_id from fs_user_course_video WHERE is_first=1 ) ")
     List<FsCourseWatchLogTaskVO> selectFsCourseWatchLogByDaySopId4(@Param("SopId")String SopId);
+
+    @Select("select l.user_id,l.company_id,l.company_user_id,l.log_type,ext.`level`,l.qw_user_id FROM fs_course_watch_log l LEFT JOIN fs_user ext ON ext.user_id =l.user_id  where l.sop_id=#{SopId} and  date(l.create_time)= CURDATE() and l.log_type =4 and l.video_id not in (select video_id from fs_user_course_video WHERE is_first=1 )")
+    List<FsCourseWatchLogTaskVO> selectFsCourseWatchLogByDaySopIdFsUser4(@Param("SopId")String SopId);
 //    @Select("   SELECT\n" +
 //            "            wl.log_type,\n" +
 //            "            ec.level\n" +

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

@@ -17,4 +17,6 @@ public class FsCourseWatchLogTaskVO {
     private Integer level;
 
     private Long qwUserId;
+
+    private Long userId;
 }

+ 56 - 0
fs-service-system/src/main/java/com/fs/qw/domain/HyWorkTask.java

@@ -0,0 +1,56 @@
+package com.fs.qw.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 个微任务看板对象 hy_work_task
+ *
+ * @author fs
+ * @date 2025-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class HyWorkTask extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 外部联系人id */
+    @Excel(name = "外部联系人id")
+    private Long extId;
+
+    /** 企微用户id */
+    @Excel(name = "企微用户id")
+    private Long qwUserId;
+
+    private Long userId;
+
+    /** 类别 1先导 2 课程 3 大小转 4 转人工 */
+    @Excel(name = "类别 1先导 2 课程 3 大小转 4 转人工")
+    private Integer type;
+
+    /** 状态 0 待处理 1 已处理 3 过期 */
+    @Excel(name = "状态 0 待处理 1 已处理 3 过期")
+    private Integer status;
+
+    /** 分值 */
+    @Excel(name = "分值")
+    private Integer score;
+
+    /** sopid */
+    @Excel(name = "sopid")
+    private String sopId;
+
+    /** 公司id */
+    @Excel(name = "公司id")
+    private Long companyId;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long companyUserId;
+
+    private String title;
+}

+ 14 - 7
fs-service-system/src/main/java/com/fs/qw/mapper/HyWorkTaskMapper.java

@@ -1,6 +1,8 @@
 package com.fs.qw.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.qw.domain.HyWorkTask;
 import com.fs.qw.domain.QwWorkTask;
 import com.fs.qw.param.QwWorkTaskListParam;
 import com.fs.qw.vo.QwWorkTaskListVO;
@@ -17,14 +19,14 @@ import java.util.Map;
  * @author fs
  * @date 2025-03-18
  */
-public interface HyWorkTaskMapper extends BaseMapper<QwWorkTask>{
+public interface HyWorkTaskMapper extends BaseMapper<HyWorkTask>{
     /**
      * 查询企微任务看板
      *
      * @param id 企微任务看板主键
      * @return 企微任务看板
      */
-    QwWorkTask selectHyWorkTaskById(Long id);
+    HyWorkTask selectHyWorkTaskById(Long id);
 
     /**
      * 查询企微任务看板列表
@@ -32,7 +34,7 @@ public interface HyWorkTaskMapper extends BaseMapper<QwWorkTask>{
      * @param qwWorkTask 企微任务看板
      * @return 企微任务看板集合
      */
-    List<QwWorkTask> selectHyWorkTaskList(QwWorkTask qwWorkTask);
+    List<HyWorkTask> selectHyWorkTaskList(HyWorkTask qwWorkTask);
 
     /**
      * 新增企微任务看板
@@ -40,7 +42,7 @@ public interface HyWorkTaskMapper extends BaseMapper<QwWorkTask>{
      * @param qwWorkTask 企微任务看板
      * @return 结果
      */
-    int insertHyWorkTask(QwWorkTask qwWorkTask);
+    int insertHyWorkTask(HyWorkTask qwWorkTask);
 
     /**
      * 修改企微任务看板
@@ -48,7 +50,7 @@ public interface HyWorkTaskMapper extends BaseMapper<QwWorkTask>{
      * @param qwWorkTask 企微任务看板
      * @return 结果
      */
-    int updateHyWorkTask(QwWorkTask qwWorkTask);
+    int updateHyWorkTask(HyWorkTask qwWorkTask);
 
     /**
      * 删除企微任务看板
@@ -66,7 +68,7 @@ public interface HyWorkTaskMapper extends BaseMapper<QwWorkTask>{
      */
     int deleteHyWorkTaskByIds(Long[] ids);
 
-    void insertQwWorkTaskBatch(@Param("qwWorkTasks")List<QwWorkTask> qwWorkTasks);
+    void insertQwWorkTaskBatch(@Param("qwWorkTasks")List<HyWorkTask> qwWorkTasks);
 
     List<QwWorkTaskListVO> selectHyWorkTaskListVONew(QwWorkTaskListParam qwWorkTask);
 
@@ -106,7 +108,12 @@ public interface HyWorkTaskMapper extends BaseMapper<QwWorkTask>{
      * @param params 参数
      * @return list
      */
-    List<QwWorkTask> selectHyWorkTaskListByMap(@Param("params") Map<String, Object> params);
+    List<HyWorkTask> selectHyWorkTaskListByMap(@Param("params") Map<String, Object> params);
 
     Long selectHyWorkTaskListVONewCount(QwWorkTaskListParam qwWorkTask);
+
+    void hyWorkTask();
+
+    List<FsCourseWatchLog> hyWorkTaskGetInterruptedAndFirst();
+
 }

+ 11 - 7
fs-service-system/src/main/java/com/fs/qw/service/IHyWorkTaskService.java

@@ -1,6 +1,7 @@
 package com.fs.qw.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.qw.domain.HyWorkTask;
 import com.fs.qw.domain.QwWorkTask;
 import com.fs.qw.param.QwWorkTaskListParam;
 import com.fs.qw.vo.QwWorkTaskListVO;
@@ -14,14 +15,14 @@ import java.util.Map;
  * @author fs
  * @date 2025-03-18
  */
-public interface IHyWorkTaskService extends IService<QwWorkTask>{
+public interface IHyWorkTaskService extends IService<HyWorkTask>{
     /**
      * 查询企微任务看板
      *
      * @param id 企微任务看板主键
      * @return 企微任务看板
      */
-    QwWorkTask selectHyWorkTaskById(Long id);
+    HyWorkTask selectHyWorkTaskById(Long id);
 
     /**
      * 查询企微任务看板列表
@@ -29,7 +30,7 @@ public interface IHyWorkTaskService extends IService<QwWorkTask>{
      * @param qwWorkTask 企微任务看板
      * @return 企微任务看板集合
      */
-    List<QwWorkTask> selectHyWorkTaskList(QwWorkTask qwWorkTask);
+    List<HyWorkTask> selectHyWorkTaskList(HyWorkTask qwWorkTask);
 
     /**
      * 新增企微任务看板
@@ -37,7 +38,7 @@ public interface IHyWorkTaskService extends IService<QwWorkTask>{
      * @param qwWorkTask 企微任务看板
      * @return 结果
      */
-    int insertHyWorkTask(QwWorkTask qwWorkTask);
+    int insertHyWorkTask(HyWorkTask qwWorkTask);
 
     /**
      * 修改企微任务看板
@@ -45,7 +46,7 @@ public interface IHyWorkTaskService extends IService<QwWorkTask>{
      * @param qwWorkTask 企微任务看板
      * @return 结果
      */
-    int updateHyWorkTask(QwWorkTask qwWorkTask);
+    int updateHyWorkTask(HyWorkTask qwWorkTask);
 
     /**
      * 批量删除企微任务看板
@@ -78,7 +79,7 @@ public interface IHyWorkTaskService extends IService<QwWorkTask>{
      * 根据转化日(或特定业务日期节点)情况,添加相应的企微任务。
      * 用于处理基于特定日期或转化阶段的任务创建逻辑。
      */
-    void addHyWorkByConversionDay();
+    void  addHyWorkByConversionDay();
 
     List<QwWorkTaskListVO> selectHyWorkTaskListVONew(QwWorkTaskListParam qwWorkTask);
     Long selectHyWorkTaskListVONewCount(QwWorkTaskListParam qwWorkTask);
@@ -105,5 +106,8 @@ public interface IHyWorkTaskService extends IService<QwWorkTask>{
      * @param params 参数
      * @return list
      */
-    List<QwWorkTask> selectHyWorkTaskListByMap(Map<String, Object> params);
+    List<HyWorkTask> selectHyWorkTaskListByMap(Map<String, Object> params);
+
+    void hyWorkTask();
+
 }

+ 60 - 20
fs-service-system/src/main/java/com/fs/qw/service/impl/HyWorkTaskServiceImpl.java

@@ -8,9 +8,11 @@ import com.fs.company.cache.ICompanyCacheService;
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
+import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.vo.FsCourseWatchLogTaskVO;
 import com.fs.course.vo.FsQwCourseWatchLogVO;
+import com.fs.qw.domain.HyWorkTask;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwWorkTask;
 import com.fs.qw.mapper.HyWorkTaskMapper;
@@ -42,7 +44,7 @@ import java.util.stream.Collectors;
  * @date 2025-03-18
  */
 @Service
-public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkTask> implements IHyWorkTaskService {
+public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, HyWorkTask> implements IHyWorkTaskService {
     @Autowired
     private FsCourseWatchLogMapper fsCourseWatchLogMapper;
     @Autowired
@@ -65,7 +67,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
      * @return 企微任务看板
      */
     @Override
-    public QwWorkTask selectHyWorkTaskById(Long id)
+    public HyWorkTask selectHyWorkTaskById(Long id)
     {
         return baseMapper.selectHyWorkTaskById(id);
     }
@@ -77,7 +79,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
      * @return 企微任务看板
      */
     @Override
-    public List<QwWorkTask> selectHyWorkTaskList(QwWorkTask qwWorkTask)
+    public List<HyWorkTask> selectHyWorkTaskList(HyWorkTask qwWorkTask)
     {
         return baseMapper.selectHyWorkTaskList(qwWorkTask);
     }
@@ -89,7 +91,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
      * @return 结果
      */
     @Override
-    public int insertHyWorkTask(QwWorkTask qwWorkTask)
+    public int insertHyWorkTask(HyWorkTask qwWorkTask)
     {
         qwWorkTask.setCreateTime(DateUtils.getNowDate());
         return baseMapper.insertHyWorkTask(qwWorkTask);
@@ -102,7 +104,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
      * @return 结果
      */
     @Override
-    public int updateHyWorkTask(QwWorkTask qwWorkTask)
+    public int updateHyWorkTask(HyWorkTask qwWorkTask)
     {
         qwWorkTask.setUpdateTime(DateUtils.getNowDate());
         return baseMapper.updateHyWorkTask(qwWorkTask);
@@ -135,9 +137,9 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
     @Override
     public void addHyWorkByFirstCourse() {
             List<FsQwCourseWatchLogVO> fsQwCourseWatchLogVOS = fsCourseWatchLogMapper.selectFsCourseWatchLogByVideoId();
-        ArrayList<QwWorkTask> qwWorkTasks = new ArrayList<>();
+        ArrayList<HyWorkTask> qwWorkTasks = new ArrayList<>();
         for (FsQwCourseWatchLogVO vo : fsQwCourseWatchLogVOS) {
-                QwWorkTask qwWorkTask = new QwWorkTask();
+                HyWorkTask qwWorkTask = new HyWorkTask();
                 qwWorkTask.setCreateTime(DateUtils.getNowDate());
                 qwWorkTask.setExtId(vo.getQwExternalContactId());
                 qwWorkTask.setCompanyId(vo.getCompanyId());
@@ -181,6 +183,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
         LocalDate today = LocalDate.now();
         List<Long> extIds = hyWorkTaskMapper.selectHyWorkTaskByType();
         Set<Long> extIdSet = new HashSet<>(extIds);
+        // 获取出执行sop的记录数
         for (QwSop qwSop : qwSops) {
             if (qwSop.getCourseDay()==null){
                 continue;
@@ -190,12 +193,12 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
             if (qwSopLogs==null || qwSopLogs.isEmpty()) {
                 continue;
             }
-
+            // 每次sop的观看记录
             List<FsCourseWatchLogTaskVO> fsCourseWatchLogs = fsCourseWatchLogMapper.selectFsCourseWatchLogByDaySopId3(qwSop.getId());
             if (fsCourseWatchLogs==null || fsCourseWatchLogs.isEmpty()) {
                 continue;
             }
-            List<QwWorkTask> qwWorkTasks = new ArrayList<>();
+            List<HyWorkTask> qwWorkTasks = new ArrayList<>();
             for (SopUserLogsInfo qwSopLog : qwSopLogs) {
                 Map<Long, FsCourseWatchLogTaskVO> map = fsCourseWatchLogs.stream()
                         .collect(Collectors.toMap(FsCourseWatchLogTaskVO::getQwExternalContactId, data -> data,(oldValue, newValue) -> newValue ));
@@ -214,7 +217,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
                 if (score==0){
                     continue;
                 }
-                QwWorkTask qwWorkTask = new QwWorkTask();
+                HyWorkTask qwWorkTask = new HyWorkTask();
                 qwWorkTask.setCreateTime(DateUtils.getNowDate());
                 qwWorkTask.setExtId(fsCourseWatchLog.getQwExternalContactId());
                 qwWorkTask.setCompanyId(fsCourseWatchLog.getCompanyId());
@@ -240,10 +243,12 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
     public void addHyWorkByConversionDay() {
         List<QwSop> qwSops = qwSopMapper.selectQwSopByIsRatingNotNull();
         Map<Integer, Integer> minMap = new HashMap<>();
+        // level->分值映射
         minMap.put(1, 10);
         minMap.put(2, 6);
         minMap.put(3, 2);
         Map<Integer, Integer> MaxMap = new HashMap<>();
+        // level->分值映射
         MaxMap.put(1, 25);
         MaxMap.put(2, 15);
         MaxMap.put(3, 5);
@@ -295,7 +300,9 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
 
     @Override
     public void addHyWorkByCourse4() {
+        // 获取sop模板
         List<QwSop> qwSops = qwSopMapper.selectQwSopByIsRating();
+        // 课程
         List<Long> extIds = hyWorkTaskMapper.selectHyWorkTaskByType();
         Set<Long> extIdSet = new HashSet<>(extIds);
         LocalDate today = LocalDate.now();
@@ -304,19 +311,19 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
                 continue;
             }
             Integer courseDay=qwSop.getCourseDay()-1;
-            List<SopUserLogsInfo> qwSopLogs = sopUserLogsInfoMapper.selectSopUserLogsInfoBySopId(qwSop.getId());
+            List<SopUserLogsInfo> qwSopLogs = sopUserLogsInfoMapper.selectFsUserIdSopUserLogsInfoBySopId(qwSop.getId());
             if (qwSopLogs==null || qwSopLogs.isEmpty()) {
                 continue;
             }
-            List<FsCourseWatchLogTaskVO> fsCourseWatchLogs = fsCourseWatchLogMapper.selectFsCourseWatchLogByDaySopId4(qwSop.getId());
+            List<FsCourseWatchLogTaskVO> fsCourseWatchLogs = fsCourseWatchLogMapper.selectFsCourseWatchLogByDaySopIdFsUser4(qwSop.getId());
             if (fsCourseWatchLogs==null || fsCourseWatchLogs.isEmpty()) {
                 continue;
             }
-            List<QwWorkTask> qwWorkTasks = new ArrayList<>();
+            List<HyWorkTask> qwWorkTasks = new ArrayList<>();
             for (SopUserLogsInfo qwSopLog : qwSopLogs) {
                 Map<Long, FsCourseWatchLogTaskVO> map = fsCourseWatchLogs.stream()
-                        .collect(Collectors.toMap(FsCourseWatchLogTaskVO::getQwExternalContactId, data -> data,(oldValue, newValue) -> newValue ));
-                FsCourseWatchLogTaskVO fsCourseWatchLog = map.get(qwSopLog.getExternalId());
+                        .collect(Collectors.toMap(FsCourseWatchLogTaskVO::getUserId, data -> data,(oldValue, newValue) -> newValue ));
+                FsCourseWatchLogTaskVO fsCourseWatchLog = map.get(qwSopLog.getFsUserId());
                 if (fsCourseWatchLog == null) {
                     continue;
                 }
@@ -333,7 +340,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
                 if (score==0){
                     continue;
                 }
-                QwWorkTask qwWorkTask = new QwWorkTask();
+                HyWorkTask qwWorkTask = new HyWorkTask();
                 qwWorkTask.setCreateTime(DateUtils.getNowDate());
                 qwWorkTask.setExtId(fsCourseWatchLog.getQwExternalContactId());
                 qwWorkTask.setCompanyId(fsCourseWatchLog.getCompanyId());
@@ -395,7 +402,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
             if (fsCourseWatchLogs==null || fsCourseWatchLogs.isEmpty()) {
                 continue;
             }
-            List<QwWorkTask> qwWorkTasks = new ArrayList<>();
+            List<HyWorkTask> qwWorkTasks = new ArrayList<>();
             for (SopUserLogsInfo qwSopLog : qwSopLogs) {
                 Map<Long, FsCourseWatchLogTaskVO> map = fsCourseWatchLogs.stream()
                         .collect(Collectors.toMap(FsCourseWatchLogTaskVO::getQwExternalContactId, data -> data,(oldValue, newValue) -> newValue ));
@@ -418,7 +425,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
                 if (score==0){
                     continue;
                 }
-                QwWorkTask qwWorkTask = new QwWorkTask();
+                HyWorkTask qwWorkTask = new HyWorkTask();
                 qwWorkTask.setCreateTime(DateUtils.getNowDate());
                 qwWorkTask.setExtId(fsCourseWatchLog.getQwExternalContactId());
                 qwWorkTask.setCompanyId(fsCourseWatchLog.getCompanyId());
@@ -446,10 +453,43 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
      * @return list
      */
     @Override
-    public List<QwWorkTask> selectHyWorkTaskListByMap(Map<String, Object> params) {
+    public List<HyWorkTask> selectHyWorkTaskListByMap(Map<String, Object> params) {
         return hyWorkTaskMapper.selectHyWorkTaskListByMap(params);
     }
 
+    @Override
+    public void hyWorkTask() {
+        // 获取看课中断和待看的先导课
+        List<FsCourseWatchLog> fsCourseWatchLogs = hyWorkTaskMapper.hyWorkTaskGetInterruptedAndFirst();
+        List<HyWorkTask> list = new ArrayList<>();
+        for (FsCourseWatchLog fsCourseWatchLog : fsCourseWatchLogs) {
+            HyWorkTask hyWorkTask = new HyWorkTask();
+            hyWorkTask.setCreateTime(DateUtils.getNowDate());
+            hyWorkTask.setExtId(fsCourseWatchLog.getQwExternalContactId());
+            hyWorkTask.setCompanyId(fsCourseWatchLog.getCompanyId());
+            hyWorkTask.setCompanyUserId(fsCourseWatchLog.getCompanyUserId());
+
+            // 看课中断
+            if(fsCourseWatchLog.getLogType()==4){
+                hyWorkTask.setUserId(fsCourseWatchLog.getUserId());
+                hyWorkTask.setStatus(0);
+                hyWorkTask.setType(2);
+                Date createTime = fsCourseWatchLog.getCreateTime();
+                long day = DateUtils.getDaysDifferenceFromNow(createTime);
+                hyWorkTask.setScore(0);
+                hyWorkTask.setTitle("第"+day+"天"+"看课中断");
+            } else {
+                hyWorkTask.setTitle(fsCourseWatchLog.getLogType()==3?"先导课待看课":"先导课完课");
+            }
+            hyWorkTask.setScore(fsCourseWatchLog.getLogType()==3?4:3);
+
+            list.add(hyWorkTask);
+        }
+
+        hyWorkTaskMapper.insertQwWorkTaskBatch(list);
+
+    }
+
     /**
      * 根据SOP执行日志和特定条件,为符合要求的外部联系人添加企业微信工作任务。
      * <p>
@@ -493,7 +533,7 @@ public class HyWorkTaskServiceImpl extends ServiceImpl<HyWorkTaskMapper, QwWorkT
 
 
     private void insertHyWorkTask(String sopId,QwExternalContact qwExternalContact, Integer type, String title, Integer score) {
-        QwWorkTask qwWorkTask = new QwWorkTask();
+        HyWorkTask qwWorkTask = new HyWorkTask();
         qwWorkTask.setCreateTime(DateUtils.getNowDate());
         qwWorkTask.setExtId(qwExternalContact.getId());
         qwWorkTask.setCompanyId(qwExternalContact.getCompanyId());

+ 5 - 0
fs-service-system/src/main/java/com/fs/sop/mapper/QwSopMapper.java

@@ -362,6 +362,11 @@ public interface QwSopMapper extends BaseMapper<QwSop> {
     List<QwSop> selectWxSop();
     @DataSource(DataSourceType.SOP)
     List<QwSop> selectQwSopByIsRating();
+    @DataSource(DataSourceType.SOP)
+    List<QwSop> selectQwSopByIsRatingAndFsUser();
+
+
+
     @DataSource(DataSourceType.SOP)
     @Select("select * FROM qw_sop where is_rating = 1 and send_type in(2,3) and min_conversion_day is not null and max_conversion_day is not null order by create_time desc")
     List<QwSop> selectQwSopByIsRatingNotNull();

+ 4 - 0
fs-service-system/src/main/java/com/fs/sop/mapper/SopUserLogsInfoMapper.java

@@ -200,6 +200,10 @@ public interface SopUserLogsInfoMapper {
     @Select("SELECT external_id,create_time  FROM sop_user_logs_info where sop_id = #{sopId} ")
     List<SopUserLogsInfo> selectSopUserLogsInfoBySopId(@Param("sopId")String sopId);
 
+    @DataSource(DataSourceType.SOP)
+    @Select("SELECT create_time,fs_user_id  FROM sop_user_logs_info where sop_id = #{sopId} ")
+    List<SopUserLogsInfo> selectFsUserIdSopUserLogsInfoBySopId(@Param("sopId")String sopId);
+
     @DataSource(DataSourceType.SOP)
     List<SopUserLogsInfo> repeatProject(@Param("projects") List<Integer> projects, @Param("externalUserID") String externalUserID);
     @DataSource(DataSourceType.SOP)

+ 18 - 0
fs-service-system/src/main/resources/mapper/qw/HyWorkTaskMapper.xml

@@ -90,6 +90,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         order by t.score desc,t.id desc
     </select>
+    <select id="hyWorkTask">
+
+    </select>
+    <select id="hyWorkTaskGetInterruptedAndFirst" resultType="com.fs.course.domain.FsCourseWatchLog">
+        SELECT
+            fcl.*
+        FROM
+            fs_course_watch_log fcl
+                JOIN
+            fs_user_course_video fucv ON fcl.video_id = fucv.video_id
+        WHERE
+            DATE(fcl.create_time) = CURDATE()
+          AND (
+            fcl.log_type = 4 -- 看课中断
+           OR
+            (fcl.log_type = 3 AND fucv.is_first = 1) -- 待看的先导课 (根据 is_first 标志判断)
+            )
+    </select>
 
     <insert id="insertHyWorkTask" parameterType="QwWorkTask" useGeneratedKeys="true" keyProperty="id">
         insert into hy_work_task