Parcourir la source

feat:同步代码、添加新项目配置文件

caoliqin il y a 1 jour
Parent
commit
813363e606

+ 2 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -189,6 +189,7 @@ public class FsUserCoursePeriodController extends BaseController {
         return R.ok().put("data", periodRedPacketList);
     }
 
+    @Log(title = "按课程批量保存设置红包金额", businessType = BusinessType.UPDATE)
     @PreAuthorize("@ss.hasPermi('course:period:setCourseRedPacket')")
     @ApiOperation("按课程批量保存设置红包金额")
     @PostMapping("/batchRedPacket")
@@ -202,6 +203,7 @@ public class FsUserCoursePeriodController extends BaseController {
         return R.ok();
     }
 
+    @Log(title = "按营期批量保存设置红包金额", businessType = BusinessType.UPDATE)
     @PreAuthorize("@ss.hasPermi('course:period:setRedPacket')")
     @ApiOperation("按营期批量保存设置红包金额")
     @PostMapping("/batchRedPacket/byPeriod")

+ 6 - 9
fs-admin/src/main/java/com/fs/his/controller/FsUserController.java

@@ -199,16 +199,13 @@ public class FsUserController extends BaseController
 //        startPage();
 //        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
-        if(ObjectUtils.isNotNull(fsUserPageListVOPageInfo)){
-            for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
-                fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
-            }
-            Map<String, Object> map = new HashMap<String, Object>();
-            map.put("rows", fsUserPageListVOPageInfo.getList());
-            map.put("total", fsUserPageListVOPageInfo.getList().size());
-            return R.ok(map);
+        for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
+            fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
         }
-        return R.ok();
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("rows", fsUserPageListVOPageInfo.getList());
+        map.put("total", fsUserPageListVOPageInfo.getTotal());
+        return R.ok(map);
     }
 
     @PreAuthorize("@ss.hasPermi('his:user:enabledUsers')")

+ 13 - 4
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.app.annotation.Login;
 import com.fs.app.config.ImageStorageConfig;
-
 import com.fs.app.param.FsUserTagUpdateParam;
 import com.fs.app.param.FsUserUpdateParam;
 import com.fs.common.core.domain.R;
@@ -42,7 +41,10 @@ import java.io.InputStream;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 @Slf4j
 @Api(tags = "用户会员相关接口")
@@ -78,6 +80,7 @@ public class FsUserController extends AppBaseController {
         param.setUserId(Long.parseLong(getUserId()));
 //        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
+//        PageInfo<FsUserPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(fsUserPageListVOPageInfo);
     }
 
@@ -299,7 +302,7 @@ public class FsUserController extends AppBaseController {
         return ResponseResult.ok(fsUserService.companyUserSummaryCount(userId, companyUserId));
     }
 
-    @Login
+//    @Login
     @ApiOperation("会员关联绑定销售")
     @PostMapping("/beMember")
     public ResponseResult<Boolean> becomeMember(@Valid @RequestBody FsUserCourseBeMemberParam param) {
@@ -326,7 +329,7 @@ public class FsUserController extends AppBaseController {
             String userPosterImage = jsonObject.getString("userPosterImage");
             String backgroundImagePath;
             if(StringUtils.isEmpty(userPosterImage)){
-                backgroundImagePath = "https://drk-1363981074.cos.ap-chongqing.myqcloud.com/fs/logo/30d7a0d1ec31e5ac16c6e96d5ca76ad.png";
+                backgroundImagePath = "https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250430/1745980979886.png";
             } else {
                 backgroundImagePath = userPosterImage;
             }
@@ -341,4 +344,10 @@ public class FsUserController extends AppBaseController {
         }
     }
 
+    @PostMapping("/test")
+    @ApiOperation("测试定时任务")
+    public void userCourseCountTask() {
+        userCourseCountService.insertFsUserCourseCountTask();
+    }
+
 }

+ 3 - 29
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -1,7 +1,5 @@
 package com.fs.app.controller;
 
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.config.ImageStorageConfig;
 import com.fs.common.core.domain.R;
@@ -9,7 +7,6 @@ import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyUserService;
-import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.FsWatchCourseTimeParam;
@@ -20,13 +17,11 @@ import com.fs.course.service.IFsCourseLinkService;
 import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.service.IFsUserCourseVideoService;
-import com.fs.course.service.impl.FsUserCourseServiceImpl;
 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;
 import com.fs.course.vo.newfs.FsUserVideoListVO;
-import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -37,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.InputStream;
-import java.time.LocalDate;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -56,8 +50,6 @@ public class FsUserCourseVideoController extends AppBaseController {
 
     @Autowired
     private IFsUserCourseService fsUserCourseService;
-    @Autowired
-    private ISysConfigService configService;
 
     @Autowired
     private IFsCourseLinkService courseLinkService;
@@ -165,15 +157,8 @@ public class FsUserCourseVideoController extends AppBaseController {
 
         R courseSortLink = fsUserCourseService.createCourseSortLink(fsCourseLinkCreateParam);
         String link = courseSortLink.get("link").toString();
-//        R r = courseLinkService.getRealLink(link);
-//        String realLink = r.get("realLink").toString();
-        String json = configService.selectConfigByKey("course.config");
-        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        //验证是否有分配二级域名
-        CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
-        String realLink = (ObjectUtil.isNotNull(companyUser) && ObjectUtil.isNotNull(companyUser.getDomain())?companyUser.getDomain():config.getRealLinkDomainName()) + FsUserCourseServiceImpl.shortLink + link;
-
-        log.info("二维码生成地址:{}", realLink);
+        R r = courseLinkService.getRealLink(link);
+        String realLink = r.get("realLink").toString();
         try {
             String path = imageConfig.getServerPath();
             log.info("获取的logo图片路径,fileUrl:{}", path);
@@ -229,7 +214,7 @@ public class FsUserCourseVideoController extends AppBaseController {
 
         Map<String, Object> params = new HashMap<>();
         params.put("companyId", companyId);
-        params.put("dayDate", LocalDate.now());
+//        params.put("dayDate", LocalDate.now());
         params.put("companyUserId", Long.parseLong(getUserId()));
 
         PageHelper.startPage(pageNum, pageSize);
@@ -249,16 +234,5 @@ public class FsUserCourseVideoController extends AppBaseController {
         return fsUserCourseVideoService.setWatchCourseTime(collect);
     }
 
-    /**
-     * 获取跳转微信小程序的链接地址
-     * @param linkStr
-     * @return
-     */
-    @Login
-    @GetMapping("/getGotoWxAppLink")
-    @ApiOperation("获取跳转微信小程序的链接地址")
-    public ResponseResult<String> getGotoWxAppLink(String linkStr,String appid) {
-        return ResponseResult.ok(courseLinkService.getGotoWxAppLink(linkStr,appid));
-    }
 
 }

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

@@ -342,4 +342,7 @@ public interface FsUserMapper
     FsUser selectFsUserByCourseMaOpenId(String openId);
 
     Map<String, Long> countUserCourse2(UserStatisticsCommonParam param);
+
+    Map<String, Long> countCourseDetailsNew(UserStatisticsCommonParam param);
+
 }

+ 3 - 4
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -777,8 +777,7 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public FsUserStatisticsVO userStatisticsDetails(UserStatisticsCommonParam param) {
-//        FsUserStatisticsVO userStatisticsVO = getUserStatistics(param);
-        FsUserStatisticsVO userStatisticsVO = getUserStatistics2(param);
+        FsUserStatisticsVO userStatisticsVO = getUserStatistics(param);
 
         // 判断是否是管理员
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
@@ -786,7 +785,7 @@ public class FsUserServiceImpl implements IFsUserService
             param.setUserId(0L);
         }
         //统计课程数据详情,在查询统计详情的时候需要显示
-        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetails(param);
+        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetailsNew(param);
         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()))
@@ -1082,7 +1081,7 @@ public class FsUserServiceImpl implements IFsUserService
             param.setCompanyId(companyUser.getCompanyId());
         }
         // 获取课程统计
-        Map<String, Long> couserMap = fsUserMapper.countUserCourse(param);
+        Map<String, Long> couserMap = fsUserMapper.countUserCourse2(param);
         if (couserMap != null) {
             fsUserStatisticsVO.setCourseWatchNum(couserMap.get("courseWatchNum").intValue()).setCourseCompleteNum(couserMap.get("courseCompleteNum").intValue());
 

+ 86 - 0
fs-service/src/main/resources/application-config-druid-kyt.yml

@@ -0,0 +1,86 @@
+baidu:
+  token: 1231321232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid:
+        secret:
+        token:
+        aesKey:
+        msgDataFormat: JSON
+      - appid:    #宽益堂
+        secret:
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb2a10556a7c2
+    appConfigs:
+      - agentId: 100005
+        secret: ec7okROXJqkNafq66aKNasTzQIG0CYrj3vyBbo
+        token: PPKOdAlMO
+        aesKey: PKvaxtpSvNGpfT7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId: wx73f858d6119 #微信公众号或者小程序等的appid
+    mchId: 161145 #微信支付商户号
+    mchKey: 8cab18997a3547c10898b877f38 #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://usepp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId:  # 第一个公众号的appid
+        secret:  # 公众号的appsecret
+        token:  # 接口配置里的Token值
+        aesKey:  # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17ef358c0dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+#  account: tcloud
+#  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://172.16.0.16:8010
+  h5CommonApi: http://119.29.195.254:8010
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: kyt-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: kyt
+cloud_host:
+  company_name: 宽益堂
+#看课授权时显示的头像
+headerImg:
+  imgUrl: https://yztcourse-1325300895.cos.ap-guangzhou.myqcloud.com/yztcourse/20250523/e04871a98cc84be39a7f60c084698e21.jpg
+ipad:
+  ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+

+ 139 - 0
fs-service/src/main/resources/application-druid-kyt.yml

@@ -0,0 +1,139 @@
+# 数据源配置
+spring:
+  profiles:
+    include: common,config-druid-kyt
+  # redis 配置
+  redis:
+    # 地址
+    host: 172.17.0.4
+    # 端口,默认为6379
+    port: 6379
+    # 密码
+    password: Ylrztek250218!3@.
+    # 连接超时时间
+    timeout: 30s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+    database: 0
+  datasource:
+    mysql:
+      type: com.alibaba.druid.pool.DruidDataSource
+      driverClassName: com.mysql.cj.jdbc.Driver
+      druid:
+        # 主库数据源
+        master:
+          url: jdbc:mysql://172.17.0.3:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrz_tM8/oW6$pU9|tJ6@
+        # 从库数据源
+        slave:
+          # 从数据源开关/默认关闭
+          enabled: false
+          url:
+          username:
+          password:
+        # 初始连接数
+        initialSize: 5
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        webStatFilter:
+          enabled: true
+        statViewServlet:
+          enabled: true
+          # 设置白名单,不填则允许所有访问
+          allow:
+          url-pattern: /druid/*
+          # 控制台管理用户名和密码
+          login-username: fs
+          login-password: 123456
+        filter:
+          stat:
+            enabled: true
+            # 慢SQL记录
+            log-slow-sql: true
+            slow-sql-millis: 1000
+            merge-sql: true
+          wall:
+            config:
+              multi-statement-allow: true
+    sop:
+      type: com.alibaba.druid.pool.DruidDataSource
+      driverClassName: com.mysql.cj.jdbc.Driver
+      druid:
+        # 主库数据源
+        master:
+          url: jdbc:mysql://172.17.0.3:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrz_tM8/oW6$pU9|tJ6@
+        # 初始连接数
+        initialSize: 5
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 20
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        webStatFilter:
+          enabled: true
+        statViewServlet:
+          enabled: true
+          # 设置白名单,不填则允许所有访问
+          allow:
+          url-pattern: /druid/*
+          # 控制台管理用户名和密码
+          login-username: fs
+          login-password: 123456
+        filter:
+          stat:
+            enabled: true
+            # 慢SQL记录
+            log-slow-sql: true
+            slow-sql-millis: 1000
+            merge-sql: true
+          wall:
+            config:
+              multi-statement-allow: true
+rocketmq:
+  name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+  producer:
+    group: my-producer-group
+    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+  consumer:
+    group: test-group
+    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 77 - 24
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -308,7 +308,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectFsUserPageListNew" resultType="com.fs.store.vo.h5.FsUserPageListVO">
         SELECT
         fs_user.user_id,
-        fs_user.nick_name,
+        fs_user.nickname,
         fs_user.avatar,
         fs_user.phone,
         fs_user.status,
@@ -320,6 +320,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fs_user
         <where>
             fs_user.is_del = 0
+            <if test="companyId != null">
+                AND fs_user.company_id = #{companyId}
+            </if>
+            <if test="companyUserId != null and companyUserId != '' ">
+                AND fs_user.company_user_id = #{companyUserId}
+            </if>
             <if test="registerStartTime != null and registerStartTime !='' ">
                 AND fs_user.create_time &gt;= #{registerStartTime}
             </if>
@@ -333,13 +339,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 </foreach>
             </if>
             <if test="nickname != null and nickname != ''">
-                AND fs_user.nick_name like concat(#{nickname},'%')
+                AND fs_user.nickname like concat('%', #{nickname},'%')
             </if>
             <if test="phone != null and phone != ''">
-                AND fs_user.phone = #{phone}
-            </if>
-            <if test="companyId != null">
-                AND fs_user.company_id = #{companyId}
+                AND fs_user.phone like concat('%', #{phone},'%')
             </if>
         </where>
         limit ${(pageNum-1)*pageSize},${pageSize}
@@ -1106,19 +1109,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="countCourseRankingByComplete" resultType="com.fs.store.vo.h5.FsCourseRankingVO">
         SELECT
         fcv.title AS videoName,
+        fcv.video_id,
         ifnull(
-        ROUND((
-        COUNT( DISTINCT CASE WHEN fcc.complete_watch_count > 0 THEN 1 END ) / count(1))* 100,
+        ROUND(
+        (
+        COUNT( DISTINCT CASE WHEN fwl.log_type = 2 THEN fwl.log_id END ) / count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.log_id END )) * 100,
         2
         ),
         0
         ) AS completeRate
         FROM
-        fs_user_course_count fcc
-        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
-        LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
-        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0
-        LEFT JOIN fs_user_course_video fcv ON fcv.video_id = fcpd.video_id
+        fs_course_watch_log fwl
+        LEFT JOIN fs_user ON fs_user.user_id = fwl.user_id
+        LEFT JOIN fs_user_company_user ON fs_user_company_user.user_id = fs_user.user_id
+        LEFT JOIN company_user ON company_user.user_id = fs_user_company_user.company_user_id
+        --         LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0
+        LEFT JOIN fs_user_course_video fcv ON fcv.video_id = fwl.video_id
         <where>
             <if test="userId != null and userId != 0 ">
                 AND ( fs_user.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
@@ -1127,20 +1133,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and fs_user.company_id = #{companyId}
             </if>
             <if test="startTime != null and startTime !='' ">
-                AND fcc.create_time &gt;= #{startTime}
+                AND fwl.create_time &gt;= #{startTime}
             </if>
             <if test="endTime != null and endTime != ''">
-                AND fcc.create_time &lt;= #{endTime}
+                AND fwl.create_time &lt;= #{endTime}
             </if>
             <if test="periodId != null and periodId != ''">
-                AND fcpd.period_id =  #{periodId}
+                AND fwl.period_id =  #{periodId}
             </if>
             <if test="videoId != null and videoId != ''">
-                AND fcpd.video_id = #{videoId}
+                AND fwl.video_id = #{videoId}
             </if>
         </where>
         GROUP BY
-        fcpd.video_id
+        fwl.video_id
         <choose>
             <when test="order != null and order == 'asc'">
                 ORDER BY completeRate asc
@@ -1161,7 +1167,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ifnull(
         ROUND(
         (
-        COUNT( DISTINCT CASE WHEN fs_course_answer_logs.is_right = 1 THEN 1 END ) / count(1)) * 100,
+        COUNT( DISTINCT CASE WHEN fs_course_answer_logs.is_right = 1 THEN fs_course_answer_logs.log_id END ) / count( DISTINCT fs_course_answer_logs.log_id)) * 100,
         2
         ),
         0
@@ -1169,7 +1175,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM
         fs_course_answer_logs
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
-        LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+        LEFT JOIN fs_user_company_user ON fs_user_company_user.user_id = fs_user.user_id
+        LEFT JOIN company_user ON company_user.user_id = fs_user_company_user.company_user_id
         LEFT JOIN fs_user_course_video fcv ON fcv.video_id = fs_course_answer_logs.video_id
         <where>
             <if test="userId != null and userId != 0 ">
@@ -1358,13 +1365,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
         </where>
     </select>
+
     <select id="countUserCourse2" resultType="java.util.Map">
         SELECT
         (
         SELECT
-        count(1)
+        count(DISTINCT l.user_id)
         FROM
         fs_course_watch_log l
+        LEFT JOIN fs_user on fs_user.user_id = l.user_id
         LEFT JOIN company_user ON l.company_user_id = company_user.user_id
         where
         l.log_type != 3 and send_type = 1
@@ -1380,15 +1389,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <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>
+        -- 单独通过销售id查询
         <if test="companyUserId != null and companyUserId != ''">
-            AND l.user_id = #{companyUserId}
+            AND l.company_user_id = #{companyUserId}
         </if>
         ) as courseWatchNum,
         (
         SELECT
-        count(1)
+        count(DISTINCT l.user_id)
         FROM
         fs_course_watch_log l
+        LEFT JOIN fs_user on fs_user.user_id = l.user_id
         LEFT JOIN company_user ON l.company_user_id = company_user.user_id
         where
         l.log_type = 2 and send_type = 1
@@ -1404,10 +1421,46 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <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>
         -- 单独通过销售id查询
         <if test="companyUserId != null and companyUserId != ''">
-            AND l.user_id = #{companyUserId}
+            AND l.company_user_id = #{companyUserId}
         </if>
         ) as courseCompleteNum
     </select>
+
+    <select id="countCourseDetailsNew" resultType="Map">
+        SELECT
+        count( DISTINCT l.period_id ) as courseNum,
+        count( DISTINCT l.video_id ) as videoNum,
+        count( DISTINCT l.user_id ) as courseUserNum
+        FROM
+        fs_course_watch_log l
+        left join fs_user on fs_user.user_id = l.user_id
+        LEFT JOIN company_user ON l.company_user_id = company_user.user_id
+        WHERE
+        l.log_type != 3
+        AND send_type = 1
+        <if test="userId != null and userId != 0 ">
+            AND l.company_user_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>
+        -- 单独通过销售id查询
+        <if test="companyUserId != null and companyUserId != ''">
+            AND l.company_user_id = #{companyUserId}
+        </if>
+    </select>
 </mapper>