Files
2026-04-19 14:05:40 +08:00

236 lines
7.9 KiB
SQL

-- 科技成果转化系统 数据库设计 (PostgreSQL) - 完整版
-- 1. 部门表
CREATE TABLE IF NOT EXISTS departments (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 2. 用户表
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL, -- 手机号
password_hash VARCHAR(255) NOT NULL,
role VARCHAR(20) NOT NULL CHECK (role IN ('super_admin', 'admin', 'user', 'maintainer', 'senior_user', 'intermediate_user')),
real_name VARCHAR(100),
department VARCHAR(100), -- 所属部门名称
dept_status VARCHAR(20) DEFAULT 'verified', -- 部门审核状态
token_version INTEGER DEFAULT 0, -- Token 版本号 (用于单点登录)
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 3. 成果基础信息表 (所有类型共用)
CREATE TABLE IF NOT EXISTS achievements (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
type VARCHAR(50) NOT NULL, -- 'paper', 'project', 'award', 'standard', 'monograph', 'report', 'plan', 'patent', 'transformation', 'software'
name TEXT NOT NULL, -- 成果名称
main_contributors TEXT, -- 主要完成人 (字符串格式,兼容旧数据)
all_contributors TEXT, -- 完成人 (字符串格式,兼容旧数据)
contributor_phones TEXT, -- 完成人手机号 (字符串格式)
contributors JSONB DEFAULT '[]', -- 结构化完成人列表 [{name, phone, isMain}]
assigned_departments TEXT[] DEFAULT '{}', -- 归属部门数组 (自动计算)
achievement_date DATE, -- 时间
remarks TEXT, -- 备注
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected')),
audit_comment TEXT, -- 审核意见
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 4. 论文详情表
CREATE TABLE IF NOT EXISTS achievement_paper (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
paper_type TEXT,
first_unit TEXT,
journal_name TEXT,
publish_date DATE,
doi VARCHAR(100)
);
-- 5. 项目详情表
CREATE TABLE IF NOT EXISTS achievement_project (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
project_category TEXT,
source TEXT
);
-- 6. 奖励详情表
CREATE TABLE IF NOT EXISTS achievement_award (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
award_type TEXT,
award_level TEXT,
award_unit TEXT
);
-- 7. 标准详情表
CREATE TABLE IF NOT EXISTS achievement_standard (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
standard_type TEXT,
standard_no VARCHAR(100) NOT NULL,
implement_date DATE
);
-- 8. 专著详情表
CREATE TABLE IF NOT EXISTS achievement_monograph (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
publisher TEXT,
isbn VARCHAR(50)
);
-- 9. 技术报告详情表
CREATE TABLE IF NOT EXISTS achievement_report (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
report_type TEXT,
recipient TEXT,
approver_id INTEGER REFERENCES users(id), -- 签批院领导ID
approver_name VARCHAR(100) -- 签批院领导姓名 (冗余存储,方便显示)
);
-- 10. 规划详情表
CREATE TABLE IF NOT EXISTS achievement_plan (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE
);
-- 11. 专利详情表
CREATE TABLE IF NOT EXISTS achievement_patent (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
patent_no VARCHAR(100),
patent_type TEXT,
assignee TEXT
);
-- 12. 成果转化详情表
CREATE TABLE IF NOT EXISTS achievement_transformation (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
trans_method TEXT,
trans_amount NUMERIC(15, 2),
project_category TEXT
);
-- 13. 软著详情表
CREATE TABLE IF NOT EXISTS achievement_software (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
reg_no VARCHAR(100),
acquisition_method TEXT,
scope TEXT,
owner_unit TEXT
);
-- 14. 附件表
CREATE TABLE IF NOT EXISTS achievement_attachments (
id SERIAL PRIMARY KEY,
achievement_id INTEGER REFERENCES achievements(id) ON DELETE CASCADE,
file_name TEXT NOT NULL,
file_path TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 15. 字典表 (由超级管理员管理)
-- 单位名称表
CREATE TABLE IF NOT EXISTS dict_organizations (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 奖励种类表
CREATE TABLE IF NOT EXISTS dict_award_types (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 奖励等级表
CREATE TABLE IF NOT EXISTS dict_award_levels (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 论文种类表
CREATE TABLE IF NOT EXISTS dict_paper_types (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 标准种类表
CREATE TABLE IF NOT EXISTS dict_standard_types (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 项目分类表
CREATE TABLE IF NOT EXISTS dict_project_categories (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 领导层部门表 (用于筛选签批领导)
CREATE TABLE IF NOT EXISTS dict_leader_departments (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 16. 审计日志表
CREATE TABLE IF NOT EXISTS audit_logs (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
username VARCHAR(50),
real_name VARCHAR(50),
ip_address VARCHAR(50),
method VARCHAR(10),
url TEXT,
description VARCHAR(255),
status INTEGER,
duration INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 17. 系统公告表
CREATE TABLE IF NOT EXISTS notifications (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
publisher_id INTEGER REFERENCES users(id),
publisher_name VARCHAR(100),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
is_top BOOLEAN DEFAULT FALSE,
status VARCHAR(20) DEFAULT 'published' -- published, draft, archived
);
-- 18. 系统公告附件表
CREATE TABLE IF NOT EXISTS notification_attachments (
id SERIAL PRIMARY KEY,
notification_id INTEGER REFERENCES notifications(id) ON DELETE CASCADE,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 索引优化
CREATE INDEX IF NOT EXISTS idx_achievements_user ON achievements(user_id);
CREATE INDEX IF NOT EXISTS idx_achievements_type ON achievements(type);
CREATE INDEX IF NOT EXISTS idx_achievements_status ON achievements(status);
CREATE INDEX IF NOT EXISTS idx_achievements_assigned_depts ON achievements USING GIN (assigned_departments);
CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON audit_logs(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_audit_logs_username ON audit_logs(username);
CREATE INDEX IF NOT EXISTS idx_notifications_created_at ON notifications(created_at DESC);