Quellcode durchsuchen

refactor(qwGroupChat): 优化群聊成员数据同步逻辑

- 修改数据库查询语句,使用 ANY_VALUE 替代 COUNT 计算群组大小
- 新增 markActiveMembersOutByChatId 方法用于标记活跃成员为退群状态
- 新增 insertOrUpdateSyncGroupChatUser 方法用于全量同步群聊成员
- 在群聊更新时先标记现有成员为退群,再同步最新成员列表
- 修复群聊成员加入时 is_out 状态设置问题
- 优化成员列表处理逻辑,使用 forEach 替代 stream.forEach
xw vor 1 Woche
Ursprung
Commit
022977f301

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatMapper.java

@@ -43,7 +43,7 @@ public interface QwGroupChatMapper
             "    ANY_VALUE(qu.qw_user_name) as qwName, " +
             "    COUNT(CASE WHEN gcu.is_out = 1 AND DATE(gcu.join_time) = CURDATE() THEN 1 END) AS todayJoinByChartUser, " +
             "    COUNT(CASE WHEN gcu.is_out = 2 AND DATE(gcu.out_time) = CURDATE() THEN 1 END) AS todayOutByChartUser, " +
-            "    COUNT(CASE WHEN gcu.is_out = 1 THEN gcu.chat_id END) AS groupSizeByChartUser, " +
+            "    ANY_VALUE(gc.group_size) AS groupSizeByChartUser, " +
             "    gc.* " +
             "FROM " +
             "    qw_group_chat gc " +

+ 10 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatUserMapper.java

@@ -128,6 +128,16 @@ public interface QwGroupChatUserMapper
     public int insertQwGroupChatUser(QwGroupChatUser qwGroupChatUser);
     public int insertOrUpdateQwGroupChatUser(QwGroupChatUser qwGroupChatUser);
 
+    /**
+     * 全量同步前:将该群当前在群/未标记成员先标为退群,再由 API 成员列表回写为在群
+     */
+    int markActiveMembersOutByChatId(@Param("chatId") String chatId, @Param("corpId") String corpId);
+
+    /**
+     * 全量同步成员:强制写入在群状态并清除退群信息
+     */
+    int insertOrUpdateSyncGroupChatUser(QwGroupChatUser qwGroupChatUser);
+
     public QwGroupChatUser selectQwGroupChatUserByExternalUserId(QwGroupChatUser qwGroupChatUser);
 
     /**

+ 5 - 2
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatServiceImpl.java

@@ -205,6 +205,7 @@ public class QwGroupChatServiceImpl implements IQwGroupChatService
                 qwGroupChatUser.setGroupNickname(groupNickname);
                 qwGroupChatUser.setCompanyId(qwCompany.getId());
                 qwGroupChatUser.setCorpId(corpId);
+                qwGroupChatUser.setIsOut(1L);
                 qwGroupChatUserMapper.insertQwGroupChatUser(qwGroupChatUser);
 
             });
@@ -347,7 +348,9 @@ public class QwGroupChatServiceImpl implements IQwGroupChatService
 
                     qwGroupChatMapper.insertOrUpdateQwGroupChat(qwGroupChat);
 
-                    memberList.stream().forEach(item -> {
+                    qwGroupChatUserMapper.markActiveMembersOutByChatId(chatId, corpId);
+
+                    memberList.forEach(item -> {
 
                         //客户名称
                         String name1 = item.getName();
@@ -393,7 +396,7 @@ public class QwGroupChatServiceImpl implements IQwGroupChatService
                         qwGroupChatUser.setJoinScene(String.valueOf(joinScene));
                         qwGroupChatUser.setGroupNickname(groupNickname);
                         qwGroupChatUser.setCorpId(corpId);
-                        qwGroupChatUserMapper.insertOrUpdateQwGroupChatUser(qwGroupChatUser);
+                        qwGroupChatUserMapper.insertOrUpdateSyncGroupChatUser(qwGroupChatUser);
 
                     });
 

+ 4 - 2
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupChatUserServiceImpl.java

@@ -134,7 +134,9 @@ public class QwGroupChatUserServiceImpl implements IQwGroupChatUserService
 
             qwGroupChatMapper.insertOrUpdateQwGroupChat(qwGroupChat);
 
-            memberList.stream().forEach(item -> {
+            qwGroupChatUserMapper.markActiveMembersOutByChatId(chatId, corpId);
+
+            memberList.forEach(item -> {
 
                 //客户名称
                 String name1 = item.getName();
@@ -179,7 +181,7 @@ public class QwGroupChatUserServiceImpl implements IQwGroupChatUserService
                 qwGroupChatUser.setJoinScene(String.valueOf(joinScene));
                 qwGroupChatUser.setGroupNickname(groupNickname);
                 qwGroupChatUser.setCorpId(corpId);
-                qwGroupChatUserMapper.insertOrUpdateQwGroupChatUser(qwGroupChatUser);
+                qwGroupChatUserMapper.insertOrUpdateSyncGroupChatUser(qwGroupChatUser);
 
             });
 

+ 1 - 1
fs-service/src/main/resources/mapper/qw/QwGroupChatMapper.xml

@@ -232,7 +232,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ANY_VALUE(qu.qw_user_name) as qwName,
         COUNT(CASE WHEN gcu.is_out = 1 AND DATE(gcu.join_time) = CURDATE() THEN 1 END) AS todayJoinByChartUser,
         COUNT(CASE WHEN gcu.is_out = 2 AND DATE(gcu.out_time) = CURDATE() THEN 1 END) AS todayOutByChartUser,
-        COUNT(CASE WHEN gcu.is_out = 1 THEN gcu.chat_id END) AS groupSizeByChartUser,
+        ANY_VALUE(gc.group_size) AS groupSizeByChartUser,
         gc.*
         FROM
         qw_group_chat gc

+ 53 - 0
fs-service/src/main/resources/mapper/qw/QwGroupChatUserMapper.xml

@@ -117,6 +117,59 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </trim>
     </insert>
 
+    <update id="markActiveMembersOutByChatId">
+        update qw_group_chat_user
+        set is_out = 2
+        where chat_id = #{chatId} and corp_id = #{corpId} and (is_out = 1 or is_out is null)
+    </update>
+
+    <insert id="insertOrUpdateSyncGroupChatUser" parameterType="QwGroupChatUser" useGeneratedKeys="true" keyProperty="id">
+        insert into qw_group_chat_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="chatId != null">chat_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="type != null">type,</if>
+            <if test="unionid != null">unionid,</if>
+            <if test="joinTime != null">join_time,</if>
+            <if test="joinScene != null">join_scene,</if>
+            <if test="invitor != null">invitor,</if>
+            <if test="groupNickname != null">group_nickname,</if>
+            <if test="name != null">name,</if>
+            <if test="companyId != null">company_id,</if>
+            is_out,
+            <if test="corpId != null">corp_id,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="chatId != null">#{chatId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="type != null">#{type},</if>
+            <if test="unionid != null">#{unionid},</if>
+            <if test="joinTime != null">#{joinTime},</if>
+            <if test="joinScene != null">#{joinScene},</if>
+            <if test="invitor != null">#{invitor},</if>
+            <if test="groupNickname != null">#{groupNickname},</if>
+            <if test="name != null">#{name},</if>
+            <if test="companyId != null">#{companyId},</if>
+            1,
+            <if test="corpId != null">#{corpId},</if>
+        </trim>
+        on duplicate key update
+        <trim suffixOverrides=",">
+            <if test="type != null">type = #{type},</if>
+            <if test="unionid != null">unionid = #{unionid},</if>
+            <if test="joinTime != null">join_time = #{joinTime},</if>
+            <if test="joinScene != null">join_scene = #{joinScene},</if>
+            <if test="invitor != null">invitor = #{invitor},</if>
+            <if test="groupNickname != null">group_nickname = #{groupNickname},</if>
+            <if test="name != null">name = #{name},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            is_out = 1,
+            out_time = null,
+            quit_scene = null,
+            <if test="corpId != null">corp_id = #{corpId},</if>
+        </trim>
+    </insert>
+
     <insert id="insertQwGroupChatUser" parameterType="QwGroupChatUser" useGeneratedKeys="true" keyProperty="id">
         insert into qw_group_chat_user
         <trim prefix="(" suffix=")" suffixOverrides=",">