feat(stocktake): 盘点草稿表增加公司隔离字段

stocktake_draft 原本没有任何公司维度,导致开启新盘点清空整表时会误删
其他公司的进度,扫码时也无法区分不同公司的同码物料。

- StocktakeDraft 增加 company_name(带索引),to_dict 同步输出
- 新增迁移 add_stocktake_draft_company_name.sql:加列 + (company_name,
  session_id) 复合索引;存量行保持 NULL(超管仍可见),不做删除

执行: docker exec -i inventory_db psql -U test -d inventory_system < db_migrations/add_stocktake_draft_company_name.sql
This commit is contained in:
yueli
2026-09-11 11:33:04 +08:00
parent c6694043d4
commit 6586d3cb75
2 changed files with 37 additions and 1 deletions

View File

@ -0,0 +1,32 @@
-- =============================================================================
-- 一次性迁移:盘点草稿表增加公司隔离键
-- 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;