xw 1 день назад
Родитель
Сommit
7ef4e6090f

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

@@ -345,7 +345,7 @@ public class qwTask {
 
     /**
      * 自动解除误封禁的用户
-     * 定时任务:将 fs_user 表中 status=0 且 remark 为 null 的用户
+     * 定时任务:将 fs_user 表中 status=0 且 manage_status=1 且 remark 为 null 的用户
      * 自动恢复为 status=1,并设置 remark="自动解除封禁"
      */
     public void autoUnbanMistakenlyDisabledUsers() {

+ 2 - 0
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -1064,6 +1064,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         if (ObjectUtil.isNotEmpty(logVo.getActualQwId())){
             sopLogs.setQwUserKey(logVo.getActualQwId());
         }
+        qwSopLogsService.applyBlacklistCheck(sopLogs);
         return sopLogs;
     }
 
@@ -2763,6 +2764,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
 
         setting.setSetting(settings);
         sopLogs.setContentJson(JSON.toJSONString(setting));
+        qwSopLogsService.applyBlacklistCheck(sopLogs);
         return sopLogs;
     }
 

+ 8 - 2
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -1,6 +1,7 @@
 package com.fs.his.mapper;
 
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -43,6 +44,11 @@ public interface FsUserMapper
      */
     public FsUser selectFsUserByUserId(Long userId);
 
+    /**
+     * 查询已被管理员拉黑的会员ID
+     */
+    List<Long> selectBlacklistedUserIds(@Param("userIds") Collection<Long> userIds);
+
     /**
      * 查询用户列表
      *
@@ -471,13 +477,13 @@ public interface FsUserMapper
     List<FsUser> selectFsUserListByPhone(String phone);
 
     /**
-     * 查询被误封禁的用户(status=0且remark为null)
+     * 查询被误封禁的用户(status=0且manage_status=1且remark为null)
      * @return 用户列表
      */
     List<FsUser> selectMistakenlyDisabledUsers();
 
     /**
-     * 自动解除被误封禁的用户(status=0且remark为null)
+     * 自动解除被误封禁的用户(status=0且manage_status=1且remark为null)
      * 将status改为1,remark设置为"自动解除封禁"
      * @return 更新的记录数
      */

+ 1 - 1
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -206,7 +206,7 @@ public interface IFsUserService
     List<FsUser> selectUserByIds(String userIds);
 
     /**
-     * 自动解除被误封禁的用户(status=0且remark为null)
+     * 自动解除被误封禁的用户(status=0且manage_status=1且remark为null)
      * @return 解除封禁的用户数量
      */
     int autoUnbanMistakenlyDisabledUsers();

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

@@ -1628,13 +1628,13 @@ public class FsUserServiceImpl implements IFsUserService {
     }
 
     /**
-     * 自动解除被误封禁的用户(status=0且remark为null)
+     * 自动解除被误封禁的用户(status=0且manage_status=1且remark为null)
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int autoUnbanMistakenlyDisabledUsers() {
         try {
-            // 查询所有status=0且remark为null的用户
+            // 查询所有status=0且manage_status=1且remark为null的用户
             List<FsUser> disabledUsers = fsUserMapper.selectMistakenlyDisabledUsers();
 
             if (disabledUsers == null || disabledUsers.isEmpty()) {

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/AsyncQwAiChatSopService.java

@@ -27,6 +27,7 @@ import com.fs.sop.mapper.QwSopLogsMapper;
 import com.fs.sop.mapper.QwSopMapper;
 import com.fs.sop.mapper.QwSopTempContentMapper;
 import com.fs.sop.params.QwSopAutoByTags;
+import com.fs.sop.service.IQwSopLogsService;
 import com.fs.sop.service.IQwSopTempVoiceService;
 import com.fs.sop.service.impl.SopUserLogsInfoServiceImpl;
 import com.fs.system.service.ISysConfigService;
@@ -76,6 +77,9 @@ public class AsyncQwAiChatSopService {
     @Autowired
     private QwSopLogsMapper qwSopLogsMapper;
 
+    @Autowired
+    private IQwSopLogsService qwSopLogsService;
+
     @Autowired
     private FsCourseLinkMapper fsCourseLinkMapper;
 
@@ -249,6 +253,7 @@ public class AsyncQwAiChatSopService {
 
             // 直接使用批次数据进行批量更新,不需要额外的 List
             try {
+                qwSopLogsService.applyBlacklistCheck(batchList);
                 qwSopLogsMapper.batchInsertQwSopLogsOneTouch(batchList);
             } catch (Exception e) {
                 // 记录异常日志,方便后续排查问题

+ 5 - 1
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -885,7 +885,11 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         if (param.getManageRemark() != null) {
             fsUser.setManageRemark(param.getManageRemark());
         }
-        return fsUserMapper.updateFsUser(fsUser);
+        int rows = fsUserMapper.updateFsUser(fsUser);
+        if (rows > 0 && param.getManageStatus() == 2) {
+            iQwSopLogsService.cancelPendingSopLogsByBlacklistedFsUserId(contact.getFsUserId());
+        }
+        return rows;
     }
 
     @Override

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

@@ -288,6 +288,9 @@ public interface QwSopLogsMapper extends BaseMapper<QwSopLogs> {
     @DataSource(DataSourceType.SOP)
     int updateQwSopLogsByDeleted(@Param("data")GetQwSopLogsByJsApiParam param);
 
+    @DataSource(DataSourceType.SOP)
+    int updateQwSopLogsByBlacklistedFsUserId(@Param("fsUserId") Long fsUserId, @Param("remark") String remark);
+
     @DataSource(DataSourceType.SOP)
     List<QwSopLogs> getWxMsgByAccountId(@Param("accountId") long accountId);
 

+ 15 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopLogsService.java

@@ -140,4 +140,19 @@ public interface IQwSopLogsService extends IService<QwSopLogs>
      * @param qwSopLogs
      * **/
     void deleteQwSopLogsLabel(QwSopLogs qwSopLogs);
+
+    /**
+     * 校验会员是否被管理员拉黑,若是则标记日志为不发送
+     */
+    void applyBlacklistCheck(QwSopLogs sopLogs);
+
+    /**
+     * 批量校验会员拉黑状态
+     */
+    void applyBlacklistCheck(List<QwSopLogs> sopLogs);
+
+    /**
+     * 取消指定会员所有待发送的SOP记录(拉黑时调用)
+     */
+    void cancelPendingSopLogsByBlacklistedFsUserId(Long fsUserId);
 }

+ 66 - 0
fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java

@@ -17,6 +17,8 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.his.domain.FsUser;
+import com.fs.his.mapper.FsUserMapper;
 import com.fs.fastGpt.service.IFastGptChatSessionService;
 import com.fs.qw.domain.QwApiSopLogToken;
 import com.fs.qw.domain.QwExternalContact;
@@ -76,6 +78,7 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
 {
 
     private static final Logger logger = LoggerFactory.getLogger(QwSopLogsServiceImpl.class);
+    public static final String FS_USER_BLACKLIST_REMARK = "该客户已经被管理员拉黑";
     @Autowired
     private RedisCache redisCache;
     @Autowired
@@ -126,6 +129,9 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
     @Autowired
     private ICompanyUserService companyUserService;
 
+    @Autowired
+    private FsUserMapper fsUserMapper;
+
 
     /**
      * 查询企业微信SOP  定时任务
@@ -1075,6 +1081,10 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
             for (QwSopLogsDoSendListTVO log : result) {
 
                 try {
+                    if (log.getFsUserId() != null && isFsUserBlacklisted(log.getFsUserId())) {
+                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), FS_USER_BLACKLIST_REMARK);
+                        continue;
+                    }
                     if (log.getSendType()==8){
                         //(AI消息不做任何判断 直接入)切 只取了一条
                         sendJsApiList.add(log);
@@ -1595,9 +1605,65 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
 
     public void batchInsertQwSopLogs(List<QwSopLogs> logsToInsert) {
         if(logsToInsert == null || logsToInsert.isEmpty()) return;
+        applyBlacklistCheck(logsToInsert);
         qwSopLogsMapper.batchInsertQwSopLogs(logsToInsert);
     }
 
+    @Override
+    public void applyBlacklistCheck(QwSopLogs sopLogs) {
+        if (sopLogs == null || sopLogs.getFsUserId() == null) {
+            return;
+        }
+        if (isFsUserBlacklisted(sopLogs.getFsUserId())) {
+            markSopLogAsBlacklisted(sopLogs);
+        }
+    }
+
+    @Override
+    public void applyBlacklistCheck(List<QwSopLogs> sopLogs) {
+        if (sopLogs == null || sopLogs.isEmpty()) {
+            return;
+        }
+        Set<Long> fsUserIds = sopLogs.stream()
+                .map(QwSopLogs::getFsUserId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        if (fsUserIds.isEmpty()) {
+            return;
+        }
+        Set<Long> blacklistedUserIds = new HashSet<>(fsUserMapper.selectBlacklistedUserIds(fsUserIds));
+        if (blacklistedUserIds.isEmpty()) {
+            return;
+        }
+        for (QwSopLogs sopLog : sopLogs) {
+            if (sopLog.getFsUserId() != null && blacklistedUserIds.contains(sopLog.getFsUserId())) {
+                markSopLogAsBlacklisted(sopLog);
+            }
+        }
+    }
+
+    @Override
+    public void cancelPendingSopLogsByBlacklistedFsUserId(Long fsUserId) {
+        if (fsUserId == null) {
+            return;
+        }
+        qwSopLogsMapper.updateQwSopLogsByBlacklistedFsUserId(fsUserId, FS_USER_BLACKLIST_REMARK);
+    }
+
+    private boolean isFsUserBlacklisted(Long fsUserId) {
+        if (fsUserId == null) {
+            return false;
+        }
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(fsUserId);
+        return fsUser != null && fsUser.getManageStatus() != null && fsUser.getManageStatus() == 2;
+    }
+
+    private void markSopLogAsBlacklisted(QwSopLogs sopLogs) {
+        sopLogs.setSendStatus(5L);
+        sopLogs.setReceivingStatus(4L);
+        sopLogs.setRemark(FS_USER_BLACKLIST_REMARK);
+    }
+
     @Override
     public List<QwSopLogsDoSendListTVO> expiredMessagesByQwSopLogs() {
         return qwSopLogsMapper.getExpiredMessagesByQwSopLogs();

+ 6 - 0
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -54,6 +54,7 @@ import com.fs.sop.params.BatchSopUserLogsInfoParam;
 import com.fs.sop.params.BatchSopUserLogsInfoParamU;
 import com.fs.sop.params.SendUserLogsInfoMsgParam;
 import com.fs.sop.params.SopUserLogsParamByDate;
+import com.fs.sop.service.IQwSopLogsService;
 import com.fs.sop.service.IQwSopService;
 import com.fs.sop.service.IQwSopTempVoiceService;
 import com.fs.sop.service.ISopUserLogsInfoService;
@@ -190,6 +191,9 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
     @Autowired
     private FsUserMapper fsUserMapper;
 
+    @Autowired
+    private IQwSopLogsService qwSopLogsService;
+
 
 
     @Override
@@ -502,6 +506,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         sopLogs.setExternalUserName(externalUserName);
         sopLogs.setFsUserId(fsUserId);
 
+        qwSopLogsService.applyBlacklistCheck(sopLogs);
         return sopLogs;
     }
     @Override
@@ -2161,6 +2166,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
             // 直接使用批次数据进行批量更新,不需要额外的 List
             try {
+                qwSopLogsService.applyBlacklistCheck(batchList);
                 qwSopLogsMapper.batchInsertQwSopLogsOneTouch(batchList);
             } catch (Exception e) {
                 // 记录异常日志,方便后续排查问题

+ 12 - 2
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -111,6 +111,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsUserVo"/>
         where user_id = #{userId}
     </select>
+    <select id="selectBlacklistedUserIds" resultType="java.lang.Long">
+        select user_id from fs_user
+        where manage_status = 2
+        and user_id in
+        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </select>
     <select id="courseAnalysisWatchLog" resultType="com.fs.course.vo.newfs.FsCourseAnalysisCountVO">
         SELECT
         count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.user_id END ) AS courseWatchNum,
@@ -2502,23 +2510,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by user_id desc
     </select>
 
-    <!-- 查询被误封禁的用户(status=0且remark为null) -->
+    <!-- 查询被误封禁的用户(status=0且manage_status=1且remark为null) -->
     <select id="selectMistakenlyDisabledUsers" resultMap="FsUserResult">
         SELECT *
         FROM fs_user
         WHERE status = 0
+          AND manage_status = 1
           AND (remark IS NULL OR remark = '')
           AND is_del = 0
         ORDER BY user_id
     </select>
 
-    <!-- 自动解除被误封禁的用户(status=0且remark为null) -->
+    <!-- 自动解除被误封禁的用户(status=0且manage_status=1且remark为null) -->
     <update id="autoUnbanMistakenlyDisabledUsers">
         UPDATE fs_user
         SET status = 1,
             remark = '自动解除封禁',
             update_time = NOW()
         WHERE status = 0
+          AND manage_status = 1
           AND (remark IS NULL OR remark = '')
           AND is_del = 0
     </update>

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

@@ -671,6 +671,17 @@
 
 
 
+    <update id="updateQwSopLogsByBlacklistedFsUserId" useGeneratedKeys="false">
+        UPDATE qw_sop_logs
+        SET
+        send_status = 5,
+        receiving_status = 4,
+        remark = #{remark},
+        real_send_time = NOW()
+        WHERE fs_user_id = #{fsUserId}
+        AND send_status = 3
+    </update>
+
     <update id="updateQwSopLogsByDeleted"  parameterType="com.fs.sop.params.GetQwSopLogsByJsApiParam"  useGeneratedKeys="false">
         <![CDATA[
         UPDATE qw_sop_logs