fix(密钥管理): 分组口径改为「分组创建人名下用户」

- 生产分组成员表 biz_shop_manage_group_member 基本未使用(仅 2 条老数据),导致分组列恒空
- 实际归属:分组 created_by_id/user_id 即主管,其组员为 users.created_by_id 指向该主管的用户
- 分组名批量查询与按分组圈人 SQL 均按此关系重写;按分组筛选含组长本人
- 无分组记录的用户分组列回退展示「所属主管(未建分组)」,避免空值
This commit is contained in:
2026-09-13 13:42:06 +08:00
parent 1b733b23b9
commit 0323f0bb7b
6 changed files with 155 additions and 47 deletions
@@ -249,13 +249,14 @@ class UserApiSecretServiceTest {
UserApiSecretService service = newService();
AdminUserEntity operator = new AdminUserEntity();
operator.setId(88L);
// 主管未带任何分组 → 直接空页,不查密钥表
// 主管既无分组、也名下无子账户 → 只剩自己一行(无密钥记录则空页)
when(adminGroupMapper.selectLedGroups(88L)).thenReturn(List.of());
when(adminUserMapper.selectList(any())).thenReturn(List.of());
var page = service.adminPage(operator, new AdminUserSecretQuery());
assertThat(page.getItems()).isEmpty();
verify(mapper, never()).selectList(any());
assertThat(page.getGroupOptions()).isEmpty();
}
@Test
@@ -267,20 +268,50 @@ class UserApiSecretServiceTest {
group.setId(5L);
group.setGroupName("一组");
when(adminGroupMapper.selectLedGroups(88L)).thenReturn(List.of(group));
when(adminGroupMapper.selectUserIdsByGroupIds(any())).thenReturn(List.of(1L));
when(adminGroupMapper.selectUserIdsByGroupId(5L)).thenReturn(List.of(1L, 88L));
when(mapper.selectList(any())).thenReturn(List.of(row(1L, "similar-asin", "enc:sk-1", "passed")));
AdminUserEntity user = new AdminUserEntity();
user.setId(1L);
user.setUsername("张三");
when(adminUserMapper.selectById(1L)).thenReturn(user);
when(adminGroupMapper.selectGroupNamesByUserIds(any())).thenReturn(List.of());
UserGroupRef ref = new UserGroupRef();
ref.setUserId(1L);
ref.setGroupName("一组");
when(adminGroupMapper.selectGroupNamesByUserIds(any())).thenReturn(List.of(ref));
var page = service.adminPage(operator, new AdminUserSecretQuery());
assertThat(page.getItems()).hasSize(1);
assertThat(page.getItems().get(0).getGroups()).containsExactly("一组");
assertThat(page.getGroupOptions()).extracting(com.nanri.aiimage.modules.usersecret.model.vo.AdminUserSecretPageVo.GroupOptionVo::groupName)
.containsExactly("一组");
verify(adminGroupMapper).selectUserIdsByGroupIds(any());
verify(adminGroupMapper).selectUserIdsByGroupId(5L);
}
@Test
void adminPageFallsBackToLeaderUsernameWhenNoGroup() {
UserApiSecretService service = newService();
AdminUserEntity operator = new AdminUserEntity();
operator.setId(88L);
when(adminAuthSupport.currentRole(operator)).thenReturn("super_admin");
when(mapper.selectList(any())).thenReturn(List.of(row(1L, "similar-asin", "enc:sk-1", "passed")));
AdminUserEntity user = new AdminUserEntity();
user.setId(1L);
user.setUsername("张三");
user.setCreatedById(99L);
when(adminUserMapper.selectById(1L)).thenReturn(user);
when(adminGroupMapper.selectGroupNamesByUserIds(any())).thenReturn(List.of());
AdminUserEntity leader = new AdminUserEntity();
leader.setId(99L);
leader.setUsername("主管甲");
when(adminUserMapper.selectBatchIds(any())).thenReturn(List.of(user, leader));
when(adminGroupMapper.selectAllGroups()).thenReturn(List.of());
var page = service.adminPage(operator, new AdminUserSecretQuery());
assertThat(page.getItems()).hasSize(1);
assertThat(page.getItems().get(0).getGroups()).isEmpty();
assertThat(page.getItems().get(0).getLeaderUsername()).isEqualTo("主管甲");
}
@Test
@@ -289,7 +320,7 @@ class UserApiSecretServiceTest {
AdminUserEntity operator = new AdminUserEntity();
operator.setId(88L);
when(adminAuthSupport.currentRole(operator)).thenReturn("super_admin");
when(adminGroupMapper.selectUserIdsByGroupIds(List.of(5L))).thenReturn(List.of());
when(adminGroupMapper.selectUserIdsByGroupId(5L)).thenReturn(List.of());
when(adminGroupMapper.selectAllGroups()).thenReturn(List.of());
AdminUserSecretQuery query = new AdminUserSecretQuery();
@@ -297,7 +328,7 @@ class UserApiSecretServiceTest {
var page = service.adminPage(operator, query);
assertThat(page.getItems()).isEmpty();
verify(adminGroupMapper).selectUserIdsByGroupIds(List.of(5L));
verify(adminGroupMapper).selectUserIdsByGroupId(5L);
}
@Test