-- 3. project:项目、基本信息字段、分包、项目成员(FR-M2-03、04,FR-M6-01、02) -- 来源:docs/architecture/schema-draft.sql(2026-11-03 验证过的草案) CREATE TABLE project ( id uuid PRIMARY KEY, tenant_id uuid NOT NULL REFERENCES tenant (id), -- 下面几列是 project_field 的当前值,冗余在这里给工作台列表排序和筛选用 name text NOT NULL, code text, purchaser text, agency text, procurement_method text, legal_regime text NOT NULL DEFAULT 'unknown' CHECK (legal_regime IN ('gov_procurement', 'tendering', 'unknown')), deadline_at timestamptz, status text NOT NULL DEFAULT 'tracking' CHECK (status IN ('tracking', 'drafting', 'checked', 'submitted', 'archived')), status_before_archive text CHECK (status_before_archive IN ('checked', 'submitted')), -- 就绪标记:只在 checked 状态显示(G7);由 check 模块在处理问题的同一个事务里更新 latest_check_run_id uuid, open_fatal_count int NOT NULL DEFAULT 0, last_charged_check_at timestamptz, -- 24 小时免扣的起点(P1) created_by uuid NOT NULL REFERENCES user_account (id), created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), UNIQUE (tenant_id, id) ); CREATE INDEX ON project (tenant_id, status, deadline_at); CREATE TABLE project_member ( -- AR12:MVP 只有建项目的人,角色 lead tenant_id uuid NOT NULL, project_id uuid NOT NULL, user_id uuid NOT NULL REFERENCES user_account (id), role text NOT NULL CHECK (role IN ('lead', 'editor', 'viewer')), added_by uuid NOT NULL REFERENCES user_account (id), created_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (tenant_id, project_id, user_id), FOREIGN KEY (tenant_id, project_id) REFERENCES project (tenant_id, id) ON DELETE CASCADE ); CREATE INDEX ON project_member (tenant_id, user_id); CREATE TABLE lot ( -- 包 / 标段;没分包时只有一个默认包 id uuid PRIMARY KEY, tenant_id uuid NOT NULL, project_id uuid NOT NULL, lot_no text NOT NULL, -- 原文里的写法:「1」「包2」「第三标段」 name text, budget_amount numeric(18, 2), ceiling_amount numeric(18, 2), -- 采购包限价;三层限价的另外两层见 data-model §5.3 is_default boolean NOT NULL DEFAULT false, is_bidding boolean NOT NULL DEFAULT true, -- 用户选择投哪些包 origin text NOT NULL CHECK (origin IN ('ai', 'human')), ai_values jsonb, -- AI 原值,人工修改不覆盖 edited_fields text[] NOT NULL DEFAULT '{}', sort_order int NOT NULL DEFAULT 0, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), UNIQUE (tenant_id, id), UNIQUE (tenant_id, project_id, lot_no), FOREIGN KEY (tenant_id, project_id) REFERENCES project (tenant_id, id) ON DELETE CASCADE );