Просмотр исходного кода

调整统计数据,优化逻辑

yfh 3 дней назад
Родитель
Сommit
ddbd1dd64d

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoPageListVO.java

@@ -58,6 +58,9 @@ public class FsUserCourseVideoPageListVO extends BaseEntity {
     @ApiModelProperty(value = "营期id")
     private Long periodId;
 
+    @ApiModelProperty(value = "营期名称")
+    private String periodName;
+
     @ApiModelProperty(value = "营期课程ID")
     private Long id;
 

+ 8 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -411,4 +411,12 @@ public interface FsUserMapper
 
     @Update("update fs_user set status = 0,phone = null,union_id = null,is_del = 1 where user_id = #{userId}")
     void removeUser(Long userId);
+
+
+    /**
+     * 统计用户相关数据(课程、答题、红包)
+     */
+    Map<String, Object> countUserStats(
+            UserStatisticsCommonParam param);
+
 }

+ 191 - 171
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -6,6 +6,8 @@ import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -19,6 +21,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.domain.entity.SysDictData;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
@@ -103,9 +106,9 @@ import static com.fs.hisStore.enums.BillDetailEnum.CATEGORY_3;
  * @date 2023-06-07
  */
 @Service
-public class FsUserServiceImpl implements IFsUserService
-{
-    Logger logger= LoggerFactory.getLogger(getClass());;
+public class FsUserServiceImpl implements IFsUserService {
+    Logger logger = LoggerFactory.getLogger(getClass());
+    ;
     @Autowired
     private FsUserMapper fsUserMapper;
     @Autowired
@@ -155,6 +158,9 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Autowired
     private CompanyRoleMapper companyRoleMapper;
+
+    @Autowired
+    private RedisCache redisCache;
     @Autowired
     private IFsUserProjectTagService userProjectTagService;
 
@@ -177,8 +183,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 用户
      */
     @Override
-    public FsUser selectFsUserByUserId(Long userId)
-    {
+    public FsUser selectFsUserByUserId(Long userId) {
         return fsUserMapper.selectFsUserByUserId(userId);
     }
 
@@ -199,8 +204,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 用户
      */
     @Override
-    public List<FsUser> selectFsUserList(FsUser fsUser)
-    {
+    public List<FsUser> selectFsUserList(FsUser fsUser) {
         return fsUserMapper.selectFsUserList(fsUser);
     }
 
@@ -212,10 +216,9 @@ public class FsUserServiceImpl implements IFsUserService
      */
     @Override
     @Transactional
-    public int insertFsUser(FsUser fsUser)
-    {
+    public int insertFsUser(FsUser fsUser) {
         fsUser.setCreateTime(DateUtils.getNowDate());
-        if (StringUtils.isNotEmpty(fsUser.getPhone())){
+        if (StringUtils.isNotEmpty(fsUser.getPhone())) {
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
         }
         int i = fsUserMapper.insertFsUser(fsUser);
@@ -234,12 +237,11 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 结果
      */
     @Override
-    public int updateFsUser(FsUser fsUser)
-    {
+    public int updateFsUser(FsUser fsUser) {
         fsUser.setUpdateTime(DateUtils.getNowDate());
-        if (fsUser.getPhone()!=null&&fsUser.getPhone().length()==11&&fsUser.getPhone().matches("\\d+")){
+        if (fsUser.getPhone() != null && fsUser.getPhone().length() == 11 && fsUser.getPhone().matches("\\d+")) {
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
-        }else {
+        } else {
             fsUser.setPhone(null);
         }
         return fsUserMapper.updateFsUser(fsUser);
@@ -252,8 +254,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 结果
      */
     @Override
-    public int deleteFsUserByUserIds(Long[] userIds)
-    {
+    public int deleteFsUserByUserIds(Long[] userIds) {
         for (Long userId : userIds) {
             fsUserMapper.updateFsUserByUserId(userId);
         }
@@ -267,8 +268,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 结果
      */
     @Override
-    public int deleteFsUserByUserId(Long userId)
-    {
+    public int deleteFsUserByUserId(Long userId) {
         return fsUserMapper.updateFsUserByUserId(userId);
     }
 
@@ -318,6 +318,7 @@ public class FsUserServiceImpl implements IFsUserService
     public List<FsUserExportListVO> selectFsUserExportListVO(FsUserParam fsUser) {
         return fsUserMapper.selectFsUserExportListVO(fsUser);
     }
+
     @Autowired
     private FsUserIntegralLogsMapper integralLogsMapper;
 
@@ -326,9 +327,9 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     @Transactional
-    public void addUserIntegral(BigDecimal payMoney,Long userId,Long orderId ,Integer orderType) {
-        String json =configService.selectConfigByKey("his.integral");
-        IntegralConfig config = JSONUtil.toBean(json,IntegralConfig.class);
+    public void addUserIntegral(BigDecimal payMoney, Long userId, Long orderId, Integer orderType) {
+        String json = configService.selectConfigByKey("his.integral");
+        IntegralConfig config = JSONUtil.toBean(json, IntegralConfig.class);
 
         int points = payMoney.intValue() * config.getIntegralRatio();
 
@@ -348,7 +349,7 @@ public class FsUserServiceImpl implements IFsUserService
     /**
      * 判断是否节气套餐包
      */
-    private boolean isSolarTerm(Long orderId ,Integer orderType) {
+    private boolean isSolarTerm(Long orderId, Integer orderType) {
         if (orderType == 2) {
             FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderId(orderId);
             if (Objects.nonNull(fsStoreOrder.getPackageId())) {
@@ -369,34 +370,34 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     @Transactional
-    public void followAddIntegral(Long userId,Long orderId) {
+    public void followAddIntegral(Long userId, Long orderId) {
         FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
-        if(fsUser!=null){
-            String json =configService.selectConfigByKey("his.integral");
-            IntegralConfig config= JSONUtil.toBean(json,IntegralConfig.class);
-            Integer todayTotalIntegral= integralLogsMapper.selectTodayTotalIntegral(config.getIntegralTypeByOneDay(),userId);
-            if (todayTotalIntegral==null){
-                todayTotalIntegral=0;
+        if (fsUser != null) {
+            String json = configService.selectConfigByKey("his.integral");
+            IntegralConfig config = JSONUtil.toBean(json, IntegralConfig.class);
+            Integer todayTotalIntegral = integralLogsMapper.selectTodayTotalIntegral(config.getIntegralTypeByOneDay(), userId);
+            if (todayTotalIntegral == null) {
+                todayTotalIntegral = 0;
             }
-            if (todayTotalIntegral!=null&&todayTotalIntegral>=config.getIntegralByOneDay()){
+            if (todayTotalIntegral != null && todayTotalIntegral >= config.getIntegralByOneDay()) {
                 return;
             }
-            Long integral = config.getIntegralFollow()+0L;
-                FsUser u = new FsUser();
-                u.setUserId(userId);
-                u.setIntegral(fsUser.getIntegral()+integral);
-                fsUserMapper.updateFsUser(u);
-                logger.info("用户{}获取积分{}",fsUser.getUserId(),integral);
-                //写入日志
-                FsUserIntegralLogs logs = new FsUserIntegralLogs();
-                logs.setIntegral(integral.longValue());
-                logs.setBusinessType(4);
-                logs.setUserId(userId);
-                logs.setBalance(u.getIntegral());
-                logs.setLogType(6);
-                logs.setBusinessId(orderId.toString());
-                logs.setCreateTime(new Date());
-                integralLogsMapper.insertFsUserIntegralLogs(logs);
+            Long integral = config.getIntegralFollow() + 0L;
+            FsUser u = new FsUser();
+            u.setUserId(userId);
+            u.setIntegral(fsUser.getIntegral() + integral);
+            fsUserMapper.updateFsUser(u);
+            logger.info("用户{}获取积分{}", fsUser.getUserId(), integral);
+            //写入日志
+            FsUserIntegralLogs logs = new FsUserIntegralLogs();
+            logs.setIntegral(integral.longValue());
+            logs.setBusinessType(4);
+            logs.setUserId(userId);
+            logs.setBalance(u.getIntegral());
+            logs.setLogType(6);
+            logs.setBusinessId(orderId.toString());
+            logs.setCreateTime(new Date());
+            integralLogsMapper.insertFsUserIntegralLogs(logs);
 
         }
     }
@@ -404,26 +405,26 @@ public class FsUserServiceImpl implements IFsUserService
     @Transactional
     public void subIntegral(Long userId) {
         FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
-        if(fsUser!=null&&fsUser.getIntegral()!=0){
+        if (fsUser != null && fsUser.getIntegral() != 0) {
             Long integral = fsUser.getIntegral();
             fsUser.setIntegral(0L);
             fsUserMapper.updateFsUser(fsUser);
-            logger.info("用户{}扣除积分{}",fsUser.getUserId(),0-integral);
+            logger.info("用户{}扣除积分{}", fsUser.getUserId(), 0 - integral);
             FsUserIntegralLogs logs = new FsUserIntegralLogs();
-            logs.setIntegral(0-integral);
+            logs.setIntegral(0 - integral);
             logs.setUserId(userId);
             logs.setBalance(0L);
             logs.setLogType(7);
             logs.setCreateTime(new Date());
             integralLogsMapper.insertFsUserIntegralLogs(logs);
-            }
-
         }
 
+    }
+
     @Override
     public FsUserFollowDoctorVO getUserFollowDoctorAndOrderId(Long userId) {
         FsUserFollowDoctorVO fsUserFollowDoctorVO = fsStoreOrderMapper.selectFsFollowDoctorIdByUserId(userId);
-        if (fsUserFollowDoctorVO!=null&&fsUserFollowDoctorVO.getFollowDoctorId()!=null){
+        if (fsUserFollowDoctorVO != null && fsUserFollowDoctorVO.getFollowDoctorId() != null) {
             Long followId = fsFollowMapper.selectFsFollowByStoreOrderId(fsUserFollowDoctorVO.getOrderId());
             fsUserFollowDoctorVO.setFollowId(followId);
         }
@@ -438,34 +439,34 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     @Transactional
-    public void subUserIntegral(Long userId,Long orderId ,Integer orderType) {
-            FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
-            if(fsUser!=null){
-                FsUserIntegralLogs maps=new FsUserIntegralLogs();
-                maps.setLogType(2);
-                maps.setBusinessType(orderType);
-                maps.setBusinessId(orderId.toString());
-                List<FsUserIntegralLogs> logsList=integralLogsMapper.selectFsUserIntegralLogsList(maps);
-                if(logsList.size()>0){
-                    for (FsUserIntegralLogs userLogs : logsList) {
-                        fsUser.setIntegral(fsUser.getIntegral()-userLogs.getIntegral());
-                        fsUserMapper.updateFsUser(fsUser);
-                        logger.info("用户{}扣除积分{}",fsUser.getUserId(),userLogs.getIntegral());
-                        //写入日志
-                        FsUserIntegralLogs logs = new FsUserIntegralLogs();
-                        logs.setIntegral(-logsList.get(0).getIntegral());
-                        logs.setUserId(userId);
-                        logs.setBalance(fsUser.getIntegral());
-                        logs.setBusinessType(orderType);
-                        logs.setLogType(4);
-                        logs.setBusinessId(orderId.toString());
-                        logs.setCreateTime(new Date());
-                        integralLogsMapper.insertFsUserIntegralLogs(logs);
-                    }
+    public void subUserIntegral(Long userId, Long orderId, Integer orderType) {
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
+        if (fsUser != null) {
+            FsUserIntegralLogs maps = new FsUserIntegralLogs();
+            maps.setLogType(2);
+            maps.setBusinessType(orderType);
+            maps.setBusinessId(orderId.toString());
+            List<FsUserIntegralLogs> logsList = integralLogsMapper.selectFsUserIntegralLogsList(maps);
+            if (logsList.size() > 0) {
+                for (FsUserIntegralLogs userLogs : logsList) {
+                    fsUser.setIntegral(fsUser.getIntegral() - userLogs.getIntegral());
+                    fsUserMapper.updateFsUser(fsUser);
+                    logger.info("用户{}扣除积分{}", fsUser.getUserId(), userLogs.getIntegral());
+                    //写入日志
+                    FsUserIntegralLogs logs = new FsUserIntegralLogs();
+                    logs.setIntegral(-logsList.get(0).getIntegral());
+                    logs.setUserId(userId);
+                    logs.setBalance(fsUser.getIntegral());
+                    logs.setBusinessType(orderType);
+                    logs.setLogType(4);
+                    logs.setBusinessId(orderId.toString());
+                    logs.setCreateTime(new Date());
+                    integralLogsMapper.insertFsUserIntegralLogs(logs);
                 }
-
             }
 
+        }
+
     }
 
     @Override
@@ -486,7 +487,7 @@ public class FsUserServiceImpl implements IFsUserService
         user.setIsVip(0);
         user.setVipStartDate(null);
         user.setVipEndDate(null);
-        if (fsUserMapper.updateFsUser(user)>0){
+        if (fsUserMapper.updateFsUser(user) > 0) {
             return R.ok("清除成功");
         }
         return R.error("清除vip失败");
@@ -534,7 +535,7 @@ public class FsUserServiceImpl implements IFsUserService
         map.put("tagName", "重粉");
         List<CompanyTag> companyTags = companyTagMapper.selectCompanyTagListByMap(map);
         Long tagId;
-        if(companyTags == null || companyTags.isEmpty()){
+        if (companyTags == null || companyTags.isEmpty()) {
             CompanyTag companyTag = new CompanyTag();
             companyTag.setCompanyId(param.getCompanyId());
             companyTag.setTag("重粉");
@@ -548,7 +549,7 @@ public class FsUserServiceImpl implements IFsUserService
         companyTagUserParam.setUserId(param.getUserId());
         companyTagUserParam.setTagIds(tagId.toString());
         List<CompanyTagUser> companyTagUsers = companyTagUserMapper.selectCompanyTagUserList(companyTagUserParam);
-        if(companyTagUsers == null || companyTagUsers.isEmpty()){
+        if (companyTagUsers == null || companyTagUsers.isEmpty()) {
             CompanyTagUser companyTagUser = new CompanyTagUser();
             companyTagUser.setUserId(param.getUserId());
             companyTagUser.setCompanyId(param.getCompanyId());
@@ -562,12 +563,12 @@ public class FsUserServiceImpl implements IFsUserService
     @Override
     public PageInfo<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser!=null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
         }
         //筛选问题
-        if (StringUtils.isNotBlank(param.getCompanyUserId())){
+        if (StringUtils.isNotBlank(param.getCompanyUserId())) {
             param.setUserId(Long.valueOf(param.getCompanyUserId()));
         }
 
@@ -586,7 +587,7 @@ public class FsUserServiceImpl implements IFsUserService
         List<SysDictData> courseProject = dictDataMapper.selectDictDataByType("sys_course_project");
         for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
             if (courseProject != null && !courseProject.isEmpty()) {
-                if (fsUserPageListVO.getProjectId() != null){
+                if (fsUserPageListVO.getProjectId() != null) {
                     // 项目
                     courseProject.stream()
                             .filter(c -> c.getDictValue().equals(fsUserPageListVO.getProjectId().toString()))
@@ -594,15 +595,15 @@ public class FsUserServiceImpl implements IFsUserService
                             .ifPresent(c -> fsUserPageListVO.setProjectName(c.getDictLabel()));
                 }
             }
-            if (StringUtils.isEmpty(fsUserPageListVO.getNickname())){
+            if (StringUtils.isEmpty(fsUserPageListVO.getNickname())) {
                 fsUserPageListVO.setNickname("用户暂未授权昵称");
             }
 
             //解密
-            if(fsUserPageListVO.getPhone() != null && fsUserPageListVO.getPhone() != ""){
-                if (fsUserPageListVO.getPhone().length()>11){
+            if (fsUserPageListVO.getPhone() != null && fsUserPageListVO.getPhone() != "") {
+                if (fsUserPageListVO.getPhone().length() > 11) {
                     fsUserPageListVO.setPhone(decryptPhoneMk(fsUserPageListVO.getPhone()));
-                }else {
+                } else {
                     fsUserPageListVO.setPhone(fsUserPageListVO.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
             }
@@ -616,7 +617,7 @@ public class FsUserServiceImpl implements IFsUserService
         String[] splitTag = tag.split(",");
         StringBuilder newTag = new StringBuilder();
         for (String s : splitTag) {
-            if(!"重粉".equals(s)){
+            if (!"重粉".equals(s)) {
                 newTag.append(s);
             }
         }
@@ -655,7 +656,7 @@ public class FsUserServiceImpl implements IFsUserService
     public TableDataInfo selectFsUserPageListNew(FsUserPageListParam param) {
         // 找出下级销售
         String companyUserId = param.getCompanyUserId();
-        if(StringUtils.isNotBlank(companyUserId)) {
+        if (StringUtils.isNotBlank(companyUserId)) {
             Long companyUser = Long.parseLong(companyUserId);
             Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
             if (userIds != null || userIds.size() <= 1) {
@@ -672,34 +673,34 @@ public class FsUserServiceImpl implements IFsUserService
         //获取会员的最新的看课状态和最后看课时间
         Set<Long> userIds = fsUserPageListVOS.stream().map(FsUserPageListVO::getUserId).collect(Collectors.toSet());
         List<FsUserLastCount> fsUserCourseCounts = Collections.emptyList();
-        if(!userIds.isEmpty()){
+        if (!userIds.isEmpty()) {
             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) {
+            if (item.getCompanyUserId() != null) {
                 String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(item.getCompanyUserId());
-                if(companyUserName != null) {
+                if (companyUserName != null) {
                     item.setCompanyUserNickName(companyUserName);
                 }
             }
-            if(item.getPhone() != null) {
+            if (item.getPhone() != null) {
                 item.setPhone(ParseUtils.parsePhone(item.getPhone()));
             }
-            if(item.getStatus() != null) {
+            if (item.getStatus() != null) {
                 String userStatus = DictUtils.getDictLabel("user_status", String.valueOf(item.getStatus()));
-                if(StringUtils.isNotBlank(userStatus)){
+                if (StringUtils.isNotBlank(userStatus)) {
                     item.setStatusText(userStatus);
                 }
             }
-            if(item.getUserId() != null) {
+            if (item.getUserId() != null) {
                 FsUserCourseCount byUserId = fsUserCourseCountCacheService.findByUserId(item.getUserId());
-                if(byUserId != null) {
+                if (byUserId != null) {
                     item.setWatchCourseCount(byUserId.getWatchCourseCount());
                     item.setMissCourseCount(byUserId.getMissCourseCount());
                     item.setMissCourseStatus(byUserId.getMissCourseStatus());
-                    if(StringUtils.isNotEmpty(byUserId.getPartCourseCount())){
+                    if (StringUtils.isNotEmpty(byUserId.getPartCourseCount())) {
                         item.setPartCourseCount(new BigDecimal(byUserId.getPartCourseCount()).longValue());
                     }
 //                    item.setCourseCountStatus(byUserId.getStatus());
@@ -708,25 +709,25 @@ public class FsUserServiceImpl implements IFsUserService
                     item.setLastWatchDate(byUserId.getLastWatchDate());
                 }
                 FsUserLastCount fsUserCourseCount = countMap.get(item.getUserId());
-                if(fsUserCourseCount != null){
+                if (fsUserCourseCount != null) {
                     item.setCourseCountStatus(fsUserCourseCount.getStatus());
                 }
                 String userTagByUserId = companyTagCacheService
-                        .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());
-                if(StringUtils.isNotEmpty(userTagByUserId)) {
+                        .findUserTagByUserId(item.getUserId(), item.getCompanyUserId());
+                if (StringUtils.isNotEmpty(userTagByUserId)) {
                     String[] split = userTagByUserId.split(",");
                     Set<String> tagNames = new HashSet<>();
                     for (String tag : split) {
-                        if(StringUtils.isNotBlank(tag)) {
+                        if (StringUtils.isNotBlank(tag)) {
                             Long tagL = Long.parseLong(tag);
                             CompanyTag companyTag = tagMap.get(tagL);
-                            if(companyTag != null) {
+                            if (companyTag != null) {
                                 tagNames.add(companyTag.getTag());
                             }
                         }
                     }
                     item.setTagIds(userTagByUserId);
-                    item.setTag(String.join(",",tagNames));
+                    item.setTag(String.join(",", tagNames));
                 }
 
                 // 是否宠粉
@@ -737,10 +738,10 @@ public class FsUserServiceImpl implements IFsUserService
             }
 
             // 解密
-            if(item.getPhone() != null && item.getPhone() != ""){
-                if (item.getPhone().length()>11){
+            if (item.getPhone() != null && item.getPhone() != "") {
+                if (item.getPhone().length() > 11) {
                     item.setPhone(decryptPhoneMk(item.getPhone()));
-                }else {
+                } else {
                     item.setPhone(item.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
             }
@@ -755,14 +756,15 @@ public class FsUserServiceImpl implements IFsUserService
         rspData.setTotal(this.selectFsUserCount(param));
         return rspData;
     }
+
     @Override
     public Long selectFsUserCount(FsUserPageListParam param) {
         return fsUserMapper.selectFsUserPageListCount(param);
     }
 
     @Override
-    public Long selectFsUserCount(int type,Long companyId,Long companyUserId) {
-        return fsUserMapper.selectFsUserCount(type,companyId,companyUserId);
+    public Long selectFsUserCount(int type, Long companyId, Long companyUserId) {
+        return fsUserMapper.selectFsUserCount(type, companyId, companyUserId);
     }
 
     @Override
@@ -780,7 +782,7 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
@@ -803,13 +805,13 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag, Long userCompanyId) {
-        UserDetailsVO countWatchCourse = fsUserMapper.getCountWatchCourse(userId, fsUserId, dateTag,userCompanyId);
+        UserDetailsVO countWatchCourse = fsUserMapper.getCountWatchCourse(userId, fsUserId, dateTag, userCompanyId);
         FsUserCompanyUser fsUserCompanyUser = userCompanyUserService.selectFsUserCompanyUserById(userCompanyId);
 
         UserDetailsVO countAnswer = fsUserMapper.getCountAnswer(fsUserCompanyUser.getCompanyUserId(), fsUserId, dateTag);
         UserDetailsVO countRedPacket = fsUserMapper.getCountRedPacket(fsUserCompanyUser.getCompanyUserId(), fsUserId, dateTag);
         UserDetailsVO vo = new UserDetailsVO();
-        if (countWatchCourse != null){
+        if (countWatchCourse != null) {
             BeanUtils.copyProperties(countWatchCourse, vo);
         }
         if (countRedPacket != null) {
@@ -835,7 +837,7 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
@@ -856,12 +858,12 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 判断是否是管理员
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
         }
         //统计课程数据详情,在查询统计详情的时候需要显示
         Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetailsNew(param);
-        if(courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null){
+        if (courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null) {
             userStatisticsVO.setCourseNum(Integer.parseInt(courseDetailsMap.get("courseNum").toString()))
                     .setVideoNum(Integer.parseInt(courseDetailsMap.get("videoNum").toString()))
                     .setCourseUserNum(Integer.parseInt(courseDetailsMap.get("courseUserNum").toString()));
@@ -874,7 +876,7 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 判断是否是管理员
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
         }
@@ -909,7 +911,7 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 获取红包统计
         Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
-        if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
+        if (redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
             fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
                     .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
         }
@@ -922,15 +924,15 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
-        if(type == 1){
+        if (type == 1) {
             //按完播率
             listVO = fsUserMapper.countUserRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
-        if(type == 2){
+        if (type == 2) {
             //按正确率
             listVO = fsUserMapper.countUserRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
@@ -942,15 +944,15 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
         List<FsCourseRankingVO> list = Collections.emptyList();
-        if(type == 1){
+        if (type == 1) {
             list = fsUserMapper.countCourseRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
-        if(type == 2){
+        if (type == 2) {
             list = fsUserMapper.countCourseRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
 
@@ -961,7 +963,7 @@ public class FsUserServiceImpl implements IFsUserService
     public List<FsUserGraphicStatisticsVO> graphicStatistics(UserStatisticsCommonParam param) {
         FsUserStatisticsVO userStatistics = getUserStatistics(param);
         List<FsUserGraphicStatisticsVO> list = new ArrayList<>();
-        list.add(new FsUserGraphicStatisticsVO("观看人数",userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
+        list.add(new FsUserGraphicStatisticsVO("观看人数", userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
         list.add(new FsUserGraphicStatisticsVO("完播人数", userStatistics.getCourseCompleteNum(), userStatistics.getCourseCompleteNum()));
         list.add(new FsUserGraphicStatisticsVO("答题人数", userStatistics.getAnswerNum(), userStatistics.getAnswerNum()));
         list.add(new FsUserGraphicStatisticsVO("正确人数", userStatistics.getAnswerRightNum(), userStatistics.getAnswerRightNum()));
@@ -1015,7 +1017,7 @@ public class FsUserServiceImpl implements IFsUserService
             countVO.setRedPacketNum(redPacketVO.getRedPacketNum())
                     .setRedPacketAmount(redPacketVO.getRedPacketAmount() != null ? redPacketVO.getRedPacketAmount() : new BigDecimal(BigInteger.ZERO));
             countVO.setAnswerNum(answerVO.getAnswerNum()).setAnswerRightNum(answerVO.getAnswerRightNum())
-                    .setAnswerRightRate(answerVO.getAnswerRightRate()!=null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO));
+                    .setAnswerRightRate(answerVO.getAnswerRightRate() != null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO));
             allVO.setCountVO(countVO);
             return allVO;
         }).collect(Collectors.toList());
@@ -1026,7 +1028,7 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             companyUserId = String.valueOf(0);
             companyId = companyUser.getCompanyId();
         }
@@ -1044,25 +1046,25 @@ public class FsUserServiceImpl implements IFsUserService
     public ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param) {
         //查询用户
         FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
-        if (Objects.isNull(fsUser)){
-            return ResponseResult.fail(404,"当前用户信息不存在");
+        if (Objects.isNull(fsUser)) {
+            return ResponseResult.fail(404, "当前用户信息不存在");
         }
 
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
-        if (Objects.isNull(companyUser)){
-            return ResponseResult.fail(405,"销售不存在");
+        if (Objects.isNull(companyUser)) {
+            return ResponseResult.fail(405, "销售不存在");
         }
         // 通过字段值判断该销售是否允许注册会员
-        if(companyUser.getIsAllowedAllRegister() != null && companyUser.getIsAllowedAllRegister() == 0){
-            return ResponseResult.fail(407,"不允许注册会员,请联系管理员");
+        if (companyUser.getIsAllowedAllRegister() != null && companyUser.getIsAllowedAllRegister() == 0) {
+            return ResponseResult.fail(407, "不允许注册会员,请联系管理员");
         }
 
         // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
         // 逻辑调整:会员与销售的绑定关系通过中间表关联 /20250625 17:13
         FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(fsUser.getUserId(), param.getProjectId());
-        if (Objects.nonNull(userCompanyUser) && !userCompanyUser.getCompanyUserId().equals(param.getCompanyUserId())){
-            return ResponseResult.fail(500,"该用户("+fsUser.getUserId() + ")已成为其他销售会员");
+        if (Objects.nonNull(userCompanyUser) && !userCompanyUser.getCompanyUserId().equals(param.getCompanyUserId())) {
+            return ResponseResult.fail(500, "该用户(" + fsUser.getUserId() + ")已成为其他销售会员");
         }
 
         // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
@@ -1071,7 +1073,7 @@ public class FsUserServiceImpl implements IFsUserService
         int isDefaultBlack = company != null ? company.getFsUserIsDefaultBlack() : 0;
 
         // 添加关系表数据
-        if (Objects.isNull(userCompanyUser)){
+        if (Objects.isNull(userCompanyUser)) {
             int defaultStatus = isDefaultBlack == 1 ? 0 : 1;
             userCompanyUser = userCompanyUserService.bindRelationship(param.getUserId(), param.getProjectId(), companyUser.getCompanyId(), companyUser.getUserId(), defaultStatus);
         }
@@ -1087,7 +1089,7 @@ public class FsUserServiceImpl implements IFsUserService
 //        }
 
         //如果是设置了需要进入小黑屋,则需要返回提示,否则正常返回
-        if(isDefaultBlack == 1){
+        if (isDefaultBlack == 1) {
             return ResponseResult.fail(402, "已成功注册,待管理审核");
         }
         return ResponseResult.ok(Boolean.TRUE);
@@ -1100,28 +1102,28 @@ public class FsUserServiceImpl implements IFsUserService
         BeanUtils.copyProperties(fsUser, item);
         item.setNickname(fsUser.getNickName());
         Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
-        if(item.getPhone() != null) {
+        if (item.getPhone() != null) {
             item.setPhone(ParseUtils.parsePhone(item.getPhone()));
         }
         String userTagByUserId = null;
-        if (item.getUserId()!=null && item.getCompanyUserId() != null){
+        if (item.getUserId() != null && item.getCompanyUserId() != null) {
             userTagByUserId = companyTagCacheService
-                    .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());
+                    .findUserTagByUserId(item.getUserId(), item.getCompanyUserId());
         }
-        if(StringUtils.isNotEmpty(userTagByUserId)) {
+        if (StringUtils.isNotEmpty(userTagByUserId)) {
             String[] split = userTagByUserId.split(",");
             Set<String> tagNames = new HashSet<>();
             for (String tag : split) {
-                if(StringUtils.isNotBlank(tag)) {
+                if (StringUtils.isNotBlank(tag)) {
                     Long tagL = Long.parseLong(tag);
                     CompanyTag companyTag = tagMap.get(tagL);
-                    if(companyTag != null) {
+                    if (companyTag != null) {
                         tagNames.add(companyTag.getTag());
                     }
                 }
             }
             item.setTagIds(userTagByUserId);
-            item.setTag(String.join(",",tagNames));
+            item.setTag(String.join(",", tagNames));
         }
         return item;
     }
@@ -1129,26 +1131,26 @@ public class FsUserServiceImpl implements IFsUserService
     @Override
     @Transactional
     public void addMoney(FsStoreOrderScrm order) {
-        FsUserBillScrm map=new FsUserBillScrm();
+        FsUserBillScrm map = new FsUserBillScrm();
         map.setCategory(CATEGORY_3.getValue());
         map.setBusinessId(order.getId().toString());
         map.setBillType(1);
-        List<FsUserBillScrm> list=billService.selectFsUserBillList(map);
-        if(list!=null&&list.size()>0){
-            for(FsUserBillScrm bill:list){
-                FsUser tuiUser= fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
-                if(tuiUser!=null){
-                    FsUser tuiUserMap=new FsUser();
+        List<FsUserBillScrm> list = billService.selectFsUserBillList(map);
+        if (list != null && list.size() > 0) {
+            for (FsUserBillScrm bill : list) {
+                FsUser tuiUser = fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
+                if (tuiUser != null) {
+                    FsUser tuiUserMap = new FsUser();
                     tuiUserMap.setUserId(tuiUser.getUserId());
                     tuiUserMap.setNowMoney(tuiUser.getNowMoney().add(new BigDecimal(bill.getNumber())));
                     tuiUserMap.setBrokeragePrice(tuiUser.getBrokeragePrice().subtract(new BigDecimal(bill.getNumber())));
                     fsUserMapper.updateFsUser(tuiUserMap);
-                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),0, BillDetailEnum.TYPE_6.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getBrokeragePrice().doubleValue(),"订单分佣金",order.getId().toString(),bill.getTuiUserId());
-                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_1.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getNowMoney().doubleValue(),"订单分佣金",order.getId().toString(),bill.getTuiUserId());
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(), 0, BillDetailEnum.TYPE_6.getDesc(), bill.getNumber().doubleValue(), tuiUserMap.getBrokeragePrice().doubleValue(), "订单分佣金", order.getId().toString(), bill.getTuiUserId());
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_1.getValue(), 1, BillDetailEnum.TYPE_5.getDesc(), bill.getNumber().doubleValue(), tuiUserMap.getNowMoney().doubleValue(), "订单分佣金", order.getId().toString(), bill.getTuiUserId());
                 }
             }
         }
-        FsStoreOrderScrm orderMap=new FsStoreOrderScrm();
+        FsStoreOrderScrm orderMap = new FsStoreOrderScrm();
         orderMap.setId(order.getId());
         orderMap.setTuiUserMoneyStatus(1);
         storeOrderMapper.updateFsStoreOrder(orderMap);
@@ -1185,18 +1187,26 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 判断是否是管理员
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
         }
-        // 获取课程统计
-        Map<String, Long> couserMap = fsUserMapper.countUserCourse2(param);
-        if (couserMap != null) {
-            fsUserStatisticsVO.setCourseWatchNum(couserMap.get("courseWatchNum").intValue()).setCourseCompleteNum(couserMap.get("courseCompleteNum").intValue());
 
-            if (couserMap.get("courseCompleteNum") != null && couserMap.get("courseWatchNum") > 0) {
-                int courseCompleteRate = BigDecimal.valueOf(couserMap.get("courseCompleteNum"))
-                        .divide(BigDecimal.valueOf(couserMap.get("courseWatchNum")), 2, RoundingMode.HALF_UP)
+
+        Map<String, Object> map = fsUserMapper.countUserStats(
+                param
+        );
+        // 获取课程统计
+//        Map<String, Long> courseMap = fsUserMapper.countUserCourse2(param);
+        if (map != null) {
+            fsUserStatisticsVO.setCourseWatchNum(Integer.valueOf(map.getOrDefault("courseWatchNum", 0L).toString()))
+                    .setCourseCompleteNum(Integer.valueOf(map.getOrDefault("courseCompleteNum", 0L).toString()));
+
+            Long completeNum = (Long) map.get("courseCompleteNum");
+            Long watchNum = (Long) map.get("courseWatchNum");
+            if (completeNum != null && watchNum != null && watchNum > 0) {
+                int courseCompleteRate = BigDecimal.valueOf(completeNum)
+                        .divide(BigDecimal.valueOf(watchNum), 2, RoundingMode.HALF_UP)
                         .multiply(BigDecimal.valueOf(100))
                         .intValue();
                 fsUserStatisticsVO.setCourseCompleteRate(courseCompleteRate);
@@ -1204,13 +1214,16 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         // 获取答题统计
-        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
-        if (answerMap != null) {
-            fsUserStatisticsVO.setAnswerNum(answerMap.get("answerNum").intValue()).setAnswerRightNum(answerMap.get("answerRightNum").intValue());
+//        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
+        if (map != null) {
+            Long answerRightNum = (Long) map.get("answerRightNum");
+            Long answerNum = (Long) map.get("answerNum");
 
-            if (answerMap.get("answerRightNum") != null && answerMap.get("answerNum") > 0) {
-                int answerCompleteRate = BigDecimal.valueOf(answerMap.get("answerRightNum"))
-                        .divide(BigDecimal.valueOf(answerMap.get("answerNum")), 2, RoundingMode.HALF_UP)
+            fsUserStatisticsVO.setAnswerNum(answerNum.intValue()).setAnswerRightNum(answerRightNum.intValue());
+
+            if (answerRightNum != null && answerNum != null && answerNum > 0) {
+                int answerCompleteRate = BigDecimal.valueOf(answerRightNum)
+                        .divide(BigDecimal.valueOf(answerNum), 2, RoundingMode.HALF_UP)
                         .multiply(BigDecimal.valueOf(100))
                         .intValue();
                 fsUserStatisticsVO.setAnswerRightRate(answerCompleteRate);
@@ -1218,13 +1231,18 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         // 获取红包统计
-        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
-        if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
-            fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
-                    .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
+//        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
+        if (map != null) {
+            Object numObj = map.get("redPacketNum");
+            Object amtObj = map.get("redPacketAmount");
+            if (numObj != null && amtObj != null) {
+                fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(numObj.toString()))
+                        .setRedPacketAmount(new BigDecimal(amtObj.toString()));
+            }
         }
         return fsUserStatisticsVO;
     }
+
     private static FsUserCompanyUser getFsUserCompanyUser(FsUserCourseBeMemberParam param, FsUser fsUser) {
         FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
         // 判断是否绑定了销售,如果已绑定,则需要标识为重粉,且放黑名单
@@ -1238,10 +1256,12 @@ public class FsUserServiceImpl implements IFsUserService
         fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId());
         return fsUserCompanyUser;
     }
+
     @Override
     public List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(FsUser fsUser) {
         return fsUserMapper.selectFsCompanyUserListQuery(fsUser);
     }
+
     @Override
     public List<FsUser> getUserListLimit(FsUser fsUser) {
         return fsUserMapper.selectFsUserListLimit(fsUser);

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

@@ -262,6 +262,7 @@
         video.course_sort,
         course.course_name,
         fcpd.period_id,
+        fcp.period_name,
         fcpd.id,
         if(ccut.start_date_time is null, fcpd.start_date_time, ccut.start_date_time) as startDateTime,
         if(ccut.end_date_time is null, fcpd.end_date_time, ccut.end_date_time) as endDateTime,
@@ -316,6 +317,7 @@
         video.course_sort,
         course.course_name,
         fcpd.period_id,
+        fcp.period_name,
         fcpd.start_date_time,
         fcpd.end_date_time,
         fcpd.last_join_time,

+ 196 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -1005,6 +1005,201 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         GROUP BY fcc.user_id, ucu.project_id
         ) AS complete_counts ) as courseCompleteNum
     </select>
+    <select id="countUserStats" resultType="Map">
+        SELECT
+        -- 观看人数
+        (
+        SELECT COUNT(DISTINCT l.user_id)
+        FROM fs_course_watch_log l
+        LEFT JOIN fs_user u ON u.user_id = l.user_id
+        LEFT JOIN company_user cu ON l.company_user_id = cu.user_id
+        <where>
+            l.log_type != 3 AND l.send_type = 1
+            <if test="userId != null and userId != 0 ">
+                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
+            </if>
+            <if test="userId != null and userId == 0 ">
+                AND l.company_id = #{companyId}
+            </if>
+            <if test="periodId != null and periodId != '' ">
+                AND l.period_id = #{periodId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND l.video_id = #{videoId}
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                AND l.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND l.create_time &lt;= #{endTime}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND l.company_user_id = #{companyUserId}
+            </if>
+        </where>
+        ) AS courseWatchNum,
+
+        -- 完成人数
+        (
+        SELECT COUNT(DISTINCT l.user_id)
+        FROM fs_course_watch_log l
+        LEFT JOIN fs_user u ON u.user_id = l.user_id
+        LEFT JOIN company_user cu ON l.company_user_id = cu.user_id
+        <where>
+            l.log_type = 2 AND l.send_type = 1
+            <if test="userId != null and userId != 0 ">
+                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
+            </if>
+            <if test="userId != null and userId == 0 ">
+                AND l.company_id = #{companyId}
+            </if>
+            <if test="periodId != null and periodId != '' ">
+                AND l.period_id = #{periodId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND l.video_id = #{videoId}
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                AND l.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND l.create_time &lt;= #{endTime}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND l.company_user_id = #{companyUserId}
+            </if>
+        </where>
+        ) AS courseCompleteNum,
+
+        -- 答题人数
+        (
+        SELECT COUNT(distinct a.user_id)
+        FROM fs_course_answer_logs a
+        LEFT JOIN fs_user u ON u.user_id = a.user_id
+        LEFT JOIN company_user cu ON cu.user_id = a.company_user_id
+        <where>
+            1=1
+            <if test="userId != null and userId != 0 ">
+                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
+            </if>
+            <if test="userId != null and userId == 0 ">
+                AND a.company_id = #{companyId}
+            </if>
+            <if test="periodId != null and periodId != '' ">
+                AND a.period_id = #{periodId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND a.video_id = #{videoId}
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                AND a.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND a.create_time &lt;= #{endTime}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND a.company_user_id = #{companyUserId}
+            </if>
+        </where>
+        ) AS answerNum,
+
+        -- 答对人数
+        (
+        SELECT COUNT(distinct a.user_id)
+        FROM fs_course_answer_logs a
+        LEFT JOIN fs_user u ON u.user_id = a.user_id
+        LEFT JOIN company_user cu ON cu.user_id = a.company_user_id
+        <where>
+            a.is_right = 1
+            <if test="userId != null and userId != 0 ">
+                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
+            </if>
+            <if test="userId != null and userId == 0 ">
+                AND a.company_id = #{companyId}
+            </if>
+            <if test="periodId != null and periodId != '' ">
+                AND a.period_id = #{periodId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND a.video_id = #{videoId}
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                AND a.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND a.create_time &lt;= #{endTime}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND a.company_user_id = #{companyUserId}
+            </if>
+        </where>
+        ) AS answerRightNum,
+
+        -- 红包数
+        (
+        SELECT COUNT(flog.log_id)
+        FROM fs_course_red_packet_log flog
+        LEFT JOIN fs_user u ON u.user_id = flog.user_id
+        LEFT JOIN company_user cu ON cu.user_id = flog.company_user_id
+        <where>
+            flog.status = 1
+            <if test="userId != null and userId != 0 ">
+                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
+            </if>
+            <if test="userId != null and userId == 0 ">
+                AND flog.company_id = #{companyId}
+            </if>
+            <if test="periodId != null and periodId != '' ">
+                AND flog.period_id = #{periodId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND flog.video_id = #{videoId}
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                AND flog.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND flog.create_time &lt;= #{endTime}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND flog.company_user_id = #{companyUserId}
+            </if>
+        </where>
+        ) AS redPacketNum,
+
+        -- 红包金额
+        (
+        SELECT IFNULL(SUM(flog.amount), 0)
+        FROM fs_course_red_packet_log flog
+        LEFT JOIN fs_user u ON u.user_id = flog.user_id
+        LEFT JOIN company_user cu ON cu.user_id = flog.company_user_id
+        <where>
+            flog.status = 1
+            <if test="userId != null and userId != 0 ">
+                AND (cu.user_id = #{userId} OR cu.parent_id = #{userId})
+            </if>
+            <if test="userId != null and userId == 0 ">
+                AND flog.company_id = #{companyId}
+            </if>
+            <if test="periodId != null and periodId != '' ">
+                AND flog.period_id = #{periodId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND flog.video_id = #{videoId}
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                AND flog.create_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND flog.create_time &lt;= #{endTime}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND flog.company_user_id = #{companyUserId}
+            </if>
+        </where>
+        ) AS redPacketAmount
+    </select>
+
 
     <select id="countUserAnswer" resultType="Map">
         SELECT
@@ -1939,4 +2134,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             WHERE phonenumber = #{keywords}
         </if>
     </select>
+
 </mapper>