|
|
@@ -64,6 +64,55 @@ export class UserService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ async findAllUsersWithFilter(
|
|
|
+ page: number = 0,
|
|
|
+ size: number = 20,
|
|
|
+ id?: number,
|
|
|
+ name?: string
|
|
|
+ ): Promise<PaginationResponse<Partial<User>>> {
|
|
|
+ const queryBuilder = this.userRepository
|
|
|
+ .createQueryBuilder('user')
|
|
|
+ .select(['user.id', 'user.name', 'user.role', 'user.parentId', 'user.createdAt', 'user.updatedAt'])
|
|
|
+
|
|
|
+ // 按 id 筛选
|
|
|
+ if (id !== undefined) {
|
|
|
+ queryBuilder.andWhere('user.id = :id', { id })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按 name 精确匹配
|
|
|
+ if (name) {
|
|
|
+ queryBuilder.andWhere('user.name = :name', { name })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ queryBuilder.orderBy('user.id', 'ASC')
|
|
|
+
|
|
|
+ // 获取总数
|
|
|
+ const total = await queryBuilder.getCount()
|
|
|
+
|
|
|
+ // 分页
|
|
|
+ const users = await queryBuilder
|
|
|
+ .skip((Number(page) || 0) * (Number(size) || 20))
|
|
|
+ .take(Number(size) || 20)
|
|
|
+ .getMany()
|
|
|
+
|
|
|
+ return {
|
|
|
+ content: users.map(user => ({
|
|
|
+ id: user.id,
|
|
|
+ name: user.name,
|
|
|
+ role: user.role,
|
|
|
+ parentId: user.parentId,
|
|
|
+ createdAt: user.createdAt,
|
|
|
+ updatedAt: user.updatedAt
|
|
|
+ })),
|
|
|
+ metadata: {
|
|
|
+ total,
|
|
|
+ page: Number(page) || 0,
|
|
|
+ size: Number(size) || 20
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
async findAllUsers(): Promise<Partial<User>[]> {
|
|
|
return this.userRepository.find({
|
|
|
select: ['id', 'name']
|
|
|
@@ -99,46 +148,64 @@ export class UserService {
|
|
|
return result
|
|
|
}
|
|
|
|
|
|
+ async isChildUser(parentId: number, targetUserId: number): Promise<boolean> {
|
|
|
+ // 如果目标用户就是自己,返回 true
|
|
|
+ if (parentId === targetUserId) {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 只有3层:ADMIN -> MANAGER -> USER,只需检查直接子用户
|
|
|
+ const targetUser = await this.userRepository.findOne({
|
|
|
+ select: ['id', 'parentId'],
|
|
|
+ where: { id: targetUserId }
|
|
|
+ })
|
|
|
+
|
|
|
+ return targetUser?.parentId === parentId
|
|
|
+ }
|
|
|
+
|
|
|
async findAllChildUsers(
|
|
|
parentId: number,
|
|
|
page: number = 0,
|
|
|
- size: number = 20
|
|
|
+ size: number = 20,
|
|
|
+ id?: number,
|
|
|
+ name?: string
|
|
|
): Promise<PaginationResponse<Partial<User>>> {
|
|
|
- const result: Partial<User>[] = []
|
|
|
-
|
|
|
- const currentUser = await this.userRepository.findOne({
|
|
|
- select: ['id', 'name', 'role', 'parentId', 'createdAt', 'updatedAt'],
|
|
|
- where: { id: parentId }
|
|
|
- })
|
|
|
-
|
|
|
- if (currentUser) {
|
|
|
- result.push(currentUser)
|
|
|
+ // 查询自己以及直接子用户
|
|
|
+ const queryBuilder = this.userRepository
|
|
|
+ .createQueryBuilder('user')
|
|
|
+ .select(['user.id', 'user.name', 'user.role', 'user.parentId', 'user.createdAt', 'user.updatedAt'])
|
|
|
+ .where('(user.id = :parentId OR user.parentId = :parentId)', { parentId })
|
|
|
+
|
|
|
+ // 添加筛选条件
|
|
|
+ if (id !== undefined) {
|
|
|
+ queryBuilder.andWhere('user.id = :id', { id })
|
|
|
}
|
|
|
|
|
|
- const findChildren = async (pid: number) => {
|
|
|
- const users = await this.userRepository.find({
|
|
|
- select: ['id', 'name', 'role', 'parentId', 'createdAt', 'updatedAt'],
|
|
|
- where: { parentId: pid }
|
|
|
- })
|
|
|
-
|
|
|
- for (const user of users) {
|
|
|
- result.push(user)
|
|
|
- await findChildren(user.id)
|
|
|
- }
|
|
|
+ if (name) {
|
|
|
+ queryBuilder.andWhere('user.name = :name', { name })
|
|
|
}
|
|
|
|
|
|
- await findChildren(parentId)
|
|
|
+ // 排序
|
|
|
+ queryBuilder.orderBy('user.id', 'ASC')
|
|
|
|
|
|
- result.sort((a, b) => (a.id || 0) - (b.id || 0))
|
|
|
+ // 获取总数
|
|
|
+ const total = await queryBuilder.getCount()
|
|
|
|
|
|
- const total = result.length
|
|
|
- const paginatedUsers = result.slice(
|
|
|
- (Number(page) || 0) * (Number(size) || 20),
|
|
|
- ((Number(page) || 0) + 1) * (Number(size) || 20)
|
|
|
- )
|
|
|
+ // 分页
|
|
|
+ const users = await queryBuilder
|
|
|
+ .skip((Number(page) || 0) * (Number(size) || 20))
|
|
|
+ .take(Number(size) || 20)
|
|
|
+ .getMany()
|
|
|
|
|
|
return {
|
|
|
- content: paginatedUsers,
|
|
|
+ content: users.map(user => ({
|
|
|
+ id: user.id,
|
|
|
+ name: user.name,
|
|
|
+ role: user.role,
|
|
|
+ parentId: user.parentId,
|
|
|
+ createdAt: user.createdAt,
|
|
|
+ updatedAt: user.updatedAt
|
|
|
+ })),
|
|
|
metadata: {
|
|
|
total,
|
|
|
page: Number(page) || 0,
|