-- ============================= -- 泰豪电源AI数智化平台 - 完整数据库初始化脚本 -- 包含所有业务模块的表结构 -- ============================= -- 安装必要的扩展 CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID生成 CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 全文搜索 CREATE EXTENSION IF NOT EXISTS "btree_gin"; -- GIN索引支持 -- CREATE EXTENSION IF NOT EXISTS "vector"; -- pgvector向量检索(需要单独安装) -- ============================= -- 1. 系统基础模块(权限、用户、部门、角色) -- ============================= \i createTablePermission.sql \i createTableUser.sql -- ============================= -- 2. 文件管理模块 -- ============================= \i createTableFile.sql -- ============================= -- 3. 消息通知模块 -- ============================= \i createTableMessage.sql -- ============================= -- 4. 日志模块 -- ============================= \i createTableLog.sql -- ============================= -- 5. 配置管理模块 -- ============================= \i createTableConfig.sql -- ============================= -- 6. 知识库管理模块 -- ============================= \i createTableKnowledge.sql -- ============================= -- 7. 招投标智能体业务模块 -- ============================= \i createTableBidding.sql -- ============================= -- 8. 智能客服系统业务模块 -- ============================= \i createTableCustomerService.sql -- ============================= -- 9. 智能体管理和平台基础设施模块 -- ============================= \i createTableAgent.sql -- ============================= -- 创建通用触发器函数 -- ============================= -- 自动更新update_time的触发器函数 CREATE OR REPLACE FUNCTION public.update_modified_column() RETURNS TRIGGER AS $$ BEGIN NEW.update_time = now(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- 为所有表添加update_time触发器的辅助函数 CREATE OR REPLACE FUNCTION public.create_update_triggers() RETURNS void AS $$ DECLARE r RECORD; BEGIN FOR r IN SELECT schemaname, tablename FROM pg_tables WHERE schemaname IN ('sys', 'file', 'message', 'log', 'config', 'knowledge', 'bidding', 'customer_service', 'agent') AND tablename LIKE 'tb_%' LOOP -- 检查表是否有update_time列 IF EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema = r.schemaname AND table_name = r.tablename AND column_name = 'update_time' ) THEN -- 删除已存在的触发器 EXECUTE format('DROP TRIGGER IF EXISTS trg_%s_update_time ON %I.%I', r.tablename, r.schemaname, r.tablename); -- 创建新触发器 EXECUTE format('CREATE TRIGGER trg_%s_update_time BEFORE UPDATE ON %I.%I FOR EACH ROW EXECUTE FUNCTION public.update_modified_column()', r.tablename, r.schemaname, r.tablename); RAISE NOTICE 'Created trigger for %.%', r.schemaname, r.tablename; END IF; END LOOP; END; $$ LANGUAGE plpgsql; -- 执行触发器创建 SELECT public.create_update_triggers(); -- ============================= -- 创建视图 -- ============================= -- 用户完整信息视图 CREATE OR REPLACE VIEW sys.v_user_full_info AS SELECT u.user_id, u.email, u.phone, u.wechat_id, u.status, ui.avatar, ui.full_name, ui.gender, ui.level, u.create_time, u.update_time FROM sys.tb_sys_user u LEFT JOIN sys.tb_sys_user_info ui ON u.user_id = ui.user_id WHERE u.deleted = false AND (ui.deleted = false OR ui.deleted IS NULL); -- 用户角色权限视图 CREATE OR REPLACE VIEW sys.v_user_role_permission AS SELECT DISTINCT ur.user_id, r.role_id, r.name AS role_name, p.permission_id, p.code AS permission_code, p.name AS permission_name, m.module_id, m.name AS module_name FROM sys.tb_sys_user_role ur JOIN sys.tb_sys_role r ON ur.role_id = r.role_id JOIN sys.tb_sys_role_permission rp ON r.role_id = rp.role_id JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id LEFT JOIN sys.tb_sys_module m ON p.module_id = m.module_id WHERE ur.deleted = false AND r.deleted = false AND rp.deleted = false AND p.deleted = false; -- 智能体使用统计视图 CREATE OR REPLACE VIEW agent.v_agent_usage_stats AS SELECT a.agent_id, a.agent_name, a.agent_type, COUNT(DISTINCT s.session_id) AS total_sessions, COUNT(DISTINCT s.user_id) AS unique_users, SUM(s.message_count) AS total_messages, AVG(s.token_usage) AS avg_token_usage, AVG(r.rating) AS avg_rating, COUNT(r.rating_id) AS rating_count, MAX(s.start_time) AS last_used_time FROM agent.tb_agent a LEFT JOIN agent.tb_agent_session s ON a.agent_id = s.agent_id AND s.deleted = false LEFT JOIN agent.tb_agent_rating r ON a.agent_id = r.agent_id AND r.deleted = false WHERE a.deleted = false GROUP BY a.agent_id, a.agent_name, a.agent_type; -- 客服工单统计视图 CREATE OR REPLACE VIEW customer_service.v_ticket_stats AS SELECT t.ticket_status, t.priority, t.ticket_type, COUNT(*) AS ticket_count, AVG(EXTRACT(EPOCH FROM (t.resolution_time - t.create_time))/3600) AS avg_resolution_hours, AVG(t.customer_rating) AS avg_rating, COUNT(CASE WHEN t.is_overdue THEN 1 END) AS overdue_count FROM customer_service.tb_ticket t WHERE t.deleted = false GROUP BY t.ticket_status, t.priority, t.ticket_type; -- 招投标项目统计视图 CREATE OR REPLACE VIEW bidding.v_project_stats AS SELECT p.project_status, p.project_type, COUNT(*) AS project_count, SUM(p.budget_amount) AS total_budget, SUM(CASE WHEN p.winning_status = 'won' THEN 1 ELSE 0 END) AS won_count, SUM(CASE WHEN p.winning_status = 'won' THEN p.winning_amount ELSE 0 END) AS total_won_amount, AVG(CASE WHEN p.winning_status = 'won' THEN p.winning_amount / NULLIF(p.budget_amount, 0) ELSE NULL END) AS avg_win_rate FROM bidding.tb_bidding_project p WHERE p.deleted = false GROUP BY p.project_status, p.project_type; COMMENT ON VIEW sys.v_user_full_info IS '用户完整信息视图'; COMMENT ON VIEW sys.v_user_role_permission IS '用户角色权限视图'; COMMENT ON VIEW agent.v_agent_usage_stats IS '智能体使用统计视图'; COMMENT ON VIEW customer_service.v_ticket_stats IS '客服工单统计视图'; COMMENT ON VIEW bidding.v_project_stats IS '招投标项目统计视图'; -- ============================= -- 数据库初始化完成 -- =============================