feat(M08-B): 补保洁员资料管理

This commit is contained in:
Codex
2026-06-30 10:40:45 +08:00
parent e48d1f0301
commit 326c534ba7
16 changed files with 527 additions and 22 deletions
@@ -66,6 +66,7 @@ export class UserManagementRepository {
page: number;
pageSize: number;
status?: 'ACTIVE' | 'DISABLED';
role?: AssignableRole;
search?: string;
}): Promise<{ items: ManagedUser[]; total: number }> {
const filters = ['u.tenant_id = ?', 'u.deleted_at IS NULL'];
@@ -74,6 +75,15 @@ export class UserManagementRepository {
filters.push('u.status = ?');
params.push(input.status);
}
if (input.role) {
filters.push(`EXISTS (
SELECT 1 FROM qipai_user_roles fur
INNER JOIN qipai_roles fr ON fr.tenant_id = fur.tenant_id AND fr.id = fur.role_id
WHERE fur.tenant_id = u.tenant_id AND fur.user_id = u.id
AND fr.code = ? AND fr.status = 'ACTIVE' AND fr.deleted_at IS NULL
)`);
params.push(input.role);
}
if (input.search) {
filters.push('(u.nickname LIKE ? OR u.phone LIKE ? OR CAST(u.id AS CHAR) = ?)');
const like = `%${input.search}%`;
+1
View File
@@ -32,6 +32,7 @@ const listSchema = z.object({
page: z.coerce.number().int().min(1).default(1),
pageSize: z.coerce.number().int().min(1).max(100).default(20),
status: z.enum(['ACTIVE', 'DISABLED']).optional(),
role: z.enum(['CLEANER', 'STAFF', 'STORE_ADMIN', 'TENANT_ADMIN']).optional(),
search: z.string().trim().max(128).optional()
});
+15 -1
View File
@@ -49,6 +49,7 @@ const token = signAccessToken({
rv: 1
}, secret, 900);
let createdInput;
let listedInput;
const app = await buildApp({
userManagement: {
jwtSecret: secret,
@@ -72,7 +73,10 @@ const app = await buildApp({
}
},
repository: {
async listUsers() { return { items: [], total: 0 }; },
async listUsers(input) {
listedInput = input;
return { items: [], total: 0 };
},
async createStaff(_actor, input) {
createdInput = input;
return { userId: '22' };
@@ -97,6 +101,16 @@ assert.equal(created.statusCode, 201);
assert.equal(created.json().data.userId, '22');
assert.deepEqual(createdInput.storeIds, ['11']);
const cleaners = await app.inject({
method: 'GET',
url: '/admin-api/users?role=CLEANER&status=ACTIVE&search=%E4%BF%9D%E6%B4%81',
headers: { authorization: `Bearer ${token}` }
});
assert.equal(cleaners.statusCode, 200);
assert.equal(listedInput.role, 'CLEANER');
assert.equal(listedInput.status, 'ACTIVE');
assert.equal(listedInput.search, '保洁');
const unauthenticated = await app.inject({ method: 'GET', url: '/admin-api/users' });
assert.equal(unauthenticated.statusCode, 401);
await app.close();