86 lines
6.9 KiB
SQL
86 lines
6.9 KiB
SQL
-- 钱包结账单整批转账迁移,依赖现有结账单表。菜单权限通过Markdown手工配置。
|
|
CREATE TABLE IF NOT EXISTS mch_checkout_bill_transfer_batch (
|
|
id BIGINT NOT NULL COMMENT '批次雪花主键',
|
|
tenant_id BIGINT NOT NULL COMMENT '租户上下文,由服务端填写',
|
|
bill_id BIGINT NOT NULL COMMENT '原结账单主键',
|
|
request_id VARCHAR(64) COLLATE utf8mb4_bin NOT NULL COMMENT '租户内稳定受理请求号',
|
|
request_hash VARCHAR(64) NOT NULL COMMENT '受理参数SHA256摘要',
|
|
bill_version INT NOT NULL COMMENT '确认时账单版本',
|
|
amount_fen BIGINT NOT NULL COMMENT '本次确认金额合计,单位分,包含零元结清',
|
|
merchant_count INT NOT NULL COMMENT '本批次商户明细数量',
|
|
zero_count INT NOT NULL COMMENT '本次零元结清商户数量',
|
|
status VARCHAR(32) NOT NULL COMMENT 'PROCESSING执行中、SUCCESS全部成功、PART_FAILED部分失败、FAILED全部失败',
|
|
needs_attention TINYINT(1) NOT NULL DEFAULT 0 COMMENT '终态矛盾等情况需要人工核对',
|
|
operator_id BIGINT NOT NULL COMMENT '发起人ID,后台执行持续沿用',
|
|
operator_name VARCHAR(128) NOT NULL COMMENT '发起人账号快照',
|
|
create_time DATETIME(6) NOT NULL COMMENT '批次受理时间',
|
|
update_time DATETIME(6) NOT NULL COMMENT '最近结果更新时间',
|
|
CHECK (amount_fen >= 0),
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uk_tenant_request (tenant_id, request_id),
|
|
CHECK (merchant_count BETWEEN 1 AND 1000 AND zero_count BETWEEN 0 AND merchant_count),
|
|
KEY idx_bill_created (tenant_id, bill_id, id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结账整批转账的固定授权与汇总,受理成功后由持久明细驱动执行';
|
|
|
|
CREATE TABLE IF NOT EXISTS mch_checkout_bill_transfer_item (
|
|
id BIGINT NOT NULL COMMENT '付款尝试雪花主键',
|
|
tenant_id BIGINT NOT NULL COMMENT '所属租户,由服务端填写',
|
|
batch_id BIGINT NOT NULL COMMENT '关联整批转账主键',
|
|
bill_id BIGINT NOT NULL COMMENT '原账单主键',
|
|
bill_merchant_id BIGINT NOT NULL COMMENT '原商户账单明细主键',
|
|
merchant_id BIGINT NOT NULL COMMENT '实际收款商户ID快照',
|
|
merchant_name VARCHAR(255) NOT NULL COMMENT '商户名称快照',
|
|
dept_id BIGINT DEFAULT NULL COMMENT '原账单部门归属快照',
|
|
amount_fen BIGINT NOT NULL COMMENT '本次全额付款金额,单位分,零表示确认结清',
|
|
attempt_no INT NOT NULL COMMENT '该商户账单的付款尝试序号,从1递增',
|
|
request_no VARCHAR(64) COLLATE utf8mb4_bin NOT NULL COMMENT '第三方转账稳定请求号,所有受理重试保持',
|
|
expected_payer_app_id VARCHAR(64) DEFAULT NULL COMMENT '本次确认的付款AppID',
|
|
pay_setting_id BIGINT DEFAULT NULL COMMENT '确认时商户支付宝支付配置主键',
|
|
relation_id BIGINT DEFAULT NULL COMMENT '确认时唯一默认接收关系主键',
|
|
receiver_fingerprint VARCHAR(64) DEFAULT NULL COMMENT '接收方有效事实摘要,排除分账开关等无关字段',
|
|
receiver_type VARCHAR(64) DEFAULT NULL COMMENT '标准化支付宝收款身份类型',
|
|
receiver_account_masked VARCHAR(200) DEFAULT NULL COMMENT '仅供展示的脱敏账号',
|
|
receiver_name_masked VARCHAR(200) DEFAULT NULL COMMENT '仅供展示的脱敏实名',
|
|
request_ciphertext TEXT DEFAULT NULL COMMENT '项目统一加密器保存的原始转账指令,禁止对外返回',
|
|
status VARCHAR(32) NOT NULL COMMENT 'WAIT_SUBMIT待受理或第三方资金状态,零元结清使用SUCCESS',
|
|
transfer_no VARCHAR(64) DEFAULT NULL COMMENT '第三方受理后的固定转账号',
|
|
channel_order_no VARCHAR(64) DEFAULT NULL COMMENT '已确认的支付宝渠道转账单号',
|
|
payment_time DATETIME(6) DEFAULT NULL COMMENT '渠道实际付款时间,零元时为确认结清时间',
|
|
result_version INT NOT NULL DEFAULT 0 COMMENT '已应用的第三方结果版本,首次为0',
|
|
notify_id VARCHAR(64) DEFAULT NULL COMMENT '最近应用的稳定通知ID',
|
|
needs_attention TINYINT(1) NOT NULL DEFAULT 0 COMMENT '资金终态矛盾或账务冲突标记',
|
|
dispatch_status VARCHAR(32) NOT NULL COMMENT 'READY、PROCESSING、RETRY、DONE或PAUSED的独立调度状态',
|
|
attempt_count INT NOT NULL DEFAULT 0 COMMENT '持久任务累计领取次数',
|
|
next_run_time DATETIME(6) DEFAULT NULL COMMENT '原任务下次允许执行时间',
|
|
lease_token VARCHAR(64) DEFAULT NULL COMMENT '当前Worker随机租约令牌',
|
|
lease_expire_time DATETIME(6) DEFAULT NULL COMMENT '当前数据库租约到期时间',
|
|
error_code VARCHAR(100) DEFAULT NULL COMMENT '限定安全格式的最近错误码',
|
|
error_message VARCHAR(500) DEFAULT NULL COMMENT '安全中文错误摘要',
|
|
create_time DATETIME(6) NOT NULL COMMENT '付款尝试创建时间',
|
|
update_time DATETIME(6) NOT NULL COMMENT '最近受理或资金更新时间',
|
|
CHECK (amount_fen >= 0),
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uk_tenant_request (tenant_id, request_no),
|
|
UNIQUE KEY uk_batch_merchant (tenant_id, batch_id, bill_merchant_id),
|
|
UNIQUE KEY uk_merchant_attempt (tenant_id, bill_merchant_id, attempt_no),
|
|
CHECK (amount_fen = 0 OR amount_fen BETWEEN 10 AND 10000000000),
|
|
CHECK (attempt_no >= 1 AND result_version >= 0 AND attempt_count >= 0),
|
|
KEY idx_due_task (tenant_id, dispatch_status, next_run_time, id),
|
|
KEY idx_bill_batch (tenant_id, bill_id, batch_id, id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单商户付款尝试及持久受理任务,资金状态与调度状态分别记录';
|
|
|
|
-- 已确认实际转账成功时渠道时间可能暂缺,原付款登记仍要求明确时间。
|
|
-- 仅固定HCP+雪花ID的真实转账指令允许稍后补齐时间,实付等于应付的金额约束持续保留。
|
|
-- DROP与ADD位于同一ALTER,避免迁移中间留下没有付款一致性约束的窗口。
|
|
SET @checkout_paid_check_definition = 'ADD CONSTRAINT `ck_checkout_merchant_paid` CHECK (state != ''PAID'' OR (paid_amount_fen IS NOT NULL AND paid_amount_fen = payable_amount_fen AND (payment_time IS NOT NULL OR (payment_request_id IS NOT NULL AND REGEXP_LIKE(payment_request_id, ''^HCP[1-9][0-9]{0,18}$'', ''c'')))))';
|
|
SET @checkout_paid_check_sql = IF(
|
|
EXISTS(SELECT 1 FROM information_schema.CHECK_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = 'ck_checkout_merchant_paid' AND CHECK_CLAUSE LIKE '%HCP%'),
|
|
'SELECT 1',
|
|
CONCAT('ALTER TABLE `mch_checkout_bill_merchant` ',
|
|
IF(EXISTS(SELECT 1 FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mch_checkout_bill_merchant' AND CONSTRAINT_NAME = 'ck_checkout_merchant_paid' AND CONSTRAINT_TYPE = 'CHECK'), 'DROP CHECK `ck_checkout_merchant_paid`, ', ''),
|
|
@checkout_paid_check_definition)
|
|
);
|
|
PREPARE checkout_paid_check_statement FROM @checkout_paid_check_sql;
|
|
EXECUTE checkout_paid_check_statement;
|
|
DEALLOCATE PREPARE checkout_paid_check_statement;
|