-- ============================================================================= -- 出库明细补记「申请人」,让退回补发能找回真正该拿东西的人 -- -- 问题 -- 退回后勾选补发时,补发单的申请人无从确定 —— trans_outbound 只有 -- consumer_name(**扫码时前端自由填写**的领用人/客户名,既不可靠也可能是 -- 客户),没有任何指回原审批单的关联。原先只能回退成「当前操作人(库管)」, -- 但**补发是原申请人的需求**,挂在库管名下逻辑不通。 -- -- 本次改动 -- trans_outbound 新增 applicant_id,创建出库时从审批单带出。 -- 创建出库时 approval 恒非 None(request_id 已强制必填),故新单据必然有值。 -- -- --------------------------------------------------------------------------- -- ★ 为什么从审批单带,而不是从 consumer_name 反查 -- consumer_name 是自由文本、可能是客户名,按姓名反查会重蹈「重名错绑」 -- 的覆辙(借用人姓名回填那轮刚踩过)。审批单的 applicant_id 是**主键**, -- 没有歧义。 -- -- ★ 为什么不回填存量行 -- 存量出库明细与其来源审批单之间**没有任何可用的关联**(创建时只把审批单 -- 状态置为 3,没落任何外键),无从回填。刻意留 NULL 而不是按姓名猜 —— -- NULL 表示「这张单产生于本列上线之前」,退回时由库管在选择器里明确指定。 -- 与 dispatch_operator 的处理同一取舍:宁可留空,也不猜。 -- -- 幂等:带 IF NOT EXISTS,可重复执行。不含 psql 元命令,DataGrip 可直接执行。 -- ============================================================================= BEGIN; ALTER TABLE trans_outbound ADD COLUMN IF NOT EXISTS applicant_id integer; COMMENT ON COLUMN trans_outbound.applicant_id IS '申请人ID,创建出库时从关联审批单带出。该列上线前的历史行为 NULL(无从回填)'; -- 支撑「某人申请过的出库」类查询与退回补发的申请人回查 CREATE INDEX IF NOT EXISTS ix_trans_outbound_applicant ON trans_outbound (applicant_id); COMMIT; -- ============================================================================= -- 执行后核对 -- ============================================================================= SELECT '=== 1) 新列已就位 ===' AS "核对项"; SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'trans_outbound' AND column_name = 'applicant_id'; SELECT '=== 2) 索引已就位 ===' AS "核对项"; SELECT indexname FROM pg_indexes WHERE tablename = 'trans_outbound' AND indexname = 'ix_trans_outbound_applicant'; SELECT '=== 3) 存量行应全部为 NULL(历史无从回填)===' AS "核对项"; SELECT count(*) AS 出库明细总数, count(applicant_id) AS 已记录申请人 FROM trans_outbound; -- ============================================================================= -- 回滚段 -- ============================================================================= -- BEGIN; -- DROP INDEX IF EXISTS ix_trans_outbound_applicant; -- ALTER TABLE trans_outbound DROP COLUMN IF EXISTS applicant_id; -- COMMIT;