-- =============================
-- 招投标智能体业务模块
-- 支持：招标文件管理、投标文件生成、评分分析、流程跟踪
-- =============================
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            INTEGER   DEFAULT 1,          -- 版本号
  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            INTEGER   DEFAULT 1,          -- 版本号
  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 '投标模板表';
