GuDingZiChan/backend/prisma/schema.prisma
2026-03-10 16:19:47 +08:00

303 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model AssetType {
id Int @id @default(autoincrement())
name String @unique @db.VarChar(50)
status String @default("active") @db.VarChar(20)
can_be_parent Boolean @default(false) // 可作为父资产
can_be_child Boolean @default(false) // 可作为子资产
created_at DateTime @default(now())
updated_at DateTime @updatedAt
equipments Equipment[]
@@index([status])
@@map("asset_type")
}
model Department {
id Int @id @default(autoincrement())
name String @unique @db.VarChar(100)
status String @default("active") @db.VarChar(20)
parent_id Int? // 父部门ID,null表示根部门
created_at DateTime @default(now())
updated_at DateTime @updatedAt
// 自关联 - 部门层级
parent Department? @relation("DepartmentHierarchy", fields: [parent_id], references: [id])
children Department[] @relation("DepartmentHierarchy")
equipments Equipment[]
@@index([status])
@@index([parent_id])
@@map("department")
}
model Equipment {
id Int @id @default(autoincrement())
equipment_code String @unique @db.VarChar(50)
equipment_name String @db.VarChar(100)
equipment_model String? @db.VarChar(100)
equipment_type String @db.VarChar(50)
code_generation_mode String @default("auto") @db.VarChar(20)
status String @default("可用") @db.VarChar(20)
total_quantity Int @default(0)
remaining_quantity Int @default(0)
unit_price Decimal @default(0.00) @db.Decimal(10, 2)
total_value Decimal @default(0.00) @db.Decimal(12, 2)
borrowed_value Decimal @default(0.00) @db.Decimal(12, 2)
available_value Decimal @default(0.00) @db.Decimal(12, 2)
description String? @db.Text
purchase_date DateTime? @db.Date
supplier String? @db.VarChar(100)
storage_location_id Int?
asset_type_id Int?
department_id Int?
// 父子资产关联字段
parent_id Int? // 父资产ID(如果已挂载)
mount_status String @default("none") @db.VarChar(20) // none/mounted/unmounted
total_value_with_children Decimal @default(0.00) @db.Decimal(12, 2) // 含配件总价值
created_at DateTime @default(now())
updated_at DateTime @updatedAt
borrow_records BorrowRecord[]
storageLocation StorageLocation? @relation(fields: [storage_location_id], references: [id])
assetType AssetType? @relation(fields: [asset_type_id], references: [id])
department Department? @relation(fields: [department_id], references: [id])
// 父子资产自关联
parent Equipment? @relation("ParentChild", fields: [parent_id], references: [id])
children Equipment[] @relation("ParentChild")
// 挂载历史关联
mountHistories MountHistory[]
// 报废记录关联
disposalRecords DisposalRecord[]
// 维修记录关联
maintenanceRecords MaintenanceRecord[]
@@index([equipment_code])
@@index([equipment_type])
@@index([status])
@@index([code_generation_mode])
@@index([unit_price])
@@index([storage_location_id])
@@index([asset_type_id])
@@index([department_id])
@@index([parent_id])
@@index([mount_status])
@@map("equipment")
}
model BorrowRecord {
id Int @id @default(autoincrement())
equipment_id Int
equipment_code String @db.VarChar(50)
person_id Int
person_name String @db.VarChar(50)
person_nickname String @db.VarChar(50)
person_identifier String? @db.VarChar(50)
borrow_time DateTime @default(now())
expected_return_time DateTime?
is_long_term Boolean @default(false)
return_time DateTime?
status String @default("已借出") @db.VarChar(20)
return_condition String @default("正常") @db.VarChar(20)
notes String? @db.Text
children_snapshot String? @db.Text // JSON格式的配件快照
created_at DateTime @default(now())
updated_at DateTime @updatedAt
equipment Equipment @relation(fields: [equipment_id], references: [id])
person Person @relation(fields: [person_id], references: [id])
@@index([equipment_id])
@@index([person_id])
@@index([status])
@@index([borrow_time])
@@map("borrow_record")
}
model User {
id Int @id @default(autoincrement())
username String @unique @db.VarChar(50)
password String @db.VarChar(255)
name String @db.VarChar(50)
email String? @db.VarChar(100)
phone String? @db.VarChar(20)
role String @default("user") @db.VarChar(20)
status String @default("active") @db.VarChar(20)
last_login_at DateTime? @db.DateTime
created_at DateTime @default(now())
updated_at DateTime @updatedAt
operation_logs OperationLog[]
site_configs SiteConfig[] @relation("SiteConfigUpdatedBy")
mount_histories MountHistory[]
// 报废记录关联
disposal_applied DisposalRecord[] @relation("DisposalApplier")
disposal_approved DisposalRecord[] @relation("DisposalApprover")
// 维修记录关联
maintenance_records MaintenanceRecord[]
@@index([role])
@@index([status])
@@map("user")
}
model SiteConfig {
id Int @id @default(autoincrement())
site_name String @db.VarChar(100)
logo_url String? @db.VarChar(255)
favicon_url String? @db.VarChar(255)
theme_color String? @db.VarChar(20)
updated_by Int?
created_at DateTime @default(now())
updated_at DateTime @default(now())
updatedBy User? @relation("SiteConfigUpdatedBy", fields: [updated_by], references: [id])
@@map("site_config")
}
model Person {
id Int @id @default(autoincrement())
nickname String @db.VarChar(50)
real_name String @db.VarChar(50)
id_number String? @unique @db.VarChar(50)
department String? @db.VarChar(100)
position String? @db.VarChar(100)
phone String? @db.VarChar(20)
email String? @db.VarChar(100)
status String @default("active") @db.VarChar(20)
remarks String? @db.Text
created_at DateTime @default(now())
updated_at DateTime @updatedAt
borrow_records BorrowRecord[]
@@index([nickname])
@@index([real_name])
@@index([status])
@@map("person")
}
model StorageLocation {
id Int @id @default(autoincrement())
name String @db.VarChar(100)
code String? @db.VarChar(50)
status String @default("active") @db.VarChar(20)
description String? @db.Text
created_at DateTime @default(now())
updated_at DateTime @updatedAt
equipments Equipment[]
@@index([status])
@@map("storage_location")
}
model OperationLog {
id Int @id @default(autoincrement())
user_id Int?
username String? @db.VarChar(50)
operation_type String @db.VarChar(50)
equipment_id Int?
equipment_code String? @db.VarChar(50)
operation_details String? @db.Text
ip_address String? @db.VarChar(50)
created_at DateTime @default(now())
user User? @relation(fields: [user_id], references: [id])
@@index([user_id])
@@index([operation_type])
@@index([created_at])
@@map("operation_log")
}
model MountHistory {
id Int @id @default(autoincrement())
child_id Int // 子资产ID
parent_id Int? // 父资产ID
operation_type String @db.VarChar(20) // mount/unmount/replace
operated_at DateTime @default(now())
operated_by Int // 操作人ID
notes String? @db.Text
old_parent_id Int? // 更换时的旧父资产ID
new_parent_id Int? // 更换时的新父资产ID
child Equipment @relation(fields: [child_id], references: [id])
operator User @relation(fields: [operated_by], references: [id])
@@index([child_id])
@@index([parent_id])
@@index([operation_type])
@@index([operated_at])
@@map("mount_history")
}
// 报废记录
model DisposalRecord {
id Int @id @default(autoincrement())
equipment_id Int
equipment_code String @db.VarChar(50)
disposal_reason String @db.Text // 报废原因
disposal_method String @db.VarChar(50) // 处置方式:报废/转让/捐赠
estimated_value Decimal @db.Decimal(12,2) // 残值估价
actual_value Decimal? @db.Decimal(12,2) // 实际处置价值
status String @default("pending") @db.VarChar(20) // pending/approved/rejected/completed
applied_by Int // 申请人
applied_at DateTime @default(now())
approved_by Int? // 审批人
approved_at DateTime?
completed_at DateTime? // 完成时间
notes String? @db.Text
created_at DateTime @default(now())
updated_at DateTime @updatedAt
equipment Equipment @relation(fields: [equipment_id], references: [id])
applier User @relation("DisposalApplier", fields: [applied_by], references: [id])
approver User? @relation("DisposalApprover", fields: [approved_by], references: [id])
@@index([equipment_id])
@@index([status])
@@map("disposal_record")
}
// 维修记录
model MaintenanceRecord {
id Int @id @default(autoincrement())
equipment_id Int
equipment_code String @db.VarChar(50)
issue_description String @db.Text // 故障描述
repair_vendor String? @db.VarChar(100) // 维修商
estimated_cost Decimal @db.Decimal(10,2) // 预估费用
actual_cost Decimal? @db.Decimal(10,2) // 实际费用
start_date DateTime @default(now()) // 送修日期
expected_end_date DateTime? // 预计完成日期
actual_end_date DateTime? // 实际完成日期
status String @default("in_progress") @db.VarChar(20) // in_progress/completed/cancelled
repair_result String? @db.Text // 维修结果
created_by Int
created_at DateTime @default(now())
updated_at DateTime @updatedAt
equipment Equipment @relation(fields: [equipment_id], references: [id])
creator User @relation(fields: [created_by], references: [id])
@@index([equipment_id])
@@index([status])
@@map("maintenance_record")
}