Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

数据库设计

数据库概述

本资产管理系统采用关系型数据库设计,基于PostgreSQL 13+构建,支持MySQL 8.0+和MariaDB 10.6+兼容。数据库设计遵循第三范式,确保数据一致性和完整性,支持高并发访问和复杂查询。

数据库关系图

1. 核心实体关系图

erDiagram
    Asset ||--o{ Image : "has many"
    Asset ||--o{ Video : "has many"
    Asset ||--o{ Attachment : "has many"
    Asset }o--|| Category : "belongs to"
    Asset }o--|| Organization : "belongs to"
    Asset }o--o{ Tag : "has many"
    
    Asset {
        int id PK
        string name
        string spec
        string model
        int value
        int depreciation
        string vendor
        datetime purchased_at
        int status
        string code
        string coords
        string address
        int organization_id FK
        int category_id FK
    }
    
    Category {
        int id PK
        string name
        string label
        string code
        int tid
    }
    
    Organization {
        int id PK
        string name
        int parent_id FK
    }
    
    Image {
        int id PK
        int asset_id FK
        string image
        string title
        int file_size
        int width
        int height
    }
    
    Video {
        int id PK
        int asset_id FK
        string video
        string title
        string video_format
        int duration
        int width
        int height
    }
    
    Attachment {
        int id PK
        int asset_id FK
        string attachment
        string title
        string file_type
        int file_size
    }
    
    Tag {
        int id PK
        string name
        string label
        string color
    }

2. 业务流程关系图

erDiagram
    Asset ||--o{ Lease : "has many"
    Asset ||--o{ Borrow : "has many"
    Asset ||--o{ Transfer : "has many"
    Asset ||--o{ MaintenanceApplication : "has many"
    Asset ||--o{ MaintenancePlan : "has many"
    Asset ||--o{ MaintenanceRecord : "has many"
    Asset ||--o{ DisposalApplication : "has many"
    
    Organization ||--o{ Transfer : "from/to"
    
    Asset {
        int id PK
        string name
        int status
        int organization_id FK
    }
    
    Lease {
        int id PK
        int asset_id FK
        string lessee_name
        string lessee_company
        datetime lease_start_date
        datetime lease_end_date
        int status
    }
    
    Borrow {
        int id PK
        int asset_id FK
        string borrower_name
        string borrower_department
        datetime borrow_start_date
        datetime borrow_end_date
        int status
    }
    
    Transfer {
        int id PK
        int asset_id FK
        int from_organization_id FK
        int to_organization_id FK
        text transfer_reason
        int status
    }
    
    MaintenanceApplication {
        int id PK
        int asset_id FK
        string applicant_name
        string maintenance_type
        int priority
        text description
        int status
    }
    
    MaintenancePlan {
        int id PK
        int asset_id FK
        string plan_name
        string plan_type
        string frequency
        datetime next_maintenance_date
        int status
    }
    
    MaintenanceRecord {
        int id PK
        int asset_id FK
        int maintenance_application_id FK
        int maintenance_plan_id FK
        datetime maintenance_date
        string maintenance_type
        text maintenance_result
    }
    
    DisposalApplication {
        int id PK
        int asset_id FK
        string application_number
        string applicant_name
        text disposal_reason
        string disposal_method
        int status
    }

3. 维护管理关系图

erDiagram
    MaintenanceApplication ||--o{ MaintenanceRecord : "generates"
    MaintenancePlan ||--o{ MaintenanceRecord : "generates"
    Asset ||--o{ MaintenanceApplication : "has many"
    Asset ||--o{ MaintenancePlan : "has many"
    Asset ||--o{ MaintenanceRecord : "has many"
    
    MaintenanceApplication {
        int id PK
        int asset_id FK
        string applicant_name
        string applicant_department
        string maintenance_type
        int priority
        text description
        datetime expected_date
        int maintenance_cost
        int status
    }
    
    MaintenancePlan {
        int id PK
        int asset_id FK
        string plan_name
        string plan_type
        string frequency
        datetime next_maintenance_date
        datetime last_maintenance_date
        text maintenance_items
        string responsible_person
        int status
    }
    
    MaintenanceRecord {
        int id PK
        int asset_id FK
        int maintenance_application_id FK
        int maintenance_plan_id FK
        datetime maintenance_date
        string maintenance_type
        string maintenance_person
        text maintenance_items
        text maintenance_result
        int maintenance_cost
    }

4. 采购管理关系图

erDiagram
    PurchaseContract ||--o{ PurchaseAcceptance : "has many"
    User ||--o{ PurchasePlan : "creates"
    User ||--o{ PurchaseContract : "creates"
    
    PurchasePlan {
        int id PK
        string plan_name
        int plan_year
        int plan_quarter
        int total_budget
        int used_budget
        int status
        int created_by FK
    }
    
    PurchaseContract {
        int id PK
        string contract_number
        string contract_name
        string supplier_name
        string supplier_contact
        int contract_amount
        datetime contract_date
        datetime delivery_date
        text payment_terms
        int status
        int created_by FK
    }
    
    PurchaseAcceptance {
        int id PK
        int contract_id FK
        string acceptance_number
        datetime acceptance_date
        string acceptance_person
        text acceptance_result
        int status
    }
    
    User {
        int id PK
        string username
        string email
        string first_name
        string last_name
    }

5. 处置管理关系图

erDiagram
    DisposalApplication ||--o{ DisposalAppraisal : "has many"
    Asset ||--o{ DisposalApplication : "has many"
    
    DisposalApplication {
        int id PK
        int asset_id FK
        string application_number
        string applicant_name
        string applicant_department
        text disposal_reason
        string disposal_method
        datetime disposal_date
        int disposal_value
        int status
    }
    
    DisposalAppraisal {
        int id PK
        int application_id FK
        string appraiser_name
        datetime appraisal_date
        int appraisal_value
        string appraisal_method
        text appraisal_result
        int status
    }

6. 用户权限关系图

erDiagram
    User ||--o{ UserRole : "has many"
    User ||--o{ AuditLog : "creates"
    Role ||--o{ UserRole : "assigned to"
    Role ||--o{ RolePermission : "has many"
    Permission ||--o{ RolePermission : "granted to"
    Organization ||--o{ User : "contains"
    
    User {
        int id PK
        string username
        string email
        string first_name
        string last_name
        string phone
        int organization_id FK
        boolean is_active
    }
    
    Role {
        int id PK
        string name
        string label
        text description
        boolean is_system
    }
    
    Permission {
        int id PK
        string name
        string label
        text description
        string resource
        string action
    }
    
    UserRole {
        int user_id FK
        int role_id FK
    }
    
    RolePermission {
        int role_id FK
        int permission_id FK
    }
    
    AuditLog {
        int id PK
        int user_id FK
        string entity_type
        int entity_id
        string action
        json old_values
        json new_values
    }

7. 组织架构关系图

erDiagram
    Organization ||--o{ Organization : "parent-child"
    Organization ||--o{ Asset : "owns"
    Organization ||--o{ User : "contains"
    Organization ||--o{ Transfer : "from/to"
    
    Organization {
        int id PK
        string name
        int parent_id FK
        datetime created_at
    }
    
    Asset {
        int id PK
        string name
        string code
        int status
        int organization_id FK
    }
    
    User {
        int id PK
        string username
        string email
        string first_name
        string last_name
        int organization_id FK
    }
    
    Transfer {
        int id PK
        int asset_id FK
        int from_organization_id FK
        int to_organization_id FK
        text transfer_reason
        int status
    }

核心表结构

1. 资产表 (asset)

CREATE TABLE asset (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL COMMENT '资产名称',
    spec VARCHAR(255) COMMENT '规格型号',
    model VARCHAR(255) COMMENT '型号',
    value INTEGER COMMENT '资产价值(分)',
    depreciation INTEGER COMMENT '累计折旧(分)',
    vendor VARCHAR(255) COMMENT '供应商',
    purchased_at TIMESTAMP COMMENT '采购日期',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    status SMALLINT DEFAULT 0 COMMENT '状态:0新增,10闲置,20在用,30报废,40维修',
    code VARCHAR(48) COMMENT '资产编码',
    coords VARCHAR(255) COMMENT '坐标信息',
    address VARCHAR(255) COMMENT '地址',
    cert VARCHAR(255) COMMENT '证书编号',
    url VARCHAR(255) COMMENT '相关链接',
    note TEXT COMMENT '备注',
    organization_id INTEGER NOT NULL COMMENT '所属组织ID',
    category_id INTEGER NOT NULL COMMENT '分类ID',
    INDEX idx_asset_organization (organization_id),
    INDEX idx_asset_category (category_id),
    INDEX idx_asset_status (status),
    INDEX idx_asset_code (code),
    INDEX idx_asset_created_at (created_at),
    FOREIGN KEY (organization_id) REFERENCES organization(id),
    FOREIGN KEY (category_id) REFERENCES category(id)
);

2. 分类表 (category)

CREATE TABLE category (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL COMMENT '分类名称',
    label VARCHAR(255) NOT NULL COMMENT '分类标签',
    code VARCHAR(6) UNIQUE NOT NULL COMMENT '分类编码',
    tid SMALLINT DEFAULT 1 COMMENT '类型ID:1有形资产,2无形资产',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_category_tid (tid),
    INDEX idx_category_code (code),
    CONSTRAINT chk_category_code CHECK (code ~ '^[A-Z]+$')
);

3. 组织表 (organization)

CREATE TABLE organization (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL COMMENT '组织名称',
    parent_id INTEGER COMMENT '父组织ID',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_organization_parent (parent_id),
    FOREIGN KEY (parent_id) REFERENCES organization(id)
);

4. 用户表 (user)

CREATE TABLE user (
    id SERIAL PRIMARY KEY,
    username VARCHAR(180) UNIQUE NOT NULL COMMENT '用户名',
    email VARCHAR(255) UNIQUE NOT NULL COMMENT '邮箱',
    password VARCHAR(255) NOT NULL COMMENT '密码哈希',
    first_name VARCHAR(255) COMMENT '名字',
    last_name VARCHAR(255) COMMENT '姓氏',
    phone VARCHAR(20) COMMENT '电话',
    organization_id INTEGER COMMENT '所属组织ID',
    is_active BOOLEAN DEFAULT TRUE COMMENT '是否激活',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    last_login_at TIMESTAMP COMMENT '最后登录时间',
    INDEX idx_user_organization (organization_id),
    INDEX idx_user_email (email),
    INDEX idx_user_active (is_active),
    FOREIGN KEY (organization_id) REFERENCES organization(id)
);

5. 标签表 (tag)

CREATE TABLE tag (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) UNIQUE NOT NULL COMMENT '标签名称',
    label VARCHAR(255) NOT NULL COMMENT '标签显示名称',
    color VARCHAR(7) DEFAULT '#007bff' COMMENT '标签颜色',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_tag_name (name)
);

多媒体表结构

6. 图片表 (image)

CREATE TABLE image (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    image VARCHAR(255) NOT NULL COMMENT '图片文件名',
    title VARCHAR(255) COMMENT '图片标题',
    description TEXT COMMENT '图片描述',
    file_size INTEGER COMMENT '文件大小(字节)',
    width INTEGER COMMENT '图片宽度',
    height INTEGER COMMENT '图片高度',
    mime_type VARCHAR(100) COMMENT 'MIME类型',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_image_asset (asset_id),
    INDEX idx_image_created_at (created_at),
    FOREIGN KEY (asset_id) REFERENCES asset(id) ON DELETE CASCADE
);

7. 视频表 (video)

CREATE TABLE video (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    video VARCHAR(255) NOT NULL COMMENT '视频文件名',
    title VARCHAR(255) COMMENT '视频标题',
    description TEXT COMMENT '视频描述',
    video_format VARCHAR(50) COMMENT '视频格式',
    file_size INTEGER COMMENT '文件大小(字节)',
    duration INTEGER COMMENT '视频时长(秒)',
    width INTEGER COMMENT '视频宽度',
    height INTEGER COMMENT '视频高度',
    thumbnail VARCHAR(255) COMMENT '缩略图文件名',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_video_asset (asset_id),
    INDEX idx_video_format (video_format),
    INDEX idx_video_created_at (created_at),
    FOREIGN KEY (asset_id) REFERENCES asset(id) ON DELETE CASCADE
);

8. 附件表 (attachment)

CREATE TABLE attachment (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    attachment VARCHAR(255) NOT NULL COMMENT '附件文件名',
    title VARCHAR(255) COMMENT '附件标题',
    description TEXT COMMENT '附件描述',
    file_type VARCHAR(100) COMMENT '文件类型',
    file_size INTEGER COMMENT '文件大小(字节)',
    mime_type VARCHAR(100) COMMENT 'MIME类型',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_attachment_asset (asset_id),
    INDEX idx_attachment_file_type (file_type),
    INDEX idx_attachment_created_at (created_at),
    FOREIGN KEY (asset_id) REFERENCES asset(id) ON DELETE CASCADE
);

业务流程表结构

9. 租赁表 (lease)

CREATE TABLE lease (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    lessee_name VARCHAR(255) NOT NULL COMMENT '承租人姓名',
    lessee_company VARCHAR(255) COMMENT '承租人公司',
    lessee_contact VARCHAR(255) COMMENT '联系人',
    lessee_phone VARCHAR(255) COMMENT '联系电话',
    lessee_email VARCHAR(255) COMMENT '联系邮箱',
    lessee_address VARCHAR(255) COMMENT '联系地址',
    lease_start_date TIMESTAMP NOT NULL COMMENT '租赁开始日期',
    lease_end_date TIMESTAMP NOT NULL COMMENT '租赁结束日期',
    actual_return_date TIMESTAMP COMMENT '实际归还日期',
    monthly_rent INTEGER COMMENT '月租金(分)',
    security_deposit INTEGER COMMENT '押金(分)',
    lease_terms TEXT COMMENT '租赁条款',
    purpose TEXT COMMENT '租赁用途',
    notes TEXT COMMENT '备注',
    location VARCHAR(255) COMMENT '租赁位置',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待审批,10已批准,20租赁中,30已到期,40已归还,50已取消',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_lease_asset (asset_id),
    INDEX idx_lease_status (status),
    INDEX idx_lease_dates (lease_start_date, lease_end_date),
    FOREIGN KEY (asset_id) REFERENCES asset(id)
);

10. 借用表 (borrow)

CREATE TABLE borrow (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    borrower_name VARCHAR(255) NOT NULL COMMENT '借用人姓名',
    borrower_department VARCHAR(255) COMMENT '借用人部门',
    borrower_contact VARCHAR(255) COMMENT '联系方式',
    borrow_start_date TIMESTAMP NOT NULL COMMENT '借用开始日期',
    borrow_end_date TIMESTAMP NOT NULL COMMENT '借用结束日期',
    actual_return_date TIMESTAMP COMMENT '实际归还日期',
    purpose TEXT COMMENT '借用用途',
    notes TEXT COMMENT '备注',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待审批,10已批准,20借用中,30已归还,40已取消',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_borrow_asset (asset_id),
    INDEX idx_borrow_status (status),
    INDEX idx_borrow_dates (borrow_start_date, borrow_end_date),
    FOREIGN KEY (asset_id) REFERENCES asset(id)
);

11. 调拨表 (transfer)

CREATE TABLE transfer (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    from_organization_id INTEGER COMMENT '调出组织ID',
    to_organization_id INTEGER NOT NULL COMMENT '调入组织ID',
    transfer_reason TEXT COMMENT '调拨原因',
    transfer_date TIMESTAMP NOT NULL COMMENT '调拨日期',
    actual_transfer_date TIMESTAMP COMMENT '实际调拨日期',
    notes TEXT COMMENT '备注',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待审批,10已批准,20调拨中,30已完成,40已取消',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_transfer_asset (asset_id),
    INDEX idx_transfer_from_org (from_organization_id),
    INDEX idx_transfer_to_org (to_organization_id),
    INDEX idx_transfer_status (status),
    FOREIGN KEY (asset_id) REFERENCES asset(id),
    FOREIGN KEY (from_organization_id) REFERENCES organization(id),
    FOREIGN KEY (to_organization_id) REFERENCES organization(id)
);

维护管理表结构

12. 维护申请表 (maintenance_application)

CREATE TABLE maintenance_application (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    applicant_name VARCHAR(255) NOT NULL COMMENT '申请人姓名',
    applicant_department VARCHAR(255) COMMENT '申请人部门',
    applicant_contact VARCHAR(255) COMMENT '联系方式',
    maintenance_type VARCHAR(100) COMMENT '维护类型',
    priority SMALLINT DEFAULT 1 COMMENT '优先级:1低,2中,3高,4紧急',
    description TEXT NOT NULL COMMENT '问题描述',
    expected_date TIMESTAMP COMMENT '期望维护日期',
    actual_date TIMESTAMP COMMENT '实际维护日期',
    maintenance_cost INTEGER COMMENT '维护费用(分)',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待审批,10已批准,20进行中,30已完成,40已取消',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_maintenance_asset (asset_id),
    INDEX idx_maintenance_status (status),
    INDEX idx_maintenance_priority (priority),
    FOREIGN KEY (asset_id) REFERENCES asset(id)
);

13. 维护计划表 (maintenance_plan)

CREATE TABLE maintenance_plan (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    plan_name VARCHAR(255) NOT NULL COMMENT '计划名称',
    plan_type VARCHAR(100) COMMENT '计划类型',
    frequency VARCHAR(50) COMMENT '维护频率',
    next_maintenance_date TIMESTAMP COMMENT '下次维护日期',
    last_maintenance_date TIMESTAMP COMMENT '上次维护日期',
    maintenance_items TEXT COMMENT '维护项目',
    responsible_person VARCHAR(255) COMMENT '负责人',
    status SMALLINT DEFAULT 1 COMMENT '状态:0停用,1启用',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_plan_asset (asset_id),
    INDEX idx_plan_status (status),
    INDEX idx_plan_next_date (next_maintenance_date),
    FOREIGN KEY (asset_id) REFERENCES asset(id)
);

14. 维护记录表 (maintenance_record)

CREATE TABLE maintenance_record (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    maintenance_application_id INTEGER COMMENT '维护申请ID',
    maintenance_plan_id INTEGER COMMENT '维护计划ID',
    maintenance_date TIMESTAMP NOT NULL COMMENT '维护日期',
    maintenance_type VARCHAR(100) COMMENT '维护类型',
    maintenance_person VARCHAR(255) COMMENT '维护人员',
    maintenance_items TEXT COMMENT '维护项目',
    maintenance_result TEXT COMMENT '维护结果',
    maintenance_cost INTEGER COMMENT '维护费用(分)',
    notes TEXT COMMENT '备注',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_record_asset (asset_id),
    INDEX idx_record_application (maintenance_application_id),
    INDEX idx_record_plan (maintenance_plan_id),
    INDEX idx_record_date (maintenance_date),
    FOREIGN KEY (asset_id) REFERENCES asset(id),
    FOREIGN KEY (maintenance_application_id) REFERENCES maintenance_application(id),
    FOREIGN KEY (maintenance_plan_id) REFERENCES maintenance_plan(id)
);

采购管理表结构

15. 采购计划表 (purchase_plan)

CREATE TABLE purchase_plan (
    id SERIAL PRIMARY KEY,
    plan_name VARCHAR(255) NOT NULL COMMENT '计划名称',
    plan_year INTEGER NOT NULL COMMENT '计划年度',
    plan_quarter INTEGER COMMENT '计划季度',
    total_budget INTEGER COMMENT '总预算(分)',
    used_budget INTEGER DEFAULT 0 COMMENT '已用预算(分)',
    status SMALLINT DEFAULT 0 COMMENT '状态:0草稿,1待审批,2已批准,3执行中,4已完成',
    created_by INTEGER COMMENT '创建人ID',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_plan_year (plan_year),
    INDEX idx_plan_status (status),
    INDEX idx_plan_created_by (created_by),
    FOREIGN KEY (created_by) REFERENCES user(id)
);

16. 采购合同表 (purchase_contract)

CREATE TABLE purchase_contract (
    id SERIAL PRIMARY KEY,
    contract_number VARCHAR(255) UNIQUE NOT NULL COMMENT '合同编号',
    contract_name VARCHAR(255) NOT NULL COMMENT '合同名称',
    supplier_name VARCHAR(255) NOT NULL COMMENT '供应商名称',
    supplier_contact VARCHAR(255) COMMENT '供应商联系方式',
    contract_amount INTEGER NOT NULL COMMENT '合同金额(分)',
    contract_date TIMESTAMP NOT NULL COMMENT '合同日期',
    delivery_date TIMESTAMP COMMENT '交付日期',
    payment_terms TEXT COMMENT '付款条款',
    contract_terms TEXT COMMENT '合同条款',
    status SMALLINT DEFAULT 0 COMMENT '状态:0草稿,1待审批,2已批准,3执行中,4已完成,5已取消',
    created_by INTEGER COMMENT '创建人ID',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_contract_number (contract_number),
    INDEX idx_contract_status (status),
    INDEX idx_contract_supplier (supplier_name),
    INDEX idx_contract_date (contract_date),
    FOREIGN KEY (created_by) REFERENCES user(id)
);

17. 采购验收表 (purchase_acceptance)

CREATE TABLE purchase_acceptance (
    id SERIAL PRIMARY KEY,
    contract_id INTEGER NOT NULL COMMENT '合同ID',
    acceptance_number VARCHAR(255) UNIQUE NOT NULL COMMENT '验收编号',
    acceptance_date TIMESTAMP NOT NULL COMMENT '验收日期',
    acceptance_person VARCHAR(255) COMMENT '验收人员',
    acceptance_result TEXT COMMENT '验收结果',
    acceptance_notes TEXT COMMENT '验收备注',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待验收,1验收通过,2验收不通过',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_acceptance_contract (contract_id),
    INDEX idx_acceptance_status (status),
    INDEX idx_acceptance_date (acceptance_date),
    FOREIGN KEY (contract_id) REFERENCES purchase_contract(id)
);

处置管理表结构

18. 处置申请表 (disposal_application)

CREATE TABLE disposal_application (
    id SERIAL PRIMARY KEY,
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    application_number VARCHAR(255) UNIQUE NOT NULL COMMENT '申请编号',
    applicant_name VARCHAR(255) NOT NULL COMMENT '申请人姓名',
    applicant_department VARCHAR(255) COMMENT '申请人部门',
    applicant_contact VARCHAR(255) COMMENT '联系方式',
    disposal_reason TEXT NOT NULL COMMENT '处置原因',
    disposal_method VARCHAR(100) COMMENT '处置方式',
    disposal_date TIMESTAMP COMMENT '处置日期',
    disposal_value INTEGER COMMENT '处置价值(分)',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待审批,10已批准,20处置中,30已完成,40已取消',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_disposal_asset (asset_id),
    INDEX idx_disposal_status (status),
    INDEX idx_disposal_date (disposal_date),
    FOREIGN KEY (asset_id) REFERENCES asset(id)
);

19. 处置评估表 (disposal_appraisal)

CREATE TABLE disposal_appraisal (
    id SERIAL PRIMARY KEY,
    application_id INTEGER NOT NULL COMMENT '申请ID',
    appraiser_name VARCHAR(255) NOT NULL COMMENT '评估人姓名',
    appraisal_date TIMESTAMP NOT NULL COMMENT '评估日期',
    appraisal_value INTEGER COMMENT '评估价值(分)',
    appraisal_method VARCHAR(100) COMMENT '评估方法',
    appraisal_result TEXT COMMENT '评估结果',
    appraisal_notes TEXT COMMENT '评估备注',
    status SMALLINT DEFAULT 0 COMMENT '状态:0待评估,1评估完成,2评估不通过',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_appraisal_application (application_id),
    INDEX idx_appraisal_status (status),
    INDEX idx_appraisal_date (appraisal_date),
    FOREIGN KEY (application_id) REFERENCES disposal_application(id)
);

关联表结构

20. 资产标签关联表 (asset_tag)

CREATE TABLE asset_tag (
    asset_id INTEGER NOT NULL COMMENT '资产ID',
    tag_id INTEGER NOT NULL COMMENT '标签ID',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (asset_id, tag_id),
    INDEX idx_asset_tag_asset (asset_id),
    INDEX idx_asset_tag_tag (tag_id),
    FOREIGN KEY (asset_id) REFERENCES asset(id) ON DELETE CASCADE,
    FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE
);

系统管理表结构

21. 角色表 (role)

CREATE TABLE role (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) UNIQUE NOT NULL COMMENT '角色名称',
    label VARCHAR(255) NOT NULL COMMENT '角色显示名称',
    description TEXT COMMENT '角色描述',
    is_system BOOLEAN DEFAULT FALSE COMMENT '是否系统角色',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_role_name (name),
    INDEX idx_role_system (is_system)
);

22. 权限表 (permission)

CREATE TABLE permission (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) UNIQUE NOT NULL COMMENT '权限名称',
    label VARCHAR(255) NOT NULL COMMENT '权限显示名称',
    description TEXT COMMENT '权限描述',
    resource VARCHAR(255) COMMENT '资源名称',
    action VARCHAR(255) COMMENT '操作名称',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_permission_name (name),
    INDEX idx_permission_resource (resource)
);

23. 用户角色关联表 (user_role)

CREATE TABLE user_role (
    user_id INTEGER NOT NULL COMMENT '用户ID',
    role_id INTEGER NOT NULL COMMENT '角色ID',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (user_id, role_id),
    INDEX idx_user_role_user (user_id),
    INDEX idx_user_role_role (role_id),
    FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE
);

24. 角色权限关联表 (role_permission)

CREATE TABLE role_permission (
    role_id INTEGER NOT NULL COMMENT '角色ID',
    permission_id INTEGER NOT NULL COMMENT '权限ID',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (role_id, permission_id),
    INDEX idx_role_permission_role (role_id),
    INDEX idx_role_permission_permission (permission_id),
    FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permission(id) ON DELETE CASCADE
);

审计日志表结构

25. 审计日志表 (audit_log)

CREATE TABLE audit_log (
    id SERIAL PRIMARY KEY,
    user_id INTEGER COMMENT '用户ID',
    entity_type VARCHAR(255) NOT NULL COMMENT '实体类型',
    entity_id INTEGER NOT NULL COMMENT '实体ID',
    action VARCHAR(50) NOT NULL COMMENT '操作类型',
    old_values JSON COMMENT '旧值',
    new_values JSON COMMENT '新值',
    ip_address VARCHAR(45) COMMENT 'IP地址',
    user_agent TEXT COMMENT '用户代理',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_audit_user (user_id),
    INDEX idx_audit_entity (entity_type, entity_id),
    INDEX idx_audit_action (action),
    INDEX idx_audit_created_at (created_at),
    FOREIGN KEY (user_id) REFERENCES user(id)
);

数据库索引策略

主要索引

  • 主键索引: 所有表的主键自动创建
  • 外键索引: 所有外键字段创建索引
  • 状态索引: 业务状态字段创建索引
  • 时间索引: 创建时间、更新时间字段创建索引
  • 业务索引: 编码、名称等业务字段创建索引

复合索引

  • 查询优化: 根据常用查询组合创建复合索引
  • 排序优化: 支持排序的字段组合创建索引
  • 过滤优化: 多条件查询的字段组合创建索引

数据完整性约束

外键约束

  • 级联删除: 子表记录随父表删除
  • 级联更新: 父表主键更新时子表同步更新
  • 限制删除: 有子表记录时禁止删除父表记录

检查约束

  • 数据范围: 数值字段的范围检查
  • 格式验证: 字符串字段的格式检查
  • 枚举值: 状态字段的枚举值检查

唯一约束

  • 业务唯一: 编码、名称等业务字段唯一性
  • 系统唯一: 用户名、邮箱等系统字段唯一性

总结

本数据库设计采用关系型数据库设计原则,通过合理的表结构设计、索引策略、约束机制,确保了数据的一致性、完整性和查询性能。支持资产全生命周期管理、多媒体档案管理、业务流程管理等核心功能,为系统的高效运行提供了坚实的数据基础。