origin/apps/server/src/models/sys-logs/systemLog.service.ts

87 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-03-26 13:00:55 +08:00
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<Prisma.SystemLogDelegate> {
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<Prisma.SystemLogGetPayload<{}>[]> {
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<string, { oldValue: any; newValue: any }> = {};
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,
});
}
}