Explorar el Código

金牛im配置,自动看课添加行为轨迹

ct hace 1 semana
padre
commit
7d0f1de411

+ 2 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java

@@ -245,4 +245,6 @@ public interface FsUserCourseVideoMapper
      * 根据视频id集合查询列表
      */
     List<FsUserCourseVideoAppletVO> getFsUserCourseVideoAppletVOListByIds(@Param("videoIds") List<Long> videoIds);
+
+    FsUserCourseVO selectFsUserCourseVideoVoByVideoIdAndCourdeId(@Param("videoId") Long videoId,@Param("courseId") Long courseId);
 }

+ 3 - 3
fs-service/src/main/resources/application-druid-jnmy-test.yml

@@ -41,7 +41,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://120.46.174.121:2345/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://120.46.174.121:2345/fs_his_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: Ylrztek250218!3@.
                 # 从库数据源
@@ -151,10 +151,10 @@ rocketmq:
 openIM:
     secret: openIM123
     userID: imAdmin
-    url: https://web.im.fbylive.com/api
+    url: https://web.jnmyim.ylrzfs.com/api
 #是否使用新im
 im:
-    type: NONE
+    type: OPENIM
 isNewWxMerchant: true
 
 

+ 2 - 2
fs-service/src/main/resources/application-druid-jnmy.yml

@@ -154,10 +154,10 @@ rocketmq:
 openIM:
     secret: openIM123
     userID: imAdmin
-    url: https://web.im.fbylive.com/api
+    url: https://web.jnmyim.ylrzfs.com/api
 #是否使用新im
 im:
-    type: NONE
+    type: OPENIM
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
 

+ 12 - 0
fs-service/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml

@@ -463,4 +463,16 @@
             #{videoId}
         </foreach>
     </select>
+    <select id="selectFsUserCourseVideoVoByVideoIdAndCourdeId" resultType="com.fs.course.vo.FsUserCourseVO">
+        select
+            video.video_id,
+            video.title,
+            course.course_id,
+            course.course_name
+        from `fs_user_course_video` video
+                 left join fs_user_course course ON video.course_id = course.course_id
+        where course.is_del = 0 and video.video_id = #{videoId}
+           and video.is_del = 0  and video.course_id= #{courseId}
+            limit 1
+    </select>
 </mapper>

+ 4 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -3,6 +3,7 @@ package com.fs.app.controller;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.date.DateTime;
+import com.fs.app.annotation.UserOperationLog;
 import com.fs.app.param.FsUserLoginByCourseMpParam;
 import com.fs.app.param.FsUserLoginByMpParam;
 import com.fs.app.utils.JwtUtils;
@@ -18,6 +19,7 @@ import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.service.IFsUserCompanyUserService;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserWx;
+import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
 import com.fs.qw.mapper.QwExternalContactMapper;
@@ -77,6 +79,7 @@ public class WxH5MpController {
 
     @ApiOperation("课程分享链接公众号登录")
     @PostMapping("/loginByMp")
+    @UserOperationLog(operationType = FsUserOperationEnum.H5LOGIN)
     public R loginByMp(@Valid @RequestBody FsUserLoginByMpParam param) {
         log.info("=====================进入小程序授权登录, 入参: {}", param);
 
@@ -132,6 +135,7 @@ public class WxH5MpController {
 
     @ApiOperation("炮灰小程序-公众号登录转小程序")
     @PostMapping("/courseLoginByMp")
+    @UserOperationLog(operationType = FsUserOperationEnum.H5LOGIN)
     public R courseLoginByMp(@Valid @RequestBody FsUserLoginByCourseMpParam param) {
         log.info("=====================进入炮灰小程序-公众号授权登录, 入参: {}", param);
 

+ 3 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -7,6 +7,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
 import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
+import com.fs.app.annotation.UserOperationLog;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
@@ -21,6 +22,7 @@ import com.fs.core.config.WxMpConfiguration;
 import com.fs.course.config.CourseMaConfig;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
+import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.mapper.FsUserLoginLogMapper;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
@@ -97,6 +99,7 @@ public class WxUserController extends AppBaseController{
     @ApiOperation("登录")
     @PostMapping("/login")
     @Transactional
+    @UserOperationLog(operationType = FsUserOperationEnum.MINLOGIN)
     public R login( @RequestBody LoginParam param) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");

+ 5 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwController.java

@@ -4,6 +4,7 @@ package com.fs.app.controller.course;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.app.annotation.Login;
+import com.fs.app.annotation.UserOperationLog;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
@@ -18,6 +19,7 @@ import com.fs.course.param.*;
 import com.fs.course.service.*;
 import com.fs.course.service.impl.TencentCloudCosService;
 import com.fs.course.vo.*;
+import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.service.IFsIntegralGoodsService;
 import com.fs.sop.domain.QwSop;
 import com.fs.sop.service.IQwSopService;
@@ -112,6 +114,7 @@ public class CourseQwController extends AppBaseController {
     @Login
     @ApiOperation("h5课程详情加问答")
     @GetMapping("/getH5CourseVideoDetails")
+    @UserOperationLog(operationType = FsUserOperationEnum.STUDY)
     public R getCourseVideoDetails(FsUserCourseVideoFinishUParam param)
     {
         param.setUserId(Long.parseLong(getUserId()));
@@ -210,6 +213,7 @@ public class CourseQwController extends AppBaseController {
     @ApiOperation("答题")
     @PostMapping("/courseAnswer")
     @Login
+    @UserOperationLog(operationType = FsUserOperationEnum.ANSWER)
     public R courseAnswer(@RequestBody FsCourseQuestionAnswerUParam param)
     {
         logger.info("zyp \n【答题】:{}", JSON.toJSONString(param));
@@ -231,6 +235,7 @@ public class CourseQwController extends AppBaseController {
     @ApiOperation("发放奖励")
     @PostMapping("/sendReward")
     @RepeatSubmit
+    @UserOperationLog(operationType = FsUserOperationEnum.SENDREWARD)
     public R sendReward(@RequestBody @Valid FsCourseSendRewardUParam param)
     {
         param.setUserId(Long.parseLong(getUserId()));

+ 3 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwLoginController.java

@@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.date.DateTime;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.app.annotation.UserOperationLog;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
@@ -16,6 +17,7 @@ import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserWx;
+import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.mapper.FsUserLoginLogMapper;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
@@ -69,6 +71,7 @@ public class CourseQwLoginController extends AppBaseController {
     @ApiOperation("小程序看课登录")
     @PostMapping("/courseLogin")
     @Transactional
+    @UserOperationLog(operationType = FsUserOperationEnum.MINLOGIN)
     public R courseLogin(@RequestBody LoginParam param) {
         List<FsCoursePlaySourceConfig> list = fsCoursePlaySourceConfigService.list(new QueryWrapper<FsCoursePlaySourceConfig>().ne("type", 2).eq("is_del", 0));
         if (list.isEmpty()){

+ 87 - 34
fs-user-app/src/main/java/com/fs/framework/aspectj/UserOperationLogAspect.java

@@ -9,12 +9,14 @@ import com.fs.common.core.domain.R;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.course.domain.FsCourseQuestionBank;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.param.FsCourseQuestionAnswerUParam;
 import com.fs.course.param.FsCourseSendRewardUParam;
 import com.fs.course.param.newfs.FsUserCourseVideoLinkParam;
 import com.fs.course.vo.FsUserCourseVO;
+import com.fs.course.vo.FsUserCourseVideoH5DVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserOperationLog;
@@ -83,7 +85,14 @@ public class UserOperationLogAspect {
                 }
             }
 
+
             if (operationLog.getUserId() != null) {
+                if ("学习课程".equals(operationLog.getOperationType())){
+                    if (StringUtils.isBlank(operationLog.getDetails())){
+                        operationLog = extractCourseFromResult(result);
+
+                    }
+                }
                 logMapper.insertFsUserOperationLog(operationLog);
             }
         } catch (Exception ex) {
@@ -141,22 +150,26 @@ public class UserOperationLogAspect {
 
     private StringBuilder getDetail(UserOperationLog annotation, FsUserOperationEnum opType, FsUser fsUser,Object[] args) {
         StringBuilder details = new StringBuilder();
+        String nickName = fsUser.getNickName();
+        if (StringUtils.isBlank(nickName)){
+            nickName = fsUser.getNickname();
+        }
         if (annotation.detail() == null || annotation.detail().isEmpty()) {
             switch (opType.getValue()) {
                 case 1: // 小程序登录
-                    details.append(fsUser.getNickName())
+                    details.append(nickName)
                             .append("在")
                             .append(DateUtils.getTime())
                             .append("登录了小程序");
                     break;
                 case 2: // h5登录
-                    details.append(fsUser.getNickName())
+                    details.append(nickName)
                             .append("在")
                             .append(DateUtils.getTime())
                             .append("登录了h5");
                     break;
                 case 3: // 成为会员
-                    details.append(fsUser.getNickName())
+                    details.append(nickName)
                             .append("在")
                             .append(DateUtils.getTime())
                             .append("注册成为会员");
@@ -165,14 +178,16 @@ public class UserOperationLogAspect {
                     break;
                 case 5: // 学习课程
                     String courseInfo = extractCourseInfo(args);
-                    details.append(fsUser.getNickName())
-                            .append("在")
-                            .append(DateUtils.getTime())
-                            .append("观看 ").append(courseInfo);
+                    if (courseInfo != null) {
+                        details.append(nickName)
+                                .append("在")
+                                .append(DateUtils.getTime())
+                                .append("观看 ").append(courseInfo);
+                    }
                     break;
                 case 6: // 答题
                     String answerCourse = answerCourse(args);
-                    details.append(fsUser.getNickName())
+                    details.append(nickName)
                             .append("在 ")
                             .append(DateUtils.getTime())
                             .append("\n")
@@ -181,10 +196,10 @@ public class UserOperationLogAspect {
                 case 7: // 发送奖励
                     String sendReward = sendReward(args);
 
-                    details.append(fsUser.getNickName())
+                    details.append(nickName)
                             .append("在 ")
                             .append(DateUtils.getTime())
-                            .append("领取红包")
+                            .append("领取 红包/积分 奖励")
                             .append("\n")
                             .append(sendReward);
                     break;
@@ -215,6 +230,30 @@ public class UserOperationLogAspect {
         }
         return null;
     }
+    private FsUserOperationLog extractCourseFromResult(Object result) {
+        if (result instanceof R) {
+            R r = (R) result;
+            Object course = r.get("course");
+            if (course instanceof FsUserCourseVideoH5DVO) {
+                FsUserOperationLog operationLog = LOG_HOLDER.get();
+                FsUser fsUser = userMapper.selectFsUserByUserId(operationLog.getUserId());
+                FsUserCourseVideoH5DVO vo = (FsUserCourseVideoH5DVO) course;
+                operationLog.setParam(JSON.toJSONString(vo));
+                StringBuilder details = new StringBuilder();
+                String nickName = fsUser.getNickName();
+                if (StringUtils.isBlank(nickName)){
+                    nickName = fsUser.getNickname();
+                }
+                details.append(nickName)
+                        .append("在")
+                        .append(DateUtils.getTime())
+                        .append("观看 课程:").append(vo.getCourseName()).append(" 的 ").append(vo.getTitle()).append(" 小节");
+                operationLog.setDetails(details.toString());
+                return operationLog;
+            }
+        }
+        return null;
+    }
     private String extractCourseInfo(Object[] args) {
         if (args == null) return "未知课程";
 
@@ -230,6 +269,8 @@ public class UserOperationLogAspect {
                         return "课程:"+ vo.getCourseName() + " 的 " + vo.getTitle() + " 小节";
                     }
                 }
+            } else {
+                return null; //自动发课 接口执行完生成
             }
         }
         return "未知课程";
@@ -240,22 +281,28 @@ public class UserOperationLogAspect {
         for (Object arg : args) {
             if (arg instanceof FsCourseQuestionAnswerUParam) {
                 FsCourseQuestionAnswerUParam param = (FsCourseQuestionAnswerUParam) arg;
-                if (param.getVideoId() != null && param.getPeriodId() != null) {
-                    FsUserCourseVO vo = userCourseVideoMapper.selectFsUserCourseVideoVoByVideoId(param.getVideoId(), param.getPeriodId());
-                    if (vo != null){
-                        FsUserOperationLog operationLog = LOG_HOLDER.get();
-                        operationLog.setParam(JSON.toJSONString(vo));
-                        LOG_HOLDER.set(operationLog);
-                        StringBuilder details =new StringBuilder("课程:"+ vo.getCourseName() + " 的 " + vo.getTitle() + " 小节 问题为:");
-                        List<FsCourseQuestionBank> questions = param.getQuestions();
-                        if (questions != null && !questions.isEmpty()) {
-                            for (int i = 0; i < questions.size(); i++) {
-                                details.append("\n").append(i+1).append(".").append(questions.get(i).getTitle());
-                                details.append(" 提交答案为:").append(questions.get(i).getAnswer());
-                            }
+                Long videoId = param.getVideoId();
+                Long periodId = param.getPeriodId();
+                Long courseId = param.getCourseId();
+                FsUserCourseVO vo = null;
+                if (param.getQwExternalId() != null){ //自动看课
+                    vo = userCourseVideoMapper.selectFsUserCourseVideoVoByVideoIdAndCourdeId(videoId,courseId);
+                } else if (videoId != null && param.getPeriodId() != null) {  //手动看课
+                    vo = userCourseVideoMapper.selectFsUserCourseVideoVoByVideoId(videoId, periodId);
+                }
+                if (vo != null){
+                    FsUserOperationLog operationLog = LOG_HOLDER.get();
+                    operationLog.setParam(JSON.toJSONString(vo));
+                    LOG_HOLDER.set(operationLog);
+                    StringBuilder details =new StringBuilder("课程:"+ vo.getCourseName() + " 的 " + vo.getTitle() + " 小节 问题为:");
+                    List<FsCourseQuestionBank> questions = param.getQuestions();
+                    if (questions != null && !questions.isEmpty()) {
+                        for (int i = 0; i < questions.size(); i++) {
+                            details.append("\n").append(i+1).append(".").append(questions.get(i).getTitle());
+                            details.append(" 提交答案为:").append(questions.get(i).getAnswer());
                         }
-                        return details.toString();
                     }
+                    return details.toString();
                 }
             }
         }
@@ -267,16 +314,22 @@ public class UserOperationLogAspect {
         for (Object arg : args) {
             if (arg instanceof FsCourseSendRewardUParam) {
                 FsCourseSendRewardUParam param = (FsCourseSendRewardUParam) arg;
-                if (param.getVideoId() != null && param.getPeriodId() != null) {
-                    FsUserCourseVO vo = userCourseVideoMapper.selectFsUserCourseVideoVoByVideoId(param.getVideoId(), param.getPeriodId());
-                    if (vo != null){
-                        FsUserOperationLog operationLog = LOG_HOLDER.get();
-                        operationLog.setParam(JSON.toJSONString(vo));
-                        LOG_HOLDER.set(operationLog);
-                        StringBuilder details =new StringBuilder();
-                        details.append("课程:"+ vo.getCourseName() + " 的 " + vo.getTitle() + " 小节");
-                        return details.toString();
-                    }
+                Long videoId = param.getVideoId();
+                Long periodId = param.getPeriodId();
+                Long courseId = param.getCourseId();
+                FsUserCourseVO vo = null;
+                if (param.getQwExternalId() != null){ //自动看课
+                    vo = userCourseVideoMapper.selectFsUserCourseVideoVoByVideoIdAndCourdeId(videoId,courseId);
+                } else if (videoId != null && param.getPeriodId() != null) {  //手动看课
+                    vo = userCourseVideoMapper.selectFsUserCourseVideoVoByVideoId(videoId, periodId);
+                }
+                if (vo != null){
+                    FsUserOperationLog operationLog = LOG_HOLDER.get();
+                    operationLog.setParam(JSON.toJSONString(vo));
+                    LOG_HOLDER.set(operationLog);
+                    StringBuilder details =new StringBuilder();
+                    details.append("课程:"+ vo.getCourseName() + " 的 " + vo.getTitle() + " 小节");
+                    return details.toString();
                 }
             }
         }