Browse Source

Merge remote-tracking branch 'origin/master' into ScrmStore

yjwang 2 weeks ago
parent
commit
1e8579392c
54 changed files with 788 additions and 129 deletions
  1. 97 0
      fs-admin/src/main/java/com/fs/fastGpt/FastgptChatArtificialWordsController.java
  2. 7 2
      fs-admin/src/main/java/com/fs/his/controller/FsDoctorArticleController.java
  3. 23 0
      fs-common/src/main/java/com/fs/common/utils/CloudHostUtils.java
  4. 10 0
      fs-common/src/main/java/com/fs/common/utils/spring/SpringUtils.java
  5. 1 1
      fs-company-app/src/main/java/com/fs/app/config/WebMvcConfig.java
  6. 5 1
      fs-company-app/src/main/java/com/fs/app/controller/AppBaseController.java
  7. 18 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  8. 6 2
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorArticleController.java
  9. 2 1
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  10. 4 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriodDays.java
  11. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java
  12. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseLinkCreateParam.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. 3 0
      fs-service/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java
  16. 2 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  17. 15 7
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java
  18. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  19. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  20. 4 4
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  21. 2 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  22. 62 0
      fs-service/src/main/java/com/fs/fastGpt/mapper/FastgptChatArtificialWordsMapper.java
  23. 62 0
      fs-service/src/main/java/com/fs/fastGpt/service/IFastgptChatArtificialWordsService.java
  24. 14 0
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java
  25. 106 0
      fs-service/src/main/java/com/fs/fastGpt/service/impl/FastgptChatArtificialWordsServiceImpl.java
  26. 2 0
      fs-service/src/main/java/com/fs/his/param/FsCourseProductOrderComputeParam.java
  27. 2 0
      fs-service/src/main/java/com/fs/his/param/FsCourseProductOrderDoPayParam.java
  28. 9 5
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  29. 44 0
      fs-service/src/main/java/com/fs/qw/domain/QwUserDelLossLog.java
  30. 6 1
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  31. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  32. 24 0
      fs-service/src/main/java/com/fs/qw/param/QwUserDelLossLogParam.java
  33. 7 4
      fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  34. 28 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  35. 32 0
      fs-service/src/main/java/com/fs/qw/vo/QwUserDelLossLogVO.java
  36. 6 1
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  37. 6 5
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  38. 2 2
      fs-service/src/main/resources/application-config-druid-fby.yml
  39. 1 1
      fs-service/src/main/resources/application-config-druid-hdt.yml
  40. 2 2
      fs-service/src/main/resources/application-config-druid-hzyy.yml
  41. 10 11
      fs-service/src/main/resources/application-druid-syysy.yml
  42. 5 1
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  43. 1 1
      fs-service/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml
  44. 76 0
      fs-service/src/main/resources/mapper/fastGpt/FastgptChatArtificialWordsMapper.xml
  45. 26 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml
  46. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/CourseProductController.java
  47. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/CourseProductOrderController.java
  48. 8 1
      fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  49. 11 23
      fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  50. 2 1
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java
  51. 9 24
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserLoginController.java
  52. 9 22
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwLoginController.java
  53. 2 1
      fs-user-app/src/main/java/com/fs/app/controller/store/CourseWxH5ScrmController.java
  54. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 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));
+    }
+}

+ 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);
     }
 

+ 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() {

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

@@ -27,6 +27,7 @@ import com.fs.qw.param.*;
 import com.fs.qw.service.*;
 import com.fs.qw.vo.QwExternalContactVO;
 import com.fs.qw.vo.QwFsUserVO;
+import com.fs.qw.vo.QwUserDelLossLogVO;
 import com.github.pagehelper.PageHelper;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
@@ -627,4 +628,21 @@ public class QwExternalContactController extends BaseController
         return PubFun.listToNewList(list, QwExternalContactVO::getId);
     }
 
+    /**
+     * 查询企业微信客户删除流失列表
+     */
+    @GetMapping("/delLossStatistics")
+    public TableDataInfo delLossStatistics(QwUserDelLossLogParam param){
+        startPage();
+        List<QwUserDelLossLogVO> qwUserDelLossLogVOS = qwExternalContactService.selectQwUserDelLossLogList(param);
+        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();
         }

+ 2 - 1
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -11,6 +11,7 @@ import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
 import com.fs.course.service.*;
+import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.service.IQwExternalContactService;
@@ -261,7 +262,7 @@ public class CommonController {
         return "s";
     }
     @GetMapping("/isAddkf")
-    public ResponseResult<Boolean> isAddkf(FsUserCourseAddCompanyUserParam param) throws Exception {
+    public ResponseResult<FsUser> isAddkf(FsUserCourseAddCompanyUserParam param) throws Exception {
         return courseVideoService.isAddCompanyUser(param);
     }
 

+ 4 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriodDays.java

@@ -94,4 +94,8 @@ public class FsUserCoursePeriodDays extends BaseEntityTow {
     private LocalTime joinTime;
     @TableField(exist = false)
     private LocalDate maxDate;
+
+    /** 项目id */
+    private Long projectId;
+
 }

+ 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);
 

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

@@ -38,4 +38,6 @@ public class FsCourseLinkCreateParam {
     @ApiModelProperty(value = "营期课程id")
     private Long id;
 
+    private Long projectId;//项目ID
+
 }

+ 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;
+
 }
 

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

@@ -38,4 +38,7 @@ public class FsCourseSortLinkParam {
     @ApiModelProperty(value = "营期课程id")
     private Long id;
 
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
 }

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

@@ -16,6 +16,7 @@ import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoLinkDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.course.vo.newfs.FsUserVideoListVO;
+import com.fs.his.domain.FsUser;
 import com.fs.his.vo.OptionsVO;
 
 import java.util.List;
@@ -127,7 +128,7 @@ public interface IFsUserCourseVideoService
      * @param param 入参
      * @return 是/否 成功
      */
-    ResponseResult<Boolean> isAddCompanyUser(FsUserCourseAddCompanyUserParam param);
+    ResponseResult<FsUser> isAddCompanyUser(FsUserCourseAddCompanyUserParam param);
 
     /**
      * 获取链接用户课程详情

+ 15 - 7
fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java

@@ -33,6 +33,7 @@ import com.fs.his.param.FsCourseProductOrderDoPayParam;
 import com.fs.his.param.FsCourseProductOrderRefundParam;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
@@ -124,6 +125,9 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
 
     private static final int CODE_LENGTH = 12;
 
+    @Autowired
+    private IFsUserWxService userWxService;
+
 
     /**
      * 查询拍单商品订单
@@ -267,7 +271,9 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
             return R.error("订单状态不正确");
         }
         FsUser user = userService.selectFsUserByUserId(courseProductOrder.getUserId());
-        if (user != null && StringUtils.isNotEmpty(user.getMaOpenId())) {
+        FsUserWx fsUserWx = userWxService.selectByAppIdAndUserId(param.getAppId(), user.getUserId(), 1);
+        logger.info("用户微信信息==============={}",fsUserWx);
+        if (user != null && fsUserWx != null && StringUtils.isNotEmpty(fsUserWx.getOpenId())) {
             Map<String,Object> moneys= Maps.newHashMap();
             FsCourseProduct courseProduct = JSONUtil.toBean(courseProductOrder.getProductJson(), FsCourseProduct.class);
             moneys.put("payPrice",courseProduct.getProductPrice());
@@ -310,7 +316,9 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
         }
         FsUser user = userService.selectFsUserByUserId(param.getUserId());
         logger.info("用户信息==============={}",user);
-        if (user != null && StringUtils.isNotEmpty(user.getCourseMaOpenId())) {
+        FsUserWx fsUserWx = userWxService.selectByAppIdAndUserId(param.getAppId(), user.getUserId(), 1);
+        logger.info("用户微信信息==============={}",fsUserWx);
+        if (user != null && fsUserWx != null && StringUtils.isNotEmpty(fsUserWx.getOpenId())) {
             if (courseProduct.getProductPrice().compareTo(new BigDecimal(0))==1) {
                 String json = configService.selectConfigByKey("his.pay");
                 PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
@@ -330,7 +338,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                 storePayment.setCompanyId(courseProductOrder.getCompanyId());
                 storePayment.setCompanyUserId(courseProductOrder.getCompanyUserId());
                 storePayment.setRemark("拍商品订单支付");
-                storePayment.setOpenId(user.getCourseMaOpenId());
+                storePayment.setOpenId(fsUserWx.getOpenId());
                 storePayment.setUserId(user.getUserId());
                 storePayment.setBusinessId(courseProductOrder.getCourseOrderId().toString());
                 if (storePaymentService.insertFsStorePayment(storePayment) > 0) {
@@ -348,7 +356,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                         payConfig.setNotifyUrl(wxPayProperties.getNotifyUrl());
                         wxPayService.setConfig(payConfig);
                         WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                        orderRequest.setOpenid(user.getCourseMaOpenId());//公众号支付提供用户openid
+                        orderRequest.setOpenid(fsUserWx.getOpenId());//公众号支付提供用户openid
                         orderRequest.setBody("拍商品订单支付");
                         orderRequest.setOutTradeNo("product-" + storePayment.getPayCode());
                         orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
@@ -370,7 +378,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                         p.setLowOrderId("product-" + storePayment.getPayCode());
                         p.setBody("拍商品订单支付");
                         p.setIsMinipg("1");
-                        p.setOpenId(user.getCourseMaOpenId());
+                        p.setOpenId(fsUserWx.getOpenId());
                         p.setAttach("");
                         p.setStoreid("0");
                         CreateWxOrderResult wxOrder = payService.createWxOrder(p);
@@ -400,7 +408,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                         }
                         o.setPayerName("微信用户"+phone);
                         o.setGoodsInfo("拍商品订单支付"); // 订单信息
-                        o.setOpenId(user.getCourseMaOpenId());
+                        o.setOpenId(fsUserWx.getOpenId());
                         o.setOrderType(3);
                         o.setOrderId(courseProductOrder.getCourseOrderId().toString());
                         TzBankResult<PayCreateOrderResult> result = tzBankService.createOrder(o);
@@ -413,7 +421,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                         logger.info("创建汇付订单");
                         HuiFuCreateOrder o = new HuiFuCreateOrder();
                         o.setTradeType("T_MINIAPP");
-                        o.setOpenid(user.getCourseMaOpenId());
+                        o.setOpenid(fsUserWx.getOpenId());
                         o.setReqSeqId("product-"+storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("拍商品订单支付");

+ 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 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -564,6 +564,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
 
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link, courseMap);
+        courseMap.setProjectId(param.getProjectId());
         String courseJson = JSON.toJSONString(courseMap);
         link.setRealLink(realLink + courseJson);
 

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

@@ -1194,7 +1194,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 {
@@ -1503,7 +1503,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     @Override
     @Transactional
-    public ResponseResult<Boolean> isAddCompanyUser(FsUserCourseAddCompanyUserParam param) {
+    public ResponseResult<FsUser> isAddCompanyUser(FsUserCourseAddCompanyUserParam param) {
         logger.info("\n 【进入个微-判断是否添加客服】,入参:{}",param);
         //查询用户
         FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
@@ -1531,7 +1531,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 // 设置 Redis 记录的过期时间(例如 5 分钟)
                 redisCache.expire(redisKey, 300, TimeUnit.SECONDS);
             }
-            return ResponseResult.ok(Boolean.TRUE);
+            return ResponseResult.ok(fsUser);
         }
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
@@ -1637,7 +1637,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 //            fsUserCourseBeMemberParam.setCompanyUserId(param.getCompanyUserId());
 //            fsUserService.setRepeatFansTag(fsUserCourseBeMemberParam);
 //        }
-        return ResponseResult.ok(Boolean.TRUE);
+        return ResponseResult.ok(fsUser);
     }
     /**
      * 检查用户课程时间段是否有效

+ 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);
+}

+ 14 - 0
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -1831,6 +1831,20 @@ public class AiHookServiceImpl implements AiHookService {
                     }
                 }
             }
+            // 客服进行回复后就转人工10分钟
+            if(fastGptChatSession != null){
+                Calendar calendar = Calendar.getInstance();
+                //定时任务会处理10分钟以内的,所以设置20分钟
+                calendar.add(Calendar.MINUTE, 30);
+                Date expireTime = calendar.getTime();
+
+                FastGptChatSession chatSession = new FastGptChatSession();
+                chatSession.setLastTime(expireTime);
+                chatSession.setIsArtificial(1);
+                chatSession.setSessionId(fastGptChatSession.getSessionId());
+
+                fastGptChatSessionMapper.updateFastGptChatSession(chatSession);
+            }
         }
         return R.ok();
     }

+ 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);
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsCourseProductOrderComputeParam.java

@@ -8,4 +8,6 @@ public class FsCourseProductOrderComputeParam {
     private Long userId;
 
     private Long orderId;
+
+    private String appId;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsCourseProductOrderDoPayParam.java

@@ -11,4 +11,6 @@ public class FsCourseProductOrderDoPayParam {
     private Long orderId;
 
     private Long userId;
+
+    private String appId;
 }

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

@@ -570,11 +570,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("用户暂未授权昵称");
             }

+ 44 - 0
fs-service/src/main/java/com/fs/qw/domain/QwUserDelLossLog.java

@@ -0,0 +1,44 @@
+package com.fs.qw.domain;
+
+import lombok.Data;
+
+@Data
+public class QwUserDelLossLog {
+
+    private Long id;
+
+    /**
+     * 企微微信客户id
+     */
+    private Long externalContactId;
+
+    /**
+     *  公司id
+     */
+    private Long companyId;
+
+    /**
+     *  公司用户id
+     */
+    private Long companyUserId;
+
+    /**
+     *  员工id(qw_user)
+     */
+    private Long qwUserId;
+
+    /**
+     *  类型:1-删除 2-流失
+     */
+    private Integer type;
+
+    /**
+     *  时间
+     */
+    private String time;
+
+    /**
+     *  企业id
+     */
+    private String corpId;
+}

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

@@ -3,6 +3,7 @@ package com.fs.qw.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.fastGpt.domain.FastgptChatArtificialWords;
 import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.domain.QwUserDelLossLog;
 import com.fs.qw.param.*;
 import com.fs.qw.param.newparam.ExternalContactPageListParam;
 import com.fs.qw.result.QwExternalContactByQwResult;
@@ -280,7 +281,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
                 "and (cu.nick_name like concat('%', #{companyUser}, '%') or cu.phonenumber= #{companyUser})"+
             "</if> " +
             "        </where>"+
-            "order by ec.register_time desc,ec.create_time desc,ec.id desc"+
+            "order by ec.create_time desc,ec.id desc"+
             "</script>"})
     List<QwExternalContactVO> selectQwExternalContactListVO(QwExternalContactParam qwExternalContact);
 
@@ -428,4 +429,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     List<String> selectRemarkByCompanyUserAndFsUser(@Param("userId")String userId,@Param("companyUserId") String companyUserId,@Param("cropId") String cropId);
 
     List<QwExternalContact> selectQwExternalContactByFsUserId(@Param("userId") Long userId);
+
+    int insertQwUserDelLossLog(@Param("param") QwUserDelLossLog qwUserDelLossLog);
+
+    List<QwUserDelLossLogVO> selectQwUserDelLossList(@Param("param") QwUserDelLossLogParam param);
 }

+ 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} ")

+ 24 - 0
fs-service/src/main/java/com/fs/qw/param/QwUserDelLossLogParam.java

@@ -0,0 +1,24 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+@Data
+public class QwUserDelLossLogParam {
+    /**
+     * 企微员工账号
+     */
+    private String userId;
+    /**
+     * 统计开始时间
+     */
+    private String startTime;
+    /**
+     * 统计结束时间
+     */
+    private String endTime;
+    /**
+     *  企微员工名称
+     */
+    private String userName;
+
+}

+ 7 - 4
fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -12,10 +12,7 @@ import com.fs.qw.param.sidebar.ExternalContactInfoParam;
 import com.fs.qw.param.sidebar.TagGroupUpdateParam;
 import com.fs.qw.result.QwExternalContactLogVo;
 import com.fs.qw.result.QwExternalContactVo;
-import com.fs.qw.vo.ExternalContactDetailsVO;
-import com.fs.qw.vo.QwExternalContactVO;
-import com.fs.qw.vo.QwExternalListByHeavyVO;
-import com.fs.qw.vo.QwSopRuleTimeVO;
+import com.fs.qw.vo.*;
 import com.fs.qw.vo.newvo.ExternalContactListVO;
 import com.fs.qw.vo.newvo.ExternalContactPageVO;
 import com.fs.qw.vo.sidebar.ExternalContactInfoVO;
@@ -237,4 +234,10 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
 
     List<QwExternalContact> selectQwExternalContactByFsUserId(Long userId);
 
+    /**
+     * 企微用户流失删除统计
+     * @param param 查询参数
+     */
+    List<QwUserDelLossLogVO> selectQwUserDelLossLogList(QwUserDelLossLogParam param);
+
 }

+ 28 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.qw.service.impl;
 
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONException;
@@ -4103,6 +4104,17 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
             qwExternal.setDelTime(new Date());
 //            logger.info("删除用户客户更改状态");
             qwExternalContactMapper.updateQwExternalContact(qwExternal);
+
+            logger.info("添加删除客户日志");
+            QwUserDelLossLog qwUserDelLossLog = new QwUserDelLossLog();
+            qwUserDelLossLog.setExternalContactId(qwExternalContact.getId());
+            qwUserDelLossLog.setType(1);
+            qwUserDelLossLog.setTime(DateUtil.format(qwExternal.getDelTime(), "yyyy-MM-dd"));
+            qwUserDelLossLog.setCompanyUserId(qwExternalContact.getCompanyUserId());
+            qwUserDelLossLog.setCompanyId(qwExternalContact.getCompanyId());
+            qwUserDelLossLog.setQwUserId(qwExternalContact.getQwUserId());
+            qwUserDelLossLog.setCorpId(qwExternalContact.getCorpId());
+            qwExternalContactMapper.insertQwUserDelLossLog(qwUserDelLossLog);
         }
     }
 
@@ -4121,6 +4133,17 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                 qwExternal.setStatus(3);
                 qwExternal.setLossTime(new Date());
                 qwExternalContactMapper.updateQwExternalContact(qwExternal);
+
+                logger.info("添加流失客户日志");
+                QwUserDelLossLog qwUserDelLossLog = new QwUserDelLossLog();
+                qwUserDelLossLog.setExternalContactId(qwExternalContact.getId());
+                qwUserDelLossLog.setType(2);
+                qwUserDelLossLog.setTime(DateUtil.format(qwExternal.getLossTime(), "yyyy-MM-dd"));
+                qwUserDelLossLog.setCompanyUserId(qwExternalContact.getCompanyUserId());
+                qwUserDelLossLog.setCompanyId(qwExternalContact.getCompanyId());
+                qwUserDelLossLog.setQwUserId(qwExternalContact.getQwUserId());
+                qwUserDelLossLog.setCorpId(qwExternalContact.getCorpId());
+                qwExternalContactMapper.insertQwUserDelLossLog(qwUserDelLossLog);
             }
             if (qwExternalContact.getWayId() != null) {
                 qwContactWayService.updateQwContactWayByLoss(qwExternalContact);
@@ -5609,6 +5632,11 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return qwExternalContactMapper.selectQwExternalContactByFsUserId(userId);
     }
 
+    @Override
+    public List<QwUserDelLossLogVO> selectQwUserDelLossLogList(QwUserDelLossLogParam param) {
+        return qwExternalContactMapper.selectQwUserDelLossList(param);
+    }
+
 
     public Boolean getSopAiChatByRedis(String qwUserId,String corpId,String externalUserId){
 

+ 32 - 0
fs-service/src/main/java/com/fs/qw/vo/QwUserDelLossLogVO.java

@@ -0,0 +1,32 @@
+package com.fs.qw.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class QwUserDelLossLogVO {
+
+    /**
+     *  员工账号(qw_user)
+     */
+    @Excel(name = "企微员工账号")
+    private String userId;
+
+    /**
+     *  员工姓名(qu_user)
+     */
+    @Excel(name = "企微员工姓名")
+    private String qwUserName;
+
+    /**
+     *  删除数量
+     */
+    @Excel(name = "删除数量")
+    private Long delCount;
+
+    /**
+     *  流失数量
+     */
+    @Excel(name = "流失数量")
+    private Long lossCount;
+}

+ 6 - 1
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java

@@ -398,7 +398,12 @@ public class QwSopTempServiceImpl implements IQwSopTempService
                     rules.setIsOfficial("0");
                 }
 
-                rules.setTime(time);
+                if (day.getDayNum()==1 && sorts.get() == 0 && temp.getOpenOfficial().equals("1")){
+                    rules.setTime("01:05");
+                }else {
+                    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();

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

@@ -76,8 +76,8 @@ watch:
   password3: v9xsKuqn_$d2y
 
 fs :
-  commonApi: http://192.168.0.238:8010
-  h5CommonApi: http://192.168.0.238:8010
+  commonApi: http://192.168.0.95:8010
+  h5CommonApi: http://192.168.0.95:8010
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16

+ 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 - 2
fs-service/src/main/resources/application-config-druid-hzyy.yml

@@ -60,8 +60,8 @@ watch:
   password3: v9xsKuqn_$d2y
 
 fs :
-  commonApi: http://172.16.0.16:8010
-  h5CommonApi: http://119.29.195.254:8010
+  commonApi: http://127.0.0.1:7771
+  h5CommonApi: http://127.0.0.1:7771
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16

+ 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>

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

@@ -26,7 +26,7 @@
     </sql>
 
     <select id="selectFsUserCoursePeriodDaysList" parameterType="FsUserCoursePeriodDays" resultType="FsUserCoursePeriodDays">
-        select a.*,b.course_name,c.title videoName from fs_user_course_period_days a
+        select a.*,b.course_name,b.project as projectId, c.title videoName from fs_user_course_period_days a
         inner join fs_user_course b on a.course_id = b.course_id
         inner join fs_user_course_video c on a.video_id = c.video_id
         <where>

+ 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>

+ 26 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -619,5 +619,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                left join company_user cu on cu.user_id=qu.company_user_id
         where fs_user_id = #{userId}
     </select>
+    
+    <insert id="insertQwUserDelLossLog" parameterType="com.fs.qw.domain.QwUserDelLossLog">
+        insert into qw_user_del_loss_log (external_contact_id,company_id,company_user_id,type,time,qw_user_id,corp_id) values
+        (#{param.externalContactId},#{param.companyId},#{param.companyUserId},#{param.type},#{param.time},#{param.qwUserId},#{param.corpId})
+    </insert>
+
+    <select id="selectQwUserDelLossList" resultType="com.fs.qw.vo.QwUserDelLossLogVO">
+        SELECT
+        SUM(case WHEN udl.type = 1 THEN 1 ELSE 0 END) delCount,
+        SUM(case WHEN udl.type = 2 THEN 1 ELSE 0 END) lossCount,
+        qu.qw_user_id user_id,qu.qw_user_name
+        FROM `qw_user_del_loss_log` udl
+        LEFT JOIN qw_user qu ON qu.id = udl.qw_user_id
+        WHERE 1 = 1
+        <if test="param.startTime != null and param.endTime != null">
+            and udl.time BETWEEN #{param.startTime} AND #{param.endTime}
+        </if>
+        <if test="param.userName != null and param.userName != ''">
+            and qu.qw_user_name LIKE CONCAT('%',#{param.userName},'%')
+        </if>
+        <if test="param.userId != null and param.userId != ''">
+            and qu.qw_user_id LIKE CONCAT('%',#{param.userId},'%')
+        </if>
+        GROUP BY udl.qw_user_id
+    </select>
+    
 
 </mapper>

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

@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @Api("拍商品订单接口")
 @RestController
-@RequestMapping(value="/store/app/courseProduct")
+@RequestMapping(value="/app/courseProduct")
 public class CourseProductController extends AppBaseController{
 
     @Autowired

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

@@ -23,7 +23,7 @@ import java.util.List;
 
 @Api("拍商品订单接口")
 @RestController
-@RequestMapping(value="/store/app/courseProductOrder")
+@RequestMapping(value="/app/courseProductOrder")
 public class CourseProductOrderController extends AppBaseController {
 
     @Autowired

+ 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){

+ 11 - 23
fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -253,6 +253,8 @@ public class WxH5MpController {
         return R.ok(result);
     }
 
+
+
     @ApiOperation("处理用户与小程序的绑定")
     @PostMapping("/handleFsUserWx")
     public R handleFsUserWx(@RequestBody FsUserLoginByMpParam param) {
@@ -274,29 +276,15 @@ public class WxH5MpController {
     }
     private void handleFsUserWx(FsUser user, FsUserLoginByMpParam param, WxMaJscode2SessionResult session) {
         if (user == null) return;
-        // 尝试更新
-        boolean updated = fsUserWxService.lambdaUpdate()
-                .eq(FsUserWx::getFsUserId, user.getUserId())
-                .eq(FsUserWx::getAppId, param.getAppId())
-                .eq(FsUserWx::getOpenId, session.getOpenid())
-//                .set(FsUserWx::getCompanyId, user.getCompanyId())
-                .set(FsUserWx::getUnionId, session.getUnionid() == null ? "" : session.getUnionid())
-                .set(FsUserWx::getUpdateTime, new Date())
-                .update();
-
-        // 如果更新失败(记录不存在),则插入
-        if (!updated) {
-            FsUserWx fsUserWx = new FsUserWx();
-            fsUserWx.setType(1);
-            fsUserWx.setFsUserId(user.getUserId());
-//            fsUserWx.setCompanyId(user.getCompanyId());
-            fsUserWx.setAppId(param.getAppId());
-            fsUserWx.setOpenId(session.getOpenid());
-            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
-            fsUserWx.setCreateTime(new Date());
-            fsUserWx.setUpdateTime(new Date());
-            fsUserWxService.save(fsUserWx);
-        }
+        FsUserWx fsUserWx = new FsUserWx();
+        fsUserWx.setType(1);
+        fsUserWx.setFsUserId(user.getUserId());
+        fsUserWx.setAppId(param.getAppId());
+        fsUserWx.setOpenId(session.getOpenid());
+        fsUserWx.setUnionId(session.getUnionid() != null ? session.getUnionid() : null);
+        fsUserWx.setCreateTime(new Date());
+        fsUserWx.setUpdateTime(new Date());
+        fsUserWxService.saveOrUpdateByUniqueKey(fsUserWx);
     }
 
 }

+ 2 - 1
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

@@ -17,6 +17,7 @@ import com.fs.course.param.newfs.FsUserCourseVideoUParam;
 import com.fs.course.service.*;
 import com.fs.course.vo.FsUserCourseVideoH5VO;
 import com.fs.course.vo.newfs.FsUserCourseVideoLinkDetailsVO;
+import com.fs.his.domain.FsUser;
 import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.service.IFsUserService;
 import com.fs.system.service.ISysConfigService;
@@ -53,7 +54,7 @@ public class CourseFsUserController extends AppBaseController {
     @Login
     @ApiOperation("判断是否添加客服(是否关联销售)")
     @PostMapping("/isAddKf")
-    public ResponseResult<Boolean> isAddCompanyUser(@Valid @RequestBody FsUserCourseAddCompanyUserParam param) {
+    public ResponseResult<FsUser> isAddCompanyUser(@Valid @RequestBody FsUserCourseAddCompanyUserParam param) {
         Long userId = Long.parseLong(getUserId());
         param.setUserId(userId);
         return courseVideoService.isAddCompanyUser(param);

+ 9 - 24
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserLoginController.java

@@ -224,30 +224,15 @@ public class CourseFsUserLoginController extends AppBaseController {
      * 处理用户与小程序的绑定
      */
     private void handleFsUserWx(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session) {
-        if (user == null) return;
-        // 尝试更新
-        boolean updated = fsUserWxService.lambdaUpdate()
-                .eq(FsUserWx::getFsUserId, user.getUserId())
-                .eq(FsUserWx::getAppId, param.getAppId())
-                .eq(FsUserWx::getOpenId, session.getOpenid())
-                .set(FsUserWx::getCompanyId, param.getCompanyId())
-                .set(FsUserWx::getUnionId, session.getUnionid() == null ? "" : session.getUnionid())
-                .set(FsUserWx::getUpdateTime, new Date())
-                .update();
-
-        // 如果更新失败(记录不存在),则插入
-        if (!updated) {
-            FsUserWx fsUserWx = new FsUserWx();
-            fsUserWx.setType(1);
-            fsUserWx.setFsUserId(user.getUserId());
-            fsUserWx.setCompanyId(param.getCompanyId());
-            fsUserWx.setAppId(param.getAppId());
-            fsUserWx.setOpenId(session.getOpenid());
-            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
-            fsUserWx.setCreateTime(new Date());
-            fsUserWx.setUpdateTime(new Date());
-            fsUserWxService.save(fsUserWx);
-        }
+        FsUserWx fsUserWx = new FsUserWx();
+        fsUserWx.setType(1);
+        fsUserWx.setFsUserId(user.getUserId());
+        fsUserWx.setAppId(param.getAppId());
+        fsUserWx.setOpenId(session.getOpenid());
+        fsUserWx.setUnionId(session.getUnionid() != null ? session.getUnionid() : null);
+        fsUserWx.setCreateTime(new Date());
+        fsUserWx.setUpdateTime(new Date());
+        fsUserWxService.saveOrUpdateByUniqueKey(fsUserWx);
     }
 
 }

+ 9 - 22
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwLoginController.java

@@ -157,28 +157,15 @@ public class CourseQwLoginController extends AppBaseController {
      * 处理用户与小程序的绑定
      */
     private void handleFsUserWx(FsUser user, LoginParam param,WxMaJscode2SessionResult session) {
-        if (user == null) return;
-        // 尝试更新
-        boolean updated = fsUserWxService.lambdaUpdate()
-                .eq(FsUserWx::getFsUserId, user.getUserId())
-                .eq(FsUserWx::getAppId, param.getAppId())
-                .eq(FsUserWx::getOpenId, session.getOpenid())
-                .set(FsUserWx::getUnionId, session.getUnionid() == null ? "" : session.getUnionid())
-                .set(FsUserWx::getUpdateTime, new Date())
-                .update();
-
-        // 如果更新失败(记录不存在),则插入
-        if (!updated) {
-            FsUserWx fsUserWx = new FsUserWx();
-            fsUserWx.setType(1);
-            fsUserWx.setFsUserId(user.getUserId());
-            fsUserWx.setAppId(param.getAppId());
-            fsUserWx.setOpenId(session.getOpenid());
-            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
-            fsUserWx.setCreateTime(new Date());
-            fsUserWx.setUpdateTime(new Date());
-            fsUserWxService.save(fsUserWx);
-        }
+        FsUserWx fsUserWx = new FsUserWx();
+        fsUserWx.setType(1);
+        fsUserWx.setFsUserId(user.getUserId());
+        fsUserWx.setAppId(param.getAppId());
+        fsUserWx.setOpenId(session.getOpenid());
+        fsUserWx.setUnionId(session.getUnionid() != null ? session.getUnionid() : null);
+        fsUserWx.setCreateTime(new Date());
+        fsUserWx.setUpdateTime(new Date());
+        fsUserWxService.saveOrUpdateByUniqueKey(fsUserWx);
         logger.info("zyp \n 【更新或插入用户与小程序{}的绑定关系】:{}", param.getAppId(), user.getUserId());
 
     }

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

@@ -15,6 +15,7 @@ import com.fs.course.param.newfs.FsUserCourseVideoUParam;
 import com.fs.course.service.*;
 import com.fs.course.vo.FsUserCourseVideoH5VO;
 import com.fs.course.vo.newfs.FsUserCourseVideoLinkDetailsVO;
+import com.fs.his.domain.FsUser;
 import com.fs.hisStore.service.IFsUserScrmService;
 import com.fs.system.service.ISysConfigService;
 import io.swagger.annotations.Api;
@@ -57,7 +58,7 @@ public class CourseWxH5ScrmController extends AppBaseController {
     @Login
     @ApiOperation("判断是否添加客服(是否关联销售)")
     @PostMapping("/isAddKf")
-    public ResponseResult<Boolean> isAddCompanyUser(@Valid @RequestBody FsUserCourseAddCompanyUserParam param) {
+    public ResponseResult<FsUser> isAddCompanyUser(@Valid @RequestBody FsUserCourseAddCompanyUserParam param) {
         Long userId = Long.parseLong(getUserId());
         param.setUserId(userId);
         return courseVideoService.isAddCompanyUser(param);

+ 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());