fb36b10402
- 新增工作日历页面(月历视图、事件管理、自定义事件) - 考勤管理重构为6 Tab模块(班次/排班/每日出勤/月度报表/休假记录) - AI顾问新增人力报告Tab,支持流式生成+Word导出 - 工作台总览新增员工分布统计(性别/年龄/学历/司龄饼图)+部门成本拆分 - 花名册/合同/解聘补偿新增部门和状态筛选 - 薪税管理新增工资表导入模板下载、银行代发CSV导出 - 社保公积金支持多公积金账户类型显示 - 数据导出新增花名册/解聘记录导出,中文文件名编码修复 - 数据导入新增模板下载(员工/增减员/工资表)+错误日志导出 - 移除工作台日历卡片(已迁移至独立工作日历页面) - 新增20260728/20260729更新测试指导文档
70 lines
3.0 KiB
TypeScript
70 lines
3.0 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
export const createEmployeeSchema = z.object({
|
|
name: z.string().min(1, '姓名不能为空').max(30, '姓名最多30个字'),
|
|
department: z.string().min(1, '部门不能为空').max(50, '部门最多50个字'),
|
|
hireDate: z.string().datetime(),
|
|
monthlySalary: z.string().min(1, '月薪不能为空'),
|
|
gender: z.enum(['男', '女']).optional(),
|
|
femaleWorkerType: z.enum(['CADRE', 'WORKER']).optional(),
|
|
phone: z.string().regex(/^1[3-9]\d{9}$/).optional(),
|
|
isPregnant: z.boolean().default(false),
|
|
isInMedicalPeriod: z.boolean().default(false),
|
|
isWorkInjured: z.boolean().default(false),
|
|
city: z.string().max(20).optional(),
|
|
education: z.string().max(20).optional(),
|
|
contract: z.object({
|
|
signDate: z.string().datetime().nullable(),
|
|
startDate: z.string().datetime(),
|
|
endDate: z.string().datetime().nullable(),
|
|
contractType: z.enum(['FIXED', 'UNFIXED', 'UNSIGNED']),
|
|
signMethod: z.enum(['PAPER', 'ELECTRONIC']).default('PAPER'),
|
|
contractYears: z.number().int().min(1).max(10).default(3),
|
|
probationMonths: z.number().int().min(0).max(6).default(0),
|
|
probationSalary: z.number().min(0).default(0),
|
|
}).optional(),
|
|
})
|
|
|
|
export const updateEmployeeSchema = z.object({
|
|
name: z.string().min(1).max(30).optional(),
|
|
department: z.string().min(1).max(50).optional(),
|
|
hireDate: z.string().datetime().optional(),
|
|
monthlySalary: z.string().min(1).optional(),
|
|
gender: z.enum(['男', '女']).optional(),
|
|
femaleWorkerType: z.enum(['CADRE', 'WORKER']).optional(),
|
|
phone: z.string().regex(/^1[3-9]\d{9}$/).optional(),
|
|
bankName: z.string().max(50).optional(),
|
|
bankAccount: z.string().max(30).optional(),
|
|
emergencyContact: z.string().max(30).optional(),
|
|
emergencyPhone: z.string().max(20).optional(),
|
|
address: z.string().max(200).optional(),
|
|
isPregnant: z.boolean().optional(),
|
|
isInMedicalPeriod: z.boolean().optional(),
|
|
isWorkInjured: z.boolean().optional(),
|
|
socialInsBase: z.number().min(0).nullable().optional(),
|
|
housingFundBase: z.number().min(0).nullable().optional(),
|
|
specialDeduction: z.number().min(0).optional(),
|
|
city: z.string().max(20).optional(),
|
|
education: z.string().max(20).optional(),
|
|
})
|
|
|
|
export const batchRenewSchema = z.object({
|
|
contractIds: z.array(z.string()).min(1, '至少选择一个合同'),
|
|
years: z.number().int().min(1).max(5).default(3),
|
|
})
|
|
|
|
export const addContractSchema = z.object({
|
|
employeeId: z.string().min(1),
|
|
signDate: z.string().datetime().nullable(),
|
|
startDate: z.string().datetime(),
|
|
endDate: z.string().datetime().nullable(),
|
|
contractType: z.enum(['FIXED', 'UNFIXED', 'UNSIGNED']),
|
|
signMethod: z.enum(['PAPER', 'ELECTRONIC']).default('PAPER'),
|
|
contractYears: z.number().int().min(1).max(10).default(3),
|
|
probationMonths: z.number().int().min(0).max(6).default(0),
|
|
probationSalary: z.number().min(0).default(0),
|
|
attachmentUrl: z.string().nullable().optional(),
|
|
electronicContractNo: z.string().nullable().optional(),
|
|
electronicContractUrl: z.string().nullable().optional(),
|
|
})
|