Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fs-service-system/src/main/java/com/fs/store/mapper/FsStoreOrderMapper.java
yfh 1 Minggu lalu
induk
melakukan
c9f3225861

+ 1 - 0
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -58,6 +58,7 @@ public class FsUserAdminController extends BaseController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId(loginUser.getCompany().getCompanyId());
         param.setCompanyUserId(String.valueOf(loginUser.getUser().getUserId()));
+        param.setIsAdmin(loginUser.getUser().isAdmin());
 
         if(param.getCompanyUserId() == null) {
             throw new IllegalArgumentException("当前销售不存在!");

+ 4 - 1
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -12,6 +12,7 @@ import com.fs.company.domain.CompanyTag;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyTagMapper;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
 import com.fs.course.mapper.*;
@@ -78,6 +79,8 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     private FsCourseWatchLogMapper fsCourseWatchLogMapper;
     @Autowired
     private FsCourseAnswerLogsMapper fsCourseAnswerLogsMapper;
+    @Autowired
+    CloudHostProper cloudHostProper;
 
     private static final String realLink = "/courseH5/pages/course/learning?course=";
     private static final String shortLink = "/courseH5/pages/course/learning?s=";
@@ -491,7 +494,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         graphics.fillRect(0, scaledHeight, scaledWidth, bottomHeight);
 
         // 绘制推荐区域(图片和文字)
-        drawRecommendationArea(graphics, file, scaledHeight, "云联融智", "为您推荐");
+        drawRecommendationArea(graphics, file, scaledHeight, cloudHostProper.getCompanyName(), "为您推荐");
 
         // 绘制二维码
         drawQRCode(graphics, url, scaledWidth, totalHeight);

+ 9 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -1,7 +1,10 @@
 package com.fs.store.mapper;
 
 import java.util.List;
+import java.util.Set;
+
 import com.fs.store.domain.FsUserCourseCount;
+import com.fs.store.vo.FsUserLastCount;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -79,4 +82,10 @@ public interface FsUserCourseCountMapper
      */
     void insertFsUserCourseCountTask(FsUserCourseCount fsUserCourseCount);
 
+    /**
+     * 查询会员最新的看课状态和心跳时间
+     * @return
+     */
+    List<FsUserLastCount> selectUserLastCount(@Param("userIds") Set<Long> userIds);
+
 }

+ 5 - 0
fs-service-system/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java

@@ -72,5 +72,10 @@ public class FsUserPageListParam implements Serializable {
      */
     private Long pcLoginUserId;
 
+    private Boolean isAdmin;
+
+
+
+
 }
 

+ 29 - 12
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -40,10 +40,7 @@ import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreCartDTO;
 import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.enums.BillDetailEnum;
-import com.fs.store.mapper.FsStoreOrderMapper;
-import com.fs.store.mapper.FsStoreProductAttrValueMapper;
-import com.fs.store.mapper.FsUserCompanyUserMapper;
-import com.fs.store.mapper.FsUserMapper;
+import com.fs.store.mapper.*;
 import com.fs.store.param.SelectCusListPageParam;
 import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
@@ -53,6 +50,7 @@ import com.fs.store.service.IFsUserService;
 import com.fs.store.service.cache.IFsUserCourseCountCacheService;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
+import com.fs.store.vo.FsUserLastCount;
 import com.fs.store.vo.FsUserTuiVO;
 import com.fs.store.vo.h5.*;
 import com.github.pagehelper.PageHelper;
@@ -135,6 +133,9 @@ public class FsUserServiceImpl implements IFsUserService
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
 
+    @Autowired
+    private FsUserCourseCountMapper fsUserCourseCountMapper;
+
     /**
      * 查询用户
      *
@@ -520,15 +521,26 @@ public class FsUserServiceImpl implements IFsUserService
     @Override
     public TableDataInfo selectFsUserPageListNew(FsUserPageListParam param) {
         // 找出下级销售
-//        String companyUserId = param.getCompanyUserId();
-//        if(companyUserId != null) {
-//            Long companyUser = Long.parseLong(companyUserId);
-//            Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
-//            param.setCompanyUserIds(userIds);
-//        }
+        String companyUserId = param.getCompanyUserId();
+        if(companyUserId != null) {
+            Long companyUser = Long.parseLong(companyUserId);
+            Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
+            if (userIds != null || userIds.size() <= 1) {
+                if (param.getIsAdmin()) {
+                    List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
+                    userIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toSet());
+                }
+            }
+            param.setCompanyUserIds(userIds);
+        }
 
         List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageListNew(param);
         Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
+        //获取会员的最新的看课状态和最后看课时间
+        Set<Long> userIds = fsUserPageListVOS.stream().map(FsUserPageListVO::getUserId).collect(Collectors.toSet());
+        List<FsUserLastCount> fsUserCourseCounts = fsUserCourseCountMapper.selectUserLastCount(userIds);
+        Map<Long, FsUserLastCount> countMap = fsUserCourseCounts.stream().collect(Collectors.toMap(FsUserLastCount::getUserId, Function.identity()));
+
         for (FsUserPageListVO item : fsUserPageListVOS) {
             if(item.getCompanyUserId() != null) {
                 String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(item.getCompanyUserId());
@@ -552,11 +564,16 @@ public class FsUserServiceImpl implements IFsUserService
                     item.setMissCourseCount(byUserId.getMissCourseCount());
                     item.setMissCourseStatus(byUserId.getMissCourseStatus());
                     if(StringUtils.isNotEmpty(byUserId.getPartCourseCount())){
-                        item.setPartCourseCount(Long.valueOf(byUserId.getPartCourseCount()));
+                        item.setPartCourseCount(new BigDecimal(byUserId.getPartCourseCount()).longValue());
                     }
-                    item.setCourseCountStatus(byUserId.getStatus());
+//                    item.setCourseCountStatus(byUserId.getStatus());
                     item.setStopWatchDays(byUserId.getStopWatchDays());
                     item.setCompleteWatchDate(byUserId.getCompleteWatchDate());
+                    item.setLastWatchDate(byUserId.getLastWatchDate());
+                }
+                FsUserLastCount fsUserCourseCount = countMap.get(item.getUserId());
+                if(fsUserCourseCount != null){
+                    item.setCourseCountStatus(fsUserCourseCount.getStatus());
                 }
                 String userTagByUserId = companyTagCacheService
                         .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());

+ 36 - 0
fs-service-system/src/main/java/com/fs/store/vo/FsUserLastCount.java

@@ -0,0 +1,36 @@
+package com.fs.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户看课统计对象 fs_user_course_count
+ *
+ * @author fs
+ * @date 2025-04-02
+ */
+@Data
+public class FsUserLastCount {
+    /**
+     * 用户id
+     */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /**
+     * 最后一次看课时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "最后一次看课时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastWatchDate;
+
+    /**
+     * 用户状态,1-正常;2-停止;3-未看
+     */
+    @Excel(name = "用户状态,1-正常;2-停止;3-未看")
+    private Long status;
+
+}

+ 3 - 0
fs-service-system/src/main/resources/application-druid-zkzh.yml

@@ -137,3 +137,6 @@ rocketmq:
         group: test-group
         access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
         secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+cloud_host:
+    company_name: 中康智慧
+

+ 11 - 1
fs-service-system/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -473,7 +473,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
     <select id="selectUserAllCompanyUserId" resultType="java.lang.Long">
-        select distinct user_id from company_user where parent_id=${companyUserId}
+--         select distinct user_id from company_user where parent_id=${companyUserId}
+            WITH RECURSIVE RecursiveUsers AS (
+                SELECT user_id, parent_id
+                FROM company_user
+                WHERE parent_id = ${companyUserId}
+                UNION ALL
+                SELECT cu.user_id, cu.parent_id
+                FROM company_user cu
+                         JOIN RecursiveUsers ru ON cu.parent_id = ru.user_id
+            )
+            SELECT DISTINCT user_id FROM RecursiveUsers;
     </select>
     <select id="selectCompanyUserNameUserById" resultType="java.lang.String">
         select concat(nick_name,'_',user_name) from company_user where user_id=${userId} limit 1

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

@@ -541,10 +541,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                and o.company_id=#{companyId}
             </if>
             <if test= 'sTime != null '>
-                and o.create_time &gt;= #{startDate}
+                and o.create_time &gt;= #{sTime}
             </if>
             <if test='eTime != null '>
-                and o.create_time &lt;= #{endDate}
+                and o.create_time &lt;= #{eTime}
             </if>
             <if test ='courseId !=null'>
                 and o.course_id = #{courseId}
@@ -566,7 +566,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         GROUP BY o.video_id,o.user_id,DATE(o.create_time),o.project,o.course_id
         ORDER BY o.video_id ,DATE(o.create_time)
 
-        limit ${(maps.pageNum-1)*maps.pageSize},${maps.pageSize}
+        limit ${(pageNum-1)*pageSize},${pageSize}
     </select>
     <select id="selectFsCourseWatchLogListVONew" resultType="com.fs.course.vo.FsCourseWatchLogListVO">
         SELECT

+ 27 - 1
fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -55,7 +55,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
     <select id="findByUserId" resultType="com.fs.store.domain.FsUserCourseCount">
-        select * from fs_user_course_count where user_id = ${userId} limit 1
+        select
+            fs_user_course_count.user_id,
+            ifnull ( sum( fs_user_course_count.watch_course_count ), 0 ) AS watch_course_count,
+            ifnull ( sum( fs_user_course_count.miss_course_count ), 0 ) AS miss_course_count,
+            ifnull ( sum( fs_user_course_count.part_course_count ), 0 ) AS part_course_count,
+            Max( fs_user_course_count.last_watch_date ) AS last_watch_date,
+            ifnull ( sum( fs_user_course_count.stop_watch_days ), 0 ) AS stop_watch_days,
+            Max( fs_user_course_count.complete_watch_date) AS complete_watch_date
+            from fs_user_course_count where user_id = ${userId}
     </select>
 
     <insert id="insertFsUserCourseCount" parameterType="FsUserCourseCount">
@@ -245,5 +253,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </trim>
     </insert>
 
+    <select id="selectUserLastCount" resultType="FsUserLastCount">
+        SELECT
+            fs_user_course_count.user_id,
+            fs_user_course_count.`status`,
+            fs_user_course_count.last_watch_date
+        FROM
+            fs_user_course_count
+                INNER JOIN ( SELECT MAX( id ) AS id FROM fs_user_course_count
+                where fs_user_course_count.user_id in
+                <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+                    #{userId}
+                </foreach>
+                GROUP BY user_id ) t2 ON fs_user_course_count.id = t2.id
+                where fs_user_course_count.user_id in
+                <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+                    #{userId}
+                </foreach>
+    </select>
 
 </mapper>