feat(P20T1-1,P20T1-2,P20T1-3): 差旅模型、申请/订单接口与工作流分支
这个提交包含在:
@@ -52,6 +52,32 @@ enum PurchaseRequestStatus {
|
||||
cancelled
|
||||
}
|
||||
|
||||
enum TravelRequestStatus {
|
||||
draft
|
||||
reviewing
|
||||
approved
|
||||
rejected
|
||||
}
|
||||
|
||||
enum TravelTripType {
|
||||
domestic
|
||||
international
|
||||
}
|
||||
|
||||
enum TravelSegmentRole {
|
||||
outbound
|
||||
return
|
||||
connection
|
||||
}
|
||||
|
||||
enum TravelTransportType {
|
||||
flight
|
||||
train
|
||||
car
|
||||
bus
|
||||
other
|
||||
}
|
||||
|
||||
enum AssetCardStatus {
|
||||
in_stock
|
||||
in_use
|
||||
@@ -130,6 +156,7 @@ enum DocumentCategoryEntityType {
|
||||
reimbursement
|
||||
leave
|
||||
purchase_request
|
||||
travel_request
|
||||
asset_card
|
||||
general
|
||||
}
|
||||
@@ -199,6 +226,7 @@ model Department {
|
||||
reimbursement_forms ReimbursementForm[]
|
||||
leave_requests LeaveRequest[]
|
||||
purchase_requests PurchaseRequest[]
|
||||
travel_requests TravelRequest[]
|
||||
workflow_instances WorkflowInstance[]
|
||||
budget_pools BudgetPool[]
|
||||
travel_orders TravelOrder[]
|
||||
@@ -258,6 +286,8 @@ model Employee {
|
||||
leave_ledgers LeaveLedger[]
|
||||
owned_cost_centers CostCenter[] @relation("CostCenterOwner")
|
||||
purchase_requests_applicant PurchaseRequest[] @relation("PurchaseRequestApplicant")
|
||||
travel_requests_applicant TravelRequest[] @relation("TravelRequestApplicant")
|
||||
travel_requests_submitted TravelRequest[] @relation("TravelRequestSubmitter")
|
||||
purchase_requests_submitted PurchaseRequest[] @relation("PurchaseRequestSubmitter")
|
||||
purchase_attachments_uploaded PurchaseAttachment[] @relation("PurchaseAttachmentUploader")
|
||||
purchase_order_archives PurchaseOrderArchive[] @relation("PurchaseOrderArchiveArchivedBy")
|
||||
@@ -456,6 +486,7 @@ model LegalEntity {
|
||||
holiday_calendars HolidayCalendar[] @relation("HolidayCalendarLegalEntity")
|
||||
suppliers Supplier[]
|
||||
purchase_requests PurchaseRequest[]
|
||||
travel_requests TravelRequest[]
|
||||
asset_cards AssetCard[]
|
||||
budget_pools BudgetPool[] @relation("BudgetPoolLegalEntity")
|
||||
|
||||
@@ -485,6 +516,7 @@ model CostCenter {
|
||||
owner_employee Employee? @relation("CostCenterOwner", fields: [owner_employee_id], references: [id], onDelete: SetNull)
|
||||
budget_pools BudgetPool[] @relation("BudgetPoolCostCenter")
|
||||
purchase_requests PurchaseRequest[]
|
||||
travel_requests TravelRequest[]
|
||||
asset_cards AssetCard[]
|
||||
|
||||
@@unique([legal_entity_id, code], map: "legal_entity_cost_center_code_ux")
|
||||
@@ -1136,6 +1168,7 @@ model BudgetPool {
|
||||
cost_center CostCenter? @relation("BudgetPoolCostCenter", fields: [cost_center_id], references: [id], onDelete: SetNull)
|
||||
ledger_entries BudgetLedgerEntry[]
|
||||
purchase_requests PurchaseRequest[]
|
||||
travel_requests TravelRequest[]
|
||||
|
||||
@@index([department_id, status], map: "idx_budget_pools_department_status")
|
||||
@@index([legal_entity_id, cost_center_id, status], map: "idx_budget_pools_scope_status")
|
||||
@@ -1246,6 +1279,69 @@ model IntegrationSyncState {
|
||||
@@map("integration_sync_states")
|
||||
}
|
||||
|
||||
model TravelRequest {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
request_no String? @unique
|
||||
applicant_employee_id String @db.Uuid
|
||||
submitter_id String? @db.Uuid
|
||||
department_id String @db.Uuid
|
||||
legal_entity_id String @db.Uuid
|
||||
cost_center_id String @db.Uuid
|
||||
budget_pool_id String? @db.Uuid
|
||||
purpose String
|
||||
trip_type TravelTripType
|
||||
start_date DateTime @db.Date
|
||||
end_date DateTime @db.Date
|
||||
estimated_amount Decimal @db.Decimal(14, 2)
|
||||
status TravelRequestStatus @default(draft)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
created_by String? @db.Uuid
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
applicant Employee @relation("TravelRequestApplicant", fields: [applicant_employee_id], references: [id], onDelete: Restrict)
|
||||
submitter Employee? @relation("TravelRequestSubmitter", fields: [submitter_id], references: [id], onDelete: SetNull)
|
||||
department Department @relation(fields: [department_id], references: [id], onDelete: Restrict)
|
||||
legal_entity LegalEntity @relation(fields: [legal_entity_id], references: [id], onDelete: Restrict)
|
||||
cost_center CostCenter @relation(fields: [cost_center_id], references: [id], onDelete: Restrict)
|
||||
budget_pool BudgetPool? @relation(fields: [budget_pool_id], references: [id], onDelete: SetNull)
|
||||
|
||||
segments TravelRequestSegment[]
|
||||
travel_orders TravelOrder[]
|
||||
workflow_instances WorkflowInstance[]
|
||||
|
||||
@@index([applicant_employee_id, start_date], map: "idx_travel_requests_applicant_start")
|
||||
@@index([submitter_id], map: "idx_travel_requests_submitter")
|
||||
@@index([department_id, status], map: "idx_travel_requests_department_status")
|
||||
@@index([legal_entity_id, cost_center_id], map: "idx_travel_requests_legal_cost_center")
|
||||
@@index([budget_pool_id], map: "idx_travel_requests_budget_pool")
|
||||
@@index([status], map: "idx_travel_requests_status")
|
||||
@@map("travel_requests")
|
||||
}
|
||||
|
||||
model TravelRequestSegment {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
travel_request_id String @db.Uuid
|
||||
sort_order Int
|
||||
segment_role TravelSegmentRole
|
||||
transport_type TravelTransportType
|
||||
from_city String
|
||||
to_city String
|
||||
depart_at DateTime
|
||||
arrive_at DateTime
|
||||
|
||||
created_at DateTime @default(now())
|
||||
created_by String? @db.Uuid
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
travel_request TravelRequest @relation(fields: [travel_request_id], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([travel_request_id, sort_order], map: "idx_travel_request_segments_request_sort")
|
||||
@@map("travel_request_segments")
|
||||
}
|
||||
|
||||
model TravelOrder {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
source String @default("manual") @db.VarChar(32)
|
||||
@@ -1253,6 +1349,7 @@ model TravelOrder {
|
||||
employee_id String @db.Uuid
|
||||
department_id String? @db.Uuid
|
||||
linked_reimbursement_id String? @db.Uuid
|
||||
travel_request_id String? @db.Uuid
|
||||
occurred_at DateTime? @db.Date
|
||||
amount Decimal? @db.Decimal(14, 2)
|
||||
currency String @default("CNY") @db.VarChar(8)
|
||||
@@ -1267,10 +1364,12 @@ model TravelOrder {
|
||||
employee Employee @relation(fields: [employee_id], references: [id], onDelete: Restrict)
|
||||
department Department? @relation(fields: [department_id], references: [id], onDelete: SetNull)
|
||||
linked_reimbursement ReimbursementForm? @relation(fields: [linked_reimbursement_id], references: [id], onDelete: SetNull)
|
||||
travel_request TravelRequest? @relation(fields: [travel_request_id], references: [id], onDelete: SetNull)
|
||||
|
||||
@@unique([source, external_order_no], map: "travel_orders_source_order_ux")
|
||||
@@index([employee_id, occurred_at], map: "idx_travel_orders_employee_occurred")
|
||||
@@index([linked_reimbursement_id])
|
||||
@@index([travel_request_id])
|
||||
@@map("travel_orders")
|
||||
}
|
||||
|
||||
@@ -1318,6 +1417,7 @@ model WorkflowInstance {
|
||||
reimbursement_id String? @db.Uuid
|
||||
leave_request_id String? @db.Uuid
|
||||
purchase_request_id String? @db.Uuid
|
||||
travel_request_id String? @db.Uuid
|
||||
submitter_id String @db.Uuid
|
||||
current_status WorkflowInstanceStatus @default(pending)
|
||||
current_step_id String
|
||||
@@ -1334,6 +1434,7 @@ model WorkflowInstance {
|
||||
reimbursement_form ReimbursementForm? @relation(fields: [reimbursement_id], references: [id], onDelete: Cascade)
|
||||
leave_request LeaveRequest? @relation(fields: [leave_request_id], references: [id], onDelete: Cascade)
|
||||
purchase_request PurchaseRequest? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)
|
||||
travel_request TravelRequest? @relation(fields: [travel_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)
|
||||
|
||||
@@ -1348,6 +1449,7 @@ model WorkflowInstance {
|
||||
@@index([reimbursement_id])
|
||||
@@index([leave_request_id])
|
||||
@@index([purchase_request_id])
|
||||
@@index([travel_request_id])
|
||||
@@index([current_status])
|
||||
@@index([submitter_id])
|
||||
@@index([context_department_id])
|
||||
|
||||
在新工单中引用
屏蔽一个用户