Переглянути джерело

Merge remote-tracking branch 'origin/master'

吴树波 1 тиждень тому
батько
коміт
a941f8c7b9
37 змінених файлів з 1039 додано та 264 видалено
  1. 12 1
      fs-admin/src/main/java/com/fs/web/controller/system/SysDictDataController.java
  2. 151 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysKeywordController.java
  3. 6 6
      fs-admin/src/main/resources/logback.xml
  4. 93 0
      fs-company-app/src/main/resources/logback.xml
  5. 6 6
      fs-company/src/main/resources/logback.xml
  6. 6 6
      fs-qw-api/src/main/resources/logback.xml
  7. 1 1
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  8. 6 6
      fs-qw-task/src/main/resources/logback.xml
  9. 6 6
      fs-qwhook-msg/src/main/resources/logback.xml
  10. 6 6
      fs-qwhook-sop/src/main/resources/logback.xml
  11. 6 6
      fs-qwhook/src/main/resources/logback.xml
  12. 1 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyMenuServiceImpl.java
  13. 42 2
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchCommentServiceImpl.java
  14. 27 18
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  15. 2 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseFinishTempListVO.java
  16. 3 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchCommentVO.java
  17. 3 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  18. 3 0
      fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java
  19. 4 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  20. 48 0
      fs-service/src/main/java/com/fs/system/domain/SysKeyword.java
  21. 65 0
      fs-service/src/main/java/com/fs/system/mapper/SysKeywordMapper.java
  22. 69 0
      fs-service/src/main/java/com/fs/system/service/ISysKeywordService.java
  23. 98 0
      fs-service/src/main/java/com/fs/system/service/impl/SysKeywordServiceImpl.java
  24. 5 3
      fs-service/src/main/resources/mapper/course/FsCourseWatchCommentMapper.xml
  25. 1 1
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  26. 0 1
      fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml
  27. 92 0
      fs-service/src/main/resources/mapper/system/SysKeywordMapper.xml
  28. 43 0
      fs-user-app/src/main/java/com/fs/app/controller/CourseController.java
  29. 0 51
      fs-user-app/src/main/java/com/fs/app/controller/CourseH5Controller.java
  30. 8 3
      fs-user-app/src/main/java/com/fs/app/controller/WxPayController.java
  31. 92 0
      fs-user-app/src/main/java/com/fs/framework/config/DataSourceConfig.java
  32. 123 123
      fs-user-app/src/main/java/com/fs/framework/config/DruidConfig.java
  33. 2 2
      fs-user-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
  34. 0 5
      fs-user-app/src/main/java/com/fs/framework/datasource/DynamicDataSource.java
  35. 2 3
      fs-user-app/src/main/java/com/fs/framework/datasource/DynamicDataSourceContextHolder.java
  36. 1 2
      fs-user-app/src/main/java/com/fs/websocket/service/WebSocketServer.java
  37. 6 6
      fs-user-app/src/main/resources/logback.xml

+ 12 - 1
fs-admin/src/main/java/com/fs/web/controller/system/SysDictDataController.java

@@ -26,7 +26,7 @@ import com.fs.system.service.ISysDictTypeService;
 
 /**
  * 数据字典信息
- * 
+ *
 
  */
 @RestController
@@ -117,4 +117,15 @@ public class SysDictDataController extends BaseController
         dictDataService.deleteDictDataByIds(dictCodes);
         return success();
     }
+
+
+    /**
+     * 不分页获取列表
+     */
+    @GetMapping("/allList")
+    public AjaxResult allList(SysDictData dictData) {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        return AjaxResult.success(list);
+    }
+
 }

+ 151 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysKeywordController.java

@@ -0,0 +1,151 @@
+package com.fs.web.controller.system;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.system.domain.SysKeyword;
+import com.fs.system.service.ISysKeywordService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.PostConstruct;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 系统关键字Controller
+ *
+ * @author fs
+ * @date 2025-05-14
+ */
+@RestController
+@RequestMapping("/system/keyword")
+public class SysKeywordController extends BaseController
+{
+    @Autowired
+    private ISysKeywordService sysKeywordService;
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    public RedisTemplate<String,String> redisTemplate;
+
+    private static final String REDIS_KEY = "sys:keywords";
+
+    /**
+     * 查询系统关键字列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:keyword:list')")
+    @GetMapping("/list")
+    public R list(SysKeyword sysKeyword)
+    {
+//        startPage();
+        PageHelper.startPage(sysKeyword.getPageNum(), sysKeyword.getPageSize());
+        List<SysKeyword> list = sysKeywordService.selectSysKeywordList(sysKeyword);
+
+        PageInfo<SysKeyword> pageInfo = new PageInfo<>(list);
+        Map<String, Object> result = new HashMap<>();
+        result.put("rows", pageInfo.getList());
+        result.put("total", pageInfo.getTotal());
+        return R.ok(result);
+    }
+
+    /**
+     * 导出系统关键字列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:keyword:export')")
+    @Log(title = "系统关键字", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysKeyword sysKeyword)
+    {
+        List<SysKeyword> list = sysKeywordService.selectSysKeywordList(sysKeyword);
+        ExcelUtil<SysKeyword> util = new ExcelUtil<SysKeyword>(SysKeyword.class);
+        return util.exportExcel(list, "系统关键字数据");
+    }
+
+    /**
+     * 获取系统关键字详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:keyword:query')")
+    @GetMapping(value = "/{keywordId}")
+    public AjaxResult getInfo(@PathVariable("keywordId") Long keywordId)
+    {
+        return AjaxResult.success(sysKeywordService.selectSysKeywordById(keywordId));
+    }
+
+    /**
+     * 新增系统关键字
+     */
+    @PreAuthorize("@ss.hasPermi('system:keyword:add')")
+    @Log(title = "系统关键字", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysKeyword sysKeyword)
+    {
+        int i = sysKeywordService.insertSysKeyword(sysKeyword);
+        // 缓存
+        redisTemplate.opsForSet().add(REDIS_KEY, sysKeyword.getKeyword());
+        return toAjax(i);
+    }
+
+    /**
+     * 修改系统关键字
+     */
+    @PreAuthorize("@ss.hasPermi('system:keyword:edit')")
+    @Log(title = "系统关键字", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysKeyword sysKeyword)
+    {
+        //获取之前的数据
+        SysKeyword sysKeywordOld = sysKeywordService.selectSysKeywordById(sysKeyword.getKeywordId());
+        String keywordOld = sysKeywordOld.getKeyword();
+        int i = sysKeywordService.updateSysKeyword(sysKeyword);
+        // 更新缓存
+        redisTemplate.opsForSet().remove(REDIS_KEY, keywordOld);
+        redisTemplate.opsForSet().add(REDIS_KEY, sysKeyword.getKeyword());
+        return toAjax(i);
+    }
+
+    /**
+     * 删除系统关键字
+     */
+    @PreAuthorize("@ss.hasPermi('system:keyword:remove')")
+    @Log(title = "系统关键字", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{keywordIds}")
+    public AjaxResult remove(@PathVariable Long[] keywordIds)
+    {
+        List<SysKeyword> sysKeywords = sysKeywordService.selectSysKeywordByIds(keywordIds);
+        int i = sysKeywordService.deleteSysKeywordByIds(keywordIds);
+        if (!CollectionUtils.isEmpty(sysKeywords)) {
+            redisTemplate.opsForSet().remove(REDIS_KEY, sysKeywords.stream().map(SysKeyword::getKeyword).toArray(String[]::new));
+        }
+        return toAjax(i);
+    }
+
+    /**
+     * 启动加载全部关键字到缓存
+     */
+    @PostConstruct
+    public void initKeywords() {
+        SysKeyword sysKeywordParam = new SysKeyword();
+        List<SysKeyword> sysKeywords = sysKeywordService.selectSysKeywordList(sysKeywordParam);
+        List<String> keywords = sysKeywords.stream()
+                .map(SysKeyword::getKeyword)
+                .collect(Collectors.toList());
+
+        if (!keywords.isEmpty()) {
+            redisTemplate.opsForSet().add(REDIS_KEY, keywords.toArray(new String[0]));
+        }
+        System.out.println("加载全部关键字到缓存");
+    }
+}

+ 6 - 6
fs-admin/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 93 - 0
fs-company-app/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/home/fs-company-app/logs" />
+    <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+	<!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+	<!-- 系统模块日志级别控制  -->
+	<logger name="com.fs" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration>

+ 6 - 6
fs-company/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 6 - 6
fs-qw-api/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

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

@@ -1667,7 +1667,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                 finishLogsToUpdate.add(finishLog);
 
                 if (finishTemp == null) {
-                    log.error("完课模板不存在: " + finishLog.getCompanyUserId() + ", " + finishLog.getVideoId());
+//                    log.error("完课模板不存在: " + finishLog.getCompanyUserId() + ", " + finishLog.getVideoId());
                     continue;
                 }
 

+ 6 - 6
fs-qw-task/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 6 - 6
fs-qwhook-msg/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 6 - 6
fs-qwhook-sop/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 6 - 6
fs-qwhook/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 1 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyMenuServiceImpl.java

@@ -233,6 +233,7 @@ public class CompanyMenuServiceImpl implements ICompanyMenuService
         else
         {
             menu.getParams().put("userId", userId);
+//            menu.setStatus("0");
             menuList = companyMenuMapper.selectCompanyMenuList(menu);
         }
         return menuList;

+ 42 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchCommentServiceImpl.java

@@ -1,13 +1,22 @@
 package com.fs.course.service.impl;
 
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.course.param.FsCourseWatchCommentListParam;
 import com.fs.course.param.FsCourseWatchCommentSaveParam;
 import com.fs.course.vo.FsCourseWatchCommentVO;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.system.domain.SysKeyword;
+import com.fs.system.mapper.SysKeywordMapper;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsCourseWatchCommentMapper;
 import com.fs.course.domain.FsCourseWatchComment;
@@ -22,6 +31,20 @@ import com.fs.course.service.IFsCourseWatchCommentService;
 @Service
 public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCommentMapper, FsCourseWatchComment> implements IFsCourseWatchCommentService {
 
+    private static final String REDIS_KEY = "sys:keywords";
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+
+    @Autowired
+    public RedisTemplate<String,String> redisTemplate;
+
+    @Autowired
+    private SysKeywordMapper mapper;
+
     /**
      * 查询看课评论
      *
@@ -98,12 +121,29 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
 
     @Override
     public R saveH5CourseWatchComment(FsCourseWatchCommentSaveParam param) {
+        // 需求:查询是否包含关键字,包含则不保存,并且需要将用户标记为黑名单;
+        Set<String>  keywords = redisTemplate.opsForSet().members(REDIS_KEY);
+        if(keywords == null || keywords.isEmpty()){
+            SysKeyword sysKeywordParam = new SysKeyword();
+            List<SysKeyword> sysKeywords = mapper.selectSysKeywordList(sysKeywordParam);
+            keywords = sysKeywords.stream().map(SysKeyword::getKeyword).collect(Collectors.toSet());
+        }
+        if (keywords.isEmpty()) {
+            return R.ok().put("status", true);
+        }
+        for (String keyword : keywords) {
+            if (param.getContent().contains(keyword)) {
+                //标记用户为黑名单
+                qwExternalContactMapper.updateQwExternalContactByFsUserId(1, param.getUserId());
+                return R.ok().put("status", false);
+            }
+        }
         FsCourseWatchComment fsCourseWatchComment = new FsCourseWatchComment();
         BeanUtils.copyProperties(param, fsCourseWatchComment);
         fsCourseWatchComment.setCreateTime(DateUtils.getNowDate());
         int i = baseMapper.insertFsCourseWatchComment(fsCourseWatchComment);
-        if (i > 0){
-            return R.ok();
+        if (i > 0) {
+            return R.ok().put("status", true);
         } else {
             return R.error();
         }

+ 27 - 18
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -382,18 +382,30 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     }
 
     private R handleRoom(FsUserCourseVideoAddKfUParam param,FsUser user) {
-        if (user.getQwExtId()==null){
+        //查询客户列表
+        List<QwExternalContact> contacts = qwExternalContactMapper.selectQwExternalContactListVOByfsUserId(user.getUserId());
+        if (contacts.isEmpty()){
             return R.error("未注册");
         }
-        param.setQwExternalId(user.getQwExtId());
-        //查询是否有添加客服
-        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
-        if (externalContact==null){
-            return R.error("客户不存在!");
-        }
-        if (!externalContact.getQwUserId().equals(param.getUserId())){
-            return R.error("无权限观看,添加群主非本群主");
+        //找出对应销售匹配的客户
+        QwExternalContact matchedContact = contacts.stream()
+                .filter(contact -> contact.getQwUserId().equals(Long.parseLong(param.getQwUserId())))
+                .findFirst()
+                .orElse(null);
+
+        if (matchedContact==null){
+            return R.error("无权限观看,添加本群主");
         }
+
+        param.setQwExternalId(matchedContact.getId());
+//        //查询是否有添加客服
+//        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
+//        if (externalContact==null){
+//            return R.error("客户不存在!");
+//        }
+//        if (!externalContact.getQwUserId().equals(param.getUserId())){
+//            return R.error("无权限观看,添加群主非本群主");
+//        }
         FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(param.getQwExternalId(), param.getVideoId(),param.getQwUserId());
         if (log==null){
             createWatchLog(param);
@@ -582,11 +594,13 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Override
     public R getInternetTraffic(FsUserCourseVideoFinishUParam param) {
         try {
+            if (param.getBufferRate()==null){
+                logger.error("zyp \n【缓冲值空】参数: {}",param);
+                return R.error("缓冲值空");
+            }
             FsCourseTrafficLog trafficLog = new FsCourseTrafficLog();
             trafficLog.setQwExternalContactId(param.getQwExternalId());
-            trafficLog.setUserId(param.getUserId());
             trafficLog.setCreateTime(new Date());
-//            trafficLog.setTime(new Date());
             BeanUtils.copyProperties(param, trafficLog);
 
             FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(param.getVideoId());
@@ -604,17 +618,12 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             if (StringUtils.isNotEmpty(trafficLog.getUuId())) {
                 // 直接插入或更新
 //                logger.error("zyp \n【插入或更新流量】:{}",trafficLog);
-//                if(ObjectUtils.isNotNull(trafficLog.getCourseId())) {
-//                    FsUserCourse course = fsUserCourseCacheService.selectFsUserCourseByCourseId(trafficLog.getCourseId());
-//                    if(ObjectUtils.isNotNull(course)){
-//                        trafficLog.setProject(course.getProject());
-//                    }
-//                }
                 fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
             }
         } catch (Exception e) {
             e.printStackTrace();
-            logger.error("zyp \n【插入或更新流量失败】:{}",e.getMessage());
+            // 打印参数param和异常信息
+            logger.error("zyp \n【插入或更新流量失败】参数: {}, 错误信息:{}", param, e.getMessage(), e);
             return R.error();
         }
         return R.ok();

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

@@ -62,4 +62,6 @@ public class FsCourseFinishTempListVO implements Serializable
     /** 更新时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
+
+    private Integer isAllCompanyUser;
 }

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

@@ -16,6 +16,9 @@ public class FsCourseWatchCommentVO{
     @ApiModelProperty(value = "用户id")
     private Long userId;
 
+    @ApiModelProperty(value = "用户名称")
+    private String nickName;
+
     @ApiModelProperty(value = "用户类型,1-管理员,2-用户")
     private Integer userType;
 

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

@@ -55,6 +55,7 @@ public class FsCourseWatchLogListVO extends BaseEntity
     @Excel(name = "企业微信员工名称")
     private String qwUserName;
 
+
     @Excel(name = "所属销售")
     private String companyUserName;
 
@@ -93,4 +94,6 @@ public class FsCourseWatchLogListVO extends BaseEntity
     @Excel(name = "外部联系人名称")
     private String externalUserName; //外部联系人名称
 
+    private String externalUserAvatar;//外部联系人头像
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java

@@ -121,4 +121,7 @@ public class QwExternalContact extends BaseEntity
 
     private Integer lastWatchTime;
 
+    //看课评论状态,1-拉黑;0-正常
+    private Integer commentStatus;
+
 }

+ 4 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -366,4 +366,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
     @Select("select * from qw_external_contact where fs_user_id = #{fsUserId}")
     List<QwExternalContact> selectQwExternalContactListVOByfsUserId(Long fsUserId);
+
+    @Update("update qw_external_contact set comment_status = #{commentStatus} where fs_user_id = #{fsUserId}")
+    int updateQwExternalContactByFsUserId(@Param("commentStatus") Integer commentStatus, @Param("fsUserId")Long fsUserId);
+
 }

+ 48 - 0
fs-service/src/main/java/com/fs/system/domain/SysKeyword.java

@@ -0,0 +1,48 @@
+package com.fs.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 系统关键字对象 sys_keyword
+ *
+ * @author fs
+ * @date 2025-05-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysKeyword extends BaseEntity{
+
+    @TableField(exist = false)
+    private Integer pageNum;
+
+    @TableField(exist = false)
+    private Integer pageSize;
+
+    /** 关键字id */
+    private Long keywordId;
+
+    /** 关键字 */
+    @Excel(name = "关键字")
+    private String keyword;
+
+//    /** 类型:1-看课弹幕; */
+//    @Excel(name = "类型:1-看课弹幕;")
+//    private Integer type;
+
+    /** 所属公司 */
+    @Excel(name = "所属公司")
+    private Long companyId;
+
+    @TableField(exist = false)
+    @Excel(name = "类型名称")
+    private String typeName;
+
+    @TableField(exist = false)
+    @Excel(name = "公司名称")
+    private String companyName;
+
+}

+ 65 - 0
fs-service/src/main/java/com/fs/system/mapper/SysKeywordMapper.java

@@ -0,0 +1,65 @@
+package com.fs.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.system.domain.SysKeyword;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 系统关键字Mapper接口
+ *
+ * @author fs
+ * @date 2025-05-14
+ */
+public interface SysKeywordMapper extends BaseMapper<SysKeyword>{
+    /**
+     * 查询系统关键字
+     *
+     * @param keywordId 系统关键字主键
+     * @return 系统关键字
+     */
+    SysKeyword selectSysKeywordById(Long keywordId);
+
+    /**
+     * 查询系统关键字列表
+     *
+     * @param sysKeyword 系统关键字
+     * @return 系统关键字集合
+     */
+    List<SysKeyword> selectSysKeywordList(SysKeyword sysKeyword);
+
+    /**
+     * 新增系统关键字
+     *
+     * @param sysKeyword 系统关键字
+     * @return 结果
+     */
+    int insertSysKeyword(SysKeyword sysKeyword);
+
+    /**
+     * 修改系统关键字
+     *
+     * @param sysKeyword 系统关键字
+     * @return 结果
+     */
+    int updateSysKeyword(SysKeyword sysKeyword);
+
+    /**
+     * 删除系统关键字
+     *
+     * @param keywordId 系统关键字主键
+     * @return 结果
+     */
+    int deleteSysKeywordById(Long keywordId);
+
+    /**
+     * 批量删除系统关键字
+     *
+     * @param keywordIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteSysKeywordByIds(@Param("keywordIds") Long[] keywordIds);
+
+    List<SysKeyword> selectSysKeywordByIds(@Param("keywordIds") Long[] keywordIds);
+}

+ 69 - 0
fs-service/src/main/java/com/fs/system/service/ISysKeywordService.java

@@ -0,0 +1,69 @@
+package com.fs.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.system.domain.SysKeyword;
+
+import java.util.List;
+
+/**
+ * 系统关键字Service接口
+ *
+ * @author fs
+ * @date 2025-05-14
+ */
+public interface ISysKeywordService extends IService<SysKeyword>{
+    /**
+     * 查询系统关键字
+     *
+     * @param keywordId 系统关键字主键
+     * @return 系统关键字
+     */
+    SysKeyword selectSysKeywordById(Long keywordId);
+
+    /**
+     * 查询系统关键字列表
+     *
+     * @param sysKeyword 系统关键字
+     * @return 系统关键字集合
+     */
+    List<SysKeyword> selectSysKeywordList(SysKeyword sysKeyword);
+
+    /**
+     * 新增系统关键字
+     *
+     * @param sysKeyword 系统关键字
+     * @return 结果
+     */
+    int insertSysKeyword(SysKeyword sysKeyword);
+
+    /**
+     * 修改系统关键字
+     *
+     * @param sysKeyword 系统关键字
+     * @return 结果
+     */
+    int updateSysKeyword(SysKeyword sysKeyword);
+
+    /**
+     * 批量删除系统关键字
+     *
+     * @param keywordIds 需要删除的系统关键字主键集合
+     * @return 结果
+     */
+    int deleteSysKeywordByIds(Long[] keywordIds);
+
+    /**
+     * 删除系统关键字信息
+     *
+     * @param keywordId 系统关键字主键
+     * @return 结果
+     */
+    int deleteSysKeywordById(Long keywordId);
+
+    /**
+     * 查询指定ids的关键字
+     * @param keywordIds
+     * @return
+     */
+    List<SysKeyword> selectSysKeywordByIds(Long[] keywordIds);
+}

+ 98 - 0
fs-service/src/main/java/com/fs/system/service/impl/SysKeywordServiceImpl.java

@@ -0,0 +1,98 @@
+package com.fs.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.system.domain.SysKeyword;
+import com.fs.system.mapper.SysKeywordMapper;
+import com.fs.system.service.ISysKeywordService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * 系统关键字Service业务层处理
+ *
+ * @author fs
+ * @date 2025-05-14
+ */
+@Service
+public class SysKeywordServiceImpl extends ServiceImpl<SysKeywordMapper, SysKeyword> implements ISysKeywordService {
+
+    /**
+     * 查询系统关键字
+     *
+     * @param keywordId 系统关键字主键
+     * @return 系统关键字
+     */
+    @Override
+    public SysKeyword selectSysKeywordById(Long keywordId)
+    {
+        return baseMapper.selectSysKeywordById(keywordId);
+    }
+
+    /**
+     * 查询系统关键字列表
+     *
+     * @param sysKeyword 系统关键字
+     * @return 系统关键字
+     */
+    @Override
+    public List<SysKeyword> selectSysKeywordList(SysKeyword sysKeyword)
+    {
+        return baseMapper.selectSysKeywordList(sysKeyword);
+    }
+
+    /**
+     * 新增系统关键字
+     *
+     * @param sysKeyword 系统关键字
+     * @return 结果
+     */
+    @Override
+    public int insertSysKeyword(SysKeyword sysKeyword)
+    {
+        sysKeyword.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertSysKeyword(sysKeyword);
+    }
+
+    /**
+     * 修改系统关键字
+     *
+     * @param sysKeyword 系统关键字
+     * @return 结果
+     */
+    @Override
+    public int updateSysKeyword(SysKeyword sysKeyword)
+    {
+        sysKeyword.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateSysKeyword(sysKeyword);
+    }
+
+    /**
+     * 批量删除系统关键字
+     *
+     * @param keywordIds 需要删除的系统关键字主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysKeywordByIds(Long[] keywordIds)
+    {
+        return baseMapper.deleteSysKeywordByIds(keywordIds);
+    }
+
+    /**
+     * 删除系统关键字信息
+     *
+     * @param keywordId 系统关键字主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysKeywordById(Long keywordId)
+    {
+        return baseMapper.deleteSysKeywordById(keywordId);
+    }
+
+    @Override
+    public List<SysKeyword> selectSysKeywordByIds(Long[] keywordIds) {
+        return baseMapper.selectSysKeywordByIds(keywordIds);
+    }
+}

+ 5 - 3
fs-service/src/main/resources/mapper/course/FsCourseWatchCommentMapper.xml

@@ -98,11 +98,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <select id="selectH5CourseWatchComments" resultType="com.fs.course.vo.FsCourseWatchCommentVO">
-        select comment_id, user_id, user_type, course_id, video_id, type, content, create_time from fs_course_watch_comment
+        select cwc.comment_id, cwc.user_id, cwc.user_type, cwc.course_id, cwc.video_id, cwc.type, cwc.content, cwc.create_time,
+        fs_user.nick_name from fs_course_watch_comment cwc
+        left join fs_user on fs_user.user_id = cwc.user_id
         <where>
-           and is_revoke = 0
+           and cwc.is_revoke = 0
         </where>
-        order by create_time desc
+        order by cwc.create_time desc
     </select>
 
 </mapper>

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

@@ -52,7 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where log_id = #{logId}
     </select>
     <select id="selectFsCourseWatchLogListVO" resultType="com.fs.course.vo.FsCourseWatchLogListVO">
-        select l.log_id,l.user_id,uc.course_name,v.title as video_name,u.nick_name as fsNickName, u.avatar as fsAvatar,
+        select l.log_id,l.user_id,uc.course_name,v.title as video_name,qec.avatar as external_user_avatar,
         l.log_type,SEC_TO_TIME(l.duration) as duration,c.company_name,l.camp_period_time,l.finish_time,
         cu.nick_name as company_user_name ,l.send_type,l.create_time,l.update_time,l.last_heartbeat_time,
         qu.qw_user_name,qec.name as external_user_name,c.company_id

+ 0 - 1
fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml

@@ -192,7 +192,6 @@
         where a.start_time &lt;= Now()
           and a.status = 1
           and b.send_type != 4 and b.status in (2,3)
-        and sop_id = 'b3d86baabe5b58b25977c48853ea0a34'
     </select>
 
     <select id="meetsTheRatingByUserInfo"   resultMap="SopUserLogsResult">

+ 92 - 0
fs-service/src/main/resources/mapper/system/SysKeywordMapper.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.system.mapper.SysKeywordMapper">
+
+    <resultMap type="SysKeyword" id="SysKeywordResult">
+        <result property="keywordId"    column="keyword_id"    />
+        <result property="keyword"    column="keyword"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectSysKeyword">
+        select keyword_id, keyword, company_id, create_time, update_time from sys_keyword
+    </sql>
+
+    <sql id="selectSysKeywordVo">
+        SELECT
+            keyword_id,
+            keyword,
+            sys_keyword.company_id,
+            sys_keyword.create_time,
+            sys_keyword.update_time,
+            company.company_name
+        FROM
+            sys_keyword
+                LEFT JOIN company ON company.company_id = sys_keyword.company_id
+    </sql>
+
+    <select id="selectSysKeywordList" parameterType="SysKeyword" resultMap="SysKeywordResult">
+        <include refid="selectSysKeywordVo"/>
+        <where>
+            <if test="keyword != null  and keyword != ''"> and keyword like concat('%', #{keyword}, '%')</if>
+            <if test="companyId != null "> and sys_keyword.company_id = #{companyId}</if>
+        </where>
+    </select>
+
+    <select id="selectSysKeywordById" parameterType="Long" resultMap="SysKeywordResult">
+        <include refid="selectSysKeywordVo"/>
+        where keyword_id = #{keywordId}
+    </select>
+
+    <insert id="insertSysKeyword" parameterType="SysKeyword" useGeneratedKeys="true" keyProperty="keywordId">
+        insert into sys_keyword
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="keyword != null">keyword,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="keyword != null">#{keyword},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysKeyword" parameterType="SysKeyword">
+        update sys_keyword
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="keyword != null">keyword = #{keyword},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where keyword_id = #{keywordId}
+    </update>
+
+    <delete id="deleteSysKeywordById" parameterType="Long">
+        delete from sys_keyword where keyword_id = #{keywordId}
+    </delete>
+
+    <delete id="deleteSysKeywordByIds" parameterType="String">
+        delete from sys_keyword where keyword_id in
+        <foreach item="keywordId" collection="keywordIds" open="(" separator="," close=")">
+            #{keywordId}
+        </foreach>
+    </delete>
+
+
+    <select id="selectSysKeywordByIds" parameterType="Long" resultMap="SysKeywordResult">
+        <include refid="selectSysKeyword"/>
+        where keyword_id in
+        <foreach item="keywordId" collection="keywordIds" open="(" separator="," close=")">
+            #{keywordId}
+        </foreach>
+    </select>
+
+</mapper>

+ 43 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseController.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
@@ -22,6 +23,7 @@ import com.github.pagehelper.PageInfo;
 import io.jsonwebtoken.Claims;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.Synchronized;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -76,6 +78,9 @@ public class CourseController extends  AppBaseController{
     @Autowired
     private CachingOperationNameGenerator cachingOperationNameGenerator;
 
+    @Autowired
+    private IFsCourseWatchCommentService courseWatchCommentService;
+
 
     @Cacheable(value="getCourseCate" )
     @ApiOperation("获取分类")
@@ -516,4 +521,42 @@ public class CourseController extends  AppBaseController{
 
 //        courseVideoService.updateVideoUrl();
     }
+
+    @Login
+    @ApiOperation("保存评论数据")
+    @PostMapping("/saveMsg")
+    public R saveMsg(@RequestBody FsCourseWatchCommentSaveParam param)
+    {
+        param.setUserId(Long.parseLong(getUserId()));
+        return courseWatchCommentService.saveH5CourseWatchComment(param);
+    }
+
+    @Login
+    @ApiOperation("撤销评论")
+    @PutMapping("/revokeMsg")
+    public R revokeMsg(@ApiParam(value = "评论id", required = true) @RequestParam Long commentId)
+    {
+        return courseWatchCommentService.revokeH5CourseWatchComment(commentId);
+    }
+
+    @ApiOperation("获取历史评论数据")
+    @GetMapping("/getComments")
+    public ResponseResult<PageInfo<FsCourseWatchCommentVO>> getCourseWatchComments(@ApiParam(value = "页码", required = true) @RequestParam Integer pageNum,
+            @ApiParam(value = "每页大小", required = true) @RequestParam Integer pageSize)
+    {
+        //获取配置信息中需要查询的数据条数
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+
+        FsCourseWatchCommentListParam param = new FsCourseWatchCommentListParam();
+        param.setPageNum(pageNum);
+        param.setPageSize(pageSize);
+//        param.setListNum(config.getViewCommentNum() != null &&  config.getViewCommentNum() != 0 ? config.getViewCommentNum() : 200);
+
+        PageHelper.startPage(pageNum, pageSize);
+        List<FsCourseWatchCommentVO> list = courseWatchCommentService.selectH5CourseWatchComments(param);
+        PageInfo<FsCourseWatchCommentVO> pageInfo = new PageInfo<>(list);
+        return ResponseResult.ok(pageInfo);
+    }
+
 }

+ 0 - 51
fs-user-app/src/main/java/com/fs/app/controller/CourseH5Controller.java

@@ -2,27 +2,21 @@ package com.fs.app.controller;
 
 
 import cn.hutool.json.JSONUtil;
-import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
-import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
 import com.fs.course.param.*;
 import com.fs.course.service.*;
 import com.fs.course.vo.*;
 import com.fs.system.service.ISysConfigService;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.List;
 
 @Api("h5课堂接口")
 @RestController
@@ -43,10 +37,6 @@ public class CourseH5Controller extends  AppBaseController{
     @Autowired
     private IFsCourseWatchLogService courseWatchLogService;
 
-    @Autowired
-    private IFsCourseWatchCommentService courseWatchCommentService;
-
-
     @ApiOperation("h5课程简介")
     @GetMapping("/getH5CourseByVideoId")
     public R getCourseByVideoId(@RequestParam("videoId") Long videoId,HttpServletRequest request)
@@ -126,45 +116,4 @@ public class CourseH5Controller extends  AppBaseController{
     public void getErrMsg(@RequestParam("msg") String msg) {
         logger.error("zyp \n【h5看课中途报错】:{}",msg);
     }
-
-    @Login
-    @ApiOperation("保存评论数据")
-    @PostMapping("/saveMsg")
-    public R saveMsg(@RequestBody FsCourseWatchCommentSaveParam param)
-    {
-//        param.setUserId(Long.parseLong(getUserId()));
-        return courseWatchCommentService.saveH5CourseWatchComment(param);
-    }
-
-    @Login
-    @ApiOperation("撤销评论")
-    @PutMapping("/revokeMsg")
-    public R revokeMsg(@ApiParam(value = "评论id", required = true) @RequestParam Long commentId)
-    {
-        return courseWatchCommentService.revokeH5CourseWatchComment(commentId);
-    }
-
-    @ApiOperation("获取历史评论数据")
-    @GetMapping("/getComments")
-    public ResponseResult<PageInfo<FsCourseWatchCommentVO>> getCourseWatchComments(@ApiParam(value = "页码", required = true) @RequestParam Integer pageNum,
-                                                 @ApiParam(value = "每页大小", required = true) @RequestParam Integer pageSize)
-    {
-        //获取配置信息中需要查询的数据条数
-        String json = configService.selectConfigByKey("course.config");
-        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-
-        FsCourseWatchCommentListParam param = new FsCourseWatchCommentListParam();
-        param.setPageNum(pageNum);
-        param.setPageSize(pageSize);
-        param.setListNum(config.getViewCommentNum() != null &&  config.getViewCommentNum() != 0 ? config.getViewCommentNum() : 200);
-
-        PageHelper.startPage(pageNum, pageSize);
-        List<FsCourseWatchCommentVO> list = courseWatchCommentService.selectH5CourseWatchComments(param);
-        PageInfo<FsCourseWatchCommentVO> pageInfo = new PageInfo<>(list);
-        return ResponseResult.ok(pageInfo);
-    }
-
-
-
-
 }

+ 8 - 3
fs-user-app/src/main/java/com/fs/app/controller/WxPayController.java

@@ -16,6 +16,7 @@ import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.service.IFsStorePaymentService;
+import com.fs.sop.service.ISopUserLogsInfoService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
@@ -69,6 +70,9 @@ public class WxPayController {
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private ISopUserLogsInfoService iSopUserLogsInfoService;
+
 
     /**
      * 微信回调
@@ -133,9 +137,10 @@ public class WxPayController {
 
 
 
-
-
-
+    @GetMapping("/test")
+    public void test(){
+        iSopUserLogsInfoService.updateSopUserInfoByExternalId(1L,123456L);
+    }
 
 
 

+ 92 - 0
fs-user-app/src/main/java/com/fs/framework/config/DataSourceConfig.java

@@ -0,0 +1,92 @@
+package com.fs.framework.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.util.Utils;
+import com.fs.common.enums.DataSourceType;
+import com.fs.framework.datasource.DynamicDataSource;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.servlet.*;
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class DataSourceConfig {
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.sop.druid.master")
+    public DataSource sopDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.master")
+    public DataSource masterDataSource() {
+        return new DruidDataSource();
+    }
+
+
+
+    @Bean
+    @Primary
+    public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
+        Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
+        return new DynamicDataSource(masterDataSource, targetDataSources);
+    }
+
+    /**
+     * 去除监控页面底部的广告
+     */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Bean
+    @ConditionalOnProperty(name = "spring.datasource.mysql.druid.statViewServlet.enabled", havingValue = "true")
+    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
+    {
+        // 获取web监控页面的参数
+        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+        // 提取common.js的配置路径
+        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+        final String filePath = "support/http/resources/js/common.js";
+        // 创建filter进行过滤
+        Filter filter = new Filter()
+        {
+            @Override
+            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
+            {
+            }
+            @Override
+            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+                    throws IOException, ServletException
+            {
+                chain.doFilter(request, response);
+                // 重置缓冲区,响应头不会被重置
+                response.resetBuffer();
+                // 获取common.js
+                String text = Utils.readFromResource(filePath);
+                // 正则替换banner, 除去底部的广告信息
+                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+                response.getWriter().write(text);
+            }
+            @Override
+            public void destroy()
+            {
+            }
+        };
+        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+        registrationBean.setFilter(filter);
+        registrationBean.addUrlPatterns(commonJsPattern);
+        return registrationBean;
+    }
+}

+ 123 - 123
fs-user-app/src/main/java/com/fs/framework/config/DruidConfig.java

@@ -1,123 +1,123 @@
-package com.fs.framework.config;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.sql.DataSource;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import com.alibaba.druid.pool.DruidDataSource;
-import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
-import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
-import com.alibaba.druid.util.Utils;
-import com.fs.common.enums.DataSourceType;
-import com.fs.common.utils.spring.SpringUtils;
-import com.fs.framework.config.properties.DruidProperties;
-import com.fs.framework.datasource.DynamicDataSource;
-
-/**
- * druid 配置多数据源
- * 
-
- */
-@Configuration
-public class DruidConfig
-{
-    @Bean
-    @ConfigurationProperties(prefix = "spring.datasource.sop.druid.master")
-    public DataSource sopDataSource() {
-        return new DruidDataSource();
-    }
-
-    @Bean
-    @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.master")
-    public DataSource masterDataSource() {
-        return new DruidDataSource();
-    }
-
-
-
-    @Bean
-    @Primary
-    public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
-        Map<Object, Object> targetDataSources = new HashMap<>();
-        targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
-        return new DynamicDataSource(masterDataSource, targetDataSources);
-    }
-    
-    /**
-     * 设置数据源
-     * 
-     * @param targetDataSources 备选数据源集合
-     * @param sourceName 数据源名称
-     * @param beanName bean名称
-     */
-    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
-    {
-        try
-        {
-            DataSource dataSource = SpringUtils.getBean(beanName);
-            targetDataSources.put(sourceName, dataSource);
-        }
-        catch (Exception e)
-        {
-        }
-    }
-
-    /**
-     * 去除监控页面底部的广告
-     */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    @Bean
-    @ConditionalOnProperty(name = "spring.datasource.mysql.druid.statViewServlet.enabled", havingValue = "true")
-    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
-    {
-        // 获取web监控页面的参数
-        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
-        // 提取common.js的配置路径
-        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
-        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
-        final String filePath = "support/http/resources/js/common.js";
-        // 创建filter进行过滤
-        Filter filter = new Filter()
-        {
-            @Override
-            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
-            {
-            }
-            @Override
-            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-                    throws IOException, ServletException
-            {
-                chain.doFilter(request, response);
-                // 重置缓冲区,响应头不会被重置
-                response.resetBuffer();
-                // 获取common.js
-                String text = Utils.readFromResource(filePath);
-                // 正则替换banner, 除去底部的广告信息
-                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
-                text = text.replaceAll("powered.*?shrek.wang</a>", "");
-                response.getWriter().write(text);
-            }
-            @Override
-            public void destroy()
-            {
-            }
-        };
-        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
-        registrationBean.setFilter(filter);
-        registrationBean.addUrlPatterns(commonJsPattern);
-        return registrationBean;
-    }
-}
+//package com.fs.framework.config;
+//
+//import java.io.IOException;
+//import java.util.HashMap;
+//import java.util.Map;
+//import javax.servlet.Filter;
+//import javax.servlet.FilterChain;
+//import javax.servlet.ServletException;
+//import javax.servlet.ServletRequest;
+//import javax.servlet.ServletResponse;
+//import javax.sql.DataSource;
+//
+//import org.springframework.beans.factory.annotation.Qualifier;
+//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//import org.springframework.boot.web.servlet.FilterRegistrationBean;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Primary;
+//import com.alibaba.druid.pool.DruidDataSource;
+//import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+//import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+//import com.alibaba.druid.util.Utils;
+//import com.fs.common.enums.DataSourceType;
+//import com.fs.common.utils.spring.SpringUtils;
+//import com.fs.framework.config.properties.DruidProperties;
+//import com.fs.framework.datasource.DynamicDataSource;
+//
+///**
+// * druid 配置多数据源
+// *
+//
+// */
+//@Configuration
+//public class DruidConfig
+//{
+//    @Bean
+//    @ConfigurationProperties(prefix = "spring.datasource.sop.druid.master")
+//    public DataSource sopDataSource() {
+//        return new DruidDataSource();
+//    }
+//
+//    @Bean
+//    @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.master")
+//    public DataSource masterDataSource() {
+//        return new DruidDataSource();
+//    }
+//
+//
+//
+//    @Bean
+//    @Primary
+//    public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
+//        Map<Object, Object> targetDataSources = new HashMap<>();
+//        targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
+//        return new DynamicDataSource(masterDataSource, targetDataSources);
+//    }
+//
+//    /**
+//     * 设置数据源
+//     *
+//     * @param targetDataSources 备选数据源集合
+//     * @param sourceName 数据源名称
+//     * @param beanName bean名称
+//     */
+//    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
+//    {
+//        try
+//        {
+//            DataSource dataSource = SpringUtils.getBean(beanName);
+//            targetDataSources.put(sourceName, dataSource);
+//        }
+//        catch (Exception e)
+//        {
+//        }
+//    }
+//
+//    /**
+//     * 去除监控页面底部的广告
+//     */
+//    @SuppressWarnings({ "rawtypes", "unchecked" })
+//    @Bean
+//    @ConditionalOnProperty(name = "spring.datasource.mysql.druid.statViewServlet.enabled", havingValue = "true")
+//    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
+//    {
+//        // 获取web监控页面的参数
+//        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+//        // 提取common.js的配置路径
+//        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+//        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+//        final String filePath = "support/http/resources/js/common.js";
+//        // 创建filter进行过滤
+//        Filter filter = new Filter()
+//        {
+//            @Override
+//            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
+//            {
+//            }
+//            @Override
+//            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+//                    throws IOException, ServletException
+//            {
+//                chain.doFilter(request, response);
+//                // 重置缓冲区,响应头不会被重置
+//                response.resetBuffer();
+//                // 获取common.js
+//                String text = Utils.readFromResource(filePath);
+//                // 正则替换banner, 除去底部的广告信息
+//                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+//                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+//                response.getWriter().write(text);
+//            }
+//            @Override
+//            public void destroy()
+//            {
+//            }
+//        };
+//        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+//        registrationBean.setFilter(filter);
+//        registrationBean.addUrlPatterns(commonJsPattern);
+//        return registrationBean;
+//    }
+//}

+ 2 - 2
fs-user-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -28,7 +28,7 @@ import java.util.List;
 
 /**
  * Mybatis支持*匹配扫描包
- * 
+ *
 
  */
 @Configuration
@@ -148,4 +148,4 @@ public class MyBatisConfig
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
         return sessionFactory.getObject();
     }
-}
+}

+ 0 - 5
fs-user-app/src/main/java/com/fs/framework/datasource/DynamicDataSource.java

@@ -19,11 +19,6 @@ public class DynamicDataSource extends AbstractRoutingDataSource
         super.afterPropertiesSet();
     }
 
-    public static void setDataSource(String dataSourceType) {
-        // 确保使用数据源类型的字符串值
-        DynamicDataSourceContextHolder.setDataSourceType(dataSourceType);
-    }
-
     @Override
     protected Object determineCurrentLookupKey()
     {

+ 2 - 3
fs-user-app/src/main/java/com/fs/framework/datasource/DynamicDataSourceContextHolder.java

@@ -5,11 +5,10 @@ import org.slf4j.LoggerFactory;
 
 /**
  * 数据源切换处理
- * 
+ *
 
  */
-public class DynamicDataSourceContextHolder
-{
+public class DynamicDataSourceContextHolder {
     public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
 
     /**

+ 1 - 2
fs-user-app/src/main/java/com/fs/websocket/service/WebSocketServer.java

@@ -1,7 +1,6 @@
 package com.fs.websocket.service;
 
 import com.alibaba.fastjson.JSONObject;
-import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.StringUtils;
@@ -75,7 +74,7 @@ public class WebSocketServer {
                     break;
                 case "sendMsg":
                     // 分发消息
-                    sendMessageToAll(JSONObject.toJSONString(R.ok().put("data", msg)));
+                    sendMessageToAll(JSONObject.toJSONString(msg));
                     break;
             }
         } catch (Exception e) {

+ 6 - 6
fs-user-app/src/main/resources/logback.xml

@@ -19,8 +19,8 @@
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -41,8 +41,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<!-- 日志最大的历史 30 -->
+			<maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -63,8 +63,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>