Procházet zdrojové kódy

Merge remote-tracking branch 'refs/remotes/origin/master' into openIm

zx před 2 týdny
rodič
revize
e65bc9be05
42 změnil soubory, kde provedl 956 přidání a 73 odebrání
  1. 2 8
      fs-admin/src/main/java/com/fs/course/controller/FsCourseTrafficLogController.java
  2. 97 0
      fs-admin/src/main/java/com/fs/fastGpt/FastgptChatArtificialWordsController.java
  3. 23 4
      fs-admin/src/main/java/com/fs/his/controller/FsArticleCateController.java
  4. 7 2
      fs-admin/src/main/java/com/fs/his/controller/FsDoctorArticleController.java
  5. 20 4
      fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java
  6. 23 0
      fs-common/src/main/java/com/fs/common/utils/CloudHostUtils.java
  7. 10 0
      fs-common/src/main/java/com/fs/common/utils/spring/SpringUtils.java
  8. 1 1
      fs-company-app/src/main/java/com/fs/app/config/WebMvcConfig.java
  9. 5 1
      fs-company-app/src/main/java/com/fs/app/controller/AppBaseController.java
  10. 7 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  11. 6 2
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorArticleController.java
  12. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java
  13. 3 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  14. 3 0
      fs-service/src/main/java/com/fs/course/param/PeriodCountParam.java
  15. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  16. 1 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  17. 2 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  18. 62 0
      fs-service/src/main/java/com/fs/fastGpt/mapper/FastgptChatArtificialWordsMapper.java
  19. 62 0
      fs-service/src/main/java/com/fs/fastGpt/service/IFastgptChatArtificialWordsService.java
  20. 106 0
      fs-service/src/main/java/com/fs/fastGpt/service/impl/FastgptChatArtificialWordsServiceImpl.java
  21. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsExportTaskServiceImpl.java
  22. 9 5
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  23. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  24. 1 1
      fs-service/src/main/java/com/fs/qw/service/impl/QwUserVoiceLogServiceImpl.java
  25. 1 0
      fs-service/src/main/java/com/fs/qw/vo/QwUserVoiceLogTotalVo.java
  26. 1 1
      fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java
  27. 3 2
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  28. 6 5
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  29. 1 1
      fs-service/src/main/resources/application-config-druid-hdt.yml
  30. 2 1
      fs-service/src/main/resources/application-config-druid-qdtst.yml
  31. 2 2
      fs-service/src/main/resources/application-config-druid-syysy.yml
  32. 172 0
      fs-service/src/main/resources/application-druid-jzzx-test.yml
  33. 5 1
      fs-service/src/main/resources/application-druid-jzzx.yml
  34. 168 0
      fs-service/src/main/resources/application-druid-qdtst-test.yml
  35. 18 0
      fs-service/src/main/resources/application-druid-qdtst.yml
  36. 10 11
      fs-service/src/main/resources/application-druid-syysy.yml
  37. 5 1
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  38. 76 0
      fs-service/src/main/resources/mapper/fastGpt/FastgptChatArtificialWordsMapper.xml
  39. 1 0
      fs-service/src/main/resources/mapper/his/FsArticleCateMapper.xml
  40. 22 14
      fs-service/src/main/resources/mapper/qw/QwUserVoiceLogMapper.xml
  41. 8 1
      fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  42. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 2 - 8
fs-admin/src/main/java/com/fs/course/controller/FsCourseTrafficLogController.java

@@ -1,6 +1,7 @@
 package com.fs.course.controller;
 
 import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -50,14 +51,7 @@ public class FsCourseTrafficLogController extends BaseController
     public TableDataInfo list(FsCourseTrafficLogParam param)
     {
         startPage();
-        if (param.getTime() != null) {
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
-            String formattedDate = sdf.format(param.getTime());
-            String[] parts = formattedDate.split("-");
-            param.setYear(Integer.parseInt(parts[0]));
-            param.setMonth(Integer.parseInt(parts[1]));
-        }
-        List<FsCourseTrafficLogListVO> list = fsCourseTrafficLogService.selectTrafficByCompany(param);
+        List<FsCourseTrafficLogListVO> list = fsCourseTrafficLogService.selectTrafficNew(param);
         return getDataTable(list);
     }
 

+ 97 - 0
fs-admin/src/main/java/com/fs/fastGpt/FastgptChatArtificialWordsController.java

@@ -0,0 +1,97 @@
+package com.fs.fastGpt;
+
+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.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.fastGpt.domain.FastgptChatArtificialWords;
+import com.fs.fastGpt.service.IFastgptChatArtificialWordsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 转人工提示词Controller
+ * 
+ * @author fs
+ * @date 2025-05-07
+ */
+@RestController
+@RequestMapping("/fastGpt/fastgptChatArtificialWords")
+public class FastgptChatArtificialWordsController extends BaseController
+{
+    @Autowired
+    private IFastgptChatArtificialWordsService fastgptChatArtificialWordsService;
+
+    /**
+     * 查询转人工提示词列表
+     */
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastgptChatArtificialWords:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        startPage();
+        List<FastgptChatArtificialWords> list = fastgptChatArtificialWordsService.selectFastgptChatArtificialWordsList(fastgptChatArtificialWords);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出转人工提示词列表
+     */
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastgptChatArtificialWords:export')")
+    @Log(title = "转人工提示词", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        List<FastgptChatArtificialWords> list = fastgptChatArtificialWordsService.selectFastgptChatArtificialWordsList(fastgptChatArtificialWords);
+        ExcelUtil<FastgptChatArtificialWords> util = new ExcelUtil<FastgptChatArtificialWords>(FastgptChatArtificialWords.class);
+        return util.exportExcel(list, "转人工提示词数据");
+    }
+
+    /**
+     * 获取转人工提示词详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastgptChatArtificialWords:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fastgptChatArtificialWordsService.selectFastgptChatArtificialWordsById(id));
+    }
+
+    /**
+     * 新增转人工提示词
+     */
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastgptChatArtificialWords:add')")
+    @Log(title = "转人工提示词", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        return toAjax(fastgptChatArtificialWordsService.insertFastgptChatArtificialWords(fastgptChatArtificialWords));
+    }
+
+    /**
+     * 修改转人工提示词
+     */
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastgptChatArtificialWords:edit')")
+    @Log(title = "转人工提示词", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        return toAjax(fastgptChatArtificialWordsService.updateFastgptChatArtificialWords(fastgptChatArtificialWords));
+    }
+
+    /**
+     * 删除转人工提示词
+     */
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastgptChatArtificialWords:remove')")
+    @Log(title = "转人工提示词", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fastgptChatArtificialWordsService.deleteFastgptChatArtificialWordsByIds(ids));
+    }
+}

+ 23 - 4
fs-admin/src/main/java/com/fs/his/controller/FsArticleCateController.java

@@ -1,7 +1,9 @@
 package com.fs.his.controller;
 
+import java.util.Collection;
 import java.util.List;
 
+import com.fs.common.core.redis.RedisCache;
 import com.fs.his.vo.OptionsVO;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,7 +26,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 文章分类Controller
- * 
+ *
  * @author fs
  * @date 2023-07-04
  */
@@ -34,6 +36,8 @@ public class FsArticleCateController extends BaseController
 {
     @Autowired
     private IFsArticleCateService fsArticleCateService;
+    @Autowired
+    RedisCache redisCache;
 
     /**
      * 查询文章分类列表
@@ -78,7 +82,12 @@ public class FsArticleCateController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody FsArticleCate fsArticleCate)
     {
-        return toAjax(fsArticleCateService.insertFsArticleCate(fsArticleCate));
+        int i = fsArticleCateService.insertFsArticleCate(fsArticleCate);
+        Collection<String> keys = redisCache.keys("getArticleCateList*");
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+        return toAjax(i);
     }
 
     /**
@@ -89,7 +98,12 @@ public class FsArticleCateController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody FsArticleCate fsArticleCate)
     {
-        return toAjax(fsArticleCateService.updateFsArticleCate(fsArticleCate));
+        int i = fsArticleCateService.updateFsArticleCate(fsArticleCate);
+        Collection<String> keys = redisCache.keys("getArticleCateList*");
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+        return toAjax(i);
     }
 
     /**
@@ -100,7 +114,12 @@ public class FsArticleCateController extends BaseController
 	@DeleteMapping("/{cateIds}")
     public AjaxResult remove(@PathVariable Long[] cateIds)
     {
-        return toAjax(fsArticleCateService.deleteFsArticleCateByCateIds(cateIds));
+        int i = fsArticleCateService.deleteFsArticleCateByCateIds(cateIds);
+        Collection<String> keys = redisCache.keys("getArticleCateList*");
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+        return toAjax(i);
     }
 
     /**

+ 7 - 2
fs-admin/src/main/java/com/fs/his/controller/FsDoctorArticleController.java

@@ -100,9 +100,14 @@ public class FsDoctorArticleController extends BaseController
     {
         fsDoctorArticleService.updateFsDoctorArticle(fsDoctorArticle);
         Collection<String> keys = redisCache.keys("getDoctorArticleList*");
-        for (String key : keys) {
-            redisCache.deleteObject(key);
+        Collection<String> details = redisCache.keys("getDoctorArticleById::" +fsDoctorArticle.getArticleId());
+        keys.addAll(details);
+        if (!keys.isEmpty()) {
+            for (String key : keys) {
+                redisCache.deleteObject(key);
+            }
         }
+
         return toAjax(1);
     }
 

+ 20 - 4
fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java

@@ -4,7 +4,9 @@ import java.util.List;
 import java.util.Set;
 
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysRole;
 import com.fs.common.utils.PatternUtils;
+import com.fs.system.service.ISysRoleService;
 import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
@@ -24,7 +26,7 @@ import com.fs.system.service.ISysMenuService;
 
 /**
  * 登录验证
- * 
+ *
 
  */
 @RestController
@@ -40,9 +42,12 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private ISysRoleService roleService;
+
     /**
      * 登录方法
-     * 
+     *
      * @param loginBody 登录信息
      * @return 结果
      */
@@ -62,7 +67,7 @@ public class SysLoginController
 
     /**
      * 获取用户信息
-     * 
+     *
      * @return 用户信息
      */
     @GetMapping("getInfo")
@@ -75,14 +80,25 @@ public class SysLoginController
         Set<String> permissions = permissionService.getMenuPermission(user);
         AjaxResult ajax = AjaxResult.success();
         ajax.put("user", user);
+        Integer isAdmin = 0;
+        if (permissions.contains("*:*:*")){
+            isAdmin = 1;
+        }else {
+            List<SysRole> roleList = user.getRoles();
+            if (roleList != null && !roleList.isEmpty()) {
+                Long[] roleIds = roleList.stream().map(SysRole::getRoleId).toArray(Long[]::new);
+                isAdmin = roleService.getIsCheckPhone(roleIds)?1:0;
+            }
+        }
         ajax.put("roles", roles);
         ajax.put("permissions", permissions);
+        ajax.put("isAdmin", isAdmin);
         return ajax;
     }
 
     /**
      * 获取路由信息
-     * 
+     *
      * @return 路由信息
      */
     @GetMapping("getRouters")

+ 23 - 0
fs-common/src/main/java/com/fs/common/utils/CloudHostUtils.java

@@ -0,0 +1,23 @@
+package com.fs.common.utils;
+
+
+import com.fs.common.utils.spring.SpringUtils;
+
+public class CloudHostUtils {
+
+    /**
+     * 是否指定项目名称配置
+     */
+    public static boolean isCloudHostName(String cloudHostName) {
+        String cloudHostNameConfig = SpringUtils.getProperty("cloud_host.company_name");
+        if (StringUtils.isBlank(cloudHostNameConfig)) {
+            return false;
+        }
+
+        if (StringUtils.isBlank(cloudHostName)) {
+            return false;
+        }
+
+        return cloudHostNameConfig.equalsIgnoreCase(cloudHostName);
+    }
+}

+ 10 - 0
fs-common/src/main/java/com/fs/common/utils/spring/SpringUtils.java

@@ -143,4 +143,14 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
         final String[] activeProfiles = getActiveProfiles();
         return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
     }
+
+    /**
+     * 获取配置文件配置项的值
+     *
+     * @param key 配置项key
+     * @return 属性值
+     */
+    public static String getProperty(String key) {
+        return applicationContext.getEnvironment().getProperty(key);
+    }
 }

+ 1 - 1
fs-company-app/src/main/java/com/fs/app/config/WebMvcConfig.java

@@ -26,4 +26,4 @@ public class WebMvcConfig implements WebMvcConfigurer {
 //    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
 //        argumentResolvers.add(loginUserHandlerMethodArgumentResolver);
 //    }
-}
+}

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

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.fs.app.exception.FSException;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.redis.RedisCache;
@@ -34,7 +35,10 @@ public class AppBaseController {
 	{
 		String headValue =  ServletUtils.getRequest().getHeader("APPToken");
 		Claims claims=jwtUtils.getClaimByToken(headValue);
-		String userId = claims.getSubject().toString();
+		if (ObjectUtil.isEmpty(claims)){
+			throw new FSException("未授权,请先登录!");
+		}
+		String userId = claims.getSubject();
 		return userId;
 	}
 	public Long getCompanyUserId() {

+ 7 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java

@@ -638,4 +638,11 @@ public class QwExternalContactController extends BaseController
         return getDataTable(qwUserDelLossLogVOS);
     }
 
+    @GetMapping("/delLossStatisticsExport")
+    public AjaxResult delLossStatisticsExport(QwUserDelLossLogParam param){
+        List<QwUserDelLossLogVO> qwUserDelLossLogVOS = qwExternalContactService.selectQwUserDelLossLogList(param);
+        ExcelUtil<QwUserDelLossLogVO> util = new ExcelUtil<QwUserDelLossLogVO>(QwUserDelLossLogVO.class);
+        return util.exportExcel(qwUserDelLossLogVOS, "企微用户删除流失统计");
+    }
+
 }

+ 6 - 2
fs-doctor-app/src/main/java/com/fs/app/controller/DoctorArticleController.java

@@ -103,8 +103,12 @@ public class DoctorArticleController extends  AppBaseController {
 
         if(doctorArticleService.updateFsDoctorArticle(param)>0){
             Collection<String> keys = redisCache.keys("getDoctorArticleList*");
-            for (String key : keys) {
-                redisCache.deleteObject(key);
+            Collection<String> details = redisCache.keys("getDoctorArticleById::" +param.getArticleId());
+            keys.addAll(details);
+            if (!keys.isEmpty()) {
+                for (String key : keys) {
+                    redisCache.deleteObject(key);
+                }
             }
             return R.ok();
         }

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

@@ -70,6 +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);
 

+ 3 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java

@@ -75,4 +75,7 @@ public class FsCourseWatchLogListParam implements Serializable {
      * 部门类型 00 管理员 01 员工
      */
     private String userType;
+
+    //是否是会员
+    private Integer isVip;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/param/PeriodCountParam.java

@@ -30,5 +30,8 @@ public class PeriodCountParam implements Serializable {
 
     private LocalDate maxDate;
 
+    @ApiModelProperty(value = "公司ID")
+    private Long companyId;
+
 }
 

+ 1 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -245,6 +245,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         CourseAnalysisParam courseAnalysisParam = new CourseAnalysisParam();
         courseAnalysisParam.setPeriodId(param.getPeriodId());
         courseAnalysisParam.setVideoIdList(param.getVideoIdList());
+        courseAnalysisParam.setCompanyId(param.getCompanyId());
         List<FsCourseAnalysisCountVO> courseCountList = fsUserMapper.courseAnalysisWatchLog(courseAnalysisParam);
         List<FsCourseAnalysisCountVO> redPacketCountList = fsUserMapper.courseAnalysisRedPacketCount(courseAnalysisParam);
         List<FsCourseAnalysisCountVO> answerCountList = fsUserMapper.courseAnalysisAnswerCount(courseAnalysisParam);

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

@@ -926,7 +926,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
     public R sendRewardByFsUser(FsCourseSendRewardUParam param) {
         FsUser user = fsUserMapper.selectFsUserByUserId(param.getUserId());
         if (user == null){
@@ -1200,7 +1199,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 try {
                     handleFsUserWx(user,param.getAppId());
                 }catch (Exception e){
-                    logger.error("zyp \n 【更新或插入用户与小程序的绑定关系失败】:{}", user.getUserId());
+                    logger.error("zyp \n 【更新或插入用户与小程序的绑定关系失败】:{}", user.getUserId(),e);
                 }
 
             }else {

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

@@ -116,5 +116,7 @@ public class FsCourseWatchLogListVO extends BaseEntity
     private Long companyUserId;
     private Long courseId;
     private Long videoId;
+    private Integer isVip;
+
 
 }

+ 62 - 0
fs-service/src/main/java/com/fs/fastGpt/mapper/FastgptChatArtificialWordsMapper.java

@@ -0,0 +1,62 @@
+package com.fs.fastGpt.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.fastGpt.domain.FastgptChatArtificialWords;
+
+import java.util.List;
+
+/**
+ * 转人工提示词Mapper接口
+ * 
+ * @author fs
+ * @date 2025-05-07
+ */
+public interface FastgptChatArtificialWordsMapper extends BaseMapper<FastgptChatArtificialWords>{
+    /**
+     * 查询转人工提示词
+     * 
+     * @param id 转人工提示词主键
+     * @return 转人工提示词
+     */
+    FastgptChatArtificialWords selectFastgptChatArtificialWordsById(Long id);
+
+    /**
+     * 查询转人工提示词列表
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 转人工提示词集合
+     */
+    List<FastgptChatArtificialWords> selectFastgptChatArtificialWordsList(FastgptChatArtificialWords fastgptChatArtificialWords);
+
+    /**
+     * 新增转人工提示词
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 结果
+     */
+    int insertFastgptChatArtificialWords(FastgptChatArtificialWords fastgptChatArtificialWords);
+
+    /**
+     * 修改转人工提示词
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 结果
+     */
+    int updateFastgptChatArtificialWords(FastgptChatArtificialWords fastgptChatArtificialWords);
+
+    /**
+     * 删除转人工提示词
+     * 
+     * @param id 转人工提示词主键
+     * @return 结果
+     */
+    int deleteFastgptChatArtificialWordsById(Long id);
+
+    /**
+     * 批量删除转人工提示词
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFastgptChatArtificialWordsByIds(Long[] ids);
+}

+ 62 - 0
fs-service/src/main/java/com/fs/fastGpt/service/IFastgptChatArtificialWordsService.java

@@ -0,0 +1,62 @@
+package com.fs.fastGpt.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.fastGpt.domain.FastgptChatArtificialWords;
+
+import java.util.List;
+
+/**
+ * 转人工提示词Service接口
+ * 
+ * @author fs
+ * @date 2025-05-07
+ */
+public interface IFastgptChatArtificialWordsService extends IService<FastgptChatArtificialWords>{
+    /**
+     * 查询转人工提示词
+     * 
+     * @param id 转人工提示词主键
+     * @return 转人工提示词
+     */
+    FastgptChatArtificialWords selectFastgptChatArtificialWordsById(Long id);
+
+    /**
+     * 查询转人工提示词列表
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 转人工提示词集合
+     */
+    List<FastgptChatArtificialWords> selectFastgptChatArtificialWordsList(FastgptChatArtificialWords fastgptChatArtificialWords);
+
+    /**
+     * 新增转人工提示词
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 结果
+     */
+    int insertFastgptChatArtificialWords(FastgptChatArtificialWords fastgptChatArtificialWords);
+
+    /**
+     * 修改转人工提示词
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 结果
+     */
+    int updateFastgptChatArtificialWords(FastgptChatArtificialWords fastgptChatArtificialWords);
+
+    /**
+     * 批量删除转人工提示词
+     * 
+     * @param ids 需要删除的转人工提示词主键集合
+     * @return 结果
+     */
+    int deleteFastgptChatArtificialWordsByIds(Long[] ids);
+
+    /**
+     * 删除转人工提示词信息
+     * 
+     * @param id 转人工提示词主键
+     * @return 结果
+     */
+    int deleteFastgptChatArtificialWordsById(Long id);
+}

+ 106 - 0
fs-service/src/main/java/com/fs/fastGpt/service/impl/FastgptChatArtificialWordsServiceImpl.java

@@ -0,0 +1,106 @@
+package com.fs.fastGpt.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
+import com.fs.fastGpt.domain.FastgptChatArtificialWords;
+import com.fs.fastGpt.mapper.FastgptChatArtificialWordsMapper;
+import com.fs.fastGpt.service.IFastgptChatArtificialWordsService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 转人工提示词Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-05-07
+ */
+@Service
+public class FastgptChatArtificialWordsServiceImpl extends ServiceImpl<FastgptChatArtificialWordsMapper, FastgptChatArtificialWords> implements IFastgptChatArtificialWordsService {
+
+    /**
+     * 查询转人工提示词
+     * 
+     * @param id 转人工提示词主键
+     * @return 转人工提示词
+     */
+    @Override
+    public FastgptChatArtificialWords selectFastgptChatArtificialWordsById(Long id)
+    {
+        return baseMapper.selectFastgptChatArtificialWordsById(id);
+    }
+
+    /**
+     * 查询转人工提示词列表
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 转人工提示词
+     */
+    @Override
+    public List<FastgptChatArtificialWords> selectFastgptChatArtificialWordsList(FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        return baseMapper.selectFastgptChatArtificialWordsList(fastgptChatArtificialWords);
+    }
+
+    /**
+     * 新增转人工提示词
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 结果
+     */
+    @Override
+    public int insertFastgptChatArtificialWords(FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        String content = fastgptChatArtificialWords.getContent();
+        if(content == null || "".equals(content)){
+            throw new CustomException("文本不能为空!");
+        }
+        Long type = fastgptChatArtificialWords.getType();
+        if(type == null){
+            throw new CustomException("类型不能为空!");
+        }
+        Long sort = fastgptChatArtificialWords.getSort();
+        if(sort == null){
+            throw new CustomException("排序不能为空!");
+        }
+        fastgptChatArtificialWords.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFastgptChatArtificialWords(fastgptChatArtificialWords);
+    }
+
+    /**
+     * 修改转人工提示词
+     * 
+     * @param fastgptChatArtificialWords 转人工提示词
+     * @return 结果
+     */
+    @Override
+    public int updateFastgptChatArtificialWords(FastgptChatArtificialWords fastgptChatArtificialWords)
+    {
+        return baseMapper.updateFastgptChatArtificialWords(fastgptChatArtificialWords);
+    }
+
+    /**
+     * 批量删除转人工提示词
+     * 
+     * @param ids 需要删除的转人工提示词主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFastgptChatArtificialWordsByIds(Long[] ids)
+    {
+        return baseMapper.deleteFastgptChatArtificialWordsByIds(ids);
+    }
+
+    /**
+     * 删除转人工提示词信息
+     * 
+     * @param id 转人工提示词主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFastgptChatArtificialWordsById(Long id)
+    {
+        return baseMapper.deleteFastgptChatArtificialWordsById(id);
+    }
+}

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

@@ -173,7 +173,7 @@ public class FsExportTaskServiceImpl implements IFsExportTaskService
                 if (vo.getUserPhone() != null && isAdmin && vo.getUserPhone().length()>11) {
                     vo.setUserPhone(PhoneUtil.decryptPhone(vo.getUserPhone()));
                 }
-                if (vo.getUserAddress() != null) {
+                if (vo.getUserAddress() != null && !isAdmin) {
                     vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
                 }
             }

+ 9 - 5
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -572,11 +572,15 @@ public class FsUserServiceImpl implements IFsUserService
 
         List<SysDictData> courseProject = dictDataMapper.selectDictDataByType("sys_course_project");
         for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
-            // 项目
-            courseProject.stream()
-                    .filter(c -> c.getDictValue().equals(fsUserPageListVO.getProjectId().toString()))
-                    .findFirst()
-                    .ifPresent(c -> fsUserPageListVO.setProjectName(c.getDictLabel()));
+            if (courseProject != null && !courseProject.isEmpty()) {
+                if (fsUserPageListVO.getProjectId() != null){
+                    // 项目
+                    courseProject.stream()
+                            .filter(c -> c.getDictValue().equals(fsUserPageListVO.getProjectId().toString()))
+                            .findFirst()
+                            .ifPresent(c -> fsUserPageListVO.setProjectName(c.getDictLabel()));
+                }
+            }
             if (StringUtils.isEmpty(fsUserPageListVO.getNickname())){
                 fsUserPageListVO.setNickname("用户暂未授权昵称");
             }

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java

@@ -43,7 +43,7 @@ public interface QwUserMapper extends BaseMapper<QwUser>
 
     public List<QwUser> batchGetQwUser(@Param("list") List<QwUserKeyDTO> qwUserId);
 
-    @Select("select company_user_id,company_id,welcome_text,qw_user_name from qw_user where id = #{id}")
+    @Select("select company_user_id,company_id,welcome_text,qw_user_name,send_msg_type from qw_user where id = #{id}")
     public QwUser selectQwUserByIdByWeComeText(@Param("id") Long id);
 
     @Select("select * from qw_user where qw_user_id = #{qwUserId} and corp_id = #{corpId} ")

+ 1 - 1
fs-service/src/main/java/com/fs/qw/service/impl/QwUserVoiceLogServiceImpl.java

@@ -135,7 +135,7 @@ public class QwUserVoiceLogServiceImpl extends ServiceImpl<QwUserVoiceLogMapper,
 
             qwUserVoiceLogTotalVos.forEach(m-> {
                 companyUserList.forEach(n-> {
-                    if(m.getCompanyUserId().equals(n.getUserId())){
+                    if(m.getCompanyUserId() != null && n.getUserId() != null && m.getCompanyUserId().equals(n.getUserId())){
                         m.setCompanyUserName(n.getNickName());
                     }
                 });

+ 1 - 0
fs-service/src/main/java/com/fs/qw/vo/QwUserVoiceLogTotalVo.java

@@ -51,6 +51,7 @@ public class QwUserVoiceLogTotalVo extends BaseEntity {
     private String corpId;
 
 
+
     /** 公司id */
     //@Excel(name = "公司id")
     private Long companyId;

+ 1 - 1
fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java

@@ -321,7 +321,7 @@ public interface QwSopLogsMapper extends BaseMapper<QwSopLogs> {
     @DataSource(DataSourceType.SOP)
     List<QwSopLogs> selectIpadByCorpId(@Param("corpId") String corpId, @Param("now") LocalDateTime now);
 
-    @DataSource(DataSourceType.SOP)
+    @DataSource(DataSourceType.SopREAD)
     List<QwSopLogs> selectByQwUserId(@Param("id") Long id);
 
     @Select("select * from qw_sop_logs where send_type=8 and send_status=3 and  create_time <= DATE_SUB(NOW(), INTERVAL 2 HOUR) ")

+ 3 - 2
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java

@@ -398,11 +398,12 @@ public class QwSopTempServiceImpl implements IQwSopTempService
                     rules.setIsOfficial("0");
                 }
 
-                if (day.getDayNum()==1){
+                if (day.getDayNum()==1 && sorts.get() == 0 && temp.getOpenOfficial().equals("1")){
                     rules.setTime("01:05");
+                }else {
+                    rules.setTime(time);
                 }
 
-                rules.setTime(time);
                 rules.setContentType(2);
                 rules.setType(2);
                 rules.setCourseType(0);

+ 6 - 5
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -745,10 +745,10 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
             String companyId = String.valueOf(qwUser.getCompanyId()).trim();
 
             //域名
-            String domainName = companyUserMapper.selectDomainByUserId(Long.parseLong(companyUserId));
-            if (StringUtils.isEmpty(domainName)){
-                domainName = config.getRealLinkDomainName();
-            }
+//            String domainName = companyUserMapper.selectDomainByUserId(Long.parseLong(companyUserId));
+//            if (StringUtils.isEmpty(domainName)){
+//                domainName = config.getRealLinkDomainName();
+//            }
 
             QwCompany qwCompany = iQwCompanyService.getQwCompanyByRedis(param.getCorpId());
 
@@ -757,7 +757,8 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
             }
 
 
-            String finalDomainName = domainName;
+            String finalDomainName = "domainName";
+
             sopUserLogsInfos.forEach(item->{
 
                 QwSopLogs sopLogs=new QwSopLogs();

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

@@ -77,7 +77,7 @@ tencent_cloud_config:
   region: ap-chongqing
   proxy: hdt
 cloud_host:
-  company_name: 弘德
+  company_name: 弘德
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png

+ 2 - 1
fs-service/src/main/resources/application-config-druid-qdtst.yml

@@ -87,7 +87,8 @@ cloud_host:
 headerImg:
   imgUrl: https://qdtst-1360717104.cos.ap-nanjing.myqcloud.com/qdtst-1360717104/20250624/937019e4090f46788ef29c4e7df479c3.jpg
 ipad:
-  ipadUrl: http://ipad.cdwjyyh.com
+  ipadUrl:
+  aiApi:
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:

+ 2 - 2
fs-service/src/main/resources/application-config-druid-syysy.yml

@@ -77,9 +77,9 @@ cloud_host:
   company_name: 益善缘
 #看课授权时显示的头像
 headerImg:
-  imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
+  imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png
 ipad:
-  ipadUrl: http://ipad.xintaihl.cn
+  ipadUrl: http://ipad.ysya.top
   aiApi:
 wx_miniapp_temp:
   pay_order_temp_id:

+ 172 - 0
fs-service/src/main/resources/application-druid-jzzx-test.yml

@@ -0,0 +1,172 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-jzzx,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 127.0.0.1
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password:
+        # 连接超时时间
+        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://1.95.34.221:2345/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 从库数据源
+                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://1.95.34.221:2345/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                read:
+                    url: jdbc:mysql://1.95.34.221:2345/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 初始连接数
+                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
+custom:
+    token: "1o62d3YxvdHd4LEUiltnu7sK"
+    encoding-aes-key: "UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU"
+    corp-id: "ww51717e2b71d5e2d3"
+    secret: "6ODAmw-8W4t6h9mdzHh2Z4Apwj8mnsyRnjEDZOHdA7k"
+    private-key-path: "privatekey.pem"
+    webhook-url: "https://your-server.com/wecom/archive"
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret: openIM123
+    userID: imAdmin

+ 5 - 1
fs-service/src/main/resources/application-druid-jzzx.yml

@@ -99,6 +99,10 @@ spring:
                     url: jdbc:mysql://192.168.0.137:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: Ylrztek250218!3@.
+                read:
+                    url: jdbc:mysql://192.168.0.138:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量
@@ -165,4 +169,4 @@ token:
     expireTime: 180
 openIM:
     secret: openIM123
-    userID: imAdmin
+    userID: imAdmin

+ 168 - 0
fs-service/src/main/resources/application-druid-qdtst-test.yml

@@ -0,0 +1,168 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-qdtst,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 127.0.0.1
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password:
+        # 连接超时时间
+        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://119.45.250.185:2345/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.2: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
+custom:
+    token: "1o62d"
+    encoding-aes-key: "UJfTQ5qKTK"
+    corp-id: "ww517"
+    secret: "6ODAmw-"
+    private-key-path: ""
+    webhook-url: ""
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret:
+    userID:

+ 18 - 0
fs-service/src/main/resources/application-druid-qdtst.yml

@@ -148,3 +148,21 @@ rocketmq:
         group: test-group
         access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
         secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+custom:
+    token: "1o62d"
+    encoding-aes-key: "UJfTQ5qKTK"
+    corp-id: "ww517"
+    secret: "6ODAmw-"
+    private-key-path: ""
+    webhook-url: ""
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret:
+    userID:

+ 10 - 11
fs-service/src/main/resources/application-druid-syysy.yml

@@ -1,15 +1,15 @@
 # 数据源配置
 spring:
     profiles:
-        include: config-druid-sxjz,common
+        include: config-druid-syysy,common
     # redis 配置
     redis:
-        host: 172.27.0.13
+        host: 172.16.0.13
         port: 6379
         # 数据库索引
         database: 0
         # 密码
-        password: Sxdtcbm@#+!2025
+        password: Ylrz_tM8/oW6$pU9|tJ#&
         # 连接超时时间
         timeout: 10s
         lettuce:
@@ -39,16 +39,15 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://172.27.0.6:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://172.16.0.7:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
-                    password: Sxdtcbm@#+!2025
+                    password: Ylrz_tM818782145I@
                 # 从库数据源
                 slave:
                     # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
+                    url: jdbc:mysql://172.16.0.16:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_tM818782145I@
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量
@@ -94,9 +93,9 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://172.27.0.6:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://172.16.0.7:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
-                    password: Sxdtcbm@#+!2025
+                    password: Ylrz_tM818782145I@
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量

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

@@ -58,7 +58,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         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,u.avatar as fsAvatar,u.nick_name as fsNickName,qec.create_time as qec_create_time
+        qu.qw_user_name,qec.name as external_user_name,c.company_id,u.avatar as fsAvatar,u.nick_name as fsNickName,qec.create_time as qec_create_time,
+        u.is_vip isVip
          from fs_course_watch_log l
          left join fs_user_course_video v on v.video_id = l.video_id
          left join fs_user_course uc on uc.course_id = l.course_id
@@ -68,6 +69,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          LEFT JOIN qw_user qu on qu.id= l.qw_user_id
          LEFT JOIN qw_external_contact qec on l.qw_external_contact_id = qec.id
         <where>
+            <if test ='maps.isVip !=null'>
+                and l.user_id != 0 and u.is_vip = #{maps.isVip}
+            </if>
             <if test ='maps.sendType !=null'>
                 and l.send_type = #{maps.sendType}
             </if>

+ 76 - 0
fs-service/src/main/resources/mapper/fastGpt/FastgptChatArtificialWordsMapper.xml

@@ -0,0 +1,76 @@
+<?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.fastGpt.mapper.FastgptChatArtificialWordsMapper">
+    
+    <resultMap type="FastgptChatArtificialWords" id="FastgptChatArtificialWordsResult">
+        <result property="id"    column="id"    />
+        <result property="type"    column="type"    />
+        <result property="content"    column="content"    />
+        <result property="status"    column="status"    />
+        <result property="sort"    column="sort"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectFastgptChatArtificialWordsVo">
+        select id, `type`, content, status, sort, create_time from fastgpt_chat_artificial_words
+    </sql>
+
+    <select id="selectFastgptChatArtificialWordsList" parameterType="FastgptChatArtificialWords" resultMap="FastgptChatArtificialWordsResult">
+        <include refid="selectFastgptChatArtificialWordsVo"/>
+        <where>  
+            <if test="type != null "> and `type` = #{type}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="sort != null "> and sort = #{sort}</if>
+        </where>
+        order by sort asc,id desc
+    </select>
+    
+    <select id="selectFastgptChatArtificialWordsById" parameterType="Long" resultMap="FastgptChatArtificialWordsResult">
+        <include refid="selectFastgptChatArtificialWordsVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertFastgptChatArtificialWords" parameterType="FastgptChatArtificialWords" useGeneratedKeys="true" keyProperty="id">
+        insert into fastgpt_chat_artificial_words
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="type != null">`type`,</if>
+            <if test="content != null">content,</if>
+            <if test="status != null">status,</if>
+            <if test="sort != null">sort,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="type != null">#{type},</if>
+            <if test="content != null">#{content},</if>
+            <if test="status != null">#{status},</if>
+            <if test="sort != null">#{sort},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFastgptChatArtificialWords" parameterType="FastgptChatArtificialWords">
+        update fastgpt_chat_artificial_words
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="type != null">type = #{type},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="sort != null">sort = #{sort},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFastgptChatArtificialWordsById" parameterType="Long">
+        delete from fastgpt_chat_artificial_words where id = #{id}
+    </delete>
+
+    <delete id="deleteFastgptChatArtificialWordsByIds" parameterType="String">
+        delete from fastgpt_chat_artificial_words where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 1 - 0
fs-service/src/main/resources/mapper/his/FsArticleCateMapper.xml

@@ -38,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="params.status != null">
             and status = #{params.status}
         </if>
+        order by sort asc
     </select>
 
     <insert id="insertFsArticleCate" parameterType="FsArticleCate" useGeneratedKeys="true" keyProperty="cateId">

+ 22 - 14
fs-service/src/main/resources/mapper/qw/QwUserVoiceLogMapper.xml

@@ -1,7 +1,7 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.qw.mapper.QwUserVoiceLogMapper">
 
     <resultMap type="QwUserVoiceLog" id="QwUserVoiceLogResult">
@@ -19,13 +19,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <resultMap type="com.fs.qw.vo.QwUserVoiceLogTotalVo" id="QwUserVoiceLogVoTotalResult">
         <result property="id"    column="id"    />
-        <result property="qwUserId"    column="qw_user_id"    />
+        <result property="corpId"    column="corp_id"    />
         <result property="duration"    column="duration"    />
         <result property="connectCount"    column="connectCount"    />
         <result property="noConnectCount"    column="noConnectCount"    />
         <result property="createTime"     column="create_time"     />
+        <result property="companyUserId"     column="company_user_id"     />
         <association property="qwUser" javaType="com.fs.qw.domain.QwUser" autoMapping="true">
-            <id column="qw_uer_id" property="qwUserId"></id>
+            <id column="qw_user_id" property="qwUserId"></id>
             <result column="qw_user_name" property="qwUserName"></result>
         </association>
     </resultMap>
@@ -86,19 +87,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectQwUserVoiceLogTotalList" resultMap="QwUserVoiceLogVoTotalResult">
 
         SELECT
-        SUM(duration) duration,qu.qw_user_name,
+        SUM(duration) duration,qu.qw_user_name,uvl.corp_id,qu.qw_user_id,uvl.company_user_id,
         COUNT(CASE WHEN uvl.status=1 THEN 1 END) AS connectCount,
         COUNT(CASE WHEN uvl.status=2 THEN 1 END) AS noConnectCount
         FROM qw_user_voice_log uvl
         LEFT JOIN qw_user qu ON uvl.qw_user_id = qu.id
-        where  uvl.company_id = #{companyId}
-        <if test="qwUserName != null ">and qu.qw_user_name like concat(#{qwUserName}, '%')</if>
-        <if test="beginTime != null and endTime != null">
-            AND date_format(uvl.create_time,'%Y-%m-%d') &gt;= #{beginTime}
-            AND date_format(uvl.create_time,'%Y-%m-%d') &lt;= #{endTime}
+        <where>
+            <if test="companyId != null ">and uvl.company_id = #{companyId}</if>
+            <if test="companyUserId != null ">and uvl.company_user_id = #{companyUserId}</if>
+            <if test="qwUserName != null ">and qu.qw_user_name like concat(#{qwUserName}, '%')</if>
+            <if test="beginTime != null and endTime != null">
+                AND date_format(uvl.create_time,'%Y-%m-%d') &gt;= #{beginTime}
+                AND date_format(uvl.create_time,'%Y-%m-%d') &lt;= #{endTime}
+            </if>
+        </where>
+        <if test="qwUserId != null">
+            group by qu.qw_user_id,uvl.corp_id,uvl.qw_user_id
+        </if>
+        <if test="qwUserId == null">
+            group by qu.company_user_id
         </if>
-
-        group by qu.qw_user_name
 
     </select>
 
@@ -115,7 +123,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyId != null">company_id,</if>
             <if test="companyUserId != null">company_user_id,</if>
             <if test="createTime != null">create_time,</if>
-         </trim>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="extId != null">#{extId},</if>
             <if test="qwUserId != null">#{qwUserId},</if>
@@ -126,7 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyId != null">#{companyId},</if>
             <if test="companyUserId != null">#{companyUserId},</if>
             <if test="createTime != null">#{createTime},</if>
-         </trim>
+        </trim>
     </insert>
 
     <update id="updateQwUserVoiceLog" parameterType="QwUserVoiceLog">

+ 8 - 1
fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -7,6 +7,7 @@ import com.fs.app.annotation.Login;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
+import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
@@ -170,7 +171,13 @@ public class InquiryOrderController extends  AppBaseController {
         }
 
         FsUser user=userService.selectFsUserByUserId(Long.parseLong(getUserId()));
-        if(user!=null&& StringUtils.isNotEmpty(user.getMaOpenId())){
+        if(user!=null){
+
+            // 红德堂特殊处理
+            if (!CloudHostUtils.isCloudHostName("弘德堂") && StringUtils.isBlank(user.getMaOpenId())) {
+                return R.error("用户OPENID不存在");
+            }
+
             if(param.getUserCouponId()!=null&&param.getUserCouponId()>0l){
                 FsUserCoupon userCoupon=userCouponService.selectFsUserCouponById(param.getUserCouponId());
                 if(userCoupon==null){

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

@@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit;
 @RequestMapping(value="/store/app/storeOrder")
 public class StoreOrderScrmController extends AppBaseController {
 
-    private static final String STORE_PAY_CONF = "store.pay";
+    private static final String STORE_PAY_CONF = "his.pay";
 
     Logger logger= LoggerFactory.getLogger(getClass());