feat(P17A-1,P17A-2): 新增采购模型权限与系统种子
这个提交包含在:
@@ -0,0 +1,135 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PurchaseRequestStatus" AS ENUM ('draft', 'reviewing', 'approved', 'rejected', 'cancelled');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "purchase_requests" (
|
||||
"id" UUID NOT NULL,
|
||||
"request_no" TEXT,
|
||||
"applicant_id" UUID NOT NULL,
|
||||
"submitter_id" UUID,
|
||||
"department_id" UUID NOT NULL,
|
||||
"legal_entity_id" UUID,
|
||||
"cost_center_id" UUID,
|
||||
"supplier_id" UUID,
|
||||
"document_category_id" UUID,
|
||||
"budget_pool_id" UUID,
|
||||
"title" TEXT NOT NULL DEFAULT '',
|
||||
"reason" TEXT,
|
||||
"currency_code" VARCHAR(8) NOT NULL DEFAULT 'CNY',
|
||||
"total_amount" DECIMAL(14,2) NOT NULL DEFAULT 0,
|
||||
"expected_delivery_date" DATE,
|
||||
"status" "PurchaseRequestStatus" NOT NULL DEFAULT 'draft',
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"created_by" UUID,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
"updated_by" UUID,
|
||||
|
||||
CONSTRAINT "purchase_requests_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "purchase_request_items" (
|
||||
"id" UUID NOT NULL,
|
||||
"purchase_request_id" UUID NOT NULL,
|
||||
"description" TEXT NOT NULL,
|
||||
"specification" TEXT,
|
||||
"quantity" DECIMAL(14,2) NOT NULL,
|
||||
"unit_price" DECIMAL(14,2) NOT NULL,
|
||||
"line_amount" DECIMAL(14,2) NOT NULL,
|
||||
"is_asset_candidate" BOOLEAN NOT NULL DEFAULT false,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"created_by" UUID,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
"updated_by" UUID,
|
||||
|
||||
CONSTRAINT "purchase_request_items_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "purchase_attachments" (
|
||||
"id" UUID NOT NULL,
|
||||
"purchase_request_id" UUID NOT NULL,
|
||||
"storage_path" TEXT NOT NULL,
|
||||
"original_name" TEXT NOT NULL,
|
||||
"mime_type" TEXT NOT NULL,
|
||||
"file_size" INTEGER NOT NULL,
|
||||
"uploaded_by" UUID NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "purchase_attachments_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "purchase_requests_request_no_key" ON "purchase_requests"("request_no");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_applicant_status_updated" ON "purchase_requests"("applicant_id", "status", "updated_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_submitter" ON "purchase_requests"("submitter_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_department" ON "purchase_requests"("department_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_legal_entity" ON "purchase_requests"("legal_entity_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_cost_center" ON "purchase_requests"("cost_center_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_supplier" ON "purchase_requests"("supplier_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_document_category" ON "purchase_requests"("document_category_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_budget_pool" ON "purchase_requests"("budget_pool_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_requests_status" ON "purchase_requests"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_request_items_request" ON "purchase_request_items"("purchase_request_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_attachments_request_created" ON "purchase_attachments"("purchase_request_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "idx_purchase_attachments_uploader" ON "purchase_attachments"("uploaded_by");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_applicant_id_fkey" FOREIGN KEY ("applicant_id") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_submitter_id_fkey" FOREIGN KEY ("submitter_id") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_department_id_fkey" FOREIGN KEY ("department_id") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_legal_entity_id_fkey" FOREIGN KEY ("legal_entity_id") REFERENCES "legal_entities"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_cost_center_id_fkey" FOREIGN KEY ("cost_center_id") REFERENCES "cost_centers"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_supplier_id_fkey" FOREIGN KEY ("supplier_id") REFERENCES "suppliers"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_document_category_id_fkey" FOREIGN KEY ("document_category_id") REFERENCES "document_categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_requests" ADD CONSTRAINT "purchase_requests_budget_pool_id_fkey" FOREIGN KEY ("budget_pool_id") REFERENCES "budget_pools"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_request_items" ADD CONSTRAINT "purchase_request_items_purchase_request_id_fkey" FOREIGN KEY ("purchase_request_id") REFERENCES "purchase_requests"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_attachments" ADD CONSTRAINT "purchase_attachments_purchase_request_id_fkey" FOREIGN KEY ("purchase_request_id") REFERENCES "purchase_requests"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "purchase_attachments" ADD CONSTRAINT "purchase_attachments_uploaded_by_fkey" FOREIGN KEY ("uploaded_by") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "workflow_instances" ADD CONSTRAINT "workflow_instances_purchase_request_id_fkey" FOREIGN KEY ("purchase_request_id") REFERENCES "purchase_requests"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
+114
-8
@@ -44,6 +44,14 @@ enum LeaveRequestStatus {
|
||||
cancelled
|
||||
}
|
||||
|
||||
enum PurchaseRequestStatus {
|
||||
draft
|
||||
reviewing
|
||||
approved
|
||||
rejected
|
||||
cancelled
|
||||
}
|
||||
|
||||
enum LeaveDaySession {
|
||||
am
|
||||
pm
|
||||
@@ -162,6 +170,7 @@ model Department {
|
||||
employees Employee[]
|
||||
reimbursement_forms ReimbursementForm[]
|
||||
leave_requests LeaveRequest[]
|
||||
purchase_requests PurchaseRequest[]
|
||||
workflow_instances WorkflowInstance[]
|
||||
budget_pools BudgetPool[]
|
||||
travel_orders TravelOrder[]
|
||||
@@ -217,9 +226,12 @@ model Employee {
|
||||
submitted_reimbursements ReimbursementForm[] @relation("ReimbursementSubmitter")
|
||||
owned_reimbursements ReimbursementForm[] @relation("ReimbursementOwner")
|
||||
paid_reimbursements ReimbursementForm[] @relation("ReimbursementPaidBy")
|
||||
leave_requests LeaveRequest[]
|
||||
leave_ledgers LeaveLedger[]
|
||||
owned_cost_centers CostCenter[] @relation("CostCenterOwner")
|
||||
leave_requests LeaveRequest[]
|
||||
leave_ledgers LeaveLedger[]
|
||||
owned_cost_centers CostCenter[] @relation("CostCenterOwner")
|
||||
purchase_requests_applicant PurchaseRequest[] @relation("PurchaseRequestApplicant")
|
||||
purchase_requests_submitted PurchaseRequest[] @relation("PurchaseRequestSubmitter")
|
||||
purchase_attachments_uploaded PurchaseAttachment[] @relation("PurchaseAttachmentUploader")
|
||||
|
||||
owned_invoices InvoicePool[] @relation("InvoiceOwner")
|
||||
uploaded_invoices InvoicePool[] @relation("InvoiceUploader")
|
||||
@@ -410,6 +422,7 @@ model LegalEntity {
|
||||
employees Employee[]
|
||||
holiday_calendars HolidayCalendar[] @relation("HolidayCalendarLegalEntity")
|
||||
suppliers Supplier[]
|
||||
purchase_requests PurchaseRequest[]
|
||||
budget_pools BudgetPool[] @relation("BudgetPoolLegalEntity")
|
||||
|
||||
@@index([enabled, archived_at], map: "idx_legal_entities_status")
|
||||
@@ -437,6 +450,7 @@ model CostCenter {
|
||||
children CostCenter[] @relation("CostCenterToParent")
|
||||
owner_employee Employee? @relation("CostCenterOwner", fields: [owner_employee_id], references: [id], onDelete: SetNull)
|
||||
budget_pools BudgetPool[] @relation("BudgetPoolCostCenter")
|
||||
purchase_requests PurchaseRequest[]
|
||||
|
||||
@@unique([legal_entity_id, code], map: "legal_entity_cost_center_code_ux")
|
||||
@@index([legal_entity_id, enabled, archived_at], map: "idx_cost_centers_legal_entity_status")
|
||||
@@ -462,6 +476,8 @@ model DocumentCategory {
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
purchase_requests PurchaseRequest[]
|
||||
|
||||
@@index([entity_type, enabled, archived_at], map: "idx_document_categories_entity_status")
|
||||
@@map("document_categories")
|
||||
}
|
||||
@@ -526,13 +542,101 @@ model Supplier {
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
legal_entity LegalEntity? @relation(fields: [legal_entity_id], references: [id], onDelete: SetNull)
|
||||
legal_entity LegalEntity? @relation(fields: [legal_entity_id], references: [id], onDelete: SetNull)
|
||||
purchase_requests PurchaseRequest[]
|
||||
|
||||
@@index([legal_entity_id, enabled, archived_at], map: "idx_suppliers_legal_entity_status")
|
||||
@@index([name], map: "idx_suppliers_name")
|
||||
@@map("suppliers")
|
||||
}
|
||||
|
||||
model PurchaseRequest {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
request_no String? @unique
|
||||
applicant_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
|
||||
supplier_id String? @db.Uuid
|
||||
document_category_id String? @db.Uuid
|
||||
budget_pool_id String? @db.Uuid
|
||||
title String @default("")
|
||||
reason String?
|
||||
currency_code String @default("CNY") @db.VarChar(8)
|
||||
total_amount Decimal @default(0) @db.Decimal(14, 2)
|
||||
expected_delivery_date DateTime? @db.Date
|
||||
status PurchaseRequestStatus @default(draft)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
created_by String? @db.Uuid
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
applicant Employee @relation("PurchaseRequestApplicant", fields: [applicant_id], references: [id], onDelete: Restrict)
|
||||
submitter Employee? @relation("PurchaseRequestSubmitter", 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: SetNull)
|
||||
cost_center CostCenter? @relation(fields: [cost_center_id], references: [id], onDelete: SetNull)
|
||||
supplier Supplier? @relation(fields: [supplier_id], references: [id], onDelete: SetNull)
|
||||
document_category DocumentCategory? @relation(fields: [document_category_id], references: [id], onDelete: SetNull)
|
||||
budget_pool BudgetPool? @relation(fields: [budget_pool_id], references: [id], onDelete: SetNull)
|
||||
|
||||
items PurchaseRequestItem[]
|
||||
attachments PurchaseAttachment[]
|
||||
workflow_instances WorkflowInstance[]
|
||||
|
||||
@@index([applicant_id, status, updated_at], map: "idx_purchase_requests_applicant_status_updated")
|
||||
@@index([submitter_id], map: "idx_purchase_requests_submitter")
|
||||
@@index([department_id], map: "idx_purchase_requests_department")
|
||||
@@index([legal_entity_id], map: "idx_purchase_requests_legal_entity")
|
||||
@@index([cost_center_id], map: "idx_purchase_requests_cost_center")
|
||||
@@index([supplier_id], map: "idx_purchase_requests_supplier")
|
||||
@@index([document_category_id], map: "idx_purchase_requests_document_category")
|
||||
@@index([budget_pool_id], map: "idx_purchase_requests_budget_pool")
|
||||
@@index([status], map: "idx_purchase_requests_status")
|
||||
@@map("purchase_requests")
|
||||
}
|
||||
|
||||
model PurchaseRequestItem {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
purchase_request_id String @db.Uuid
|
||||
description String
|
||||
specification String?
|
||||
quantity Decimal @db.Decimal(14, 2)
|
||||
unit_price Decimal @db.Decimal(14, 2)
|
||||
line_amount Decimal @db.Decimal(14, 2)
|
||||
is_asset_candidate Boolean @default(false)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
created_by String? @db.Uuid
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
purchase_request PurchaseRequest @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([purchase_request_id], map: "idx_purchase_request_items_request")
|
||||
@@map("purchase_request_items")
|
||||
}
|
||||
|
||||
model PurchaseAttachment {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
purchase_request_id String @db.Uuid
|
||||
storage_path String
|
||||
original_name String
|
||||
mime_type String
|
||||
file_size Int
|
||||
uploaded_by String @db.Uuid
|
||||
created_at DateTime @default(now())
|
||||
|
||||
purchase_request PurchaseRequest @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)
|
||||
uploader Employee @relation("PurchaseAttachmentUploader", fields: [uploaded_by], references: [id], onDelete: Restrict)
|
||||
|
||||
@@index([purchase_request_id, created_at], map: "idx_purchase_attachments_request_created")
|
||||
@@index([uploaded_by], map: "idx_purchase_attachments_uploader")
|
||||
@@map("purchase_attachments")
|
||||
}
|
||||
|
||||
model ReimbursementForm {
|
||||
id String @id @default(uuid()) @db.Uuid
|
||||
form_number String? @unique
|
||||
@@ -841,10 +945,11 @@ model BudgetPool {
|
||||
updated_at DateTime @updatedAt
|
||||
updated_by String? @db.Uuid
|
||||
|
||||
department Department? @relation(fields: [department_id], references: [id], onDelete: SetNull)
|
||||
legal_entity LegalEntity? @relation("BudgetPoolLegalEntity", fields: [legal_entity_id], references: [id], onDelete: SetNull)
|
||||
cost_center CostCenter? @relation("BudgetPoolCostCenter", fields: [cost_center_id], references: [id], onDelete: SetNull)
|
||||
ledger_entries BudgetLedgerEntry[]
|
||||
department Department? @relation(fields: [department_id], references: [id], onDelete: SetNull)
|
||||
legal_entity LegalEntity? @relation("BudgetPoolLegalEntity", fields: [legal_entity_id], references: [id], onDelete: SetNull)
|
||||
cost_center CostCenter? @relation("BudgetPoolCostCenter", fields: [cost_center_id], references: [id], onDelete: SetNull)
|
||||
ledger_entries BudgetLedgerEntry[]
|
||||
purchase_requests PurchaseRequest[]
|
||||
|
||||
@@index([department_id, status], map: "idx_budget_pools_department_status")
|
||||
@@index([legal_entity_id, cost_center_id, status], map: "idx_budget_pools_scope_status")
|
||||
@@ -1001,6 +1106,7 @@ model WorkflowInstance {
|
||||
workflow_definition WorkflowDefinition @relation(fields: [workflow_id], references: [id], onDelete: Restrict)
|
||||
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)
|
||||
submitter Employee @relation("WorkflowInstanceSubmitter", fields: [submitter_id], references: [id], onDelete: Restrict)
|
||||
department Department? @relation(fields: [context_department_id], references: [id], onDelete: SetNull)
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户