Преглед на файлове

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

# Conflicts:
#	fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
#	fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
caoliqin преди 2 месеца
родител
ревизия
1a10538ab9
променени са 34 файла, в които са добавени 795 реда и са изтрити 301 реда
  1. 6 0
      fs-common/src/main/java/com/fs/common/core/domain/BaseEntity.java
  2. 18 0
      fs-company/src/main/java/com/fs/company/controller/CompanyUserController.java
  3. 168 53
      fs-company/src/main/java/com/fs/qw/QwUserController.java
  4. 2 1
      fs-qw-task/src/main/java/com/fs/FsQwTaskApplication.java
  5. 2 2
      fs-qw-task/src/main/resources/application.yml
  6. 10 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyUser.java
  7. 7 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java
  8. 22 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  9. 16 0
      fs-service-system/src/main/java/com/fs/course/param/FsUserCourseRegisterParam.java
  10. 3 0
      fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  11. 32 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  12. 16 0
      fs-service-system/src/main/java/com/fs/his/vo/CitysAreaVO.java
  13. 4 2
      fs-service-system/src/main/java/com/fs/qw/domain/QwExternalContact.java
  14. 28 0
      fs-service-system/src/main/java/com/fs/qw/dto/QwUserByToolDTO.java
  15. 8 0
      fs-service-system/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  16. 10 0
      fs-service-system/src/main/java/com/fs/qw/param/QwCloudIPByCompanyParam.java
  17. 2 0
      fs-service-system/src/main/java/com/fs/qw/service/IQwUserService.java
  18. 17 15
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  19. 66 0
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  20. 5 0
      fs-service-system/src/main/java/com/fs/sop/mapper/SopUserLogsInfoMapper.java
  21. 12 1
      fs-service-system/src/main/java/com/fs/store/domain/FsUser.java
  22. 13 8
      fs-service-system/src/main/java/com/fs/store/mapper/FsCityMapper.java
  23. 12 8
      fs-service-system/src/main/java/com/fs/store/service/IFsCityService.java
  24. 2 1
      fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java
  25. 16 8
      fs-service-system/src/main/java/com/fs/store/service/impl/FsCityServiceImpl.java
  26. 8 1
      fs-service-system/src/main/resources/mapper/company/CompanyUserMapper.xml
  27. 9 1
      fs-service-system/src/main/resources/mapper/sop/SopUserLogsInfoMapper.xml
  28. 5 0
      fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml
  29. 8 0
      fs-user-app/src/main/java/com/fs/app/controller/CourseController.java
  30. 103 0
      fs-user-app/src/main/java/com/fs/core/config/DataSourceConfig.java
  31. 123 123
      fs-user-app/src/main/java/com/fs/core/config/DruidConfig.java
  32. 22 66
      fs-user-app/src/main/java/com/fs/core/config/MyBatisConfig.java
  33. 19 10
      fs-user-app/src/main/resources/application-dev.yml
  34. 1 1
      fs-user-app/src/main/resources/application.yml

+ 6 - 0
fs-common/src/main/java/com/fs/common/core/domain/BaseEntity.java

@@ -4,6 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
@@ -17,6 +19,7 @@ public class BaseEntity implements Serializable
     private static final long serialVersionUID = 1L;
 
     /** 搜索值 */
+    @TableField(exist = false)
     private String searchValue;
 
     /** 创建者 */
@@ -38,13 +41,16 @@ public class BaseEntity implements Serializable
 
     /** 开始时间 */
     @JsonIgnore
+    @TableField(exist = false)
     private String beginTime;
 
     /** 结束时间 */
     @JsonIgnore
+    @TableField(exist = false)
     private String endTime;
 
     /** 请求参数 */
+    @TableField(exist = false)
     private Map<String, Object> params;
 
     public String getSearchValue()

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

@@ -9,6 +9,7 @@ import com.fs.common.core.domain.R;
 
 import com.fs.common.utils.DomainUtil;
 import com.fs.company.domain.*;
+import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.service.*;
 import com.fs.company.vo.CompanyUserQwListVO;
@@ -325,4 +326,21 @@ public class CompanyUserController extends BaseController
         return R.ok().put("data",list);
     }
 
+    /**
+     * 获取区域
+     */
+    @GetMapping("/getCitysAreaList")
+    public R getCitysAreaList(){
+        return R.ok().put("data",companyUserService.getCitysAreaList());
+    }
+
+    /**
+     * 批量修改 销售的所属区域(临时的)
+     */
+    @PostMapping("/updateCompanyUserAreaList")
+    public R updateCompanyUserAreaList(@RequestBody CompanyUserAreaParam param)
+    {
+        return companyUserService.updateCompanyUserAreaList(param);
+    }
+
 }

+ 168 - 53
fs-company/src/main/java/com/fs/qw/QwUserController.java

@@ -3,17 +3,23 @@ package com.fs.qw;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
+import com.fs.common.constant.Constants;
 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.exception.ServiceException;
+import com.fs.common.exception.user.UserPasswordNotMatchException;
+import com.fs.common.utils.MessageUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.service.ICompanyUserService;
+import com.fs.core.manager.AsyncManager;
+import com.fs.core.manager.factory.AsyncFactory;
 import com.fs.fastGpt.domain.FastGptRole;
 import com.fs.fastGpt.mapper.FastGptRoleMapper;
 import com.fs.core.security.LoginUser;
@@ -38,10 +44,18 @@ import com.fs.voice.utils.StringUtil;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 企微用户Controller
@@ -78,6 +92,10 @@ public class QwUserController extends BaseController
 
     @Autowired
     private QwApiService qwApiService;
+
+    @Resource
+    private AuthenticationManager authenticationManager;
+
     /**
      * 查询企微员工列表
      */
@@ -95,8 +113,8 @@ public class QwUserController extends BaseController
 
 
     /**
-    * 直接授权key
-    */
+     * 直接授权key
+     */
     @PreAuthorize("@ss.hasPermi('qw:user:authAppKey')")
     @PostMapping("/authAppKey")
     public R authAppKey(@RequestBody QwUser param){
@@ -114,8 +132,8 @@ public class QwUserController extends BaseController
 
 
     /**
-    * 登录企业微信(发起登录)
-    */
+     * 登录企业微信(发起登录)
+     */
     @PreAuthorize("@ss.hasPermi('qw:user:login')")
     @PostMapping("/loginQwCode")
     public R loginQwCode(@RequestBody QwLoginParam loginParam){
@@ -140,8 +158,8 @@ public class QwUserController extends BaseController
     }
 
     /**
-    * 登录企业微信(传输验证信息)
-    */
+     * 登录企业微信(传输验证信息)
+     */
     @PreAuthorize("@ss.hasPermi('qw:user:login')")
     @PostMapping("/loginQwCodeMsg")
     public R loginQwCodeMsg(@RequestBody QwLoginParam loginParam){
@@ -167,8 +185,8 @@ public class QwUserController extends BaseController
 //    }
 //
     /**
-    * 查询企业微信登录状态
-    */
+     * 查询企业微信登录状态
+     */
     @PreAuthorize("@ss.hasPermi('qw:user:login')")
     @PostMapping("/getLoginQwStatus")
     public R getLoginQwStatus(@RequestBody QwLoginParam loginParam){
@@ -181,27 +199,62 @@ public class QwUserController extends BaseController
     }
 
     /**
-    * 企业微信员工账号 绑定 云主机
-    */
+     * 企业微信员工账号 绑定 云主机
+     */
     @PreAuthorize("@ss.hasPermi('qw:user:loginIp')")
+    @Log(title = "绑定 云主机", businessType = BusinessType.INSERT)
     @GetMapping("/qwBindCloudHost/{appKey}")
     public R qwBindCloudHost(@PathVariable("appKey") String appKey){
         return qwUserService.qwBindCloudHost(appKey);
     }
 
     /**
-    * 获取云主机的账密
+     * 获取云主机的账密
      *
-    */
+     */
     @PreAuthorize("@ss.hasPermi('qw:user:cloudAP')")
     @PostMapping("/selectCloudAP")
     public R selectCloudAP(@RequestBody QwCloudAPParam param) throws Exception {
         return qwUserService.selectCloudAP(param);
     }
+
+    /**
+     * 根据销售账号密码 获取 他的所有企业微信账号以及云主机和账号密码
+     */
+    @PostMapping("/selectCloudByCompany")
+    public R selectCloudByCompany(@RequestBody QwCloudIPByCompanyParam param) throws Exception {
+
+        // 用户验证
+        Authentication authentication = null;
+        try
+        {
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager
+                    .authenticate(new UsernamePasswordAuthenticationToken(param.getCompanyAdmin(), param.getCompanyPassWord()));
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(0l,param.getCompanyAdmin(), Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(0l,param.getCompanyAdmin(), Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        LoginUser loginUser=(LoginUser) authentication.getPrincipal();
+
+        return qwUserService.selectCloudByCompany(loginUser.getUser().getCompanyId(),loginUser.getUser().getUserId());
+    }
+
+
     /**
      * 企业微信员工账号 绑定 云主机
      */
-//    @PreAuthorize("@ss.hasPermi('qw:user:loginIp')")
+    @PreAuthorize("@ss.hasPermi('qw:user:bindIp')")
     @GetMapping("/qwBindCloudHostByIp/{appKey}/{IP}")
     public R qwBindCloudHostByIp(@PathVariable("appKey") String appKey,@PathVariable("IP") String IP){
         return qwUserService.qwBindCloudHostByIp(appKey,IP);
@@ -211,6 +264,7 @@ public class QwUserController extends BaseController
      * 企业微信员工账号 解除绑定 云主机
      */
     @PreAuthorize("@ss.hasPermi('qw:user:loginIpOut')")
+    @Log(title = "解除绑定 云主机", businessType = BusinessType.UPDATE)
     @GetMapping("/qwUnbindCloudHost/{appKey}")
     public R qwUnbindCloudHost(@PathVariable("appKey") String appKey){
         return qwUserService.qwUnbindCloudHost(appKey);
@@ -277,8 +331,8 @@ public class QwUserController extends BaseController
         return util.exportExcel(list, "企微用户数据");
     }
     /**
-    * 查询企微员工列表-用于员工管理绑定
-    */
+     * 查询企微员工列表-用于员工管理绑定
+     */
     @GetMapping("/getQwUserList")
     public R getQwUserList()
     {
@@ -318,8 +372,8 @@ public class QwUserController extends BaseController
         return AjaxResult.success(qwUserService.selectQwUserVOById(id));
     }
     /**
-    * 批量查询 企微用户详细信息
-    */
+     * 批量查询 企微用户详细信息
+     */
     @GetMapping(value = "/getInfo/{ids}")
     public AjaxResult getInfoByIds(@PathVariable("ids") Long[] ids)
     {
@@ -364,7 +418,22 @@ public class QwUserController extends BaseController
         }
         return R.ok();
     }
-
+    @RepeatSubmit
+    @PreAuthorize("@ss.hasPermi('qw:user:sync')")
+    @Log(title = "企微用户", businessType = BusinessType.INSERT)
+    @PostMapping("syncName/{corpId}")
+    public R syncName(@PathVariable String corpId)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Company company = loginUser.getCompany();
+        List<String> strings = qwCompanyMapper.selectQwCompanyCorpIdListByCompanyId(company.getCompanyId());
+        for (String string : strings) {
+            if (string.equals(corpId)){
+                qwUserService.syncQwUserName(string);
+            }
+        }
+        return R.ok();
+    }
     /**
      * 绑定AI客服
      */
@@ -380,11 +449,11 @@ public class QwUserController extends BaseController
         FastGptRole role = fastGptRoleMapper.selectFastGptRoleByRoleId(param.getFastGptRoleId());
 
         if (role.getBindCorpId()!=null){
-           if (role.getBindCorpId().equals(param.getCorpId())){
-               qwUserService.updateQwUser(qwUser);
-           }else {
-               return R.error("该角色已绑定其他企业");
-           }
+            if (role.getBindCorpId().equals(param.getCorpId())){
+                qwUserService.updateQwUser(qwUser);
+            }else {
+                return R.error("该角色已绑定其他企业");
+            }
         }else {
             int i = qwUserService.updateQwUser(qwUser);
 
@@ -421,48 +490,83 @@ public class QwUserController extends BaseController
     @Log(title = "企微用户", businessType = BusinessType.UPDATE)
     @PutMapping("/bindQwUser")
     @RepeatSubmit
-    public R bindQwUser(@RequestBody QwUserBingParam qwUser)
+    public R bindQwUser(@RequestBody QwUserBingParam qwUserParam)
     {
-        CompanyUser companyUser = companyUserService.selectCompanyUserById(qwUser.getCompanyUserId());
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(qwUserParam.getCompanyUserId());
+
+        String qwUserIdCompanyStr = companyUser.getQwUserId();
+        Set<String> qwUserIdCompanySet = new HashSet<>();
+        if (!StringUtil.strIsNullOrEmpty(qwUserIdCompanyStr)) {
+            String[] qwUserId = qwUserIdCompanyStr.split(",");
+            qwUserIdCompanySet = Arrays.stream(qwUserId)
+                    .filter(id -> !id.isEmpty())
+                    .collect(Collectors.toSet());
+        }
+
         if (companyUser!=null){
 
             //选择的企业微信账号为“”
-            if (StringUtil.strIsNullOrEmpty(qwUser.getId())&&qwUser.getCompanyUserId()!=null){
+            if (StringUtil.strIsNullOrEmpty(qwUserParam.getId())&&qwUserParam.getCompanyUserId()!=null){
                 //制空企业微信的绑定
-                qwUserService.updateUserByUserId(qwUser.getCompanyUserId());
+                qwUserService.updateUserByUserId(qwUserParam.getCompanyUserId());
 
                 //制空销售的绑定
                 companyUserMapper.updateCompanyUserByNullQwUserID(companyUser.getUserId());
 
             }else {
-                String id = qwUser.getId();
-                String[] split = id.split(",");
-                for (String s : split) {
-                    QwUser qu= qwUserService.selectQwUserById(Long.parseLong(s));
-                    if (qu.getCompanyUserId()!=null&&!qu.getCompanyUserId().equals(qwUser.getCompanyUserId())){
+                String idParam = qwUserParam.getId();
+                String[] splitParam = idParam.split(",");
+                Set<String> splitParamSet = Arrays.stream(splitParam)
+                        .filter(s -> !s.isEmpty())
+                        .collect(Collectors.toSet());
+
+                // 找出在 qwUserIdCompanySet 中存在但在 splitParamSet 中不存在的元素
+                Set<String> difference = new HashSet<>(qwUserIdCompanySet);
+                difference.removeAll(splitParamSet);
+
+                //制空绑定
+                if (!difference.isEmpty()){
+                    difference.forEach(id->{
+                        qwUserService.updateUnBindUserById(id);
+                    });
+
+                }
+
+
+                for (String paramId : splitParamSet) {
+                    QwUser qu= qwUserService.selectQwUserById(Long.parseLong(paramId));
+                    if (qu.getCompanyUserId()!=null&&!qu.getCompanyUserId().equals(qwUserParam.getCompanyUserId())){
                         return R.error( qu.getQwUserName()+"已经被其他人绑定,请先解绑");
                     }
-                }
-                //制空绑定
-                qwUserService.updateUserByUserId(qwUser.getCompanyUserId());
-                CompanyUser user = new CompanyUser();
-                user.setQwUserId(qwUser.getId());
-                user.setUserId(companyUser.getUserId());
-                user.setQwStatus(1);
-                companyUserMapper.updateCompanyUser(user);
-                for (String s : split) {
+
+
+                    CompanyUser user = new CompanyUser();
+                    user.setQwUserId(qwUserParam.getId());
+                    user.setUserId(companyUser.getUserId());
+                    user.setQwStatus(1);
+                    companyUserMapper.updateCompanyUser(user);
+
+
                     QwUser qw = new QwUser();
-                    qw.setCompanyUserId(qwUser.getCompanyUserId());
-                    qw.setId(Long.parseLong(s));
+                    qw.setCompanyUserId(qwUserParam.getCompanyUserId());
+                    qw.setId(Long.parseLong(paramId));
                     qw.setStatus(1);
                     qw.setCompanyId(companyUser.getCompanyId());
                     qwUserService.updateQwUser(qw);
-                    QwUser qu= qwUserService.selectQwUserById(Long.parseLong(s));
 
-                    qwExternalContactMapper.updateBindUserByQwUser(qu.getCorpId(),qu.getQwUserId(),companyUser.getCompanyId(),companyUser.getUserId());
+                }
+
+                //同步最后单独跑/先不异步了pp
+                for (String paramId : splitParamSet){
+
+                    //如果销售没绑定过,全刷,否则只同步新的增加的
+                    if (StringUtil.strIsNullOrEmpty(qwUserIdCompanyStr)){
+                        updateAndSyncQwUser(paramId, companyUser);
 
-                    //根据企微账号和公司id 同步企业微信账号(游标初始为空)
-                    syncMyQwExternalContact(qu,null);
+                    }
+                    else if (!StringUtil.strIsNullOrEmpty(qwUserIdCompanyStr) && !qwUserIdCompanySet.contains(paramId)){
+                        updateAndSyncQwUser(paramId, companyUser);
+                    }
                 }
             }
 
@@ -474,6 +578,17 @@ public class QwUserController extends BaseController
 
     }
 
+
+    private void updateAndSyncQwUser(String paramId, CompanyUser companyUser) {
+
+        QwUser qu= qwUserService.selectQwUserById(Long.parseLong(paramId));
+
+        qwExternalContactMapper.updateBindUserByQwUser(qu.getCorpId(),qu.getQwUserId(),companyUser.getCompanyId(),companyUser.getUserId());
+
+        //根据企微账号和公司id 同步企业微信账号(游标初始为空)
+        syncMyQwExternalContact(qu,null);
+    }
+
     /** 修改企微用户的欢迎语 */
     @PostMapping("/weclomeQwUser")
     public R weclomeQwUser(@RequestBody QwUser qwUser) throws Exception {
@@ -487,7 +602,7 @@ public class QwUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('qw:user:remove')")
     @Log(title = "企微用户", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
+    @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
     {
         return toAjax(qwUserService.deleteQwUserByIds(ids));
@@ -495,8 +610,8 @@ public class QwUserController extends BaseController
 
 
     /**
-    * 获取企业微信用户列表
-    */
+     * 获取企业微信用户列表
+     */
     @GetMapping("/qwUserList/{corpId}")
     public TableDataInfo qwUserList(@PathVariable String corpId)
     {
@@ -591,9 +706,9 @@ public class QwUserController extends BaseController
             return R.error("同步失败:"+list.getErrmsg());
         }
 
-       if (!StringUtil.strIsNullOrEmpty(list.getNext_cursor())){
-           syncMyQwExternalContact(qwUser,list.getNext_cursor());
-       }
+        if (!StringUtil.strIsNullOrEmpty(list.getNext_cursor())){
+            syncMyQwExternalContact(qwUser,list.getNext_cursor());
+        }
         return R.ok();
     }
 }

+ 2 - 1
fs-qw-task/src/main/java/com/fs/FsQwTaskApplication.java

@@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
@@ -12,7 +13,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @EnableTransactionManagement
 @EnableAsync
-//@EnableScheduling
+@EnableScheduling
 public class FsQwTaskApplication
 {
     public static void main(String[] args){

+ 2 - 2
fs-qw-task/src/main/resources/application.yml

@@ -44,7 +44,7 @@ spring:
     basename: i18n/messages
   profiles:
 #    active: druid-yjf
-    active: druid
+    active: dev
     include: config
   # 文件上传
   servlet:
@@ -69,7 +69,7 @@ token:
   expireTime: 180
 mybatis-plus:
   # 搜索指定包别名
-  typeAliasesPackage: com.fs.**.domain,com.fs.**.bo
+  typeAliasesPackage: com.fs.**.domain,com.fs.**.bo,com.fs.**.vo
   # 配置mapper的扫描,找到所有的mapper.xml映射文件
   mapperLocations: classpath*:/mapper/**/*.xml
   configLocation: classpath:mybatis/mybatis-config.xml

+ 10 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -141,6 +141,16 @@ public class CompanyUser extends BaseEntity
     /** 域名 */
     private String domain;
 
+    private String addressId;
+
+    public String getAddressId() {
+        return addressId;
+    }
+
+    public void setAddressId(String addressId) {
+        this.addressId = addressId;
+    }
+
     @NotBlank(message = "二级域名不能为空")
     @Pattern(regexp = "^(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,})|(?:\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}))$", message = "域名格式不正确")
     public String getDomain() {

+ 7 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -1,11 +1,14 @@
 package com.fs.company.service;
 
+import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.vo.CompanyQwUserByIdsVo;
 import com.fs.company.vo.CompanyUserQwListVO;
 import com.fs.company.vo.CompanyUserVO;
 import com.fs.company.vo.DocCompanyUserVO;
+import com.fs.his.vo.CitysAreaVO;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwUserVO;
 import com.fs.his.vo.OptionsVO;;
@@ -151,4 +154,8 @@ public interface ICompanyUserService {
     List<CompanyUser> selectCompanySubUserList(Long companyUserId);
 
     List<CompanyUser> getAllUserListLimit(Long companyId, String keywords);
+
+    List<CitysAreaVO> getCitysAreaList();
+
+    R updateCompanyUserAreaList(CompanyUserAreaParam param);
 }

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

@@ -1,17 +1,21 @@
 package com.fs.company.service.impl;
 
 import com.fs.common.annotation.DataScope;
+import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.*;
 import com.fs.company.mapper.*;
+import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.param.CompanyVoiceCallerParam;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.*;
+import com.fs.his.vo.CitysAreaVO;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwUserVO;
 import com.fs.his.vo.OptionsVO;;
+import com.fs.store.service.IFsCityService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -45,6 +49,9 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     @Autowired
     private CompanyVoiceCallerMapper callerMapper;
 
+    @Autowired
+    public IFsCityService iFsCityService;
+
     /**
      * 查询物业公司管理员信息
      *
@@ -407,6 +414,21 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return companyUserMapper.getAllUserListLimit(companyId,keywords);
     }
 
+    @Override
+    public List<CitysAreaVO> getCitysAreaList() {
+        return iFsCityService.getCitysArea();
+    }
+
+    @Override
+    public R updateCompanyUserAreaList(CompanyUserAreaParam param) {
+        int i = companyUserMapper.updateCompanyUserAreaList(param);
+        if (i > 0) {
+            return R.ok("操作成功");
+        }else {
+            return R.error("操作失败");
+        }
+    }
+
     /**
      * 批量审核用户
      * @param userIds 用户ID集合

+ 16 - 0
fs-service-system/src/main/java/com/fs/course/param/FsUserCourseRegisterParam.java

@@ -0,0 +1,16 @@
+package com.fs.course.param;
+
+import lombok.Data;
+
+@Data
+public class FsUserCourseRegisterParam {
+    /**
+     * 登录的小程序id
+     */
+    private Long userId;
+
+    /**
+     * 外部联系的id
+     */
+    private Long qwExternalId;
+}

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

@@ -114,6 +114,9 @@ public interface IFsUserCourseVideoService
      */
     List<FsCourseAnalysisVO> getCourseAnalysisByMap(Map<String, Object> params);
 
+
+    R registerCourse(FsUserCourseRegisterParam param);
+
     /**
      * 获取下拉视频列表(有分页,仅返回两个字段)
      * @param param 入参

+ 32 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -25,6 +25,7 @@ import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.course.vo.newfs.FsUserVideoListVO;
 import com.fs.course.vo.newfs.FsUserVideoQuestionVO;
 import com.fs.his.param.WxSendRedPacketParam;
+import com.fs.sop.mapper.SopUserLogsInfoMapper;
 import com.fs.store.domain.FsUser;
 import com.fs.store.domain.FsUserIntegralLogs;
 import com.fs.store.mapper.FsUserIntegralLogsMapper;
@@ -752,6 +753,37 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         return fsUserCourseVideoMapper.getCourseAnalysisByMap(params);
     }
 
+    @Autowired
+    SopUserLogsInfoMapper sopUserLogsInfoMapper;
+
+    @Override
+    public R registerCourse(FsUserCourseRegisterParam param) {
+
+
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(param.getUserId());
+        if (fsUser.getIsAddQw()==1){
+            return R.error("已经注册");
+        }
+        QwExternalContact qwExternalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
+        if (qwExternalContact==null){
+            return R.error("注册信息错误");
+        }
+        FsUser u = new FsUser();
+        u.setUserId(param.getUserId());
+        u.setIsAddQw(1);
+        u.setQwExtId(param.getQwExternalId());
+        fsUserMapper.updateFsUser(u);
+        QwExternalContact qw = new QwExternalContact();
+        qw.setFsUserId(fsUser.getUserId());
+        qw.setId(qwExternalContact.getId());
+        qwExternalContactMapper.updateQwExternalContactByExternalUserId(qw);
+        List<String> list= sopUserLogsInfoMapper.selectSopUserLogsInfoByExtId(qwExternalContact.getId());
+        if (list!=null&& !list.isEmpty()){
+            sopUserLogsInfoMapper.updateSopUserLogsInfoFsUserIdById(list,param.getUserId());
+        }
+        return R.ok();
+    }
+
     @Override
     public List<FsUserVideoListVO> getListCourseVideo(UserCourseVideoPageParam param) {
         List<FsUserCourseVideoPageListVO> list = fsUserCourseVideoMapper.selectFsUserCourseVideoPageList(param);

+ 16 - 0
fs-service-system/src/main/java/com/fs/his/vo/CitysAreaVO.java

@@ -0,0 +1,16 @@
+package com.fs.his.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class CitysAreaVO {
+    /** 地址编码 */
+    @Excel(name = "地址编码")
+    private String cityId;
+
+    /** 地区名称 */
+    @Excel(name = "地区名称")
+    private String cityName;
+
+}

+ 4 - 2
fs-service-system/src/main/java/com/fs/qw/domain/QwExternalContact.java

@@ -1,5 +1,7 @@
 package com.fs.qw.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
@@ -19,7 +21,7 @@ public class QwExternalContact extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** id */
-
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /** 属于用户id */
@@ -120,6 +122,6 @@ public class QwExternalContact extends BaseEntity
     private Date firstTime;
 
     private Integer lastWatchTime;
-    private Integer repeat;
+    private Integer isRepeat;
 
 }

+ 28 - 0
fs-service-system/src/main/java/com/fs/qw/dto/QwUserByToolDTO.java

@@ -0,0 +1,28 @@
+package com.fs.qw.dto;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class QwUserByToolDTO {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 企微用户id */
+    @Excel(name = "企微用户id")
+    private String qwUserId;
+
+    /** 企微用户名 */
+    @Excel(name = "企微用户名")
+    private String qwUserName;
+
+    /**
+     * 地址
+     */
+    private  String loginCodeUrl;
+
+
+    private String apAdmin;
+
+    private String apPassword;
+}

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

@@ -2,6 +2,7 @@ package com.fs.qw.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.qw.domain.QwUser;
+import com.fs.qw.dto.QwUserByToolDTO;
 import com.fs.qw.param.QwFsServerBindParam;
 import com.fs.qw.param.QwUserListParam;
 import com.fs.qw.param.QwUserParam;
@@ -335,4 +336,11 @@ public interface QwUserMapper extends BaseMapper<QwUser>
 
     @Select("select company_id from qw_user where corp_id = #{corpId} and qw_user_id = #{qwUserid}")
     Long getQwUserCompanyId(@Param("corpId") String corpId, @Param("qwUserid") String qwUserid);
+
+    @Select("select qw_user_id,qw_user_name,login_code_url from qw_user" +
+            " where company_id=#{companyId} " +
+            "and company_user_id =#{userId} " +
+            "and is_del=0 " +
+            "and login_code_url is not null ")
+    public List<QwUserByToolDTO> selectQwUserListByTools(@Param("companyId") Long companyId , @Param("userId") Long userId);
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/qw/param/QwCloudIPByCompanyParam.java

@@ -0,0 +1,10 @@
+package com.fs.qw.param;
+
+
+import lombok.Data;
+
+@Data
+public class QwCloudIPByCompanyParam {
+    public String companyAdmin;
+    public String companyPassWord;
+}

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

@@ -146,4 +146,6 @@ public interface IQwUserService
      * @return  QwUser
      */
     QwUser getByQwUserIdAndCorId(String qwUserId, String corpId);
+
+    R selectCloudByCompany(Long companyId, Long userId);
 }

+ 17 - 15
fs-service-system/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -23,21 +23,18 @@ import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.service.IFsCourseLinkService;
 import com.fs.crm.domain.CrmCustomer;
 import com.fs.crm.mapper.CrmCustomerMapper;
-import com.fs.fastGpt.param.SendHookAIParam;
-import com.fs.qw.param.newparam.ExternalContactPageListParam;
-import com.fs.qw.vo.newvo.ExternalContactDetailsVO;
-import com.fs.qw.vo.newvo.ExternalContactListVO;
-import com.fs.qw.vo.newvo.ExternalContactNumVO;
-import com.fs.qw.vo.newvo.ExternalContactPageVO;
-import com.fs.store.domain.FsUser;
-import com.fs.store.mapper.FsUserMapper;
 import com.fs.qw.domain.*;
 import com.fs.qw.mapper.*;
 import com.fs.qw.param.*;
+import com.fs.qw.param.newparam.ExternalContactPageListParam;
 import com.fs.qw.result.QwExternalContactLogVo;
 import com.fs.qw.result.QwExternalContactVo;
 import com.fs.qw.service.*;
 import com.fs.qw.vo.*;
+import com.fs.qw.vo.newvo.ExternalContactDetailsVO;
+import com.fs.qw.vo.newvo.ExternalContactListVO;
+import com.fs.qw.vo.newvo.ExternalContactNumVO;
+import com.fs.qw.vo.newvo.ExternalContactPageVO;
 import com.fs.qwApi.Result.QwOpenidResult;
 import com.fs.qwApi.domain.*;
 import com.fs.qwApi.domain.inner.*;
@@ -58,8 +55,8 @@ import com.fs.store.mapper.FsUserMapper;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
-//import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -88,6 +85,7 @@ import java.util.stream.Stream;
  * @author fs
  * @date 2024-06-20
  */
+@Slf4j
 @Service
 public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactMapper, QwExternalContact> implements IQwExternalContactService {
 
@@ -1219,10 +1217,10 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
             List<QwExternalContact> externalContactList = qwExternalContactMapper.selectList(new QueryWrapper<QwExternalContact>().eq("external_user_id", externalUserID).eq("corp_id", corpId));
             if(!externalContactList.isEmpty()){
                 externalContactList.forEach(e -> {
-                    e.setRepeat(1);
+                    e.setIsRepeat(1);
                 });
                 qwExternalContactService.updateBatchById(externalContactList);
-                qwExternalContact.setRepeat(1);
+                qwExternalContact.setIsRepeat(1);
             }
         }
 
@@ -1243,9 +1241,9 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         if (isNewQwExternalContact) {
             qwExternalContact.setName("待同步客户");
             qwExternalContact.setGender(0);
-            qwExternalContactMapper.insertQwExternalContact(qwExternalContact);
+            qwExternalContactMapper.insert(qwExternalContact);
         } else {
-            qwExternalContactMapper.updateQwExternalContact(qwExternalContact);
+            qwExternalContactMapper.updateById(qwExternalContact);
         }
 
         QwExternalContact contact = qwExternalContact;
@@ -1518,6 +1516,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                 String tagRemark = null;
                 //根据qwUser 匹配 分时段的标签
                 QwAutoTags qwAutoTags = qwAutoTagsMapper.selectQwAutoTagsByIdJSON(corpId, qwUser.getId());
+                log.info("自动打标签方案{}", qwAutoTags);
                 if (qwAutoTags != null) {
                     //标签日志记录
                     qwAutoTagsLogs.setAutoTagId(qwAutoTags.getId());
@@ -1543,11 +1542,12 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                         String startTime = rulesTags.getStartTime();
                         String endTime = rulesTags.getEndTime();
                         String remarks = rulesTags.getRemarks();
-
+                        log.info("自动打标签开始时间:{} 到 {}, time:{} 到 {}", startDate, endDate, startTime, endTime);
                         // 检查今天是否在 week 集合中
 //                        boolean isTodayInWeek = week.contains(todayIndex);
                         boolean isToday = false;
-                        if(startDate == null || endDate == null){
+                        if(startDate != null && endDate != null){
+                            log.info("进入日期判断");
                             isToday = !nowDate.isBefore(startDate) && !nowDate.isAfter(endDate);
                         }
                         // 转换时间字符串为 LocalTime
@@ -1555,6 +1555,8 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                         LocalTime end = LocalTime.parse(endTime.equals("24:00") ? "23:59:59" : endTime);
                         // 检查当前时间是否在 startTime 和 endTime 之间
                         boolean isNowInTimeRange = !now.isBefore(start) && !now.isAfter(end);
+                        log.info("是否满足时间打标签:天:{}, 时:{}", isToday, isNowInTimeRange);
+                        log.info("是否每天{}", rulesTags.getEveryDay());
                         // 如果当前时间和日期匹配规则,将 tagsItem 添加到 combinedTagsSet 中
                         if (((rulesTags.getEveryDay() != null && rulesTags.getEveryDay() == 1) || isToday) && isNowInTimeRange) {
 

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

@@ -10,6 +10,7 @@ import com.fs.his.config.FsSysConfig;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.domain.QwUser;
+import com.fs.qw.dto.QwUserByToolDTO;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.param.*;
 import com.fs.qw.result.QwFsServerBindResult;
@@ -885,6 +886,71 @@ public class QwUserServiceImpl implements IQwUserService
         return qwUserMapper.getQwUserCompanyId(corpId,qwUserid);
     }
 
+    @Override
+    public R selectCloudByCompany(Long companyId, Long userId) {
+        List<QwUserByToolDTO> qwUserByToolDTOS = qwUserMapper.selectQwUserListByTools(companyId, userId);
+        qwUserByToolDTOS.forEach(item->{
+            try {
+                R r = GetIPAdminAndPassWord(item.getLoginCodeUrl());
+                Object data = r.get("data");
+                String jsonString = JSON.toJSONString(data);
+                QwCloudAPVO apvo = JSON.parseObject(jsonString, QwCloudAPVO.class);
+
+                item.setApAdmin(apvo.getApAdmin());
+                item.setApPassword(apvo.getApPassword());
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return R.ok().put("data",qwUserByToolDTOS);
+    }
+
+    public R GetIPAdminAndPassWord(String ipAddress ) throws Exception {
+
+        String bodyKey = HttpRequest.get("http://watch.ylrzcloud.com/prod-api/server/getKey?serverIp="+ipAddress)
+                .execute().body();
+
+//        String bodyKey = HttpRequest.get("http://192.168.10.155:8111/server/getKey?serverIp="+param.getIpAddress())
+//                .execute().body();
+
+        QwFsServerBindResult resultDecode = JSON.parseObject(bodyKey, QwFsServerBindResult.class);
+
+        PrivateKey privateKey = getPrivateKeyFromString(resultDecode.getMsg());
+
+        String signature = RSASignatureUtils.sign(ipAddress+ "ylrz321!#@1", privateKey );
+
+        QwCloudAPParamB paramB=new QwCloudAPParamB();
+        paramB.setServerIp(ipAddress);
+        paramB.setSignature(signature);
+
+        String body = HttpRequest.post("http://watch.ylrzcloud.com/prod-api/server/getAccount")
+                .body(JSON.toJSONString(paramB), "application/json;charset=UTF-8")
+                .execute().body();
+//        String body = HttpRequest.post("http://192.168.10.155:8111/server/getAccount")
+//                .body(JSON.toJSONString(paramB), "application/json;charset=UTF-8")
+//                .execute().body();
+
+        QwFsServerAPResult result = JSON.parseObject(body, QwFsServerAPResult.class);
+
+        if (result.getCode()==200){
+            //账号 解密
+            String apAdmin = RSAUtils.decrypt(result.getData().serverAccount, privateKey);
+
+            //密码
+            String apPassword = RSAUtils.decrypt(result.getData().serverPassword, privateKey);
+
+            QwCloudAPVO apvo=new QwCloudAPVO();
+            apvo.setApAdmin(apAdmin);
+            apvo.setApPassword(apPassword);
+
+            return  R.ok().put("data",apvo);
+
+        }else {
+            return  R.error("获取账号密码失败,请重试!!错误码:"+result.getMsg());
+        }
+    }
+
     /**
      *  url转临时文件filr
      */

+ 5 - 0
fs-service-system/src/main/java/com/fs/sop/mapper/SopUserLogsInfoMapper.java

@@ -202,4 +202,9 @@ public interface SopUserLogsInfoMapper {
 
     @DataSource(DataSourceType.SOP)
     List<SopUserLogsInfo> repeatProject(@Param("projects") List<Integer> projects, @Param("externalUserID") String externalUserID);
+    @DataSource(DataSourceType.SOP)
+    @Select("SELECT id  FROM sop_user_logs_info where external_id = #{extId} ")
+    List<String> selectSopUserLogsInfoByExtId(@Param("extId")Long extId );
+    @DataSource(DataSourceType.SOP)
+    void updateSopUserLogsInfoFsUserIdById(@Param("data")List<String> list,  @Param("userId") Long userId);
 }

+ 12 - 1
fs-service-system/src/main/java/com/fs/store/domain/FsUser.java

@@ -136,11 +136,22 @@ public class FsUser extends BaseEntity
 
     private Integer sex;
     private Integer isAddQw;
-
+    private Long qwExtId;
     private Integer isShow;//是否展示购买以及订单状态
 
+
+
     private String courseMaOpenId;//看课小程序openId
 
+
+    public Long getQwExtId() {
+        return qwExtId;
+    }
+
+    public void setQwExtId(Long qwExtId) {
+        this.qwExtId = qwExtId;
+    }
+
     public String getCourseMaOpenId() {
         return courseMaOpenId;
     }

+ 13 - 8
fs-service-system/src/main/java/com/fs/store/mapper/FsCityMapper.java

@@ -1,20 +1,22 @@
 package com.fs.store.mapper;
 
 import java.util.List;
+
+import com.fs.his.vo.CitysAreaVO;
 import com.fs.store.domain.FsCity;
 import org.apache.ibatis.annotations.Select;
 
 /**
  * 城市Mapper接口
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
-public interface FsCityMapper 
+public interface FsCityMapper
 {
     /**
      * 查询城市
-     * 
+     *
      * @param id 城市ID
      * @return 城市
      */
@@ -22,7 +24,7 @@ public interface FsCityMapper
 
     /**
      * 查询城市列表
-     * 
+     *
      * @param fsCity 城市
      * @return 城市集合
      */
@@ -30,7 +32,7 @@ public interface FsCityMapper
 
     /**
      * 新增城市
-     * 
+     *
      * @param fsCity 城市
      * @return 结果
      */
@@ -38,7 +40,7 @@ public interface FsCityMapper
 
     /**
      * 修改城市
-     * 
+     *
      * @param fsCity 城市
      * @return 结果
      */
@@ -46,7 +48,7 @@ public interface FsCityMapper
 
     /**
      * 删除城市
-     * 
+     *
      * @param id 城市ID
      * @return 结果
      */
@@ -54,11 +56,14 @@ public interface FsCityMapper
 
     /**
      * 批量删除城市
-     * 
+     *
      * @param ids 需要删除的数据ID
      * @return 结果
      */
     public int deleteFsCityByIds(Long[] ids);
     @Select("select * from fs_city where is_show=1")
     List<FsCity> selectFsCitys();
+
+    @Select("SELECT city_id,name as city_name FROM fs_city where parent_id=0 ")
+    List<CitysAreaVO> getCitysArea();
 }

+ 12 - 8
fs-service-system/src/main/java/com/fs/store/service/IFsCityService.java

@@ -1,19 +1,21 @@
 package com.fs.store.service;
 
 import java.util.List;
+
+import com.fs.his.vo.CitysAreaVO;
 import com.fs.store.domain.FsCity;
 
 /**
  * 城市Service接口
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
-public interface IFsCityService 
+public interface IFsCityService
 {
     /**
      * 查询城市
-     * 
+     *
      * @param id 城市ID
      * @return 城市
      */
@@ -21,7 +23,7 @@ public interface IFsCityService
 
     /**
      * 查询城市列表
-     * 
+     *
      * @param fsCity 城市
      * @return 城市集合
      */
@@ -29,7 +31,7 @@ public interface IFsCityService
 
     /**
      * 新增城市
-     * 
+     *
      * @param fsCity 城市
      * @return 结果
      */
@@ -37,7 +39,7 @@ public interface IFsCityService
 
     /**
      * 修改城市
-     * 
+     *
      * @param fsCity 城市
      * @return 结果
      */
@@ -45,7 +47,7 @@ public interface IFsCityService
 
     /**
      * 批量删除城市
-     * 
+     *
      * @param ids 需要删除的城市ID
      * @return 结果
      */
@@ -53,11 +55,13 @@ public interface IFsCityService
 
     /**
      * 删除城市信息
-     * 
+     *
      * @param id 城市ID
      * @return 结果
      */
     public int deleteFsCityById(Long id);
 
     List<FsCity> selectFsCitys();
+
+    List<CitysAreaVO> getCitysArea();
 }

+ 2 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -11,7 +11,6 @@ import com.fs.qw.vo.QwFsUserVO;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStoreOrderItem;
 import com.fs.store.domain.FsUser;
-
 import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.param.SelectCusListPageParam;
 import com.fs.store.param.h5.FsUserPageListParam;
@@ -23,6 +22,8 @@ import com.fs.store.vo.h5.UserDetailsVO;
 import com.fs.store.vo.h5.UserListPageVO;
 import com.fs.store.vo.h5.*;
 
+import java.util.List;
+
 /**
  * 用户Service接口
  *

+ 16 - 8
fs-service-system/src/main/java/com/fs/store/service/impl/FsCityServiceImpl.java

@@ -1,6 +1,9 @@
 package com.fs.store.service.impl;
 
+import java.util.Collections;
 import java.util.List;
+
+import com.fs.his.vo.CitysAreaVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
@@ -10,19 +13,19 @@ import com.fs.store.service.IFsCityService;
 
 /**
  * 城市Service业务层处理
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
 @Service
-public class FsCityServiceImpl implements IFsCityService 
+public class FsCityServiceImpl implements IFsCityService
 {
     @Autowired
     private FsCityMapper fsCityMapper;
 
     /**
      * 查询城市
-     * 
+     *
      * @param id 城市ID
      * @return 城市
      */
@@ -34,7 +37,7 @@ public class FsCityServiceImpl implements IFsCityService
 
     /**
      * 查询城市列表
-     * 
+     *
      * @param fsCity 城市
      * @return 城市
      */
@@ -46,7 +49,7 @@ public class FsCityServiceImpl implements IFsCityService
 
     /**
      * 新增城市
-     * 
+     *
      * @param fsCity 城市
      * @return 结果
      */
@@ -58,7 +61,7 @@ public class FsCityServiceImpl implements IFsCityService
 
     /**
      * 修改城市
-     * 
+     *
      * @param fsCity 城市
      * @return 结果
      */
@@ -70,7 +73,7 @@ public class FsCityServiceImpl implements IFsCityService
 
     /**
      * 批量删除城市
-     * 
+     *
      * @param ids 需要删除的城市ID
      * @return 结果
      */
@@ -82,7 +85,7 @@ public class FsCityServiceImpl implements IFsCityService
 
     /**
      * 删除城市信息
-     * 
+     *
      * @param id 城市ID
      * @return 结果
      */
@@ -97,4 +100,9 @@ public class FsCityServiceImpl implements IFsCityService
     public List<FsCity> selectFsCitys() {
         return fsCityMapper.selectFsCitys();
     }
+
+    @Override
+    public List<CitysAreaVO> getCitysArea() {
+        return fsCityMapper.getCitysArea();
+    }
 }

+ 8 - 1
fs-service-system/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -38,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="qwStatus"    column="qw_status"    />
         <result property="domain"    column="domain"    />
         <result property="isAudit"    column="is_audit"    />
+        <result property="addressId"    column="address_id"    />
         <association property="dept"    column="dept_id" javaType="CompanyDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
 
@@ -135,6 +136,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwStatus != null">qw_status,</if>
             <if test="domain != null">`domain`,</if>
             <if test="isAudit != null">`is_audit`,</if>
+            <if test="addressId != null">`address_id`,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -166,6 +168,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwStatus != null">#{qwStatus},</if>
             <if test="domain != null">#{domain},</if>
             <if test="isAudit != null">#{isAudit},</if>
+            <if test="addressId != null">#{addressId},</if>
          </trim>
     </insert>
 
@@ -200,6 +203,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwStatus != null">qw_status = #{qwStatus},</if>
             <if test="domain != null">`domain` = #{domain},</if>
             <if test="isAudit != null">`is_audit` = #{isAudit},</if>
+            <if test="addressId != null">`address_id` = #{addressId},</if>
         </trim>
         where user_id = #{userId}
     </update>
@@ -234,6 +238,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwStatus != null">qw_status = #{qwStatus},</if>
             <if test="domain != null">`domain` = #{domain},</if>
             <if test="isAudit != null">`is_audit` = #{isAudit},</if>
+            <if test="addressId != null">`address_id` = #{addressId},</if>
         </trim>
         where company_id = #{companyId}
     </update>
@@ -264,7 +269,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where u.user_name = #{userName}
     </select>
     <sql id="selectUserVo">
-        select u.user_id,u.company_id,u.qw_user_id, u.dept_id, u.user_name, u.nick_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.id_card, u.remark,u.user_type,u.open_id,u.qr_code_weixin,u.qr_code_wecom,u.jpush_id,u.domain,u.is_audit,
+        select u.user_id,u.company_id,u.qw_user_id, u.dept_id, u.user_name, u.nick_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.id_card, u.remark,u.user_type,u.open_id,u.qr_code_weixin,u.qr_code_wecom,u.jpush_id,u.domain,u.is_audit,u.address_id,
         d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from company_user u
@@ -374,7 +379,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="remark"    column="remark"    />
         <result property="openId"    column="open_id"    />
         <result property="nowDayCustomerCount"    column="now_day_customer_count"    />
+        <result property="domain"    column="domain"    />
         <result property="isAudit"    column="is_audit"    />
+        <result property="addressId"    column="address_id"    />
         <association property="dept"    column="dept_id" javaType="CompanyDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
         <collection property="posts" javaType="java.util.ArrayList" ofType="com.fs.company.domain.CompanyPost"

+ 9 - 1
fs-service-system/src/main/resources/mapper/sop/SopUserLogsInfoMapper.xml

@@ -57,7 +57,15 @@
         SET user_logs_id=#{data.userLogsId},create_time= Date(#{data.createTime}),update_time=#{data.updateTime}
         WHERE id = #{data.id}
     </update>
-
+    <update id="updateSopUserLogsInfoFsUserIdById" parameterType="java.util.List" useGeneratedKeys="false">
+        UPDATE  sop_user_logs_info
+        SET
+        fs_user_id = #{userId}
+        WHERE id IN
+        <foreach collection="data" item="log" open="(" separator="," close=")">
+            #{log.id}
+        </foreach>
+    </update>
 
     <update id="insertSopUserLogsInfo" parameterType="com.fs.sop.domain.SopUserLogsInfo" useGeneratedKeys="false">
         INSERT INTO sop_user_logs_info

+ 5 - 0
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -42,10 +42,12 @@
         <result property="source" column="source"/>
         <result property="userCode" column="user_code"/>
         <result property="isShow" column="is_show"/>
+        <result property="qwExtId"    column="qw_ext_id"    />
     </resultMap>
 
     <sql id="selectFsUserVo">
         select user_id,
+               qw_ext_id,
                is_show,
                username,
                password,
@@ -258,6 +260,7 @@
             <if test="source != null">source,</if>
             <if test="userCode != null">user_code,</if>
             <if test="isShow != null">is_show,</if>
+            <if test="qwExtId != null">qw_ext_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="username != null">#{username},</if>
@@ -297,6 +300,7 @@
             <if test="source != null">#{source},</if>
             <if test="userCode != null">#{userCode},</if>
             <if test="isShow != null">#{isShow},</if>
+            <if test="qwExtId != null">#{qwExtId},</if>
         </trim>
     </insert>
 
@@ -340,6 +344,7 @@
             <if test="source != null">source = #{source},</if>
             <if test="userCode != null">user_code = #{userCode},</if>
             <if test="isShow != null">is_show = #{isShow},</if>
+            <if test="qwExtId != null">qw_ext_id = #{qwExtId},</if>
         </trim>
         where user_id = #{userId}
     </update>

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

@@ -454,7 +454,15 @@ public class CourseController extends  AppBaseController{
         param.setUserId(userId);
         return courseVideoService.isAddKf(param);
     }
+    @Login
+    @ApiOperation("注册看课")
+    @PostMapping("/registerCourse")
+    public R register(@RequestBody FsUserCourseRegisterParam param) {
+        Long userId = Long.parseLong(getUserId());
+        param.setUserId(userId);
 
+        return courseVideoService.registerCourse(param);
+    }
     @Login
     @ApiOperation("获取缓冲流量")
     @PostMapping("/getInternetTraffic")

+ 103 - 0
fs-user-app/src/main/java/com/fs/core/config/DataSourceConfig.java

@@ -0,0 +1,103 @@
+package com.fs.core.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.util.Utils;
+import com.fs.common.enums.DataSourceType;
+import com.fs.core.datasource.DynamicDataSource;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.*;
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class DataSourceConfig {
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.sop.druid.master")
+    public DataSource sopDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.master")
+    public DataSource masterDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.slave")
+    public DataSource slaveDataSource() {
+        return new DruidDataSource();
+    }
+
+
+
+    @Bean
+    @Primary
+    public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
+                                        @Qualifier("sopDataSource") DataSource sopDataSource,
+                                        @Qualifier("slaveDataSource") DataSource slaveDataSource) {
+        Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
+
+        targetDataSources.put(DataSourceType.SLAVE, slaveDataSource);
+        targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
+        return new DynamicDataSource(masterDataSource, targetDataSources);
+    }
+
+    /**
+     * 去除监控页面底部的广告
+     */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Bean
+    @ConditionalOnProperty(name = "spring.datasource.mysql.druid.statViewServlet.enabled", havingValue = "true")
+    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
+    {
+        // 获取web监控页面的参数
+        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+        // 提取common.js的配置路径
+        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+        final String filePath = "support/http/resources/js/common.js";
+        // 创建filter进行过滤
+        Filter filter = new Filter()
+        {
+            @Override
+            public void init(FilterConfig filterConfig) throws ServletException
+            {
+            }
+            @Override
+            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+                    throws IOException, ServletException
+            {
+                chain.doFilter(request, response);
+                // 重置缓冲区,响应头不会被重置
+                response.resetBuffer();
+                // 获取common.js
+                String text = Utils.readFromResource(filePath);
+                // 正则替换banner, 除去底部的广告信息
+                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+                response.getWriter().write(text);
+            }
+            @Override
+            public void destroy()
+            {
+            }
+        };
+        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+        registrationBean.setFilter(filter);
+        registrationBean.addUrlPatterns(commonJsPattern);
+        return registrationBean;
+    }
+}

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

@@ -1,123 +1,123 @@
-package com.fs.core.config;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
-import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
-import com.alibaba.druid.util.Utils;
-import com.fs.common.enums.DataSourceType;
-import com.fs.common.utils.spring.SpringUtils;
-import com.fs.core.config.properties.DruidProperties;
-import com.fs.core.datasource.DynamicDataSource;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-import javax.servlet.*;
-import javax.sql.DataSource;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * druid 配置多数据源
- * 
-
- */
-@Configuration
-public class DruidConfig
-{
-    @Bean
-    @ConfigurationProperties("spring.datasource.mysql.druid.master")
-    public DataSource masterDataSource(DruidProperties druidProperties)
-    {
-        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
-        return druidProperties.dataSource(dataSource);
-    }
-
-    @Bean
-    @ConfigurationProperties("spring.datasource.mysql.druid.slave")
-    @ConditionalOnProperty(prefix = "spring.datasource.mysql.druid.slave", name = "enabled", havingValue = "true")
-    public DataSource slaveDataSource(DruidProperties druidProperties)
-    {
-        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
-        return druidProperties.dataSource(dataSource);
-    }
-
-    @Bean(name = "dynamicDataSource")
-    @Primary
-    public DynamicDataSource dataSource(DataSource masterDataSource)
-    {
-        Map<Object, Object> targetDataSources = new HashMap<>();
-        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
-        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
-        return new DynamicDataSource(masterDataSource, targetDataSources);
-    }
-    
-    /**
-     * 设置数据源
-     * 
-     * @param targetDataSources 备选数据源集合
-     * @param sourceName 数据源名称
-     * @param beanName bean名称
-     */
-    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
-    {
-        try
-        {
-            DataSource dataSource = SpringUtils.getBean(beanName);
-            targetDataSources.put(sourceName, dataSource);
-        }
-        catch (Exception e)
-        {
-        }
-    }
-
-    /**
-     * 去除监控页面底部的广告
-     */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    @Bean
-    @ConditionalOnProperty(name = "spring.datasource.mysql.druid.statViewServlet.enabled", havingValue = "true")
-    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
-    {
-        // 获取web监控页面的参数
-        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
-        // 提取common.js的配置路径
-        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
-        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
-        final String filePath = "support/http/resources/js/common.js";
-        // 创建filter进行过滤
-        Filter filter = new Filter()
-        {
-            @Override
-            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
-            {
-            }
-            @Override
-            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-                    throws IOException, ServletException
-            {
-                chain.doFilter(request, response);
-                // 重置缓冲区,响应头不会被重置
-                response.resetBuffer();
-                // 获取common.js
-                String text = Utils.readFromResource(filePath);
-                // 正则替换banner, 除去底部的广告信息
-                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
-                text = text.replaceAll("powered.*?shrek.wang</a>", "");
-                response.getWriter().write(text);
-            }
-            @Override
-            public void destroy()
-            {
-            }
-        };
-        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
-        registrationBean.setFilter(filter);
-        registrationBean.addUrlPatterns(commonJsPattern);
-        return registrationBean;
-    }
-}
+//package com.fs.core.config;
+//
+//import com.alibaba.druid.pool.DruidDataSource;
+//import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+//import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+//import com.alibaba.druid.util.Utils;
+//import com.fs.common.enums.DataSourceType;
+//import com.fs.common.utils.spring.SpringUtils;
+//import com.fs.core.config.properties.DruidProperties;
+//import com.fs.core.datasource.DynamicDataSource;
+//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//import org.springframework.boot.web.servlet.FilterRegistrationBean;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Primary;
+//
+//import javax.servlet.*;
+//import javax.sql.DataSource;
+//import java.io.IOException;
+//import java.util.HashMap;
+//import java.util.Map;
+//
+///**
+// * druid 配置多数据源
+// *
+//
+// */
+//@Configuration
+//public class DruidConfig
+//{
+//    @Bean
+//    @ConfigurationProperties("spring.datasource.mysql.druid.master")
+//    public DataSource masterDataSource(DruidProperties druidProperties)
+//    {
+//        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+//        return druidProperties.dataSource(dataSource);
+//    }
+//
+//    @Bean
+//    @ConfigurationProperties("spring.datasource.mysql.druid.slave")
+//    @ConditionalOnProperty(prefix = "spring.datasource.mysql.druid.slave", name = "enabled", havingValue = "true")
+//    public DataSource slaveDataSource(DruidProperties druidProperties)
+//    {
+//        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+//        return druidProperties.dataSource(dataSource);
+//    }
+//
+//    @Bean(name = "dynamicDataSource")
+//    @Primary
+//    public DynamicDataSource dataSource(DataSource masterDataSource)
+//    {
+//        Map<Object, Object> targetDataSources = new HashMap<>();
+//        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
+//        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
+//        return new DynamicDataSource(masterDataSource, targetDataSources);
+//    }
+//
+//    /**
+//     * 设置数据源
+//     *
+//     * @param targetDataSources 备选数据源集合
+//     * @param sourceName 数据源名称
+//     * @param beanName bean名称
+//     */
+//    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
+//    {
+//        try
+//        {
+//            DataSource dataSource = SpringUtils.getBean(beanName);
+//            targetDataSources.put(sourceName, dataSource);
+//        }
+//        catch (Exception e)
+//        {
+//        }
+//    }
+//
+//    /**
+//     * 去除监控页面底部的广告
+//     */
+//    @SuppressWarnings({ "rawtypes", "unchecked" })
+//    @Bean
+//    @ConditionalOnProperty(name = "spring.datasource.mysql.druid.statViewServlet.enabled", havingValue = "true")
+//    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
+//    {
+//        // 获取web监控页面的参数
+//        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+//        // 提取common.js的配置路径
+//        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+//        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+//        final String filePath = "support/http/resources/js/common.js";
+//        // 创建filter进行过滤
+//        Filter filter = new Filter()
+//        {
+//            @Override
+//            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
+//            {
+//            }
+//            @Override
+//            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+//                    throws IOException, ServletException
+//            {
+//                chain.doFilter(request, response);
+//                // 重置缓冲区,响应头不会被重置
+//                response.resetBuffer();
+//                // 获取common.js
+//                String text = Utils.readFromResource(filePath);
+//                // 正则替换banner, 除去底部的广告信息
+//                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+//                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+//                response.getWriter().write(text);
+//            }
+//            @Override
+//            public void destroy()
+//            {
+//            }
+//        };
+//        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+//        registrationBean.setFilter(filter);
+//        registrationBean.addUrlPatterns(commonJsPattern);
+//        return registrationBean;
+//    }
+//}

+ 22 - 66
fs-user-app/src/main/java/com/fs/core/config/MyBatisConfig.java

@@ -1,7 +1,12 @@
 package com.fs.core.config;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import javax.sql.DataSource;
+
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
-import com.fs.common.utils.StringUtils;
 import org.apache.ibatis.io.VFS;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionFactoryBean;
@@ -19,103 +24,56 @@ import org.springframework.core.type.classreading.MetadataReader;
 import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.util.ClassUtils;
 
-import javax.sql.DataSource;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-
 /**
  * Mybatis支持*匹配扫描包
- *
-
  */
 @Configuration
-public class MyBatisConfig
-{
+public class MyBatisConfig {
     @Autowired
     private Environment env;
 
     static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
 
-    public static String setTypeAliasesPackage(String typeAliasesPackage)
-    {
+    public static String setTypeAliasesPackage(String typeAliasesPackage) {
         ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
         MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
         List<String> allResult = new ArrayList<String>();
-        try
-        {
-            for (String aliasesPackage : typeAliasesPackage.split(","))
-            {
+        try {
+            for (String aliasesPackage : typeAliasesPackage.split(",")) {
                 List<String> result = new ArrayList<String>();
                 aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                         + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
                 Resource[] resources = resolver.getResources(aliasesPackage);
-                if (resources != null && resources.length > 0)
-                {
+                if (resources != null && resources.length > 0) {
                     MetadataReader metadataReader = null;
-                    for (Resource resource : resources)
-                    {
-                        if (resource.isReadable())
-                        {
+                    for (Resource resource : resources) {
+                        if (resource.isReadable()) {
                             metadataReader = metadataReaderFactory.getMetadataReader(resource);
-                            try
-                            {
+                            try {
                                 result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
-                            }
-                            catch (ClassNotFoundException e)
-                            {
+                            } catch (ClassNotFoundException e) {
                                 e.printStackTrace();
                             }
                         }
                     }
                 }
-                if (result.size() > 0)
-                {
+                if (result.size() > 0) {
                     HashSet<String> hashResult = new HashSet<String>(result);
                     allResult.addAll(hashResult);
                 }
             }
-            if (allResult.size() > 0)
-            {
+            if (allResult.size() > 0) {
                 typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
-            }
-            else
-            {
+            } else {
                 throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
             }
-        }
-        catch (IOException e)
-        {
+        } catch (IOException e) {
             e.printStackTrace();
         }
         return typeAliasesPackage;
     }
 
-    public Resource[] resolveMapperLocations(String[] mapperLocations)
-    {
-        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
-        List<Resource> resources = new ArrayList<Resource>();
-        if (mapperLocations != null)
-        {
-            for (String mapperLocation : mapperLocations)
-            {
-                try
-                {
-                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
-                    resources.addAll(Arrays.asList(mappers));
-                }
-                catch (IOException e)
-                {
-                    // ignore
-                }
-            }
-        }
-        return resources.toArray(new Resource[resources.size()]);
-    }
-
-//    @Bean
+    //    @Bean
 //    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
 //    {
 //        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
@@ -127,14 +85,12 @@ public class MyBatisConfig
 //        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
 //        sessionFactory.setDataSource(dataSource);
 //        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
-//        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+//        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
 //        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
 //        return sessionFactory.getObject();
 //    }
-
     @Bean
-    public SqlSessionFactory sqlSessionFactorys(DataSource dataSource) throws Exception
-    {
+    public SqlSessionFactory sqlSessionFactorys(DataSource dataSource) throws Exception {
         String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
         String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
         String configLocation = env.getProperty("mybatis-plus.configLocation");

+ 19 - 10
fs-user-app/src/main/resources/application-dev.yml

@@ -3,13 +3,13 @@ spring:
     # redis 配置
     redis:
         # 地址
-        host: 127.0.0.1
+        host: localhost
         # 端口,默认为6379
         port: 6379
         # 密码
         password:
         # 连接超时时间
-        timeout: 30s
+        timeout: 10s
         lettuce:
             pool:
                 # 连接池中的最小空闲连接
@@ -20,7 +20,6 @@ spring:
                 max-active: 8
                 # #连接池最大阻塞等待时间(使用负值表示没有限制)
                 max-wait: -1ms
-        database: 0
     datasource:
         mysql:
             type: com.alibaba.druid.pool.DruidDataSource
@@ -34,10 +33,9 @@ spring:
                 # 从库数据源
                 slave:
                     # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
+                    url: jdbc:mysql://139.186.77.83:3306/ylrz_scrm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: Rtroot
+                    password: Rtroot
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量
@@ -65,8 +63,8 @@ spring:
                     allow:
                     url-pattern: /druid/*
                     # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
+                    login-username:
+                    login-password:
                 filter:
                     stat:
                         enabled: true
@@ -83,7 +81,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://139.186.77.83/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://139.186.77.83:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: Rtroot
                     password: Rtroot
                 # 初始连接数
@@ -125,3 +123,14 @@ spring:
                     wall:
                         config:
                             multi-statement-allow: true
+
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

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

@@ -62,7 +62,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: druid
+    active: dev
     #    active: druid
     include: config
   # 文件上传