Long преди 2 месеца
родител
ревизия
b6bfe398fa

+ 6 - 3
fs-company-app/src/main/java/com/fs/app/controller/CompanyTagController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyTag;
 import com.fs.company.service.ICompanyTagService;
 import com.fs.company.service.ICompanyTagUserService;
@@ -42,8 +43,10 @@ public class CompanyTagController extends AppBaseController {
         log.debug("查询公司标签列表 keyword: {}, pageNum: {}, pageSize: {}", keyword, pageNum, pageSize);
 
         Map<String, Object> params = new HashMap<>();
-        params.put("keyword", keyword);
         params.put("companyId", getCompanyId());
+        if (StringUtils.isNotBlank(keyword)) {
+            params.put("keyword", keyword.split(","));
+        }
 
         PageHelper.startPage(pageNum, pageSize);
         List<CompanyTag> list = companyTagService.selectCompanyTagListByMap(params);
@@ -78,9 +81,9 @@ public class CompanyTagController extends AppBaseController {
     @Login
     @GetMapping("/tagSubUsers")
     @ApiOperation("标签下会员列表")
-    public R tagSubUsers(@RequestParam Long tagId) {
+    public R tagSubUsers(@RequestParam List<Long> tagId) {
         Map<String, Object> params = new HashMap<>();
-        params.put("tagId", tagId);
+        params.put("tagIds", tagId);
         params.put("companyId", getCompanyId());
         return R.ok().put("data", companyTagUserService.selectUserListByMap(params));
     }

+ 21 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -1,11 +1,13 @@
 package com.fs.app.controller;
 
+import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.param.newfs.FsUserCourseListParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.vo.FsUserCourseParticipationRecordVO;
 import com.fs.course.vo.newfs.FsUserCourseListVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
@@ -70,4 +72,23 @@ public class FsUserCourseVideoController extends AppBaseController {
         PageInfo<FsUserVideoListVO> result = new PageInfo<>(listCourseVideo);
         return ResponseResult.ok(result);
     }
+
+    @Login
+    @ApiOperation("参与记录")
+    @GetMapping("/participationRecord")
+    public ResponseResult<Object> participationRecord(@RequestParam Long courseId,
+                                                      @RequestParam Integer type,
+                                                      @RequestParam(required = false) String keyword,
+                                                      @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                                                      @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
+        log.debug("参与记录 keyword: {}, pageNum: {}, pageSize: {}", keyword, pageNum, pageSize);
+        Map<String, Object> params = new HashMap<>();
+        params.put("courseId", courseId);
+        params.put("type", type);
+        params.put("keyword", keyword);
+
+        PageHelper.startPage(pageNum, pageSize);
+        List<FsUserCourseParticipationRecordVO> record = fsUserCourseService.getParticipationRecordByMap(params);
+        return ResponseResult.ok(new PageInfo<>(record));
+    }
 }

+ 1 - 11
fs-company-app/src/main/java/com/fs/app/exception/FSExceptionHandler.java

@@ -54,17 +54,7 @@ public class FSExceptionHandler {
 	@ExceptionHandler(Exception.class)
 	public R handleException(Exception e){
 		logger.error(e.getMessage(), e);
-		if (e instanceof BindException){
-			BindException ex = (BindException)e;
-			List<ObjectError> allErrors = ex.getAllErrors();//捕获的所有错误对象
-			ObjectError error = allErrors.get(0);
-			String defaultMessage = error.getDefaultMessage();//异常内容
-
-			return R.error(defaultMessage);
-		}else {
-			return R.error(e.getMessage());
-		}
-
+		return R.error("系统异常");
 	}
 	@ExceptionHandler(BindException.class)
 	public R bindExceptionHandler(BindException e) {

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

@@ -68,4 +68,11 @@ public interface CompanyTagMapper
      * @return list
      */
     List<CompanyTag> selectCompanyTagListByMap(@Param("params") Map<String, Object> params);
+
+    /**
+     * 查询用户标签列表
+     * @param userId    用户ID
+     * @return  list
+     */
+    List<CompanyTag> selectCompanyTagListByUserId(@Param("userId") Long userId);
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java

@@ -1,6 +1,8 @@
 package com.fs.course.mapper;
 
 import java.util.List;
+import java.util.Map;
+
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.param.FsUserCourseAddStudyCourseParam;
 import com.fs.course.param.FsUserCourseListUParam;
@@ -231,4 +233,10 @@ public interface FsUserCourseMapper
 
     List<FsUserCourseListVO> getFsUserCourseList(FsUserCourseListParam param);
 
+    /**
+     * 查询用户参与记录
+     * @param params 条件
+     * @return  list
+     */
+    List<FsUserCourseParticipationRecordVO> getParticipationRecordByMap(@Param("params") Map<String, Object> params);
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseService.java

@@ -111,4 +111,11 @@ public interface IFsUserCourseService
      * @return
      */
     List<FsUserCourseListVO> getFsUserCourseList(FsUserCourseListParam param);
+
+    /**
+     * 查询用户参与记录
+     * @param params 条件
+     * @return  list
+     */
+    List<FsUserCourseParticipationRecordVO> getParticipationRecordByMap(Map<String, Object> params);
 }

+ 22 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -5,6 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyTag;
+import com.fs.company.domain.CompanyTagUser;
+import com.fs.company.mapper.CompanyTagMapper;
+import com.fs.company.mapper.CompanyTagUserMapper;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.domain.FsUserCourseStudy;
 import com.fs.course.domain.FsUserCourseStudyLog;
@@ -46,6 +51,8 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     private FsUserCourseStudyMapper fsUserCourseStudyMapper;
     @Autowired
     private FsUserCourseStudyLogMapper fsUserCourseStudyLogMapper;
+    @Autowired
+    private CompanyTagMapper companyTagMapper;
 
     /**
      * 查询课程
@@ -368,4 +375,19 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     public List<FsUserCourseListVO> getFsUserCourseList(FsUserCourseListParam param) {
         return fsUserCourseMapper.getFsUserCourseList(param);
     }
+
+    /**
+     * 查询用户参与记录
+     * @param params 条件
+     * @return  list
+     */
+    @Override
+    public List<FsUserCourseParticipationRecordVO> getParticipationRecordByMap(Map<String, Object> params) {
+        List<FsUserCourseParticipationRecordVO> list = fsUserCourseMapper.getParticipationRecordByMap(params);
+        list.forEach(recordVO -> {
+            List<CompanyTag> companyTags = companyTagMapper.selectCompanyTagListByUserId(recordVO.getUserId());
+            recordVO.setTags(companyTags);
+        });
+        return list;
+    }
 }

+ 66 - 0
fs-service-system/src/main/java/com/fs/course/vo/FsUserCourseParticipationRecordVO.java

@@ -0,0 +1,66 @@
+package com.fs.course.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.company.domain.CompanyTag;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class FsUserCourseParticipationRecordVO {
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 课程ID
+     */
+    private Long courseId;
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 头像
+     */
+    private String avatar;
+    /**
+     * 用户电话号码
+     */
+    private String phoneNumber;
+    /**
+     * 注册时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTime;
+    /**
+     * 观看次数
+     */
+    private Integer watchCount;
+    /**
+     * 完播次数
+     */
+    private Integer finishCount;
+    /**
+     * 累计时长
+     */
+    private Integer watchTime;
+    /**
+     * 红包领取状态
+     */
+    private Integer redStatus;
+    /**
+     * 观看时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime watchDate;
+    /**
+     * 标签
+     */
+    private List<CompanyTag> tags;
+}

+ 13 - 2
fs-service-system/src/main/resources/mapper/company/CompanyTagMapper.xml

@@ -28,11 +28,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where tag_id = #{tagId}
     </select>
 
+    <!-- 查询标签列表 -->
     <select id="selectCompanyTagListByMap" resultType="com.fs.company.domain.CompanyTag">
         select ct.* from company_tag ct
         <where>
-            <if test="params.keyword != null and params.keyword != ''">
-                ct.tab like concat('%', #{params.keyword}, '%')
+            <if test="params.keyword != null and params.keyword.length > 0">
+                and
+                <foreach collection="params.keyword" item="item"  open="(" separator="or" close=")">
+                    ct.tag like concat('%',#{item},'%')
+                </foreach>
             </if>
             <if test="params.companyId != null">
                 and ct.company_id = #{params.companyId}
@@ -40,6 +44,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
+    <!-- 查询用户标签列表 -->
+    <select id="selectCompanyTagListByUserId" resultType="com.fs.company.domain.CompanyTag">
+        select ct.* from company_tag ct
+        inner join company_tag_user ctu on find_in_set(ct.tag_id, ctu.tag_ids) > 0
+        where ctu.user_id = #{userId}
+    </select>
+
     <insert id="insertCompanyTag" parameterType="CompanyTag" useGeneratedKeys="true" keyProperty="tagId">
         insert into company_tag
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 4 - 1
fs-service-system/src/main/resources/mapper/company/CompanyTagUserMapper.xml

@@ -102,7 +102,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             fu.nickname as userName
         from company_tag_user ctu
         inner join fs_user fu on fu.user_id = ctu.user_id
-        where ctu.company_id = #{params.companyId} and find_in_set(#{params.tagId}, ctu.tag_ids)
+        where ctu.company_id = #{params.companyId} and
+        <foreach collection="params.tagIds" item="tagId" open="(" separator="or" close=")">
+            find_in_set(#{tagId}, ctu.tag_ids)
+        </foreach>
     </select>
 
 </mapper>

+ 64 - 0
fs-service-system/src/main/resources/mapper/course/FsUserCourseMapper.xml

@@ -249,4 +249,68 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY
             c.course_id
     </select>
+
+    <!-- 查询用户参与记录 -->
+    <select id="getParticipationRecordByMap" resultType="com.fs.course.vo.FsUserCourseParticipationRecordVO">
+        select distinct
+            fu.user_id,
+            fuc.course_id,
+            fu.nickname as nickName,
+            fu.username as userName,
+            fu.avatar,
+            fu.phone as phoneNumber,
+            fu.create_time,
+            fcwl.create_time as watchDate,
+            ifnull(t1.watchCount, 0) as watchCount,
+            ifnull(t1.finishCount, 0) as finishCount,
+            ifnull(t1.watchTime, 0 ) as watchTime,
+            if(ifnull(t2.redcount, 0) > 0, 1, 0) AS redStatus
+        from fs_user_course fuc
+        inner join fs_course_watch_log fcwl on fcwl.course_id = fuc.course_id
+        inner join fs_user fu on fu.user_id = fcwl.user_id
+        left join (
+            select user_id,
+                count(log_id) AS watchCount,
+                count(case when log_type = 2 then log_id end) AS finishCount,
+                sum(duration) AS watchTime
+            from fs_course_watch_log
+            group by user_id
+        ) t1 on t1.user_id = fu.user_id
+        left join (
+            select user_id, course_id, count(log_id) as redcount
+            from fs_course_red_packet_log
+            group by user_id, course_id
+        ) t2 on t2.user_id = fu.user_id and t2.course_id = fuc.course_id
+        <if test="params.type == 0">
+            left join  (
+                select user_id, course_id, count(log_id) as count
+                from fs_course_answer_logs
+                where is_right = 1
+                group by user_id, course_id
+            ) t3 on t3.user_id = fu.user_id and t3.course_id = fuc.course_id
+        </if>
+        where fuc.course_id = #{params.courseId}
+        <if test="params.keyword != null and params.keyword != ''">
+            and (
+                fu.user_id = #{params.keyword}
+                or fu.nickname like concat('%', #{params.keyword}, '%')
+                or fu.username like concat('%', #{params.keyword}, '%')
+                or fu.phone = #{params.keyword}
+            )
+        </if>
+        <choose>
+            <when test="params.type == 0">
+                and t3.count > 0
+            </when>
+            <when test="params.type == 1">
+                and fcwl.log_type = 2
+            </when>
+            <when test="params.type == 2">
+                and fcwl.log_type in (1,4)
+            </when>
+            <otherwise>
+                and fcwl.log_type = 3
+            </otherwise>
+        </choose>
+    </select>
 </mapper>