浏览代码

Merge remote-tracking branch 'origin/master'

zyp 3 天之前
父节点
当前提交
fd86a9ff52
共有 25 个文件被更改,包括 753 次插入1055 次删除
  1. 34 32
      fs-admin/src/main/java/com/fs/his/controller/FsUserController.java
  2. 18 0
      fs-admin/src/main/java/com/fs/his/controller/FsUserOnlineStateController.java
  3. 18 0
      fs-common/src/main/java/com/fs/common/utils/StringUtils.java
  4. 8 3
      fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java
  5. 18 0
      fs-company/src/main/java/com/fs/company/controller/store/FsUserOnlineStateController.java
  6. 3 0
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  7. 1 1
      fs-qw-task/src/main/java/com/fs/app/task/qwTask.java
  8. 13 0
      fs-qw-task/src/main/java/com/fs/framework/config/ThreadPoolConfig.java
  9. 3 2
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java
  10. 18 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  11. 15 0
      fs-service/src/main/java/com/fs/his/domain/FsUser.java
  12. 4 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java
  13. 20 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  14. 318 77
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java
  15. 0 168
      fs-service/src/main/resources/application-druid-hzyy-test.yml
  16. 0 169
      fs-service/src/main/resources/application-druid-jzzx-test.yml
  17. 0 142
      fs-service/src/main/resources/application-druid-kyt-test.yml
  18. 0 150
      fs-service/src/main/resources/application-druid-qdtst-test.yml
  19. 0 148
      fs-service/src/main/resources/application-druid-sxjz-test.yml
  20. 0 153
      fs-service/src/main/resources/application-druid-xfk-test.yml
  21. 8 5
      fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml
  22. 1 0
      fs-user-app/src/main/java/com/fs/app/controller/CourseController.java
  23. 12 3
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  24. 235 0
      fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  25. 6 0
      fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

+ 34 - 32
fs-admin/src/main/java/com/fs/his/controller/FsUserController.java

@@ -1,9 +1,6 @@
 package com.fs.his.controller;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSON;
@@ -93,6 +90,9 @@ public class FsUserController extends BaseController
         if (fsUser.getPhoneMk()!=null&&fsUser.getPhoneMk()!=""){
             fsUser.setPhone(encryptPhone(fsUser.getPhoneMk()));
         }
+        if(StringUtils.isNotEmpty(fsUser.getPhone())){
+            fsUser.setPhone(encryptPhone(fsUser.getPhone()));
+        }
         List<FsUserVO> list = fsUserService.selectFsUserListVO(fsUser);
         for (FsUserVO fsUserVO : list) {
             if(fsUserVO.getPhone() != null&&fsUserVO.getPhone()!=""){
@@ -252,10 +252,11 @@ public class FsUserController extends BaseController
     public R darkRoomList(FsUserPageListParam param) {
 //        startPage();
 //        PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
-        for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
-            fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
+        //判断是否是电话号码
+        if(StringUtils.isFullNumber(param.getKeyword()) && param.getKeyword().trim().length() == 11){
+            param.setKeyword(encryptPhone(param.getKeyword()));
         }
+        PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("rows", fsUserPageListVOPageInfo.getList());
         map.put("total", fsUserPageListVOPageInfo.getTotal());
@@ -273,12 +274,13 @@ public class FsUserController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('his:user:blacklist')")
     @GetMapping("/blacklist")
-    @ApiOperation("小黑屋")
+    @ApiOperation("黑名单")
     public R blacklist(FsUserPageListParam param) {
-        PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
-        for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
-            fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
+        //判断是否是电话号码
+        if(StringUtils.isFullNumber(param.getKeyword()) && param.getKeyword().trim().length() == 11){
+            param.setKeyword(encryptPhone(param.getKeyword()));
         }
+        PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("rows", fsUserPageListVOPageInfo.getList());
         map.put("total", fsUserPageListVOPageInfo.getTotal());
@@ -307,26 +309,26 @@ public class FsUserController extends BaseController
         return userIntegralLogsService.addIntegralTemplate(integralTemplateParam);
     }
 
-    @PutMapping("/encryptPhoneTemp")
-    @ApiOperation("临时接口")
-    public void encryptPhoneTemp(){
-        FsUser fsUser = new FsUser();
-        List<FsUser> list = fsUserService.selectFsUserList(fsUser);
-        List<FsUser> fsUserList = list.stream().peek(v -> v.setPhone(encryptPhone(v.getPhone()))).collect(Collectors.toList());
-
-        // 分批次处理,一次提交500条
-        List<List<FsUser>> batches = Lists.partition(fsUserList, 500);
-        batches.forEach(batch -> {
-            SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
-            try {
-                FsUserMapper mapper = sqlSession.getMapper(FsUserMapper.class);
-                batch.forEach(mapper::updateFsUser);
-                sqlSession.commit();
-            } finally {
-                sqlSession.close();
-            }
-        });
-
-    }
+//    @PutMapping("/encryptPhoneTemp")
+//    @ApiOperation("临时接口")
+//    public void encryptPhoneTemp(){
+//        FsUser fsUser = new FsUser();
+//        List<FsUser> list = fsUserService.selectFsUserList(fsUser);
+//        List<FsUser> fsUserList = list.stream().peek(v -> v.setPhone(encryptPhone(v.getPhone()))).collect(Collectors.toList());
+//
+//        // 分批次处理,一次提交500条
+//        List<List<FsUser>> batches = Lists.partition(fsUserList, 500);
+//        batches.forEach(batch -> {
+//            SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
+//            try {
+//                FsUserMapper mapper = sqlSession.getMapper(FsUserMapper.class);
+//                batch.forEach(mapper::updateFsUser);
+//                sqlSession.commit();
+//            } finally {
+//                sqlSession.close();
+//            }
+//        });
+//
+//    }
 
 }

+ 18 - 0
fs-admin/src/main/java/com/fs/his/controller/FsUserOnlineStateController.java

@@ -5,6 +5,7 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.his.domain.FsUserOnlineState;
 import com.fs.his.service.IFsUserOnlineStateService;
@@ -14,6 +15,9 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import java.util.List;
 
+import static com.fs.his.utils.PhoneUtil.decryptPhoneMk;
+import static com.fs.his.utils.PhoneUtil.encryptPhone;
+
 /**
  * 用户上线情况Controller
  *
@@ -35,7 +39,21 @@ public class FsUserOnlineStateController extends BaseController
     public TableDataInfo list(FsUserOnlineState fsUserOnlineState)
     {
         startPage();
+        if(StringUtils.isNotEmpty(fsUserOnlineState.getPhone())){
+            fsUserOnlineState.setPhone(encryptPhone(fsUserOnlineState.getPhone()));
+        }
         List<FsUserOnlineState> list = fsUserOnlineStateService.selectFsUserOnlineStateList(fsUserOnlineState);
+        if(!list.isEmpty()){
+            for (FsUserOnlineState userOnlineState : list) {
+                if(userOnlineState.getPhone() != null && userOnlineState.getPhone() != ""){
+                    if (userOnlineState.getPhone().length()>11){
+                        userOnlineState.setPhone(decryptPhoneMk(userOnlineState.getPhone()));
+                    }else {
+                        userOnlineState.setPhone(userOnlineState.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                    }
+                }
+            }
+        }
         return getDataTable(list);
     }
 

+ 18 - 0
fs-common/src/main/java/com/fs/common/utils/StringUtils.java

@@ -532,4 +532,22 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
     {
         return (T) obj;
     }
+
+    /**
+     * 判断字符串是否是纯数字,true-是;false-否
+     * @param str
+     * @return
+     */
+    public static boolean isFullNumber(String str) {
+        if (str == null) {
+            return false;
+        }
+        for (char s : str.toCharArray ()) {
+            if (!Character.isDigit(s)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
 }

+ 8 - 3
fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java

@@ -9,6 +9,7 @@ import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.service.IFsUserCompanyUserService;
 import com.fs.framework.security.LoginUser;
@@ -241,8 +242,9 @@ public class FsUserController extends BaseController
     public R darkRoomList(FsUserPageListParam param) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setUserId(loginUser.getUser().getUserId());
-//        startPage();
-//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        if(StringUtils.isFullNumber(param.getKeyword()) && param.getKeyword().trim().length() == 11){
+            param.setKeyword(encryptPhone(param.getKeyword()));
+        }
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("rows", fsUserPageListVOPageInfo.getList());
@@ -261,10 +263,13 @@ public class FsUserController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('users:user:blacklist')")
     @GetMapping("/blacklist")
-    @ApiOperation("小黑屋")
+    @ApiOperation("黑名单")
     public R blacklist(FsUserPageListParam param) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setUserId(loginUser.getUser().getUserId());
+        if(StringUtils.isFullNumber(param.getKeyword()) && param.getKeyword().trim().length() == 11){
+            param.setKeyword(encryptPhone(param.getKeyword()));
+        }
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("rows", fsUserPageListVOPageInfo.getList());

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

@@ -6,6 +6,7 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
@@ -17,6 +18,9 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
+import static com.fs.his.utils.PhoneUtil.decryptPhoneMk;
+import static com.fs.his.utils.PhoneUtil.encryptPhone;
+
 /**
  * 用户上线情况Controller
  *
@@ -48,7 +52,21 @@ public class FsUserOnlineStateController extends BaseController
         } else{
             fsUserOnlineState.setCompanyUserId( loginUser.getUser().getUserId());
         }
+        if(StringUtils.isNotEmpty(fsUserOnlineState.getPhone())){
+            fsUserOnlineState.setPhone(encryptPhone(fsUserOnlineState.getPhone()));
+        }
         List<FsUserOnlineState> list = fsUserOnlineStateService.selectFsUserOnlineStateList(fsUserOnlineState);
+        if(!list.isEmpty()){
+            for (FsUserOnlineState userOnlineState : list) {
+                if(userOnlineState.getPhone() != null && userOnlineState.getPhone() != ""){
+                    if (userOnlineState.getPhone().length()>11){
+                        userOnlineState.setPhone(decryptPhoneMk(userOnlineState.getPhone()));
+                    }else {
+                        userOnlineState.setPhone(userOnlineState.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                    }
+                }
+            }
+        }
         return getDataTable(list);
     }
 

+ 3 - 0
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -8,6 +8,7 @@ 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.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
@@ -29,6 +30,8 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
 
+import static com.fs.his.utils.PhoneUtil.encryptPhone;
+
 @Api(tags = "会员管理接口")
 @RestController
 @Slf4j

+ 1 - 1
fs-qw-task/src/main/java/com/fs/app/task/qwTask.java

@@ -182,7 +182,7 @@ public class qwTask {
     }
 
     /**
-     * 定时任务:获取企业微信SOP群发消息反馈结果(新版-按营期发送)
+     *
      * 执行时间:每天上午 8:00:00
      * 功能:获取通过企业微信接口发送的SOP客户群发消息的反馈结果
      */

+ 13 - 0
fs-qw-task/src/main/java/com/fs/framework/config/ThreadPoolConfig.java

@@ -4,8 +4,10 @@ import com.fs.common.utils.Threads;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
@@ -33,6 +35,17 @@ public class ThreadPoolConfig
     // 线程池维护线程所允许的空闲时间
     private int keepAliveSeconds = 300;
 
+
+    @Bean
+    public TaskScheduler taskScheduler(){
+        ThreadPoolTaskScheduler scheduler=new ThreadPoolTaskScheduler();
+        scheduler.setPoolSize(18);
+        scheduler.setThreadNamePrefix("scheduled-task-");
+        scheduler.setAwaitTerminationSeconds(60);
+        scheduler.setWaitForTasksToCompleteOnShutdown(true);
+        return scheduler;
+    }
+
     @Bean(name = "threadPoolTaskExecutor")
     public ThreadPoolTaskExecutor threadPoolTaskExecutor()
     {

+ 3 - 2
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java

@@ -278,12 +278,13 @@ public interface FsUserCourseMapper
      */
     Integer selectTodayCourseWatchLogCountByUserIdAndProjectId(@Param("userId") Long userId, @Param("projectId") Long projectId);
 
-    @Select("select course_id,course_name,description,img_url,second_img secondImg,views from fs_user_course where is_private = 0 order by sort,course_id")
+    @Select("select course_id,course_name,description,img_url,second_img secondImg,views from fs_user_course where " +
+            " is_private = 0 and is_del = 0 order by sort,course_id")
     List<FsUserCourseVideoAppletVO> selectFsUserCourseVideoApplet();
 
     @Select("select video_id,title,course_id,video_url,SEC_TO_TIME(duration) as total_duration," +
             "thumbnail videoImgUrl,description videoDescription,video_url videoUrl,question_bank_id questionBankId " +
-            " from fs_user_course_video where course_id = #{courseId}  order by course_sort,video_id")
+            " from fs_user_course_video where course_id = #{courseId} and is_del = 0 order by course_sort,video_id")
     List<FsUserCourseVideoAppletVO.FsUserCourseVideo> selectFsUserCourseVideoAppletByCourseId(@Param("courseId") Long courseId);
 
 }

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

@@ -1192,7 +1192,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
             System.out.println("小程序id"+user.getCourseMaOpenId());
             //查出公司绑定openid并赋值
-            packetParam.setOpenId(fsUserWx.getOpenId());
+//            packetParam.setOpenId(fsUserWx.getOpenId());
         }
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
@@ -1439,7 +1439,23 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     @Override
     public List<FsUserCourseVideoPageListVO> pageListCourseVideo(UserCourseVideoPageParam param) {
-        return fsUserCourseVideoMapper.selectFsUserCourseVideoPageList(param);
+        List<FsUserCourseVideoPageListVO> courseVideoPageListVOList = fsUserCourseVideoMapper.selectFsUserCourseVideoPageList(param);
+        if (courseVideoPageListVOList.isEmpty()) {
+            return new LinkedList<>();
+        }
+
+        List<SysDictData> courseProject = dictDataMapper.selectDictDataByType("sys_course_project");
+        Map<String, String> projectMap = courseProject.stream()
+                .collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));
+
+        courseVideoPageListVOList.forEach(vo -> {
+            if (vo.getProjectId() != null) {
+                String projectName = projectMap.get(vo.getProjectId().toString());
+                vo.setProjectName(projectName);
+            }
+        });
+
+        return courseVideoPageListVOList;
     }
 
     @Override

+ 15 - 0
fs-service/src/main/java/com/fs/his/domain/FsUser.java

@@ -159,6 +159,7 @@ public class FsUser extends BaseEntity
         else{
             this.nickName= nickname;
         }
+        this.nickname = this.nickName;
     }
 
     public String getNickName()
@@ -183,4 +184,18 @@ public class FsUser extends BaseEntity
      * 项目ID
      */
     private Long projectId;
+
+    /**
+     * 昵称
+     * **/
+    @TableField(exist = false)
+    private String nickname;
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java

@@ -167,6 +167,10 @@ public class FsPackageServiceImpl implements IFsPackageService {
 
     @Override
     public List<FsPackageListVO> selectFsPackageListVO(FsPackageParam fsPackage) {
+        Integer privateType = fsPackage.getPrivateType();
+        if (privateType != null) {
+            fsPackage.setIsShow(0);
+        }
         return fsPackageMapper.selectFsPackageListVO(fsPackage);
     }
 

+ 20 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -81,6 +81,7 @@ import com.fs.his.service.IFsUserService;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import static com.fs.his.utils.PhoneUtil.decryptPhoneMk;
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
 
 /**
@@ -557,6 +558,15 @@ public class FsUserServiceImpl implements IFsUserService
             if (StringUtils.isEmpty(fsUserPageListVO.getNickname())){
                 fsUserPageListVO.setNickname("用户暂未授权昵称");
             }
+
+            //解密
+            if(fsUserPageListVO.getPhone() != null && fsUserPageListVO.getPhone() != ""){
+                if (fsUserPageListVO.getPhone().length()>11){
+                    fsUserPageListVO.setPhone(decryptPhoneMk(fsUserPageListVO.getPhone()));
+                }else {
+                    fsUserPageListVO.setPhone(fsUserPageListVO.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                }
+            }
         }
 
         return new PageInfo<>(fsUserPageListVOS);
@@ -686,6 +696,16 @@ public class FsUserServiceImpl implements IFsUserService
 //                    item.setIsRepeat(isRepeat);
 //                }
             }
+
+            // 解密
+            if(item.getPhone() != null && item.getPhone() != ""){
+                if (item.getPhone().length()>11){
+                    item.setPhone(decryptPhoneMk(item.getPhone()));
+                }else {
+                    item.setPhone(item.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                }
+            }
+
         }
 
         TableDataInfo rspData = new TableDataInfo();

+ 318 - 77
fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java

@@ -59,6 +59,7 @@ import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
@@ -571,135 +572,375 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
     @Override
     public void qwSopLogsResultNew() {
 
+
         logger.info("开始执行企业微信群发消息结果查询任务");
         long startTime = System.currentTimeMillis();
 
         List<QwSopLogs> qwSopLogsList = qwSopLogsMapper.selectSopLogsByCreateCorpMassSendResult();
         if (qwSopLogsList.isEmpty()) {
-            logger.info("没有需要查询结果的群发消息记录");
-            return;
+            return ;
         }
 
-
+        // 分组处理
         Map<String, List<QwSopLogs>> grouped = qwSopLogsList.stream().collect(
                 Collectors.groupingBy(log -> log.getQwUserid() + "|" + log.getCorpId() + "|" + log.getMsgId())
         );
-        for (Map.Entry<String, List<QwSopLogs>> entry : grouped.entrySet()) {
-            String key = entry.getKey();
-            List<QwSopLogs> corpLogs = entry.getValue();
 
-            String[] keys = key.split("\\|");
-            String qwUserid = keys[0];
-            String corpId = keys[1];
-            String msgID = keys[2];
+        // 线程安全的数据结构
+        List<QwSopLogs> allUpdates = Collections.synchronizedList(new ArrayList<>());
+        Queue<Map.Entry<String, List<QwSopLogs>>> taskQueue = new ConcurrentLinkedQueue<>(grouped.entrySet());
+        Queue<Map.Entry<String, List<QwSopLogs>>> apiFailedTasks = new ConcurrentLinkedQueue<>();
+        ExecutorService executor = Executors.newFixedThreadPool(10);
+
+        AtomicInteger totalGroupsProcessed = new AtomicInteger(0); // 处理的分组数
+        AtomicInteger totalRecordsUpdated = new AtomicInteger(0);  // 更新的记录数
+
+        int batchSize = 300; // 每300个组批量更新一次
+        int maxRetries = 3;   // 最大重试次数
+
+        // 处理所有任务(包括重试)
+        for (int retryCount = 0; retryCount <= maxRetries; retryCount++) {
+            int currentBatchCount = 0;
+
+            while (!taskQueue.isEmpty()) {
+                int currentBatchSize = Math.min(batchSize - currentBatchCount, taskQueue.size());
+                CountDownLatch batchLatch = new CountDownLatch(currentBatchSize);
+
+                // 处理当前批次任务
+                for (int i = 0; i < currentBatchSize; i++) {
+                    Map.Entry<String, List<QwSopLogs>> entry = taskQueue.poll();
+                    executor.submit(() -> {
+                        try {
+                            // 处理单个分组(传入apiFailedTasks)
+                            List<QwSopLogs> updates = processSingleGroup(entry, apiFailedTasks);
+                            if (updates != null) {
+                                synchronized (allUpdates) {
+                                    allUpdates.addAll(updates);
+                                }
+                                // 统计更新记录数
+                                totalRecordsUpdated.addAndGet(updates.size());
+                            }
+
+                            // 统计处理的分组数
+                            totalGroupsProcessed.incrementAndGet();
+                        } finally {
+                            batchLatch.countDown();
+                        }
+                    });
+                }
+
+                // 等待当前批次完成
+                try {
+                    batchLatch.await();
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+
+                currentBatchCount += currentBatchSize;
 
-            QwGetGroupmsgSendParam param = new QwGetGroupmsgSendParam();
-            param.setMsgid(msgID);
-            param.setUserid(qwUserid);
-            param.setLimit(1000);
+                // 每处理1000个组或任务队列空时更新数据库
+                if (currentBatchCount >= batchSize || taskQueue.isEmpty()) {
+                    synchronized (allUpdates) {
+                        if (!allUpdates.isEmpty()) {
+                            batchUpdateDatabase(new ArrayList<>(allUpdates));
+                            logger.info("每处理300个组或任务队列空时更新数据库:"+new ArrayList<>(allUpdates).size());
+                            allUpdates.clear();
+                        }
 
-            fetchAndProcessAllPages(param, corpId, corpLogs, msgID);
+                    }
+                    currentBatchCount = 0;
+                }
+            }
 
+            // 准备下一轮重试
+            if (retryCount < maxRetries) {
+                taskQueue.addAll(apiFailedTasks);
+                apiFailedTasks.clear();
+            }
         }
 
-        long endTime = System.currentTimeMillis();
-        logger.info("企业微信群发消息结果查询任务完成,处理记录总数: {},总耗时: {}ms",
-                qwSopLogsList.size(), (endTime - startTime));
+        // 最终更新剩余数据
+        synchronized (allUpdates) {
+            if (!allUpdates.isEmpty()) {
+                logger.info("最终更新剩余数据:"+new ArrayList<>(allUpdates).size());
+                batchUpdateDatabase(new ArrayList<>(allUpdates));
+            }
+        }
+
+        executor.shutdown();
+        try {
+            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
+                executor.shutdownNow();
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
 
+        long endTime = System.currentTimeMillis();
+        logger.info("成功处理分组数: " + totalGroupsProcessed.get());
+        logger.info("企业微信群发消息结果查询任务完成-更新记录总数:{},总耗时:{} " , totalRecordsUpdated.get(),(endTime - startTime));
     }
 
-    private void fetchAndProcessAllPages(QwGetGroupmsgSendParam param, String corpId, List<QwSopLogs> logs, String msgId) {
+    private List<QwSopLogs> processSingleGroup(Map.Entry<String, List<QwSopLogs>> entry, Queue<Map.Entry<String, List<QwSopLogs>>> apiFailedTasks) {
+
+        String key = entry.getKey();
+        List<QwSopLogs> corpLogs = entry.getValue();
+        String[] keys = key.split("\\|");
+        String qwUserid = keys[0];
+        String corpId = keys[1];
+        String msgID = keys[2];
+
+        QwGetGroupmsgSendParam param = new QwGetGroupmsgSendParam();
+        param.setMsgid(msgID);
+        param.setUserid(qwUserid);
+        param.setLimit(1000);
+
+        List<QwSopLogs> groupUpdates = new ArrayList<>();
         String nextCursor = null;
+        boolean apiSuccess = true;
 
         do {
             param.setCursor(nextCursor);
+            QwGroupmsgSendResult result = fetchWithRetry(param, corpId); // 重试3次
+
+            // API调用失败处理
+            if (result == null || result.getErrCode() != 0) {
+                apiSuccess = false;
+                break;
+            }
+
+            // 处理当前页结果
+            List<QwSopLogs> pageUpdates = processPageResult(result, corpLogs, corpId, msgID);
+            groupUpdates.addAll(pageUpdates);
+            nextCursor = result.getNextCursor();
+
+        } while (nextCursor != null && !nextCursor.isEmpty());
+
+        // API调用失败时返回null,将任务加入失败队列
+        if (!apiSuccess) {
+            apiFailedTasks.offer(entry);
+            return null;
+        }
+
+        return groupUpdates;
+    }
+
+    private QwGroupmsgSendResult fetchWithRetry(QwGetGroupmsgSendParam param, String corpId) {
+        int retryCount = 0;
+        while (retryCount <= 3) {
             QwGroupmsgSendResult result = qwApiService.getGroupmsgSendResult(param, corpId);
 
+            // 请求失败情况
             if (result == null) {
-                logger.error("接口调用失败: {}", param);
-                return;
+                retryCount++;
+                sleepWithJitter(2000);
+                continue;
             }
 
-            if (result.getErrCode() == 45033) {
-                try {
-                    Thread.sleep(2000 + new Random().nextInt(1000));
-                    result = qwApiService.getGroupmsgSendResult(param, corpId);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    logger.error("线程中断", e);
-                    return;
-                }
+            // 成功情况
+            if (result.getErrCode() == 0) {
+                return result;
             }
 
-            if (result.getErrCode() != 0) {
-                logger.error("查询失败: {}, errCode: {}, errMsg: {}", param, result.getErrCode(), result.getErrMsg());
-                return;
+            // 需要重试的错误码
+            if (result.getErrCode() == 45033 || result.getErrCode() == -1) {
+                retryCount++;
+                sleepWithJitter(2000 + new Random().nextInt(1000));
+                continue;
             }
 
-            processPageResult(result, logs, corpId, msgId);
-            nextCursor = result.getNextCursor();
-
-        } while (nextCursor != null && !nextCursor.isEmpty());
+            // 其他错误码不重试
+            return result;
+        }
+        return null; // 超过重试次数
     }
 
+    private void sleepWithJitter(int baseMillis) {
+        try {
+            int sleepTime = baseMillis + (new Random().nextInt(1000));
+            Thread.sleep(sleepTime);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+    }
 
-    private void processPageResult(QwGroupmsgSendResult result, List<QwSopLogs> logs, String corpId, String msgId) {
+    private List<QwSopLogs> processPageResult(QwGroupmsgSendResult result, List<QwSopLogs> logs, String corpId, String msgId) {
         Map<String, SendItemResult> sendMap = result.getSendList().stream()
                 .collect(Collectors.toMap(
                         r -> r.getUserId() + "_" + r.getExternalUserId() + "_" + corpId + "_" + msgId,
                         Function.identity(),
-                        (a, b) -> a  // 如果重复,保留第一个
+                        (a, b) -> a
                 ));
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         String now = LocalDateTime.now().format(formatter);
-
-        // 只处理匹配得上的记录
         List<QwSopLogs> matchedLogs = new ArrayList<>();
 
         for (QwSopLogs log : logs) {
             String logKey = log.getQwUserid() + "_" + log.getExternalUserId() + "_" + log.getCorpId() + "_" + msgId;
             SendItemResult matched = sendMap.get(logKey);
-
-            if (matched != null) {
-
-                switch (matched.getStatus()) {
-                    case 0:
-                        log.setSendStatus(5L);
-                        log.setRemark("员工未在规定时间发送");
-                        break;
-                    case 1:
-                        log.setSendStatus(1L);
-                        log.setReceivingStatus(1L);
-                        break;
-                    case 2:
-                        log.setSendType(2);
-                        log.setSendStatus(3L);
-                        log.setRemark("因客户不是好友导致发送失败,补发");
-                        log.setReceivingStatus(0L);
-                        log.setSendTime(now);
-                        log.setSort(30000001);
-                    case 3:
-                        log.setSendType(2);
-                        log.setSendStatus(3L);
-                        log.setRemark("客户已经收到其他群发消息,补发");
-                        log.setReceivingStatus(0L);
-                        log.setSendTime(now);
-                        log.setSort(30000001);
-                        break;
-                    default:
-                        break;
-                }
-
-                matchedLogs.add(log);
+            if (matched == null) continue;
+
+            switch (matched.getStatus()) {
+                case 0:
+                    log.setSendStatus(5L);
+                    log.setRemark("员工未在规定时间发送");
+                    break;
+                case 1:
+                    log.setSendStatus(1L);
+                    log.setReceivingStatus(1L);
+                    break;
+                case 2:
+                    log.setSendType(2);
+                    log.setSendStatus(3L);
+                    log.setRemark("因客户不是好友导致发送失败,补发");
+                    log.setReceivingStatus(0L);
+                    log.setSendTime(now);
+                    log.setSort(30000001);
+                    break;
+                case 3:
+                    log.setSendType(2);
+                    log.setSendStatus(3L);
+                    log.setRemark("客户已经收到其他群发消息,补发");
+                    log.setReceivingStatus(0L);
+                    log.setSendTime(now);
+                    log.setSort(30000001);
+                    break;
             }
+            matchedLogs.add(log);
         }
-
-        if (!matchedLogs.isEmpty()) {
-            batchUpdateDatabase(matchedLogs);
-        }
+        return matchedLogs;
     }
 
+//    @Override
+//    public void qwSopLogsResultNew() {
+//
+//        logger.info("开始执行企业微信群发消息结果查询任务");
+//        long startTime = System.currentTimeMillis();
+//
+//        List<QwSopLogs> qwSopLogsList = qwSopLogsMapper.selectSopLogsByCreateCorpMassSendResult();
+//        if (qwSopLogsList.isEmpty()) {
+//            logger.info("没有需要查询结果的群发消息记录");
+//            return;
+//        }
+//
+//
+//        Map<String, List<QwSopLogs>> grouped = qwSopLogsList.stream().collect(
+//                Collectors.groupingBy(log -> log.getQwUserid() + "|" + log.getCorpId() + "|" + log.getMsgId())
+//        );
+//        for (Map.Entry<String, List<QwSopLogs>> entry : grouped.entrySet()) {
+//            String key = entry.getKey();
+//            List<QwSopLogs> corpLogs = entry.getValue();
+//
+//            String[] keys = key.split("\\|");
+//            String qwUserid = keys[0];
+//            String corpId = keys[1];
+//            String msgID = keys[2];
+//
+//            QwGetGroupmsgSendParam param = new QwGetGroupmsgSendParam();
+//            param.setMsgid(msgID);
+//            param.setUserid(qwUserid);
+//            param.setLimit(1000);
+//
+//            fetchAndProcessAllPages(param, corpId, corpLogs, msgID);
+//
+//        }
+//
+//        long endTime = System.currentTimeMillis();
+//        logger.info("企业微信群发消息结果查询任务完成,处理记录总数: {},总耗时: {}ms",
+//                qwSopLogsList.size(), (endTime - startTime));
+//
+//    }
+//    private void fetchAndProcessAllPages(QwGetGroupmsgSendParam param, String corpId, List<QwSopLogs> logs, String msgId) {
+//        String nextCursor = null;
+//
+//        do {
+//            param.setCursor(nextCursor);
+//            QwGroupmsgSendResult result = qwApiService.getGroupmsgSendResult(param, corpId);
+//
+//            if (result == null) {
+//                logger.error("接口调用失败: {}", param);
+//                return;
+//            }
+//
+//            if (result.getErrCode() == 45033) {
+//                try {
+//                    Thread.sleep(2000 + new Random().nextInt(1000));
+//                    result = qwApiService.getGroupmsgSendResult(param, corpId);
+//                } catch (InterruptedException e) {
+//                    Thread.currentThread().interrupt();
+//                    logger.error("线程中断", e);
+//                    return;
+//                }
+//            }
+//
+//            if (result.getErrCode() != 0) {
+//                logger.error("查询失败: {}, errCode: {}, errMsg: {}", param, result.getErrCode(), result.getErrMsg());
+//                return;
+//            }
+//
+//            processPageResult(result, logs, corpId, msgId);
+//            nextCursor = result.getNextCursor();
+//
+//        } while (nextCursor != null && !nextCursor.isEmpty());
+//    }
+//    private void processPageResult(QwGroupmsgSendResult result, List<QwSopLogs> logs, String corpId, String msgId) {
+//        Map<String, SendItemResult> sendMap = result.getSendList().stream()
+//                .collect(Collectors.toMap(
+//                        r -> r.getUserId() + "_" + r.getExternalUserId() + "_" + corpId + "_" + msgId,
+//                        Function.identity(),
+//                        (a, b) -> a  // 如果重复,保留第一个
+//                ));
+//
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//        String now = LocalDateTime.now().format(formatter);
+//
+//        // 只处理匹配得上的记录
+//        List<QwSopLogs> matchedLogs = new ArrayList<>();
+//
+//        for (QwSopLogs log : logs) {
+//            String logKey = log.getQwUserid() + "_" + log.getExternalUserId() + "_" + log.getCorpId() + "_" + msgId;
+//            SendItemResult matched = sendMap.get(logKey);
+//
+//            if (matched != null) {
+//
+//                switch (matched.getStatus()) {
+//                    case 0:
+//                        log.setSendStatus(5L);
+//                        log.setRemark("员工未在规定时间发送");
+//                        break;
+//                    case 1:
+//                        log.setSendStatus(1L);
+//                        log.setReceivingStatus(1L);
+//                        break;
+//                    case 2:
+//                        log.setSendType(2);
+//                        log.setSendStatus(3L);
+//                        log.setRemark("因客户不是好友导致发送失败,补发");
+//                        log.setReceivingStatus(0L);
+//                        log.setSendTime(now);
+//                        log.setSort(30000001);
+//                    case 3:
+//                        log.setSendType(2);
+//                        log.setSendStatus(3L);
+//                        log.setRemark("客户已经收到其他群发消息,补发");
+//                        log.setReceivingStatus(0L);
+//                        log.setSendTime(now);
+//                        log.setSort(30000001);
+//                        break;
+//                    default:
+//                        break;
+//                }
+//
+//                matchedLogs.add(log);
+//            }
+//        }
+//
+//        if (!matchedLogs.isEmpty()) {
+//            batchUpdateDatabase(matchedLogs);
+//        }
+//    }
+
 
     /**
      * 批量更新数据库

+ 0 - 168
fs-service/src/main/resources/application-druid-hzyy-test.yml

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

+ 0 - 169
fs-service/src/main/resources/application-druid-jzzx-test.yml

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

+ 0 - 142
fs-service/src/main/resources/application-druid-kyt-test.yml

@@ -1,142 +0,0 @@
-# 数据源配置
-spring:
-  profiles:
-    include: common,config-druid-kyt
-  # redis 配置
-  redis:
-    # 地址
-    host: 127.0.0.1
-    # 端口,默认为6379
-    port: 6379
-    # 密码
-    password:
-    # 连接超时时间
-    timeout: 30s
-    lettuce:
-      pool:
-        # 连接池中的最小空闲连接
-        min-idle: 0
-        # 连接池中的最大空闲连接
-        max-idle: 8
-        # 连接池的最大数据库连接数
-        max-active: 8
-        # #连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-wait: -1ms
-    database: 0
-  datasource:
-    mysql:
-      type: com.alibaba.druid.pool.DruidDataSource
-      driverClassName: com.mysql.cj.jdbc.Driver
-      druid:
-        # 主库数据源
-        master:
-          url: jdbc:mysql://49.235.177.79:2345/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-          username: root
-          password: Ylrztek250218!3@.
-        # 从库数据源
-        slave:
-          # 从数据源开关/默认关闭
-          enabled: false
-          url:
-          username:
-          password:
-        # 初始连接数
-        initialSize: 5
-        # 最小连接池数量
-        minIdle: 10
-        # 最大连接池数量
-        maxActive: 20
-        # 配置获取连接等待超时的时间
-        maxWait: 60000
-        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-        timeBetweenEvictionRunsMillis: 60000
-        # 配置一个连接在池中最小生存的时间,单位是毫秒
-        minEvictableIdleTimeMillis: 300000
-        # 配置一个连接在池中最大生存的时间,单位是毫秒
-        maxEvictableIdleTimeMillis: 900000
-        # 配置检测连接是否有效
-        validationQuery: SELECT 1 FROM DUAL
-        testWhileIdle: true
-        testOnBorrow: false
-        testOnReturn: false
-        webStatFilter:
-          enabled: true
-        statViewServlet:
-          enabled: true
-          # 设置白名单,不填则允许所有访问
-          allow:
-          url-pattern: /druid/*
-          # 控制台管理用户名和密码
-          login-username: fs
-          login-password: 123456
-        filter:
-          stat:
-            enabled: true
-            # 慢SQL记录
-            log-slow-sql: true
-            slow-sql-millis: 1000
-            merge-sql: true
-          wall:
-            config:
-              multi-statement-allow: true
-    sop:
-      type: com.alibaba.druid.pool.DruidDataSource
-      driverClassName: com.mysql.cj.jdbc.Driver
-      druid:
-        # 主库数据源
-        master:
-          url: jdbc:mysql://49.235.177.79:2345/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-          username: root
-          password: Ylrztek250218!3@.
-        # 初始连接数
-        initialSize: 5
-        # 最小连接池数量
-        minIdle: 10
-        # 最大连接池数量
-        maxActive: 20
-        # 配置获取连接等待超时的时间
-        maxWait: 60000
-        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-        timeBetweenEvictionRunsMillis: 60000
-        # 配置一个连接在池中最小生存的时间,单位是毫秒
-        minEvictableIdleTimeMillis: 300000
-        # 配置一个连接在池中最大生存的时间,单位是毫秒
-        maxEvictableIdleTimeMillis: 900000
-        # 配置检测连接是否有效
-        validationQuery: SELECT 1 FROM DUAL
-        testWhileIdle: true
-        testOnBorrow: false
-        testOnReturn: false
-        webStatFilter:
-          enabled: true
-        statViewServlet:
-          enabled: true
-          # 设置白名单,不填则允许所有访问
-          allow:
-          url-pattern: /druid/*
-          # 控制台管理用户名和密码
-          login-username: fs
-          login-password: 123456
-        filter:
-          stat:
-            enabled: true
-            # 慢SQL记录
-            log-slow-sql: true
-            slow-sql-millis: 1000
-            merge-sql: true
-          wall:
-            config:
-              multi-statement-allow: true
-rocketmq:
-  name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
-  producer:
-    group: my-producer-group
-    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
-  consumer:
-    group: test-group
-    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
-openIM:
-  secret: op
-  userID: im

+ 0 - 150
fs-service/src/main/resources/application-druid-qdtst-test.yml

@@ -1,150 +0,0 @@
-# 数据源配置
-spring:
-    profiles:
-        include: config-druid-qdtst,common
-    # redis 配置
-    redis:
-        # 地址
-        host: 127.0.0.1
-        # 端口,默认为6379
-        port: 6379
-        # 数据库索引
-        database: 0
-        # 密码
-        password:
-        # 连接超时时间
-        timeout: 20s
-        lettuce:
-            pool:
-                # 连接池中的最小空闲连接
-                min-idle: 0
-                # 连接池中的最大空闲连接
-                max-idle: 8
-                # 连接池的最大数据库连接数
-                max-active: 8
-                # #连接池最大阻塞等待时间(使用负值表示没有限制)
-                max-wait: -1ms
-    datasource:
-        #        clickhouse:
-        #            type: com.alibaba.druid.pool.DruidDataSource
-        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
-        #            url: jdbc:clickhouse://cc-2vc8zzo26w0l7m2l6.public.clickhouse.ads.aliyuncs.com/sop?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
-        #            username: rt_2024
-        #            password: Yzx_19860213
-        #            initialSize: 10
-        #            maxActive: 100
-        #            minIdle: 10
-        #            maxWait: 6000
-        mysql:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://119.45.250.185:2345/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Ylrz_1q2w3e4r5t6y
-                # 从库数据源
-                slave:
-                    # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
-                # 初始连接数
-                initialSize: 5
-                # 最小连接池数量
-                minIdle: 10
-                # 最大连接池数量
-                maxActive: 20
-                # 配置获取连接等待超时的时间
-                maxWait: 60000
-                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                timeBetweenEvictionRunsMillis: 60000
-                # 配置一个连接在池中最小生存的时间,单位是毫秒
-                minEvictableIdleTimeMillis: 300000
-                # 配置一个连接在池中最大生存的时间,单位是毫秒
-                maxEvictableIdleTimeMillis: 900000
-                # 配置检测连接是否有效
-                validationQuery: SELECT 1 FROM DUAL
-                testWhileIdle: true
-                testOnBorrow: false
-                testOnReturn: false
-                webStatFilter:
-                    enabled: true
-                statViewServlet:
-                    enabled: true
-                    # 设置白名单,不填则允许所有访问
-                    allow:
-                    url-pattern: /druid/*
-                    # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
-        sop:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://10.206.0.2:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Ylrz_1q2w3e4r5t6y
-                # 初始连接数
-                initialSize: 5
-                # 最小连接池数量
-                minIdle: 10
-                # 最大连接池数量
-                maxActive: 20
-                # 配置获取连接等待超时的时间
-                maxWait: 60000
-                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                timeBetweenEvictionRunsMillis: 60000
-                # 配置一个连接在池中最小生存的时间,单位是毫秒
-                minEvictableIdleTimeMillis: 300000
-                # 配置一个连接在池中最大生存的时间,单位是毫秒
-                maxEvictableIdleTimeMillis: 900000
-                # 配置检测连接是否有效
-                validationQuery: SELECT 1 FROM DUAL
-                testWhileIdle: true
-                testOnBorrow: false
-                testOnReturn: false
-                webStatFilter:
-                    enabled: true
-                statViewServlet:
-                    enabled: true
-                    # 设置白名单,不填则允许所有访问
-                    allow:
-                    url-pattern: /druid/*
-                    # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
-rocketmq:
-    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
-    producer:
-        group: my-producer-group
-        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
-    consumer:
-        group: test-group
-        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 0 - 148
fs-service/src/main/resources/application-druid-sxjz-test.yml

@@ -1,148 +0,0 @@
-# 数据源配置
-spring:
-    profiles:
-        include: config-druid-sxjz,common
-    # redis 配置
-    redis:
-        host: 127.0.0.1
-        port: 6379
-        # 数据库索引
-        database: 0
-        # 密码
-        password:
-        # 连接超时时间
-        timeout: 10s
-        lettuce:
-            pool:
-                # 连接池中的最小空闲连接
-                min-idle: 0
-                # 连接池中的最大空闲连接
-                max-idle: 8
-                # 连接池的最大数据库连接数
-                max-active: 8
-                # #连接池最大阻塞等待时间(使用负值表示没有限制)
-                max-wait: -1ms
-    datasource:
-        #        clickhouse:
-        #            type: com.alibaba.druid.pool.DruidDataSource
-        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
-        #            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
-        #            username: rt_2024
-        #            password: Yzx_19860213
-        #            initialSize: 10
-        #            maxActive: 100
-        #            minIdle: 10
-        #            maxWait: 6000
-        mysql:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://139.155.247.58:2345/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Sxdtcbm@#+!2025
-                # 从库数据源
-                slave:
-                    # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
-                # 初始连接数
-                initialSize: 5
-                # 最小连接池数量
-                minIdle: 10
-                # 最大连接池数量
-                maxActive: 2000
-                # 配置获取连接等待超时的时间
-                maxWait: 60000
-                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                timeBetweenEvictionRunsMillis: 60000
-                # 配置一个连接在池中最小生存的时间,单位是毫秒
-                minEvictableIdleTimeMillis: 300000
-                # 配置一个连接在池中最大生存的时间,单位是毫秒
-                maxEvictableIdleTimeMillis: 900000
-                # 配置检测连接是否有效
-                validationQuery: SELECT 1 FROM DUAL
-                testWhileIdle: true
-                testOnBorrow: false
-                testOnReturn: false
-                webStatFilter:
-                    enabled: true
-                statViewServlet:
-                    enabled: true
-                    # 设置白名单,不填则允许所有访问
-                    allow:
-                    url-pattern: /druid/*
-                    # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
-        sop:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://139.155.247.58:2345/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Sxdtcbm@#+!2025
-                # 初始连接数
-                initialSize: 5
-                # 最小连接池数量
-                minIdle: 10
-                # 最大连接池数量
-                maxActive: 200
-                # 配置获取连接等待超时的时间
-                maxWait: 60000
-                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                timeBetweenEvictionRunsMillis: 60000
-                # 配置一个连接在池中最小生存的时间,单位是毫秒
-                minEvictableIdleTimeMillis: 300000
-                # 配置一个连接在池中最大生存的时间,单位是毫秒
-                maxEvictableIdleTimeMillis: 900000
-                # 配置检测连接是否有效
-                validationQuery: SELECT 1 FROM DUAL
-                testWhileIdle: true
-                testOnBorrow: false
-                testOnReturn: false
-                webStatFilter:
-                    enabled: true
-                statViewServlet:
-                    enabled: true
-                    # 设置白名单,不填则允许所有访问
-                    allow:
-                    url-pattern: /druid/*
-                    # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
-rocketmq:
-    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
-    producer:
-        group: my-producer-group
-        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
-    consumer:
-        group: voice-group
-        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 0 - 153
fs-service/src/main/resources/application-druid-xfk-test.yml

@@ -1,153 +0,0 @@
-# 数据源配置
-spring:
-    profiles:
-        include: config-druid-xfk,common
-    # redis 配置
-    redis:
-        # 地址
-        host: 127.0.0.1
-        # 端口,默认为6379
-        port: 6379
-        # 数据库索引
-        database: 0
-        # 密码
-        password:
-        # 连接超时时间
-        timeout: 20s
-        lettuce:
-            pool:
-                # 连接池中的最小空闲连接
-                min-idle: 0
-                # 连接池中的最大空闲连接
-                max-idle: 8
-                # 连接池的最大数据库连接数
-                max-active: 8
-                # #连接池最大阻塞等待时间(使用负值表示没有限制)
-                max-wait: -1ms
-    datasource:
-        #        clickhouse:
-        #            type: com.alibaba.druid.pool.DruidDataSource
-        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
-        #            url: jdbc:clickhouse://cc-2vc8zzo26w0l7m2l6.public.clickhouse.ads.aliyuncs.com/sop?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
-        #            username: rt_2024
-        #            password: Yzx_19860213
-        #            initialSize: 10
-        #            maxActive: 100
-        #            minIdle: 10
-        #            maxWait: 6000
-        mysql:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://119.45.13.86:8866/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Ylrz_1q2w3e4r5t6y
-                # 从库数据源
-                slave:
-                    # 从数据源开关/默认关闭
-                    enabled: false
-                    url:
-                    username:
-                    password:
-                # 初始连接数
-                initialSize: 5
-                # 最小连接池数量
-                minIdle: 10
-                # 最大连接池数量
-                maxActive: 20
-                # 配置获取连接等待超时的时间
-                maxWait: 60000
-                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                timeBetweenEvictionRunsMillis: 60000
-                # 配置一个连接在池中最小生存的时间,单位是毫秒
-                minEvictableIdleTimeMillis: 300000
-                # 配置一个连接在池中最大生存的时间,单位是毫秒
-                maxEvictableIdleTimeMillis: 900000
-                # 配置检测连接是否有效
-                validationQuery: SELECT 1 FROM DUAL
-                testWhileIdle: true
-                testOnBorrow: false
-                testOnReturn: false
-                webStatFilter:
-                    enabled: true
-                statViewServlet:
-                    enabled: true
-                    # 设置白名单,不填则允许所有访问
-                    allow:
-                    url-pattern: /druid/*
-                    # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
-        sop:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            druid:
-                # 主库数据源
-                master:
-                    url: jdbc:mysql://119.45.13.86:8866/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: root
-                    password: Ylrz_1q2w3e4r5t6y
-                # 初始连接数
-                initialSize: 5
-                # 最小连接池数量
-                minIdle: 10
-                # 最大连接池数量
-                maxActive: 20
-                # 配置获取连接等待超时的时间
-                maxWait: 60000
-                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                timeBetweenEvictionRunsMillis: 60000
-                # 配置一个连接在池中最小生存的时间,单位是毫秒
-                minEvictableIdleTimeMillis: 300000
-                # 配置一个连接在池中最大生存的时间,单位是毫秒
-                maxEvictableIdleTimeMillis: 900000
-                # 配置检测连接是否有效
-                validationQuery: SELECT 1 FROM DUAL
-                testWhileIdle: true
-                testOnBorrow: false
-                testOnReturn: false
-                webStatFilter:
-                    enabled: true
-                statViewServlet:
-                    enabled: true
-                    # 设置白名单,不填则允许所有访问
-                    allow:
-                    url-pattern: /druid/*
-                    # 控制台管理用户名和密码
-                    login-username: fs
-                    login-password: 123456
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
-rocketmq:
-    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
-    producer:
-        group: my-producer-group
-        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
-    consumer:
-        group: test-group
-        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
-        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
-openIM:
-    secret: op
-    userID: im

+ 8 - 5
fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml

@@ -892,7 +892,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
 
         </where>
-
+        ${maps.params.dataScope}
         ORDER BY
 
         <if test="maps.sortField == 'companyUserName'">
@@ -913,7 +913,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="maps.sortField == null or maps.sortField == ''">
             so.order_id desc
         </if>
-        ${maps.params.dataScope}
+
     </select>
     <select id="selectFsStoreOrderListVOByErpAccount" resultType="com.fs.his.vo.FsStoreOrderListVO">
         select so.*,st.store_name,us.nick_name,us.phone,d.doctor_name,p.patient_name,p.prescribe_code,c.company_name,
@@ -1098,12 +1098,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.erpPhoneNumber != null and maps.erpPhoneNumber != ''">
                 and so.erp_phone like concat(#{maps.erpPhoneNumber},'%')
             </if>
-            <if test="maps.erpAccount != null and maps.erpAccount != ''">
+            <if test="maps.erpAccount != null and maps.erpAccount != '未分拣' and maps.erpAccount != ''">
                 and df.login_account like #{maps.erpAccount}
             </if>
+            <if test="maps.erpAccount == '未分拣'">
+                and ( df.login_account is null or df.login_account like '')
+            </if>
 
         </where>
-
+        ${maps.params.dataScope}
         ORDER BY
 
         <if test="maps.sortField == 'companyUserName'">
@@ -1124,7 +1127,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="maps.sortField == null or maps.sortField == ''">
             so.order_id desc
         </if>
-        ${maps.params.dataScope}
+
     </select>
     <select id="selectFsStoreOrderByFsUserId" resultMap="FsStoreOrderResult">
         <include refid="selectFsStoreOrderVo"/>

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

@@ -58,6 +58,7 @@ public class CourseController extends  AppBaseController{
             return R.error("操作异常");
         }
     }
+
     @Cacheable(value = "getProductCateByPid", key = "#pid")
     @ApiOperation("获取子分类")
     @GetMapping("/getProductCateByPid")

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

@@ -129,11 +129,20 @@ public class UserController extends  AppBaseController {
         }
     }
 
-    @Login
     @ApiOperation("检测是否登录")
     @GetMapping("/checkLogin")
-    public R checkLogin(){
-        return R.ok("认证成功");
+    public R checkLogin(HttpServletRequest request){
+        if(StringUtils.isEmpty(getUserId())){
+            //未登录
+            return R.error("未登录");
+        }
+        else{
+            //登录
+            String token = jwtUtils.generateToken(Long.parseLong(getUserId()));
+            Map<String,Object> map=new HashMap<>();
+            map.put("token",token);
+            return R.ok("认证成功").put("userId",getUserId()).put("token",token);
+        }
     }
 
     @Login

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

@@ -0,0 +1,235 @@
+package com.fs.app.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.hutool.core.date.DateTime;
+import com.fs.app.param.FsUserLoginByMpParam;
+import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.core.config.WxMaConfiguration;
+import com.fs.course.domain.FsUserCompanyUser;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.course.service.IFsUserCompanyUserService;
+import com.fs.his.domain.FsUser;
+import com.fs.his.domain.FsUserWx;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.service.IFsUserWxService;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+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 javax.validation.Valid;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+@Api("会员-h5-微信相关接口(后面不需要这个接口了,再删除))")
+@RestController
+@RequestMapping("/app/wx/h5/mp")
+@Slf4j
+public class WxH5MpController {
+    Logger logger = LoggerFactory.getLogger(getClass());
+    @Autowired
+    private WxMpService wxMpService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @Autowired
+    JwtUtils jwtUtils;
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    FsCourseWatchLogMapper fsCourseWatchLogMapper;
+    @Autowired
+    QwExternalContactMapper qwExternalContactMapper;
+    @Autowired
+    ICompanyService companyService;
+    @Autowired
+    ICompanyUserService companyUserService;
+    @Autowired
+    private IFsUserCompanyUserService userCompanyUserService;
+    @Autowired
+    private IFsUserWxService fsUserWxService;
+
+    @ApiOperation("课程分享链接公众号登录")
+    @PostMapping("/loginByMp")
+    public R loginByMp(@Valid @RequestBody FsUserLoginByMpParam param) {
+        log.info("=====================进入小程序授权登录, 入参: {}", param);
+
+        // 参数校验
+        if (StringUtils.isBlank(param.getCode())) {
+            return R.error("code不存在");
+        }
+
+        // 公司状态校验
+        Company company = companyService.selectCompanyById(param.getCompanyId());
+        if (company == null || company.getStatus() == 0) {
+            return R.error("注册失败团队已停用,或不存在!");
+        }
+
+        // 客服状态校验
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+        if (companyUser == null || "1".equals(companyUser.getStatus())) {
+            return R.error("注册失败客服已停用,或不存在!");
+        }
+
+        try {
+            // 获取微信用户信息
+            WxOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(param.getCode());
+            WxOAuth2UserInfo wxMpUser = wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null);
+
+            // 处理用户信息
+            FsUser user = processUserInfo(wxMpUser, company,companyUser);
+
+            // 处理用户与公司的关系
+            processUserCompanyRelationship(user, param, companyUser, company);
+
+            // 检查用户是否已绑定其他销售
+            FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(user.getUserId(), param.getProjectId());
+            if (Objects.nonNull(userCompanyUser) && !param.getCompanyUserId().equals(userCompanyUser.getCompanyUserId())){
+                return R.error(500, "该用户("+user.getUserId() + ")已成为其他销售会员");
+            }
+
+            // 生成token并返回结果
+            return generateLoginResult(user);
+        } catch (WxErrorException e) {
+            this.logger.error(e.getMessage(), e);
+            return R.error("授权失败," + e.getMessage());
+        }
+    }
+
+    private FsUser processUserInfo(WxOAuth2UserInfo wxMpUser, Company company,CompanyUser companyUser) {
+        FsUser user = userService.selectFsUserByUnionId(wxMpUser.getUnionId());
+
+        if (user != null) {
+            // 更新现有用户信息
+            FsUser userUpdate = new FsUser();
+            userUpdate.setUserId(user.getUserId());
+            userUpdate.setMpOpenId(wxMpUser.getOpenid());
+            userUpdate.setUnionId(wxMpUser.getUnionId());
+            userUpdate.setUpdateTime(new DateTime());
+            userUpdate.setNickName(wxMpUser.getNickname());
+            userUpdate.setAvatar(wxMpUser.getHeadImgUrl());
+            userService.updateFsUser(userUpdate);
+            return userUpdate;
+        } else {
+            // 创建新用户
+            FsUser newUser = new FsUser();
+            newUser.setNickName(wxMpUser.getNickname());
+            newUser.setAvatar(wxMpUser.getHeadImgUrl());
+            newUser.setStatus(1);
+            newUser.setMpOpenId(wxMpUser.getOpenid());
+            newUser.setCompanyId(company.getCompanyId());
+            newUser.setCompanyUserId(companyUser.getUserId());
+            newUser.setUnionId(wxMpUser.getUnionId());
+            newUser.setCreateTime(new Date());
+            newUser.setStatus(company != null && company.getFsUserIsDefaultBlack() == 1 ? 0 : 1);
+            userService.insertFsUser(newUser);
+            return newUser;
+        }
+    }
+
+    private void processUserCompanyRelationship(FsUser user, FsUserLoginByMpParam param,
+                                                CompanyUser companyUser, Company company) {
+        if ((companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
+                && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1) {
+            int defaultStatus = (company != null && company.getFsUserIsDefaultBlack() == 1) ? 0 : 1;
+            userCompanyUserService.bindRelationship(
+                    user.getUserId(),
+                    param.getProjectId(),
+                    companyUser.getCompanyId(),
+                    companyUser.getUserId(),
+                    defaultStatus
+            );
+        }
+    }
+
+    private R generateLoginResult(FsUser user) {
+        log.info("打印用户信息--------------------》{}",user);
+        String token = jwtUtils.generateToken(user.getUserId());
+        redisCache.setCacheObject("token:" + user.getUserId(), token, 604800, TimeUnit.SECONDS);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("token", token);
+        result.put("user", user);
+        return R.ok(result);
+    }
+
+    private R handleWxErrorException(WxErrorException e) {
+        if (e.getError().getErrorCode() == 40163) {
+            return R.error(40163, e.getError().getErrorMsg());
+        }
+        return R.error("授权失败," + e.getMessage());
+    }
+
+
+    @ApiOperation("处理用户与小程序的绑定")
+    @PostMapping("/handleFsUserWx")
+    public R handleFsUserWx(@RequestBody FsUserLoginByMpParam param) {
+        try {
+            final WxMaService wxService = WxMaConfiguration.getMaService(param.getAppId());
+            //获取微信用户信息
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+
+            FsUser user = userService.selectFsUserById(param.getUserId());
+            handleFsUserWx(user, param, session);
+            return R.ok();
+        } catch (WxErrorException e) {
+            if (e.getError().getErrorCode() == 40163) {
+                return R.error(40163, e.getError().getErrorMsg());
+            } else {
+                return R.error("获取用户信息失败," + e.getMessage());
+            }
+        }
+
+    }
+    private void handleFsUserWx(FsUser user, FsUserLoginByMpParam param, WxMaJscode2SessionResult session) {
+        if (user == null) return;
+        // 尝试更新
+        boolean updated = fsUserWxService.lambdaUpdate()
+                .eq(FsUserWx::getFsUserId, user.getUserId())
+                .eq(FsUserWx::getAppId, param.getAppId())
+                .eq(FsUserWx::getOpenId, session.getOpenid())
+                .set(FsUserWx::getCompanyId, user.getCompanyId())
+                .set(FsUserWx::getUnionId, session.getUnionid() == null ? "" : session.getUnionid())
+                .set(FsUserWx::getUpdateTime, new Date())
+                .update();
+
+        // 如果更新失败(记录不存在),则插入
+        if (!updated) {
+            FsUserWx fsUserWx = new FsUserWx();
+            fsUserWx.setType(1);
+            fsUserWx.setFsUserId(user.getUserId());
+            fsUserWx.setCompanyId(user.getCompanyId());
+            fsUserWx.setAppId(param.getAppId());
+            fsUserWx.setOpenId(session.getOpenid());
+            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+            fsUserWx.setCreateTime(new Date());
+            fsUserWx.setUpdateTime(new Date());
+            fsUserWxService.save(fsUserWx);
+        }
+    }
+
+}

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

@@ -24,4 +24,10 @@ public class FsUserLoginByMpParam implements Serializable {
     @ApiModelProperty(value = "项目ID")
     private Long projectId;
 
+    private String appId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
 }