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
33 lines
1.6 KiB
PL/PgSQL
33 lines
1.6 KiB
PL/PgSQL
-- =============================================================================
|
||
-- 一次性迁移:盘点草稿表增加公司隔离键
|
||
-- 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;
|