-- ============================================================================= -- 出库 · 原单退回后的「补发单」关联 -- -- 背景 -- 原单退回目前只做两件事:良品加回库存 / 不良品转在管台账。 -- 但**申请人的需求并没有被满足** —— 东西交回来了(甚至还是坏的), -- 系统却:不提醒任何人、无单据承载「我要重新领一份」、退回与后续再出库 -- 之间毫无关联。现场只能靠人记住再手动新建一张出库申请,且那张单与原单 -- 看不出任何关系。 -- -- 本次改动 -- outbound_approval 新增 source_return_id:非空即表示这是一张由「原单退回」 -- 自动生成的**补发单**,从而把「退回 → 补发」串成闭环,出库记录里也能 -- 一眼看出哪张单是补发的。 -- -- --------------------------------------------------------------------------- -- ★ 为什么不加 is_reissue 布尔列 -- 「是不是补发」完全由「来源退回单是否存在」决定,再加一个布尔列就是 -- 同一事实的两处存储,必然有不同步的一天(改了 A 忘了 B)。 -- 单列既表达事实,又能直接 join 回原单。 -- -- ★ 为什么只存退回单 ID,不另存原出库单 ID -- trans_return 本身已有 outbound_id,顺着 source_return_id 一跳即可拿到 -- 原出库明细。冗余存储只会带来「两张单对不上」的风险。 -- -- 幂等:带 IF NOT EXISTS,可重复执行。不含 psql 元命令,DataGrip 可直接执行。 -- ============================================================================= BEGIN; ALTER TABLE outbound_approval ADD COLUMN IF NOT EXISTS source_return_id integer; COMMENT ON COLUMN outbound_approval.source_return_id IS '补发单来源:trans_return.id。非空即表示本单是由「原单退回」自动生成的补发单'; -- 支撑「这批补发是从哪张退回单来的」与列表标识 CREATE INDEX IF NOT EXISTS ix_outbound_approval_source_return ON outbound_approval (source_return_id); COMMIT; -- ============================================================================= -- 执行后核对 -- ============================================================================= SELECT '=== 1) 新列已就位 ===' AS "核对项"; SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'outbound_approval' AND column_name = 'source_return_id'; SELECT '=== 2) 索引已就位 ===' AS "核对项"; SELECT indexname FROM pg_indexes WHERE tablename = 'outbound_approval' AND indexname = 'ix_outbound_approval_source_return'; SELECT '=== 3) 存量补发单(新功能上线前应为 0)===' AS "核对项"; SELECT count(*) AS 补发单数 FROM outbound_approval WHERE source_return_id IS NOT NULL; -- ============================================================================= -- 回滚段 -- ============================================================================= -- BEGIN; -- DROP INDEX IF EXISTS ix_outbound_approval_source_return; -- ALTER TABLE outbound_approval DROP COLUMN IF EXISTS source_return_id; -- COMMIT;