فهرست منبع

Merge branch 'refs/heads/master' into ScrmStores

chenguo 3 هفته پیش
والد
کامیت
74045f3176
29فایلهای تغییر یافته به همراه404 افزوده شده و 333 حذف شده
  1. 1 1
      fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  2. 1 1
      fs-company-app/src/main/java/com/fs/app/utils/JwtUtils.java
  3. 2 2
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java
  4. 37 26
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  5. 3 1
      fs-service/src/main/java/com/fs/core/config/WxMaConfiguration.java
  6. 2 2
      fs-service/src/main/java/com/fs/core/utils/OrderCodeUtils.java
  7. 2 1
      fs-service/src/main/java/com/fs/course/domain/FsCourseFinishTemp.java
  8. 20 8
      fs-service/src/main/java/com/fs/course/mapper/FsCourseTrafficLogMapper.java
  9. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  10. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java
  11. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java
  12. 8 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseAnswerLogsServiceImpl.java
  13. 47 16
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseTrafficLogServiceImpl.java
  14. 79 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  15. 3 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  16. 14 3
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  17. 6 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  18. 25 17
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  19. 0 73
      fs-service/src/main/resources/application-config-druid-fcky.yml
  20. 4 4
      fs-service/src/main/resources/application-config-druid-jnmy.yml
  21. 1 1
      fs-service/src/main/resources/application-config-zkzh.yml
  22. 0 150
      fs-service/src/main/resources/application-druid-fcky.yml
  23. 3 1
      fs-service/src/main/resources/application-druid-myhk-test.yml
  24. 3 1
      fs-service/src/main/resources/application-druid-myhk.yml
  25. 29 9
      fs-service/src/main/resources/mapper/course/FsCourseAnswerLogsMapper.xml
  26. 1 0
      fs-service/src/main/resources/mapper/course/FsCourseFinishTempMapper.xml
  27. 96 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  28. 8 8
      fs-service/src/main/resources/mapper/course/FsUserCourseVideoRedPackageMapper.xml
  29. 4 4
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml

+ 1 - 1
fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -209,7 +209,7 @@ public class CompanyUserController extends AppBaseController {
         companyUser.setCreateTime(new Date());
         companyUser.setIsAudit(0);
         companyUser.setParentId(upCompanyUser.getUserId());
-        companyUser.setCompanyId(upCompanyUser.getCompanyId());
+//        companyUser.setCompanyId(upCompanyUser.getCompanyId());
         companyUser.setCompanyId(company.getCompanyId());
 
         // 部门

+ 1 - 1
fs-company-app/src/main/java/com/fs/app/utils/JwtUtils.java

@@ -31,7 +31,7 @@ public class JwtUtils {
         Date nowDate = new Date();
         //过期时间
         Date expireDate = new Date(nowDate.getTime() + expire * 1000);
-        System.out.println("==============================="+secret);
+//        System.out.println("==============================="+secret);
         return Jwts.builder()
                 .setHeaderParam("typ", "JWT")
                 .setSubject(userId+"")

+ 2 - 2
fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java

@@ -226,7 +226,7 @@ public class FsCourseWatchLogController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId( loginUser.getCompany().getCompanyId());
-        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVOexport(param);
         ExcelUtil<FsCourseWatchLogListVO> util = new ExcelUtil<FsCourseWatchLogListVO>(FsCourseWatchLogListVO.class);
         return util.exportExcel(list, "短链课程看课记录数据");
     }
@@ -242,7 +242,7 @@ public class FsCourseWatchLogController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId( loginUser.getCompany().getCompanyId());
         param.setCompanyUserId( loginUser.getUser().getUserId());
-        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVOexport(param);
         ExcelUtil<FsCourseWatchLogListVO> util = new ExcelUtil<FsCourseWatchLogListVO>(FsCourseWatchLogListVO.class);
         return util.exportExcel(list, "短链课程看课记录数据");
     }

+ 37 - 26
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -459,16 +459,6 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                 return;
             }
 
-//            String[] userKey = logVo.getUserId().split("\\|");
-//            if (userKey.length < 3) {
-//                log.error("用户 ID {} 格式不正确,跳过处理。", logVo.getUserId());
-//                return;
-//            }
-
-//            String qwUserId = userKey[0].trim();
-//            String companyUserId = userKey[1].trim();
-//            String companyId = userKey[2].trim();
-
 
             //获取企业微信员工的称呼//从redis里或者从库里取
             QwUser qwUserByRedis = qwExternalContactService.getQwUserByRedis(logVo.getCorpId(),logVo.getQwUserId());
@@ -943,27 +933,21 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                     String sortLink = createLinkByMiniApp(setting, logVo, sendTime, courseId, videoId,
                             qwUserId, companyUserId, companyId, externalId,isOfficial,sopLogs.getFsUserId());
 
-                    if (!miniMap.isEmpty() && sendMsgType==1) {
-                        Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
-                        if (integerListMap != null) {
 
-                            int effectiveGrade = (grade == null) ? 5 : grade;
-                            int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
-                            List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
+                    //算主备小程序
+                    String finalAppId = getAppIdFromMiniMap(miniMap, companyId, sendMsgType, grade);
 
-                            if (miniapps != null && !miniapps.isEmpty()) {
-                                CompanyMiniapp companyMiniapp = miniapps.get(0);
-                                if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                    setting.setMiniprogramAppid(companyMiniapp.getAppId());
-                                }
-                            }
-                        }
-                    }else if (!StringUtil.strIsNullOrEmpty(miniAppId)){
-                        setting.setMiniprogramAppid(miniAppId);
-                    }else {
+                    if (StringUtil.strIsNullOrEmpty(finalAppId)) {
+                        finalAppId = miniAppId;
+                    }
+
+                    if (!StringUtil.strIsNullOrEmpty(finalAppId)) {
+                        setting.setMiniprogramAppid(finalAppId);
+                    } else {
                         log.error("公司的小程序id为空:采用了前端传的固定值" + sopLogs.getSopId());
                     }
 
+
                     setting.setMiniprogramPage(sortLink.replaceAll("^[\\s\\u2005]+", ""));
 
                     try {
@@ -993,6 +977,33 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         enqueueQwSopLogs(sopLogs);
     }
 
+    private String getAppIdFromMiniMap(Map<Long, Map<Integer, List<CompanyMiniapp>>> miniMap,
+                                       String companyId,
+                                       int sendMsgType,
+                                       Integer grade) {
+        if (miniMap.isEmpty() || sendMsgType != 1) {
+            return null;
+        }
+
+        Map<Integer, List<CompanyMiniapp>> gradeMap = miniMap.get(Long.valueOf(companyId));
+        if (gradeMap == null) {
+            return null;
+        }
+
+        int effectiveGrade = (grade == null) ? 5 : grade;
+        int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
+        List<CompanyMiniapp> miniapps = gradeMap.get(listIndex);
+
+        if (miniapps == null || miniapps.isEmpty()) {
+            return null;
+        }
+
+        CompanyMiniapp companyMiniapp = miniapps.get(0);
+        return (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId()))
+                ? companyMiniapp.getAppId()
+                : null;
+    }
+
     /**
      * 深拷贝 Content 对象,避免使用 JSON 进行序列化和反序列化
      */

+ 3 - 1
fs-service/src/main/java/com/fs/core/config/WxMaConfiguration.java

@@ -14,6 +14,7 @@ import com.fs.system.mapper.SysConfigMapper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import jodd.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.error.WxRuntimeException;
@@ -30,7 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-
+@Slf4j
 @Configuration
 @ComponentScan("com.fs.system.mapper")
 public class WxMaConfiguration {
@@ -74,6 +75,7 @@ public class WxMaConfiguration {
         }
         wx.setConfigs(c);
         this.properties = wx;
+        log.info("配置加载完毕! 配置文件: {}",JSON.toJSONString(this.properties));
     }
 
     public static WxMaService getMaService(String appid) {

+ 2 - 2
fs-service/src/main/java/com/fs/core/utils/OrderCodeUtils.java

@@ -44,8 +44,8 @@ public class OrderCodeUtils {
 
     }
     public static String getOrderSn(){
-        //String url= FSConfig.getCommonApi()+ "/app/common/genOrderCode";
-        String url= "42.194.245.189:8010/app/common/genOrderCode";
+        String url= FSConfig.getCommonApi()+ "/app/common/genOrderCode";
+//        String url= "42.194.245.189:8010/app/common/genOrderCode";
         String json = HttpRequest.get(url)
                 .execute().body();
         OrderCodeVO vo= JSONUtil.toBean(json, OrderCodeVO.class);

+ 2 - 1
fs-service/src/main/java/com/fs/course/domain/FsCourseFinishTemp.java

@@ -54,6 +54,7 @@ public class FsCourseFinishTemp extends BaseEntity
     /** 删除标志 */
     @Excel(name = "删除标志")
     private Long isDel;
-    @Excel(name = "删除标志")
+
+    @Excel(name = "全选销售标志")
     private Integer isAllCompanyUser;
 }

+ 20 - 8
fs-service/src/main/java/com/fs/course/mapper/FsCourseTrafficLogMapper.java

@@ -115,18 +115,30 @@ public interface FsCourseTrafficLogMapper
     List<FsCourseTrafficLogListVO> selectTrafficNew(FsCourseTrafficLogParam param);
 
     @Select("<script>" +
-            "SELECT COALESCE(sum(internet_traffic), 0) FROM fs_course_traffic_log " +
-            "WHERE status =0" +
-            "<if test='createTime != null'>AND create_time &lt;= #{createTime}</if> " +
+            "SELECT log_id FROM fs_course_traffic_log " +
+            "WHERE status = 0 " +
+            "<if test='createTime != null'>" +
+            "  AND create_time &lt; DATE_ADD(#{createTime,jdbcType=TIMESTAMP}, INTERVAL 1 SECOND)" +
+            "</if>" +
+            " AND log_id > #{lastId} " +
+            " ORDER BY log_id ASC " +
+            " LIMIT #{batchSize}" +
             "</script>")
-    Long findRecordsNumBYD( @Param("createTime") Date createTime);
+    List<Long> findRecordsByIdsPaged(
+            @Param("createTime") Date createTime,
+            @Param("lastId") Long lastId,
+            @Param("batchSize") int batchSize);
+
 
     @Select("<script>" +
-            "SELECT log_id FROM fs_course_traffic_log " +
-            "WHERE status =0" +
-            "<if test='createTime != null'>AND create_time &lt;= #{createTime}</if> " +
+            "SELECT COALESCE(SUM(internet_traffic), 0) FROM fs_course_traffic_log " +
+            "WHERE log_id IN " +
+            "<foreach item='id' collection='ids' open='(' separator=',' close=')'>" +
+            "#{id}" +
+            "</foreach>" +
             "</script>")
-    List<Long> findRecordsNumByIds( @Param("createTime") Date createTime);
+    Long sumTrafficByIds(@Param("ids") List<Long> ids);
+
 
     @Update("<script>" +
             "UPDATE fs_course_traffic_log SET status = #{status} WHERE log_id IN " +

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

@@ -487,4 +487,6 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
             "    (SELECT @streak := 0, @prev_date := NULL) AS vars\n" +
             ") AS streak_data;")
     Long selectByWatchlxDay(@Param("userId") Long userId,@Param("projectId")  Long projectId);
+
+    List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOexport(@Param("maps") FsCourseWatchLogListParam param);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java

@@ -70,7 +70,7 @@ public interface FsUserCourseVideoRedPackageMapper
             "VALUES (#{companyId}, #{videoId}, #{redPacketMoney}) " +
             "ON DUPLICATE KEY UPDATE red_packet_money = VALUES(red_packet_money);")
     void insertOrUpdateFsUserCourseVideoRedPackage(FsUserCourseVideoParam fsUserCourseVideo);
-
+    @Select("select * from fs_user_course_video_red_package where video_id =#{videoId} and company_id = #{companyId} and period_id = #{periodId}")
     FsUserCourseVideoRedPackage selectRedPacketByCompanyId(@Param("videoId") Long videoId,@Param("companyId") Long companyId, @Param("periodId") Long periodId);
 
     /**

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

@@ -132,4 +132,6 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
     FsCourseWatchLog getWatchCourseVideoIsOpen(Long userId, Long videoId);
 
     void scheduleBatchUpdateToDatabaseIsOpen();
+
+    List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOexport(FsCourseWatchLogListParam param);
 }

+ 8 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseAnswerLogsServiceImpl.java

@@ -190,6 +190,14 @@ public class FsCourseAnswerLogsServiceImpl implements IFsCourseAnswerLogsService
 
     @Override
     public Long selectFsCourseAnswerLogsListVONewCount(FsCourseAnswerLogsParam param) {
+        if(StringUtils.isNotEmpty(param.getUserName())){
+            List<FsUser> fsUsers = fsUserService.selectFsUserListByJointUserNameKey(param.getUserName());
+            if(fsUsers.isEmpty()) {
+                return 0L;
+            }
+            Set<Long> userIds = fsUsers.stream().map(FsUser::getUserId).collect(Collectors.toSet());
+            param.setUserIds(userIds);
+        }
         return fsCourseAnswerLogsMapper.selectFsCourseAnswerLogsListVONewCount(param);
     }
 

+ 47 - 16
fs-service/src/main/java/com/fs/course/service/impl/FsCourseTrafficLogServiceImpl.java

@@ -4,10 +4,12 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
+import com.fs.common.utils.date.DateUtil;
 import com.fs.company.cache.ICompanyCacheService;
 import com.fs.course.param.FsCourseTrafficLogParam;
 import com.fs.course.param.InternetTrafficParam;
@@ -23,6 +25,7 @@ import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsCourseTrafficLogMapper;
 import com.fs.course.domain.FsCourseTrafficLog;
 import com.fs.course.service.IFsCourseTrafficLogService;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 短链课程流量记录Service业务层处理
@@ -343,27 +346,55 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
         }
     }
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void sumTrafficlog() {
+        // 初始化参数
+        int batchSize = 10000;
+        Long lastId = 0L;
+        long totalTraffic = 0L;
+        Date currentDate = DateUtils.addHours(new Date(),-3);
         SysConfig sysConfig = iSysConfigService.selectConfigByConfigKey("redPacket.Traffic.config");
-        Date date = new Date();
-        Long count = fsCourseTrafficLogMapper.findRecordsNumBYD(date);
-        List<Long> ids = fsCourseTrafficLogMapper.findRecordsNumByIds(date);
-        if (count<=0){
-            return;
+
+        // 分批处理
+        while (true) {
+            // 分页查询ID
+            List<Long> ids = fsCourseTrafficLogMapper.findRecordsByIdsPaged(
+                    currentDate, lastId, batchSize);
+            System.out.println(ids);
+
+            if (CollectionUtils.isEmpty(ids)) {
+                break;
+            }
+            // 统计本批次流量
+            Long batchTraffic = fsCourseTrafficLogMapper.sumTrafficByIds(ids);
+            // 批量更新状态
+            int updatedCount = fsCourseTrafficLogMapper.updateStatusByIds(ids, 2);
+
+            totalTraffic += batchTraffic;
+
         }
-        if (ObjectUtils.isEmpty(sysConfig)){
-            sysConfig = new SysConfig();
-            sysConfig.setConfigKey("redPacket.Traffic.config");
-            sysConfig.setConfigName("红包流量配置");
-            sysConfig.setConfigValue("-"+count);
-            iSysConfigService.insertConfig(sysConfig);
-        }else {
-            sysConfig.setConfigValue(String.valueOf((Long.parseLong(sysConfig.getConfigValue())-count)));
-            iSysConfigService.updateConfig(sysConfig);
+        log.info("数据跑完了,数据有:{}",totalTraffic);
+        if (totalTraffic > 0) {
+            updateConfig(sysConfig, totalTraffic);
+        }
+    }
+    private void updateConfig(SysConfig sysConfig, long trafficSum) {
+        try {
+            if (sysConfig == null) {
+                sysConfig = new SysConfig();
+                sysConfig.setConfigKey("redPacket.Traffic.config");
+                sysConfig.setConfigName("红包流量配置");
+                sysConfig.setConfigValue("-" + trafficSum);
+                iSysConfigService.insertConfig(sysConfig);
+            } else {
+                long newValue = Long.parseLong(sysConfig.getConfigValue()) - trafficSum;
+                sysConfig.setConfigValue(String.valueOf(newValue));
+                iSysConfigService.updateConfig(sysConfig);
+            }
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("配置值格式错误", e);
         }
-        fsCourseTrafficLogMapper.updateStatusByIds(ids,2);
     }
-
     private static String formatDuration(long millis) {
         long seconds = millis / 1000;
         long minutes = seconds / 60;

+ 79 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -12,6 +12,7 @@ import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
 import com.fs.company.cache.ICompanyCacheService;
 import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseFinishTemp;
@@ -29,6 +30,7 @@ import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.OptionsVO;
 import com.fs.qw.Bean.MsgBean;
+import com.fs.qw.cache.IQwExternalContactCacheService;
 import com.fs.qw.cache.IQwUserCacheService;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwExternalContactInfo;
@@ -91,6 +93,8 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
     @Autowired
     RedisCache redisCache;
     @Autowired
+    private IQwExternalContactCacheService qwExternalContactCacheService;
+    @Autowired
     private QwWatchLogMapper qwWatchLogMapper;
     @Autowired
     private FsUserCourseVideoMapper courseVideoMapper;
@@ -999,4 +1003,79 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                 totalCost,
                 totalCost > 0 ? String.format("%.2f", logs.size() * 1000.0 / totalCost) : "∞");
     }
+
+
+
+    @Override
+    public List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOexport(FsCourseWatchLogListParam param) {
+
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogMapper.selectFsCourseWatchLogListVOexport(param);
+        for (FsCourseWatchLogListVO item : list) {
+            // 项目
+            if(ObjectUtils.isNotNull(item.getProject())) {
+                String sysCourseProject = DictUtils.getDictLabel("sys_course_project", String.valueOf(item.getProject()));
+                if(StringUtils.isNotBlank(sysCourseProject)){
+                    item.setProjectName(sysCourseProject);
+                }
+            }
+            // 用户名
+            if(ObjectUtils.isNotNull(item.getUserId())) {
+                FsUser fsUser = fsUserCacheService.selectFsUserById(item.getUserId());
+                if(ObjectUtils.isNotNull(fsUser)){
+                    item.setExternalUserName(String.format("%s_%d",fsUser.getNickname(),fsUser.getUserId()));
+                    item.setFsNickName(fsUser.getNickname());
+                    item.setFsAvatar(fsUser.getAvatar());
+                }
+            }
+            // 公司名
+            if(ObjectUtils.isNotNull(item.getCompanyId())){
+                Company company = companyCacheService.selectCompanyById(Long.valueOf(item.getCompanyId()));
+                if(ObjectUtils.isNotNull(company)){
+                    item.setCompanyName(String.format("%s_%d", company.getCompanyName(), company.getCompanyId()));
+                }
+            }
+
+            // 销售名
+            if(ObjectUtils.isNotNull(item.getCompanyUserId())){
+                CompanyUser companyUser = companyUserCacheService.selectCompanyUserById(item.getCompanyUserId());
+                if(ObjectUtils.isNotNull(companyUser)){
+                    item.setCompanyUserName(String.format("%s_%d", companyUser.getNickName(), companyUser.getUserId()));
+                }
+            }
+
+            // 课程
+            if(ObjectUtils.isNotNull(item.getCourseId())){
+                FsUserCourse course = fsUserCourseCacheService.selectFsUserCourseByCourseId(item.getCourseId());
+                if(ObjectUtils.isNotNull(course)){
+                    item.setCourseName(course.getCourseName());
+                }
+            }
+            // 小节
+            if(ObjectUtils.isNotNull(item.getVideoId())){
+                FsUserCourseVideo fsUserCourseVideo = fsUserCourseVideoCacheService.selectFsUserCourseVideoByVideoId(item.getVideoId());
+                if(ObjectUtils.isNotNull(fsUserCourseVideo)){
+                    item.setVideoName(fsUserCourseVideo.getTitle());
+                }
+            }
+
+            // 企微用户名
+            if(ObjectUtils.isNotNull(item.getQwUserId())){
+                String qwUserName = qwUserCacheService.queryQwUserNameByUserId(item.getQwUserId());
+                if(StringUtils.isNotBlank(qwUserName)){
+                    item.setQwUserName(qwUserName);
+                }
+            }
+
+            // 企微外部联系人
+            if(ObjectUtils.isNotNull(item.getQwExternalContactId())){
+                String qwExternalContactName = qwExternalContactCacheService.selectQwExternalContactById(Long.valueOf(item.getQwExternalContactId()));
+                if(StringUtils.isNotBlank(qwExternalContactName)){
+                    item.setExternalUserName(qwExternalContactName);
+                }
+            }
+
+        }
+        return list;
+    }
+
 }

+ 3 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1594,6 +1594,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if(watchCourseVideo != null){
             if(!watchCourseVideo.getCompanyUserId().equals(param.getCompanyUserId())) {
                 //提示
+                log.error("数据库存在销售信息:{},分享得销售信息:{}",watchCourseVideo.getCompanyUserId(),param.getCompanyUserId());
                 return ResponseResult.fail(504, "已看过其他销售分享的此课程,不能重复观看");
             }
 
@@ -1864,10 +1865,10 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
         // 从Redis中获取观看时长
         String redisKey = "h5wxuser:watch:duration:" + param.getUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
-        log.info("看课redis缓存key:{}", redisKey);
+//        log.info("看课redis缓存key:{}", redisKey);
         try {
             String durationStr = redisCache.getCacheObject(redisKey);
-            log.info("看课记录:{}", durationStr);
+//            log.info("看课记录:{}", durationStr);
             long duration = durationStr != null ? Long.parseLong(durationStr) : 0L;
 
             // 更新Redis中的观看时长

+ 14 - 3
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java

@@ -26,20 +26,27 @@ public class FsCourseWatchLogListVO extends BaseEntity
     private Long userId;
 
     /** 小程序昵称 */
-//    @Excel(name = "小程序昵称")
+    @Excel(name = "小程序昵称")
     private String fsNickName;
 
     @Excel(name = "客户昵称")
     private String externalUserName;
 
     /** 外部联系人头像 */
-    @Excel(name = "客户头像")
+//    @Excel(name = "客户头像")
     private String externalUserAvatar;
 
     /** 客户头像 */
-//    @Excel(name = "客户头像")
+    @Excel(name = "小程序头像")
     private String fsAvatar;
 
+    /**
+     * 项目
+     */
+    private Integer project;
+    @Excel(name = "项目名称")
+    private String projectName;
+
     @Excel(name = "课程名称")
     private String courseName;
 
@@ -106,4 +113,8 @@ public class FsCourseWatchLogListVO extends BaseEntity
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date qecCreateTime;
 
+    private Long companyUserId;
+    private Long courseId;
+    private Long videoId;
+
 }

+ 6 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -550,7 +550,12 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         TransferBatchesRequest request = new TransferBatchesRequest();
         request.setAppid(config.getAppId());
 
-        String code = IdUtil.getSnowflake(0, 0).nextIdStr();
+        // todo 如果未配置负载均衡请还原原本的单号方式
+//        String code = IdUtil.getSnowflake(0, 0).nextIdStr();
+        String code =  OrderCodeUtils.getOrderSn();
+        if(StringUtils.isEmpty(code)){
+            return R.error("红包单号生成失败,请重试");
+        }
         request.setOutBatchNo("fsCourse" + code);
         request.setBatchRemark("课堂答题奖励");
         request.setBatchName("课堂答题奖励");

+ 25 - 17
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -839,10 +839,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), createTime, param.getCourseId(), param.getVideoId(),
                                     qwUserId, companyUserId, companyId, item.getExternalId(), config);
 
+                            String miniAppId = null;
+
                             if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
                                 Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
                                 if (integerListMap != null) {
-
                                     int effectiveGrade = (item.getGrade() == null) ? 5 : item.getGrade();
                                     int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
                                     List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
@@ -850,12 +851,18 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                     if (miniapps != null && !miniapps.isEmpty()) {
                                         CompanyMiniapp companyMiniapp = miniapps.get(0);
                                         if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                            st.setMiniprogramAppid(companyMiniapp.getAppId());
+                                            miniAppId = companyMiniapp.getAppId();
                                         }
                                     }
                                 }
-                            } else if (!StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
-                                st.setMiniprogramAppid(qwCompany.getMiniAppId());
+                            }
+
+                            if (StringUtil.strIsNullOrEmpty(miniAppId) && !StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
+                                miniAppId = qwCompany.getMiniAppId();
+                            }
+
+                            if (!StringUtil.strIsNullOrEmpty(miniAppId)) {
+                                st.setMiniprogramAppid(miniAppId);
                             } else {
                                 log.error("公司的小程序id为空:采用了前端传的固定值" + sopLogs.getSopId());
                             }
@@ -1207,18 +1214,12 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                     String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), dataTime, param.getCourseId(), param.getVideoId(),
                             String.valueOf(qwUser.getId()), companyUserId, companyId, item.getExternalId(), config);
 
-//                    if (StringUtil.strIsNullOrEmpty(config.getMiniprogramAppid())){
-//
-//                        log.error("配置中无小程序id,采用默认的");
-//
-//                        st.setMiniprogramAppid("wxc84c6f789ba7f176");
-//                    }else {
-//                        st.setMiniprogramAppid(config.getMiniprogramAppid());
-//                    }
+
+                    String miniAppId = null;
+
                     if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
                         Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
                         if (integerListMap != null) {
-
                             int effectiveGrade = (item.getGrade() == null) ? 5 : item.getGrade();
                             int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
                             List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
@@ -1226,16 +1227,23 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             if (miniapps != null && !miniapps.isEmpty()) {
                                 CompanyMiniapp companyMiniapp = miniapps.get(0);
                                 if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                    st.setMiniprogramAppid(companyMiniapp.getAppId());
+                                    miniAppId = companyMiniapp.getAppId();
                                 }
                             }
                         }
-                    } else if (!StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
-                        st.setMiniprogramAppid(qwCompany.getMiniAppId());
+                    }
+
+                    if (StringUtil.strIsNullOrEmpty(miniAppId) && !StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
+                        miniAppId = qwCompany.getMiniAppId();
+                    }
+
+                    if (!StringUtil.strIsNullOrEmpty(miniAppId)) {
+                        st.setMiniprogramAppid(miniAppId);
                     } else {
-                        log.error("企业未配置小程序-" + param.getCorpId());
+                        log.error("企业未配置小程序" +  param.getCorpId());
                     }
 
+
                     st.setMiniprogramPage(linkByMiniApp);
                     break;
                 default:

+ 0 - 73
fs-service/src/main/resources/application-config-druid-fcky.yml

@@ -1,73 +0,0 @@
-baidu:
-  token: 12313231232
-  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:
-  cp:
-    corpId:
-    appConfigs:
-  pay:
-    appId:  #微信公众号或者小程序等的appid
-    mchId:  #微信支付商户号
-    mchKey:  #微信支付商户密钥
-    subAppId:  #服务商模式下的子商户公众账号ID
-    subMchId:  #服务商模式下的子商户号
-    keyPath:  # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
-    notifyUrl:
-  mp:
-    useRedis: false
-    redisConfig:
-      host: 127.0.0.1
-      port: 6379
-      timeout: 2000
-    configs:
-      - appId: wxea1da2b708ab3c2f # 第一个公众号的appid  //公众号名称:爱尚佳园
-        secret: 981c60b03292f572039402d7ae09f91f # 公众号的appsecret
-        token: PPKOdAlCoMO # 接口配置里的Token值
-        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
-aifabu:  #爱链接
-  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
-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://10.206.0.16:8010
-  h5CommonApi: http://127.0.0.1:7771
-nuonuo:
-  key: 10924508
-  secret: A2EB20764D304D16
-
-# 存储捅配置
-tencent_cloud_config:
-  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
-  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
-  bucket: fcky-1323137866
-  app_id: 1323137866
-  region: ap-chongqing
-  proxy: fcky
-cloud_host:
-  company_name: 蜂巢快药
-headerImg:
-  imgUrl: https://fc-1361520560.cos.ap-beijing.myqcloud.com/fs/20250624/490729259f354c338ad6fc0fbbfe0e53.jpg
-ipad:
-  ipadUrl: http://ipad.cdwjyyh.com
-wx_miniapp_temp:
-  pay_order_temp_id:
-  inquiry_temp_id:
-
-

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

@@ -37,10 +37,10 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId:  # 第一个公众号的appid
-        secret:  # 公众号的appsecret
-        token:  # 接口配置里的Token值
-        aesKey:  # 接口配置里的EncodingAESKey值
+      - appId: wx6ee517a8d8743f88  # 第一个公众号的appid
+        secret: 1fac75465a61f9259a0fe19795d9e80d # 公众号的appsecret
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
 aifabu:  #爱链接
   appKey: 7b471be905ab17e00f3b858c6710dd117601d008
 watch:

+ 1 - 1
fs-service/src/main/resources/application-config-zkzh.yml

@@ -132,7 +132,7 @@ watch:
   password3: v9xsKuqn_$d2y
 
 fs:
-  commonApi: http://172.27.0.7:8010
+  commonApi: http://172.21.76.167:8010
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16

+ 0 - 150
fs-service/src/main/resources/application-druid-fcky.yml

@@ -1,150 +0,0 @@
-# 数据源配置
-spring:
-    profiles:
-        include: config-druid-fcky,common
-    # redis 配置
-    redis:
-        # 地址
-        host: 10.206.0.14
-        # 端口,默认为6379
-        port: 6379
-        # 数据库索引
-        database: 0
-        # 密码
-        password: Ylrz_1q2w3e4r5t6y
-        # 连接超时时间
-        timeout: 20s
-        lettuce:
-            pool:
-                # 连接池中的最小空闲连接
-                min-idle: 0
-                # 连接池中的最大空闲连接
-                max-idle: 8
-                # 连接池的最大数据库连接数
-                max-active: 8
-                # #连接池最大阻塞等待时间(使用负值表示没有限制)
-                max-wait: -1ms
-    datasource:
-        #        clickhouse:
-        #            type: com.alibaba.druid.pool.DruidDataSource
-        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
-        #            url: jdbc:clickhouse://cc-2vc8zzo26w0l7m2l6.public.clickhouse.ads.aliyuncs.com/sop?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
-        #            username: rt_2024
-        #            password: Yzx_19860213
-        #            initialSize: 10
-        #            maxActive: 100
-        #            minIdle: 10
-        #            maxWait: 6000
-        mysql:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://10.206.0.3:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Ylrz_1q2w3e4r5t6y
-                # 从库数据源
-                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://10.206.0.3:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Ylrz_1q2w3e4r5t6y
-                # 初始连接数
-                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

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

@@ -150,4 +150,6 @@ rocketmq:
         group: common-group
         access-key: ak16xj8o92zp984557f83ba2 # 替换为实际的 accessKey
         secret-key: sk2ff1c6b15b74b888 # 替换为实际的 secretKey
-
+openIM:
+    secret: openIM123
+    userID: imAdmin

+ 3 - 1
fs-service/src/main/resources/application-druid-myhk.yml

@@ -150,4 +150,6 @@ rocketmq:
         group: common-group
         access-key: ak16xj8o92zp984557f83ba2 # 替换为实际的 accessKey
         secret-key: sk2ff1c6b15b74b888 # 替换为实际的 secretKey
-
+openIM:
+    secret: openIM123
+    userID: imAdmin

+ 29 - 9
fs-service/src/main/resources/mapper/course/FsCourseAnswerLogsMapper.xml

@@ -152,29 +152,49 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="selectFsCourseAnswerLogsListVONewCount" resultType="java.lang.Long">
-        select count(1) from fs_course_answer_logs cal
-        left join fs_user_course uc on cal.course_id=uc.course_id
+        SELECT
+        count(1)
+        FROM
+        fs_course_answer_logs cal
+        INNER JOIN (
+        SELECT
+        cal_inner.log_id
+        FROM
+        fs_course_answer_logs cal_inner
+        LEFT JOIN fs_user_course uc_inner ON cal_inner.course_id = uc_inner.course_id
         <where>
             <if test="courseId != null">
-                cal.course_id = #{courseId}
+                cal_inner.course_id = #{courseId}
+            </if>
+            <if test="videoId != null and videoId != '' ">
+                AND cal_inner.video_id = #{videoId}
             </if>
             <if test="companyUserId != null">
-                AND cal.company_user_id = #{companyUserId}
+                AND cal_inner.company_user_id = #{companyUserId}
             </if>
             <if test="companyId != null">
-                AND cal.company_id = #{companyId}
+                AND cal_inner.company_id = #{companyId}
             </if>
             <if test="isRight != null">
-                AND is_right = #{isRight}
+                AND cal_inner.is_right = #{isRight}
             </if>
             <if test="project != null">
-                AND uc.project = #{project}
+                AND uc_inner.project = #{project}
             </if>
             <if test="sTime != null and eTime != null">
-                AND cal.create_time BETWEEN #{sTime} AND #{eTime}
+                AND cal_inner.create_time BETWEEN #{sTime} AND #{eTime}
+            </if>
+            <if test="userIds != null and userIds.size() > 0">
+                and cal_inner.user_id in
+                <foreach collection="userIds"  open="(" close=")" separator="," item="userId" index="index">
+                    #{userId}
+                </foreach>
+            </if>
+            <if test="watchLogId != null">
+                AND cal_inner.watch_log_id = #{watchLogId}
             </if>
-
         </where>
+        ) AS paged_ids ON cal.log_id = paged_ids.log_id
     </select>
 
 </mapper>

+ 1 - 0
fs-service/src/main/resources/mapper/course/FsCourseFinishTempMapper.xml

@@ -91,6 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="videoId != null">video_id = #{videoId},</if>
             <if test="companyUserIds != null">company_user_ids = #{companyUserIds},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="isAllCompanyUser != null">is_all_company_user = #{isAllCompanyUser},</if>
             <if test="isDel != null">is_del = #{isDel},</if>
         </trim>
         where id = #{id}

+ 96 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -726,4 +726,100 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
+
+    <select id="selectFsCourseWatchLogListVOexport" resultType="com.fs.course.vo.FsCourseWatchLogListVO">
+        SELECT
+        l.log_id,
+        l.project AS project,
+        l.user_id,
+        l.log_type,
+        SEC_TO_TIME(l.duration) AS duration,
+        l.camp_period_time,
+        l.finish_time,
+        l.send_type,
+        l.create_time,
+        l.update_time,
+        l.last_heartbeat_time,
+        l.company_id,
+        l.company_user_id,
+        l.course_id,
+        l.video_id,
+        l.qw_user_id,
+        l.qw_external_contact_id,
+        qec.create_time as qec_create_time
+        FROM
+        fs_course_watch_log l LEFT JOIN qw_external_contact qec on l.qw_external_contact_id = qec.id
+        left join fs_user u on u.user_id = l.user_id
+        left join company_user cu on cu.user_id = l.company_user_id
+        <where>
+            <if test ='maps.sendType !=null'>
+                and l.send_type = #{maps.sendType}
+            </if>
+            <if test ='maps.userId !=null'>
+                and l.user_id = #{maps.userId}
+            </if>
+            <if test ='maps.qwExternalContactId !=null'>
+                and l.qw_external_contact_id = #{maps.qwExternalContactId}
+            </if>
+            <if test ='maps.qwUserId !=null'>
+                and l.qw_user_id = #{maps.qwUserId}
+            </if>
+            <if test ='maps.courseId !=null'>
+                and l.course_id = #{maps.courseId}
+            </if>
+            <if test ='maps.videoId !=null'>
+                and l.video_id = #{maps.videoId}
+            </if>
+            <if test ='maps.logType !=null'>
+                and l.log_type = #{maps.logType}
+            </if>
+            <if test ='maps.companyId !=null'>
+                and l.company_id = #{maps.companyId}
+            </if>
+            <if test ='maps.companyUserId !=null'>
+                and l.company_user_id = #{maps.companyUserId}
+            </if>
+            <if test ='maps.companyUserName !=null and maps.companyUserName!=""'>
+                and cu.nick_name  like concat('%', #{maps.companyUserName}, '%')
+            </if>
+            <if test ='maps.nickName !=null and maps.nickName!=""'>
+                and u.nick_name  like concat('%', #{maps.nickName}, '%')
+            </if>
+            <if test ='maps.externalUserName !=null and maps.externalUserName!=""'>
+                and qec.name  like concat('%', #{maps.externalUserName}, '%')
+            </if>
+            <if test= 'maps.qecSTime != null '>
+                and DATE(qec.create_time) &gt;= DATE(#{maps.qecSTime})
+            </if>
+            <if test='maps.qecETime != null '>
+                and DATE(qec.create_time) &lt;= DATE(#{maps.qecETime})
+            </if>
+            <if test= 'maps.sTime != null '>
+                and DATE(l.create_time) &gt;= DATE(#{maps.sTime})
+            </if>
+            <if test='maps.eTime != null '>
+                and DATE(l.create_time) &lt;= DATE(#{maps.eTime})
+            </if>
+            <if test= 'maps.scheduleStartTime != null '>
+                and DATE(l.camp_period_time) &gt;= DATE(#{maps.scheduleStartTime})
+            </if>
+            <if test='maps.scheduleEndTime != null '>
+                and DATE(l.camp_period_time) &lt;= DATE(#{maps.scheduleEndTime})
+            </if>
+            <if test= 'maps.upSTime != null '>
+                and DATE(l.update_time) &gt;= DATE(#{maps.upSTime})
+            </if>
+            <if test='maps.upETime != null '>
+                and DATE(l.update_time) &lt;= DATE(#{maps.upETime})
+            </if>
+            <if test="maps.sopIds != null and maps.sopIds.size() > 0">
+                and l.sop_id in
+                <foreach item="sopId" index="index" collection="maps.sopIds" open="(" separator="," close=")">
+                    #{sopId}
+                </foreach>
+            </if>
+        </where>
+        order by l.finish_time desc,l.update_time desc,l.create_time desc
+    </select>
+
 </mapper>

+ 8 - 8
fs-service/src/main/resources/mapper/course/FsUserCourseVideoRedPackageMapper.xml

@@ -145,12 +145,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
-    <select id="selectRedPacketByCompanyId" resultType="com.fs.course.domain.FsUserCourseVideoRedPackage">
-        select * from fs_user_course_video_red_package
-        <where>
-            <if test="videoId != null "> and video_id =#{videoId}</if>
-            <if test="companyId != null "> and company_id = #{companyId}</if>
-            <if test="periodId != null "> and period_id = #{periodId}</if>
-        </where>
-    </select>
+<!--    <select id="selectRedPacketByCompanyId" resultType="com.fs.course.domain.FsUserCourseVideoRedPackage">-->
+<!--        select * from fs_user_course_video_red_package-->
+<!--        <where>-->
+<!--            <if test="videoId != null "> and video_id =#{videoId}</if>-->
+<!--            <if test="companyId != null "> and company_id = #{companyId}</if>-->
+<!--            <if test="periodId != null "> and period_id = #{periodId}</if>-->
+<!--        </where>-->
+<!--    </select>-->
 </mapper>

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

@@ -321,7 +321,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             order by
             <choose>
                 <when test = "continueMissCourseSort == 0">
-                    fs_user_company_user.create_time desc
+                    fs_user.create_time desc
                 </when>
                 <when test = "continueMissCourseSort == 1">
                     fs_user.nick_name asc
@@ -477,7 +477,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND u.user_id LIKE CONCAT("%",#{maps.userId},"%")
             </if >
             <if test = "maps.nickname != null and  maps.nickname !='' " >
-                AND u.nickname LIKE CONCAT("%",#{maps.nickname},"%")
+                AND u.nick_name LIKE CONCAT("%",#{maps.nickname},"%")
             </if >
             <if test = "maps.phone != null   and  maps.phone !='' " >
                 AND u.phone LIKE CONCAT("%",#{maps.phone},"%")
@@ -1652,9 +1652,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN company_user ON company_user.user_id = ucu.company_user_id
         LEFT JOIN company on company.company_id = company_user.company_id
         <where>
-            1 = 1 and u.nickname is not null
+            1 = 1 and u.nick_name is not null
             <if test = "maps.nickname != null and  maps.nickname !='' " >
-                AND u.nickname LIKE CONCAT("%",#{maps.nickname},"%")
+                AND u.nick_name LIKE CONCAT("%",#{maps.nickname},"%")
             </if >
             <if test = "maps.userId != null and  maps.userId !='' " >
                 AND u.user_id = #{maps.userId}