align(分组管理): 组员候选按归属过滤(超管全量/非超管仅本组长创建的普通账号)、新建组长恒为当前用户、补创建时间列、chips 全量渲染(对齐 admin.js getEligibleShopManageGroupUsers/帮助文案)

This commit is contained in:
2026-09-05 23:00:08 +08:00
parent 63339b401c
commit 1692fa4a69
5 changed files with 142 additions and 30 deletions
@@ -92,6 +92,45 @@ export function toShopGroupUpdatePayload(name: string, memberUserIds: number[]):
return { groupName: text(name), memberUserIds: dedupeIds(memberUserIds) }
}
/** 组员候选用户(对齐 admin.js getEligibleShopManageGroupUsers 的过滤语义)。 */
export interface GroupMemberCandidateUser {
id: number
username: string
role: string
createdById?: number | null
}
/**
* 组员候选过滤(对齐 admin.js:3020-3028):
* - 组长本人永不进候选;
* - 超管可选全部用户(不论角色/归属);
* - 非超管仅可选"组长(创建人)名下"的普通账号。
*/
export function eligibleGroupMembers(
users: GroupMemberCandidateUser[],
leaderUserId: number | null,
operatorRole: string,
): GroupMemberCandidateUser[] {
const leaderKey = leaderUserId != null && leaderUserId > 0 ? String(leaderUserId) : ''
const isSuper = (operatorRole || '').toLowerCase() === 'super_admin'
return users.filter((u) => {
if (String(u.id) === leaderKey) return false
if (isSuper) return true
return (
(u.role || '').toLowerCase() === 'normal' &&
String(u.createdById ?? '') === leaderKey
)
})
}
/** 组员候选帮助文案(对齐 admin.js:3179-3182)。 */
export function groupMemberCandidateHint(candidateCount: number, operatorRole: string): string {
if (candidateCount > 0) return '可添加当前组长创建的普通员工账号'
return (operatorRole || '').toLowerCase() === 'normal'
? '普通账号没有下属普通员工时,这里会为空;当前账号只能作为组长使用。'
: '当前组长名下暂无可添加的普通员工账号。'
}
function dedupeIds(ids: unknown[]): number[] {
if (!Array.isArray(ids)) return []
const set = new Set<number>()