diff --git a/src/main/java/com/tailbet/controller/OpsController.java b/src/main/java/com/tailbet/controller/OpsController.java index 4a4f4b4..cd4f5c1 100644 --- a/src/main/java/com/tailbet/controller/OpsController.java +++ b/src/main/java/com/tailbet/controller/OpsController.java @@ -1,6 +1,7 @@ package com.tailbet.controller; import com.tailbet.model.dto.CreateGroupDTO; +import com.tailbet.model.dto.GroupMemberOperateDTO; import com.tailbet.model.dto.PointsDTO; import com.tailbet.model.dto.PullGroupDTO; import com.tailbet.model.entity.Group; @@ -78,4 +79,32 @@ public class OpsController { return R.ok(); } + + /** + * 群主设置管理员 + *

+ * 操作人需为该群群主;同时本地与 OpenIM 角色都会更新(OpenIM roleLevel=60=管理员), + * OpenIM 同步失败会抛异常回滚本地事务,保证本地与 IM 角色一致。 + *

+ */ + @PostMapping("/group/set-admin") + public R setAdmin(@Valid @RequestBody GroupMemberOperateDTO dto) { + Long operatorId = UserContext.getUserId(); + groupService.setAdmin(dto.getGroupId(), dto.getUserId(), operatorId); + return R.ok(); + } + + /** + * 取消管理员 + *

+ * 操作人需为该群群主;同时本地与 OpenIM 角色都会更新(OpenIM roleLevel=20=普通成员), + * OpenIM 同步失败会抛异常回滚本地事务,保证本地与 IM 角色一致。 + *

+ */ + @PostMapping("/group/remove-admin") + public R removeAdmin(@Valid @RequestBody GroupMemberOperateDTO dto) { + Long operatorId = UserContext.getUserId(); + groupService.removeAdmin(dto.getGroupId(), dto.getUserId(), operatorId); + return R.ok(); + } } diff --git a/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java b/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java index 2b4606c..c21587a 100644 --- a/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java +++ b/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java @@ -251,6 +251,10 @@ public class GroupServiceImpl implements IGroupService { /** * 设置管理员 + *

+ * 本地更新群成员角色后,调用 OpenIM 接口同步角色(roleLevel=60=管理员)。 + * OpenIM 调用失败会抛异常回滚本地事务,保证本地与 IM 角色一致。 + *

*/ @Override @Transactional @@ -274,6 +278,10 @@ public class GroupServiceImpl implements IGroupService { member.setUpdateTime(LocalDateTime.now()); groupMemberMapper.updateById(member); + // OpenIM 同步:roleLevel=60 表示管理员 + openIMApiClient.setGroupMemberRole( + String.valueOf(groupId), String.valueOf(targetUserId), 60); + // 审计日志 auditService.log(groupId, null, operatorId, "SET_ADMIN", String.format("{\"targetUserId\":%d}", targetUserId)); @@ -281,6 +289,10 @@ public class GroupServiceImpl implements IGroupService { /** * 取消管理员 + *

+ * 本地更新群成员角色后,调用 OpenIM 接口同步角色(roleLevel=20=普通成员)。 + * OpenIM 调用失败会抛异常回滚本地事务,保证本地与 IM 角色一致。 + *

*/ @Override @Transactional @@ -303,6 +315,10 @@ public class GroupServiceImpl implements IGroupService { member.setUpdateTime(LocalDateTime.now()); groupMemberMapper.updateById(member); + // OpenIM 同步:roleLevel=20 表示普通成员 + openIMApiClient.setGroupMemberRole( + String.valueOf(groupId), String.valueOf(targetUserId), 20); + // 审计日志 auditService.log(groupId, null, operatorId, "REMOVE_ADMIN", String.format("{\"targetUserId\":%d}", targetUserId));