Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

yuhongqi 21 часов назад
Родитель
Сommit
bb3b318e4f
63 измененных файлов с 1388 добавлено и 187 удалено
  1. 13 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseTrainingCampController.java
  2. 8 0
      fs-admin/src/main/java/com/fs/qw/controller/QwPushCountController.java
  3. 8 0
      fs-admin/src/main/java/com/fs/qw/controller/QwSopController.java
  4. 3 1
      fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java
  5. 5 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysConfigController.java
  6. 9 3
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  7. 6 2
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseFinishTempParentController.java
  8. 3 1
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java
  9. 7 2
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  10. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java
  11. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwFriendWelcomeController.java
  12. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatController.java
  13. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java
  14. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java
  15. 14 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  16. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java
  17. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwWorkTaskNewController.java
  18. 209 4
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  19. 472 100
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  20. 7 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java
  21. 9 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  22. 88 0
      fs-qwhook/src/main/java/com/fs/app/controller/ApisCommonController.java
  23. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyDeptService.java
  24. 6 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyDeptServiceImpl.java
  25. 3 0
      fs-service/src/main/java/com/fs/course/config/CourseConfig.java
  26. 9 2
      fs-service/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java
  27. 17 0
      fs-service/src/main/java/com/fs/course/param/FsCourseRedPacketLogParam.java
  28. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseTrainingCampService.java
  29. 5 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseTrainingCampServiceImpl.java
  30. 15 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  31. 4 0
      fs-service/src/main/java/com/fs/his/domain/FsAppVersion.java
  32. 3 1
      fs-service/src/main/java/com/fs/his/mapper/FsDoctorMapper.java
  33. 0 1
      fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java
  34. 9 0
      fs-service/src/main/java/com/fs/his/vo/FsUserVO.java
  35. 4 0
      fs-service/src/main/java/com/fs/qw/vo/QwSopCourseFinishTempSetting.java
  36. 6 0
      fs-service/src/main/java/com/fs/sop/domain/QwSopTemp.java
  37. 3 0
      fs-service/src/main/java/com/fs/sop/domain/QwSopTempRules.java
  38. 3 0
      fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java
  39. 4 0
      fs-service/src/main/java/com/fs/sop/service/IQwSopService.java
  40. 49 3
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopServiceImpl.java
  41. 20 3
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  42. 188 4
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  43. 1 1
      fs-service/src/main/resources/application-config-druid-kyt.yml
  44. 2 2
      fs-service/src/main/resources/application-config-myhk.yml
  45. 13 7
      fs-service/src/main/resources/application-config-zlwh.yml
  46. 3 4
      fs-service/src/main/resources/application-druid-myhk.yml
  47. 4 5
      fs-service/src/main/resources/application-druid-zlwh.yml
  48. 5 1
      fs-service/src/main/resources/mapper/his/FsAppVersionMapper.xml
  49. 8 0
      fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml
  50. 2 1
      fs-service/src/main/resources/mapper/sop/QwSopTempRulesMapper.xml
  51. 28 29
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  52. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  53. 10 0
      fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  54. 18 0
      fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java
  55. 5 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserLoginController.java
  56. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseMpLoginController.java
  57. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwLoginController.java
  58. 10 0
      fs-user-app/src/main/java/com/fs/app/controller/store/AppLoginScrmController.java
  59. 6 1
      fs-user-app/src/main/java/com/fs/app/controller/store/WxCompanyUserScrmController.java
  60. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxCompanyUserScrmControllerCopy.java
  61. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxH5MpScrmController.java
  62. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxMpScrmController.java
  63. 8 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxUserScrmController.java

+ 13 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseTrainingCampController.java

@@ -68,6 +68,19 @@ public class FsUserCourseTrainingCampController {
         return AjaxResult.success(new PageInfo<>(list));
     }
 
+    /**
+     * 查全部训练营
+     * @param
+     * @param
+     * @param
+     * @return
+     */
+    @GetMapping("/listAll")
+    public R listAll() {
+        List<FsUserCourseTrainingCampVO> campList = fsUserCourseTrainingCampService.selectFsUserCourseTrainingCampListAll();
+        return R.ok().put("data", new PageInfo<>(campList));
+    }
+
     /**
      * 新增训练营
      * @param params    参数

+ 8 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwPushCountController.java

@@ -201,6 +201,14 @@ public class QwPushCountController extends BaseController {
         rspData.setTotal(total);
         return rspData;
     }
+
+    @GetMapping("/tokenExport")
+    public AjaxResult export(FastGptPushTokenTotal pushTokenInfo){
+        List<FastGptPushTokenTotal> list = qwPushCountService.selectFastGptPushTokenTotalList(pushTokenInfo);
+        ExcelUtil<FastGptPushTokenTotal> util = new ExcelUtil<FastGptPushTokenTotal>(FastGptPushTokenTotal.class);
+        return util.exportExcel(list,"token统计");
+    }
+
     @PreAuthorize("@ss.hasPermi('qw:qwPushCount:tokenListDept')")
     @GetMapping("/tokenListDept")
     public TableDataInfo tokenListDept(FastGptPushTokenDeptTotalParam pushTokenInfo) {

+ 8 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwSopController.java

@@ -123,6 +123,14 @@ public class QwSopController extends BaseController
         List<QwSop> list = qwSopService.selectQwSopMyList(qwSop);
         return getDataTable(list);
     }
+    /**
+     * 查询企微sop列表-全部
+     */
+//    @PreAuthorize("@ss.hasPermi('qw:sop:allList')")
+    @PostMapping("/allList")
+    public R allList(@RequestBody QwSop qwSop) {
+        return R.ok().put("data", qwSopService.selectQwSopMyList(qwSop));
+    }
     /**
      * 导出企微sop列表
      */

+ 3 - 1
fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java

@@ -204,7 +204,9 @@ public class QwUserController extends BaseController {
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 5 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysConfigController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.SecurityUtils;
+import com.fs.sop.service.impl.QwSopServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -38,6 +39,8 @@ public class SysConfigController extends BaseController {
     private ISysConfigService configService;
     @Autowired
     public RedisCache redisCache;
+    @Autowired
+    private QwSopServiceImpl qwSopServiceImpl;
 
     /**
      * 获取参数配置列表
@@ -140,6 +143,8 @@ public class SysConfigController extends BaseController {
         config.setCreateBy(SecurityUtils.getUsername());
         //修复只能更新的BUG
         if (null != config.getConfigId()) {
+//            今正加了手动关发群
+            qwSopServiceImpl.updateGroupSopStatus(config);
             return toAjax(configService.updateConfig(config));
         } else {
             return toAjax(configService.insertConfig(config));

+ 9 - 3
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -149,7 +149,9 @@ public class CompanyUserController extends BaseController {
             combinedDpetList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedDpetList.addAll(deptList);
         }
@@ -576,7 +578,9 @@ public class CompanyUserController extends BaseController {
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }
@@ -672,7 +676,9 @@ public class CompanyUserController extends BaseController {
             }
 
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedDeptList.addAll(deptList);
         }

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

@@ -92,7 +92,9 @@ public class FsCourseFinishTempParentController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }
@@ -157,7 +159,9 @@ public class FsCourseFinishTempParentController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

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

@@ -118,7 +118,9 @@ public class FsCourseWatchLogController extends BaseController
         }
 
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

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

@@ -210,7 +210,10 @@ public class QwExternalContactController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }
@@ -832,7 +835,9 @@ public class QwExternalContactController extends BaseController
                 combinedList.add(deptId);
             }
             //本部门的下级部门
-            List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+            //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+            //本部门的全部下级部门
+            List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
             if (!deptList.isEmpty()){
                 combinedList.addAll(deptList);
             }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java

@@ -73,7 +73,9 @@ public class QwExternalContactTransferLogController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwFriendWelcomeController.java

@@ -82,7 +82,9 @@ public class QwFriendWelcomeController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatController.java

@@ -74,7 +74,9 @@ public class QwGroupChatController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java

@@ -114,7 +114,9 @@ public class QwSopController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java

@@ -175,7 +175,9 @@ public class QwSopLogsController extends BaseController
                     combinedList.add(deptId);
                 }
                 // 本部门的下级部门
-                List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+                //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+                //本部门的全部下级部门
+                List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
                 if (!deptList.isEmpty()) {
                     combinedList.addAll(deptList);
                 }

+ 14 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java

@@ -24,6 +24,8 @@ import com.fs.sop.params.BatchOpenOrCloseOfficialParam;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.service.IQwSopTempService;
 import com.fs.sop.vo.UpdateRedVo;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -62,6 +64,9 @@ public class QwSopTempController extends BaseController
     @Autowired
     private CompanyUserServiceImpl companyUserService;
 
+    @Autowired
+    private ISysConfigService configService;
+
     /**
      * 查询sop模板列表
      */
@@ -375,4 +380,13 @@ public class QwSopTempController extends BaseController
     public R batchOpenOrCloseOfficial(@RequestBody BatchOpenOrCloseOfficialParam param){
         return qwSopTempService.batchOpenOrCloseOfficial(param);
     }
+
+    /**
+     * 根据后台配置的数据,动态控制前端展示的功能。
+     * */
+    @GetMapping(value = "/getConfigByKey/{configKey}")
+    public AjaxResult getConfigByKey(@PathVariable String configKey) {
+        SysConfig config = configService.selectConfigByConfigKey(configKey);
+        return AjaxResult.success(config);
+    }
 }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java

@@ -199,7 +199,9 @@ public class QwUserController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 3 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwWorkTaskNewController.java

@@ -87,7 +87,9 @@ public class QwWorkTaskNewController extends BaseController
             combinedList.add(deptId);
         }
         //本部门的下级部门
-        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        //本部门的全部下级部门
+        List<Long> deptList = companyDeptService.getCurrentDeptIdDownTreeIds(deptId);
         if (!deptList.isEmpty()){
             combinedList.addAll(deptList);
         }

+ 209 - 4
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -1,5 +1,6 @@
 package com.fs.app.service;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -8,11 +9,12 @@ import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.common.utils.spring.SpringUtils;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMiniapp;
+import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.service.ICompanyMiniappService;
-import com.fs.course.domain.FsCoursePlaySourceConfig;
-import com.fs.course.domain.FsCourseWatchLog;
-import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.*;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
@@ -26,6 +28,8 @@ import com.fs.live.mapper.LiveWatchLogMapper;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.domain.QwUserVideo;
+import com.fs.qw.mapper.LuckyBagCollectRecordMapper;
+import com.fs.qw.mapper.LuckyBagMapper;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.service.IQwUserService;
@@ -35,14 +39,18 @@ import com.fs.qwApi.param.QwExternalContactHParam;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.service.IQwSopLogsService;
 import com.fs.sop.service.impl.QwSopLogsServiceImpl;
+import com.fs.system.service.ISysConfigService;
 import com.fs.wxwork.dto.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -62,6 +70,13 @@ public class IpadSendServer {
     private final IFsCoursePlaySourceConfigService playSourceConfigService;
     private final FsUserMapper fsUserMapper;
     private final FsUserCourseVideoMapper fsUserCourseVideoMapper;
+    private final ISysConfigService configService;
+    private final LuckyBagMapper luckyBagMapper;
+
+    private final CompanyMapper companyMapper;
+
+    @Autowired
+    private LuckyBagCollectRecordMapper luckyBagCollectRecordMapper;
 
 
     private static final List<String> PROJECT_NAMES = Arrays.asList("济南联志健康", "北京存在文化","宽益堂");
@@ -263,7 +278,7 @@ public class IpadSendServer {
         dto.setIsRoom(true);
        ipadSendUtils.sendTxtAtMsgVo(dto, vo.getServerId());
     }
-    
+
     public void sendVoice(BaseVo vo, QwSopCourseFinishTempSetting.Setting content) {
         if (StringUtils.isEmpty(content.getVoiceUrl()) || StringUtils.isEmpty(content.getVoiceDuration())) {
             log.debug("语音未生成无法发送,转文字发送:{}", vo);
@@ -607,6 +622,20 @@ public class IpadSendServer {
                     // 语音
                     sendWxVideo(vo, content);
                     break;
+                case "13":
+                    // 注册过的不在发送了
+                    QwExternalContact qwExternalContact =qwExternalContactMapper.selectQwExternalContactById(qwSopLogs.getExternalId());
+                    if(qwExternalContact!=null && qwExternalContact.getFsUserId()!=null){
+                        qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "已经注册过的客户不发送");
+                    }
+                    sendMiniProgram(vo, content, miniMap, qwUser.getCompanyId());
+                case "14":
+                    // 记录福袋发送记录
+                    Long businessId = addLuckyBagCollectRecord(qwUser, content,qwSopLogs);
+                    if (ObjectUtil.isEmpty(businessId)) {
+                        qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "福袋发放失败,请重新发送!");
+                    }
+                    sendMiniProgram(vo, content, miniMap, qwUser.getCompanyId());
                 case "99":
                     // 群发
                     sendTxtAtMsg(vo);
@@ -625,4 +654,180 @@ public class IpadSendServer {
     public void loginOut(QwUser user) {
         ipadSendUtils.loginOut(user.getUid(), user.getServerId());
     }
+
+    /**
+     * @Description: 生成福袋记录
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/2/4 11:39
+     */
+    private Long addLuckyBagCollectRecord(QwUser qwUser, QwSopCourseFinishTempSetting.Setting content, QwSopLogs qwSopLogs) {
+
+        try{
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+            Date updateTime = createUpdateTime(content, new Date(), config);
+            LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(content.getLuckyBagId());
+            String companyUserId = String.valueOf(qwUser.getCompanyUserId()).trim();
+            String companyId = String.valueOf(qwUser.getCompanyId()).trim();
+            Long businessId = addLuckyBagCollectRecord(qwUser,luckyBag,content,qwSopLogs,updateTime,companyUserId,companyId,content.getChatId());
+            return businessId;
+        }catch (Exception e){
+            log.error("福袋创建失败:qwUser={},qwSopLogs={}",qwUser,qwSopLogs);
+            return null;
+        }
+    }
+
+    /**
+     * 过期时间
+     *
+     * @param setting
+     * @param sendTime
+     * @param config
+     * @return
+     */
+    private Date createUpdateTime(QwSopCourseFinishTempSetting.Setting setting, Date sendTime, CourseConfig config) {
+
+        Integer expireDays = (setting.getExpiresDays() == null || setting.getExpiresDays() == 0)
+                ? config.getVideoLinkExpireDate()
+                : setting.getExpiresDays();
+
+//         使用 Java 8 时间 API 计算过期时间
+        LocalDateTime sendDateTime = sendTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime expireDateTime = sendDateTime.plusDays(expireDays - 1);
+        expireDateTime = expireDateTime.toLocalDate().atTime(23, 59, 59);
+        Date updateTime = Date.from(expireDateTime.atZone(ZoneId.systemDefault()).toInstant());
+
+        return updateTime;
+    }
+
+    /**
+     * 增加福袋发放记录、领取记录
+     *
+     * @param companyId
+     * @param qwUser
+     * @param luckyBag
+     * @param content
+     * @param qwSopLogs
+     * @param sendTime
+     * @param companyUserId
+     * @param chatId
+     */
+    private Long addLuckyBagCollectRecord(QwUser qwUser, LuckyBag luckyBag, QwSopCourseFinishTempSetting.Setting content,
+                                          QwSopLogs qwSopLogs,
+                                          Date sendTime,
+                                          String companyUserId,
+                                          String companyId,
+                                          String chatId) {
+        try {
+            // 参数校验
+            if (content == null || qwSopLogs == null || sendTime == null) {
+                log.error("添加福袋记录失败:必要参数为空 [content:{}, qwSopLogs:{}, sendTime:{}]",
+                        content, qwSopLogs, sendTime);
+                return null;
+            }
+
+            // 验证福袋ID
+            if (content.getLuckyBagId() == null) {
+                log.error("福袋ID为空");
+                return null;
+            }
+
+            // 查询福袋信息
+            if (luckyBag == null) {
+                log.error("未找到对应的福袋信息 [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            // 检查福袋状态
+            if (luckyBag.getDataStatus() != null && luckyBag.getDataStatus().equals(0)) {
+                log.error("福袋被禁用 [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            // 查询公司信息
+            Company company = (Company)redisCache.getCacheObject("companyId:"+companyId);
+            if (company == null) {
+                company = companyMapper.selectCompanyById(Long.valueOf(companyId));
+                redisCache.setCacheObject("companyId:"+companyId, company, 1 , TimeUnit.DAYS);
+                log.error("未找到对应的公司信息 [companyId:{}]", companyId);
+            }
+
+            // 构建福袋记录
+            LuckyBagCollectRecord luckyBagCollectRecord = buildLuckyBagRecord(qwUser,content, qwSopLogs, sendTime,
+                    companyUserId, companyId, chatId, company, luckyBag);
+            luckyBagCollectRecord.setSendTime(new Date());
+            luckyBagCollectRecord.setCollectType("0");
+            // 插入记录并返回ID
+            int result = luckyBagCollectRecordMapper.insertLuckyBagCollectRecord(luckyBagCollectRecord);
+            if (result <= 0) {
+                log.error("福袋记录插入失败 [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            // 返回新增记录的ID
+            Long recordId = luckyBagCollectRecord.getId();
+            if (recordId == null) {
+                log.error("福袋记录插入成功但未返回ID [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            log.info("福袋记录添加成功 [recordId:{}, luckyBagId:{}]", recordId, content.getLuckyBagId());
+            return recordId;
+
+        } catch (NumberFormatException e) {
+            log.error("ID转换失败 [companyId:{}, companyUserId:{}]", companyId, companyUserId, e);
+            return null;
+        } catch (Exception e) {
+            log.error("ID:" + (content != null ? content.getLuckyBagId() : "unknown") + "-添加福袋记录失败", e);
+            return null;
+        }
+    }
+
+
+    /**
+     * 构建福袋记录对象
+     */
+    private LuckyBagCollectRecord buildLuckyBagRecord(QwUser qwUser,QwSopCourseFinishTempSetting.Setting content,
+                                                      QwSopLogs qwSopLogs,
+                                                      Date sendTime,
+                                                      String companyUserId,
+                                                      String companyId,
+                                                      String chatId,
+                                                      Company company,
+                                                      LuckyBag luckyBag) {
+        LuckyBagCollectRecord record = new LuckyBagCollectRecord();
+        record.setQwUserId(qwUser.getQwUserId());
+        record.setQwUserName(qwUser.getQwUserName());
+        record.setLuckyBagId(content.getLuckyBagId());
+        record.setExpiryTime(sendTime);
+        record.setCollectType("3");
+        record.setCompanyId(Long.valueOf(companyId));
+        record.setUserId(qwSopLogs.getFsUserId());
+        if (ObjectUtil.isNotEmpty(qwSopLogs.getFsUserId())){
+            FsUser fsUser = fsUserMapper.selectFsUserByUserId(qwSopLogs.getFsUserId());
+            record.setUserName(ObjectUtil.isNotEmpty(fsUser)?fsUser.getNickName():null);
+        }
+        record.setCompanyName(company.getCompanyName());
+        record.setCompanyUserId(Long.valueOf(companyUserId));
+        record.setSendLink(content.getMiniprogramPage());
+
+        // 设置奖励类型和聊天信息
+        if (StringUtils.isNotEmpty(chatId)) {
+            record.setRewardType(1L);
+            record.setChatId(chatId);
+            record.setExternalUserName(qwSopLogs.getExternalUserName());
+        } else {
+            record.setRewardType(2L);
+        }
+
+        // 设置币种金额
+        if (luckyBag.getRewardType() != null && luckyBag.getRewardType().equals("1")) {
+            record.setCoinAmount(luckyBag.getAmount());
+        }
+
+        return record;
+    }
+
 }

Разница между файлами не показана из-за своего большого размера
+ 472 - 100
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java


+ 7 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java

@@ -22,6 +22,7 @@ import com.fs.course.vo.FsCourseVideoListBySidebarVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.enums.SysConfigEnum;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.system.service.ISysConfigService;
@@ -61,6 +62,8 @@ public class ApisFsUserCourseVideoController extends BaseController {
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private ConfigUtil configUtil;
 
 
     @ApiOperation("课程视频详情")
@@ -210,6 +213,10 @@ public class ApisFsUserCourseVideoController extends BaseController {
         if (StringUtil.strIsNullOrEmpty(param.getCorpId())){
             return R.error("企业id不能为空");
         }
+        JSONObject jsonObject = configUtil.generateConfigByKey(SysConfigEnum.COURSE_CONFIG.getKey());
+        if (jsonObject!= null && jsonObject.getString("roomLinkAllow")!= null && Boolean.parseBoolean(jsonObject.getString("roomLinkAllow"))){
+            return R.error("创建群链接已禁止");
+        }
 
 
         return fsUserCourseVideoService.createRoomMiniLink(param);

+ 9 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -5,6 +5,7 @@ import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.CloudHostUtils;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.FsCourseLinkMiniParam;
@@ -21,6 +22,8 @@ import com.fs.course.vo.newfs.FsUserCourseListVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.course.vo.newfs.FsUserVideoListVO;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.enums.SysConfigEnum;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.service.IQwUserService;
@@ -53,6 +56,8 @@ public class FsUserCourseVideoController {
 
     @Autowired
     private IQwExternalContactService qwExternalContactService;
+    @Autowired
+    private ConfigUtil configUtil;
 
 
     @ApiOperation("课程视频详情")
@@ -118,6 +123,10 @@ public class FsUserCourseVideoController {
         if (StringUtil.strIsNullOrEmpty(param.getCorpId())){
             return R.error("企业id不能为空");
         }
+        JSONObject jsonObject = configUtil.generateConfigByKey(SysConfigEnum.COURSE_CONFIG.getKey());
+        if (jsonObject!= null && jsonObject.getString("roomLinkAllow")!= null && Boolean.parseBoolean(jsonObject.getString("roomLinkAllow"))){
+            return R.error("创建群链接已禁止");
+        }
 
         return fsUserCourseVideoService.createRoomMiniLink(param);
     }

+ 88 - 0
fs-qwhook/src/main/java/com/fs/app/controller/ApisCommonController.java

@@ -1,17 +1,23 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.sign.Md5Utils;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.service.IFsCourseLinkService;
+import com.fs.fastGpt.domain.FastGptPushTokenTotal;
 import com.fs.fastGpt.mapper.FastgptChatVoiceHomoMapper;
 import com.fs.his.domain.FsAppVersion;
+import com.fs.his.domain.FsUser;
+import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.service.IFsAppVersionService;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qw.mapper.QwExternalContactCrmMapper;
+import com.fs.qw.mapper.QwRestrictionPushRecordMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.param.QwConfigSignatureParam;
 import com.fs.qw.service.IQwJsApiService;
@@ -26,10 +32,15 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.List;
+
+import static com.fs.his.utils.PhoneUtil.encryptPhone;
+import static com.fs.his.utils.PhoneUtil.encryptPhoneOldKey;
 
 
 @Api("公共接口")
@@ -77,6 +88,83 @@ public class ApisCommonController {
     @Autowired
     private IFsCourseLinkService iFsCourseLinkService;
 
+    @Autowired
+    private QwRestrictionPushRecordMapper qwRestrictionPushRecordMapper;
+
+    @Autowired
+    private FsUserMapper userMapper;
+
+    @GetMapping("/findUsersByPhone")
+    public void findUsersByPhone(String phone) {
+
+        // 先根据加密手机号查询用户
+        String jiami = (encryptPhone(phone));
+
+        FsUser user = null;
+        List<FsUser> usersByPhone = userMapper.selectFsUsersByPhoneLimitOne(jiami);
+        if (CollectionUtil.isEmpty(usersByPhone)) {
+            usersByPhone = userMapper.selectFsUsersByPhoneLimitOne(encryptPhoneOldKey(phone));
+        }
+        // 如果没有找到用户,再根据手机号查询
+        if (CollectionUtil.isEmpty(usersByPhone)) {
+            usersByPhone = userMapper.selectFsUsersByPhoneLimitOne(phone);
+
+        }
+
+        if (CollectionUtil.isEmpty(usersByPhone)){
+            log.error("1111111111111111");
+        }
+        //当前手机号只绑定了单个微信,直接登录
+        if (usersByPhone.size()==1){
+            user = usersByPhone.get(0);
+            // 校验用户是否存在及账号状态
+            if (user == null) {
+                log.error("222222222222");
+            } else if (user.getStatus() == 0) {
+                log.error("33333333333");
+            } else if (StringUtils.isEmpty(user.getPassword())) {
+                log.error("4444444");
+            }
+
+        }
+        System.out.println(usersByPhone);
+    }
+
+    @GetMapping("/sopPushTokenTotal")
+    public void sopPushTokenTotal(String dateTime) {
+
+        // 获取日期字符串(今天或昨天)
+//        String dateTime;
+//            dateTime = DateUtils.getDate();
+        log.info("开始执行sop任务token消耗统计");
+        try {
+            List<FastGptPushTokenTotal> fastGptPushTotalList = qwRestrictionPushRecordMapper.selectFastgptPushTokenTotal(dateTime);
+            if (fastGptPushTotalList != null && !fastGptPushTotalList.isEmpty()) {
+                for (FastGptPushTokenTotal fastGptPushTotal : fastGptPushTotalList) {
+                    // 获取统计数据
+                    Integer type = fastGptPushTotal.getType();
+                    Long count = 0L;
+                    if(type == 7){
+                        count = fastGptPushTotal.getCount() * 450;
+                    }else{
+                        count = fastGptPushTotal.getCount() * 150;
+                    }
+                    fastGptPushTotal.setCount(count);
+                    FastGptPushTokenTotal pushTotal = qwRestrictionPushRecordMapper.selectFastGptPushTokenTotalByInfo(fastGptPushTotal);
+                    if(pushTotal == null){
+                        qwRestrictionPushRecordMapper.insertPushTokenTotal(fastGptPushTotal);
+                    }else{
+                        fastGptPushTotal.setId(pushTotal.getId());
+                        qwRestrictionPushRecordMapper.updatePushTokenTotal(fastGptPushTotal);
+                    }
+                }
+            }
+            log.info("结束执行sop任务token消耗统计");
+        } catch (Exception e) {
+            log.error("执行sop任务token消耗统计异常", e);
+        }
+    }
+
     /**
      * 获取跳转微信小程序的链接地址
      */

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyDeptService.java

@@ -91,4 +91,6 @@ public interface ICompanyDeptService
      * @return 部门
      */
     CompanyDept getDefaultCompanyDeptByCompanyId(Long companyId);
+
+    List<Long> getCurrentDeptIdDownTreeIds(Long deptId);
 }

+ 6 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyDeptServiceImpl.java

@@ -249,6 +249,12 @@ public class CompanyDeptServiceImpl implements ICompanyDeptService
     public CompanyDept getDefaultCompanyDeptByCompanyId(Long companyId) {
         return companyDeptMapper.getTopCompanyDeptByCompanyId(companyId);
     }
+
+    @Override
+    public List<Long> getCurrentDeptIdDownTreeIds(Long deptId) {
+        return companyDeptMapper.getCurrentDeptIdDownTreeIds(deptId);
+    }
+
     /**
      * 递归列表
      */

+ 3 - 0
fs-service/src/main/java/com/fs/course/config/CourseConfig.java

@@ -97,6 +97,9 @@ public class CourseConfig implements Serializable {
     // 控制休息提示是否打开 默认打开 0-关闭 1-打开
     private Integer isOpenRestReminder;
 
+    // 发课发群是否打开false打开,true关闭
+    private Boolean roomLinkAllow;
+
 
     @Data
     public static class DisabledTimeVo{

+ 9 - 2
fs-service/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java

@@ -114,13 +114,15 @@ public interface FsCourseRedPacketLogMapper
     List<FsCourseRedPacketLogListPVO> selectRedPacketLogListVO(@Param("maps") FsCourseRedPacketLogParam param);
 
     @Select({"<script> " +
-            "select l.*,v.title,u.nick_name as fsNickName,u.avatar as fsAvatar,u.phone,cu.nick_name company_user_name,c.company_name,qu.qw_user_name,fuc.course_name,u.phone as phoneNumber,cu.dept_id   from fs_course_red_packet_log l  \n" +
+            "select l.*,v.title,u.nick_name as fsNickName,u.avatar as fsAvatar,u.phone,cu.nick_name company_user_name,c.company_name,qu.qw_user_name,fuc.course_name,u.phone as phoneNumber,cu.dept_id   " +
+            "from fs_course_red_packet_log l  \n" +
             "left join fs_user_course_video v on v.video_id = l.video_id \n" +
             "left join fs_user u on u.user_id = l.user_id \n" +
             "left join fs_user_course fuc on fuc.course_id = l.course_id \n" +
             "left join company_user cu on cu.user_id=l.company_user_id \n" +
             "left join company c on c.company_id=cu.company_id \n" +
             "LEFT JOIN qw_user qu on qu.id= l.qw_user_id  \n" +
+            "left join fs_course_watch_log fcwl on fcwl.log_id = l.watch_log_id \n" +
             "where 1=1   " +
             "<if test = ' maps.userId !=null '> and l.user_id = #{maps.userId} </if>" +
             "<if test = ' maps.logId !=null '> and l.log_id = #{maps.logId} </if>" +
@@ -131,7 +133,6 @@ public interface FsCourseRedPacketLogMapper
             "<if test = ' maps.nickName !=null '> and u.nick_name  like concat('%', #{maps.nickName}, '%') </if>" +
             "<if test = ' maps.courseId !=null '> and l.course_id = #{maps.courseId} </if>" +
             "<if test = ' maps.videoId !=null '> and l.video_id = #{maps.videoId} </if>" +
-            "<if test = ' maps.periodId !=null '> and l.period_id = #{maps.periodId} </if>" +
             "<if test = ' maps.status !=null '> and l.status = #{maps.status} </if>" +
             "<if test = \"maps.phone !=null and maps.phone != '' \"> and u.phone = #{maps.phone} </if>" +
             "<if test = ' maps.qwUserId !=null '> and l.qw_user_id = #{maps.qwUserId} </if>" +
@@ -143,6 +144,12 @@ public interface FsCourseRedPacketLogMapper
             "                    ${item}\n" +
             "                </foreach>\n" +
             "</if>" +
+            "<if test = 'maps.trainingCampId != null and maps.periodId !=null'>\n" +
+            "and fcwl.period_id = #{maps.periodId}\n " +
+            "</if>" +
+            "<if test = 'maps.sopId != null and maps.sopDate != null' >\n" +
+            "and fcwl.sop_id = #{maps.sopId} and fcwl.camp_period_time = #{maps.sopDate}\n"+
+            "</if>"+
             " order by l.log_id desc  "+
             "</script>"})
     List<FsCourseRedPacketLogListPVO> selectFsCourseRedPacketLogListVO(@Param("maps")FsCourseRedPacketLogParam fsCourseRedPacketLog);

+ 17 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseRedPacketLogParam.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -54,6 +55,22 @@ public class FsCourseRedPacketLogParam implements Serializable {
 
     private List<String> userIds;
 
+    /**
+     * 训练营id
+     */
+    private Long trainingCampId;
+
+    /**
+     * 自动发课营期时间
+     */
+    private LocalDate sopDate;
+    /**
+     * 自动发课营期id
+     */
+    private String sopId;
+
+
+
     public List<String> getUserIds() {
         if (userIds == null || userIds.isEmpty()) {
             return userIds;

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

@@ -49,4 +49,6 @@ public interface IFsUserCourseTrainingCampService extends IService<FsUserCourseT
      * @return  list
      */
     List<OptionsVO> selectCampListByMap(Map<String, Object> params);
+
+    List<FsUserCourseTrainingCampVO> selectFsUserCourseTrainingCampListAll();
 }

+ 5 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseTrainingCampServiceImpl.java

@@ -181,4 +181,9 @@ public class FsUserCourseTrainingCampServiceImpl extends ServiceImpl<FsUserCours
     public List<OptionsVO> selectCampListByMap(Map<String, Object> params) {
         return baseMapper.selectCampListByMap(params);
     }
+
+    @Override
+    public List<FsUserCourseTrainingCampVO> selectFsUserCourseTrainingCampListAll() {
+        return baseMapper.selectFsUserCourseTrainingCampVOListByMap(null);
+    }
 }

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

@@ -1017,6 +1017,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                         if (log.getUserId() == null || log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())) {
                             log.setUserId(param.getUserId());
                         }
+                        if(CloudHostUtils.hasCloudHostName("木易华康")){
+                            // 看课类型 1.app 2小程序
+                            int watchType = Objects.nonNull(param.getTypeFlag()) && param.getTypeFlag() == 1 ? 1 : 2;
+                            log.setWatchType(watchType);
+                        }
                         log.setUpdateTime(new Date());
                         courseWatchLogMapper.updateFsCourseWatchLog(log);
                     }
@@ -1130,6 +1135,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             if (log.getUserId() == null || log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())) {
                 log.setUserId(param.getUserId());
             }
+            if(CloudHostUtils.hasCloudHostName("木易华康")){
+                // 看课类型 1.app 2小程序
+                int watchType = Objects.nonNull(param.getTypeFlag()) && param.getTypeFlag() == 1 ? 1 : 2;
+                log.setWatchType(watchType);
+            }
             log.setUpdateTime(new Date());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
 
@@ -1170,7 +1180,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             if (log.getUserId() == null || log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())) {
                 log.setUserId(param.getUserId());
             }
-
+            if(CloudHostUtils.hasCloudHostName("木易华康")){
+                // 看课类型 1.app 2小程序
+                int watchType = Objects.nonNull(param.getTypeFlag()) && param.getTypeFlag() == 1 ? 1 : 2;
+                log.setWatchType(watchType);
+            }
             log.setUpdateTime(new Date());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
 

+ 4 - 0
fs-service/src/main/java/com/fs/his/domain/FsAppVersion.java

@@ -48,6 +48,10 @@ public class FsAppVersion extends BaseEntity
     @Excel(name = "是否强制更新")
     private Integer isForce;
 
+    /** 是否强制更新 */
+    @Excel(name = "热更新强制更新")
+    private Integer isHotForce;
+
     /** APP 类型 1医生端 2药师端 */
     @Excel(name = "APP 类型 1医生端 2药师端")
     private Integer appType;

+ 3 - 1
fs-service/src/main/java/com/fs/his/mapper/FsDoctorMapper.java

@@ -134,7 +134,8 @@ public interface FsDoctorMapper
             "LEFT JOIN fs_doctor dd ON dd.doctor_id=doc.prescribe_doctor_id \n" +
             "where doc.doctor_id = #{doctorId}\n")
     FsDoctorVO selectFsDoctorVOByDoctorId(Long doctorId);
-    @Select("select doctor_id id,doctor_name name from fs_doctor where doctor_type =1 and doctor_name LIKE CONCAT('%', #{name}, '%')  limit 10")
+
+    @Select("select doctor_id id,doctor_name name,position,certificate_code from fs_doctor where doctor_type =1 and doctor_name LIKE CONCAT('%', #{name}, '%')  limit 10")
     List<UserVo> selectuserDocVoList(String name);
 
 
@@ -196,6 +197,7 @@ public interface FsDoctorMapper
     List<OptionsVO> selectAllfollowDoctorList();
     @Select("select account from fs_doctor where doctor_id=#{id} ")
     String selectFsDoctorNameByDoctorId(Long id);
+
     @Select("select doctor_id id,doctor_name name,position,certificate_code from fs_doctor where doctor_type =1 ")
     List<UserVo> selectAllDocVoList();
 

+ 0 - 1
fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java

@@ -7,7 +7,6 @@ import javax.crypto.spec.SecretKeySpec;
 import java.util.Base64;
 
 public class PhoneUtil {
-
     public static String encryptPhone(String text) {
         String encryptedText=null;
         try {

+ 9 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserVO.java

@@ -165,4 +165,13 @@ public class FsUserVO extends FsUser implements Serializable
     @ApiModelProperty(value = "绑定时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date bindTime;
+
+    @ApiModelProperty(value = "最后一次登录IP")
+    private String lastIp;
+
+    @ApiModelProperty(value = "当前登录设备")
+    private String loginDevice;
+
+    @ApiModelProperty(value = "app来源")
+    private String source;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopCourseFinishTempSetting.java

@@ -135,6 +135,10 @@ public class QwSopCourseFinishTempSetting implements Serializable,Cloneable{
          * 业务id
          */
         private String businessId;
+        /**
+         * 群id
+         */
+        private String chatId;
         @Override
         public Setting clone() {
             try {

+ 6 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSopTemp.java

@@ -59,6 +59,12 @@ public class QwSopTemp implements Serializable
     @TableField(exist = false)
     private String openOfficial;
 
+    /**
+     * 是否开启app发课
+     */
+    @TableField(exist = false)
+    private String openAppCourse;
+
     private String corpId;
 
     /**

+ 3 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSopTempRules.java

@@ -39,6 +39,9 @@ public class QwSopTempRules{
     /**是否官方群发 */
     private String isOfficial;
 
+    /**是否App发课 */
+    private String openAppCourse;
+
     /** 消息类别;(1普通,2课程,3订单,4AI触达) */
     @Excel(name = "消息类别;", readConverterExp = "1=普通,2课程,3订单,4AI触达")
     private Integer contentType;

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

@@ -354,4 +354,7 @@ public interface QwSopLogsMapper extends BaseMapper<QwSopLogs> {
             "ORDER BY qw_user_key" +
             "</script>")
     List<QwApiSopLogToken> countQwApiAopLogToken(@Param("data") String dateStr);
+
+    @DataSource(DataSourceType.SOP)
+    void updateGroupSopStatus();
 }

+ 4 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopService.java

@@ -13,6 +13,7 @@ import com.fs.sop.vo.QwSopTask;
 import com.fs.sop.vo.SopVoiceListVo;
 import com.fs.store.vo.h5.ExternalUserStatsVO;
 import com.fs.store.vo.h5.FsUserStatisticsVO;
+import com.fs.system.domain.SysConfig;
 
 import java.io.IOException;
 import java.util.List;
@@ -116,4 +117,7 @@ public interface IQwSopService
 
     //看课足迹--侧边栏
     List<FsCourseWatchLogStatisticsListVO> externalWatchRecordStatsList (QwSidebarStatsParam qwParam);
+
+    //批量修改群发sop为暂停
+    public Integer updateGroupSopStatus(SysConfig config);
 }

+ 49 - 3
fs-service/src/main/java/com/fs/sop/service/impl/QwSopServiceImpl.java

@@ -1,6 +1,8 @@
 package com.fs.sop.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.core.domain.R;
@@ -11,12 +13,15 @@ import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.vo.CompanyQwUserByIdsVo;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.service.IFsCourseLinkService;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.course.vo.FsCourseWatchLogStatisticsListVO;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.enums.SysConfigEnum;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwSopUpdateStatus;
 import com.fs.qw.domain.QwUser;
@@ -39,6 +44,7 @@ import com.fs.sop.vo.SopVoiceListVo;
 import com.fs.sop.vo.VoiceVo;
 import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.vo.h5.*;
+import com.fs.system.domain.SysConfig;
 import com.fs.voice.utils.StringUtil;
 import com.fs.wxUser.mapper.CompanyWxUserMapper;
 import com.fs.wxUser.param.CompanyWxUserSopParam;
@@ -69,8 +75,7 @@ import java.util.stream.Collectors;
  * @date 2024-07-31
  */
 @Service
-public class QwSopServiceImpl implements IQwSopService
-{
+public class QwSopServiceImpl implements IQwSopService {
     private static final Logger log = LoggerFactory.getLogger(QwSopServiceImpl.class);
 
     @Autowired
@@ -117,6 +122,8 @@ public class QwSopServiceImpl implements IQwSopService
     private CompanyUserMapper companyUserMapper;
 
     private IQwSopTempVoiceService qwSopTempVoiceService;
+    @Autowired
+    private ConfigUtil configUtil;
 
     @Autowired
     public void setIQwSopTempVoiceService(@Lazy IQwSopTempVoiceService qwSopTempVoiceService) {
@@ -142,6 +149,9 @@ public class QwSopServiceImpl implements IQwSopService
 
     @Autowired
     private FsUserMapper fsUserMapper;
+
+    private static final Long COURSE_CONFIG_ID = 10L;
+
     /**
      * 查询企微sop
      *
@@ -155,7 +165,6 @@ public class QwSopServiceImpl implements IQwSopService
     }
 
 
-
     /**
      * 查询企微sop列表
      *
@@ -1370,6 +1379,43 @@ public class QwSopServiceImpl implements IQwSopService
         return list;
     }
 
+    @Override
+    public Integer updateGroupSopStatus(SysConfig config) {
+        if (Objects.equals(config.getConfigId(), COURSE_CONFIG_ID)) {
+            String configValue = config.getConfigValue();
+            if (configValue != null && configValue.contains("roomLinkAllow")) {
+                try {
+                    CourseConfig newConfig = JSONUtil.toBean(configValue, CourseConfig.class);
+                    if (Boolean.TRUE.equals(newConfig.getRoomLinkAllow())) {
+                        // 获取旧配置
+                        JSONObject oldConfig = configUtil.generateConfigByKey(SysConfigEnum.COURSE_CONFIG.getKey());
+                        Boolean needUpdate = false;
+                        if (oldConfig == null) {
+                            // 旧配置不存在,需要更新
+                            needUpdate = true;
+                        } else {
+                            String oldValueStr = oldConfig.getString("roomLinkAllow");
+                            if (oldValueStr == null) {
+                                // 旧配置没有该字段,需要更新
+                                needUpdate = true;
+                            } else {
+                                Boolean oldValue = Boolean.parseBoolean(oldValueStr);
+                                // 新旧值不同时才需要更新
+                                needUpdate = !newConfig.getRoomLinkAllow().equals(oldValue);
+                            }
+                        }
+                        if (needUpdate) {
+                            qwSopLogsMapper.updateGroupSopStatus();
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("处理课程配置异常", e);
+                }
+            }
+        }
+        return null;
+    }
+
     /**
      *  获取外部联系人信息
      * */

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

@@ -469,6 +469,11 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
                 } else {
                     rules.setIsOfficial("0");
                 }
+                if (temp.getOpenAppCourse().equals("1")) {
+                    rules.setOpenAppCourse(sorts.get() == 0 ? "1" : "0");//app看课
+                } else {
+                    rules.setOpenAppCourse("0");
+                }
 
                 if (day.getDayNum() == 1 && sorts.get() == 0 && temp.getOpenOfficial().equals("1")) {
                     rules.setTime("01:05");
@@ -508,7 +513,11 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
 
                 setting.setIsBindUrl(1);
                 setting.setLinkDescribe(e.getTitle());
-                setting.setContentType("4");
+                if (temp.getOpenAppCourse().equals("1")&&temp.getOpenOfficial().equals("0")) { //如果选择了app发课
+                    setting.setContentType("9");//这里的消息类别就是app类型
+                }else {
+                    setting.setContentType("4");
+                }
                 content.setContent(JSON.toJSONString(setting));
                 content.setIsBindUrl(1);
                 List<QwSopTempContent> qwSopTempContents = new ArrayList<>();
@@ -519,7 +528,11 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
                     content2.setContentType(3);
                     QwSopTempSetting2.Content.Setting setting2 = new QwSopTempSetting2.Content.Setting();
                     setting2.setValue(temp.getModeContent());
-                    setting2.setContentType("1");
+                    if (temp.getOpenAppCourse().equals("1")&&temp.getOpenOfficial().equals("0")) { //如果选择了app发课
+                        setting2.setContentType("15");//这里的内容类别就是App文本类型
+                    }else {
+                        setting2.setContentType("1");
+                    }
                     content2.setContent(JSON.toJSONString(setting2));
                     qwSopTempContents.add(content2);
                 }
@@ -530,7 +543,11 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
                     content3.setContentType(3);
                     QwSopTempSetting2.Content.Setting setting3 = new QwSopTempSetting2.Content.Setting();
                     setting3.setValue(temp.getTimeDesc().get(sorts.get() - 1));
-                    setting3.setContentType("1");
+                    if (temp.getOpenAppCourse().equals("1")&&temp.getOpenOfficial().equals("0")) { //如果选择了app发课
+                        setting3.setContentType("15");//这里的内容类别就是App文本类型
+                    }else {
+                        setting3.setContentType("1");
+                    }
                     content3.setContent(JSON.toJSONString(setting3));
                     qwSopTempContents.add(content3);
 

+ 188 - 4
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -614,6 +614,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             replaceContent(st.getContentType(), st.getLinkDescribe(), st::setLinkDescribe, words); // 替换 linkTitle
                         }
 
+                        String miniAppId = null;
                         switch (st.getContentType()) {
                             //文字和短链一起
                             case "1":
@@ -664,7 +665,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
                                         qwUser.getId(), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), null, config, qwGroupChat.getChatId());
 
-                                String miniAppId = null;
+
 
                                 int listIndex = 1;
                                 if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
@@ -718,6 +719,47 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 st.setMiniprogramAppid(sysConfig.getAppId());
                                 st.setMiniprogramPage(sortLiveLink);
                                 break;
+                            // 注册
+                            case "13":
+                                try{
+
+                                    linkByMiniApp = createGroupRegisteredLinkByMiniApp(st, qwGroupChat.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
+                                            qwUser.getId(), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), config, groupUser.getChatId());
+
+//                                    String luckyjson = configService.selectConfigByKey("luckyBag.config");
+//                                    Map<String, Object> luckyBagConfig = JSON.parseObject(luckyjson, Map.class);
+//                                    miniAppId = String.valueOf(luckyBagConfig.get("appId"));
+
+
+                                   if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
+                                        Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
+                                        if (integerListMap != null) {
+                                            int listIndexNum = 1;
+                                            List<CompanyMiniapp> miniapps = integerListMap.get(listIndexNum);
+                                            if (miniapps != null && !miniapps.isEmpty()) {
+                                                CompanyMiniapp companyMiniapp = miniapps.get(0);
+                                                if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                                                    miniAppId = companyMiniapp.getAppId();
+                                                }
+                                            }
+                                        }
+                                    }
+                                    if (!StringUtil.strIsNullOrEmpty(miniAppId) && !StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
+                                        miniAppId = qwCompany.getMiniAppId();
+                                    }
+                                    if (!StringUtil.strIsNullOrEmpty(miniAppId)) {
+                                        st.setMiniprogramAppid(miniAppId);
+                                    } else {
+                                        log.error("公司的小程序id为空:采用了前端传的固定值" + sopLogs.getSopId());
+                                    }
+
+                                    st.setMiniprogramTitle("点击注册");
+                                    st.setMiniprogramPage(linkByMiniApp);
+
+                                }catch (Exception e) {
+                                    log.error("注册链接发送异常:"+e.getMessage());
+                                }
+                                break;
                             case "14":
 
                                 linkByMiniApp = createActivityLinkByMiniApp(st,sopLogs, qwGroupChat.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
@@ -814,6 +856,8 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             replaceContent(st.getContentType(), st.getLinkTitle(), st::setLinkTitle, words); // 替换 linkTitle
                             replaceContent(st.getContentType(), st.getLinkDescribe(), st::setLinkDescribe, words); // 替换 linkTitle
                         }
+                        String miniAppId = null;
+                        String companyId = String.valueOf(qwUser.getCompanyId()).trim();
                         switch (st.getContentType()) {
                             //文字和短链一起
                             case "1":
@@ -860,7 +904,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
                                         qwUser.getId(), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), null, config, groupChat.getChatId());
 
-                                String miniAppId = null;
+
 
                                 int listIndex = 1;
                                 if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
@@ -921,8 +965,38 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 st.setMiniprogramAppid(sysConfig.getAppId());
                                 st.setMiniprogramPage(sortLiveLink);
                                 break;
+                            case "13":
+
+                                linkByMiniApp = createGroupRegisteredLinkByMiniApp(st, qwUser.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
+                                        qwUser.getId(), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), config, groupChat.getChatId());
+//                                String luckyjson = configService.selectConfigByKey("luckyBag.config");
+//                                Map<String, Object> luckyBagConfig = JSON.parseObject(luckyjson, Map.class);
+//                                miniAppId = String.valueOf(luckyBagConfig.get("appId"));
+                               if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
+                                    Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
+                                    if (integerListMap != null) {
+                                        int listIndexNum = 1;
+                                        List<CompanyMiniapp> miniapps = integerListMap.get(listIndexNum);
+                                        if (miniapps != null && !miniapps.isEmpty()) {
+                                            CompanyMiniapp companyMiniapp = miniapps.get(0);
+                                            if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                                                miniAppId = companyMiniapp.getAppId();
+                                            }
+                                        }
+                                    }
+                                }
+                                if (StringUtil.strIsNullOrEmpty(miniAppId) && !StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
+                                    miniAppId = qwCompany.getMiniAppId();
+                                }
+                                if (!StringUtil.strIsNullOrEmpty(miniAppId)) {
+                                    st.setMiniprogramAppid(miniAppId);
+                                } else {
+                                    log.error("公司的小程序id为空:采用了前端传的固定值" + sopLogs.getSopId());
+                                }
+                                st.setMiniprogramTitle("点击注册");
+                                st.setMiniprogramPage(linkByMiniApp);
+                                break;
                             case "14":
-                                String companyId = String.valueOf(qwUser.getCompanyId()).trim();
                                 linkByMiniApp = createActivityLinkByMiniApp(st,sopLogs, qwUser.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
                                         String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(),null, config, groupChat.getChatId());
                                 miniAppId = null;
@@ -1063,6 +1137,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                         replaceContent(st.getContentType(), st.getLinkDescribe(), st::setLinkDescribe, words); // 替换 linkTitle
                     }
 
+                    String miniAppId = null;
                     switch (st.getContentType()){
                         //文字和短链一起
                         case "1":
@@ -1111,7 +1186,6 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), createTime, param.getCourseId(), param.getVideoId(),
                                     Long.valueOf(qwUserId), companyUserId, companyId, item.getExternalId(), config, null);
 
-                            String miniAppId = null;
 
                             int effectiveGrade = (item.getGrade() == null) ? 5 : item.getGrade();
                             int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
@@ -1192,6 +1266,56 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             st.setMiniprogramAppid(sysConfig.getAppId());
                             st.setMiniprogramPage(sortLiveLink);
                             break;
+                        case "13":
+
+                            if (sopLogs.getFsUserId() != null && !Objects.equals(0L, sopLogs.getFsUserId())) {
+                                sopLogs.setSendStatus(5L);
+                                sopLogs.setReceivingStatus(0L);
+                                sopLogs.setRemark("已经注册过的客户不发送");
+                            }
+
+                            linkByMiniApp = createRegisteredLinkByMiniApp(st, param.getCorpId(), createTime, param.getCourseId(), param.getVideoId(),
+                                    Long.valueOf(qwUserId), companyUserId, companyId, item.getExternalId(), config);
+//                            String luckyjson1 = configService.selectConfigByKey("luckyBag.config");
+//                            Map<String, Object> luckyBagConfig1 = JSON.parseObject(luckyjson1, Map.class);
+//                            miniAppId = String.valueOf(luckyBagConfig1.get("appId"));
+
+                            if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
+                                Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
+                                if (integerListMap != null) {
+                                    int effectiveGradeNum = (item.getGrade() == null) ? 5 : item.getGrade();
+                                    int listIndexNum = (effectiveGradeNum == 1 || effectiveGradeNum == 2) ? 0 : 1;
+
+                                    //评级是6 S级,则走A类小程序
+                                    if (effectiveGradeNum==6){
+                                        listIndexNum=2;
+                                    }
+
+                                    List<CompanyMiniapp> miniapps = integerListMap.get(listIndexNum);
+
+                                    if (miniapps != null && !miniapps.isEmpty()) {
+                                        CompanyMiniapp companyMiniapp = miniapps.get(0);
+                                        if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                                            miniAppId = companyMiniapp.getAppId();
+                                        }
+                                    }
+                                }
+                            }
+
+                            if (StringUtil.strIsNullOrEmpty(miniAppId) && !StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())) {
+                                miniAppId = qwCompany.getMiniAppId();
+                            }
+
+                            if (!StringUtil.strIsNullOrEmpty(miniAppId)) {
+                                st.setMiniprogramAppid(miniAppId);
+                            } else {
+                                log.error("公司的小程序id为空:采用了前端传的固定值" + sopLogs.getSopId());
+                            }
+
+                            st.setMiniprogramTitle("点击注册");
+
+                            st.setMiniprogramPage(linkByMiniApp);
+                            break;
                         case "14":
                             LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(st.getLuckyBagId());
                             if(ObjectUtil.isNotEmpty(luckyBag)&&luckyBag.getDataStatus().equals("0")){
@@ -2384,4 +2508,64 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         return record;
     }
 
+    private String createGroupRegisteredLinkByMiniApp(QwSopCourseFinishTempSetting.Setting setting, String corpId, Date sendTime,
+                                                      Integer courseId, Integer videoId, Long qwUserId,
+                                                      String companyUserId, String companyId, CourseConfig config, String chatId) {
+
+        FsCourseLink link = createFsCourseLink(corpId, sendTime, courseId, videoId, qwUserId,
+                companyUserId, companyId, null, 3, chatId);
+
+
+
+        FsCourseRealLink courseMap = new FsCourseRealLink();
+        BeanUtils.copyProperties(link, courseMap);
+
+        String realLinkFull = registeredRealLink + JSON.toJSONString(courseMap);
+        link.setRealLink(realLinkFull);
+
+        Date updateTime = createUpdateTime(setting, sendTime, config);
+
+        link.setUpdateTime(updateTime);
+        //存短链-
+        fsCourseLinkMapper.insertFsCourseLink(link);
+        return link.getRealLink();
+    }
+
+    private String createRegisteredLinkByMiniApp(QwSopCourseFinishTempSetting.Setting setting, String corpId, Date sendTime,
+                                                 Integer courseId, Integer videoId, Long qwUserId,
+                                                 String companyUserId, String companyId, Long externalId, CourseConfig config) {
+
+        FsCourseLink link = new FsCourseLink();
+        link.setCompanyId(Long.parseLong(companyId));
+        link.setQwUserId(qwUserId);
+        link.setCompanyUserId(Long.parseLong(companyUserId));
+        link.setVideoId(videoId.longValue());
+        link.setCorpId(corpId);
+        link.setCourseId(courseId.longValue());
+        link.setQwExternalId(externalId);
+        link.setLinkType(3); //小程序
+        link.setUNo(UUID.randomUUID().toString());
+        String randomString = generateRandomStringWithLock();
+        if (StringUtil.strIsNullOrEmpty(randomString)) {
+            link.setLink(UUID.randomUUID().toString().replace("-", ""));
+        } else {
+            link.setLink(randomString);
+        }
+        link.setCreateTime(sendTime);;
+        Date updateTime = createUpdateTime(setting, sendTime, config);
+        link.setUpdateTime(updateTime);
+
+
+        FsCourseRealLink courseMap = new FsCourseRealLink();
+        BeanUtils.copyProperties(link, courseMap);
+
+        String realLinkFull = registeredRealLink + JSON.toJSONString(courseMap);
+        link.setRealLink(realLinkFull);
+
+        log.error("存入fs_course_link:" + registeredRealLink );
+        //存短链-
+        fsCourseLinkMapper.insertFsCourseLink(link);
+        return link.getRealLink();
+    }
+
 }

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

@@ -64,7 +64,7 @@ fs :
   h5CommonApi: http://172.17.0.10:8010
   jwt:
     # 加密秘钥
-    secret: f4k2y52034348t86b67cde581c0f9eb5
+    secret: f4k2y52034348t86b67cde581c0f90b5
     # token有效时长,7天,单位秒
     expire: 31536000
     header: AppToken

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

@@ -78,8 +78,8 @@ nuonuo:
 
   # 存储捅配置
 tencent_cloud_config:
-  secret_id: AKIDraAYkjVIvLch4ReiaIr0FTiyGPOGyUr2
-  secret_key: 3tcDi6QccQ971xoU0KRhpkSyIOIzSikZ
+  secret_id: AKIDLl1tguyrZ6QddTCi2BLJ4e3OXVIuJVVK
+  secret_key: g9R6kLrMp8EDzXszylLispiQxHRN6cw5
   bucket: myhk-1323137866
   app_id: 1323137866
   region: ap-chongqing

+ 13 - 7
fs-service/src/main/resources/application-config-zlwh.yml

@@ -58,19 +58,19 @@ wx:
         aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
   miniapp:
     configs:
-      - appid: wx11a2ce7c2bbc4521   #倍力优会员商城
-        secret: d680dc8ff20258b158c9355f8b7769ae
+      - appid: wxdf14438a85585494
+        secret: 9e283c66c769ce6bda935f784db53ce4
         token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
-      - appid: wx301ab2fad04c658a   #倍力优看课小程序
-        secret: 35018f10929b84c8c4a225de253bbcc6
+      - appid: wxdf14438a85585494
+        secret: 9e283c66c769ce6bda935f784db53ce4
         token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
 
   pay:
-    appId: wx11a2ce7c2bbc4521 #微信公众号或者小程序等的appid
+    appId: wxdf14438a85585494 #微信公众号或者小程序等的appid
     mchId: 1703311381 #微信支付商户号
     mchKey: FotTIbIzn4AisMW7de712LJQIazSqqAl #微信支付商户密钥
     v3Key: y5Eo99q93qzdQRAs6E2BDKIF7f3EnS3G
@@ -85,8 +85,8 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wx568ea6b70350c585 # 第一个公众号的appid  倍力优
-        secret: b14343e22871b1c207df5d3321e826b4 # 公众号的appsecret
+      - appId: wxdf14438a85585494 #
+        secret: 9e283c66c769ce6bda935f784db53ce4 #
         token: PPKOdAlCoMO # 接口配置里的Token值
         aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
 jpush:
@@ -128,6 +128,12 @@ watch:
 
 fs:
   commonApi: http://172.21.76.167:8010
+  jwt:
+    # 加密秘钥
+    secret: e10tdr3949fa43abbe56e057f2fd883e
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16

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

@@ -45,10 +45,9 @@ spring:
                 # 从库数据源
                 slave:
                     # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
+                    url: jdbc:mysql://172.27.0.38:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: myhk888777666.
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量

+ 4 - 5
fs-service/src/main/resources/application-druid-zlwh.yml

@@ -44,11 +44,10 @@ spring:
                   password: Ylrztek250218!3@.
                 # 从库数据源
                 slave:
-                    # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
+                    master:
+                    url: jdbc:mysql://192.168.0.7:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+                    username: root
+                    password: Ylrztek250218!3@.
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量

+ 5 - 1
fs-service/src/main/resources/mapper/his/FsAppVersionMapper.xml

@@ -18,10 +18,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="baiduUrl"    column="baidu_url"    />
         <result property="h5Url"    column="h5_url"    />
         <result property="wgtUrl"    column="wgt_url"    />
+        <result property="isHotForce"    column="is_hot_force"    />
     </resultMap>
 
     <sql id="selectFsAppVersionVo">
-        select version_id,baidu_url,update_config, version_name, version_code, note, url, type, is_force, create_time, app_type,h5_url,wgt_url from fs_app_version
+        select version_id,baidu_url,update_config, version_name, version_code, note, url, type, is_force, create_time, app_type,h5_url,wgt_url,is_hot_force from fs_app_version
     </sql>
 
     <select id="selectFsAppVersionList" parameterType="FsAppVersion" resultMap="FsAppVersionResult">
@@ -59,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="baiduUrl != null">baidu_url,</if>
             <if test="h5Url != null and h5Url !=''">h5_url,</if>
             <if test="wgtUrl != null and wgtUrl !=''">wgt_url,</if>
+            <if test="isHotForce != null">is_hot_force,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="versionName != null">#{versionName},</if>
@@ -73,6 +75,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="baiduUrl != null">#{baiduUrl},</if>
             <if test="h5Url != null and h5Url !=''">#{h5Url},</if>
             <if test="wgtUrl != null and wgtUrl !=''">#{wgtUrl},</if>
+            <if test="isHotForce != null">#{isHotForce},</if>
          </trim>
     </insert>
 
@@ -91,6 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="baiduUrl != null">baidu_url = #{baiduUrl},</if>
             <if test="h5Url != null and h5Url !=''">h5_url = #{h5Url},</if>
             <if test="wgtUrl != null and wgtUrl !=''">wgt_url = #{wgtUrl},</if>
+            <if test="isHotForce != null">is_hot_force = #{isHotForce},</if>
         </trim>
         where version_id = #{versionId}
     </update>

+ 8 - 0
fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml

@@ -847,6 +847,14 @@
             #{log.id}
         </foreach>
     </update>
+    <update id="updateGroupSopStatus">
+        update qw_sop_logs
+        set send_status = 5,
+        remark = '群聊发送已被禁止'
+        where
+        type = 1 and
+        send_status = 3
+    </update>
 
     <select id="selectByQwUserId" resultType="com.fs.sop.domain.QwSopLogs">
         select ql.*,

+ 2 - 1
fs-service/src/main/resources/mapper/sop/QwSopTempRulesMapper.xml

@@ -17,10 +17,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="aiTouch"    column="ai_touch"    />
         <result property="addTag"    column="add_tag"    />
         <result property="delTag"    column="del_tag"    />
+        <result property="openAppCourse"    column="open_app_course"    />
     </resultMap>
 
     <sql id="selectQwSopTempRulesVo">
-        select id, temp_id, name, day_num,add_tag,del_tag, time, content_type, course_type, course_id, video_id, ai_touch from qw_sop_temp_rules
+        select id, temp_id, name, day_num,add_tag,del_tag, time, content_type, course_type, course_id, video_id, ai_touch,open_app_course from qw_sop_temp_rules
     </sql>
 
     <select id="selectQwSopTempRulesList" parameterType="QwSopTempRules" resultMap="QwSopTempRulesResult">

+ 28 - 29
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -13,10 +13,10 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.service.ISmsService;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxOpenProperties;
-import com.fs.course.domain.FsCoursePlaySourceConfig;
-import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserNewTask;
@@ -72,9 +72,6 @@ public class AppLoginController extends AppBaseController{
 
     @Autowired
     private ISmsService smsService;
-    @Autowired
-    private IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
-
     @ApiOperation("注册app用户")
     @PostMapping("/register")
     @RepeatSubmit
@@ -243,28 +240,8 @@ public class AppLoginController extends AppBaseController{
                 return R.error("code不存在");
             }
 
-            String appId = param.getAppId();
-            String appSecret = "";
-            if (StringUtils.isBlank(appId)) {
-                List<FsCoursePlaySourceConfig> list = fsCoursePlaySourceConfigService.list(new QueryWrapper<FsCoursePlaySourceConfig>().eq("name", "app").eq("is_del", 0));
-                if(!list.isEmpty()){
-                    FsCoursePlaySourceConfig fsCoursePlaySourceConfig = list.get(0);
-                    appId = fsCoursePlaySourceConfig.getAppid();
-                    appSecret =  fsCoursePlaySourceConfig.getSecret();
-                }
-            } else {
-                FsCoursePlaySourceConfig fsCoursePlaySourceConfig = fsCoursePlaySourceConfigService.getOne(new QueryWrapper<FsCoursePlaySourceConfig>().eq("appid", appId).eq("is_del", 0));
-                if(fsCoursePlaySourceConfig != null){
-                    appId = fsCoursePlaySourceConfig.getAppid();
-                    appSecret =  fsCoursePlaySourceConfig.getSecret();
-                }
-            }
-            if (StringUtils.isBlank(appId) || StringUtils.isBlank(appSecret)) {
-                appId = openProperties.getAppId();
-                appSecret = openProperties.getSecret();
-            }
-            logger.info("zyp app微信登录,param:{},输出appid,{},secret:{}", param, appId, appSecret);
-            Map result = WxUtil.getAccessToken(param.getCode(),appId,appSecret);
+            logger.info("zyp app微信登录,param:{},输出appid,{},secret:{}", param, openProperties.getAppId(), openProperties.getSecret());
+            Map result = WxUtil.getAccessToken(param.getCode(), openProperties.getAppId(), openProperties.getSecret());
             String accessToken = result.get("access_token").toString();
             String unionid = result.get("unionid").toString();
 
@@ -290,23 +267,27 @@ public class AppLoginController extends AppBaseController{
                 }
                 user.setUnionId(unionid);
                 // 新用户 - 添加 appId
-                user.setAppId(appId);
+                user.setAppId(openProperties.getAppId());
                 user.setCreateTime(new Date());
                 user.setStatus(1);
                 if (StringUtils.isNotEmpty(param.getJpushId())) {
                     user.setJpushId(param.getJpushId());
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
                 userService.insertFsUser(user);
                 map.put("isNew", true);
                 map.put("unionid",unionid);
                 return R.ok(map);
             } else {
                 // 老用户 - 检查并添加appId(不重复添加)
-                String updatedAppId = addAppIdIfNotExists(user.getAppId(), appId);
+                String updatedAppId = addAppIdIfNotExists(user.getAppId(), openProperties.getAppId());
                 if (!updatedAppId.equals(user.getAppId())) {
                     FsUser userMap = new FsUser();
                     userMap.setUserId(user.getUserId());
                     userMap.setAppId(updatedAppId);
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    userMap.setLastIp(ipAddr);
                     userService.updateFsUser(userMap);
                 }
 
@@ -413,6 +394,8 @@ public class AppLoginController extends AppBaseController{
             userMap.setNickName("苹果用户" + param.getPhone().substring(param.getPhone().length() - 4));
         }
         userMap.setAppleKey(param.getAppleKey());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         if (userService.updateFsUser(userMap)>0){
             return generateTokenAndReturn(userMap);
         }
@@ -490,6 +473,8 @@ public class AppLoginController extends AppBaseController{
                 user.setPhone(param.getPhone());
                 user.setLoginDevice(param.getLoginDevice());
                 user.setSource(param.getSource());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
                 userService.updateFsUser(user);
                 return generateTokenAndReturn(user);
             }
@@ -510,6 +495,8 @@ public class AppLoginController extends AppBaseController{
             keepUser.setSource(param.getSource());
             keepUser.setUnionId(user.getUnionId());
             keepUser.setPhone(param.getPhone());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            keepUser.setLastIp(ipAddr);
             if (userService.updateFsUser(keepUser)>0){
                 userService.realDeleteFsUserByUserId(deleteUser.getUserId());
                 return generateTokenAndReturn(keepUser);
@@ -524,6 +511,8 @@ public class AppLoginController extends AppBaseController{
         userMap.setSource(param.getSource());
         userMap.setUserId(user.getUserId());
         userMap.setPhone(param.getPhone());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         if (userService.updateFsUser(userMap)>0){
             return generateTokenAndReturn(user);
         }
@@ -560,6 +549,8 @@ public class AppLoginController extends AppBaseController{
                         user.setLoginDevice(param.getLoginDevice());
                         user.setSource(param.getSource());
                         user.setUnionId(unionid);
+                        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                        user.setLastIp(ipAddr);
                         userService.updateFsUser(user);
                         return generateTokenAndReturn(user);
                     }
@@ -579,6 +570,8 @@ public class AppLoginController extends AppBaseController{
                     keepUser.setNickName(nickname);
                     keepUser.setAvatar(avatar);
                     keepUser.setSex(sex);
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    keepUser.setLastIp(ipAddr);
                     if (userService.updateFsUser(keepUser)>0){
                         userService.realDeleteFsUserByUserId(deleteUser.getUserId());
                         return generateTokenAndReturn(keepUser);
@@ -594,6 +587,8 @@ public class AppLoginController extends AppBaseController{
                     user.setSex(sex);
                     user.setUnionId(unionid);
                     user.setAppOpenId(openid);
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    user.setLastIp(ipAddr);
                     if (userService.updateFsUser(user)>0){
                         return generateTokenAndReturn(user);
                     }
@@ -616,6 +611,8 @@ public class AppLoginController extends AppBaseController{
         if (StringUtils.isNotEmpty(user.getAppOpenId())) {
             userMap.setAppOpenId(user.getAppOpenId());
         }
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         userService.updateFsUser(userMap);
     }
 
@@ -807,6 +804,8 @@ public class AppLoginController extends AppBaseController{
                     FsUser fsUser = new FsUser();
                     fsUser.setUserId(user.getUserId());
                     fsUser.setPhone(encryptPhone(param.getPhone()));
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    fsUser.setLastIp(ipAddr);
                     userMapper.updateFsUser(fsUser);
                     logger.info("zyp \n【手机加密】:{}",encryptPhone(param.getPhone()));
                 }

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

@@ -351,7 +351,7 @@ public class UserController extends  AppBaseController {
         String userId = getUserId();
         FsUser fsUser = new FsUser();
         fsUser.setUserId(Long.parseLong(userId));
-//        fsUser.setHistoryApp(historyApp);
+        fsUser.setHistoryApp(historyApp);
         if (userService.updateFsUser(fsUser)>0) {
             return R.ok();
         } else {

+ 10 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -9,6 +9,8 @@ import com.fs.app.param.FsUserLoginByMpParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyService;
@@ -194,6 +196,8 @@ public class WxH5MpController {
             if (!updatedAppId.equals(user.getAppId())) {
                 userUpdate.setAppId(updatedAppId);
             }
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            userUpdate.setLastIp(ipAddr);
             userService.updateFsUser(userUpdate);
             return userUpdate;
         } else {
@@ -210,6 +214,8 @@ public class WxH5MpController {
 //            newUser.setStatus(company != null && company.getFsUserIsDefaultBlack() == 1 ? 0 : 1);
             // 新用户 - 添加 appId
             newUser.setAppId(param.getAppId());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            newUser.setLastIp(ipAddr);
             userService.insertFsUser(newUser);
 
             return newUser;
@@ -233,6 +239,8 @@ public class WxH5MpController {
             if (!updatedAppId.equals(user.getAppId())) {
                 userUpdate.setAppId(updatedAppId);
             }
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            userUpdate.setLastIp(ipAddr);
             userService.updateFsUser(userUpdate);
             return userUpdate;
         } else {
@@ -248,6 +256,8 @@ public class WxH5MpController {
             newUser.setCreateTime(new Date());
             // 新用户 - 添加 appId
             newUser.setAppId(param.getAppId());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            newUser.setLastIp(ipAddr);
             userService.insertFsUser(newUser);
             return newUser;
         }

+ 18 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -16,6 +16,8 @@ import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.param.LoginParam;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxMpConfiguration;
@@ -145,6 +147,8 @@ public class WxUserController extends AppBaseController{
                     if(session.getUnionid()!=null){
                         userMap.setUnionId(session.getUnionid());
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    userMap.setLastIp(ipAddr);
                     userService.updateFsUser(userMap);
                 }
                 else{
@@ -162,6 +166,8 @@ public class WxUserController extends AppBaseController{
                     if(session.getUnionid()!=null){
                         user.setUnionId(session.getUnionid());
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    user.setLastIp(ipAddr);
                     userService.insertFsUser(user);
                 }
             }
@@ -183,6 +189,8 @@ public class WxUserController extends AppBaseController{
                 if (!updatedAppId.equals(user.getAppId())) {
                     userMap.setAppId(updatedAppId);
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                userMap.setLastIp(ipAddr);
                 userService.updateFsUser(userMap);
             }
             String token = jwtUtils.generateToken(user.getUserId());
@@ -264,6 +272,8 @@ public class WxUserController extends AppBaseController{
                     if(session.getUnionid()!=null){
                         userMap.setUnionId(session.getUnionid());
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    userMap.setLastIp(ipAddr);
                     userService.updateFsUser(userMap);
                 }
                 else{
@@ -281,6 +291,8 @@ public class WxUserController extends AppBaseController{
                     if(session.getUnionid()!=null){
                         user.setUnionId(session.getUnionid());
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    user.setLastIp(ipAddr);
                     userService.insertFsUser(user);
                 }
             }
@@ -302,6 +314,8 @@ public class WxUserController extends AppBaseController{
                 if (!updatedAppId.equals(user.getAppId())) {
                     userMap.setAppId(updatedAppId);
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                userMap.setLastIp(ipAddr);
                 userService.updateFsUser(userMap);
             }
             String token = jwtUtils.generateToken(user.getUserId());
@@ -346,6 +360,8 @@ public class WxUserController extends AppBaseController{
                 userMap.setAvatar(wxMpUser.getHeadImgUrl());
                 userMap.setMpOpenId(wxMpUser.getOpenid());
                 userMap.setUpdateTime(new DateTime());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                userMap.setLastIp(ipAddr);
                 userService.updateFsUser(userMap);
             }
             else{
@@ -358,6 +374,8 @@ public class WxUserController extends AppBaseController{
                 user.setMpOpenId(wxMpUser.getOpenid());
                 user.setUnionId(wxMpUser.getUnionId());
                 user.setCreateTime(new Date());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
                 userService.insertFsUser(user);
             }
             String token = jwtUtils.generateToken(user.getUserId());

+ 5 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserLoginController.java

@@ -11,6 +11,7 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.IpUtil;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyDeptService;
@@ -196,6 +197,8 @@ public class CourseFsUserLoginController extends AppBaseController {
         if (param.getAuthType() == 1 && phoneNoInfo != null) {
             user.setPhone(phoneNoInfo.getPhoneNumber());
         }
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        user.setLastIp(ipAddr);
         userService.insertFsUser(user);
         if((companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
                 && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1){
@@ -216,6 +219,8 @@ public class CourseFsUserLoginController extends AppBaseController {
         if (param.getAuthType() == 1 && phoneNoInfo != null) {
             userMap.setPhone(phoneNoInfo.getPhoneNumber());
         }
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         userService.updateFsUser(userMap);
         return userMap;
     }

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseMpLoginController.java

@@ -6,6 +6,8 @@ import com.fs.app.param.FsUserLoginByMpParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.course.mapper.FsCourseSopLogsMapper;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.his.domain.FsUser;
@@ -91,6 +93,8 @@ public class CourseMpLoginController {
         userMap.setAvatar(wxMpUser.getHeadImgUrl());
         userMap.setMpOpenId(wxMpUser.getOpenid());
         userMap.setUpdateTime(new DateTime());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         userService.updateFsUser(userMap);
       }
       else{
@@ -103,6 +107,8 @@ public class CourseMpLoginController {
         user.setMpOpenId(wxMpUser.getOpenid());
         user.setUnionId(wxMpUser.getUnionId());
         user.setCreateTime(new Date());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        user.setLastIp(ipAddr);
         userService.insertFsUser(user);
       }
       System.out.println("user:id:"+user.getUserId());

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwLoginController.java

@@ -10,6 +10,8 @@ import com.fs.app.controller.AppBaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.param.LoginParam;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.course.config.CourseMaConfig;
 import com.fs.app.utils.JwtUtils;
@@ -144,6 +146,8 @@ public class CourseQwLoginController extends AppBaseController {
                 userMap.setMaOpenId(session.getOpenid());
 //                userMap.setCourseMaOpenId(session.getOpenid());
                 userMap.setUpdateTime(new DateTime());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                userMap.setLastIp(ipAddr);
                 userService.updateFsUser(userMap);
             }
             // 用户不存在时的创建逻辑
@@ -156,6 +160,8 @@ public class CourseQwLoginController extends AppBaseController {
 //                user.setCourseMaOpenId(session.getOpenid());
                 user.setUnionId(session.getUnionid());
                 user.setCreateTime(new Date());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
                 userService.insertFsUser(user);
                 isNewUser = true;
             }

+ 10 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/AppLoginScrmController.java

@@ -11,6 +11,8 @@ import com.fs.app.utils.WxUtil;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.hisStore.domain.FsUserScrm;
 import com.fs.hisStore.param.FsUserRegisterParam;
@@ -151,6 +153,8 @@ public class AppLoginScrmController extends AppBaseController {
                 if (StringUtils.isNotEmpty(param.getJpushId())) {
                     user.setJpushId(param.getJpushId());
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
                 userService.insertFsUser(user);
                 map.put("isNew", true);
                 map.put("unionid",unionid);
@@ -191,6 +195,8 @@ public class AppLoginScrmController extends AppBaseController {
         userMap = new FsUserScrm();
         userMap.setUserId(user.getUserId());
         userMap.setPhone(param.getPhone());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         if (userService.updateFsUser(userMap)>0){
             return generateTokenAndReturn(user);
         }
@@ -201,6 +207,8 @@ public class AppLoginScrmController extends AppBaseController {
         FsUserScrm userMap = new FsUserScrm();
         userMap.setUserId(user.getUserId());
         userMap.setJpushId(jpushId);
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         userService.updateFsUser(userMap);
     }
 
@@ -265,6 +273,8 @@ public class AppLoginScrmController extends AppBaseController {
         if (StringUtils.isNotEmpty(param.getJpushId())) {
             newUser.setJpushId(param.getJpushId());
         }
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        newUser.setLastIp(ipAddr);
         userService.insertFsUser(newUser);
         return newUser;
     }

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

@@ -9,6 +9,8 @@ import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyService;
@@ -176,6 +178,8 @@ public class WxCompanyUserScrmController extends AppBaseController {
         if (param.getAuthType() == 1 && phoneNoInfo != null) {
             user.setPhone(phoneNoInfo.getPhoneNumber());
         }
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        user.setLastIp(ipAddr);
         userService.insertFsUser(user);
 
         if((companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
@@ -197,7 +201,8 @@ public class WxCompanyUserScrmController extends AppBaseController {
         if (param.getAuthType() == 1 && phoneNoInfo != null) {
             userMap.setPhone(phoneNoInfo.getPhoneNumber());
         }
-
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
         userService.updateFsUser(userMap);
         return userMap;
     }

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/WxCompanyUserScrmControllerCopy.java

@@ -10,6 +10,8 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyDeptService;
@@ -149,6 +151,8 @@ public class WxCompanyUserScrmControllerCopy extends AppBaseController {
                         user.setCompanyId(param.getCompanyId());
                         user.setCompanyUserId(param.getCompanyUserId());
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    user.setLastIp(ipAddr);
 //                    redisCache.setCacheObject("");
                     userService.insertFsUser(user);
                 }
@@ -161,6 +165,8 @@ public class WxCompanyUserScrmControllerCopy extends AppBaseController {
                 if (StringUtils.isNotEmpty(session.getUnionid())) {
                     userMap.setUnionId(session.getUnionid());
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                userMap.setLastIp(ipAddr);
                 userService.updateFsUser(userMap);
             }
             log.info("保存成功的用户信息user: {}, 用户id: {}", user, user.getUserId());

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/WxH5MpScrmController.java

@@ -5,6 +5,8 @@ import com.fs.app.param.FsUserLoginByMpParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyService;
@@ -143,6 +145,8 @@ public class WxH5MpScrmController {
             userUpdate.setUpdateTime(new DateTime());
             userUpdate.setNickName(wxMpUser.getNickname());
             userUpdate.setAvatar(wxMpUser.getHeadImgUrl());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            userUpdate.setLastIp(ipAddr);
             userService.updateFsUser(userUpdate);
             return userUpdate;
         } else {
@@ -156,6 +160,8 @@ public class WxH5MpScrmController {
 //            newUser.setCompanyUserId(companyUser.getUserId());
             newUser.setUnionId(wxMpUser.getUnionId());
             newUser.setCreateTime(new Date());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            newUser.setLastIp(ipAddr);
             userService.insertFsUser(newUser);
 
             return newUser;

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/WxMpScrmController.java

@@ -5,6 +5,8 @@ import com.fs.app.param.FsUserLoginByMpParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.course.mapper.FsCourseSopLogsMapper;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.hisStore.service.IFsUserScrmService;
@@ -112,6 +114,8 @@ public class WxMpScrmController {
           userMap.setMpOpenId(wxMpUser.getOpenid());
           userMap.setUpdateTime(new DateTime());
           userMap.setNickname(wxMpUser.getNickname());
+          String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+          userMap.setLastIp(ipAddr);
           userService.updateFsUser(userMap);
         }
         else{
@@ -124,6 +128,8 @@ public class WxMpScrmController {
           user.setMpOpenId(wxMpUser.getOpenid());
           user.setUnionId(wxMpUser.getUnionId());
           user.setCreateTime(new Date());
+          String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+          user.setLastIp(ipAddr);
           userService.insertFsUser(user);
         }
         String token = jwtUtils.generateToken(user.getUserId());

+ 8 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/WxUserScrmController.java

@@ -14,6 +14,8 @@ import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxMpProperties;
 import com.fs.his.domain.FsUser;
@@ -333,6 +335,8 @@ public class WxUserScrmController extends AppBaseController {
                     if (!updatedAppId.equals(checkPhone.getAppId())) {
                         userMap.setAppId(updatedAppId);
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    userMap.setLastIp(ipAddr);
                     logger.info("=====用户======:{}",updatedAppId);
                     userService.updateFsUser(userMap);
                 }
@@ -350,6 +354,8 @@ public class WxUserScrmController extends AppBaseController {
                     if(session.getUnionid()!=null){
                         user.setUnionId(session.getUnionid());
                     }
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    user.setLastIp(ipAddr);
                     userService.insertFsUser(user);
                 }
             }
@@ -371,6 +377,8 @@ public class WxUserScrmController extends AppBaseController {
                 if (!updatedAppId.equals(user.getAppId())) {
                     userMap.setAppId(updatedAppId);
                 }
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                userMap.setLastIp(ipAddr);
                 userService.updateFsUser(userMap);
             }
             LoginMaWxParam loginMaWxParam = new LoginMaWxParam();

Некоторые файлы не были показаны из-за большого количества измененных файлов