68 lines
3.2 KiB
MySQL
68 lines
3.2 KiB
MySQL
|
|
-- =============================================================================
|
|||
|
|
-- 出库明细补记「申请人」,让退回补发能找回真正该拿东西的人
|
|||
|
|
--
|
|||
|
|
-- 问题
|
|||
|
|
-- 退回后勾选补发时,补发单的申请人无从确定 —— 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;
|