zyp 2 ヶ月 前
コミット
8a3d2077ef
89 ファイル変更1080 行追加484 行削除
  1. 3 3
      fs-admin/src/main/java/com/fs/company/controller/CompanyController.java
  2. 3 2
      fs-admin/src/main/java/com/fs/company/controller/CompanyUserController.java
  3. 1 1
      fs-admin/src/main/java/com/fs/core/config/DruidConfig.java
  4. 1 1
      fs-admin/src/main/java/com/fs/course/controller/FsCourseTrafficLogController.java
  5. 1 1
      fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java
  6. 1 1
      fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java
  7. 4 4
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoController.java
  8. 2 2
      fs-admin/src/main/java/com/fs/course/controller/FsUserVideoController.java
  9. 1 1
      fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java
  10. 1 1
      fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java
  11. 1 1
      fs-admin/src/main/java/com/fs/store/controller/FsStoreProductController.java
  12. 1 1
      fs-admin/src/main/java/com/fs/store/controller/FsStoreProductPackageController.java
  13. 1 1
      fs-admin/src/main/java/com/fs/store/controller/FsTestReportController.java
  14. 1 1
      fs-admin/src/main/java/com/fs/store/controller/FsUserController.java
  15. 16 12
      fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java
  16. 13 13
      fs-admin/src/main/java/com/fs/web/controller/system/SysProfileController.java
  17. 17 0
      fs-common/src/main/java/com/fs/common/utils/PatternUtils.java
  18. 4 4
      fs-common/src/main/java/com/fs/common/utils/date/DateUtil.java
  19. 11 11
      fs-common/src/main/java/com/fs/common/utils/spring/SpringUtils.java
  20. 2 0
      fs-company-app/src/main/java/com/fs/app/annotation/Login.java
  21. 5 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  22. 123 56
      fs-company-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java
  23. 3 3
      fs-company-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  24. 11 6
      fs-company-app/src/main/java/com/fs/app/interceptor/AuthorizationInterceptor.java
  25. 7 7
      fs-company-app/src/main/java/com/fs/app/param/LoginMaWxParam.java
  26. 12 11
      fs-company/src/main/java/com/fs/company/controller/CompanyLoginController.java
  27. 17 18
      fs-company/src/main/java/com/fs/company/controller/CompanyProfileController.java
  28. 23 18
      fs-company/src/main/java/com/fs/company/controller/CompanyUserController.java
  29. 2 0
      fs-company/src/main/java/com/fs/company/controller/IndexStatisticsController.java
  30. 1 1
      fs-company/src/main/java/com/fs/core/config/DruidConfig.java
  31. 1 1
      fs-company/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java
  32. 11 11
      fs-company/src/main/java/com/fs/qw/QwExternalContactController.java
  33. 8 8
      fs-company/src/main/java/com/fs/qw/vo/QwExternalContactVO.java
  34. 9 0
      fs-company/src/main/java/com/fs/qw/vo/QwWatchLogAllStatisticsListVO.java
  35. 2 0
      fs-company/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java
  36. 0 6
      fs-company/src/main/java/com/fs/wxuser/CompanyWxUserController.java
  37. 2 0
      fs-service-system/src/main/java/com/fs/company/cache/ICompanyTagCacheService.java
  38. 1 1
      fs-service-system/src/main/java/com/fs/company/domain/CompanyRecharge.java
  39. 2 2
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  40. 7 7
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRoleServiceImpl.java
  41. 1 1
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  42. 1 1
      fs-service-system/src/main/java/com/fs/company/vo/CompanyRechargeVO.java
  43. 2 2
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java
  44. 2 2
      fs-service-system/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  45. 1 0
      fs-service-system/src/main/java/com/fs/course/param/BatchRedUpdate.java
  46. 7 6
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  47. 4 4
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java
  48. 26 10
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  49. 2 2
      fs-service-system/src/main/java/com/fs/course/service/impl/TencentCloudCosService.java
  50. 4 4
      fs-service-system/src/main/java/com/fs/course/vo/FsUserCourseVideoQVO.java
  51. 0 1
      fs-service-system/src/main/java/com/fs/course/vo/PeriodRedPacketVO.java
  52. 1 0
      fs-service-system/src/main/java/com/fs/course/vo/UpdateCourseTimeVo.java
  53. 4 1
      fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java
  54. 58 16
      fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java
  55. 7 7
      fs-service-system/src/main/java/com/fs/qw/domain/QwGroupChatUser.java
  56. 4 4
      fs-service-system/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  57. 8 8
      fs-service-system/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java
  58. 1 1
      fs-service-system/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  59. 3 3
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwJsApiServiceImpl.java
  60. 11 11
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  61. 3 3
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  62. 2 0
      fs-service-system/src/main/java/com/fs/qw/vo/GetQwRepeatDataVO.java
  63. 8 8
      fs-service-system/src/main/java/com/fs/qw/vo/QwExternalContactVO.java
  64. 2 1
      fs-service-system/src/main/java/com/fs/qw/vo/QwWatchLogAllStatisticsListVO.java
  65. 4 4
      fs-service-system/src/main/java/com/fs/qwApi/service/impl/QwApiServiceImpl.java
  66. 2 2
      fs-service-system/src/main/java/com/fs/sop/params/SendUserLogsInfoMsgParam.java
  67. 6 6
      fs-service-system/src/main/java/com/fs/sop/service/impl/CompanySopRoleServiceImpl.java
  68. 16 5
      fs-service-system/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  69. 55 55
      fs-service-system/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  70. 44 0
      fs-service-system/src/main/java/com/fs/store/domain/FsUserCompanyUser.java
  71. 1 1
      fs-service-system/src/main/java/com/fs/store/mapper/FsStoreProductAttrValueMapper.java
  72. 1 1
      fs-service-system/src/main/java/com/fs/store/mapper/FsStoreProductMapper.java
  73. 78 0
      fs-service-system/src/main/java/com/fs/store/mapper/FsUserCompanyUserMapper.java
  74. 6 0
      fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java
  75. 8 1
      fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java
  76. 61 0
      fs-service-system/src/main/java/com/fs/store/service/IFsUserCompanyUserService.java
  77. 5 0
      fs-service-system/src/main/java/com/fs/store/service/IFsUserCourseCountService.java
  78. 8 0
      fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java
  79. 3 3
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java
  80. 78 78
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  81. 1 1
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreProductServiceImpl.java
  82. 91 0
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCompanyUserServiceImpl.java
  83. 16 0
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java
  84. 69 11
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java
  85. 7 0
      fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java
  86. 1 1
      fs-service-system/src/main/java/com/fs/system/oss/HuaweiCloudStorageService.java
  87. 23 0
      fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java
  88. 1 1
      fs-user-app/src/main/java/com/fs/core/config/DruidConfig.java
  89. 1 1
      fs-user-app/src/main/resources/application.yml

+ 3 - 3
fs-admin/src/main/java/com/fs/company/controller/CompanyController.java

@@ -152,7 +152,7 @@ public class CompanyController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('company:company:remove')")
     @Log(title = "企业", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{companyIds}")
+	@DeleteMapping("/{companyIds}")
     public AjaxResult remove(@PathVariable Long[] companyIds)
     {
         return toAjax(companyService.deleteCompanyByIds(companyIds));
@@ -167,7 +167,7 @@ public class CompanyController extends BaseController
         return R.ok().put("data",list);
     }
 
-    //  @PreAuthorize("@ss.hasPermi('company:company:crmDayCountlist')")
+//  @PreAuthorize("@ss.hasPermi('company:company:crmDayCountlist')")
     @GetMapping("/crmDayCountlist")
     public TableDataInfo companyCrmDayCountList(CompanyParam param)
     {
@@ -183,7 +183,7 @@ public class CompanyController extends BaseController
     public AjaxResult resetPwd(@PathVariable Long companyId)
     {
         Company company=companyService.selectCompanyById(companyId);
-        return toAjax(userService.resetUserPwdByUserId(company.getUserId(),SecurityUtils.encryptPassword("123456")));
+        return toAjax(userService.resetUserPwdByUserId(company.getUserId(),SecurityUtils.encryptPassword("cq654321!!")));
     }
 
 //    @PreAuthorize("@ss.hasPermi('company:company:resetMoney')")

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

@@ -113,7 +113,7 @@ public class CompanyUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('company:companyUser:remove')")
     @Log(title = "企业员工信息", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{userIds}")
+	@DeleteMapping("/{userIds}")
     public AjaxResult remove(@PathVariable Long[] userIds)
     {
         return toAjax(companyUserService.deleteCompanyUserByIds(userIds));
@@ -148,9 +148,10 @@ public class CompanyUserController extends BaseController
      * @return
      */
     @GetMapping("/getCompanyUserList")
-    public R getCompanyUserList()
+    public R getCompanyUserList(@RequestParam Long companyId)
     {
         CompanyUser cu = new CompanyUser();
+        cu.setCompanyId(companyId);
         List<CompanyUser> list = companyUserService.selectCompanyUserList(cu);
         return  R.ok().put("data",list);
     }

+ 1 - 1
fs-admin/src/main/java/com/fs/core/config/DruidConfig.java

@@ -1,4 +1,4 @@
-//package com.fs.core.config;
+package com.fs.core.config;//package com.fs.core.config;
 //
 //import java.io.IOException;
 //import java.util.HashMap;

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

@@ -112,7 +112,7 @@ public class FsCourseTrafficLogController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:courseTrafficLog:remove')")
     @Log(title = "短链课程流量记录", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{logIds}")
+	@DeleteMapping("/{logIds}")
     public AjaxResult remove(@PathVariable Long[] logIds)
     {
         return toAjax(fsCourseTrafficLogService.deleteFsCourseTrafficLogByLogIds(logIds));

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

@@ -258,7 +258,7 @@ public class FsCourseWatchLogController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:courseWatchLog:remove')")
     @Log(title = "短链课程看课记录", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{logIds}")
+	@DeleteMapping("/{logIds}")
     public AjaxResult remove(@PathVariable Long[] logIds)
     {
         return toAjax(fsCourseWatchLogService.deleteFsCourseWatchLogByLogIds(logIds));

+ 1 - 1
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -126,7 +126,7 @@ public class FsUserCoursePeriodController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('course:period:remove')")
     @Log(title = "会员营期", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{periodIds}")
+	@DeleteMapping("/{periodIds}")
     public AjaxResult remove(@PathVariable Long[] periodIds)
     {
         return toAjax(fsUserCoursePeriodService.deleteFsUserCoursePeriodByIds(periodIds));

+ 4 - 4
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoController.java

@@ -106,7 +106,7 @@ public class FsUserCourseVideoController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:userCourseVideo:remove')")
     @Log(title = "课堂视频", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{videoIds}")
+	@DeleteMapping("/{videoIds}")
     public AjaxResult remove(@PathVariable String[] videoIds)
     {
         return toAjax(fsUserCourseVideoService.deleteFsUserCourseVideoByVideoIds(videoIds));
@@ -146,9 +146,9 @@ public class FsUserCourseVideoController extends BaseController
 
     @GetMapping("/getVideoListLikeName")
     public R getVideoListLikeName(@RequestParam(required = false) String name,
-                                  @RequestParam(required = false) String periodId,
-                                  @RequestParam(required = false, defaultValue = "1") Integer pageNum,
-                                  @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
+                                   @RequestParam(required = false) String periodId,
+                                   @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                                   @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
         Map<String,Object> params = new HashMap<>();
         params.put("name", name);
         params.put("periodId", periodId);

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

@@ -116,7 +116,7 @@ public class FsUserVideoController extends BaseController
 //            }
 //            productPackage.setProductList(productList);
 //        }
-        return R.ok().put("data", videoPVO);
+       return R.ok().put("data", videoPVO);
     }
 
     /**
@@ -146,7 +146,7 @@ public class FsUserVideoController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:userVideo:remove')")
     @Log(title = "课堂视频", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{videoIds}")
+	@DeleteMapping("/{videoIds}")
     public AjaxResult remove(@PathVariable String[] videoIds)
     {
         return toAjax(fsUserVideoService.deleteFsUserVideoByVideoIds(videoIds));

+ 1 - 1
fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java

@@ -250,7 +250,7 @@ public class QwFsCourseWatchLogController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:courseWatchLog:remove')")
     @Log(title = "短链课程看课记录", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{logIds}")
+	@DeleteMapping("/{logIds}")
     public AjaxResult remove(@PathVariable Long[] logIds)
     {
         return toAjax(fsCourseWatchLogService.deleteFsCourseWatchLogByLogIds(logIds));

+ 1 - 1
fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java

@@ -119,7 +119,7 @@ public class FsExpressController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('store:express:remove')")
     @Log(title = "快递公司", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
+	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
     {
         return toAjax(fsExpressService.deleteFsExpressByIds(ids));

+ 1 - 1
fs-admin/src/main/java/com/fs/store/controller/FsStoreProductController.java

@@ -157,7 +157,7 @@ public class FsStoreProductController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('store:storeProduct:remove')")
     @Log(title = "商品", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{productIds}")
+	@DeleteMapping("/{productIds}")
     public AjaxResult remove(@PathVariable Long[] productIds)
     {
         return toAjax(fsStoreProductService.deleteFsStoreProductByIds(productIds));

+ 1 - 1
fs-admin/src/main/java/com/fs/store/controller/FsStoreProductPackageController.java

@@ -186,7 +186,7 @@ public class FsStoreProductPackageController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('store:storeProductPackage:remove')")
     @Log(title = "商品组合套餐", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{packageIds}")
+	@DeleteMapping("/{packageIds}")
     public AjaxResult remove(@PathVariable Long[] packageIds)
     {
         return toAjax(fsStoreProductPackageService.deleteFsStoreProductPackageByIds(packageIds));

+ 1 - 1
fs-admin/src/main/java/com/fs/store/controller/FsTestReportController.java

@@ -99,7 +99,7 @@ public class FsTestReportController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('his:testReport:remove')")
     @Log(title = "测试报告", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{reportIds}")
+	@DeleteMapping("/{reportIds}")
     public AjaxResult remove(@PathVariable Long[] reportIds)
     {
         return toAjax(fsTestReportService.deleteFsTestReportByReportIds(reportIds));

+ 1 - 1
fs-admin/src/main/java/com/fs/store/controller/FsUserController.java

@@ -128,7 +128,7 @@ public class FsUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('store:user:remove')")
     @Log(title = "用户", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{userIds}")
+	@DeleteMapping("/{userIds}")
     public AjaxResult remove(@PathVariable Long[] userIds)
     {
         return toAjax(fsUserService.deleteFsUserByIds(userIds));

+ 16 - 12
fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java

@@ -1,27 +1,28 @@
 package com.fs.web.controller.system;
 
-import java.util.List;
-import java.util.Set;
-
+import com.fs.common.constant.Constants;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysMenu;
+import com.fs.common.core.domain.entity.SysUser;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.PatternUtils;
+import com.fs.common.utils.ServletUtils;
 import com.fs.core.security.LoginBody;
 import com.fs.core.security.LoginUser;
 import com.fs.core.security.SecurityUtils;
+import com.fs.core.web.service.SysLoginService;
+import com.fs.core.web.service.SysPermissionService;
+import com.fs.core.web.service.TokenService;
+import com.fs.system.service.ISysMenuService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
-import com.fs.common.constant.Constants;
-import com.fs.common.core.domain.AjaxResult;
-import com.fs.common.core.domain.entity.SysMenu;
-import com.fs.common.core.domain.entity.SysUser;
-import com.fs.common.utils.ServletUtils;
-import com.fs.core.web.service.SysLoginService;
-import com.fs.core.web.service.SysPermissionService;
-import com.fs.core.web.service.TokenService;
-import com.fs.system.service.ISysMenuService;
+
+import java.util.List;
+import java.util.Set;
 
 /**
  * 登录验证
@@ -57,6 +58,9 @@ public class SysLoginController
     {
 
         try{
+            if (!PatternUtils.checkPassword(loginBody.getPassword())) {
+                return R.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+            }
 
             // 生成令牌
             String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),

+ 13 - 13
fs-admin/src/main/java/com/fs/web/controller/system/SysProfileController.java

@@ -1,28 +1,23 @@
 package com.fs.web.controller.system;
 
-import java.io.IOException;
-
-import com.fs.core.security.LoginUser;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
 import com.fs.common.annotation.Log;
 import com.fs.common.config.FSConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.entity.SysUser;
 import com.fs.common.enums.BusinessType;
-import com.fs.core.security.SecurityUtils;
+import com.fs.common.utils.PatternUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.file.FileUploadUtils;
+import com.fs.core.security.LoginUser;
+import com.fs.core.security.SecurityUtils;
 import com.fs.core.web.service.TokenService;
 import com.fs.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 
 /**
  * 个人信息 业务处理
@@ -88,6 +83,11 @@ public class SysProfileController extends BaseController
         {
             return AjaxResult.error("修改密码失败,旧密码错误");
         }
+
+        if (!PatternUtils.checkPassword(newPassword)) {
+            return AjaxResult.error("新密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+        }
+
         if (SecurityUtils.matchesPassword(newPassword, password))
         {
             return AjaxResult.error("新密码不能与旧密码相同");

+ 17 - 0
fs-common/src/main/java/com/fs/common/utils/PatternUtils.java

@@ -0,0 +1,17 @@
+package com.fs.common.utils;
+
+import java.util.regex.Pattern;
+
+public class PatternUtils {
+
+    private final static Pattern PWD = Pattern.compile("^(?=.*[A-Za-z])(?=.*\\d)(?=.*[^A-Za-z0-9]).{8,20}$");
+
+    /**
+     * 校验密码是否符合条件
+     * @param value 密码
+     * @return boolean
+     */
+    public static boolean checkPassword(String value) {
+        return PWD.matcher(value).matches();
+    }
+}

+ 4 - 4
fs-common/src/main/java/com/fs/common/utils/date/DateUtil.java

@@ -111,8 +111,8 @@ public final class DateUtil {
 		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 		LocalDateTime startTime=LocalDateTime.parse(dateTime, formatter);
 		ZoneId zoneId = ZoneId.systemDefault();
-		ZonedDateTime zdtStart = startTime.atZone(zoneId);
-		return Date.from(zdtStart.toInstant());
+        ZonedDateTime zdtStart = startTime.atZone(zoneId);
+    	return Date.from(zdtStart.toInstant());
 	}
 
 	public static String formatLocalDate(LocalDate localDate){
@@ -331,7 +331,7 @@ public final class DateUtil {
 	 * @return
 	 */
 	public static <T> T calculatingTime(T t, CalculateTypeEnum calculateTypeEnum,
-										long num, TimeTypeEnum timeTypeEnum){
+									   long num, TimeTypeEnum timeTypeEnum){
 		LocalDateTime localDateTime;
 		if(t instanceof Date){
 			localDateTime = dateToLocalDateTime((Date) t);
@@ -376,7 +376,7 @@ public final class DateUtil {
 	 * @return
 	 */
 	private static LocalDateTime calculation(long num, CalculateTypeEnum calculateTypeEnum,
-											 LongFunction<LocalDateTime> addDeal, LongFunction<LocalDateTime> subDeal) {
+								 LongFunction<LocalDateTime> addDeal, LongFunction<LocalDateTime> subDeal) {
 		switch (calculateTypeEnum){
 			case ADD: return addDeal.apply(num);
 			case SUBTRACT: return subDeal.apply(num);

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

@@ -12,11 +12,11 @@ import org.springframework.stereotype.Component;
 
 /**
  * spring工具类 方便在非spring管理环境中获取bean
- * 
- 
+ *
+
  */
 @Component
-public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware 
+public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
 {
     /** Spring应用上下文环境 */
     private static ConfigurableListableBeanFactory beanFactory;
@@ -24,13 +24,13 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
     private static ApplicationContext applicationContext;
 
     @Override
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException 
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
     {
         SpringUtils.beanFactory = beanFactory;
     }
 
     @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
     {
         SpringUtils.applicationContext = applicationContext;
     }
@@ -40,7 +40,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
      *
      * @param name
      * @return Object 一个以所给名字注册的bean的实例
-     * @throws org.springframework.beans.BeansException
+     * @throws BeansException
      *
      */
     @SuppressWarnings("unchecked")
@@ -54,7 +54,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
      *
      * @param clz
      * @return
-     * @throws org.springframework.beans.BeansException
+     * @throws BeansException
      *
      */
     public static <T> T getBean(Class<T> clz) throws BeansException
@@ -79,7 +79,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
      *
      * @param name
      * @return boolean
-     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+     * @throws NoSuchBeanDefinitionException
      *
      */
     public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
@@ -90,7 +90,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
     /**
      * @param name
      * @return Class 注册对象的类型
-     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+     * @throws NoSuchBeanDefinitionException
      *
      */
     public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
@@ -103,7 +103,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
      *
      * @param name
      * @return
-     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+     * @throws NoSuchBeanDefinitionException
      *
      */
     public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
@@ -113,7 +113,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
 
     /**
      * 获取aop代理对象
-     * 
+     *
      * @param invoker
      * @return
      */

+ 2 - 0
fs-company-app/src/main/java/com/fs/app/annotation/Login.java

@@ -9,4 +9,6 @@ import java.lang.annotation.*;
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Login {
+    // 添加一个判断 是否是小程序登录
+    boolean isMiniLogin() default false;
 }

+ 5 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -118,6 +118,11 @@ public class FsUserController extends AppBaseController {
     @PostMapping("/enabled")
     @ApiOperation("批量启用会员")
     public ResponseResult<Boolean> enabledUser(@ApiParam(value = "联系人id集合", required = true) @RequestBody String[] ids) {
+        // 如果存在重粉的数据,则禁止启用,需要提示
+        Integer count = fsUserService.selectFsUserByUserIds(ids);
+        if(count > 0){
+            return ResponseResult.fail(400, "重粉会员不能移除小黑屋");
+        }
         Boolean r = fsUserService.disabledUser(ids, true);
         return ResponseResult.ok(r);
     }

+ 123 - 56
fs-company-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java

@@ -5,37 +5,41 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
+import com.fs.app.annotation.Login;
 import com.fs.app.param.LoginMaWxParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
 import com.fs.company.domain.CompanyDept;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.core.security.SecurityUtils;
+import com.fs.store.domain.FsUser;
 import com.fs.store.service.IFsUserService;
 import com.fs.wx.miniapp.config.WxMaConfiguration;
 import com.fs.wx.miniapp.config.WxMaProperties;
+import io.jsonwebtoken.Claims;
 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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
 import java.util.Objects;
 
-@Api("微信小程序相关接口")
+@Api("微信小程序相关接口(暂废弃,后面再删除)")
 @RestController
 @RequestMapping(value = "/app/wx/miniapp")
+@Slf4j
 public class WxCompanyUserController extends AppBaseController {
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -45,14 +49,20 @@ public class WxCompanyUserController extends AppBaseController {
     @Autowired
     JwtUtils jwtUtils;
 
+    @Autowired
+    RedisCache redisCache;
+
     @Autowired
     private ICompanyUserService companyUserService;
 
     @Autowired
     private ICompanyDeptService companyDeptService;
 
-    @ApiOperation("授权登录")
-    @PostMapping("/login")
+    @Autowired
+    private IFsUserService userService;
+
+    @ApiOperation("小程序-授权登录")
+    @PostMapping("/loginByMa")
     public R login(@RequestBody LoginMaWxParam param) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
@@ -66,65 +76,122 @@ public class WxCompanyUserController extends AppBaseController {
             // 解密
             WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
             WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-            CompanyUser companyUser = companyUserService.getCompanyUserByOpenId(session.getOpenid());
-            String ip = IpUtil.getRequestIp();
 
-//            // 如果公司id为空(表示可能是该公司的第一位销售管理员),则需要根据电话号码判断是否存在销售,如果不存在则提示
-//            if (param.getCompanyId() == null) {
-//                if (checkPhone == null) {
-//                    throw new CustomException("由于不是管理员,不能直接登录", 401);
+            //以下暂时注释,不需要往销售表添加数据
+//            CompanyUser companyUser = companyUserService.getCompanyUserByOpenId(session.getOpenid());
+//            String ip = IpUtil.getRequestIp();
+//
+////            // 如果公司id为空(表示可能是该公司的第一位销售管理员),则需要根据电话号码判断是否存在销售,如果不存在则提示
+////            if (param.getCompanyId() == null) {
+////                if (checkPhone == null) {
+////                    throw new CustomException("由于不是管理员,不能直接登录", 401);
+////                }
+////            }
+//            if (companyUser == null) {
+//                CompanyUser checkPhone = companyUserService.getCompanyUserByPhone(phoneNoInfo.getPhoneNumber());
+//                if (checkPhone != null) {
+//                    if (checkPhone.getMaOpenId() == null) {
+//                        companyUser = checkPhone;
+//                        companyUser.setMaOpenId(session.getOpenid());
+//                        companyUser.setUserId(companyUser.getUserId());
+//                        companyUser.setUpdateTime(new DateTime());
+//                        companyUser.setLoginIp(ip);
+//                        companyUserService.updateUserProfile(companyUser);
+//                    } else {
+//                        throw new CustomException("此手机号用户已存在");
+//                    }
+//                } else {
+//                    //新增
+//                    companyUser = new CompanyUser();
+//                    companyUser.setUserName(phoneNoInfo.getPhoneNumber());
+//                    companyUser.setNickName(userInfo.getNickName() == null ? "微信用户" : userInfo.getNickName());
+//                    companyUser.setPhonenumber(phoneNoInfo.getPhoneNumber());
+//                    companyUser.setSex(userInfo.getGender());
+//                    //密码初始化为123456
+//                    String pw = "123456";
+//                    companyUser.setPassword(SecurityUtils.encryptPassword(param.getPassword() == null ? pw : param.getPassword()));
+//                    companyUser.setCreateTime(new Date());
+//                    companyUser.setCompanyId(param.getCompanyId());
+//                    companyUser.setParentId(param.getParentCompanyUseId());
+//                    companyUser.setMaOpenId(session.getOpenid());
+//
+//                    //部门信息
+//                    CompanyDept dept = companyDeptService.getDefaultCompanyDeptByCompanyId(param.getCompanyId());
+//                    if (Objects.nonNull(dept)) {
+//                        companyUser.setDeptId(dept.getDeptId());
+//                    }
+//                    companyUserService.insertUser(companyUser);
 //                }
+//            } else {
+//                CompanyUser companyUserMp = new CompanyUser();
+//                companyUserMp.setPhonenumber(phoneNoInfo.getPhoneNumber());
+//                companyUserMp.setUserId(companyUser.getUserId());
+//                companyUserMp.setUpdateTime(new DateTime());
+//                companyUserMp.setLoginIp(ip);
+//                companyUserService.updateUserProfile(companyUser);
 //            }
-            if (companyUser == null) {
-                CompanyUser checkPhone = companyUserService.getCompanyUserByPhone(phoneNoInfo.getPhoneNumber());
-                if (checkPhone != null) {
-                    if (checkPhone.getMaOpenId() == null) {
-                        companyUser = checkPhone;
-                        companyUser.setMaOpenId(session.getOpenid());
-                        companyUser.setUserId(companyUser.getUserId());
-                        companyUser.setUpdateTime(new DateTime());
-                        companyUser.setLoginIp(ip);
-                        companyUserService.updateUserProfile(companyUser);
-                    } else {
-                        throw new CustomException("此手机号用户已存在");
-                    }
-                } else {
-                    //新增
-                    companyUser = new CompanyUser();
-                    companyUser.setUserName(phoneNoInfo.getPhoneNumber());
-                    companyUser.setNickName(userInfo.getNickName() == null ? "微信用户" : userInfo.getNickName());
-                    companyUser.setPhonenumber(phoneNoInfo.getPhoneNumber());
-                    companyUser.setSex(userInfo.getGender());
-                    //密码初始化为123456
-                    String pw = "123456";
-                    companyUser.setPassword(SecurityUtils.encryptPassword(param.getPassword() == null ? pw : param.getPassword()));
-                    companyUser.setCreateTime(new Date());
-                    companyUser.setCompanyId(param.getCompanyId());
-                    companyUser.setParentId(param.getParentCompanyUseId());
-                    companyUser.setMaOpenId(session.getOpenid());
-
-                    //部门信息
-                    CompanyDept dept = companyDeptService.getDefaultCompanyDeptByCompanyId(param.getCompanyId());
-                    if (Objects.nonNull(dept)) {
-                        companyUser.setDeptId(dept.getDeptId());
-                    }
-                    companyUserService.insertUser(companyUser);
-                }
+
+            // 添加会员表数据
+            FsUser user = userService.selectFsUserByMpOpenId(session.getOpenid());
+            if (user != null) {
+                //修改
+                FsUser userMap = new FsUser();
+                userMap.setUserId(user.getUserId());
+                userMap.setMpOpenId(session.getOpenid());
+                userMap.setUnionId(session.getUnionid());
+                userMap.setUpdateTime(new DateTime());
+                userMap.setNickname(userInfo.getNickName() != null ? userInfo.getNickName() : "微信用户");
+                userMap.setAvatar(userInfo.getAvatarUrl() != null ? userInfo.getAvatarUrl() : null);
+                userMap.setPhone(phoneNoInfo.getPhoneNumber());
+                userService.updateFsUser(userMap);
             } else {
-                CompanyUser companyUserMp = new CompanyUser();
-                companyUserMp.setPhonenumber(phoneNoInfo.getPhoneNumber());
-                companyUserMp.setUserId(companyUser.getUserId());
-                companyUserMp.setUpdateTime(new DateTime());
-                companyUserMp.setLoginIp(ip);
-                companyUserService.updateUserProfile(companyUser);
+                //新增
+                user = new FsUser();
+                user.setNickname(userInfo.getNickName() != null ? userInfo.getNickName() : "微信用户");
+                user.setAvatar(userInfo.getAvatarUrl() != null ? userInfo.getAvatarUrl() : null);
+                user.setStatus(1);
+                user.setMpOpenId(session.getOpenid());
+                user.setUnionId(session.getUnionid());
+                user.setCreateTime(new Date());
+                user.setPhone(phoneNoInfo.getPhoneNumber());
+                userService.insertFsUser(user);
             }
-            String token = jwtUtils.generateToken(companyUser.getUserId());
-            return R.ok("登录成功").put("token", token).put("companyUser", companyUser);
+            log.info("保存成功的用户信息user: {}, 用户id: {}", user, user.getUserId());
+            String token = jwtUtils.generateToken(user.getUserId());
+            // 返回一个写死的数据到前端
+            return R.ok("登录成功").put("token", token).put("phoneNumber", phoneNoInfo.getPhoneNumber()).put("nickName", "微信用户").put("user", user);
         } catch (WxErrorException e) {
             this.logger.error(e.getMessage(), e);
             return R.error("授权失败," + e.getMessage());
         }
     }
 
+    @Login(isMiniLogin = true)
+    @ApiOperation("获取销售通过小程序登录后的用户信息")
+    @GetMapping("/getMaUser")
+    public R getUserInfo() {
+        try {
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(Long.parseLong(getUserId()));
+            if (companyUser == null) {
+                return R.error(401, "用户信息不存在");
+            }
+            return R.ok().put("user", companyUser);
+        } catch (Exception e) {
+            return R.error("操作异常");
+        }
+    }
+
+    /**
+     * 特殊要求:销售小程序临时登录,登录后页面中还有一个之前常用的登录,所以为了区分,token名称不能跟之前的一样
+     *
+     * @return 用户id
+     */
+    public String getUserId() {
+        String headValue = ServletUtils.getRequest().getHeader("UserToken");
+        Claims claims = jwtUtils.getClaimByToken(headValue);
+        String userId = claims.getSubject().toString();
+        return userId;
+    }
+
 
 }

+ 3 - 3
fs-company-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -61,7 +61,7 @@ public class WxH5MpController {
             WxOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(param.getCode());
             WxOAuth2UserInfo wxMpUser = wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null);
 //            FsUser user = userService.selectFsUserByUnionid(wxMpUser.getUnionId());
-            FsUser user = userService.selectFsUserByMaOpenId(wxMpUser.getOpenid());
+            FsUser user = userService.selectFsUserByMpOpenId(wxMpUser.getOpenid());
             if (user != null) {
                 //修改
                 FsUser userMap = new FsUser();
@@ -70,7 +70,7 @@ public class WxH5MpController {
                 userMap.setUnionId(wxMpUser.getUnionId());
                 userMap.setUpdateTime(new DateTime());
                 userMap.setNickname(wxMpUser.getNickname());
-                user.setAvatar(wxMpUser.getHeadImgUrl());
+                userMap.setAvatar(wxMpUser.getHeadImgUrl());
                 userService.updateFsUser(userMap);
             } else {
                 //新增
@@ -83,7 +83,7 @@ public class WxH5MpController {
                 user.setCreateTime(new Date());
                 userService.insertFsUser(user);
             }
-            log.error("用户信息user: {}, 用户id: {}", user, user.getUserId());
+            log.info("用户信息user: {}, 用户id: {}", user, user.getUserId());
             String token = jwtUtils.generateToken(user.getUserId());
             redisCache.setCacheObject("token:" + user.getUserId(), token, 604800, TimeUnit.SECONDS);
             Map<String, Object> map = new HashMap<>();

+ 11 - 6
fs-company-app/src/main/java/com/fs/app/interceptor/AuthorizationInterceptor.java

@@ -6,6 +6,7 @@ import com.fs.app.annotation.Login;
 import com.fs.app.exception.FSException;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import io.jsonwebtoken.Claims;
 
@@ -43,19 +44,23 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter {
         }
 
         //获取用户凭证
-        String token = request.getHeader(jwtUtils.getHeader());
-        if(StringUtils.isBlank(token)){
-            token = request.getParameter(jwtUtils.getHeader());
+        String token;
+        if(!annotation.isMiniLogin()){
+            token = request.getHeader(jwtUtils.getHeader());
+            if(StringUtils.isBlank(token)){
+                token = request.getParameter(jwtUtils.getHeader());
+            }
+        } else {
+            token = ServletUtils.getRequest().getHeader("UserToken");
         }
-
         //凭证为空
         if(StringUtils.isBlank(token)){
-            throw new FSException(jwtUtils.getHeader() + "不能为空", HttpStatus.UNAUTHORIZED.value());
+            throw new FSException(annotation.isMiniLogin() ? "UserToken不能为空" : jwtUtils.getHeader() + "不能为空", HttpStatus.UNAUTHORIZED.value());
         }
 
         Claims claims = jwtUtils.getClaimByToken(token);
         if(claims == null || jwtUtils.isTokenExpired(claims.getExpiration())){
-            throw new FSException(jwtUtils.getHeader() + "失效,请重新登录", HttpStatus.UNAUTHORIZED.value());
+            throw new FSException(annotation.isMiniLogin() ? "UserToken失效,请重新登录" : jwtUtils.getHeader() + "失效,请重新登录", HttpStatus.UNAUTHORIZED.value());
         }
 //        //查询用户的TOKEN是否和REDIS中的一样
 //        String redisToken=redisCache.getCacheObject("token:"+ Long.parseLong(claims.getSubject()));

+ 7 - 7
fs-company-app/src/main/java/com/fs/app/param/LoginMaWxParam.java

@@ -19,16 +19,16 @@ public class LoginMaWxParam implements Serializable {
     @ApiModelProperty(value = "小程序加密算法的初始向量")
     private String iv;
 
-    @ApiModelProperty(value = "公司id,如果不是第一位销售,都需要传")
-    private Long companyId;
+//    @ApiModelProperty(value = "公司id,如果不是第一位销售,都需要传")
+//    private Long companyId;
 
 //    @ApiModelProperty(value = "电话号码")
 //    private String phoneNumber;
 
-    @ApiModelProperty(value = "上级销售id,如果没有则不传")
-    private Long parentCompanyUseId;
-
-    @ApiModelProperty(value = "用户密码")
-    private String password;
+//    @ApiModelProperty(value = "上级销售id,如果没有则不传")
+//    private Long parentCompanyUseId;
+//
+//    @ApiModelProperty(value = "用户密码")
+//    private String password;
 
 }

+ 12 - 11
fs-company/src/main/java/com/fs/company/controller/CompanyLoginController.java

@@ -1,16 +1,12 @@
 package com.fs.company.controller;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-
+import com.fs.common.constant.Constants;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.PatternUtils;
+import com.fs.common.utils.ServletUtils;
 import com.fs.company.domain.CompanyMenu;
 import com.fs.company.domain.CompanyUser;
-import com.fs.company.param.LoginToken;
 import com.fs.company.service.ICompanyMenuService;
 import com.fs.core.security.LoginBody;
 import com.fs.core.security.LoginUser;
@@ -22,9 +18,10 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
-import com.fs.common.constant.Constants;
-import com.fs.common.core.domain.AjaxResult;
-import com.fs.common.utils.ServletUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
 
 /**
  * 登录验证
@@ -57,6 +54,10 @@ public class CompanyLoginController
     @PostMapping("/login")
     public AjaxResult login(@RequestBody LoginBody loginBody)
     {
+        if (!PatternUtils.checkPassword(loginBody.getPassword())) {
+            return AjaxResult.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+        }
+
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
         String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),

+ 17 - 18
fs-company/src/main/java/com/fs/company/controller/CompanyProfileController.java

@@ -1,33 +1,27 @@
 package com.fs.company.controller;
 
-import java.io.IOException;
-
-import com.fs.company.domain.Company;
+import com.fs.common.annotation.Log;
+import com.fs.common.config.FSConfig;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.PatternUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.file.FileUploadUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyVoiceCaller;
 import com.fs.company.param.CompanyUserEditParam;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.service.ICompanyVoiceCallerService;
 import com.fs.core.security.LoginUser;
+import com.fs.core.security.SecurityUtils;
 import com.fs.core.web.service.TokenService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import com.fs.common.annotation.Log;
-import com.fs.common.config.FSConfig;
-import com.fs.common.core.controller.BaseController;
-import com.fs.common.core.domain.AjaxResult;
-import com.fs.common.enums.BusinessType;
-import com.fs.core.security.SecurityUtils;
-import com.fs.common.utils.ServletUtils;
-import com.fs.common.utils.file.FileUploadUtils;
+
+import java.io.IOException;
 
 /**
  * 个人信息
@@ -108,6 +102,11 @@ public class CompanyProfileController extends BaseController
         {
             return AjaxResult.error("新密码不能与旧密码相同");
         }
+
+        if (!PatternUtils.checkPassword(newPassword)) {
+            return AjaxResult.error("新密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+        }
+
         if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
         {
             // 更新缓存用户密码

+ 23 - 18
fs-company/src/main/java/com/fs/company/controller/CompanyUserController.java

@@ -1,13 +1,18 @@
 package com.fs.company.controller;
 
-import java.util.Date;
-import java.util.List;
-import java.util.stream.Collectors;
-
 import cn.hutool.json.JSONUtil;
+import com.fs.common.annotation.Log;
+import com.fs.common.constant.UserConstants;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
-
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.DomainUtil;
+import com.fs.common.utils.PatternUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.*;
 import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserQwParam;
@@ -15,27 +20,20 @@ import com.fs.company.service.*;
 import com.fs.company.vo.CompanyUserQwListVO;
 import com.fs.company.vo.CompanyUserVO;
 import com.fs.core.security.LoginUser;
+import com.fs.core.security.SecurityUtils;
 import com.fs.core.web.service.TokenService;
 import com.fs.course.config.CourseConfig;
-import com.fs.qw.vo.CompanyUserQwVO;
-import com.fs.qw.vo.QwUserVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.qw.vo.QwUserVO;
 import com.fs.system.service.ISysConfigService;
-import com.fs.system.vo.DictVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-import com.fs.common.annotation.Log;
-import com.fs.common.constant.UserConstants;
-import com.fs.common.core.controller.BaseController;
-import com.fs.common.core.domain.AjaxResult;
-import com.fs.common.core.page.TableDataInfo;
-import com.fs.common.enums.BusinessType;
-import com.fs.core.security.SecurityUtils;
-import com.fs.common.utils.ServletUtils;
-import com.fs.common.utils.StringUtils;
-import com.fs.common.utils.poi.ExcelUtil;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -175,6 +173,10 @@ public class CompanyUserController extends BaseController
     @PostMapping
     public AjaxResult add(@Validated @RequestBody CompanyUser user)
     {
+        if (!PatternUtils.checkPassword(user.getPassword())) {
+            return AjaxResult.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+        }
+
         //判断用户数量是否已达到上线
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Integer count=companyUserService.selectCompanyUserCountByCompanyId(loginUser.getCompany().getCompanyId());
@@ -240,6 +242,9 @@ public class CompanyUserController extends BaseController
     @PutMapping("/resetPwd")
     public AjaxResult resetPwd(@RequestBody CompanyUser user)
     {
+        if (!PatternUtils.checkPassword(user.getPassword())) {
+            return AjaxResult.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+        }
         return toAjax(companyUserService.resetUserPwdByUserId(user.getUserId(), SecurityUtils.encryptPassword(user.getPassword())));
     }
 

+ 2 - 0
fs-company/src/main/java/com/fs/company/controller/IndexStatisticsController.java

@@ -7,6 +7,8 @@ import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
 import com.fs.statis.StatisticsRedisConstant;
 import com.fs.statis.dto.*;
+import io.jsonwebtoken.lang.Assert;
+import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 

+ 1 - 1
fs-company/src/main/java/com/fs/core/config/DruidConfig.java

@@ -1,4 +1,4 @@
-//package com.fs.core.config;
+package com.fs.core.config;//package com.fs.core.config;
 //
 //import java.io.IOException;
 //import java.util.HashMap;

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

@@ -258,7 +258,7 @@ public class FsCourseWatchLogController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:courseWatchLog:remove')")
     @Log(title = "短链课程看课记录", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{logIds}")
+	@DeleteMapping("/{logIds}")
     public AjaxResult remove(@PathVariable Long[] logIds)
     {
         return toAjax(fsCourseWatchLogService.deleteFsCourseWatchLogByLogIds(logIds));

+ 11 - 11
fs-company/src/main/java/com/fs/qw/QwExternalContactController.java

@@ -198,8 +198,8 @@ public class QwExternalContactController extends BaseController
     }
 
     /**
-     * 在职转接 分配客户
-     */
+    * 在职转接 分配客户
+    */
     @PreAuthorize("@ss.hasPermi('qw:externalContact:transfer')")
     @Log(title = "企业微信客户", businessType = BusinessType.UPDATE)
     @PutMapping("/transfer")
@@ -240,8 +240,8 @@ public class QwExternalContactController extends BaseController
     }
 
     /**
-     * 绑定小程序用户
-     */
+    * 绑定小程序用户
+    */
     @PutMapping("/bindUserId")
     public R bindUserId(@RequestBody QwExternalContact qwExternalContact)
     {
@@ -263,7 +263,7 @@ public class QwExternalContactController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('qw:externalContact:remove')")
     @Log(title = "企业微信客户", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
+	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
     {
         return toAjax(qwExternalContactService.deleteQwExternalContactByIds(ids));
@@ -315,8 +315,8 @@ public class QwExternalContactController extends BaseController
     }
 
     /**
-     * 获取CRM在学课程记录
-     */
+    * 获取CRM在学课程记录
+    */
     @GetMapping("/getCourseStudyList")
     public TableDataInfo getMyCourseList(FsUserCourseListUParam param)
     {
@@ -339,8 +339,8 @@ public class QwExternalContactController extends BaseController
     }
 
     /**
-     * 查询是否已经设置过客户-某个课节的SOP
-     */
+    * 查询是否已经设置过客户-某个课节的SOP
+    */
     @GetMapping("/getCustomerCourseSop")
     public Boolean getCustomerCourseSop(QwFsCustomerCourseSopGetParam param){
 //
@@ -352,8 +352,8 @@ public class QwExternalContactController extends BaseController
     }
 
     /**
-     * 批量设置客户-课节SOP
-     */
+    * 批量设置客户-课节SOP
+    */
     @PostMapping("/setCustomerCourseSopList")
     public R setCustomerCourseSopList(@RequestBody QwFsCustomerCourseSopListParam param){
 

+ 8 - 8
fs-company/src/main/java/com/fs/qw/vo/QwExternalContactVO.java

@@ -15,13 +15,13 @@ public class QwExternalContactVO {
     private String userId;
 
     /**
-     *  属于用户名称
-     */
+    *  属于用户名称
+    */
     private String qwUserName;
 
     /**
-     * 员工所属部门
-     */
+    * 员工所属部门
+    */
     private String departmentName;
 
 
@@ -32,13 +32,13 @@ public class QwExternalContactVO {
     private Long companyUserId;
 
     /**
-     * 是否绑定企业微信
-     */
+    * 是否绑定企业微信
+    */
     private Long customerId;
 
     /**
-     * CRM 绑定的小程序id
-     */
+    * CRM 绑定的小程序id
+    */
     private Long miniUserId;
 
     /** 名称 */

+ 9 - 0
fs-company/src/main/java/com/fs/qw/vo/QwWatchLogAllStatisticsListVO.java

@@ -95,4 +95,13 @@ public class QwWatchLogAllStatisticsListVO {
      */
     private Long videoId;
     private String videoName;
+
+
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private Long fsUserId;
+
+    private String fsUserName;
 }

+ 2 - 0
fs-company/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java

@@ -10,6 +10,8 @@ public class QwWatchLogStatisticsListVO {
     private Long id;
     private String qwUserName;
     private String companyUserName;
+    private Long companyUserId;
+    private Long companyId;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createTime;
     private Long line;//进线数

+ 0 - 6
fs-company/src/main/java/com/fs/wxuser/CompanyWxUserController.java

@@ -37,7 +37,6 @@ public class CompanyWxUserController extends BaseController
     /**
      * 查询【个微管理】列表
      */
-    @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/list")
     public TableDataInfo list(CompanyWxUser companyWxUser)
     {
@@ -49,7 +48,6 @@ public class CompanyWxUserController extends BaseController
     /**
      * 导出【个微管理】列表
      */
-    @PreAuthorize("@ss.hasPermi('system:user:export')")
     @Log(title = "【个微管理】", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
     public AjaxResult export(CompanyWxUser companyWxUser)
@@ -62,7 +60,6 @@ public class CompanyWxUserController extends BaseController
     /**
      * 获取【个微管理】详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping(value = "/{userId}")
     public AjaxResult getInfo(@PathVariable("userId") Long userId)
     {
@@ -72,7 +69,6 @@ public class CompanyWxUserController extends BaseController
     /**
      * 新增【个微管理】
      */
-    @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "【个微管理】", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody CompanyWxUser companyWxUser)
@@ -83,7 +79,6 @@ public class CompanyWxUserController extends BaseController
     /**
      * 修改【个微管理】
      */
-    @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "【个微管理】", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody CompanyWxUser companyWxUser)
@@ -94,7 +89,6 @@ public class CompanyWxUserController extends BaseController
     /**
      * 删除【个微管理】
      */
-    @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "【个微管理】", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{userIds}")
     public AjaxResult remove(@PathVariable Long[] userIds)

+ 2 - 0
fs-service-system/src/main/java/com/fs/company/cache/ICompanyTagCacheService.java

@@ -1,5 +1,7 @@
 package com.fs.company.cache;
 
+import com.fs.company.dto.CompanyIdAndUserDTO;
+
 import java.util.Map;
 
 public interface ICompanyTagCacheService {

+ 1 - 1
fs-service-system/src/main/java/com/fs/company/domain/CompanyRecharge.java

@@ -11,7 +11,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 充值对象 company_recharge
- *
+ * 
  * @author fs
  * @date 2023-02-27
  */

+ 2 - 2
fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -93,7 +93,7 @@ public interface CompanyUserMapper
     int resetUserPwdByUserId( @Param("userId")Long userId, @Param("password") String encryptPassword);
 
     List<CompanyUser> selectAllUsersList(CompanyUser user);
-    //    @Select({"<script> " +
+//    @Select({"<script> " +
 //            "select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.open_id,u.id_card, d.dept_name, d.leader from company_user u\n" +
 //            "        left join company_dept d on u.dept_id = d.dept_id\n" +
 //            "        where u.del_flag = '0' and u.status=0\n" +
@@ -136,7 +136,7 @@ public interface CompanyUserMapper
     @Select("select u.* from company_user u   where u.company_id=#{companyId} and u.nick_name=#{nickName} limit 1 ")
     CompanyUser selectCompanyUserByCompanyIdAndNickName(@Param("companyId")long companyId,@Param("nickName") String nickName);
 
-    //    @Select({"<script> " +
+//    @Select({"<script> " +
 //            "select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.open_id,u.id_card, d.dept_name, d.leader ,\n" +
 //            "        (select count(1) from crm_customer cc where u.user_id= cc.receive_user_id and date_format(cc.receive_time,'%y%m%d') = date_format(now(),'%y%m%d')  ) as now_day_customer_count\n" +
 //            "        from company_user u\n" +

+ 7 - 7
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRoleServiceImpl.java

@@ -20,7 +20,7 @@ import java.util.*;
 
 /**
  * 角色信息Service业务层处理
- *
+ * 
  * @author fs
  * @date 2021-05-25
  */
@@ -37,7 +37,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
     private CompanyUserRoleMapper userRoleMapper;
     /**
      * 查询角色信息
-     *
+     * 
      * @param roleId 角色信息ID
      * @return 角色信息
      */
@@ -49,7 +49,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
 
     /**
      * 查询角色信息列表
-     *
+     * 
      * @param companyRole 角色信息
      * @return 角色信息
      */
@@ -61,7 +61,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
 
     /**
      * 新增角色信息
-     *
+     * 
      * @param companyRole 角色信息
      * @return 结果
      */
@@ -74,7 +74,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
 
     /**
      * 修改角色信息
-     *
+     * 
      * @param companyRole 角色信息
      * @return 结果
      */
@@ -87,7 +87,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
 
     /**
      * 批量删除角色信息
-     *
+     * 
      * @param roleIds 需要删除的角色信息ID
      * @return 结果
      */
@@ -99,7 +99,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
 
     /**
      * 删除角色信息信息
-     *
+     * 
      * @param roleId 角色信息ID
      * @return 结果
      */

+ 1 - 1
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -471,7 +471,7 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         if (Objects.isNull(toUser)) {
             throw new ServiceException("需要更换归属的销售不存在");
         }
-        return fsUserMapper.batchUpdateUserCompanyUser(userIds, companyUserId, companyId);
+       return fsUserMapper.batchUpdateUserCompanyUser(userIds, companyUserId, companyId);
     }
 
     /**

+ 1 - 1
fs-service-system/src/main/java/com/fs/company/vo/CompanyRechargeVO.java

@@ -13,7 +13,7 @@ import java.util.Date;
 
 /**
  * 充值对象 company_recharge
- *
+ * 
  * @author fs
  * @date 2021-10-04
  */

+ 2 - 2
fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java

@@ -49,8 +49,8 @@ public class FsCourseLink extends BaseEntity
 
     private Long courseId;
     /**
-     * 企微外部联系表主键
-     */
+    * 企微外部联系表主键
+    */
     private Long qwExternalId;
 
     private Integer linkType; //链接类型 0:正常链接  1:应急链接

+ 2 - 2
fs-service-system/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -98,8 +98,8 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     //临时看课记录
     @Select("select * from fs_course_watch_log where user_id = #{userId} and video_id = #{videoId} and company_user_id = #{companyUserId}")
     FsCourseWatchLog getWatchLogByTemporary(@Param("userId") Long userId,
-                                            @Param("videoId") Long videoId,
-                                            @Param("companyUserId") Long companyUserId);
+                                          @Param("videoId") Long videoId,
+                                          @Param("companyUserId") Long companyUserId);
 
     @Select("select * from fs_course_watch_log " +
             "where user_id = #{userId} " +

+ 1 - 0
fs-service-system/src/main/java/com/fs/course/param/BatchRedUpdate.java

@@ -3,6 +3,7 @@ package com.fs.course.param;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 public class BatchRedUpdate {

+ 7 - 6
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -161,7 +161,7 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         }else {
             FsCourseWatchLog log;
             if(isH5User){
-                log = courseWatchLogMapper.getWatchLogByFsUser(param.getVideoId(), param.getUserId(), param.getCompanyUserId());
+               log = courseWatchLogMapper.getWatchLogByFsUser(param.getVideoId(), param.getUserId(), param.getCompanyUserId());
             } else {
                 log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
             }
@@ -175,11 +175,12 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
 
             rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
             if (rightLog != null) {
-//                if (log.getRewardType() != null) {
-//                    return R.error("该课程已答题完成,不可重复答题");
-//                } else {
-//                }
-                return R.error("该课程已答题完成,不可重复答题");
+                if (log.getRewardType() != null) {
+                    return R.error("该课程已答题完成,不可重复答题");
+                } else {
+                    return R.ok("答题成功");
+                }
+//                return R.error("该课程已答题完成,不可重复答题");
             }
             errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),param.getQwUserId());
         }

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

@@ -146,10 +146,10 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
 
         // 修改大于当前时间的课程状态
         Wrapper<FsUserCoursePeriodDays> updateWrapper = Wrappers.<FsUserCoursePeriodDays>lambdaUpdate()
-                .set(FsUserCoursePeriodDays::getStatus, 2)
-                .eq(FsUserCoursePeriodDays::getPeriodId, fsUserCoursePeriod.getPeriodId())
-                .eq(FsUserCoursePeriodDays::getStatus, 0)
-                .gt(FsUserCoursePeriodDays::getDayDate, LocalDate.now());
+        .set(FsUserCoursePeriodDays::getStatus, 2)
+        .eq(FsUserCoursePeriodDays::getPeriodId, fsUserCoursePeriod.getPeriodId())
+        .eq(FsUserCoursePeriodDays::getStatus, 0)
+        .gt(FsUserCoursePeriodDays::getDayDate, LocalDate.now());
         fsUserCoursePeriodDaysMapper.update(null, updateWrapper);
     }
 

+ 26 - 10
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.course.service.impl;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
@@ -39,7 +40,9 @@ import com.fs.qwApi.service.QwApiService;
 import com.fs.sop.mapper.QwSopLogsMapper;
 import com.fs.sop.mapper.SopUserLogsInfoMapper;
 import com.fs.store.domain.FsUser;
+import com.fs.store.domain.FsUserCompanyUser;
 import com.fs.store.domain.FsUserIntegralLogs;
+import com.fs.store.mapper.FsUserCompanyUserMapper;
 import com.fs.store.mapper.FsUserIntegralLogsMapper;
 import com.fs.store.mapper.FsUserMapper;
 import com.fs.store.service.IFsStorePaymentService;
@@ -98,7 +101,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     private FsCourseSopLogsMapper courseSopLogsMapper;
     @Autowired
     private QwApiService qwApiService;
-    //    @Autowired
+//    @Autowired
 //    private IAdHtmlClickLogService adHtmlClickLogService;
     @Autowired
     private QwUserMapper qwUserMapper;
@@ -143,6 +146,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
 
+    @Autowired
+    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
+
     /**
      * 查询课堂视频
      *
@@ -923,21 +929,22 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //查询用户
         FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
         if (fsUser == null){
-            return ResponseResult.fail(401,"未授权");
+            return ResponseResult.fail(404,"当前用户信息不存在");
         }
 
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
         if (companyUser == null){
-            return ResponseResult.fail(500,"销售不存在");
+            return ResponseResult.fail(405,"当前销售不存在");
         }
 
-        //判断该用户是否绑定了该销售
-        FsUser userParam = new FsUser();
-        userParam.setCompanyUserId(param.getCompanyUserId());
-        userParam.setUserId(param.getUserId());
-        List<FsUser> fsUserCompany = fsUserMapper.selectFsUserList(userParam);
-        if(fsUserCompany != null && !fsUserCompany.isEmpty()){
+        //判断:1、如果没有绑定销售,就提示;
+        //2、如果只绑定了当前销售,需要添加看课记录(正常流程);
+        //3、以上都不是,则标识重粉,需要加入关系表
+        if(fsUser.getCompanyUserId() == null) {
+            return ResponseResult.fail(503, "暂时未绑定销售,请联系管理员");
+        }
+        if(companyUser.getUserId().equals(fsUser.getCompanyUserId())){
             //查询看课记录
             FsCourseWatchLog log = new FsCourseWatchLog();
             log.setUserId(param.getUserId());
@@ -970,7 +977,16 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 courseWatchLogMapper.insertFsCourseWatchLog(fsCourseWatchLog);
             }
         } else {
-            return ResponseResult.ok(Boolean.FALSE);
+            FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
+            fsUserCompanyUser.setIsRepeatFans(1);
+            fsUserCompanyUser.setUserId(param.getUserId());
+            fsUserCompanyUser.setCompanyId(param.getCompanyId());
+            fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId());
+            QueryWrapper<FsUserCompanyUser> queryWrapper = new QueryWrapper<FsUserCompanyUser>().eq("user_id", param.getUserId()).eq("company_user_id", param.getCompanyUserId());
+            Integer i = fsUserCompanyUserMapper.selectCount(queryWrapper);
+            if(i == 0) {
+                fsUserCompanyUserMapper.insertFsUserCompanyUser(fsUserCompanyUser);
+            }
         }
         return ResponseResult.ok(Boolean.TRUE);
     }

+ 2 - 2
fs-service-system/src/main/java/com/fs/course/service/impl/TencentCloudCosService.java

@@ -45,10 +45,10 @@ public class TencentCloudCosService implements ITencentCloudCosService {
 
     private static final String YL_SECRET_ID = "AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT";
     private static final String YL_SECRET_KEY = "u5SuS80342xzx8FRBukza9lVNHKNMSaB";
-    private static final String YL_BUCKET = "beliyo-1323137866";
+    private static final String YL_BUCKET = "fby-1323137866";
     private static final String YL_APP_ID = "1323137866";
     private static final String YL_REGION = "ap-chongqing";
-    private static final String YL_PROXY = "beliyo";
+    private static final String YL_PROXY = "fby";
     @Override
     public R getTmpSecretKey() {
         TreeMap<String, Object> config = new TreeMap<String, Object>();

+ 4 - 4
fs-service-system/src/main/java/com/fs/course/vo/FsUserCourseVideoQVO.java

@@ -11,8 +11,8 @@ import java.time.LocalTime;
 import java.util.List;
 
 /**
- * 含课题 的课程小节
- */
+* 含课题 的课程小节
+*/
 @Data
 public class FsUserCourseVideoQVO extends BaseEntity {
 
@@ -79,8 +79,8 @@ public class FsUserCourseVideoQVO extends BaseEntity {
     private String questionBankId;
 
     /**
-     * 课题数组
-     */
+    * 课题数组
+    */
     private List<FsCourseQuestionBank> questionBankList;
 
     private String packageJson;

+ 0 - 1
fs-service-system/src/main/java/com/fs/course/vo/PeriodRedPacketVO.java

@@ -3,7 +3,6 @@ package com.fs.course.vo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDate;

+ 1 - 0
fs-service-system/src/main/java/com/fs/course/vo/UpdateCourseTimeVo.java

@@ -1,5 +1,6 @@
 package com.fs.course.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 
 import java.time.LocalDate;

+ 4 - 1
fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java

@@ -1,5 +1,6 @@
 package com.fs.kingbos.service;
 
+import com.fs.erp.dto.ErpOrderResponse;
 import com.fs.kingbos.domian.KingbosOrderRequest;
 import com.fs.kingbos.domian.KingbosOrderResponse;
 import com.fs.kingbos.domian.KingbosRefundOrderRequest;
@@ -11,5 +12,7 @@ public interface K9OrderService {
 
     KingbosOrderResponse refundOrder(KingbosRefundOrderRequest request);
 
-    void createOmsOrder(Long orderId,String orderStatus);
+    ErpOrderResponse addOmsOrder(Long orderId);
+
+    ErpOrderResponse refundOmsOrder(Long orderId);
 }

+ 58 - 16
fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java

@@ -1,12 +1,18 @@
 package com.fs.kingbos.service.impl;
 
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.PropertyNamingStrategy;
+import com.alibaba.fastjson.parser.ParserConfig;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.StringUtils;
+import com.fs.erp.dto.ErpOrderResponse;
+import com.fs.erp.dto.wdt.ErpWdtApiResponse;
 import com.fs.kingbos.domian.*;
 import com.fs.kingbos.enums.OrderStatusEnum;
 import com.fs.kingbos.service.K9OrderService;
@@ -26,6 +32,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -83,10 +90,44 @@ public class K9OrderServiceImpl implements K9OrderService {
         return response;
     }
 
+    @Override
+    public ErpOrderResponse addOmsOrder(Long orderId) {
+        try {
+            KingbosOrderResponse response = this.createOmsOrder(orderId, NO_DELIVERED.getCode());
+            if (response.getIsSuccess()){
+                log.info("订单推送成功: {}", response);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(response.getCbilid());
+                return erpOrderResponse;
+            }else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s",response.getErrmsg()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
 
     @Override
-    @Transactional
-    public void createOmsOrder(Long orderId,String orderStatus){
+    public ErpOrderResponse refundOmsOrder(Long orderId) {
+        try {
+            KingbosOrderResponse response = this.createOmsOrder(orderId, CANCELLED.getCode());
+            if (response.getIsSuccess()){
+                log.info("订单推送成功: {}", response);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(response.getCbilid());
+                return erpOrderResponse;
+            }else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s",response.getErrmsg()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
+
+
+    private KingbosOrderResponse createOmsOrder(Long orderId,String orderStatus){
         logger.info("【金博网络订单】开始创建订单,订单ID: {}", orderId);
         try {
             // 1. 获取订单信息并验证
@@ -103,15 +144,16 @@ public class K9OrderServiceImpl implements K9OrderService {
 
             // 4. 发送订单请求
             KingbosOrderResponse response = sendOrderRequest(data, d1Datas);
-            if (response.getIsSuccess()){
-                FsStoreOrder order1 = new FsStoreOrder();
-                order1.setId(order.getId());
-                order1.setExtendOrderId(response.getCbilid());
-                fsStoreOrderMapper.updateFsStoreOrder(order1);
-                logger.info("【金博网络订单】订单创建完成,订单ID: {}", orderId);
-            }else {
-                logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, response.getErrmsg());
-            }
+            return response;
+//            if (response.getIsSuccess()){
+//                FsStoreOrder order1 = new FsStoreOrder();
+//                order1.setId(order.getId());
+//                order1.setExtendOrderId(response.getCbilid());
+//                fsStoreOrderMapper.updateFsStoreOrder(order1);
+//                logger.info("【金博网络订单】订单创建完成,订单ID: {}", orderId);
+//            }else {
+//                logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, response.getErrmsg());
+//            }
         } catch (Exception e) {
             logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, e.getMessage(), e);
             throw e;
@@ -183,12 +225,12 @@ public class K9OrderServiceImpl implements K9OrderService {
 
         // 处理详细地址
         String detailAddress = address.length > 3 ?
-                String.join("", Arrays.copyOfRange(address, 3, address.length)) :
-                address[2];
+            String.join("", Arrays.copyOfRange(address, 3, address.length)) :
+            address[2];
 
         // 处理特殊字符
         detailAddress = detailAddress.replace("+", "加")
-                .replace("\n", "");
+                                   .replace("\n", "");
 
         data.setCreceiver_address(detailAddress);
         data.setCreceiver_name(order.getRealName());
@@ -203,8 +245,8 @@ public class K9OrderServiceImpl implements K9OrderService {
         List<FsStoreOrderItem> orderItems = storeOrderItemService.selectFsStoreOrderItemList(query);
 
         List<KingbosOrderD1Data> d1Datas = orderItems.stream()
-                .map(item -> buildOrderDetailItem(item, orderId))
-                .collect(Collectors.toList());
+            .map(item -> buildOrderDetailItem(item, orderId))
+            .collect(Collectors.toList());
 
         logger.debug("【金博网络订单】订单明细构建完成,订单号: {}, 明细数量: {}", order.getOrderCode(), d1Datas.size());
         return d1Datas;

+ 7 - 7
fs-service-system/src/main/java/com/fs/qw/domain/QwGroupChatUser.java

@@ -29,8 +29,8 @@ public class QwGroupChatUser extends BaseEntity
     private String userId;
 
     /** 成员类型。
-     1 - 企业成员
-     2 - 外部联系人 */
+1 - 企业成员
+2 - 外部联系人 */
     @Excel(name = "成员类型")
     private String type;
 
@@ -44,9 +44,9 @@ public class QwGroupChatUser extends BaseEntity
     private String joinTime;
 
     /** 入群方式。
-     1 - 由群成员邀请入群(直接邀请入群)
-     2 - 由群成员邀请入群(通过邀请链接入群)
-     3 - 通过扫描群二维码入群 */
+1 - 由群成员邀请入群(直接邀请入群)
+2 - 由群成员邀请入群(通过邀请链接入群)
+3 - 通过扫描群二维码入群 */
     @Excel(name = "入群方式")
     private String joinScene;
 
@@ -59,8 +59,8 @@ public class QwGroupChatUser extends BaseEntity
     private String groupNickname;
 
     /** 名字。仅当 need_name = 1 时返回
-     如果是微信用户,则返回其在微信中设置的名字
-     如果是企业微信联系人,则返回其设置对外展示的别名或实名 */
+如果是微信用户,则返回其在微信中设置的名字
+如果是企业微信联系人,则返回其设置对外展示的别名或实名 */
     @Excel(name = "名字")
     private String name;
 

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

@@ -193,8 +193,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "where user_id=#{userId}  and corp_id=#{corpId} ")
     public int updateQwExternalContactByQwUserId(QwExternalContact qwExternalContact);
     /**
-     * 修改CRM客户
-     */
+    * 修改CRM客户
+    */
     @Update("update qw_external_contact set customer_id=#{customerId} where external_user_id=#{externalUserId} and corp_id=#{corpId}")
     public int updateQwExternalContactByExternalUserId(QwExternalContact qwExternalContact);
 
@@ -277,8 +277,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     QwExternalContact selectQwExternalByExternalIdAndCompanyIdToIdAndFs(@Param("externalUserid")String externalUserid,@Param("userId") String userId,@Param("corpId") String corpId);
 
     /**
-     * 修改 状态
-     */
+    * 修改 状态
+    */
 
     @Update("update qw_external_contact set status=#{map.status} where user_id=#{map.userId} and corp_id= #{map.corpId} and  external_user_id=#{map.externalUserId} ")
     public int updateQwExternalContactByUseridBlock(@Param("map") QwExternalContact qwExternalContact);

+ 8 - 8
fs-service-system/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java

@@ -108,14 +108,14 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
     QwWatchLogStatisticsListVO selectQwWatchLogByQwUserId(@Param("id")Long id,@Param("createTime") Date createTime);
 
     List<QwWatchLogStatisticsListVO> selectQwWatchLogByCompanyUserId(
-            @Param("companyUserIds") List<Long> companyUserIds,
-            @Param("sTime") String sTime,
-            @Param("dTime") String dTime,
-            @Param("project") Long project,
-            @Param("courseId") Long courseId,
-            @Param("videoId") Long videoId,
-            @Param("pageNum") Long pageNum,
-            @Param("pageSize") Long pageSize
+                                            @Param("companyUserIds") List<Long> companyUserIds,
+                                                                     @Param("sTime") String sTime,
+                                                                     @Param("dTime") String dTime,
+                                                                     @Param("project") Long project,
+                                                                     @Param("courseId") Long courseId,
+                                                                     @Param("videoId") Long videoId,
+                                            @Param("pageNum") Long pageNum,
+                                            @Param("pageSize") Long pageSize
     );
     Long selectQwWatchLogByCompanyUserIdCount(
             @Param("companyUserIds") List<Long> companyUserIds,

+ 1 - 1
fs-service-system/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -162,7 +162,7 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
     void qwExternalContactSyncAddAndDel();
 
     void qwExternalContactSyncAddRedis();
-    void qwExternalContactAddRedis();
+     void qwExternalContactAddRedis();
 
     void qwExternalContactAddAndDelByRedis();
 

+ 3 - 3
fs-service-system/src/main/java/com/fs/qw/service/impl/QwJsApiServiceImpl.java

@@ -59,9 +59,9 @@ public class QwJsApiServiceImpl implements IQwJsApiService {
             //获取企业微信当前登录人的userId
             QwJsapiTicketResult useridResult=new QwJsapiTicketResult();
 
-            // if (qwConfigSignatureParam.getIsGetUserId()==1){
-            useridResult = qwApiService.getQwUserid(qwConfigSignatureParam.getCode(), qwConfigSignatureParam.getCorpId(),appSecret);
-            //  }
+           // if (qwConfigSignatureParam.getIsGetUserId()==1){
+                useridResult = qwApiService.getQwUserid(qwConfigSignatureParam.getCode(), qwConfigSignatureParam.getCorpId(),appSecret);
+          //  }
             //获取登录员工的OAuth2 后获取url
             logger.info("获取企业当前登录人的userid"+useridResult);
             if (qwConfigSignatureParam.getIsGetUserId()==1 && useridResult.getErrcode()!=0){

+ 11 - 11
fs-service-system/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java

@@ -126,7 +126,7 @@ public class QwUserServiceImpl implements IQwUserService
             qwUserMapper.updateQwUser(qwUserAppKey);
             return R.ok();
         }else {
-            return R.error("当前授权码已被使用,请检查授权码是否正确");
+         return R.error("当前授权码已被使用,请检查授权码是否正确");
         }
     }
 
@@ -139,8 +139,8 @@ public class QwUserServiceImpl implements IQwUserService
         FsSysConfig config = configUtil.getSysConfig();
         String domainName = config.getHookUrl();
         HttpRequest.post(domainName+"/app/qwSop/qwLogin")
-                .body(JSON.toJSONString(loginParam),"application/json;charset=UTF-8")
-                .execute().body();
+               .body(JSON.toJSONString(loginParam),"application/json;charset=UTF-8")
+               .execute().body();
 //        HttpRequest.post("http://127.0.0.1:7771/app/qwSop/qwLogin")
 //                .body(JSON.toJSONString(loginParam),"application/json;charset=UTF-8")
 //                .execute().body();
@@ -180,8 +180,8 @@ public class QwUserServiceImpl implements IQwUserService
         FsSysConfig config = configUtil.getSysConfig();
         String domainName = config.getHookUrl();
         HttpRequest.post(domainName+"/app/qwSop/loginQwCodeUrl")
-                .body(JSON.toJSONString(loginParam),"application/json;charset=UTF-8")
-                .execute().body();
+                 .body(JSON.toJSONString(loginParam),"application/json;charset=UTF-8")
+                 .execute().body();
 //        HttpRequest.post("http://127.0.0.1:7771/app/qwSop/loginQwCodeUrl")
 //                .body(JSON.toJSONString(loginParam),"application/json;charset=UTF-8")
 //                .execute().body();
@@ -272,7 +272,7 @@ public class QwUserServiceImpl implements IQwUserService
 
         int i = qwUserMapper.updateQwUser(qwUser);
         if (i>0){
-            return R.ok("修改成功");
+         return R.ok("修改成功");
         }
         return R.error("修改失败");
 
@@ -292,8 +292,8 @@ public class QwUserServiceImpl implements IQwUserService
     }
 
     /**
-     * 根据appKey请求 绑定服务器
-     */
+    * 根据appKey请求 绑定服务器
+    */
     @Override
     public R qwBindCloudHost(String appKey) {
 
@@ -845,8 +845,8 @@ public class QwUserServiceImpl implements IQwUserService
 
 
     /**
-     * 解绑AI客服
-     */
+    * 解绑AI客服
+    */
     @Override
     public R relieveFastGptRoleById(Long id) {
         int i = qwUserMapper.relieveFastGptRoleById(id);
@@ -866,7 +866,7 @@ public class QwUserServiceImpl implements IQwUserService
     @Override
     public QwUserVO selectQwUserVOById(Long id) {
 
-        return   qwUserMapper.selectQwUserVOById(id);
+      return   qwUserMapper.selectQwUserVOById(id);
     }
 
 

+ 3 - 3
fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -70,7 +70,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
      * @param id 企微看课主键
      * @return 企微看课
      */
-    @Override
+     @Override
     public QwWatchLog selectQwWatchLogById(Long id)
     {
         return baseMapper.selectQwWatchLogById(id);
@@ -195,7 +195,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         // 统计销售下面的所有记录
         List<QwWatchLogStatisticsListVO> vos = qwWatchLogMapper
                 .selectQwWatchLogByCompanyUserId(userIds
-                        , param.getStartDate(),param.getEndDate(),param.getProject(),param.getCourseId(),param.getVideoId(),param.getPageNum(),param.getPageSize());
+                , param.getStartDate(),param.getEndDate(),param.getProject(),param.getCourseId(),param.getVideoId(),param.getPageNum(),param.getPageSize());
 
         for (QwWatchLogStatisticsListVO item : vos) {
             Company company = companyCacheService.selectCompanyById(item.getCompanyId());
@@ -298,7 +298,7 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         List<QwWatchLogAllStatisticsListVO> vos = qwWatchLogMapper
                 .selectQwWatchLogAllStatisticsListVONew(userIds, param.getStartDate(), param.getEndDate(),
                         param.getProject(),param.getCourseId(),param.getVideoId()
-                );
+                        );
         for (QwWatchLogAllStatisticsListVO item : vos) {
             if(ObjectUtils.isNotNull(item.getProject())){
                 String sysCourseProject = DictUtils.getDictLabel("sys_course_project", String.valueOf(item.getProject()));

+ 2 - 0
fs-service-system/src/main/java/com/fs/qw/vo/GetQwRepeatDataVO.java

@@ -1,8 +1,10 @@
 package com.fs.qw.vo;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 获取重粉数据VO

+ 8 - 8
fs-service-system/src/main/java/com/fs/qw/vo/QwExternalContactVO.java

@@ -15,13 +15,13 @@ public class QwExternalContactVO {
     private String userId;
 
     /**
-     *  属于用户名称
-     */
+    *  属于用户名称
+    */
     private String qwUserName;
 
     /**
-     * 员工所属部门
-     */
+    * 员工所属部门
+    */
     private String departmentName;
 
 
@@ -32,13 +32,13 @@ public class QwExternalContactVO {
     private Long companyUserId;
 
     /**
-     * 是否绑定企业微信
-     */
+    * 是否绑定企业微信
+    */
     private Long customerId;
 
     /**
-     * CRM 绑定的小程序id
-     */
+    * CRM 绑定的小程序id
+    */
     private Long miniUserId;
 
     /** 名称 */

+ 2 - 1
fs-service-system/src/main/java/com/fs/qw/vo/QwWatchLogAllStatisticsListVO.java

@@ -96,7 +96,6 @@ public class QwWatchLogAllStatisticsListVO {
     private Long videoId;
     private String videoName;
 
-
     private Long companyId;
 
     private Long companyUserId;
@@ -104,4 +103,6 @@ public class QwWatchLogAllStatisticsListVO {
     private Long fsUserId;
 
     private String fsUserName;
+
+
 }

+ 4 - 4
fs-service-system/src/main/java/com/fs/qwApi/service/impl/QwApiServiceImpl.java

@@ -45,7 +45,7 @@ import java.util.concurrent.TimeUnit;
 public class QwApiServiceImpl implements QwApiService {
 
 
-    @Autowired
+      @Autowired
     IQwCompanyService iQwCompanyService;
 //    @Autowired
 //    ICompanyConfigService companyConfigService;
@@ -1465,8 +1465,8 @@ public class QwApiServiceImpl implements QwApiService {
 //        String bookSuiteTicket = (String) redisCache.getCacheObject("qwServer:bookServer_suite_ticket");
 //
 //        //获取通讯录的suite_token(所有企业通用suite_token)
-    ////        CompanyConfig bookServerConfig = companyConfigService.selectCompanyConfigByServerKey("sys:qwBookServer:config");
-    ////        QWCompanyConfig qwBookServerConfig = JSON.parseObject(bookServerConfig.getConfigValue(), QWCompanyConfig.class);
+////        CompanyConfig bookServerConfig = companyConfigService.selectCompanyConfigByServerKey("sys:qwBookServer:config");
+////        QWCompanyConfig qwBookServerConfig = JSON.parseObject(bookServerConfig.getConfigValue(), QWCompanyConfig.class);
 //
 //        QwSuiteTokenParams qwSuiteTokenParams=new QwSuiteTokenParams();
 //        qwSuiteTokenParams.setSuite_id(qwBookServerConfig.getSuiteID());
@@ -1692,7 +1692,7 @@ public class QwApiServiceImpl implements QwApiService {
     public QwUseridResult getuseridBymobile(QwUseridBymobileParam param, String corpId) {
 
         String json = sendPost(QwApiConfig.getuseridBymobile, param,corpId);
-        QwUseridResult qwResult = JSON.parseObject(json, QwUseridResult.class);
+         QwUseridResult qwResult = JSON.parseObject(json, QwUseridResult.class);
 
         return qwResult;
     }

+ 2 - 2
fs-service-system/src/main/java/com/fs/sop/params/SendUserLogsInfoMsgParam.java

@@ -3,8 +3,8 @@ package com.fs.sop.params;
 import lombok.Data;
 
 /**
- * 一键群发
- */
+* 一键群发
+*/
 @Data
 public class SendUserLogsInfoMsgParam {
 

+ 6 - 6
fs-service-system/src/main/java/com/fs/sop/service/impl/CompanySopRoleServiceImpl.java

@@ -22,7 +22,7 @@ import com.fs.sop.service.ICompanySopRoleService;
 
 /**
  * 公司SOP权限Service业务层处理
- *
+ * 
  * @author fs
  * @date 2025-04-22
  */
@@ -34,7 +34,7 @@ public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper,
 
     /**
      * 查询公司SOP权限
-     *
+     * 
      * @param id 公司SOP权限主键
      * @return 公司SOP权限
      */
@@ -64,7 +64,7 @@ public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper,
 
     /**
      * 新增公司SOP权限
-     *
+     * 
      * @param companySopRole 公司SOP权限
      * @return 结果
      */
@@ -75,7 +75,7 @@ public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper,
 
     /**
      * 修改公司SOP权限
-     *
+     * 
      * @param companySopRole 公司SOP权限
      * @return 结果
      */
@@ -98,7 +98,7 @@ public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper,
 
     /**
      * 批量删除公司SOP权限
-     *
+     * 
      * @param ids 需要删除的公司SOP权限主键
      * @return 结果
      */
@@ -110,7 +110,7 @@ public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper,
 
     /**
      * 删除公司SOP权限信息
-     *
+     * 
      * @param id 公司SOP权限主键
      * @return 结果
      */

+ 16 - 5
fs-service-system/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java

@@ -7,6 +7,7 @@ import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.PubFun;
+import com.fs.common.utils.StringUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.domain.FsUserCourseVideo;
@@ -32,6 +33,7 @@ import com.fs.sop.vo.VoiceVo;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -286,10 +288,14 @@ public class QwSopTempServiceImpl implements IQwSopTempService
     @Override
     public List<QwSopTempRedPackageVo> redList(String id) {
         List<QwSopTempDay> dayList = qwSopTempRulesService.listByTempIdAll(id);
-        if(dayList.isEmpty()){
+        if(CollectionUtils.isEmpty(dayList)){
             return Collections.emptyList();
         }
-        List<QwSopTempRules> rules = dayList.stream().flatMap(e -> e.getList().stream()).collect(Collectors.toList());
+        List<QwSopTempRules> rules = dayList.stream()
+                .filter(e->e!= null && e.getList()!=null)
+                .flatMap(e -> e.getList().stream())
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
         if(rules.isEmpty()){
             return Collections.emptyList();
         }
@@ -297,7 +303,8 @@ public class QwSopTempServiceImpl implements IQwSopTempService
         Map<Long, FsUserCourseVideoRedPackage> redMap = PubFun.listToMapByGroupObject(redPackageList, FsUserCourseVideoRedPackage::getVideoId);
         List<FsUserCourseVideo> videoList = fsUserCourseVideoMapper.selectVideoByCourseId(rules.get(0).getCourseId());
         Map<Long, FsUserCourseVideo> videoMap = PubFun.listToMapByGroupObject(videoList, FsUserCourseVideo::getVideoId);
-        return rules.stream().filter(e -> redMap.containsKey(e.getVideoId()) && videoMap.containsKey(e.getVideoId())).map(e -> {
+        return rules.stream()
+                .filter(e -> e.getVideoId() != null && redMap.containsKey(e.getVideoId()) && videoMap.containsKey(e.getVideoId())).map(e -> {
             FsUserCourseVideoRedPackage red = redMap.get(e.getVideoId());
             FsUserCourseVideo video = videoMap.get(e.getVideoId());
             QwSopTempRedPackageVo vo = new QwSopTempRedPackageVo();
@@ -414,12 +421,16 @@ public class QwSopTempServiceImpl implements IQwSopTempService
     public QwSopTempDay selectRulesInfo(Long id) {
         QwSopTempDay day = qwSopTempDayService.info(id);
         List<QwSopTempRules> rulesList = qwSopTempRulesService.listByDayId(id);
-        if(!rulesList.isEmpty()){
+        if(CollectionUtils.isNotEmpty(rulesList)){
             List<QwSopTempContent> contentList = qwSopTempContentService.listByRulesIds(PubFun.listToNewList(rulesList, QwSopTempRules::getId));
             Map<Long, List<QwSopTempContent>> contentMap = PubFun.listToMapByGroupList(contentList, QwSopTempContent::getRulesId);
             rulesList.forEach(e -> {
                 List<QwSopTempContent> contents = contentMap.get(e.getId());
-                e.setSetting(contents.stream().map(c -> JSON.parseObject(c.getContent())).collect(Collectors.toList()));
+                if(CollectionUtils.isNotEmpty(contents)){
+                    e.setSetting(contents.stream()
+                            .filter(c-> c!=null && StringUtils.isNotBlank(c.getContent()))
+                            .map(c -> JSON.parseObject(c.getContent())).collect(Collectors.toList()));
+                }
             });
         }
         day.setList(rulesList);

+ 55 - 55
fs-service-system/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -152,7 +152,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
     @Override
     public List<SopUserLogsInfo> selectSopUserLogsInfoList(SopUserLogsInfo info) {
-        return  sopUserLogsInfoMapper.selectSopUserLogsInfoList(info);
+     return  sopUserLogsInfoMapper.selectSopUserLogsInfoList(info);
     }
     @Override
     public List<SopUserLogsInfoVOE> selectSopUserLogsInfoListVO(SopUserLogsInfo info) {
@@ -269,64 +269,64 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
         try {
 
-            //用于查询
-            SopUserLogs userLogs=new SopUserLogs();
-            userLogs.setSopId(param.getSopId());
-            userLogs.setQwUserId(param.getQwUserId());
-            userLogs.setCorpId(param.getCorpId());
-            userLogs.setStatus(1);
-            userLogs.setStartTime(param.getParamTime());
-
-            String  unionSopStartId = sopUserLogsService.selectSopUserLogsByUpdate(userLogs);
-
-            BatchSopUserLogsInfoParamU infoParamU=new BatchSopUserLogsInfoParamU();
-            infoParamU.setIds(param.getIds());
-            //查询sop任务开始时间营期表 是否有这个营期
-            if (!StringUtil.strIsNullOrEmpty(unionSopStartId)){
-                infoParamU.setUserLogsId(unionSopStartId);
-                if (param.getIds().length>0){
-                    batchUpdateSopUserLogsInfoToTime(infoParamU);
-                }
-
-            }
-            else {
-                //如果查不出来营期 ,则新建营期
-                //查询sop的模板id
-                QwSop qwSop = qwSopService.selectQwSopById(param.getSopId());
-
-                //查询这个sop任务的员工的信息
-                QwUser qwUser = qwUserMapper.selectQwUserByQwUseridAndCorpId(param.getQwUserId(), param.getCorpId());
-
-                SopUserLogsParamByDate userLogsParamByDate = new SopUserLogsParamByDate();
-                userLogsParamByDate.setSopId(param.getSopId());
-                userLogsParamByDate.setSopTempId(qwSop.getTempId());
-                userLogsParamByDate.setQwUserId(param.getQwUserId());
-                userLogsParamByDate.setCorpId(param.getCorpId());
-                userLogsParamByDate.setStartTime(param.getParamTime());
-                userLogsParamByDate.setStatus(1);
-                userLogsParamByDate.setUserId(qwUser.getId()+"|"+qwUser.getCompanyUserId()+"|"+qwUser.getCompanyId());
-
-                //如果没有这个营期没有就先插入
-                int i1 = sopUserLogsService.insertSopUserLogsByDate(userLogsParamByDate);
-                if (i1>0){
-                    userLogs.setSopTempId(qwSop.getTempId());
-                    //获取新的
-                    String  unionSopStartIdNew = sopUserLogsService.selectSopUserLogsByUnionSopId(userLogs);
-                    infoParamU.setUserLogsId(unionSopStartIdNew);
-
+                //用于查询
+                SopUserLogs userLogs=new SopUserLogs();
+                userLogs.setSopId(param.getSopId());
+                userLogs.setQwUserId(param.getQwUserId());
+                userLogs.setCorpId(param.getCorpId());
+                userLogs.setStatus(1);
+                userLogs.setStartTime(param.getParamTime());
+
+                String  unionSopStartId = sopUserLogsService.selectSopUserLogsByUpdate(userLogs);
+
+                 BatchSopUserLogsInfoParamU infoParamU=new BatchSopUserLogsInfoParamU();
+                    infoParamU.setIds(param.getIds());
+                //查询sop任务开始时间营期表 是否有这个营期
+                if (!StringUtil.strIsNullOrEmpty(unionSopStartId)){
+                    infoParamU.setUserLogsId(unionSopStartId);
                     if (param.getIds().length>0){
                         batchUpdateSopUserLogsInfoToTime(infoParamU);
                     }
 
                 }
+                else {
+                    //如果查不出来营期 ,则新建营期
+                    //查询sop的模板id
+                    QwSop qwSop = qwSopService.selectQwSopById(param.getSopId());
+
+                    //查询这个sop任务的员工的信息
+                    QwUser qwUser = qwUserMapper.selectQwUserByQwUseridAndCorpId(param.getQwUserId(), param.getCorpId());
+
+                    SopUserLogsParamByDate userLogsParamByDate = new SopUserLogsParamByDate();
+                    userLogsParamByDate.setSopId(param.getSopId());
+                    userLogsParamByDate.setSopTempId(qwSop.getTempId());
+                    userLogsParamByDate.setQwUserId(param.getQwUserId());
+                    userLogsParamByDate.setCorpId(param.getCorpId());
+                    userLogsParamByDate.setStartTime(param.getParamTime());
+                    userLogsParamByDate.setStatus(1);
+                    userLogsParamByDate.setUserId(qwUser.getId()+"|"+qwUser.getCompanyUserId()+"|"+qwUser.getCompanyId());
+
+                    //如果没有这个营期没有就先插入
+                    int i1 = sopUserLogsService.insertSopUserLogsByDate(userLogsParamByDate);
+                    if (i1>0){
+                        userLogs.setSopTempId(qwSop.getTempId());
+                        //获取新的
+                        String  unionSopStartIdNew = sopUserLogsService.selectSopUserLogsByUnionSopId(userLogs);
+                        infoParamU.setUserLogsId(unionSopStartIdNew);
+
+                        if (param.getIds().length>0){
+                            batchUpdateSopUserLogsInfoToTime(infoParamU);
+                        }
 
+                    }
 
 
-            }
-        } catch (DuplicateKeyException e) {
-            return R.error().put("msg", "修改营期失败:目标营期已经有此客户,请检查客户信息 是否重复,重复请联系超管 删除此营期数据");
-        } catch (Exception e) {
-            return R.error().put("msg", "修改营期失败:" + e.getMessage());
+
+                }
+            } catch (DuplicateKeyException e) {
+                return R.error().put("msg", "修改营期失败:目标营期已经有此客户,请检查客户信息 是否重复,重复请联系超管 删除此营期数据");
+            } catch (Exception e) {
+                return R.error().put("msg", "修改营期失败:" + e.getMessage());
         }
 
         return R.ok();
@@ -666,11 +666,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
     }
 
     private String createLinkByMiniApp(QwSopCourseFinishTempSetting.Setting setting, String corpId, Date sendTime,
-                                       Integer courseId, Integer videoId, String qwUserId,
-                                       String companyUserId, String companyId, Long externalId,CourseConfig config,Long FsUserId) {
+                                     Integer courseId, Integer videoId, String qwUserId,
+                                     String companyUserId, String companyId, Long externalId,CourseConfig config,Long FsUserId) {
 
         FsCourseLink link = createFsCourseLink(corpId, sendTime, courseId, videoId, qwUserId,
-                companyUserId, companyId, externalId,3);
+                                                companyUserId, companyId, externalId,3);
 
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link,courseMap);
@@ -716,7 +716,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         byAppVO.setSortLink(sortLink);
         byAppVO.setAppMsgLink(appMsgLink);
 
-        //异步生成app链接记录
+            //异步生成app链接记录
         asyncSopTestService.createFsCourseSopAppLink(link.getLink(),sendTime,updateTime,companyId,companyUserId,qwUserId,
                 qwUserName,corpId,courseId,setting.getLinkTitle(),setting.getLinkImageUrl(),videoId,
                 setting.getLinkDescribe(),appMsgLink,externalId);

+ 44 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsUserCompanyUser.java

@@ -0,0 +1,44 @@
+package com.fs.store.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 微信用户和销售关系对象 fs_user_company_user
+ *
+ * @author fs
+ * @date 2025-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCompanyUser extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 用户id(关联fs_user表user_id) */
+    @Excel(name = "用户id", readConverterExp = "关=联fs_user表user_id")
+    private Long userId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 公司ID */
+    @Excel(name = "公司ID")
+    private Long companyId;
+
+    /** 是否重粉,1-是;0-否 */
+    @Excel(name = "是否重粉,1-是;0-否")
+    private Integer isRepeatFans;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "重粉所属销售,多个用逗号隔开")
+    private String repeatCompanyUserName;
+
+
+}

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreProductAttrValueMapper.java

@@ -27,7 +27,7 @@ public interface FsStoreProductAttrValueMapper
      * @param id 商品属性值ID
      * @return 商品属性值
      */
-    public FsStoreProductAttrValue selectFsStoreProductAttrValueById(Long id);
+        public FsStoreProductAttrValue selectFsStoreProductAttrValueById(Long id);
 
     /**
      * 查询商品属性值列表

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreProductMapper.java

@@ -192,7 +192,7 @@ public interface FsStoreProductMapper
             "and find_in_set(#{companyIds}, company_ids) " +
             "</if>" +
             "</script>"})
-    Long selectFsStoreProductCount(@Param("type") int type,@Param("companyIds") Long companyIds);
+    Long selectFsStoreProductCompanyCount(@Param("type") int type,@Param("companyIds") Long companyIds);
 
     @Select({"<script> " +
             "select * from fs_store_product where find_in_set(product_id,#{ids})  " +

+ 78 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCompanyUserMapper.java

@@ -0,0 +1,78 @@
+package com.fs.store.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.store.domain.FsUserCompanyUser;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 微信用户和销售关系Mapper接口
+ *
+ * @author fs
+ * @date 2025-05-09
+ */
+public interface FsUserCompanyUserMapper extends BaseMapper<FsUserCompanyUser>{
+    /**
+     * 查询微信用户和销售关系
+     *
+     * @param id 微信用户和销售关系主键
+     * @return 微信用户和销售关系
+     */
+    FsUserCompanyUser selectFsUserCompanyUserById(Long id);
+
+    /**
+     * 查询微信用户和销售关系列表
+     *
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 微信用户和销售关系集合
+     */
+    List<FsUserCompanyUser> selectFsUserCompanyUserList(FsUserCompanyUser fsUserCompanyUser);
+
+    /**
+     * 新增微信用户和销售关系
+     *
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 结果
+     */
+    int insertFsUserCompanyUser(FsUserCompanyUser fsUserCompanyUser);
+
+    /**
+     * 修改微信用户和销售关系
+     *
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 结果
+     */
+    int updateFsUserCompanyUser(FsUserCompanyUser fsUserCompanyUser);
+
+    /**
+     * 删除微信用户和销售关系
+     *
+     * @param id 微信用户和销售关系主键
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserById(Long id);
+
+    /**
+     * 批量删除微信用户和销售关系
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserByIds(Long[] ids);
+
+    /**
+     * 获取当前销售的所有重粉会员
+     * @param companyUserId
+     * @return
+     */
+    @Select("select user_id from fs_user_company_user where company_user_id = #{userId} and is_repeat_fans = 1 ")
+    List<FsUserCompanyUser> selectRepeatUser(Long companyUserId);
+
+    /**
+     * 获取会员的重粉的所属销售
+     * @param userIds 用户会员ids
+     * @return
+     */
+    List<FsUserCompanyUser> selectRepeatCompanyUserName(@Param("userIds") List<Long> userIds);
+}

+ 6 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -61,4 +61,10 @@ public interface FsUserCourseCountMapper
     public int deleteFsUserCourseCountByIds(Long[] ids);
 
     FsUserCourseCount findByUserId(@Param("userId") Long userId);
+
+    /**
+     * 往看课统计表中插入数据
+     */
+    void insertFsUserCourseCountTask();
+
 }

+ 8 - 1
fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -77,7 +77,7 @@ public interface FsUserMapper
             "<if test='maps.isPromoter != null  and  maps.isPromoter !=\"\"'> and u.is_promoter = #{maps.isPromoter}</if>" +
             " order by user_id desc "+
             "</script>"}
-    )
+            )
     public List<FSUserVO> selectFsUserVOList(@Param("maps") FsUser fsUser);
 
     /**
@@ -287,4 +287,11 @@ public interface FsUserMapper
      * @return  list
      */
     List<OptionsVO> selectUserListByMap(@Param("params") Map<String, Object> params);
+
+    /**
+     * 查询重粉用户是否存在
+     * @param userIds 会员ids
+     * @return
+     */
+    Integer selectFsUserByUserIds(@Param("userIds") String[] userIds);
 }

+ 61 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserCompanyUserService.java

@@ -0,0 +1,61 @@
+package com.fs.store.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.store.domain.FsUserCompanyUser;
+
+/**
+ * 微信用户和销售关系Service接口
+ * 
+ * @author fs
+ * @date 2025-05-09
+ */
+public interface IFsUserCompanyUserService extends IService<FsUserCompanyUser>{
+    /**
+     * 查询微信用户和销售关系
+     * 
+     * @param id 微信用户和销售关系主键
+     * @return 微信用户和销售关系
+     */
+    FsUserCompanyUser selectFsUserCompanyUserById(Long id);
+
+    /**
+     * 查询微信用户和销售关系列表
+     * 
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 微信用户和销售关系集合
+     */
+    List<FsUserCompanyUser> selectFsUserCompanyUserList(FsUserCompanyUser fsUserCompanyUser);
+
+    /**
+     * 新增微信用户和销售关系
+     * 
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 结果
+     */
+    int insertFsUserCompanyUser(FsUserCompanyUser fsUserCompanyUser);
+
+    /**
+     * 修改微信用户和销售关系
+     * 
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 结果
+     */
+    int updateFsUserCompanyUser(FsUserCompanyUser fsUserCompanyUser);
+
+    /**
+     * 批量删除微信用户和销售关系
+     * 
+     * @param ids 需要删除的微信用户和销售关系主键集合
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserByIds(Long[] ids);
+
+    /**
+     * 删除微信用户和销售关系信息
+     * 
+     * @param id 微信用户和销售关系主键
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserById(Long id);
+}

+ 5 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserCourseCountService.java

@@ -60,4 +60,9 @@ public interface IFsUserCourseCountService
     public int deleteFsUserCourseCountById(Long id);
 
     FsUserCourseCount findByUserId(Long userId);
+
+    /**
+     * 往看课统计表中插入数据
+     */
+    void insertFsUserCourseCountTask();
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -20,6 +20,7 @@ import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
 import com.fs.store.vo.h5.*;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -145,6 +146,13 @@ public interface IFsUserService
 
     UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag);
 
+    /**
+     * 查询重粉用户是否存在
+     * @param userIds
+     * @return
+     */
+    Integer selectFsUserByUserIds(@Param("userIds") String[] userIds);
+
     Boolean disabledUser(String[] ids, boolean status);
 
     void transfer(FsUserTransferParamDTO param);

+ 3 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -303,7 +303,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
 //        request.setRefund_state(1);
 //        BaseResponse response=erpOrderService.refundUpdate(request);
 //        if(response.getSuccess()){
-        return R.ok();
+            return R.ok();
 //        }
 //        else{
 //            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -384,7 +384,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
         List<FsStoreAfterSalesQueryVO>  list=fsStoreAfterSalesMapper.selectFsStoreAfterSalesListQuery(storeAfterSalesParam);
         for(FsStoreAfterSalesQueryVO vo:list){
             FsStoreAfterSalesItem map=new FsStoreAfterSalesItem();
-            map.setStoreAfterSalesId(vo.getId());
+             map.setStoreAfterSalesId(vo.getId());
             List<FsStoreAfterSalesItem>  items=afterSalesItemService.selectFsStoreAfterSalesItemList(map);
             vo.setItems(items);
         }
@@ -532,7 +532,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
 
     @Override
     public synchronized R refundMoney(FsStoreAfterSalesRefundParam param) {
-        return refundStoreMoney(param);
+       return refundStoreMoney(param);
     }
     @Transactional
     R refundStoreMoney(FsStoreAfterSalesRefundParam param){

+ 78 - 78
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -869,22 +869,22 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         if(order!=null){
             FsExpress express=expressService.selectFsExpressByOmsCode(deliverCode);
             if(express!=null){
-                order.setDeliveryName(deliverName);
-                order.setDeliverySn(express.getCode());
-                order.setDeliveryId(deliveryId);
-                order.setDeliverySendTime(new Date());
-                fsStoreOrderMapper.updateFsStoreOrder(order);
-                orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-                        OrderLogEnum.DELIVERY_GOODS.getDesc());
-                //订阅物流回调
-                String lastFourNumber = "";
-                if (express.getCode().equals(ShipperCodeEnum.SF.getValue())) {
-                    lastFourNumber = order.getUserPhone();
-                    if (lastFourNumber.length() == 11) {
-                        lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-                    }
+            order.setDeliveryName(deliverName);
+            order.setDeliverySn(express.getCode());
+            order.setDeliveryId(deliveryId);
+            order.setDeliverySendTime(new Date());
+            fsStoreOrderMapper.updateFsStoreOrder(order);
+            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                    OrderLogEnum.DELIVERY_GOODS.getDesc());
+            //订阅物流回调
+            String lastFourNumber = "";
+            if (express.getCode().equals(ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
                 }
-                expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
+            }
+            expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
             }
         }
     }
@@ -1275,62 +1275,62 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     public String payConfirm(Integer type,Long orderId,String payCode,String tradeNo,String bankTransactionId,String bankSerialNo) {
         //支付订单
 //        try {
-        FsStoreOrder order=null;
-        if(type.equals(1)){
-            FsStorePayment storePayment=paymentService.selectFsStorePaymentByCode(payCode);
-            if(storePayment==null||!storePayment.getStatus().equals(0)){
-                return "";
-            }
-            FsStorePayment storePaymentMap=new FsStorePayment();
-            storePaymentMap.setPaymentId(storePayment.getPaymentId());
-            storePaymentMap.setStatus(1);
-            storePaymentMap.setPayTime(new Date());
-            storePaymentMap.setTradeNo(tradeNo);
-            storePaymentMap.setBankSerialNo(bankSerialNo);
-            storePaymentMap.setBankTransactionId(bankTransactionId);
-            paymentService.updateFsStorePayment(storePaymentMap);
-            order=fsStoreOrderMapper.selectFsStoreOrderById(storePayment.getOrderId());
-            if(order!=null&&!order.getStatus().equals(OrderInfoEnum.STATUS_0.getValue())){
-                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return "";
-            }
-            if(order!=null&&!order.getPaid().equals(0)){
-                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return "";
-            }
-        }
-        else if(type.equals(2)){
-            //货到付款
-            order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
-            if(!order.getStatus().equals(OrderInfoEnum.STATUS_0.getValue())){
-                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return "";
-            }
-        }
-        //写入公司佣金 当有归属公司时只进行公司分佣
-        if(order.getCompanyId()!=null&&order.getCompanyId()>0){
-            companyService.addCompanyTuiMoney(order);
-            //没有归属公司对个人分佣
-        }
-        else if (order.getIsPackage()!=1&&order.getTuiUserId()!=null&&order.getTuiUserId()>0){
-            //处理佣金 套餐不分佣金
-            FsStoreOrderItem orderItemMap=new FsStoreOrderItem();
-            orderItemMap.setOrderId(order.getId());
-            List<FsStoreOrderItem> items= storeOrderItemService.selectFsStoreOrderItemList(orderItemMap);
-            userService.addTuiMoney(order,items);
-        }
-        //增加用户购买次数
-        userService.incPayCount(order.getUserId());
-        //增加状态
-        orderStatusService.create(order.getId(), OrderLogEnum.PAY_ORDER_SUCCESS.getValue(),
-                OrderLogEnum.PAY_ORDER_SUCCESS.getDesc());
-        FsStoreOrder storeOrder = new FsStoreOrder();
-        storeOrder.setId(order.getId());
-        storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue());
-        storeOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
-        storeOrder.setPayTime(new Date());
-        fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
-        //非处方直接提交OMS
+            FsStoreOrder order=null;
+            if(type.equals(1)){
+                FsStorePayment storePayment=paymentService.selectFsStorePaymentByCode(payCode);
+                if(storePayment==null||!storePayment.getStatus().equals(0)){
+                    return "";
+                }
+                FsStorePayment storePaymentMap=new FsStorePayment();
+                storePaymentMap.setPaymentId(storePayment.getPaymentId());
+                storePaymentMap.setStatus(1);
+                storePaymentMap.setPayTime(new Date());
+                storePaymentMap.setTradeNo(tradeNo);
+                storePaymentMap.setBankSerialNo(bankSerialNo);
+                storePaymentMap.setBankTransactionId(bankTransactionId);
+                paymentService.updateFsStorePayment(storePaymentMap);
+                order=fsStoreOrderMapper.selectFsStoreOrderById(storePayment.getOrderId());
+                if(order!=null&&!order.getStatus().equals(OrderInfoEnum.STATUS_0.getValue())){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return "";
+                }
+                if(order!=null&&!order.getPaid().equals(0)){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return "";
+                }
+            }
+            else if(type.equals(2)){
+                //货到付款
+                order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+                if(!order.getStatus().equals(OrderInfoEnum.STATUS_0.getValue())){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return "";
+                }
+            }
+            //写入公司佣金 当有归属公司时只进行公司分佣
+            if(order.getCompanyId()!=null&&order.getCompanyId()>0){
+                companyService.addCompanyTuiMoney(order);
+                //没有归属公司对个人分佣
+            }
+            else if (order.getIsPackage()!=1&&order.getTuiUserId()!=null&&order.getTuiUserId()>0){
+                //处理佣金 套餐不分佣金
+                FsStoreOrderItem orderItemMap=new FsStoreOrderItem();
+                orderItemMap.setOrderId(order.getId());
+                List<FsStoreOrderItem> items= storeOrderItemService.selectFsStoreOrderItemList(orderItemMap);
+                userService.addTuiMoney(order,items);
+            }
+            //增加用户购买次数
+            userService.incPayCount(order.getUserId());
+            //增加状态
+            orderStatusService.create(order.getId(), OrderLogEnum.PAY_ORDER_SUCCESS.getValue(),
+                    OrderLogEnum.PAY_ORDER_SUCCESS.getDesc());
+            FsStoreOrder storeOrder = new FsStoreOrder();
+            storeOrder.setId(order.getId());
+            storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue());
+            storeOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
+            storeOrder.setPayTime(new Date());
+            fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+            //非处方直接提交OMS
 //            if(order.getIsPrescribe().equals(0)){
 //                createOmsOrder(order.getId());
 //            }
@@ -1396,13 +1396,13 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 //            erpOrder.setWarehouse_code("CQDS001");
 //        }
 //        else{
-        erpOrder.setWarehouse_code(wareHouseCode);
+            erpOrder.setWarehouse_code(wareHouseCode);
 //        }
 //        if(order.getStoreHouseCode().equals("YDSP001")){
 //            erpOrder.setShop_code("RunDayWuHan");
 //        }
 //        else{
-        erpOrder.setShop_code(sysConfig.getErpShopCode());
+            erpOrder.setShop_code(sysConfig.getErpShopCode());
 //        }
 //      erpOrder.setPost_fee(order.getTotalPostage().doubleValue());
         erpOrder.setSeller_memo(order.getMark());
@@ -2076,10 +2076,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     public List<FsStoreOrderPromotionExportVO> selectFsPromotionOrderListVOByExport(FsStoreOrderParam param) {
         List<FsStoreOrderPromotionExportVO> list = fsStoreOrderMapper.selectFsPromotionOrderListVOByExport(param);
         for (FsStoreOrderPromotionExportVO vo : list){
-            FsStoreOrderBrokerageVO brokerageVO = fsStoreOrderMapper.selectBrokerage(vo.getId());
-            vo.setBrokerage(brokerageVO.getBrokerage());
-            vo.setBrokerageTwo(brokerageVO.getBrokerageTwo());
-            vo.setBrokerageThree(brokerageVO.getBrokerageThree());
+           FsStoreOrderBrokerageVO brokerageVO = fsStoreOrderMapper.selectBrokerage(vo.getId());
+           vo.setBrokerage(brokerageVO.getBrokerage());
+           vo.setBrokerageTwo(brokerageVO.getBrokerageTwo());
+           vo.setBrokerageThree(brokerageVO.getBrokerageThree());
         }
         return list;
     }
@@ -2408,7 +2408,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                         } else {
                             //续件平均值且向上取整数
                             double average = Math.ceil(NumberUtil.div(NumberUtil.sub(templateDTO.getNumber(),
-                                            templateDTO.getFirst()),
+                                    templateDTO.getFirst()),
                                     templateDTO.getContinues().doubleValue()));
                             //最终邮费
                             storePostage = NumberUtil.add(firstPrice, NumberUtil.mul(average,

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreProductServiceImpl.java

@@ -656,7 +656,7 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService
 
     @Override
     public Long selectFsStoreProductCount(int type, Long companyId) {
-        return fsStoreProductMapper.selectFsStoreProductCount(type,companyId);
+        return fsStoreProductMapper.selectFsStoreProductCompanyCount(type,companyId);
     }
 
     @Override

+ 91 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCompanyUserServiceImpl.java

@@ -0,0 +1,91 @@
+package com.fs.store.service.impl;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.store.mapper.FsUserCompanyUserMapper;
+import com.fs.store.domain.FsUserCompanyUser;
+import com.fs.store.service.IFsUserCompanyUserService;
+
+/**
+ * 微信用户和销售关系Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-05-09
+ */
+@Service
+public class FsUserCompanyUserServiceImpl extends ServiceImpl<FsUserCompanyUserMapper, FsUserCompanyUser> implements IFsUserCompanyUserService {
+
+    /**
+     * 查询微信用户和销售关系
+     * 
+     * @param id 微信用户和销售关系主键
+     * @return 微信用户和销售关系
+     */
+    @Override
+    public FsUserCompanyUser selectFsUserCompanyUserById(Long id)
+    {
+        return baseMapper.selectFsUserCompanyUserById(id);
+    }
+
+    /**
+     * 查询微信用户和销售关系列表
+     * 
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 微信用户和销售关系
+     */
+    @Override
+    public List<FsUserCompanyUser> selectFsUserCompanyUserList(FsUserCompanyUser fsUserCompanyUser)
+    {
+        return baseMapper.selectFsUserCompanyUserList(fsUserCompanyUser);
+    }
+
+    /**
+     * 新增微信用户和销售关系
+     * 
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCompanyUser(FsUserCompanyUser fsUserCompanyUser)
+    {
+        return baseMapper.insertFsUserCompanyUser(fsUserCompanyUser);
+    }
+
+    /**
+     * 修改微信用户和销售关系
+     * 
+     * @param fsUserCompanyUser 微信用户和销售关系
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCompanyUser(FsUserCompanyUser fsUserCompanyUser)
+    {
+        return baseMapper.updateFsUserCompanyUser(fsUserCompanyUser);
+    }
+
+    /**
+     * 批量删除微信用户和销售关系
+     * 
+     * @param ids 需要删除的微信用户和销售关系主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCompanyUserByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserCompanyUserByIds(ids);
+    }
+
+    /**
+     * 删除微信用户和销售关系信息
+     * 
+     * @param id 微信用户和销售关系主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCompanyUserById(Long id)
+    {
+        return baseMapper.deleteFsUserCompanyUserById(id);
+    }
+}

+ 16 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.store.service.impl;
 
 import java.util.List;
 import com.fs.common.utils.DateUtils;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.store.mapper.FsUserCourseCountMapper;
@@ -20,6 +21,9 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
     @Autowired
     private FsUserCourseCountMapper fsUserCourseCountMapper;
 
+    @Autowired
+    private FsCourseWatchLogMapper fsCourseWatchLogMapper;
+
     /**
      * 查询用户看课统计
      *
@@ -98,4 +102,16 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
     public FsUserCourseCount findByUserId(Long userId) {
         return fsUserCourseCountMapper.findByUserId(userId);
     }
+
+    @Override
+    public void insertFsUserCourseCountTask() {
+        // 1、获取统计结果
+        // todo
+
+
+        // 2、分批插入数据
+
+
+
+    }
 }

+ 69 - 11
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.store.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.domain.R;
@@ -35,6 +36,7 @@ import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.enums.BillDetailEnum;
 import com.fs.store.mapper.FsStoreOrderMapper;
 import com.fs.store.mapper.FsStoreProductAttrValueMapper;
+import com.fs.store.mapper.FsUserCompanyUserMapper;
 import com.fs.store.mapper.FsUserMapper;
 import com.fs.store.param.SelectCusListPageParam;
 import com.fs.store.param.h5.CourseAnalysisParam;
@@ -112,6 +114,10 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Autowired
     private IQwExternalContactCacheService qwExternalContactCacheService;
+
+    @Autowired
+    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
+
     /**
      * 查询用户
      *
@@ -446,7 +452,27 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public List<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
-        return fsUserMapper.selectFsUserPageList(param);
+        List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageList(param);
+
+        // 获取当前销售所有重粉会员
+        List<FsUserCompanyUser> fsUserCompanyUsers = fsUserCompanyUserMapper.selectRepeatUser(param.getUserId());
+
+        if(!fsUserCompanyUsers.isEmpty()){
+            List<Long> userIds = fsUserCompanyUsers.stream().map(FsUserCompanyUser::getUserId).collect(Collectors.toList());
+            // 获取会员所属的重粉销售
+            List<FsUserCompanyUser> repeatCompanyUserNames = fsUserCompanyUserMapper.selectRepeatCompanyUserName(userIds);
+            Map<Long, String> map = repeatCompanyUserNames.stream().collect(Collectors.toMap(FsUserCompanyUser::getUserId, FsUserCompanyUser::getRepeatCompanyUserName));
+
+            return fsUserPageListVOS.stream().map(v -> {
+                FsUserPageListVO fsUserPageListVO = new FsUserPageListVO();
+                BeanUtils.copyProperties(v, fsUserPageListVO);
+                fsUserPageListVO.setRepeatCompanyUserName(map.get(v.getUserId()));
+                return fsUserPageListVO;
+            }).collect(Collectors.toList());
+
+        } else {
+            return fsUserPageListVOS;
+        }
     }
 
     @Override
@@ -545,6 +571,11 @@ public class FsUserServiceImpl implements IFsUserService
         return vo;
     }
 
+    @Override
+    public Integer selectFsUserByUserIds(String[] userIds) {
+        return fsUserMapper.selectFsUserByUserIds(userIds);
+    }
+
     @Override
     public Boolean disabledUser(String[] ids, boolean status) {
         boolean result;
@@ -750,31 +781,38 @@ public class FsUserServiceImpl implements IFsUserService
     @Transactional(rollbackFor = Exception.class)
     public ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param) {
         //查询用户
-        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
+         FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
         if (Objects.isNull(fsUser)){
-            return ResponseResult.fail(401,"未授权");
-        }
-        if (fsUser.getCompanyUserId() != null && !param.getCompanyUserId().equals(fsUser.getCompanyUserId())){
-            return ResponseResult.fail(500,"该用户已成为其他销售会员");
+            return ResponseResult.fail(404,"当前用户信息不存在");
         }
 
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
         if (Objects.isNull(companyUser)){
-            return ResponseResult.fail(500,"销售不存在");
+            return ResponseResult.fail(405,"销售不存在");
         }
 
-        // 关联销售
-        fsUser.setCompanyId(param.getCompanyId());
-        fsUser.setCompanyUserId(param.getCompanyUserId());
+        // 判断是否绑定了销售
+        FsUserCompanyUser fsUserCompanyUser = getFsUserCompanyUser(param, fsUser);
+        QueryWrapper<FsUserCompanyUser> queryWrapper = new QueryWrapper<FsUserCompanyUser>().eq("user_id", param.getUserId()).eq("company_user_id", param.getCompanyUserId());
+        Integer i = fsUserCompanyUserMapper.selectCount(queryWrapper);
+        if(i == 0) {
+            fsUserCompanyUserMapper.insertFsUserCompanyUser(fsUserCompanyUser);
+        }
 
+        // 关联销售
+        if(fsUser.getCompanyUserId() == null) {
+            fsUser.setCompanyId(param.getCompanyId());
+            fsUser.setCompanyUserId(param.getCompanyUserId());
+        }
         // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
         Company company = null;
         if(param.getCompanyId() != null) {
             company = companyMapper.selectCompanyById(param.getCompanyId());
         }
         // isDefaultBlack 值为1 ,表示需要加入小黑屋,否则不加
-        fsUser.setStatus((company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1);
+        int isDefaultBlack = company != null ? company.getFsUserIsDefaultBlack() : 0;
+        fsUser.setStatus(isDefaultBlack == 1 ? 0 : 1);
         fsUserMapper.updateFsUser(fsUser);
 
         // 不为空则添加新标签
@@ -794,9 +832,29 @@ public class FsUserServiceImpl implements IFsUserService
             companyTagUser.setCreateTime(new Date());
             companyTagUserMapper.insertCompanyTagUser(companyTagUser);
         }
+
+        //如果是设置了需要进入小黑屋,则需要返回提示,否则正常返回
+        if(isDefaultBlack == 1){
+            return ResponseResult.fail(402, "已成功注册,待管理审核");
+        }
         return ResponseResult.ok(Boolean.TRUE);
     }
 
+    // 判断是否绑定了销售
+    private static FsUserCompanyUser getFsUserCompanyUser(FsUserCourseBeMemberParam param, FsUser fsUser) {
+        FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
+        // 判断是否绑定了销售,如果已绑定,则需要标识为重粉,且放黑名单
+        if (fsUser.getCompanyUserId() != null && !fsUser.getCompanyUserId().equals(param.getCompanyUserId())) {
+            fsUserCompanyUser.setIsRepeatFans(1);
+        } else {
+            fsUserCompanyUser.setIsRepeatFans(0);
+        }
+        fsUserCompanyUser.setUserId(param.getUserId());
+        fsUserCompanyUser.setCompanyId(param.getCompanyId());
+        fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId());
+        return fsUserCompanyUser;
+    }
+
     /**
      * 查询会员选项列表
      * @param params    参数

+ 7 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java

@@ -84,4 +84,11 @@ public class FsUserPageListVO {
      * 是否宠粉
      */
     private Integer isRepeat;
+
+    @ApiModelProperty(value = "是否是重粉,1-是,0-否")
+    private int isRepeatFans;
+
+    @ApiModelProperty(value = "重粉所属销售,多个用逗号隔开")
+    private String repeatCompanyUserName;
+
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/system/oss/HuaweiCloudStorageService.java

@@ -43,7 +43,7 @@ public class HuaweiCloudStorageService extends CloudStorageService
         String objKey = generateUploadFileName(path);
         try {
             // 文件上传
-            com.obs.services.model.PutObjectRequest request = new PutObjectRequest(config.getHuaweiBucketName(), objKey,new ByteArrayInputStream(data));
+            PutObjectRequest request = new PutObjectRequest(config.getHuaweiBucketName(), objKey,new ByteArrayInputStream(data));
             client.putObject(request);
         } catch (ObsException e) {
             throw new ObsException("文件上传失败," + e.getErrorMessage());

+ 23 - 0
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -20,6 +20,7 @@ import com.fs.erp.service.IErpOrderService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
+import com.fs.kingbos.service.K9OrderService;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.service.PayService;
@@ -60,6 +61,8 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
+import static com.fs.kingbos.enums.OrderStatusEnum.NO_DELIVERED;
+
 
 @Api("商城接口")
 @RestController
@@ -104,6 +107,26 @@ public class StoreOrderController extends  AppBaseController {
     PayService ybPayService;
     @Autowired
     private HuiFuService huiFuService;
+    @Autowired
+    K9OrderService k9OrderService;
+
+
+    @ApiOperation("测试ERP")
+    @GetMapping("/test")
+    public R test(){
+        k9OrderService.addOmsOrder(172L);
+//        k9OrderService.refundOmsOrder(172L);
+        return R.ok();
+    }
+
+
+    @ApiOperation("测试ERP")
+    @GetMapping("/test2")
+    public R test2(){
+        k9OrderService.refundOmsOrder(172L);
+//        k9OrderService.refundOmsOrder(172L);
+        return R.ok();
+    }
 
 
     @Login

+ 1 - 1
fs-user-app/src/main/java/com/fs/core/config/DruidConfig.java

@@ -1,4 +1,4 @@
-//package com.fs.core.config;
+package com.fs.core.config;//package com.fs.core.config;
 //
 //import com.alibaba.druid.pool.DruidDataSource;
 //import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

+ 1 - 1
fs-user-app/src/main/resources/application.yml

@@ -25,7 +25,7 @@ fs:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8113
-  port: 8113
+  port: 7014
   servlet:
     # 应用的访问路径
     context-path: /