liyong
2 小时以前 7a23c450f3ac85de7dca1b908de273ff636ce218
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
package cn.iocoder.yudao.module.im.service.group;
 
import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberUpdateReqVO;
import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
import jakarta.validation.Valid;
 
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Map;
 
/**
 * 群成员 Service 接口
 *
 * @author 芋道源码
 */
public interface ImGroupMemberService {
 
    /**
     * 获得群成员
     *
     * @param id 编号
     * @return 群成员
     */
    ImGroupMemberDO getGroupMember(Long id);
 
    /**
     * 获得群成员
     *
     * @param groupId 群编号
     * @param userId  用户编号
     * @return 群成员
     */
    ImGroupMemberDO getGroupMember(Long groupId, Long userId);
 
    /**
     * 批量查询群成员(包含所有状态)
     *
     * @param groupId 群编号
     * @param userIds 用户编号集合
     * @return 群成员列表
     */
    List<ImGroupMemberDO> getGroupMembers(Long groupId, Collection<Long> userIds);
 
    /**
     * 根据群组 id 查询群成员(包含所有状态)
     *
     * @param groupId 群组id
     * @return 群成员列表
     */
    List<ImGroupMemberDO> getGroupMemberListByGroupId(Long groupId);
 
    /**
     * 根据群编号查询有效成员列表(仅 ENABLE 状态)
     *
     * @param groupId 群编号
     * @return 有效群成员列表
     */
    List<ImGroupMemberDO> getActiveGroupMemberListByGroupId(Long groupId);
 
    /**
     * 获取群里活跃的群主 + 管理员;用于审批通知定向推送
     *
     * @param groupId 群编号
     * @return 群主 / 管理员的成员记录列表(按入群时间倒序的天然成员表顺序)
     */
    List<ImGroupMemberDO> getGroupMemberListByOwnerAndAdmin(Long groupId);
 
    /**
     * 根据群编号查询有效成员的 userId 列表(仅 ENABLE 状态)
     * <p>
     * 相比 {@link #getActiveGroupMemberListByGroupId(Long)},只返回 userId,结果体积小,并带有 Redis 缓存。
     * 适用于"群消息推送目标"等只需要 userId 的场景;
     * 需要 joinTime/quitTime/status 等字段做历史消息可见性判断时,仍应使用完整列表方法。
     *
     * @param groupId 群编号
     * @return 有效群成员 userId 列表
     */
    List<Long> getActiveGroupMemberUserIdsByGroupId(Long groupId);
 
    /**
     * 查询用户所在的所有群的有效成员记录(仅 ENABLE 状态)
     *
     * @param userId 用户编号
     * @return 有效群成员记录列表
     */
    List<ImGroupMemberDO> getActiveGroupMemberListByUserId(Long userId);
 
    /**
     * 查询用户曾经加入的所有群成员记录(含已退群)
     *
     * @param userId 用户编号
     * @return 群成员记录列表
     */
    List<ImGroupMemberDO> getGroupMemberListByUserId(Long userId);
 
    /**
     * 添加群成员(入群),角色默认 MEMBER
     *
     * @param groupId 群编号
     * @param userId  用户编号
     * @return 群成员记录
     */
    @SuppressWarnings("UnusedReturnValue")
    ImGroupMemberDO addGroupMember(Long groupId, Long userId);
 
    /**
     * 添加群成员(入群),并指定角色
     * <p>
     * 重置旧成员行也会强制重置 role,避免离群期间残留管理员身份被复用。
     *
     * @param groupId 群编号
     * @param userId  用户编号
     * @param role    成员角色,见 {@link cn.iocoder.yudao.module.im.enums.group.ImGroupMemberRoleEnum}
     * @return 群成员记录
     */
    @SuppressWarnings("UnusedReturnValue")
    ImGroupMemberDO addGroupMember(Long groupId, Long userId, Integer role);
 
    /**
     * 添加群成员(入群),并指定角色 / 加入来源 / 邀请人
     * <p>
     * 重置旧成员行也会强制重置 role / addSource / inviterUserId,确保留痕反映「本次入群」事件
     *
     * @param groupId       群编号
     * @param userId        用户编号
     * @param role          成员角色
     * @param addSource     加入来源,见 {@link cn.iocoder.yudao.module.im.enums.group.ImGroupAddSourceEnum}
     * @param inviterUserId 邀请人用户编号;NULL 表示主动申请
     * @return 群成员记录
     */
    @SuppressWarnings("UnusedReturnValue")
    ImGroupMemberDO addGroupMember(Long groupId, Long userId, Integer role, Integer addSource, Long inviterUserId);
 
    /**
     * 批量添加群成员(入群)
     *
     * @param groupId 群编号
     * @param userIds 用户编号集合
     */
    void addGroupMembers(Long groupId, Collection<Long> userIds);
 
    /**
     * 批量添加群成员(入群),统一携带加入来源 / 邀请人
     *
     * @param groupId       群编号
     * @param userIds       用户编号集合
     * @param addSource     加入来源
     * @param inviterUserId 邀请人用户编号;NULL 表示主动申请
     */
    void addGroupMembers(Long groupId, Collection<Long> userIds, Integer addSource, Long inviterUserId);
 
    /**
     * 校验用户是否为群的有效成员
     *
     * @param groupId 群编号
     * @param userId  用户编号
     * @return 群成员记录
     */
    ImGroupMemberDO validateMemberInGroup(Long groupId, Long userId);
 
    /**
     * 批量校验用户都是该群的有效成员;任一缺失 / 禁用即抛 {@code GROUP_MEMBER_NOT_IN_GROUP}
     *
     * @param groupId 群编号
     * @param userIds 用户编号集合;为空直接返回
     */
    void validateMembersInGroup(Long groupId, Collection<Long> userIds);
 
    /**
     * 更新群成员信息(群内昵称、群名备注、免打扰等)
     * <p>
     * 内部会校验用户是否为群的有效成员
     *
     * @param userId      当前登录用户编号
     * @param updateReqVO 更新信息
     */
    void updateGroupMember(Long userId, @Valid ImGroupMemberUpdateReqVO updateReqVO);
 
    /**
     * 批量更新群成员角色
     *
     * @param groupId 群编号
     * @param userIds 用户编号集合
     * @param role    新角色,见 {@link cn.iocoder.yudao.module.im.enums.group.ImGroupMemberRoleEnum}
     */
    int updateGroupMemberRole(Long groupId, Collection<Long> userIds, Integer role);
 
    /**
     * 统计群内指定 role 的活跃成员数量
     *
     * @param groupId 群编号
     * @param role    成员角色
     * @return 数量
     */
    Long getGroupMemberCountByRole(Long groupId, Integer role);
 
    /**
     * 移除指定群成员(设置为 DISABLE 状态)
     * <p>
     * 用于退群、踢出场景
     *
     * @param groupId 群编号
     * @param userId  用户编号
     */
    void removeGroupMember(Long groupId, Long userId);
 
    /**
     * 批量移除指定群成员(设置为 DISABLE 状态)
     * <p>
     * 用于批量踢出场景
     *
     * @param groupId 群编号
     * @param userIds 用户编号集合
     */
    void removeGroupMembers(Long groupId, Collection<Long> userIds);
 
    /**
     * 移除群的全部成员(设置为 DISABLE 状态)
     * <p>
     * 用于群解散场景
     *
     * @param groupId 群编号
     */
    void removeGroupMembersByGroupId(Long groupId);
 
    /**
     * 批量按 group 统计活跃成员数:(group_id → count)
     *
     * @param groupIds 群编号集合
     * @return 群成员数 Map
     */
    Map<Long, Long> getActiveMemberCountMap(Collection<Long> groupIds);
 
    /**
     * 更新成员禁言到期时间
     *
     * @param groupId     群编号
     * @param userId      用户编号
     * @param muteEndTime 禁言到期时间;null 表示取消禁言
     */
    void updateGroupMemberMuteEndTime(Long groupId, Long userId, LocalDateTime muteEndTime);
 
}