import { Injectable } from "@nestjs/common"; import { BaseService } from "../base/base.service"; import { db, ObjectType, Prisma } from "@nice/common"; import EventBus, { CrudOperation } from "@server/utils/event-bus"; @Injectable() export class SystemLogService extends BaseService { constructor() { super(db, ObjectType.SYSTEM_LOG, false); // 不自动处理更新时间和删除时间 } async create(args: Prisma.SystemLogCreateArgs) { const result = await super.create(args); this.emitDataChanged(CrudOperation.CREATED, result); return result; } async findMany(args: Prisma.SystemLogFindManyArgs): Promise[]> { return super.findMany(args); // 放弃分页结构 } async logStaffAction( action: string, operatorId: string | null, ipAddress: string | null, targetId: string, targetName: string, beforeData: any = null, afterData: any = null, status: 'success' | 'failure' = 'success', errorMessage?: string ) { // 生成变更详情 const details = beforeData && afterData ? this.generateChangeDetails(beforeData, afterData) : {}; return this.create({ data: { level: status === 'success' ? 'info' : 'error', module: '人员管理', action, operatorId, ipAddress, targetId, targetType: 'staff', targetName, details, beforeData, afterData, status, errorMessage, } }); } /** * 生成变更详情 */ private generateChangeDetails(before: any, after: any) { if (!before || !after) return {}; const changes: Record = {}; Object.keys(after).forEach(key => { // 忽略一些不需要记录的字段 if (['password', 'createdAt', 'updatedAt', 'deletedAt'].includes(key)) return; if (JSON.stringify(before[key]) !== JSON.stringify(after[key])) { changes[key] = { oldValue: before[key], newValue: after[key] }; } }); return { changes }; } private emitDataChanged(operation: CrudOperation, data: any) { EventBus.emit('dataChanged', { type: ObjectType.SYSTEM_LOG, operation, data, }); } }