Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

吴树波 1 miesiąc temu
rodzic
commit
e91c7bd026

+ 51 - 3
fs-common/src/main/java/com/fs/common/utils/DateUtils.java

@@ -3,9 +3,8 @@ 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.*;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.Calendar;
 import java.util.Date;
@@ -32,6 +31,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             "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"};
+    private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     /**
      * 获取当前Date型日期
@@ -217,4 +217,52 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return daysBetween;
     }
 
+    /**
+     * 获取指定日期当天的开始时间字符串 (格式: yyyy-MM-dd 00:00:00)
+     *
+     * @param date 输入的 Date 对象
+     * @return 当天开始时间的字符串表示,如果输入为 null 则返回 null
+     */
+    public static String getStartOfDayString(Date date) {
+        // 使用 Objects.requireNonNull(date, "输入日期不能为 null"); 如果希望在输入为 null 时抛出异常
+        if (date == null) {
+            return null;
+        }
+        // 1. 将 Date 转换为更现代的 LocalDateTime (考虑时区)
+        //    使用系统默认时区。如果需要特定时区,请替换 ZoneId.systemDefault()
+        //    例如:ZoneId.of("Asia/Shanghai")
+        LocalDateTime localDateTime = date.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        // 2. 获取该日期的开始时间 (00:00:00)
+        LocalDateTime startOfDay = localDateTime.toLocalDate().atStartOfDay();
+        // 3. 格式化为目标字符串
+        return startOfDay.format(OUTPUT_FORMATTER);
+    }
+    /**
+     * 获取指定日期当天的结束时间字符串 (格式: yyyy-MM-dd 23:59:59)
+     *
+     * @param date 输入的 Date 对象
+     * @return 当天结束时间的字符串表示,如果输入为 null 则返回 null
+     */
+    public static String getEndOfDayString(Date date) {
+        if (date == null) {
+            return null;
+        }
+        // 1. 将 Date 转换为 LocalDateTime (考虑时区)
+        LocalDateTime localDateTime = date.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        // 2. 获取该日期的 LocalDate 部分
+        LocalDate localDate = localDateTime.toLocalDate();
+        // 3. 创建当天的结束时间 (23:59:59)
+        LocalDateTime endOfDay = LocalDateTime.of(localDate, LocalTime.of(23, 59, 59));
+        // 注意: 如果需要的是一天的最后一纳秒 (23:59:59.999999999),可以使用:
+        // LocalDateTime endOfDay = LocalDateTime.of(localDate, LocalTime.MAX);
+        // 但根据 "23:59:59" 的要求,明确指定秒更符合。
+        // 4. 格式化为目标字符串
+        return endOfDay.format(OUTPUT_FORMATTER);
+    }
+
+
 }

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

@@ -85,4 +85,7 @@ public class FsCourseWatchLog extends BaseEntity
     /** 营期id */
     private Long periodId;
 
+    /** 项目id */
+    private Long project;
+
 }

+ 12 - 0
fs-service-system/src/main/java/com/fs/course/param/FsCourseWatchLogStatisticsListParam.java

@@ -1,6 +1,7 @@
 package com.fs.course.param;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.utils.DateUtils;
 import lombok.Data;
 
 import java.util.Date;
@@ -23,6 +24,17 @@ public class FsCourseWatchLogStatisticsListParam {
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date sTime;
 
+    private String startDate;
+    private String endDate;
+
+    public String getStartDate() {
+        return DateUtils.getStartOfDayString(sTime);
+    }
+
+    public String getEndDate() {
+        return DateUtils.getEndOfDayString(eTime);
+    }
+
     private Long project;
 
     private Long pageNum;

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseVideoUParam.java

@@ -20,4 +20,7 @@ public class FsUserCourseVideoUParam implements Serializable {
 
     private Integer linkType;
 
+    @NotNull(message = "销售id不能为空")
+    private Long companyUserId;
+
 }

+ 24 - 7
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -134,6 +134,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private FsVideoResourceMapper fsVideoResourceMapper;
 
+    @Autowired
+    private FsUserCourseMapper fsUserCourseMapper;
+
     /**
      * 查询课堂视频
      *
@@ -775,10 +778,10 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
             // 更新观看记录的奖励类型
-            if (param.getLinkType() == null || param.getLinkType() == 0) {
-                log.setRewardType(config.getRewardType());
-                courseWatchLogMapper.updateFsCourseWatchLog(log);
-            }
+//            if (param.getLinkType() == null || param.getLinkType() == 0) {
+            log.setRewardType(config.getRewardType());
+            courseWatchLogMapper.updateFsCourseWatchLog(log);
+//            }
             return sendRedPacket;
         } else {
             return R.error("奖励发送失败,请联系客服");
@@ -810,6 +813,10 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         integralLogs.setCreateTime(new Date());
         fsUserIntegralLogsMapper.insertFsUserIntegralLogs(integralLogs);
 
+        //更新看课记录的奖励类型
+        log.setRewardType(config.getRewardType());
+        courseWatchLogMapper.updateFsCourseWatchLog(log);
+
         return R.ok("奖励发放成功");
     }
 
@@ -914,9 +921,18 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             log.setCompanyUserId(param.getCompanyUserId());
             log.setVideoId(param.getVideoId());
             List<FsCourseWatchLog> fsCourseWatchLogs = courseWatchLogMapper.selectFsCourseWatchLogList(log);
+
+            // 获取课程所属项目id
+            FsUserCourse fsUserCourse = fsUserCourseMapper.selectFsUserCourseByCourseId(param.getCourseId());
+            Long courseProject = null;
+            if(fsUserCourse != null){
+                courseProject = fsUserCourse.getProject();
+            }
             //如果存在,则更新
             if (fsCourseWatchLogs != null && !fsCourseWatchLogs.isEmpty()){
                 FsCourseWatchLog updateLog = new FsCourseWatchLog();
+                updateLog.setPeriodId(param.getPeriodId());
+                updateLog.setProject(courseProject);
                 updateLog.setUpdateTime(new Date());
                 courseWatchLogMapper.updateFsCourseWatchLog(updateLog);
             } else {
@@ -927,6 +943,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 fsCourseWatchLog.setDuration(0L);
                 fsCourseWatchLog.setCreateTime(new Date());
                 fsCourseWatchLog.setLogType(1);
+                fsCourseWatchLog.setProject(courseProject);
                 courseWatchLogMapper.insertFsCourseWatchLog(fsCourseWatchLog);
             }
         } else {
@@ -958,7 +975,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             ResponseResult.ok(vo);
         }
         // 从Redis中获取用户目前的观看时长
-        String redisKey = "h5wxuser:watch:duration:" + param.getFsUserId() + ":" + param.getVideoId();
+        String redisKey = "h5wxuser:watch:duration:" + param.getFsUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
         String durationCurrent = redisCache.getCacheObject(redisKey);
 
         //3、获取看课记录
@@ -1002,7 +1019,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
 
         // 从Redis中获取观看时长
-        String redisKey = "h5wxuser:watch:duration:" + param.getUserId() + ":" + param.getVideoId();
+        String redisKey = "h5wxuser:watch:duration:" + param.getUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
         try {
             String durationStr = redisCache.getCacheObject(redisKey);
             long duration = durationStr != null ? Long.parseLong(durationStr) : 0L;
@@ -1069,7 +1086,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     //会员-更新心跳时间
     public void updateHeartbeatWx(FsUserCourseVideoUParam param) {
-        String redisKey = "h5wxuser:watch:heartbeat:" + param.getUserId() + ":" + param.getVideoId();
+        String redisKey = "h5wxuser:watch:heartbeat:" + param.getUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
         redisCache.setCacheObject(redisKey, LocalDateTime.now().toString());
         // 设置 Redis 记录的过期时间(例如 5 分钟)
         redisCache.expire(redisKey, 300, TimeUnit.SECONDS);

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

@@ -108,8 +108,8 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
 
     List<QwWatchLogStatisticsListVO> selectQwWatchLogByCompanyUserId(
                                             @Param("companyUserIds") List<Long> companyUserIds,
-                                                                     @Param("sTime") Date sTime,
-                                                                     @Param("dTime") Date dTime,
+                                                                     @Param("sTime") String sTime,
+                                                                     @Param("dTime") String dTime,
                                                                      @Param("project") Long project,
                                                                      @Param("courseId") Long courseId,
                                                                      @Param("videoId") Long videoId,
@@ -118,8 +118,8 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
     );
     Long selectQwWatchLogByCompanyUserIdCount(
             @Param("companyUserIds") List<Long> companyUserIds,
-            @Param("sTime") Date sTime,
-            @Param("dTime") Date dTime,
+            @Param("sTime") String sTime,
+            @Param("dTime") String dTime,
             @Param("project") Long project,
             @Param("courseId") Long courseId,
             @Param("videoId") Long videoId
@@ -199,7 +199,7 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
 
 
     List<QwWatchLogAllStatisticsListVO> selectQwWatchLogAllStatisticsListVONew(@Param("companyUserIds") List<Long> userIds,
-                                                                               @Param("sDate") Date sDate, @Param("eDate") Date eDate,
+                                                                               @Param("sDate") String sDate, @Param("eDate") String eDate,
                                                                                @Param("project") Long project,
                                                                                @Param("courseId") Long courseId,
                                                                                @Param("videoId") Long videoId);
@@ -230,5 +230,5 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
 
     Long selectQwExtCountByDayAndCount(QwWatchLogStatisticsListParam param);
 
-    Long selectQwWatchLogAllStatisticsListVONewCount(List<Long> userIds, Date sTime, Date eTime, Long project, Long courseId, Long videoId);
+    Long selectQwWatchLogAllStatisticsListVONewCount(List<Long> userIds, String sTime, String eTime, Long project, Long courseId, Long videoId);
 }

+ 13 - 0
fs-service-system/src/main/java/com/fs/qw/param/QwWatchLogStatisticsListParam.java

@@ -1,6 +1,7 @@
 package com.fs.qw.param;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.utils.DateUtils;
 import lombok.Data;
 
 import java.util.Date;
@@ -11,6 +12,18 @@ public class QwWatchLogStatisticsListParam {
     private Date eTime;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date sTime;
+
+    private String startDate;
+    private String endDate;
+
+    public String getStartDate() {
+        return DateUtils.getStartOfDayString(sTime);
+    }
+
+    public String getEndDate() {
+        return DateUtils.getEndOfDayString(eTime);
+    }
+
     private String nickName;
     private String corpId;
     private Long companyId;

+ 10 - 4
fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -186,7 +186,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         // 统计销售下面的所有记录
         List<QwWatchLogStatisticsListVO> vos = qwWatchLogMapper
                 .selectQwWatchLogByCompanyUserId(userIds
-                , param.getSTime(),param.getETime(),param.getProject(),param.getCourseId(),param.getVideoId(),param.getPageNum(),param.getPageSize());
+                , param.getStartDate(),param.getEndDate(),param.getProject(),param.getCourseId(),param.getVideoId(),param.getPageNum(),param.getPageSize());
 
         for (QwWatchLogStatisticsListVO item : vos) {
             Company company = companyCacheService.selectCompanyById(item.getCompanyId());
@@ -194,6 +194,12 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
                 item.setCompanyUserName(company.getCompanyName());
                 item.setCreateTime(company.getCreateTime());
             }
+            if(ObjectUtils.isNotNull(item.getCompanyUserId())) {
+                CompanyUser companyUser = companyUserCacheService.selectCompanyUserById(item.getCompanyUserId());
+                if(companyUser != null) {
+                    item.setCompanyUserName(String.format("%d_%s",companyUser.getUserId(),companyUser.getUserName()));
+                }
+            }
 
             if(ObjectUtils.isNotNull(item.getProject())){
                 String sysCourseProject = DictUtils.getDictLabel("sys_course_project", String.valueOf(item.getProject()));
@@ -221,7 +227,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         // 获取总记录数
         Long total = qwWatchLogMapper
                 .selectQwWatchLogByCompanyUserIdCount(userIds
-                        , param.getSTime(), param.getETime(), param.getProject(), param.getCourseId(), param.getVideoId());
+                        , param.getStartDate(), param.getEndDate(), param.getProject(), param.getCourseId(), param.getVideoId());
 
 
 
@@ -279,7 +285,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         List<QwWatchLogAllStatisticsListVO> list = new ArrayList<>();
 
         List<QwWatchLogAllStatisticsListVO> vos = qwWatchLogMapper
-                .selectQwWatchLogAllStatisticsListVONew(userIds, param.getSTime(), param.getETime(),
+                .selectQwWatchLogAllStatisticsListVONew(userIds, param.getStartDate(), param.getEndDate(),
                         param.getProject(),param.getCourseId(),param.getVideoId()
                         );
         for (QwWatchLogAllStatisticsListVO item : vos) {
@@ -312,7 +318,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         }
 
         Long total = qwWatchLogMapper
-                .selectQwWatchLogAllStatisticsListVONewCount(userIds, param.getSTime(), param.getETime(),
+                .selectQwWatchLogAllStatisticsListVONewCount(userIds, param.getStartDate(), param.getStartDate(),
                         param.getProject(),param.getCourseId(),param.getVideoId()
                 );
 

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

@@ -10,6 +10,7 @@ public class QwWatchLogStatisticsListVO {
     private Long id;
     private String qwUserName;
     private String companyUserName;
+    private Long companyUserId;
     private Long companyId;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createTime;

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

@@ -613,6 +613,7 @@ public class FsUserServiceImpl implements IFsUserService
         list.add(new FsUserGraphicStatisticsVO("答题人数", userStatistics.getAnswerNum(), userStatistics.getAnswerNum()));
         list.add(new FsUserGraphicStatisticsVO("正确人数", userStatistics.getAnswerRightNum(), userStatistics.getAnswerRightNum()));
         list.add(new FsUserGraphicStatisticsVO("答题红包数", userStatistics.getRedPacketNum(), userStatistics.getRedPacketNum()));
+        list.sort(Comparator.comparingInt(FsUserGraphicStatisticsVO::getValue).reversed());
         return list;
     }
 

+ 9 - 3
fs-service-system/src/main/resources/application-config.yml

@@ -63,9 +63,15 @@ wx:
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
 
-#  云联融智优选小程序,暂时使用
-      - appid: wxd70f99287830cb51   #云联融智优选(暂时用于测试销售app)
-        secret: 6e2684b3d48e6363018d4eedb8dae3e5
+##  云联融智优选小程序,暂时使用
+#      - appid: wxd70f99287830cb51   #云联融智优选(暂时用于测试销售app)
+#        secret: 6e2684b3d48e6363018d4eedb8dae3e5
+#        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+#        aesKey:
+#        msgDataFormat: JSON
+
+      - appid: wxb9b453d37c5fad45   #福本源小程序
+        secret: 45ee94e8c48edbafdcca2131a5e9d48d
         token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
         aesKey:
         msgDataFormat: JSON

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

@@ -465,10 +465,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                and o.company_id=#{companyId}
             </if>
             <if test= 'sTime != null '>
-                and o.create_time &gt;= #{sTime}
+                and o.create_time &gt;= #{startDate}
             </if>
             <if test='eTime != null '>
-                and o.create_time &lt;= #{eTime}
+                and o.create_time &lt;= #{endDate}
             </if>
             <if test ='courseId !=null'>
                 and o.course_id = #{courseId}
@@ -690,10 +690,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and o.company_id=#{companyId}
             </if>
             <if test= 'sTime != null '>
-                and o.create_time &gt;= #{sTime}
+                and o.create_time &gt;= #{startDate}
             </if>
             <if test='eTime != null '>
-                and o.create_time &lt;= #{eTime}
+                and o.create_time &lt;= #{endDate}
             </if>
             <if test ='courseId !=null'>
                 and o.course_id = #{courseId}

+ 13 - 13
fs-service-system/src/main/resources/mapper/hy/HyWatchLogMapper.xml

@@ -19,19 +19,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select id, ext_id, qw_user_id,line_time, status, day, project, create_time from hy_watch_log
     </sql>
     <insert id="insertHyWatchLogBatch">
-        INSERT INTO hy_work_task (
+        INSERT INTO hy_watch_log (
         ext_id,
         qw_user_id,
         status,
-        type,
-        title,
-        remark,
-        score,
-        sop_id,
+        day,
+        project,
         company_id,
         company_user_id,
         create_time,
-        update_time
+        line_time,
+        course_id,
+        video_id,
+        fs_user_id
         )
         VALUES
         <foreach collection="hyWatchLogs" item="log" separator=",">
@@ -39,15 +39,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{log.extId},
             #{log.qwUserId},
             #{log.status},
-            #{log.type},
-            #{log.title},
-            #{log.remark},
-            #{log.score},
-            #{log.sopId},
+            #{log.day},
+            #{log.project},
             #{log.companyId},
             #{log.companyUserId},
             #{log.createTime},
-            #{log.updateTime}
+            #{log.lineTime},
+            #{log.courseId},
+            #{log.videoId},
+            #{log.fsUserId}
             )
         </foreach>
     </insert>

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

@@ -40,8 +40,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             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,project,course_id,video_id,company_id
-             from qw_watch_log
+            COUNT(1) AS line,project,course_id,video_id,company_id,company_user_id
+             from hy_watch_log
              <where>
                  <if test="companyUserIds != null and companyUserIds.size() != 0">
                      and company_user_id in
@@ -131,7 +131,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             COUNT(CASE WHEN day = 30 and status in (1,2) THEN 1 END) AS d30Online,
             COUNT(CASE WHEN day = 30 and status=2 THEN 1 END) AS d30Over,
             COUNT(1) AS line,project,course_id,video_id
-             from qw_watch_log
+             from hy_watch_log
             <where>
                  <if test="companyUserIds != null">
                      and company_user_id in
@@ -155,7 +155,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT COUNT(*)
         FROM (
         SELECT 1
-        FROM qw_watch_log
+        FROM hy_watch_log
         <where>
             <if test="companyUserIds != null and companyUserIds.size() != 0">
                 and company_user_id in
@@ -205,7 +205,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectQwWatchLogAllStatisticsListVONewCount" resultType="java.lang.Long">
         select
         count(1)
-        from qw_watch_log
+        from hy_watch_log
         <where>
             <if test="companyUserId">
                 and company_user_id in