feat: 支持待分配/待抢单修改付款金额并增加价格历史

This commit is contained in:
2026-11-03 10:31:46 +08:00
parent 232ef6ce79
commit 96676841b5
22 changed files with 626 additions and 78 deletions
@@ -0,0 +1,15 @@
-- 120_work_order_user_payment_amount_audit.sql
-- 工单「用户付款金额」最近一次修正快照:旧价、修改时间、修改人。
-- 完整修改历史仍在 work_order_events.payment_amount_updated。
ALTER TABLE work_orders
ADD COLUMN IF NOT EXISTS user_payment_amount_previous_fen BIGINT,
ADD COLUMN IF NOT EXISTS user_payment_amount_updated_at TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS user_payment_amount_updated_by TEXT;
COMMENT ON COLUMN work_orders.user_payment_amount_previous_fen IS
'最近一次修改用户付款金额前的金额(分);NULL 表示首次修改前金额未知';
COMMENT ON COLUMN work_orders.user_payment_amount_updated_at IS
'最近一次修改用户付款金额的时间';
COMMENT ON COLUMN work_orders.user_payment_amount_updated_by IS
'最近一次修改用户付款金额的操作人展示名/用户名快照';
@@ -0,0 +1,72 @@
-- 121_work_order_payment_amount_history.sql
-- 工单「用户付款金额」完整修改历史:每次修改一行。
-- 独立于 work_order_events(默认只保留 180 天),工单删除时级联删除。
CREATE TABLE IF NOT EXISTS work_order_payment_amount_history (
id BIGSERIAL PRIMARY KEY,
work_order_id BIGINT NOT NULL REFERENCES work_orders(id) ON DELETE CASCADE,
previous_amount_fen BIGINT,
amount_fen BIGINT NOT NULL,
reason TEXT NOT NULL DEFAULT '',
changed_by TEXT NOT NULL DEFAULT '',
changed_at TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_work_order_payment_amount_history_order
ON work_order_payment_amount_history(work_order_id, changed_at DESC, id DESC);
COMMENT ON TABLE work_order_payment_amount_history IS
'工单用户付款金额完整修改历史;每次实际修改一行,供后台价格历史查看';
COMMENT ON COLUMN work_order_payment_amount_history.previous_amount_fen IS
'本次修改前的金额(分);NULL 表示首次修改前金额未知';
COMMENT ON COLUMN work_order_payment_amount_history.amount_fen IS
'本次修改后的金额(分)';
COMMENT ON COLUMN work_order_payment_amount_history.reason IS
'修改原因(选填,最多 200 字)';
COMMENT ON COLUMN work_order_payment_amount_history.changed_by IS
'修改人展示名/用户名快照';
COMMENT ON COLUMN work_order_payment_amount_history.changed_at IS
'本次修改时间';
-- 回填已有的 payment_amount_updated 事件。迁移只执行一次,仍按
-- (work_order_id, changed_at, amount_fen) 防重,避免手工重跑时重复插入。
WITH parsed AS (
SELECT
e.work_order_id,
CASE
WHEN e.payload_json->>'previousAmountFen' ~ '^-?[0-9]+$'
THEN (e.payload_json->>'previousAmountFen')::bigint
ELSE NULL
END AS previous_amount_fen,
(e.payload_json->>'amountFen')::bigint AS amount_fen,
COALESCE(e.payload_json->>'reason', '') AS reason,
COALESCE(e.actor_id, '') AS changed_by,
e.created_at
FROM work_order_events e
WHERE e.event_type = 'payment_amount_updated'
AND e.payload_json->>'amountFen' ~ '^-?[0-9]+$'
)
INSERT INTO work_order_payment_amount_history (
work_order_id,
previous_amount_fen,
amount_fen,
reason,
changed_by,
changed_at
)
SELECT
p.work_order_id,
p.previous_amount_fen,
p.amount_fen,
p.reason,
p.changed_by,
p.created_at
FROM parsed p
WHERE NOT EXISTS (
SELECT 1
FROM work_order_payment_amount_history h
WHERE h.work_order_id = p.work_order_id
AND h.changed_at = p.created_at
AND h.amount_fen = p.amount_fen
);