/** * 用户管理业务服务 * * 功能描述: * - 用户状态管理业务逻辑 * - 批量用户操作 * - 用户状态统计 * - 状态变更审计 * * 职责分离: * - 专注于用户管理相关的业务逻辑实现 * - 调用底层AdminService提供的技术能力 * - 提供用户管理特定的业务规则和流程控制 * * 最近修改: * - 2026-01-07: 代码规范优化 - 修正文件命名规范,完善注释规范,更新作者信息 (修改者: moyin) * * @author moyin * @version 1.0.1 * @since 2025-12-24 * @lastModified 2026-01-07 */ import { Injectable, Logger } from '@nestjs/common'; import { AdminService } from '../admin/admin.service'; import { UserStatusDto, BatchUserStatusDto } from './user_status.dto'; import { UserStatusResponseDto, BatchUserStatusResponseDto, UserStatusStatsResponseDto } from './user_status_response.dto'; import { BATCH_OPERATION, DEFAULTS, ERROR_CODES, MESSAGES, UTILS } from './user_mgmt.constants'; /** * 用户管理业务服务 * * 职责: * - 实现用户状态管理的完整业务逻辑 * - 提供批量操作和状态统计的业务能力 * - 执行业务规则验证和审计日志记录 * * 主要方法: * - updateUserStatus() - 单个用户状态修改业务逻辑 * - batchUpdateUserStatus() - 批量用户状态修改业务逻辑 * - getUserStatusStats() - 用户状态统计业务逻辑 * - getUserStatusHistory() - 用户状态变更历史查询 * * 使用场景: * - 管理员执行用户状态管理操作 * - 系统自动化用户生命周期管理 * - 用户状态监控和数据分析 */ @Injectable() export class UserManagementService { private readonly logger = new Logger(UserManagementService.name); constructor(private readonly adminService: AdminService) {} /** * 修改用户状态 * * 业务逻辑: * 1. 验证状态变更的业务规则 * 2. 记录状态变更原因 * 3. 调用底层服务执行变更 * 4. 记录业务审计日志 * * @param userId 用户ID * @param userStatusDto 状态修改数据 * @returns 修改结果 * @throws NotFoundException 用户不存在时 * @throws BadRequestException 状态变更不符合业务规则时 * * @example * ```typescript * const result = await service.updateUserStatus(BigInt(123), { * status: UserStatus.ACTIVE, * reason: '用户申诉通过,恢复正常状态' * }); * ``` */ async updateUserStatus(userId: bigint, userStatusDto: UserStatusDto): Promise { this.logger.log('用户管理:开始修改用户状态', { operation: 'user_mgmt_update_status', userId: userId.toString(), newStatus: userStatusDto.status, reason: userStatusDto.reason, timestamp: UTILS.getCurrentTimestamp() }); // 调用底层管理员服务 const result = await this.adminService.updateUserStatus(userId, userStatusDto); // 记录业务层日志 if (result.success) { this.logger.log('用户管理:用户状态修改成功', { operation: 'user_mgmt_update_status_success', userId: userId.toString(), newStatus: userStatusDto.status, timestamp: UTILS.getCurrentTimestamp() }); } return result; } /** * 批量修改用户状态 * * 业务逻辑: * 1. 验证批量操作的业务规则 * 2. 分批处理大量用户 * 3. 提供批量操作的进度反馈 * 4. 记录批量操作审计 * * @param batchUserStatusDto 批量状态修改数据 * @returns 批量修改结果 * @throws BadRequestException 批量操作数量超限或参数无效时 * @throws InternalServerErrorException 批量操作执行失败时 * * @example * ```typescript * const result = await service.batchUpdateUserStatus({ * userIds: ['123', '456'], * status: UserStatus.LOCKED, * reason: '批量锁定违规用户' * }); * ``` */ async batchUpdateUserStatus(batchUserStatusDto: BatchUserStatusDto): Promise { this.logger.log('用户管理:开始批量修改用户状态', { operation: 'user_mgmt_batch_update_status', userCount: batchUserStatusDto.userIds.length, newStatus: batchUserStatusDto.status, reason: batchUserStatusDto.reason, timestamp: UTILS.getCurrentTimestamp() }); // 业务规则:限制批量操作的数量 if (batchUserStatusDto.userIds.length > BATCH_OPERATION.MAX_USER_COUNT) { this.logger.warn('用户管理:批量操作数量超限', { operation: 'user_mgmt_batch_update_limit_exceeded', requestCount: batchUserStatusDto.userIds.length, maxAllowed: BATCH_OPERATION.MAX_USER_COUNT }); return { success: false, message: MESSAGES.BATCH_OPERATION_LIMIT_ERROR, error_code: ERROR_CODES.BATCH_OPERATION_LIMIT_EXCEEDED }; } // 调用底层管理员服务 const result = await this.adminService.batchUpdateUserStatus(batchUserStatusDto); // 记录业务层日志 if (result.success) { this.logger.log('用户管理:批量用户状态修改完成', { operation: 'user_mgmt_batch_update_status_success', successCount: result.data?.result.success_count || 0, failedCount: result.data?.result.failed_count || 0, timestamp: UTILS.getCurrentTimestamp() }); } return result; } /** * 获取用户状态统计 * * 业务逻辑: * 1. 获取基础统计数据 * 2. 计算业务相关的指标 * 3. 提供状态分布分析 * 4. 缓存统计结果 * * @returns 状态统计信息 * @throws InternalServerErrorException 统计数据获取失败时 * * @example * ```typescript * const stats = await service.getUserStatusStats(); * // 返回包含各状态用户数量和分析指标的统计数据 * ``` */ async getUserStatusStats(): Promise { this.logger.log('用户管理:获取用户状态统计', { operation: 'user_mgmt_get_status_stats', timestamp: UTILS.getCurrentTimestamp() }); // 调用底层管理员服务 const result = await this.adminService.getUserStatusStats(); // 业务层可以在这里添加额外的统计分析 if (result.success && result.data) { const stats = result.data.stats; // 计算业务指标 const activeRate = stats.total > 0 ? (stats.active / stats.total * 100).toFixed(2) : '0'; const problemUserCount = stats.locked + stats.banned + stats.deleted; this.logger.log('用户管理:用户状态统计分析', { operation: 'user_mgmt_status_analysis', totalUsers: stats.total, activeUsers: stats.active, activeRate: `${activeRate}%`, problemUsers: problemUserCount, timestamp: UTILS.getCurrentTimestamp() }); } return result; } /** * 获取用户状态变更历史 * * 业务逻辑: * 1. 查询指定用户的状态变更记录 * 2. 提供状态变更的审计追踪 * 3. 支持时间范围和数量限制查询 * 4. 格式化历史记录数据 * * @param userId 用户ID * @param limit 返回数量限制 * @returns 状态变更历史 * @throws NotFoundException 用户不存在时 * @throws BadRequestException 查询参数无效时 * * @example * ```typescript * const history = await service.getUserStatusHistory(BigInt(123), 20); * // 返回用户最近20条状态变更记录 * ``` */ async getUserStatusHistory(userId: bigint, limit: number = DEFAULTS.STATUS_HISTORY_LIMIT) { this.logger.log('用户管理:获取用户状态变更历史', { operation: 'user_mgmt_get_status_history', userId: userId.toString(), limit, timestamp: UTILS.getCurrentTimestamp() }); // 注意:此功能当前返回模拟数据,实际实现需要集成审计日志服务 // 建议在后续版本中实现完整的状态变更历史查询功能 return { success: true, data: { user_id: userId.toString(), history: [] as any[], total_count: 0 }, message: '状态变更历史获取成功(当前返回空数据,待实现完整功能)' }; } }