zyp 3 月之前
父節點
當前提交
2a7d79b4e7

+ 1 - 1
fs-company/src/main/resources/application.yml

@@ -44,7 +44,7 @@ spring:
     basename: i18n/messages
   profiles:
 #    active: dev
-    active: druid
+    active: dev
     include: config
   # 文件上传
   servlet:

+ 10 - 4
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -6,10 +6,7 @@ import com.fs.app.taskService.SopLogsChatTaskService;
 import com.fs.app.taskService.SopLogsTaskService;
 import com.fs.common.core.domain.R;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
-import com.fs.course.service.IFsCourseLinkService;
-import com.fs.course.service.IFsCourseWatchLogService;
-import com.fs.course.service.IFsUserVideoService;
-import com.fs.course.service.IHuaweiObsService;
+import com.fs.course.service.*;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.sop.mapper.QwSopLogsMapper;
@@ -146,6 +143,15 @@ public class CommonController {
     }
 
 
+    @Autowired
+    private IFsCourseWatchLogService courseWatchLogService;
+    @GetMapping("/del")
+    public R del(){
+        courseWatchLogService.del();
+        return R.ok();
+    }
+
+
     @Autowired
     private SopLogsChatTaskService sopLogsChatTaskService;
     @GetMapping("/test2")

+ 2 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java

@@ -56,4 +56,6 @@ public class FsCourseLink extends BaseEntity
 
 //    private String link_uuid;
 
+    private Integer isRoom;//是否发群
+
 }

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

@@ -307,4 +307,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * @return  count
      */
     int countByMap(@Param("params") Map<String, Object> params);
+
+    @Select("select log_id from fs_course_watch_log where create_time < '2025-03-01'")
+    List<Long> selectFsCourseWatchLogByLastmonth();
 }

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

@@ -57,4 +57,6 @@ public class FsUserCourseVideoAddKfUParam implements Serializable {
 
     private Long linkId;
 
+    private Integer isRoom;
+
 }

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

@@ -76,4 +76,6 @@ public interface IFsCourseLinkService
 
     R createLinkByMiniApp(FsCourseLinkCreateParam param);
 
+    R createRoomLinkUrl(FsCourseLinkCreateParam param);
+
 }

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

@@ -113,4 +113,6 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
      * @return  count
      */
     int countByMap(Map<String, Object> params);
+
+    void del();
 }

+ 35 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java

@@ -195,6 +195,41 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
         return R.error("短链生成失败!");
     }
 
+    @Override
+    public R createRoomLinkUrl(FsCourseLinkCreateParam param) {
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        FsCourseLink link = new FsCourseLink();
+        BeanUtils.copyProperties(param,link);
+        link.setLinkType(0);
+        link.setIsRoom(1);
+        FsCourseRealLink courseMap = new FsCourseRealLink();
+        BeanUtils.copyProperties(link,courseMap);
+        // 将实体类对象转换为 JSON 字符串
+        String course = JSON.toJSONString(courseMap);
+        link.setRealLink(realLink+course);
+        String randomString = generateRandomString();
+        link.setLink(randomString);
+        link.setCreateTime(new Date());
+        Integer expireDays = 0;
+        if (param.getDays() == null || param.getDays() == 0){
+            expireDays = config.getVideoLinkExpireDate();
+        }else {
+            expireDays = param.getDays();
+        }
+        // 设置过期时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(link.getCreateTime());
+        calendar.add(Calendar.DAY_OF_MONTH, expireDays);
+        link.setUpdateTime(calendar.getTime());
+        if (fsCourseLinkMapper.insertFsCourseLink(link)>0){
+            String domainName = getDomainName(param.getCompanyUserId(), config);
+            String sortLink = domainName + "/s/" + link.getLink();
+            return R.ok("短链生成").put("url",sortLink);
+        }
+        return R.error("短链生成失败!");
+    }
+
     @Override
     public R createLinkUrlWc(FsCourseLinkCreateParam param) {
 

+ 11 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -750,4 +750,15 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         // 记录全部更新完成
         log.info("所有日志更新完成,总日志数量: {}", logs.size());
     }
+
+
+    @Override
+    public void del() {
+        List<Long> logIds = fsCourseWatchLogMapper.selectFsCourseWatchLogByLastmonth();
+        processDelCourseLogs(logIds);
+    }
+
+    private void processDelCourseLogs(List<Long> logIds) {
+
+    }
 }

+ 57 - 27
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -321,13 +321,61 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         FsUser fsUser = fsUserMapper.selectFsUserByUserId(param.getUserId());
         //用户不存在唤起重新授权
         if (fsUser==null){
-            return R.error(504,"");
+            return R.error(504,"未授权");
         }
-        String nickName = "微信用户";
-        if (fsUser.getNickname() != null && fsUser.getNickname().contains(nickName)) {
-            return R.error(504,"");
+
+        String msg = "<div style=\"color: red;margin-bottom: 15px;font-weight: bold;\">本课程为会员独享<br>请长按二维码</div>\n" +
+                "\t\t\t\t\t<div style=\"color: #999;font-size: 14px;font-weight: bold;\">添加伴学助手免费领取会员权限</div>";
+
+        Integer isRoom = param.getIsRoom();
+
+        // 处理逻辑
+        if (isRoom == null || isRoom == 0) {
+            // 当 isRoom 为 null 或 0 时走 handleExt
+            return handleExt(param,msg);
+        } else if (isRoom == 1) {
+            // 当 isRoom 为 1 时走 handleRoom
+            return handleRoom(param,fsUser);
+        } else {
+            // 非法参数
+            logger.warn("非法参数 isRoom: {}", isRoom);
+            return R.error("参数错误!");
+        }
+
+    }
+
+    private R handleRoom(FsUserCourseVideoAddKfUParam param,FsUser user) {
+        if (user.getQwExtId()==null){
+            return R.error("未注册");
+        }
+        param.setQwExternalId(user.getQwExtId());
+        //查询是否有添加客服
+        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
+        if (externalContact==null){
+            return R.error("客户不存在!");
+        }
+        if (!externalContact.getQwUserId().equals(param.getUserId())){
+            return R.error("无权限观看,添加群主非本群主");
+        }
+        FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(param.getQwExternalId(), param.getVideoId(),param.getQwUserId());
+        if (log==null){
+            createWatchLog(param);
         }
+        return R.ok();
+    }
+
+    private void createWatchLog(FsUserCourseVideoAddKfUParam param) {
+        FsCourseWatchLog log = new FsCourseWatchLog();
+        BeanUtils.copyProperties(param,log);
+        log.setQwExternalContactId(param.getQwExternalId());
+        log.setSendType(2);
+        log.setDuration(0L);
+        log.setCreateTime(new Date());
+        log.setLogType(0);
+        courseWatchLogMapper.insertFsCourseWatchLog(log);
+    }
 
+    private R handleExt(FsUserCourseVideoAddKfUParam param,String msg){
         if (param.getLinkType()!=null&&param.getLinkType()==1){
             if (param.getLinkId()!=null){
                 // 从数据库中查找短链对应的真实链接
@@ -350,12 +398,10 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             return R.error("链接过期");
         }
 
-        String msg = "<div style=\"color: red;margin-bottom: 15px;font-weight: bold;\">本课程为会员独享<br>请长按二维码</div>\n" +
-                "\t\t\t\t\t<div style=\"color: #999;font-size: 14px;font-weight: bold;\">添加伴学助手免费领取会员权限</div>";
+
 
         FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(param.getQwExternalId(), param.getVideoId(),param.getQwUserId());
         if (log==null ){
-            logger.info("");
             return addCustomerService(param.getQwUserId(),msg);
         }
 
@@ -371,12 +417,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             return addCustomerService(param.getQwUserId(),msg);
         }
 
-        //如果客户状态为正常或流失且无接替记录,才生成可以看课,不然加好友
-//        if (externalContact.getStatus() != 0 && externalContact.getStatus() != 2 && externalContact.getStatus() != 3){
-//        if (externalContact.getStatus()==4){
-//            return addCustomerService(param.getQwUserId(),msg);
-//        }
-
         //判断外部联系人有没有绑定userId
         if (externalContact.getFsUserId()!=null){
             //有客户有小程序id  但 登录的小程序id和根据外部联系人id查出来的小程序id不一致
@@ -389,13 +429,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             }
 
             //看课记录中userId为0绑定userId
-            if (log.getUserId()==null||log.getUserId().equals(0L)){
+            if (log.getUserId()==null||log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())){
                 log.setUserId(param.getUserId());
             }
-            //看课记录不为已完课时 改为看课中
-//            if (log.getLogType()!=2){
-//                log.setLogType(1);
-//            }
             log.setUpdateTime(new Date());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
             return R.ok();
@@ -407,26 +443,20 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             contact.setFsUserId(param.getUserId());
             qwExternalContactMapper.updateQwExternalContact(contact);
             FsUser user = new FsUser();
-            user.setUserId(fsUser.getUserId());
+            user.setUserId(param.getUserId());
             user.setIsAddQw(1);
             fsUserMapper.updateFsUser(user);
 
             //绑定上之后 更新观看记录
             //看课记录中userId为0绑定userId
-            if (log.getUserId()==null||log.getUserId().equals(0L)){
+            if (log.getUserId()==null||log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())){
                 log.setUserId(param.getUserId());
             }
-            //看课记录不为已完课时 改为看课中
-//            if (log.getLogType()!=2){
-//                log.setLogType(1);
-//            }
 
             log.setUpdateTime(new Date());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
             return R.ok();
         }
-
-
     }
 
     private R addCustomerService(String qwUserById,String msg){
@@ -775,7 +805,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         QwExternalContact qw = new QwExternalContact();
         qw.setFsUserId(fsUser.getUserId());
         qw.setId(qwExternalContact.getId());
-        qwExternalContactMapper.updateQwExternalContactByExternalUserId(qw);
+        qwExternalContactMapper.updateById(qw);
         List<String> list= sopUserLogsInfoMapper.selectSopUserLogsInfoByExtId(qwExternalContact.getId());
         if (list!=null&& !list.isEmpty()){
             sopUserLogsInfoMapper.updateSopUserLogsInfoFsUserIdById(list,param.getUserId());

+ 7 - 1
fs-service-system/src/main/resources/mapper/course/FsCourseLinkMapper.xml

@@ -18,10 +18,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="courseId"    column="course_id"    />
         <result property="qwExternalId"    column="qw_external_id"    />
         <result property="linkType"    column="link_type"    />
+        <result property="isRoom"    column="is_room"    />
     </resultMap>
 
     <sql id="selectFsCourseLinkVo">
-        select link_id, link, real_link,link_type, create_time, update_time, company_id, company_user_id, qw_user_id, video_id, corp_id, course_id ,qw_external_id  from fs_course_link
+        select link_id, is_room,link, real_link,link_type, create_time, update_time, company_id, company_user_id, qw_user_id, video_id, corp_id, course_id ,qw_external_id  from fs_course_link
     </sql>
 
     <select id="selectFsCourseLinkList" parameterType="FsCourseLink" resultMap="FsCourseLinkResult">
@@ -60,6 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">course_id,</if>
             <if test="qwExternalId != null">qw_external_id,</if>
             <if test="linkType != null">link_type,</if>
+            <if test="isRoom != null">is_room,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="link != null">#{link},</if>
@@ -74,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">#{courseId},</if>
             <if test="qwExternalId != null">#{qwExternalId},</if>
             <if test="linkType != null">#{linkType},</if>
+            <if test="isRoom != null">#{isRoom},</if>
          </trim>
     </insert>
 
@@ -97,6 +100,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         <if test="item.courseId != null">course_id,</if>
                         <if test="item.qwExternalId != null">qw_external_id,</if>
                         <if test="item.linkType != null">link_type,</if>
+                        <if test="item.isRoom != null">is_room,</if>
                     </if>
                 </foreach>
             </if>
@@ -116,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 <if test="item.courseId != null">#{item.courseId},</if>
                 <if test="item.qwExternalId != null">#{item.qwExternalId},</if>
                 <if test="item.linkType != null">#{item.linkType},</if>
+                <if test="item.isRoom != null">#{item.isRoom},</if>
             </trim>)
             </foreach>
         </trim>
@@ -137,6 +142,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">course_id = #{courseId},</if>
             <if test="qwExternalId != null">qw_external_id = #{qwExternalId},</if>
             <if test="linkType != null">link_type = #{linkType},</if>
+            <if test="isRoom != null">is_room = #{isRoom},</if>
         </trim>
         where link_id = #{linkId}
     </update>

+ 30 - 4
fs-user-app/src/main/java/com/fs/app/controller/CourseH5Controller.java

@@ -2,14 +2,15 @@ package com.fs.app.controller;
 
 
 import cn.hutool.json.JSONUtil;
+import com.fs.app.annotation.Login;
+import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.param.FsCourseQuestionAnswerUParam;
+import com.fs.course.param.FsCourseSendRewardUParam;
 import com.fs.course.param.FsUserCourseVideoFinishUParam;
-import com.fs.course.service.IFsCourseLinkService;
-import com.fs.course.service.IFsCourseWatchLogService;
-import com.fs.course.service.IFsUserCourseService;
-import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.service.*;
 import com.fs.course.vo.FsUserCourseVideoH5DVO;
 import com.fs.course.vo.FsUserCourseVideoH5VO;
 import com.fs.system.service.ISysConfigService;
@@ -41,6 +42,9 @@ public class CourseH5Controller extends  AppBaseController{
     @Autowired
     private IFsCourseWatchLogService courseWatchLogService;
 
+    @Autowired
+    private IFsCourseQuestionBankService questionBankService;
+
 
     @ApiOperation("h5课程简介")
     @GetMapping("/getH5CourseByVideoId")
@@ -117,6 +121,28 @@ public class CourseH5Controller extends  AppBaseController{
         return courseVideoService.getInternetTraffic(param);
     }
 
+    @ApiOperation("答题")
+    @PostMapping("/courseAnswer")
+    public R courseAnswer(@RequestBody FsCourseQuestionAnswerUParam param)
+    {
+        logger.info("zyp \n【答题】:{}",param.getQuestions());
+        if (param.getDuration()==null){
+            logger.info("zyp \n【未识别到时长】:{}",param.getUserId());
+        }
+        param.setUserId(Long.parseLong(getUserId()));
+        return questionBankService.courseAnswer(param);
+    }
+
+    @ApiOperation("发放奖励")
+    @PostMapping("/sendReward")
+    @RepeatSubmit
+    public R sendReward(@RequestBody FsCourseSendRewardUParam param)
+    {
+        param.setUserId(Long.parseLong(getUserId()));
+        logger.info("zyp \n【发放奖励】:{}",param);
+        return courseVideoService.sendReward(param);
+    }
+
     @PostMapping("/getErrMsg")
     public void getErrMsg(@RequestParam("msg") String msg) {
         logger.error("zyp \n【h5看课中途报错】:{}",msg);