REQ-3345: 处理群的业务扩展字段

This commit is contained in:
yanglin 2025-02-06 11:39:10 +08:00
parent d47208ed1e
commit 88c1d86612
5 changed files with 49 additions and 13 deletions

View File

@ -0,0 +1,19 @@
package cn.axzo.im.center.api.vo.mq;
import cn.axzo.im.center.api.vo.group.GroupInfo;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class GroupChangedMessage extends MqMessage {
/**
* 群信息
*/
private GroupInfo group;
}

View File

@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum GroupType implements CodeDefinition<String> {
NONE("随意"),
NONE("未指定"),
VISA("变洽签"),
WORKSPACE("项目群"),
WORKSPACE_OU("项目单位群"),

View File

@ -14,6 +14,8 @@ public enum EventTypeEnum {
MESSAGE_HISTORY_CREATED("message-history", "message-history-created", "发送记录创建"),
MESSAGE_HISTORY_UPDATED("message-history", "message-history-updated", "发送记录修改"),
MESSAGE_CHAT_GROUP_CREATE("chat-group", "chat-group-create", "群聊创建[项目]"),
GROUP_CREATED("group", "group-created", "创建群聊"),
GROUP_DISMISSED("group", "group-dismissed", "群解散"),
GROUP_ADD_MEMBERS("group", "group-add-members", "添加群聊成员"),
GROUP_REMOVE_MEMBERS("group", "group-remove-members", "移除群聊成员"),
UPDATE_AVATAR("profile", "update-avatar", "头像更新"),

View File

@ -4,6 +4,7 @@ import cn.axzo.basics.common.BeanMapper;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.im.center.api.vo.group.GroupInfo;
import cn.axzo.im.center.api.vo.group.GroupMemberInfo;
import cn.axzo.im.center.api.vo.mq.GroupChangedMessage;
import cn.axzo.im.center.api.vo.mq.GroupMembersChangeMessage;
import cn.axzo.im.config.MqProducer;
import cn.axzo.im.dao.repository.GroupDao;
@ -25,15 +26,22 @@ class GroupBroadcaster {
private final MqProducer mqProducer;
private final GroupDao groupDao;
void fireMembersAdded(Group group, Collection<GroupMember> accounts) {
fireMembersChanged(group, accounts, EventTypeEnum.GROUP_ADD_MEMBERS);
void fireGroupChanged(Group group, EventTypeEnum eventType) {
GroupChangedMessage message = new GroupChangedMessage();
message.setGroup(BeanMapper.copyBean(group, GroupInfo.class));
Event event = Event.builder()
.targetId(group.getTid() + "")
.targetType(eventType.getModel())
.eventCode(eventType.getEventCode())
.shardingKey(group.getTid() + "")
.data(message)
.build();
mqProducer.send(event);
}
void fireMembersRemoved(Group group, Collection<GroupMember> accounts) {
fireMembersChanged(group, accounts, EventTypeEnum.GROUP_REMOVE_MEMBERS);
}
private void fireMembersChanged(Group group, Collection<GroupMember> accounts, EventTypeEnum eventType) {
void fireMembersChanged(Group group,
Collection<GroupMember> accounts,
EventTypeEnum eventType) {
if (accounts.isEmpty()) return;
Group effectiveGroup = groupDao.getById(group.getId());
for (GroupMember account : accounts) {
@ -44,7 +52,7 @@ class GroupBroadcaster {
.targetId(group.getTid() + "")
.targetType(eventType.getModel())
.eventCode(eventType.getEventCode())
.shardingKey(group.getId() + "")
.shardingKey(group.getTid() + "")
.data(message)
.build();
mqProducer.send(event);

View File

@ -21,6 +21,7 @@ import cn.axzo.im.dao.repository.GroupDao;
import cn.axzo.im.dao.repository.GroupMemberDao;
import cn.axzo.im.entity.Group;
import cn.axzo.im.entity.GroupMember;
import cn.axzo.im.event.inner.EventTypeEnum;
import cn.axzo.im.group.member.GroupMemberSyncer;
import cn.axzo.im.service.AccountService;
import cn.axzo.im.service.domain.ImAccounts;
@ -77,8 +78,9 @@ public class GroupManager {
BizAssertions.assertTrue(nimResponse.isSuccess(), "创建群失败: {}", nimResponse.getDesc());
groupDao.updateTid(group.getId(), nimResponse.getTid());
group = groupDao.getById(group.getId());
groupBroadcaster.fireGroupChanged(group, EventTypeEnum.GROUP_CREATED);
groupMemberSyncer.syncMembers(group);
groupBroadcaster.fireMembersAdded(group, groupMemberDao.getByTid(nimResponse.getTid()));
groupBroadcaster.fireMembersChanged(group, groupMemberDao.getByTid(nimResponse.getTid()), EventTypeEnum.GROUP_ADD_MEMBERS);
GroupCreateResponse response = new GroupCreateResponse();
response.setTid(nimResponse.getTid());
response.setAccountsNotFound(imAccounts.getAccountNotFoundPersons(
@ -97,6 +99,8 @@ public class GroupManager {
if (!nimResponse.isGroupNotFoundError())
BizAssertions.assertTrue(nimResponse.isSuccess(), "解散群失败: {}", nimResponse.getDesc());
groupDao.setDismissed(group.getTid());
group = groupDao.getById(group.getId());
groupBroadcaster.fireGroupChanged(group, EventTypeEnum.GROUP_DISMISSED);
}
@Transactional
@ -128,8 +132,10 @@ public class GroupManager {
BizAssertions.assertTrue(nimResponse.isSuccess(), "添加群成员失败: {}", nimResponse.getDesc());
// sync members 2
groupMemberSyncer.syncMembers(group);
groupBroadcaster.fireMembersAdded(group, groupMemberDao
.getByPersons(group.getTid(), toAddMembers));
groupBroadcaster.fireMembersChanged(
group,
groupMemberDao.getByPersons(group.getTid(), toAddMembers),
EventTypeEnum.GROUP_ADD_MEMBERS);
GroupAddMembersResponse response = new GroupAddMembersResponse();
response.setAccountsNotFound(imAccounts.getAccountNotFoundPersons(
groupSupport, "添加群成员", group, request.getMembers()));
@ -158,7 +164,8 @@ public class GroupManager {
log.info("移除群成员, request={}, response={}", nimRequest, nimResponse);
groupMemberSyncer.syncMembers(group);
// 不比较直接发消息
groupBroadcaster.fireMembersRemoved(group, toRemoveMembers);
groupBroadcaster.fireMembersChanged(
group, toRemoveMembers, EventTypeEnum.GROUP_REMOVE_MEMBERS);
}
@NotNull