Explorar o código

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

caoliqin hai 1 día
pai
achega
a1f8281766
Modificáronse 66 ficheiros con 1745 adicións e 159 borrados
  1. 13 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseTrainingCampController.java
  2. 10 0
      fs-admin/src/main/java/com/fs/his/task/Task.java
  3. 9 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java
  4. 8 0
      fs-admin/src/main/java/com/fs/qw/controller/QwPushCountController.java
  5. 8 0
      fs-admin/src/main/java/com/fs/qw/controller/QwSopController.java
  6. 3 1
      fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java
  7. 5 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysConfigController.java
  8. 9 3
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  9. 6 2
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseFinishTempParentController.java
  10. 3 1
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java
  11. 7 2
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  12. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java
  13. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwFriendWelcomeController.java
  14. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatController.java
  15. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java
  16. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java
  17. 14 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  18. 3 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwWorkTaskNewController.java
  19. 209 4
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  20. 19 0
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  21. 472 100
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  22. 15 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java
  23. 22 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  24. 88 0
      fs-qwhook/src/main/java/com/fs/app/controller/ApisCommonController.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. 3 0
      fs-service/src/main/java/com/fs/course/mapper/FsVideoResourceMapper.java
  28. 17 0
      fs-service/src/main/java/com/fs/course/param/FsCourseRedPacketLogParam.java
  29. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseTrainingCampService.java
  30. 3 0
      fs-service/src/main/java/com/fs/course/service/ITencentCloudCosService.java
  31. 5 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseTrainingCampServiceImpl.java
  32. 36 0
      fs-service/src/main/java/com/fs/course/service/impl/TencentCloudCosService.java
  33. 3 1
      fs-service/src/main/java/com/fs/his/mapper/FsDoctorMapper.java
  34. 0 1
      fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java
  35. 9 0
      fs-service/src/main/java/com/fs/his/vo/FsUserVO.java
  36. 6 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  37. 4 0
      fs-service/src/main/java/com/fs/qw/vo/QwSopCourseFinishTempSetting.java
  38. 6 0
      fs-service/src/main/java/com/fs/sop/domain/QwSopTemp.java
  39. 3 0
      fs-service/src/main/java/com/fs/sop/domain/QwSopTempRules.java
  40. 3 0
      fs-service/src/main/java/com/fs/sop/mapper/QwSopLogsMapper.java
  41. 4 0
      fs-service/src/main/java/com/fs/sop/service/IQwSopService.java
  42. 49 3
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopServiceImpl.java
  43. 20 3
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  44. 193 4
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  45. 4 4
      fs-service/src/main/resources/application-config-druid-bjzm-test.yml
  46. 4 4
      fs-service/src/main/resources/application-config-druid-bjzm.yml
  47. 103 0
      fs-service/src/main/resources/application-config-druid-mengniu.yml
  48. 2 2
      fs-service/src/main/resources/application-config-myhk.yml
  49. 13 7
      fs-service/src/main/resources/application-config-zlwh.yml
  50. 178 0
      fs-service/src/main/resources/application-druid-mengniu.yml
  51. 3 4
      fs-service/src/main/resources/application-druid-myhk.yml
  52. 8 0
      fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml
  53. 2 1
      fs-service/src/main/resources/mapper/sop/QwSopTempRulesMapper.xml
  54. 24 0
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  55. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  56. 10 0
      fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  57. 18 0
      fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java
  58. 5 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserLoginController.java
  59. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseMpLoginController.java
  60. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwLoginController.java
  61. 10 0
      fs-user-app/src/main/java/com/fs/app/controller/store/AppLoginScrmController.java
  62. 6 1
      fs-user-app/src/main/java/com/fs/app/controller/store/WxCompanyUserScrmController.java
  63. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxCompanyUserScrmControllerCopy.java
  64. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxH5MpScrmController.java
  65. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/store/WxMpScrmController.java
  66. 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    参数

+ 10 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -656,11 +656,21 @@ public class Task {
         tencentCloudCosService.videoTranscode();
     }
 
+    public void videoTranscodeById(String videoId) throws Exception {
+
+        tencentCloudCosService.videoTranscodeById(Long.parseLong(videoId));
+    }
+
     public void updateUrl() throws Exception {
 
         tencentCloudCosService.updateUrl();
     }
 
+    public void updateUrlById(String videoId) throws Exception {
+
+        tencentCloudCosService.updateUrlByVideoId(Long.parseLong(videoId));
+    }
+
     public void addPrescribeImg() throws Exception {
         List<Long> ids = fsPrescribeService.selectFsPrescribeByPrescribeIdByOrderType();
         for (Long id : ids) {

+ 9 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java

@@ -12,6 +12,7 @@ import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsUserService;
@@ -68,6 +69,9 @@ public class FsStoreAfterSalesScrmController extends BaseController
     @Value("${cloud_host.company_name}")
     private String signProjectName;
 
+    @Autowired
+    private CloudHostProper cloudHostProper;
+
     /**
      * 查询售后记录列表
      */
@@ -78,7 +82,11 @@ public class FsStoreAfterSalesScrmController extends BaseController
         startPage();
         List<FsStoreAfterSalesVO> list = fsStoreAfterSalesService.selectFsStoreAfterSalesListVO(fsStoreAfterSales);
         for (FsStoreAfterSalesVO vo : list){
-            vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
+            if (!"广州郑多燕".equals(cloudHostProper.getCompanyName())) {
+                vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
+            } else {
+                vo.setUserPhone(vo.getUserPhone());
+            }
         }
         return getDataTable(list);
     }

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

+ 19 - 0
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -11,8 +11,10 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.course.param.FsCourseLinkMiniParam;
 import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
 import com.fs.course.service.*;
 import com.fs.course.vo.FsUserCourseVideoQVO;
@@ -34,6 +36,8 @@ import com.fs.sop.mapper.SopUserLogsMapper;
 import com.fs.sop.service.*;
 import com.fs.sop.vo.QwSopLogsDoSendListTVO;
 import com.fs.store.service.IFsUserCourseCountService;
+import com.fs.system.service.ISysConfigService;
+import com.fs.voice.utils.StringUtil;
 import com.fs.wxwork.dto.WxWorkGetQrCodeDTO;
 import com.fs.wxwork.service.WxWorkService;
 import io.swagger.annotations.Api;
@@ -154,6 +158,21 @@ public class CommonController {
     @Autowired
     WxWorkService wxWorkService;
 
+    @Autowired
+    private ISysConfigService configService;
+
+    @GetMapping("/roomLinkAllow")
+    public R roomLinkAllow() {
+
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+
+        if (config != null && config.getRoomLinkAllow() != null && config.getRoomLinkAllow()) {
+            return R.error("创建群链接已禁止");
+        }
+        return R.ok();
+    }
+
     /**
      *
      */

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 472 - 100
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java


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

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.controller.BaseController;
@@ -22,6 +23,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 +63,8 @@ public class ApisFsUserCourseVideoController extends BaseController {
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private ConfigUtil configUtil;
 
 
     @ApiOperation("课程视频详情")
@@ -211,6 +215,17 @@ public class ApisFsUserCourseVideoController extends BaseController {
             return R.error("企业id不能为空");
         }
 
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+
+        if (config != null && config.getRoomLinkAllow() != null && config.getRoomLinkAllow()) {
+            return R.error("创建群链接已禁止");
+        }
+//        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);
     }

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

@@ -1,10 +1,12 @@
 package com.fs.app.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 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,9 +23,12 @@ 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;
+import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -53,6 +58,11 @@ public class FsUserCourseVideoController {
 
     @Autowired
     private IQwExternalContactService qwExternalContactService;
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    private ISysConfigService configService;
 
 
     @ApiOperation("课程视频详情")
@@ -119,6 +129,18 @@ public class FsUserCourseVideoController {
             return R.error("企业id不能为空");
         }
 
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+
+        if (config != null && config.getRoomLinkAllow() != null && config.getRoomLinkAllow()) {
+            return R.error("创建群链接已禁止");
+        }
+
+//        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);
+        }
+    }
+
     /**
      * 获取跳转微信小程序的链接地址
      */

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

+ 3 - 0
fs-service/src/main/java/com/fs/course/mapper/FsVideoResourceMapper.java

@@ -22,6 +22,9 @@ public interface FsVideoResourceMapper extends BaseMapper<FsVideoResource> {
     @Select("select * from fs_video_resource where line1 is not null and is_transcode = 0 and is_del = 0")
     List<FsVideoResource> selectVideoNotTranscode();
 
+    @Select("select * from fs_video_resource where video_url = #{videoUrl} and is_transcode = 0 and is_del = 0")
+    FsVideoResource selectVideoByVideoUrl(String videoUrl);
+
 
     @Select("select * from fs_video_resource where file_key = 'course/20251020/1760932918788.mp4'")
     List<FsVideoResource> selectVideoNotTranscodeTest();

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

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

@@ -12,8 +12,11 @@ public interface ITencentCloudCosService {
 
 //    byte[] getQcloudByte();
     R updateUrl();
+    R updateUrlByVideoId(Long videoId);
 
     R videoTranscode();
 
+    R videoTranscodeById(Long videoId);
+
 
 }

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

+ 36 - 0
fs-service/src/main/java/com/fs/course/service/impl/TencentCloudCosService.java

@@ -39,6 +39,7 @@ import java.util.*;
 public class TencentCloudCosService implements ITencentCloudCosService {
     private final COSClient cosClient;
     private final TencentProperties tencentProperties;
+    private final FsUserCourseVideoMapper fsUserCourseVideoMapper;
 
 
     @Override
@@ -202,6 +203,23 @@ public class TencentCloudCosService implements ITencentCloudCosService {
         }
     }
 
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public R updateUrlByVideoId(Long videoId) {
+        try {
+            FsUserCourseVideo courseVideo = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
+            if (courseVideo != null) {
+                FsVideoResource video = videoResourceMapper.selectVideoByVideoUrl(courseVideo.getVideoUrl());
+                if (video != null) {
+                    updateSingleVideo(video); // 将单个视频更新逻辑提取到方法
+                }
+            }
+            return R.ok();
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+        }
+    }
+
     // 为每个视频更新使用独立事务
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void updateSingleVideo(FsVideoResource video) {
@@ -275,6 +293,24 @@ public class TencentCloudCosService implements ITencentCloudCosService {
         return R.ok();
     }
 
+    @Override
+    public R videoTranscodeById(Long videoId) {
+        FsUserCourseVideo courseVideo = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
+        if (courseVideo != null) {
+            FsVideoResource video = videoResourceMapper.selectVideoByVideoUrl(courseVideo.getVideoUrl());
+            if (video != null) {
+                String inputPath = "/"+video.getFileKey();
+                String outputPath = "/"+replaceCourse(video.getFileKey());
+                submitTranscodeJob(inputPath,outputPath);
+                FsVideoResource videoMap = new FsVideoResource();
+                videoMap.setId(video.getId());
+                videoMap.setIsTranscode(1);
+                videoResourceMapper.updateById(videoMap);
+            }
+        }
+        return R.ok();
+    }
+
     private MpsClient createMpsClient() {
         Credential cred = new Credential(tencentProperties.secretId, tencentProperties.secretKey);
         HttpProfile httpProfile = new HttpProfile();

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

+ 6 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -639,7 +639,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         List<FsStoreOrderVO> list = fsStoreOrderMapper.selectFsStoreOrderListVO(param);
         for (FsStoreOrderVO vo : list) {
             if (StringUtils.isNotEmpty(vo.getUserPhone())){
-                String nickName = vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+                String nickName;
+                if (!"广州郑多燕".equals(cloudHostProper.getCompanyName())) {
+                    nickName = vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+                } else {
+                    nickName = vo.getUserPhone();
+                }
                 vo.setNickname(nickName);
             }
 

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

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

@@ -520,6 +520,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         }
         List<QwSopLogs> sopLogsList;
         if(param.getFilterMode() != null && param.getFilterMode() == 2 && param.getChatIds() != null && param.getChatIds().length > 0){
+
+            if (config.getRoomLinkAllow() != null && config.getRoomLinkAllow()) {
+                return R.error("创建群链接已禁止");
+            }
+
             List<QwGroupChat> groupList = qwGroupChatMapper.selectQwGroupChatByChatIds(param.getChatIds());
 
             Map<String, QwGroupChat> groupMap = PubFun.listToMapByGroupObject(groupList, QwGroupChat::getChatId);
@@ -614,6 +619,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 +670,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 +724,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 +861,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 +909,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 +970,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 +1142,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 +1191,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 +1271,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 +2513,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();
+    }
+
 }

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

@@ -15,8 +15,8 @@ logging:
 wx:
   miniapp:
     configs:
-      - appid: wxd70f99287830cb51   #云联融智
-        secret: 35fca481b59f5924bfb62253b5d0aa18 #北京卓美
+      - appid: wxcfd4cd6e2375e42f   #云联融智
+        secret: 8261ae10c82f009310d92d61c141ea7e #北京卓美
         token: cbnd7lJvkripVOpyTFAna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
@@ -74,8 +74,8 @@ nuonuo:
 
 # 存储捅配置
 tencent_cloud_config:
-  secret_id: AKIDraAYkjVIvLch4ReiaIr0FTiyGPOGyUr2
-  secret_key: 3tcDi6QccQ971xoU0KRhpkSyIOIzSikZ
+  secret_id: AKIDLl1tguyrZ6QddTCi2BLJ4e3OXVIuJVVK
+  secret_key: g9R6kLrMp8EDzXszylLispiQxHRN6cw5
   bucket: bjzmky-1323137866
   app_id: 1323137866
   region: ap-chongqing

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

@@ -10,8 +10,8 @@ logging:
 wx:
   miniapp:
     configs:
-      - appid: wxd70f99287830cb51   #云联融智
-        secret: 35fca481b59f5924bfb62253b5d0aa18 #北京卓美
+      - appid: wxcfd4cd6e2375e42f   #云联融智
+        secret: 8261ae10c82f009310d92d61c141ea7e #北京卓美
         token: cbnd7lJvkripVOpyTFAna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
@@ -69,8 +69,8 @@ nuonuo:
 
 # 存储捅配置
 tencent_cloud_config:
-  secret_id: AKIDraAYkjVIvLch4ReiaIr0FTiyGPOGyUr2
-  secret_key: 3tcDi6QccQ971xoU0KRhpkSyIOIzSikZ
+  secret_id: AKIDLl1tguyrZ6QddTCi2BLJ4e3OXVIuJVVK
+  secret_key: g9R6kLrMp8EDzXszylLispiQxHRN6cw5
   bucket: bjzmky-1323137866
   app_id: 1323137866
   region: ap-chongqing

+ 103 - 0
fs-service/src/main/resources/application-config-druid-mengniu.yml

@@ -0,0 +1,103 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx41   #
+        secret: 58910ae743005c396012b029c7def579
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+      - appid: wxe
+        secret: 928d2961c81610d8f64b019597212fcd
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb2a10
+    appConfigs:
+      - agentId: 100005
+        secret: ec7okROXJqkN
+        token: PPKOdAloMO
+        aesKey: PKvaxtpSvNGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId: wx73f89 #微信公众号或者小程序等的appid
+    mchId: 1611045 #微信支付商户号
+    mchKey: 8cab128997a3547c10898b877f38 #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://usepp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx0e0e0a27e97af833 # 第一个公众号的appid 舒康医药
+        secret: bc63323ab44a4ededd93a53e43a77c0e # 公众号的appsecret
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVcw03qZy6Wllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+  # 开放平台app微信授权配置
+  open:
+    app-id: wx9746858bdb5e0643
+    secret: 32dfaa2b2dcad9229935ff089c65d372
+aifabu:  #爱链接
+  appKey: 7b471be905ab17ef358c610dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+#  account: tcloud
+#  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://192.168.0.182:8010
+  h5CommonApi: http://192.168.0.182:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDraAYkjVIvLch4ReiaIr0FTiyGPOGyUr2
+  secret_key: 3tcDi6QccQ971xoU0KRhpkSyIOIzSikZ
+  bucket: mengniu-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: mengniu
+cloud_host:
+  company_name: 蒙牛
+  projectCode: MENGNIU
+  spaceName: mengniu-2114522511
+  volcengineUrl: https://mengniuvolcengine.ylrztop.com
+#看课授权时显示的头像
+headerImg:
+  imgUrl: https://mengniu-hw079058881.obs.cn-southwest-2.myhuaweicloud.com/fs/mengniu.png
+ipad:
+  ipadUrl: http://ipad
+  aiApi: http://49.
+  voiceApi:
+  commonApi:
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+

+ 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: wxa414d8c8929f7bb8 #
+        secret: 10572173433311fb6baacb7971a99ee0 #
         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

+ 178 - 0
fs-service/src/main/resources/application-druid-mengniu.yml

@@ -0,0 +1,178 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-mengniu,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 192.168.0.175
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrztek250218!3@.
+        # 连接超时时间
+        timeout: 20s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 100
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+        #        clickhouse:
+        #            type: com.alibaba.druid.pool.DruidDataSource
+        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+        #            url: jdbc:clickhouse://cc-2vc8zzo26w0l7m2l6.public.clickhouse.ads.aliyuncs.com/sop?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+        #            username: rt_2024
+        #            password: Yzx_19860213
+        #            initialSize: 10
+        #            maxActive: 100
+        #            minIdle: 10
+        #            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://192.168.0.251:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 从库数据源
+                slave:
+                    url: jdbc:mysql://192.168.0.251:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 200
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: false
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://192.168.0.251:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                read:
+                    url: jdbc:mysql://192.168.0.251:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 200
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: false
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+custom:
+    token: "1o62d3YxvdHd4LEU7sK"
+    encoding-aes-key: "UJfTQ5qKTKlegjkXzJzxeHlUKvq5GyFbERN1iU"
+    corp-id: "ww51717e2b71d3"
+    secret: "6ODAmw-8W4t6h9mdzHh2Z4Apwj8mnsyRnjEDZOHdA7k"
+    private-key-path: "privatekey.pem"
+    webhook-url: "https://your-server.com/wecom/archive"
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret: openIM123
+    userID: imAdmin
+    url: https://
+#是否使用新im
+im:
+    type: NONE
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: false
+
+enableRedPackAccount: 1

+ 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
                 # 最小连接池数量

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

+ 24 - 0
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -13,6 +13,8 @@ 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.his.config.FsSysConfig;
@@ -271,6 +273,8 @@ public class AppLoginController 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);
@@ -282,6 +286,8 @@ public class AppLoginController extends AppBaseController{
                     FsUser userMap = new FsUser();
                     userMap.setUserId(user.getUserId());
                     userMap.setAppId(updatedAppId);
+                    String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                    userMap.setLastIp(ipAddr);
                     userService.updateFsUser(userMap);
                 }
 
@@ -388,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);
         }
@@ -465,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);
             }
@@ -485,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);
@@ -499,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);
         }
@@ -535,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);
                     }
@@ -554,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);
@@ -569,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);
                     }
@@ -591,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);
     }
 
@@ -782,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

@@ -11,6 +11,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;
@@ -145,6 +147,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);
             }
             // 用户不存在时的创建逻辑
@@ -157,6 +161,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();

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio