staff_data/apps/server/src/models/staff/staff.service.ts

259 lines
6.0 KiB
TypeScript
Raw Normal View History

2024-09-03 20:19:33 +08:00
import { Injectable } from '@nestjs/common';
2024-12-30 08:26:40 +08:00
import {
db,
StaffMethodSchema,
ObjectType,
UserProfile,
Prisma,
2025-01-06 08:45:23 +08:00
} from '@nice/common';
2024-09-03 20:19:33 +08:00
import { DepartmentService } from '../department/department.service';
2024-12-30 08:26:40 +08:00
import { z } from 'zod';
import { BaseService } from '../base/base.service';
import * as argon2 from 'argon2';
import EventBus, { CrudOperation } from '@server/utils/event-bus';
2024-09-03 20:19:33 +08:00
@Injectable()
2024-12-30 08:26:40 +08:00
export class StaffService extends BaseService<Prisma.StaffDelegate> {
constructor(private readonly departmentService: DepartmentService) {
super(db, ObjectType.STAFF, true);
}
2025-03-25 23:01:09 +08:00
2024-12-30 08:26:40 +08:00
/**
* staff的记录
* @param deptId id
* @returns staff记录
*/
async findByDept(data: z.infer<typeof StaffMethodSchema.findByDept>) {
const { deptId, domainId } = data;
2025-03-05 21:21:03 +08:00
const childDepts = await this.departmentService.getDescendantIds(
deptId,
true,
);
2024-12-30 08:26:40 +08:00
const result = await db.staff.findMany({
where: {
deptId: { in: childDepts },
domainId,
},
});
return result;
}
2025-03-25 23:01:09 +08:00
2024-12-30 08:26:40 +08:00
async create(args: Prisma.StaffCreateArgs) {
2025-03-25 23:01:09 +08:00
const { data, select } = args;
const { fieldValues, ...staffData } = data as any;
// 创建员工基本信息
const staff = await super.create({
...args,
data: {
...staffData,
password: await argon2.hash((staffData.password || '123456') as string),
},
});
// 如果有自定义字段值,创建它们
if (fieldValues) {
await db.staffFieldValue.createMany({
data: Object.entries(fieldValues).map(([fieldId, value]) => ({
staffId: staff.id,
fieldId,
value: String(value),
})),
});
}
this.emitDataChangedEvent(staff, CrudOperation.CREATED);
return staff;
2024-12-30 08:26:40 +08:00
}
2025-03-25 23:01:09 +08:00
2024-12-30 08:26:40 +08:00
async update(args: Prisma.StaffUpdateArgs) {
const { data, where } = args;
2025-03-25 23:01:09 +08:00
const { fieldValues, ...staffData } = data as any;
// 更新员工基本信息
const staff = await super.update({
...args,
data: {
...staffData,
...(staffData.password && {
password: await argon2.hash(staffData.password as string),
}),
},
});
// 如果有自定义字段值,更新它们
if (fieldValues) {
await Promise.all(
Object.entries(fieldValues).map(([fieldId, value]) =>
db.staffFieldValue.upsert({
where: {
staffId_fieldId: {
staffId: staff.id,
fieldId,
},
},
create: {
staffId: staff.id,
fieldId,
value: String(value),
},
update: {
value: String(value),
},
}),
),
);
}
this.emitDataChangedEvent(staff, CrudOperation.UPDATED);
return staff;
2024-12-30 08:26:40 +08:00
}
2025-03-25 23:01:09 +08:00
2024-12-30 08:26:40 +08:00
private async validateUniqueFields(data: any, excludeId?: string) {
const uniqueFields = [
2025-03-05 21:21:03 +08:00
{
field: 'officerId',
errorMsg: (val: string) => `证件号为${val}的用户已存在`,
},
{
field: 'phoneNumber',
errorMsg: (val: string) => `手机号为${val}的用户已存在`,
},
{
field: 'username',
errorMsg: (val: string) => `帐号为${val}的用户已存在`,
},
2024-12-30 08:26:40 +08:00
];
for (const { field, errorMsg } of uniqueFields) {
if (data[field]) {
const count = await db.staff.count({
where: {
[field]: data[field],
2025-03-05 21:21:03 +08:00
...(excludeId && { id: { not: excludeId } }),
},
2024-09-03 20:19:33 +08:00
});
2024-12-30 08:26:40 +08:00
if (count > 0) {
throw new Error(errorMsg(data[field]));
2024-09-03 20:19:33 +08:00
}
2024-12-30 08:26:40 +08:00
}
2024-09-03 20:19:33 +08:00
}
2024-12-30 08:26:40 +08:00
}
2024-09-03 20:19:33 +08:00
2024-12-30 08:26:40 +08:00
private emitDataChangedEvent(data: any, operation: CrudOperation) {
2025-03-05 21:21:03 +08:00
EventBus.emit('dataChanged', {
2024-12-30 08:26:40 +08:00
type: this.objectType,
operation,
data,
});
}
/**
2025-03-05 21:21:03 +08:00
* DomainId
* @param data domainId对象
* @returns
*/
2024-12-30 08:26:40 +08:00
async updateUserDomain(data: { domainId?: string }, staff?: UserProfile) {
2025-03-05 21:21:03 +08:00
const { domainId } = data;
2024-12-30 08:26:40 +08:00
if (staff.domainId !== domainId) {
const result = await this.update({
where: { id: staff.id },
data: {
domainId,
deptId: null,
},
});
return result;
} else {
return staff;
2024-09-03 20:19:33 +08:00
}
2024-12-30 08:26:40 +08:00
}
2025-03-25 23:01:09 +08:00
async findUnique(args: Prisma.StaffFindUniqueArgs) {
const staff = await super.findUnique(args);
if (!staff) return null;
// 获取自定义字段值
const fieldValues = await db.staffFieldValue.findMany({
where: { staffId: staff.id },
include: { field: true },
});
return {
...staff,
fieldValues: fieldValues.reduce((acc, { field, value }) => ({
...acc,
[field.name]: value,
}), {}),
};
}
async addCustomField(data: {
name: string;
label?: string;
type: string;
required?: boolean;
order?: number;
options?: any;
group?: string;
}) {
return this.prisma.staffField.create({
data: {
...data,
},
});
}
async updateCustomField(data: {
id: string;
name?: string;
label?: string;
type?: string;
required?: boolean;
order?: number;
options?: any;
group?: string;
}) {
const { id, ...updateData } = data;
return this.prisma.staffField.update({
where: { id },
data: updateData,
});
}
async deleteCustomField(id: string) {
return this.prisma.staffField.delete({
where: { id },
});
}
async getCustomFields() {
return this.prisma.staffField.findMany({
orderBy: { order: 'asc' },
});
}
async setCustomFieldValue(data: {
staffId: string;
fieldId: string;
value?: string;
}) {
const { staffId, fieldId, value } = data;
return this.prisma.staffFieldValue.upsert({
where: {
staffId_fieldId: {
staffId,
fieldId,
}
},
create: {
staffId,
fieldId,
value,
},
update: {
value,
},
});
}
2024-09-03 20:19:33 +08:00
}