66 lines
3.1 KiB
MySQL
66 lines
3.1 KiB
MySQL
|
|
-- =============================================================================
|
|||
|
|
-- 出库 · 原单退回后的「补发单」关联
|
|||
|
|
--
|
|||
|
|
-- 背景
|
|||
|
|
-- 原单退回目前只做两件事:良品加回库存 / 不良品转在管台账。
|
|||
|
|
-- 但**申请人的需求并没有被满足** —— 东西交回来了(甚至还是坏的),
|
|||
|
|
-- 系统却:不提醒任何人、无单据承载「我要重新领一份」、退回与后续再出库
|
|||
|
|
-- 之间毫无关联。现场只能靠人记住再手动新建一张出库申请,且那张单与原单
|
|||
|
|
-- 看不出任何关系。
|
|||
|
|
--
|
|||
|
|
-- 本次改动
|
|||
|
|
-- 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;
|