feat(M08-B): 补保洁员资料管理
This commit is contained in:
@@ -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}%`;
|
||||
|
||||
@@ -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()
|
||||
});
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user