87 lines
2.7 KiB
TypeScript
87 lines
2.7 KiB
TypeScript
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,
|
|
});
|
|
}
|
|
} |