-- 退款链路补齐结算标识与申请人备注。 -- 背景:退款单需要可追溯「原支付单号」与「原支付渠道交易流水号」,财务需要登记线下退款处理流水号; -- 退款申请还需要支持可选的申请人备注,且备注必须随每次提交或重提冻结进当次审批尝试快照。 -- -- 设计选择: -- 1. 来源支付单号与原支付渠道交易流水号直接冻结在退款主表:这两项来自创建申请时的原成功支付事实, -- 读取时跨订单与支付单推导无法表达「冻结」语义(支付单后续改挂或缺失会让结果漂移),也不满足对账需要的稳定性。 -- 线下订单(后台线下套餐订单、员工代收订单)没有线上支付记录,两个字段以空字符串保存,不阻断申请创建。 -- 2. 线下退款处理流水号、登记时间与登记人为财务补录事实:允许在申请创建后由授权账号补录或更正, -- 每次登记写审计(操作者、时间、前后值)。补录不改变退款状态、实收金额、套餐失效与佣金回溯规则, -- 因此与既有渠道退款流水号(channel_refund_no,渠道原路退款结果)是两列不同语义,不得互相覆盖。 -- 3. 申请人备注落在审批尝试表而非退款主表:主表既有 remark 列语义为「审批备注」(审批人填写、随审批结果展示), -- 本变更 MUST NOT 复用或改写该列。备注随每次提交或重提写入一条新的尝试记录,历史尝试快照不被改写。 -- 4. 新列一律可空或带默认值,既有行零变更,读侧对空值按空处理。 ALTER TABLE tb_refund_request ADD COLUMN IF NOT EXISTS source_payment_no VARCHAR(64) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS original_channel_trade_no VARCHAR(100) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS offline_settlement_no VARCHAR(128) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS offline_settled_at TIMESTAMPTZ, ADD COLUMN IF NOT EXISTS offline_settled_by BIGINT NOT NULL DEFAULT 0; COMMENT ON COLUMN tb_refund_request.source_payment_no IS '冻结的来源支付单号:取创建申请时该订单原成功支付记录的支付单号;线下订单无线上支付记录时为空字符串'; COMMENT ON COLUMN tb_refund_request.original_channel_trade_no IS '冻结的原支付渠道交易流水号:取创建申请时原成功支付记录的渠道交易流水号,列宽与来源列 tb_payment.third_party_trade_no 一致;线下订单无线上支付记录时为空字符串'; COMMENT ON COLUMN tb_refund_request.offline_settlement_no IS '线下退款处理流水号或凭证编号,由授权账号补录或更正;与渠道原路退款流水号(channel_refund_no)语义不同,不参与资金与状态判定'; COMMENT ON COLUMN tb_refund_request.offline_settled_at IS '线下退款处理流水号最近一次登记或更正时间,未登记时为空'; COMMENT ON COLUMN tb_refund_request.offline_settled_by IS '线下退款处理流水号最近一次登记或更正的操作账号ID,0-未登记'; -- 退款审批尝试表新增申请人备注:每次提交或重提一条尝试,备注逐次冻结,历史尝试不被改写。 ALTER TABLE tb_refund_request_attempt ADD COLUMN IF NOT EXISTS remark TEXT NOT NULL DEFAULT ''; COMMENT ON COLUMN tb_refund_request_attempt.remark IS '本次提交的申请人备注快照,随提交与重提逐次冻结,历史尝试不被改写;与退款主表 remark(审批备注)语义与展示口径不同,不得复用或互相覆盖';