-- ============================================================================= -- 一次性迁移:盘点草稿表增加公司隔离键 -- stocktake_draft.company_name varchar(255) -- -- 背景 -- 改造前 stocktake_draft 没有任何公司维度,导致三个跨公司污染问题: -- 1. /draft/start-new 调用 StocktakeDraft.query.all() 清空**整张表**, -- 任一库管开启新盘点会删掉其他公司所有人的盘点进度; -- 2. get_stock_info() 全局按 barcode/sku 匹配三张库存表,不同公司同码 -- 物料会互相串货; -- 3. 去重键 (session_id, uuid) 不含公司,跨公司同码记录互相覆盖。 -- -- 取值来源 -- material_base.company_name(公司的真实载体是字符串,不是 id)。 -- 普通用户由 get_current_company_filter() 从 JWT 强制取本公司; -- 超管/跨域用户未显式指定公司时为 NULL —— NULL 表示「不过滤公司」。 -- -- 存量数据 -- 保留不动(本脚本不做 DELETE)。存量行 company_name 为 NULL, -- 普通用户按公司过滤后看不到,超管仍可见。 -- -- 执行: docker exec -i inventory_db psql -U test -d inventory_system < 本文件 -- ============================================================================= BEGIN; ALTER TABLE stocktake_draft ADD COLUMN IF NOT EXISTS company_name varchar(255); -- 盘点会话的所有查询都会带上 company_name 过滤,故建复合索引而非单列索引 CREATE INDEX IF NOT EXISTS ix_stocktake_draft_company_session ON stocktake_draft(company_name, session_id); COMMIT;