-- ============================= -- 招投标智能体业务模块 -- 支持:招标文件管理、投标文件生成、评分分析、流程跟踪 -- ============================= CREATE SCHEMA IF NOT EXISTS bidding; -- 招标项目表 DROP TABLE IF EXISTS bidding.tb_bidding_project CASCADE; CREATE TABLE bidding.tb_bidding_project ( optsn VARCHAR(50) NOT NULL, -- 流水号 project_id VARCHAR(50) NOT NULL, -- 项目ID project_no VARCHAR(100) NOT NULL, -- 项目编号 project_name VARCHAR(500) NOT NULL, -- 项目名称 project_type VARCHAR(50) NOT NULL, -- 项目类型:public-公开招标/invitation-邀请招标/competitive_negotiation-竞争性谈判 industry VARCHAR(100), -- 所属行业 source_platform VARCHAR(100), -- 来源平台(如:政府采购网、企业官网等) source_url VARCHAR(500), -- 来源URL publish_date timestamptz, -- 发布日期 deadline timestamptz, -- 投标截止日期 opening_date timestamptz, -- 开标日期 budget_amount DECIMAL(18,2), -- 预算金额 currency VARCHAR(10) DEFAULT 'CNY', -- 货币单位 project_status VARCHAR(30) NOT NULL DEFAULT 'collecting', -- 项目状态:collecting-收集中/analyzing-分析中/preparing-准备投标/submitted-已提交/opened-已开标/won-中标/lost-未中标/abandoned-放弃 winning_status VARCHAR(30), -- 中标状态:pending-待定/won-中标/lost-未中标 winning_amount DECIMAL(18,2), -- 中标金额 client_name VARCHAR(255), -- 客户名称 client_contact VARCHAR(100), -- 客户联系方式 contact_person VARCHAR(100), -- 联系人 project_location VARCHAR(500), -- 项目地点 description TEXT, -- 项目描述 keywords TEXT[], -- 关键词数组 metadata JSONB DEFAULT NULL, -- 项目元数据 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 responsible_user VARCHAR(50), -- 负责人 team_members VARCHAR(50)[], -- 团队成员数组 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (project_id), UNIQUE (optsn), UNIQUE (project_no) ); CREATE INDEX idx_project_status ON bidding.tb_bidding_project(project_status) WHERE deleted = false; CREATE INDEX idx_project_deadline ON bidding.tb_bidding_project(deadline) WHERE deleted = false; CREATE INDEX idx_project_dept ON bidding.tb_bidding_project(dept_path) WHERE deleted = false; CREATE INDEX idx_project_responsible ON bidding.tb_bidding_project(responsible_user) WHERE deleted = false; COMMENT ON TABLE bidding.tb_bidding_project IS '招标项目表'; COMMENT ON COLUMN bidding.tb_bidding_project.project_status IS '项目状态:collecting/analyzing/preparing/submitted/opened/won/lost/abandoned'; -- 招标文件表 DROP TABLE IF EXISTS bidding.tb_bidding_document CASCADE; CREATE TABLE bidding.tb_bidding_document ( optsn VARCHAR(50) NOT NULL, -- 流水号 doc_id VARCHAR(50) NOT NULL, -- 文档ID project_id VARCHAR(50) NOT NULL, -- 所属项目ID doc_type VARCHAR(50) NOT NULL, -- 文档类型:tender-招标文件/technical-技术标/commercial-商务标/clarification-澄清文件/other-其他 doc_name VARCHAR(500) NOT NULL, -- 文档名称 file_id VARCHAR(50), -- 关联文件表ID file_path VARCHAR(500), -- 文件路径 file_size BIGINT, -- 文件大小 mime_type VARCHAR(100), -- MIME类型 version VARCHAR(20) DEFAULT '1.0', -- 版本号 language VARCHAR(20) DEFAULT 'zh-CN', -- 语言 page_count INTEGER, -- 页数 parse_status VARCHAR(30) DEFAULT 'pending', -- 解析状态:pending-待解析/parsing-解析中/completed-已完成/failed-失败 parse_result JSONB, -- 解析结果(JSON格式:提取的要素、表格、图纸等) extraction_data JSONB, -- 提取的结构化数据 ai_analysis TEXT, -- AI分析结果 upload_date timestamptz DEFAULT now(), -- 上传日期 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (doc_id), UNIQUE (optsn), FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) ); CREATE INDEX idx_doc_project ON bidding.tb_bidding_document(project_id) WHERE deleted = false; CREATE INDEX idx_doc_type ON bidding.tb_bidding_document(doc_type) WHERE deleted = false; COMMENT ON TABLE bidding.tb_bidding_document IS '招标文件表'; COMMENT ON COLUMN bidding.tb_bidding_document.parse_status IS '解析状态:pending/parsing/completed/failed'; -- 招标要素提取表 DROP TABLE IF EXISTS bidding.tb_bidding_requirement CASCADE; CREATE TABLE bidding.tb_bidding_requirement ( optsn VARCHAR(50) NOT NULL, -- 流水号 req_id VARCHAR(50) NOT NULL, -- 要素ID project_id VARCHAR(50) NOT NULL, -- 所属项目ID doc_id VARCHAR(50), -- 来源文档ID req_category VARCHAR(50) NOT NULL, -- 要素类别:commercial-商务要素/technical-技术参数/veto-否决项/qualification-资质要求/delivery-交付要求/payment-付款条件/scoring-评分标准 req_name VARCHAR(255) NOT NULL, -- 要素名称 req_content TEXT NOT NULL, -- 要素内容 req_value VARCHAR(500), -- 要素值 is_mandatory BOOLEAN DEFAULT false, -- 是否必填 is_veto BOOLEAN DEFAULT false, -- 是否为否决项 priority INTEGER DEFAULT 0, -- 优先级 extraction_method VARCHAR(30) DEFAULT 'ai', -- 提取方式:ai-AI提取/manual-人工录入 confidence_score DECIMAL(5,4), -- 置信度分数(0-1) source_location JSONB, -- 来源位置(页码、段落等) compliance_status VARCHAR(30), -- 合规状态:compliant-符合/non_compliant-不符合/pending-待确认 response_content TEXT, -- 响应内容(我方的应答) notes TEXT, -- 备注 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (req_id), UNIQUE (optsn), FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) ); CREATE INDEX idx_req_project ON bidding.tb_bidding_requirement(project_id) WHERE deleted = false; CREATE INDEX idx_req_category ON bidding.tb_bidding_requirement(req_category) WHERE deleted = false; CREATE INDEX idx_req_veto ON bidding.tb_bidding_requirement(is_veto) WHERE deleted = false AND is_veto = true; COMMENT ON TABLE bidding.tb_bidding_requirement IS '招标要素提取表'; COMMENT ON COLUMN bidding.tb_bidding_requirement.req_category IS '要素类别:commercial/technical/veto/qualification/delivery/payment/scoring'; -- 投标文件生成表 DROP TABLE IF EXISTS bidding.tb_bid_response CASCADE; CREATE TABLE bidding.tb_bid_response ( optsn VARCHAR(50) NOT NULL, -- 流水号 response_id VARCHAR(50) NOT NULL, -- 响应文件ID project_id VARCHAR(50) NOT NULL, -- 所属项目ID response_type VARCHAR(50) NOT NULL, -- 响应类型:technical-技术标/commercial-商务标/comprehensive-综合标 doc_name VARCHAR(500) NOT NULL, -- 文档名称 outline TEXT, -- 文档大纲(JSON格式) content TEXT, -- 文档内容 generation_method VARCHAR(30) DEFAULT 'ai', -- 生成方式:ai-AI生成/template-模板生成/manual-人工编写 template_id VARCHAR(50), -- 使用的模板ID ai_model VARCHAR(100), -- 使用的AI模型 generation_status VARCHAR(30) DEFAULT 'draft', -- 生成状态:draft-草稿/reviewing-审核中/approved-已批准/rejected-已拒绝/submitted-已提交 file_id VARCHAR(50), -- 生成的文件ID file_path VARCHAR(500), -- 文件路径 version VARCHAR(20) DEFAULT '1.0', -- 版本号 parent_version_id VARCHAR(50), -- 父版本ID review_comments TEXT, -- 审核意见 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (response_id), UNIQUE (optsn), FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) ); CREATE INDEX idx_response_project ON bidding.tb_bid_response(project_id) WHERE deleted = false; CREATE INDEX idx_response_status ON bidding.tb_bid_response(generation_status) WHERE deleted = false; COMMENT ON TABLE bidding.tb_bid_response IS '投标文件生成表'; COMMENT ON COLUMN bidding.tb_bid_response.generation_status IS '生成状态:draft/reviewing/approved/rejected/submitted'; -- 评分规则表 DROP TABLE IF EXISTS bidding.tb_bidding_scoring_rule CASCADE; CREATE TABLE bidding.tb_bidding_scoring_rule ( optsn VARCHAR(50) NOT NULL, -- 流水号 rule_id VARCHAR(50) NOT NULL, -- 规则ID project_id VARCHAR(50) NOT NULL, -- 所属项目ID rule_category VARCHAR(50) NOT NULL, -- 规则类别:technical-技术分/commercial-商务分/price-价格分/credit-信誉分 rule_name VARCHAR(255) NOT NULL, -- 规则名称 rule_description TEXT, -- 规则描述 max_score DECIMAL(10,2) NOT NULL, -- 最高分值 weight DECIMAL(5,4), -- 权重(0-1) scoring_method VARCHAR(50), -- 评分方法:fixed-固定分值/range-区间评分/formula-公式计算 calculation_formula TEXT, -- 计算公式 evaluation_criteria TEXT, -- 评分标准 our_score DECIMAL(10,2), -- 我方得分(预估) score_analysis TEXT, -- 得分分析 optimization_advice TEXT, -- 优化建议 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (rule_id), UNIQUE (optsn), FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) ); CREATE INDEX idx_rule_project ON bidding.tb_bidding_scoring_rule(project_id) WHERE deleted = false; COMMENT ON TABLE bidding.tb_bidding_scoring_rule IS '评分规则表'; -- 项目流程节点表 DROP TABLE IF EXISTS bidding.tb_bidding_process CASCADE; CREATE TABLE bidding.tb_bidding_process ( optsn VARCHAR(50) NOT NULL, -- 流水号 process_id VARCHAR(50) NOT NULL, -- 流程节点ID project_id VARCHAR(50) NOT NULL, -- 所属项目ID node_name VARCHAR(255) NOT NULL, -- 节点名称 node_type VARCHAR(50) NOT NULL, -- 节点类型:collection-文件收集/analysis-需求分析/preparation-文件准备/review-内部审核/submission-投标提交/opening-开标/result-结果通知 node_order INTEGER NOT NULL, -- 节点顺序 node_status VARCHAR(30) DEFAULT 'pending', -- 节点状态:pending-待处理/in_progress-进行中/completed-已完成/skipped-已跳过 planned_start_time timestamptz, -- 计划开始时间 planned_end_time timestamptz, -- 计划结束时间 actual_start_time timestamptz, -- 实际开始时间 actual_end_time timestamptz, -- 实际结束时间 responsible_user VARCHAR(50), -- 负责人 participants VARCHAR(50)[], -- 参与人员数组 notes TEXT, -- 节点备注 attachments VARCHAR(50)[], -- 附件ID数组 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (process_id), UNIQUE (optsn), FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) ); CREATE INDEX idx_process_project ON bidding.tb_bidding_process(project_id, node_order) WHERE deleted = false; COMMENT ON TABLE bidding.tb_bidding_process IS '项目流程节点表'; COMMENT ON COLUMN bidding.tb_bidding_process.node_type IS '节点类型:collection/analysis/preparation/review/submission/opening/result'; -- 投标模板表 DROP TABLE IF EXISTS bidding.tb_bid_template CASCADE; CREATE TABLE bidding.tb_bid_template ( optsn VARCHAR(50) NOT NULL, -- 流水号 template_id VARCHAR(50) NOT NULL, -- 模板ID template_name VARCHAR(255) NOT NULL, -- 模板名称 template_type VARCHAR(50) NOT NULL, -- 模板类型:technical-技术标/commercial-商务标/comprehensive-综合标 industry VARCHAR(100), -- 适用行业 template_content TEXT, -- 模板内容 outline_structure JSONB, -- 大纲结构(JSON格式) file_id VARCHAR(50), -- 模板文件ID usage_count INTEGER DEFAULT 0, -- 使用次数 is_default BOOLEAN DEFAULT false, -- 是否默认模板 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 status VARCHAR(20) DEFAULT 'active', -- 状态:active-激活/inactive-停用 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time timestamptz NOT NULL DEFAULT now(), -- 创建时间 update_time timestamptz DEFAULT NULL, -- 更新时间 delete_time timestamptz DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (template_id), UNIQUE (optsn) ); CREATE INDEX idx_template_type ON bidding.tb_bid_template(template_type) WHERE deleted = false; COMMENT ON TABLE bidding.tb_bid_template IS '投标模板表';