三七 1 月之前
父节点
当前提交
d9d4e5992a

+ 6 - 1
fs-company/src/main/java/com/fs/qw/SopUserLogsController.java

@@ -9,6 +9,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
+import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.param.SopUserLogsVO;
 import com.fs.sop.domain.SopUserLogs;
 import com.fs.sop.params.SopUserLogsParam;
@@ -33,7 +34,8 @@ public class SopUserLogsController extends BaseController
     private ISopUserLogsService sopUserLogsService;
     @Autowired
     private TokenService tokenService;
-
+    @Autowired
+    private QwUserMapper qwUserMapper;
     /**
      * 查询sopUserLogs列表
      */
@@ -43,6 +45,9 @@ public class SopUserLogsController extends BaseController
     {
         startPage();
         List<SopUserLogsVO> list = sopUserLogsService.selectSopUserLogsList(sopUserLogs);
+        list.forEach(item->{
+            item.setQwUserName(qwUserMapper.selectQwUserByQwUserIdAndCorpId(item.getQwUserId(), item.getCorpId()));
+        });
         return getDataTable(list);
     }
 

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

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

+ 2 - 2
fs-qwhook-sop/src/main/resources/application.yml

@@ -42,8 +42,8 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-#    active: druid
-    active: dev
+    active: druid
+#    active: dev
     include: config
   mvc:
     async:

+ 3 - 0
fs-service-system/src/main/java/com/fs/qw/param/SopUserLogsVO.java

@@ -11,6 +11,7 @@ public class SopUserLogsVO {
     *  企业微信账号
     */
     private String qwUserId;
+    private String qwUserName;
 
     /**
     * 营期时间
@@ -35,4 +36,6 @@ public class SopUserLogsVO {
 
     private String sopId;
 
+    private String chatId;
+
 }

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

@@ -209,6 +209,10 @@ public interface QwSopLogsMapper extends BaseMapper<QwSopLogs> {
     @DataSource(DataSourceType.SOP)
     int updateQwSopLogsBycollectIds(@Param("collectIds") List<String> collectIds,@Param("sendStatus") Long sendStatus,@Param("msgId") String msgId);
 
+
+    @DataSource(DataSourceType.SOP)
+    List<QwSopLogsDoSendListTVO> getQwSopLogsByJsApiAll(@Param("data") GetQwSopLogsByJsApiParam param);
+
     @DataSource(DataSourceType.SOP)
     List<QwSopLogsDoSendListTVO> getQwSopLogsByJsApi(@Param("data") GetQwSopLogsByJsApiParam param);
 

+ 2 - 1
fs-service-system/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java

@@ -135,7 +135,8 @@ public interface SopUserLogsMapper {
             "            l.start_time,\n" +
             "            l.status,\n" +
             "            l.user_id,\n" +
-            "            DATEDIFF(CURRENT_DATE, l.start_time) + 1 AS count_days\n" +
+            "            DATEDIFF(CURRENT_DATE, l.start_time) + 1 AS count_days,\n" +
+            "            l.chat_id \n" +
             "        FROM sop_user_logs l " +
             "left join sop_user_logs_info i on l.id = i.user_logs_id "  +
             "where 1=1 " +

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

@@ -568,7 +568,6 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
     public List<QwSopLogs> selectQwSopLogsListVO(SopMsgParam param) {
         return qwSopLogsMapper.selectQwSopLogsListVO(param);
     }
-
     @Override
     public SendSopParamDetailsC getQwSopLogsByJsApi(GetQwSopLogsByJsApiParam param) {
         //写入企业微信 在线状态 10分钟 通过订阅方式,如果10分钟没有请求此接口,调用一个LOGIN方法
@@ -579,35 +578,10 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
         SendSopParamDetailsC sopParamDetailsC = new SendSopParamDetailsC();
         // 使用线程安全的集合
         List<QwSopLogsDoSendListTVO> sendJsApiList = Collections.synchronizedList(new ArrayList<>());
-        List<QwSopLogsDoSendListTVO> sendJsApiListOver = Collections.synchronizedList(new ArrayList<>());
-
-        // 创建一个自定义的线程池,根据实际需求调整线程数
-        //ExecutorService executor = Executors.newFixedThreadPool(4);
         try {
 
-            // 查询当前客户的完课消息
-            List<QwSopLogsDoSendListTVO> logsByJsApiOver = qwSopLogsMapper.getQwSopLogsByJsApiOver(param);
-            for (QwSopLogsDoSendListTVO log : logsByJsApiOver) {
-                try {
-                    // 使用现代的日期时间 API
-                    LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
-                    LocalDateTime expiryDateTime = sendTime.plusHours(12);
-                    LocalDateTime now = LocalDateTime.now();
+            List<QwSopLogsDoSendListTVO> logsByJsApi = qwSopLogsMapper.getQwSopLogsByJsApiAll(param);
 
-                    // 判断是否过期
-                    if (now.isAfter(expiryDateTime)) {
-                        // 作废消息
-                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
-                    } else {
-                        sendJsApiListOver.add(log);
-                    }
-                } catch (Exception e) {
-                    // 记录错误日志
-                    logger.error("Error processing log in logsByJsApiOver: {}", log.getId()+":"+e);
-                }
-            }
-            // 查询当前客户的待发送记录
-            List<QwSopLogsDoSendListTVO> logsByJsApi = qwSopLogsMapper.getQwSopLogsByJsApi(param);
 
             // 查询员工信息的id
             QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
@@ -622,91 +596,116 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
             contactHParam.setExternalUserId(param.getExternalUserId().trim());
             contactHParam.setCorpId(param.getCorpId().trim());
             Long qwExternalContactId = qwExternalContactMapper.getQwExternalContactId(contactHParam);
+
             for (QwSopLogsDoSendListTVO log : logsByJsApi) {
 
                 try {
-                    QwSopTempSetting.Content content = JSON.parseObject(log.getContentJson(), QwSopTempSetting.Content.class);
-                    List<QwSopTempSetting.Content.Setting> setting = content.getSetting().stream().filter(e -> "9".equals(e.getContentType())).collect(Collectors.toList());
 
-                    //有app的异步推送消息
-                    if (!setting.isEmpty()) {
-                        asyncSopTestService.asyncSendMsgBySopAppLinkNormal(setting, param.getExternalId());
-                    }
+                    if (log.getSendType()==3){
+                        try {
+                            // 使用现代的日期时间 API
+                            LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                            LocalDateTime expiryDateTime = sendTime.plusHours(12);
+                            LocalDateTime now = LocalDateTime.now();
+
+                            // 判断是否过期
+                            if (now.isAfter(expiryDateTime)) {
+                                // 作废消息
+                                qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
+                            } else {
+                                sendJsApiList.add(log);
+                            }
+                        } catch (Exception e) {
+                            // 记录错误日志
+                            logger.error("Error processing log in logsByJsApiOver: {}", log.getId()+":"+e);
+                        }
+                    }else {
 
-                    if (log.getExpiryTime() == null) {
-                        // 作废消息
-                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "SOP任务被删除");
-                    } else {
-                        Integer expiryTime = log.getExpiryTime();
-                        LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
-                        LocalDateTime expiryDateTime = sendTime.plusHours(expiryTime);
-                        LocalDateTime now = LocalDateTime.now();
+                        QwSopTempSetting.Content content = JSON.parseObject(log.getContentJson(), QwSopTempSetting.Content.class);
+                        List<QwSopTempSetting.Content.Setting> setting = content.getSetting().stream().filter(e -> "9".equals(e.getContentType())).collect(Collectors.toList());
 
-                        // 判断是否过期
-                        if (now.isAfter(expiryDateTime)) {
+                        //有app的异步推送消息
+                        if (!setting.isEmpty()) {
+                            asyncSopTestService.asyncSendMsgBySopAppLinkNormal(setting, param.getExternalId());
+                        }
+
+                        if (log.getExpiryTime() == null) {
                             // 作废消息
-                            qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
+                            qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "SOP任务被删除");
                         } else {
-                            switch (content.getType()) {
-                                case 1:
-                                    // 普通消息,不做判断,加入发送列表
-                                    sendJsApiList.add(log);
-                                    break;
-                                case 2:
-                                    // 课程消息,进行复杂的条件判断
-                                    FsCourseWatchLog watchLog = watchLogService.getWatchCourseLogVideoBySop(
-                                            Long.valueOf(content.getVideoId()),
-                                            String.valueOf(qwId),
-                                            qwExternalContactId
-                                    );
-
-                                    Integer courseType = content.getCourseType();
-                                    String logId = log.getId();
-
-                                    if (content.getCourseType()==null){
-                                        qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "模板未选消息类型,不发送");
-                                    }
-                                    if (watchLog != null) {
-
-                                        //新逻辑
-                                        if (isCourseTypeValid(courseType, watchLog.getLogType())) {
-                                            // 加入到发送列表中
-                                            sendJsApiList.add(log);
-                                        } else {
-                                            // 作废消息
-                                            qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "看课状态未满足,不发送");
+                            Integer expiryTime = log.getExpiryTime();
+                            LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                            LocalDateTime expiryDateTime = sendTime.plusHours(expiryTime);
+                            LocalDateTime now = LocalDateTime.now();
+
+                            // 判断是否过期
+                            if (now.isAfter(expiryDateTime)) {
+                                // 作废消息
+                                qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
+                            }
+                            else {
+                                switch (content.getType()) {
+                                    case 1:
+                                        // 普通消息,不做判断,加入发送列表
+                                        sendJsApiList.add(log);
+                                        break;
+                                    case 2:
+                                        // 课程消息,进行复杂的条件判断
+                                        FsCourseWatchLog watchLog = watchLogService.getWatchCourseLogVideoBySop(
+                                                Long.valueOf(content.getVideoId()),
+                                                String.valueOf(qwId),
+                                                qwExternalContactId
+                                        );
+
+                                        Integer courseType = content.getCourseType();
+                                        String logId = log.getId();
+
+                                        if (content.getCourseType()==null){
+                                            qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "模板未选消息类型,不发送");
                                         }
+                                        if (watchLog != null) {
+
+                                            //新逻辑
+                                            if (isCourseTypeValid(courseType, watchLog.getLogType())) {
+                                                // 加入到发送列表中
+                                                sendJsApiList.add(log);
+                                            } else {
+                                                // 作废消息
+                                                qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "看课状态未满足,不发送");
+                                            }
 
 
-                                    } else {
-                                        // 没有观看记录,只发普通消息
-                                        if (courseType == 0) {
-                                            sendJsApiList.add(log);
                                         } else {
-                                            qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "无观看记录,不发送");
+                                            // 没有观看记录,只发普通消息
+                                            if (courseType == 0) {
+                                                sendJsApiList.add(log);
+                                            } else {
+                                                qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "无观看记录,不发送");
+                                            }
                                         }
-                                    }
-                                    break;
-                                case 3:
-                                    // 订单消息,不做判断,加入发送列表
-                                    sendJsApiList.add(log);
-                                    break;
-                                case 4:
-                                    // Ai消息,不加入序列单独处理
-                                    try {
-                                        logger.info("Ai触达消息 : {}", log.getId());
-                                      //  fastGptChatSessionService.sendAiTouch(log,param.getCorpId().trim());
-                                    }catch (Exception e){
-                                        logger.error("Ai消息 : {}", content.getType());
-                                    }
-                                    break;
-                                default:
-                                    // 未知类型,记录警告
-                                    logger.error("Unknown content type logsByJsApi: {}", content.getType());
-                                    break;
+                                        break;
+                                    case 3:
+                                        // 订单消息,不做判断,加入发送列表
+                                        sendJsApiList.add(log);
+                                        break;
+                                    case 4:
+                                        // Ai消息,不加入序列单独处理
+                                        try {
+                                            logger.info("Ai触达消息 : {}", log.getId());
+                                            //  fastGptChatSessionService.sendAiTouch(log,param.getCorpId().trim());
+                                        }catch (Exception e){
+                                            logger.error("Ai消息 : {}", content.getType());
+                                        }
+                                        break;
+                                    default:
+                                        // 未知类型,记录警告
+                                        logger.error("Unknown content type logsByJsApi: {}", content.getType());
+                                        break;
+                                }
                             }
                         }
                     }
+
                 } catch (Exception e) {
                     // 记录错误日志
                     logger.error("Error processing log in logsByJsApi: {}", log.getId()+" : " + e);
@@ -752,45 +751,236 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
                 sopParamDetailsC.setNextExternalId(qwSopLogsByJsApiNext.getExternalId());
             }
 
-           //获取不为空的联系人
-
-//            try {
-//                 qwSopLogsByJsApiNext =  getQwSopLogsByJsApiNext(param);
-//            }catch (Exception e){
-//                logger.info("/n 获取下一个需要发送联系人出错:"+e.getMessage());
-//
-//            }
-
-            // Step 3: 构建发送列表
+            sopParamDetailsC.setSendList(new ArrayList<>(sendJsApiList));
 
-
-            if (sendJsApiList.size() > 2) {
-                List<QwSopLogsDoSendListTVO> list = new ArrayList<>(sendJsApiList.subList(0, 2));
-                if (!sendJsApiListOver.isEmpty()) {
-                    list.add(sendJsApiListOver.get(0));
-                }
-                sopParamDetailsC.setSendList(list);
-            } else {
-                if (!sendJsApiListOver.isEmpty()) {
-                    sendJsApiList.add(sendJsApiListOver.get(0));
-                }
-                sopParamDetailsC.setSendList(new ArrayList<>(sendJsApiList));
-            }
-
-            //并发太多,积压了,先注释了
-//            // Step 4: 批量更新推送记录状态
-//            if (!sendJsApiList.isEmpty()) {
-//                processAndInsertQwSopLogsByTakeRecordsList(sopParamDetailsC.getSendList());
-//            }
         }catch (Exception e){
             logger.error("主动获取发送信息失败:-"+e);
-        }finally {
-            // 关闭线程池
-            //executor.shutdown();
         }
 
         return sopParamDetailsC;
     }
+//    @Override
+//    public SendSopParamDetailsC getQwSopLogsByJsApi(GetQwSopLogsByJsApiParam param) {
+//        //写入企业微信 在线状态 10分钟 通过订阅方式,如果10分钟没有请求此接口,调用一个LOGIN方法
+////        redisCache.setCacheObject("qwActive:"+param.getCorpId()+":"+param.getQwUserId(),1,10 ,TimeUnit.MINUTES);
+//        logger.info("主动获取发送信息:"+param);
+//
+//        // 封装消息体
+//        SendSopParamDetailsC sopParamDetailsC = new SendSopParamDetailsC();
+//        // 使用线程安全的集合
+//        List<QwSopLogsDoSendListTVO> sendJsApiList = Collections.synchronizedList(new ArrayList<>());
+//        List<QwSopLogsDoSendListTVO> sendJsApiListOver = Collections.synchronizedList(new ArrayList<>());
+//
+//        // 创建一个自定义的线程池,根据实际需求调整线程数
+//        //ExecutorService executor = Executors.newFixedThreadPool(4);
+//        try {
+//
+//            // 查询当前客户的完课消息
+//            List<QwSopLogsDoSendListTVO> logsByJsApiOver = qwSopLogsMapper.getQwSopLogsByJsApiOver(param);
+//            for (QwSopLogsDoSendListTVO log : logsByJsApiOver) {
+//                try {
+//                    // 使用现代的日期时间 API
+//                    LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+//                    LocalDateTime expiryDateTime = sendTime.plusHours(12);
+//                    LocalDateTime now = LocalDateTime.now();
+//
+//                    // 判断是否过期
+//                    if (now.isAfter(expiryDateTime)) {
+//                        // 作废消息
+//                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
+//                    } else {
+//                        sendJsApiListOver.add(log);
+//                    }
+//                } catch (Exception e) {
+//                    // 记录错误日志
+//                    logger.error("Error processing log in logsByJsApiOver: {}", log.getId()+":"+e);
+//                }
+//            }
+//            // 查询当前客户的待发送记录
+//            List<QwSopLogsDoSendListTVO> logsByJsApi = qwSopLogsMapper.getQwSopLogsByJsApi(param);
+//
+//            // 查询员工信息的id
+//            QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
+//
+//            Long qwId=qwUser.getId();
+//
+//            sopParamDetailsC.setAppKey(qwUser.getAppKey());
+//
+//            // 客户的信息
+//            QwExternalContactHParam contactHParam = new QwExternalContactHParam();
+//            contactHParam.setUserId(param.getQwUserId().trim());
+//            contactHParam.setExternalUserId(param.getExternalUserId().trim());
+//            contactHParam.setCorpId(param.getCorpId().trim());
+//            Long qwExternalContactId = qwExternalContactMapper.getQwExternalContactId(contactHParam);
+//            for (QwSopLogsDoSendListTVO log : logsByJsApi) {
+//
+//                try {
+//                    QwSopTempSetting.Content content = JSON.parseObject(log.getContentJson(), QwSopTempSetting.Content.class);
+//                    List<QwSopTempSetting.Content.Setting> setting = content.getSetting().stream().filter(e -> "9".equals(e.getContentType())).collect(Collectors.toList());
+//
+//                    //有app的异步推送消息
+//                    if (!setting.isEmpty()) {
+//                        asyncSopTestService.asyncSendMsgBySopAppLinkNormal(setting, param.getExternalId());
+//                    }
+//
+//                    if (log.getExpiryTime() == null) {
+//                        // 作废消息
+//                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "SOP任务被删除");
+//                    } else {
+//                        Integer expiryTime = log.getExpiryTime();
+//                        LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+//                        LocalDateTime expiryDateTime = sendTime.plusHours(expiryTime);
+//                        LocalDateTime now = LocalDateTime.now();
+//
+//                        // 判断是否过期
+//                        if (now.isAfter(expiryDateTime)) {
+//                            // 作废消息
+//                            qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
+//                        } else {
+//                            switch (content.getType()) {
+//                                case 1:
+//                                    // 普通消息,不做判断,加入发送列表
+//                                    sendJsApiList.add(log);
+//                                    break;
+//                                case 2:
+//                                    // 课程消息,进行复杂的条件判断
+//                                    FsCourseWatchLog watchLog = watchLogService.getWatchCourseLogVideoBySop(
+//                                            Long.valueOf(content.getVideoId()),
+//                                            String.valueOf(qwId),
+//                                            qwExternalContactId
+//                                    );
+//
+//                                    Integer courseType = content.getCourseType();
+//                                    String logId = log.getId();
+//
+//                                    if (content.getCourseType()==null){
+//                                        qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "模板未选消息类型,不发送");
+//                                    }
+//                                    if (watchLog != null) {
+//
+//                                        //新逻辑
+//                                        if (isCourseTypeValid(courseType, watchLog.getLogType())) {
+//                                            // 加入到发送列表中
+//                                            sendJsApiList.add(log);
+//                                        } else {
+//                                            // 作废消息
+//                                            qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "看课状态未满足,不发送");
+//                                        }
+//
+//
+//                                    } else {
+//                                        // 没有观看记录,只发普通消息
+//                                        if (courseType == 0) {
+//                                            sendJsApiList.add(log);
+//                                        } else {
+//                                            qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "无观看记录,不发送");
+//                                        }
+//                                    }
+//                                    break;
+//                                case 3:
+//                                    // 订单消息,不做判断,加入发送列表
+//                                    sendJsApiList.add(log);
+//                                    break;
+//                                case 4:
+//                                    // Ai消息,不加入序列单独处理
+//                                    try {
+//                                        logger.info("Ai触达消息 : {}", log.getId());
+//                                      //  fastGptChatSessionService.sendAiTouch(log,param.getCorpId().trim());
+//                                    }catch (Exception e){
+//                                        logger.error("Ai消息 : {}", content.getType());
+//                                    }
+//                                    break;
+//                                default:
+//                                    // 未知类型,记录警告
+//                                    logger.error("Unknown content type logsByJsApi: {}", content.getType());
+//                                    break;
+//                            }
+//                        }
+//                    }
+//                } catch (Exception e) {
+//                    // 记录错误日志
+//                    logger.error("Error processing log in logsByJsApi: {}", log.getId()+" : " + e);
+//                }
+//            }
+//            //获取外部联系人
+//            QwSopLogs qwSopLogsByJsApiNext = qwSopLogsMapper.getQwSopLogsByJsApiNext(param);
+//
+//            if (qwSopLogsByJsApiNext!=null && !StringUtil.strIsNullOrEmpty(qwSopLogsByJsApiNext.getExternalUserId()) ){
+//                //过滤非外部联系人
+//                try{
+//                    List<String> exIds=redisCache.getCacheObject("qwUserExtIds:"+param.getCorpId()+":"+param.getQwUserId());
+//                    if(StringUtils.isNotEmpty(exIds)&&exIds.size()>0){
+//                        //查询外部联系人是否存在,如果不存在,返回下一个外部联系人
+//                        if(!exIds.contains(qwSopLogsByJsApiNext.getExternalUserId())){
+//                            //更新此外部联系人所有待发记录为作废
+//                            param.setExternalUserId(qwSopLogsByJsApiNext.getExternalUserId());
+//                            qwSopLogsMapper.updateQwSopLogsByDeleted(param);
+//                            //获取下一个外部联系人 最大重试10次
+//                            for(int i=0;i<10;i++){
+//                                qwSopLogsByJsApiNext = qwSopLogsMapper.getQwSopLogsByJsApiNext(param);
+//                                if(qwSopLogsByJsApiNext!=null&&StringUtils.isNotEmpty(qwSopLogsByJsApiNext.getExternalUserId())){
+//                                    //判断非外部联系人
+//                                    if(!exIds.contains(qwSopLogsByJsApiNext.getExternalUserId())){
+//                                        param.setExternalUserId(qwSopLogsByJsApiNext.getExternalUserId());
+//                                        qwSopLogsMapper.updateQwSopLogsByDeleted(param);
+//                                    }
+//                                    else{
+//                                        break;
+//                                    }
+//
+//                                }
+//                                else {
+//                                    break;
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//                catch (Exception e){
+//                }
+//                sopParamDetailsC.setNextExternalUserId(qwSopLogsByJsApiNext.getExternalUserId().trim());
+//                sopParamDetailsC.setNextExternalId(qwSopLogsByJsApiNext.getExternalId());
+//            }
+//
+//           //获取不为空的联系人
+//
+////            try {
+////                 qwSopLogsByJsApiNext =  getQwSopLogsByJsApiNext(param);
+////            }catch (Exception e){
+////                logger.info("/n 获取下一个需要发送联系人出错:"+e.getMessage());
+////
+////            }
+//
+//            // Step 3: 构建发送列表
+//
+//
+//            if (sendJsApiList.size() > 2) {
+//                List<QwSopLogsDoSendListTVO> list = new ArrayList<>(sendJsApiList.subList(0, 2));
+//                if (!sendJsApiListOver.isEmpty()) {
+//                    list.add(sendJsApiListOver.get(0));
+//                }
+//                sopParamDetailsC.setSendList(list);
+//            } else {
+//                if (!sendJsApiListOver.isEmpty()) {
+//                    sendJsApiList.add(sendJsApiListOver.get(0));
+//                }
+//                sopParamDetailsC.setSendList(new ArrayList<>(sendJsApiList));
+//            }
+//
+//            //并发太多,积压了,先注释了
+////            // Step 4: 批量更新推送记录状态
+////            if (!sendJsApiList.isEmpty()) {
+////                processAndInsertQwSopLogsByTakeRecordsList(sopParamDetailsC.getSendList());
+////            }
+//        }catch (Exception e){
+//            logger.error("主动获取发送信息失败:-"+e);
+//        }finally {
+//            // 关闭线程池
+//            //executor.shutdown();
+//        }
+//
+//        return sopParamDetailsC;
+//    }
 
     // 逻辑封装方法
     private boolean isCourseTypeValid(int courseType, Integer logType) {

+ 2 - 0
fs-service-system/src/main/java/com/fs/sop/vo/QwSopLogsDoSendListTVO.java

@@ -24,4 +24,6 @@ public class QwSopLogsDoSendListTVO implements Serializable {
      */
     private Integer expiryTime;
 
+    private Integer sendType;
+
 }

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

@@ -79,7 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where user_id = #{params.userId} and company_id = #{params.companyId} and company_user_id = #{params.companyUserId}
     </delete>
 
-    <select id="getTagList" resultType="CompanyUserTagListVO">
+    <select id="getTagList" resultType="com.fs.store.vo.h5.CompanyUserTagListVO">
         SELECT distinct
         company_tag.tag as tagName,
         company_tag.tag_id

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

@@ -282,6 +282,33 @@
         ]]>
     </select>
 
+    <select id="getQwSopLogsByJsApiAll" parameterType="com.fs.sop.params.GetQwSopLogsByJsApiParam" resultType="com.fs.sop.vo.QwSopLogsDoSendListTVO">
+        <![CDATA[
+        select ql.id as id,
+               ql.qw_userid,
+               ql.external_user_id,
+               ql.external_user_name,
+               qs.name,
+               ql.content_json,
+               ql.send_time,
+               ql.fs_user_id,
+               ql.send_type,
+               qs.expiry_time as expiryTime
+        from qw_sop_logs ql
+                 left join qw_sop qs on qs.id = ql.sop_id
+        where ql.qw_userid=#{data.qwUserId}
+          and ql.corp_id=#{data.corpId}
+          and ql.external_user_id =#{data.externalUserId}
+          and ql.log_type = 2
+          and ql.send_type in (2,3,5,7)
+          and ql.send_status = 3
+          and ql.receiving_status = 0
+          and ql.send_time <= now()
+        order by ql.sort DESC ,ql.send_time asc
+            LIMIT 3
+        ]]>
+    </select>
+
     <select id="getQwSopLogsByJsApi" parameterType="com.fs.sop.params.GetQwSopLogsByJsApiParam" resultType="com.fs.sop.vo.QwSopLogsDoSendListTVO">
         <![CDATA[
         select ql.id as id,