feat: 组织模块授权、成员管理分页、角色创建修复

- AppOrgEntity: 添加 @JsonIgnoreProperties(ignoreUnknown=true) 支持moduleKeys参数
- AppOrgServiceImpl: modifyAfter钩子处理UPDATE时自动授权模块
- AppOrgServiceImpl: createOrg中设置role.userId修复NOT NULL约束
- AppOrgServiceImpl: updatePerms第三个参数null改为new Long[0]避免NPE
- AppOrgUserServiceImpl: getMemberList支持分页+可选orgId筛选+组织名称关联
- AdminAppOrgUserController: memberList接口支持page/size分页参数
- AppOrgUserController: App端同步更新getMemberList调用
This commit is contained in:
OpenCode
2026-07-24 14:24:12 +08:00
parent b42b5750ac
commit 5e8bfebfdc
6 changed files with 49 additions and 14 deletions
@@ -28,12 +28,14 @@ public class AdminAppOrgUserController extends BaseController<AppOrgUserService,
setPageOption(createOp());
}
@Operation(summary = "获取组织成员列表")
@Operation(summary = "获取组织成员列表(分页)")
@PostMapping("/memberList")
public R memberList(@RequestAttribute JSONObject requestParams) {
Long orgId = requestParams.getLong("orgId");
List<Map<String, Object>> members = appOrgUserService.getMemberListByOrgId(orgId);
return R.ok(members);
Integer page = requestParams.getInt("page");
Integer size = requestParams.getInt("size");
Map<String, Object> result = appOrgUserService.getMemberList(orgId, page, size);
return R.ok(result);
}
@Operation(summary = "提升/降级App端管理员")
@@ -8,7 +8,6 @@ import com.cool.core.util.CoolSecurityUtil;
import com.cool.modules.org.service.AppOrgUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
@@ -27,7 +26,7 @@ public class AppOrgUserController {
Long orgId = requestParams.getLong("orgId");
Long userId = CoolSecurityUtil.getCurrentUserId();
CoolPreconditions.check(!appOrgUserService.isOrgMember(userId, orgId), "无权查看该组织成员");
List<Map<String, Object>> members = appOrgUserService.getMemberListByOrgId(orgId);
Map<String, Object> members = appOrgUserService.getMemberList(orgId, null, null);
return R.ok(members);
}
@@ -4,11 +4,13 @@ import com.cool.core.base.BaseEntity;
import com.mybatisflex.annotation.Table;
import com.cool.core.annotation.ColumnDefine;
import com.tangzc.mybatisflex.autotable.annotation.UniIndex;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(value = "app_org", comment = "组织表")
public class AppOrgEntity extends BaseEntity<AppOrgEntity> {
@@ -17,7 +17,7 @@ public interface AppOrgUserService extends BaseService<AppOrgUserEntity> {
List<Map<String, Object>> getOrgListByUserId(Long userId);
List<Map<String, Object>> getMemberListByOrgId(Long orgId);
Map<String, Object> getMemberList(Long orgId, Integer page, Integer size);
boolean isOrgAdmin(Long userId, Long orgId);
@@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject;
import com.cool.core.base.BaseServiceImpl;
import com.cool.core.cache.CoolCache;
import com.cool.core.enums.UserTypeEnum;
import com.cool.core.base.ModifyEnum;
import com.cool.core.exception.CoolPreconditions;
import com.cool.core.security.jwt.JwtTokenUtil;
import com.cool.core.security.jwt.JwtUser;
@@ -47,6 +48,16 @@ public class AppOrgServiceImpl extends BaseServiceImpl<AppOrgMapper, AppOrgEntit
private final CoolCache coolCache;
private final JwtTokenUtil jwtTokenUtil;
@Override
public void modifyAfter(JSONObject requestParams, AppOrgEntity entity, ModifyEnum type) {
if (type == ModifyEnum.UPDATE && requestParams != null && requestParams.containsKey("moduleKeys")) {
List<String> moduleKeys = requestParams.getBeanList("moduleKeys", String.class);
if (moduleKeys != null) {
authorizeModules(entity.getId(), moduleKeys);
}
}
}
@Override
@Transactional
public void createOrg(JSONObject requestParams, AppOrgEntity entity) {
@@ -55,7 +66,9 @@ public class AppOrgServiceImpl extends BaseServiceImpl<AppOrgMapper, AppOrgEntit
Long orgId = entity.getId();
Long currentUserId = com.cool.core.util.CoolSecurityUtil.getCurrentUserId();
BaseSysRoleEntity role = new BaseSysRoleEntity();
role.setUserId(currentUserId);
role.setName(entity.getName() + "管理员");
role.setLabel("org_admin_" + orgId);
role.setRemark("组织[" + entity.getName() + "]自动创建的管理角色");
@@ -128,7 +141,7 @@ public class AppOrgServiceImpl extends BaseServiceImpl<AppOrgMapper, AppOrgEntit
}
}
}
baseSysPermsService.updatePerms(role.getId(), menuIds.toArray(new Long[0]), null);
baseSysPermsService.updatePerms(role.getId(), menuIds.toArray(new Long[0]), new Long[0]);
}
}
@@ -135,27 +135,46 @@ public class AppOrgUserServiceImpl extends BaseServiceImpl<AppOrgUserMapper, App
}
@Override
public List<Map<String, Object>> getMemberListByOrgId(Long orgId) {
List<AppOrgUserEntity> orgUsers = list(QueryWrapper.create()
.eq(AppOrgUserEntity::getOrgId, orgId)
.eq(AppOrgUserEntity::getStatus, 1));
public Map<String, Object> getMemberList(Long orgId, Integer page, Integer size) {
int pageNum = (page != null && page > 0) ? page : 1;
int pageSize = (size != null && size > 0) ? size : 10;
List<Map<String, Object>> result = new ArrayList<>();
for (AppOrgUserEntity ou : orgUsers) {
QueryWrapper qw = QueryWrapper.create()
.eq(AppOrgUserEntity::getStatus, 1);
if (orgId != null) {
qw.eq(AppOrgUserEntity::getOrgId, orgId);
}
qw.orderBy(AppOrgUserEntity::getJoinTime, false);
com.mybatisflex.core.paginate.Page<AppOrgUserEntity> pg = page(
com.mybatisflex.core.paginate.Page.of(pageNum, pageSize), qw);
List<Map<String, Object>> list = new ArrayList<>();
for (AppOrgUserEntity ou : pg.getRecords()) {
Map<String, Object> item = new HashMap<>();
item.put("id", ou.getId());
item.put("userId", ou.getUserId());
item.put("orgId", ou.getOrgId());
item.put("role", ou.getRole());
item.put("joinTime", ou.getJoinTime());
AppOrgEntity org = appOrgMapper.selectOneById(ou.getOrgId());
if (org != null) {
item.put("orgName", org.getName());
}
UserInfoEntity user = userInfoMapper.selectOneById(ou.getUserId());
if (user != null) {
item.put("nickName", user.getNickName());
item.put("avatarUrl", user.getAvatarUrl());
item.put("phone", user.getPhone());
}
result.add(item);
list.add(item);
}
Map<String, Object> result = new HashMap<>();
result.put("list", list);
result.put("pagination", Map.of("total", pg.getTotalRow(), "page", pageNum, "size", pageSize));
return result;
}