feat(server): 工作流扩展 leave 实体骨架(F24)

- workflow_instances 解耦 reimbursement FK:新增 reimbursement_id/leave_request_id + 回填迁移
- 新增 leave_requests 表与 /api/leave-requests 最小链路(create/submit)
- workflow approve/reject/return 支持 leave 状态更新;transfer 非报销任务禁用
- seed-config 增加 leave workflow definition;更新 v3 CSV 状态推进
这个提交包含在:
2026-02-09 21:24:53 +08:00
父节点 3cc3013d5a
当前提交 70f4d729f0
共修改 9 个文件,包含 695 行新增和 132 行删除
+42 -1
查看文件
@@ -36,6 +36,14 @@ enum ReimbursementStatus {
cancelled
}
enum LeaveRequestStatus {
draft
reviewing
approved
rejected
cancelled
}
enum InvoicePoolStatus {
pending_ocr
ocr_failed
@@ -126,6 +134,7 @@ model Department {
employees Employee[]
reimbursement_forms ReimbursementForm[]
leave_requests LeaveRequest[]
workflow_instances WorkflowInstance[]
@@index([parent_id])
@@ -177,6 +186,7 @@ model Employee {
submitted_reimbursements ReimbursementForm[] @relation("ReimbursementSubmitter")
owned_reimbursements ReimbursementForm[] @relation("ReimbursementOwner")
paid_reimbursements ReimbursementForm[] @relation("ReimbursementPaidBy")
leave_requests LeaveRequest[]
owned_invoices InvoicePool[] @relation("InvoiceOwner")
uploaded_invoices InvoicePool[] @relation("InvoiceUploader")
@@ -408,6 +418,32 @@ model ReimbursementItem {
@@map("reimbursement_items")
}
model LeaveRequest {
id String @id @default(uuid()) @db.Uuid
owner_id String @db.Uuid
department_id String @db.Uuid
start_date DateTime @db.Date
end_date DateTime @db.Date
reason String?
status LeaveRequestStatus @default(draft)
created_at DateTime @default(now())
created_by String? @db.Uuid
updated_at DateTime @updatedAt
updated_by String? @db.Uuid
owner Employee @relation(fields: [owner_id], references: [id], onDelete: Restrict)
department Department @relation(fields: [department_id], references: [id], onDelete: Restrict)
workflow_instances WorkflowInstance[]
@@index([owner_id])
@@index([department_id])
@@index([status])
@@index([owner_id, status, updated_at], map: "idx_leave_owner_status_updated_at")
@@map("leave_requests")
}
model OcrResult {
id String @id @default(uuid()) @db.Uuid
file_sha256 String
@@ -513,6 +549,8 @@ model WorkflowInstance {
workflow_id String @db.Uuid
entity_type String
entity_id String @db.Uuid
reimbursement_id String? @db.Uuid
leave_request_id String? @db.Uuid
submitter_id String @db.Uuid
current_status WorkflowInstanceStatus @default(pending)
current_step_id String
@@ -526,7 +564,8 @@ model WorkflowInstance {
updated_by String? @db.Uuid
workflow_definition WorkflowDefinition @relation(fields: [workflow_id], references: [id], onDelete: Restrict)
reimbursement_form ReimbursementForm @relation(fields: [entity_id], references: [id], onDelete: Cascade)
reimbursement_form ReimbursementForm? @relation(fields: [reimbursement_id], references: [id], onDelete: Cascade)
leave_request LeaveRequest? @relation(fields: [leave_request_id], references: [id], onDelete: Cascade)
submitter Employee @relation("WorkflowInstanceSubmitter", fields: [submitter_id], references: [id], onDelete: Restrict)
department Department? @relation(fields: [context_department_id], references: [id], onDelete: SetNull)
@@ -538,6 +577,8 @@ model WorkflowInstance {
@@index([workflow_id])
@@index([entity_type, entity_id])
@@index([reimbursement_id])
@@index([leave_request_id])
@@index([current_status])
@@index([submitter_id])
@@index([context_department_id])