A2/A4/A6 实现员工头像后端、组织架构接口与合同模型

这个提交包含在:
2026-03-29 11:29:17 +08:00
父节点 92163e0af2
当前提交 6f9e1d30a2
共修改 8 个文件,包含 1120 行新增和 61 行删除
@@ -0,0 +1,35 @@
-- AlterTable
ALTER TABLE "employees" ADD COLUMN "avatar_path" TEXT;
-- CreateEnum
CREATE TYPE "EmployeeContractType" AS ENUM ('labor', 'nda', 'non_compete', 'internship');
-- CreateTable
CREATE TABLE "employee_contracts" (
"id" UUID NOT NULL,
"employee_id" UUID NOT NULL,
"contract_no" TEXT NOT NULL,
"contract_type" "EmployeeContractType" NOT NULL,
"start_date" DATE NOT NULL,
"end_date" DATE NOT NULL,
"terminated_date" DATE,
"attachment_path" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"created_by" UUID,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_by" UUID,
CONSTRAINT "employee_contracts_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "employee_contracts_employee_contract_no_ux" ON "employee_contracts"("employee_id", "contract_no");
-- CreateIndex
CREATE INDEX "idx_employee_contracts_employee_start" ON "employee_contracts"("employee_id", "start_date");
-- CreateIndex
CREATE INDEX "idx_employee_contracts_employee_end" ON "employee_contracts"("employee_id", "end_date");
-- AddForeignKey
ALTER TABLE "employee_contracts" ADD CONSTRAINT "employee_contracts_employee_id_fkey" FOREIGN KEY ("employee_id") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+91 -59
查看文件
@@ -343,6 +343,13 @@ enum EmployeePresenceSource {
admin_override
}
enum EmployeeContractType {
labor
nda
non_compete
internship
}
enum WeeklyReportStatus {
draft
submitted
@@ -497,6 +504,7 @@ model Employee {
emergency_contact_name String?
emergency_contact_phone String?
notes String?
avatar_path String?
bank_account_encrypted String
bank_name String
@@ -563,28 +571,29 @@ model Employee {
workflow_tasks_assigned WorkflowTask[] @relation("WorkflowTaskAssignee")
workflow_tasks_completed WorkflowTask[] @relation("WorkflowTaskCompleter")
approval_transfers_from ApprovalTransfer[] @relation("TransferFrom")
approval_transfers_to ApprovalTransfer[] @relation("TransferTo")
password_reset_codes PasswordResetCode[]
lifecycle_events EmployeeLifecycleEvent[]
checklist_tasks EmployeeChecklistTask[]
presence_records EmployeePresence[]
weekly_reports WeeklyReport[]
todo_items_assigned TodoItem[] @relation("TodoAssignee")
todo_items_created TodoItem[] @relation("TodoCreator")
wecom_identity_binding WecomIdentityBinding?
owned_projects Project[] @relation("ProjectOwner")
managed_projects Project[] @relation("ProjectManager")
project_memberships ProjectMember[]
owned_project_milestones ProjectMilestone[] @relation("ProjectMilestoneOwner")
assigned_project_tasks ProjectTask[] @relation("ProjectTaskAssignee")
created_project_tasks ProjectTask[] @relation("ProjectTaskCreator")
owned_project_risks ProjectRisk[] @relation("ProjectRiskOwner")
owned_project_delivery_records ProjectDeliveryRecord[] @relation("ProjectDeliveryRecordOwner")
created_project_communication_logs ProjectCommunicationLog[] @relation("ProjectCommunicationLogCreator")
approval_transfers_from ApprovalTransfer[] @relation("TransferFrom")
approval_transfers_to ApprovalTransfer[] @relation("TransferTo")
password_reset_codes PasswordResetCode[]
lifecycle_events EmployeeLifecycleEvent[]
checklist_tasks EmployeeChecklistTask[]
presence_records EmployeePresence[]
weekly_reports WeeklyReport[]
todo_items_assigned TodoItem[] @relation("TodoAssignee")
todo_items_created TodoItem[] @relation("TodoCreator")
wecom_identity_binding WecomIdentityBinding?
owned_projects Project[] @relation("ProjectOwner")
managed_projects Project[] @relation("ProjectManager")
project_memberships ProjectMember[]
owned_project_milestones ProjectMilestone[] @relation("ProjectMilestoneOwner")
assigned_project_tasks ProjectTask[] @relation("ProjectTaskAssignee")
created_project_tasks ProjectTask[] @relation("ProjectTaskCreator")
owned_project_risks ProjectRisk[] @relation("ProjectRiskOwner")
owned_project_delivery_records ProjectDeliveryRecord[] @relation("ProjectDeliveryRecordOwner")
created_project_communication_logs ProjectCommunicationLog[] @relation("ProjectCommunicationLogCreator")
completed_project_closure_checklists ProjectClosureChecklistItem[] @relation("ProjectClosureChecklistItemCompleter")
owned_contract_registries ContractRegistry[] @relation("ContractRegistryOwner")
owned_confidential_document_refs ConfidentialDocumentRef[] @relation("ConfidentialDocumentRefOwner")
owned_contract_registries ContractRegistry[] @relation("ContractRegistryOwner")
owned_confidential_document_refs ConfidentialDocumentRef[] @relation("ConfidentialDocumentRefOwner")
contracts EmployeeContract[]
@@index([department_id])
@@index([legal_entity_id], map: "idx_employees_legal_entity")
@@ -1549,30 +1558,30 @@ model EntityRiskFlag {
}
model PaymentBatch {
id String @id @default(uuid()) @db.Uuid
batch_no String @unique @db.VarChar(64)
entity_type PaymentBatchEntityType
name String
status PaymentBatchStatus @default(draft)
default_payment_date DateTime? @db.Date
default_payment_channel String? @db.VarChar(20)
voucher_prefix String? @db.VarChar(32)
review_comment String?
id String @id @default(uuid()) @db.Uuid
batch_no String @unique @db.VarChar(64)
entity_type PaymentBatchEntityType
name String
status PaymentBatchStatus @default(draft)
default_payment_date DateTime? @db.Date
default_payment_channel String? @db.VarChar(20)
voucher_prefix String? @db.VarChar(32)
review_comment String?
secondary_review_comment String?
execution_summary_json Json?
execution_summary_json Json?
created_at DateTime @default(now())
created_by String? @db.Uuid
reviewed_at DateTime?
reviewed_by String? @db.Uuid
created_at DateTime @default(now())
created_by String? @db.Uuid
reviewed_at DateTime?
reviewed_by String? @db.Uuid
secondary_reviewed_at DateTime?
secondary_reviewed_by String? @db.Uuid
executed_at DateTime?
executed_by String? @db.Uuid
cancelled_at DateTime?
cancelled_by String? @db.Uuid
updated_at DateTime @updatedAt
updated_by String? @db.Uuid
executed_at DateTime?
executed_by String? @db.Uuid
cancelled_at DateTime?
cancelled_by String? @db.Uuid
updated_at DateTime @updatedAt
updated_by String? @db.Uuid
items PaymentBatchItem[]
@@ -1780,15 +1789,15 @@ model Project {
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
owner Employee @relation("ProjectOwner", fields: [owner_employee_id], references: [id], onDelete: Restrict)
manager Employee? @relation("ProjectManager", fields: [manager_employee_id], references: [id], onDelete: SetNull)
members ProjectMember[]
milestones ProjectMilestone[]
tasks ProjectTask[]
risks ProjectRisk[]
reimbursements ReimbursementForm[]
travel_requests TravelRequest[]
todo_items TodoItem[]
owner Employee @relation("ProjectOwner", fields: [owner_employee_id], references: [id], onDelete: Restrict)
manager Employee? @relation("ProjectManager", fields: [manager_employee_id], references: [id], onDelete: SetNull)
members ProjectMember[]
milestones ProjectMilestone[]
tasks ProjectTask[]
risks ProjectRisk[]
reimbursements ReimbursementForm[]
travel_requests TravelRequest[]
todo_items TodoItem[]
weekly_reports ProjectLinkOnWeeklyReport[]
communication_logs ProjectCommunicationLog[]
closure_checklist_items ProjectClosureChecklistItem[]
@@ -1905,16 +1914,16 @@ model ProjectLinkOnWeeklyReport {
}
model ProjectCommunicationLog {
id String @id @default(uuid()) @db.Uuid
project_id String @db.Uuid
id String @id @default(uuid()) @db.Uuid
project_id String @db.Uuid
happened_at DateTime
channel ProjectCommunicationChannel
external_contact_name String?
external_org_name String?
summary String
next_action String?
next_follow_up_date DateTime? @db.Date
created_by String @db.Uuid
next_follow_up_date DateTime? @db.Date
created_by String @db.Uuid
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
@@ -1929,15 +1938,15 @@ model ProjectCommunicationLog {
}
model ProjectClosureChecklistItem {
id String @id @default(uuid()) @db.Uuid
project_id String @db.Uuid
item_key String @db.VarChar(64)
id String @id @default(uuid()) @db.Uuid
project_id String @db.Uuid
item_key String @db.VarChar(64)
title String
status ProjectClosureChecklistStatus @default(pending)
note String?
sort_order Int @default(100)
sort_order Int @default(100)
completed_at DateTime?
completed_by String? @db.Uuid
completed_by String? @db.Uuid
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
@@ -1975,6 +1984,29 @@ model ContractRegistry {
@@map("contract_registry")
}
model EmployeeContract {
id String @id @default(uuid()) @db.Uuid
employee_id String @db.Uuid
contract_no String
contract_type EmployeeContractType
start_date DateTime @db.Date
end_date DateTime @db.Date
terminated_date DateTime? @db.Date
attachment_path String?
created_at DateTime @default(now())
created_by String? @db.Uuid
updated_at DateTime @default(now()) @updatedAt
updated_by String? @db.Uuid
employee Employee @relation(fields: [employee_id], references: [id], onDelete: Cascade)
@@unique([employee_id, contract_no], map: "employee_contracts_employee_contract_no_ux")
@@index([employee_id, start_date], map: "idx_employee_contracts_employee_start")
@@index([employee_id, end_date], map: "idx_employee_contracts_employee_end")
@@map("employee_contracts")
}
model ProjectDeliveryRecord {
id String @id @default(uuid()) @db.Uuid
project_id String @db.Uuid