-- ============================================================================= -- 借库转交 · 拒收原因独立成列 -- -- 背景 -- 拒收原因此前是**拼进 remark** 的: -- transfer.remark = f"{remark}\n[拒绝原因] {reason}" -- 结果前端拿到的是「3333\n[拒绝原因] 5555」这样一坨,无法区分 -- 「发起时写的转交备注」与「对方拒收的原因」—— 时间线上两者挤在一起, -- 毫无辨识度。 -- -- --------------------------------------------------------------------------- -- 为什么改成独立列而不是让前端解析 -- 1) 拼接格式是**隐式契约**:一旦以后有人改拼接方式(换分隔符、加前缀), -- 前端解析就静默失效,而且很难排查; -- 2) 备注内容本身可能包含 '[拒绝原因] ' 字样(用户手打),按标记切分会误判; -- 3) 结构化字段能直接参与查询与统计(例如「统计各类拒收原因」)。 -- 存储层能表达的东西,不要靠字符串约定去还原。 -- -- 存量回填 -- 按 '[拒绝原因] ' 标记切分现有 remark,把原因挪到新列,并清理 remark。 -- 实测仅 1 条(#22),切分结果:remark='3333',reject_reason='5555'。 -- -- 幂等:带 IF NOT EXISTS 与 NULL 判断,可重复执行。 -- 执行:docker exec -i inventory_db psql -U test -d inventory_system < 本文件 -- ============================================================================= BEGIN; ALTER TABLE trans_borrow_transfer ADD COLUMN IF NOT EXISTS reject_reason text; COMMENT ON COLUMN trans_borrow_transfer.reject_reason IS '拒收原因,独立成列。此前拼在 remark 里("...\n[拒绝原因] xxx"),前端无法区分转交备注与拒收原因'; -- ★ btrim 默认只去**空格**,不去换行 —— 拼接时留下的是 '3333\n', -- 只写 btrim(x) 会残留一个换行。必须显式给出要去除的字符集。 UPDATE trans_borrow_transfer SET reject_reason = nullif(btrim(split_part(remark, '[拒绝原因] ', 2), E' \t\r\n'), ''), remark = nullif( btrim(replace(remark, '[拒绝原因] ' || split_part(remark, '[拒绝原因] ', 2), ''), E' \t\r\n'), '') WHERE status = 'REJECTED' AND remark LIKE '%[拒绝原因] %' AND reject_reason IS NULL; COMMIT; -- ============================================================================= -- 执行后核对 -- ============================================================================= \echo '--- 1) 新列已就位 ---' SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'trans_borrow_transfer' AND column_name = 'reject_reason'; \echo '--- 2) 备注与拒收原因已分离(#22 应为 remark=3333 / reject_reason=5555)---' SELECT id, status, to_user_name, coalesce(replace(remark, E'\n', '\\n'), '<空>') AS 转交备注, coalesce(reject_reason, '<无>') AS 拒收原因 FROM trans_borrow_transfer ORDER BY id; \echo '--- 3) 不应再有残留的拼接痕迹(应为 0)---' SELECT count(*) AS 残留拼接 FROM trans_borrow_transfer WHERE remark LIKE '%[拒绝原因] %'; -- ============================================================================= -- 回滚段 -- ============================================================================= -- BEGIN; -- UPDATE trans_borrow_transfer -- SET remark = CASE WHEN remark IS NULL THEN '[拒绝原因] ' || reject_reason -- ELSE remark || E'\n[拒绝原因] ' || reject_reason END -- WHERE reject_reason IS NOT NULL; -- ALTER TABLE trans_borrow_transfer DROP COLUMN IF EXISTS reject_reason; -- COMMIT;