-- PMFlow 完整数据库 Schema -- 适用于 PostgreSQL,可作为独立初始化脚本或参考 -- 注意:若与现有库(UUID 主键等)并存,需调整表名或迁移策略 -- 1. 用户与租户核心表 CREATE TABLE IF NOT EXISTS tenants ( id BIGSERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, domain VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS users ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, username VARCHAR(100) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL, avatar_url VARCHAR(500), bio TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id) ); -- 2. 人员能力图谱核心表(AI智能分配核心) CREATE TABLE IF NOT EXISTS skill_tags ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, name VARCHAR(255) NOT NULL, category VARCHAR(100) NOT NULL, is_system BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), UNIQUE(tenant_id, name) ); CREATE TABLE IF NOT EXISTS user_skill_bindings ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, user_id BIGINT NOT NULL, skill_tag_id BIGINT NOT NULL, proficiency_level VARCHAR(50) NOT NULL, last_used_at TIMESTAMP, quality_score DECIMAL(3,1) NOT NULL DEFAULT 0.0, efficiency_score DECIMAL(3,1) NOT NULL DEFAULT 0.0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (skill_tag_id) REFERENCES skill_tags(id), UNIQUE(tenant_id, user_id, skill_tag_id) ); CREATE TABLE IF NOT EXISTS user_workloads ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, user_id BIGINT NOT NULL, current_assigned_hours DECIMAL(5,2) NOT NULL DEFAULT 0.0, max_available_hours_per_week DECIMAL(5,2) NOT NULL DEFAULT 40.0, workload_ratio DECIMAL(4,2) NOT NULL DEFAULT 0.0, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (user_id) REFERENCES users(id), UNIQUE(tenant_id, user_id) ); -- 3. SSTC 唯一事实链路核心表(系统地基) CREATE TABLE IF NOT EXISTS truth_nodes ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, node_type VARCHAR(50) NOT NULL, parent_id BIGINT, project_id BIGINT, created_by BIGINT NOT NULL, title VARCHAR(500) NOT NULL, content JSONB NOT NULL, version INT NOT NULL DEFAULT 1, status VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (parent_id) REFERENCES truth_nodes(id), FOREIGN KEY (created_by) REFERENCES users(id) ); -- 4. 项目与任务表 CREATE TABLE IF NOT EXISTS projects ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, name VARCHAR(255) NOT NULL, description TEXT, owner_id BIGINT NOT NULL, status VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (owner_id) REFERENCES users(id) ); -- project_id 在 truth_nodes 中暂不加 FK,因 projects 后创建 CREATE TABLE IF NOT EXISTS tasks ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, truth_node_id BIGINT NOT NULL, project_id BIGINT NOT NULL, assignee_id BIGINT, ai_recommended_assignees JSONB, title VARCHAR(500) NOT NULL, description TEXT, required_skill_tag_ids BIGINT[] NOT NULL, status VARCHAR(50) NOT NULL, priority VARCHAR(50) NOT NULL, estimated_hours DECIMAL(5,2), actual_hours DECIMAL(5,2), quality_score DECIMAL(3,1), due_date TIMESTAMP, completed_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (truth_node_id) REFERENCES truth_nodes(id), FOREIGN KEY (project_id) REFERENCES projects(id), FOREIGN KEY (assignee_id) REFERENCES users(id) ); -- 5. 认知对齐核心表 CREATE TABLE IF NOT EXISTS alignment_records ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, truth_node_id BIGINT NOT NULL, user_id BIGINT NOT NULL, alignment_score INT NOT NULL DEFAULT 0, is_confirmed BOOLEAN NOT NULL DEFAULT FALSE, comments TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (truth_node_id) REFERENCES truth_nodes(id), FOREIGN KEY (user_id) REFERENCES users(id) ); CREATE TABLE IF NOT EXISTS cognitive_conflicts ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, truth_node_id BIGINT NOT NULL, conflict_type VARCHAR(100) NOT NULL, description TEXT NOT NULL, involved_user_ids BIGINT[] NOT NULL, status VARCHAR(50) NOT NULL, resolved_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (truth_node_id) REFERENCES truth_nodes(id) ); -- 6. AI开发专属表 CREATE TABLE IF NOT EXISTS model_versions ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, name VARCHAR(255) NOT NULL, provider VARCHAR(100) NOT NULL, version VARCHAR(100) NOT NULL, capability_boundaries JSONB NOT NULL, cost_per_1k_tokens DECIMAL(10,6), is_active BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id) ); CREATE TABLE IF NOT EXISTS model_requirement_bindings ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, truth_node_id BIGINT NOT NULL, model_version_id BIGINT NOT NULL, estimated_cost DECIMAL(10,2), compatibility_score INT NOT NULL, risk_notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (truth_node_id) REFERENCES truth_nodes(id), FOREIGN KEY (model_version_id) REFERENCES model_versions(id) ); -- 7. 集成与日志表 CREATE TABLE IF NOT EXISTS integrations ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, type VARCHAR(100) NOT NULL, config JSONB NOT NULL, is_active BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id) ); CREATE TABLE IF NOT EXISTS ai_call_logs ( id BIGSERIAL PRIMARY KEY, tenant_id BIGINT NOT NULL DEFAULT 1, user_id BIGINT, function_name VARCHAR(255) NOT NULL, prompt TEXT NOT NULL, response TEXT, tokens_used INT, cost DECIMAL(10,6), status VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tenant_id) REFERENCES tenants(id), FOREIGN KEY (user_id) REFERENCES users(id) );