157 lines
13 KiB
SQL
157 lines
13 KiB
SQL
-- 酒店商户结账一期:仅在钱包业务库执行。本脚本可重复执行。
|
|
-- 要求MySQL 8.0.16或更新版本,使金额CHECK约束实际生效。
|
|
-- 酒店表作为只读数据源;财务快照通过独立结账表保存。
|
|
-- 脚本交付与数据库实际执行分别授权。
|
|
|
|
CREATE TABLE IF NOT EXISTS `mch_checkout_bill` (
|
|
`id` BIGINT NOT NULL COMMENT '应用分配的雪花主键',
|
|
`bill_no` VARCHAR(64) NOT NULL COMMENT '结账单编号,使用业务前缀和雪花主键',
|
|
`source_type` VARCHAR(32) NOT NULL COMMENT '订单业务类型,当前为HOTEL',
|
|
`relation_id` BIGINT NOT NULL COMMENT '发起时的结账关系主键',
|
|
`relation_version` INT NOT NULL COMMENT '发起时的结账关系版本',
|
|
`intermediary_name` VARCHAR(100) NOT NULL COMMENT '发起时的中间方名称快照',
|
|
`period_start` DATE NOT NULL COMMENT '离店周期开始日期,包含当天',
|
|
`period_end` DATE NOT NULL COMMENT '离店周期结束日期,包含当天',
|
|
`rule_version` INT NOT NULL COMMENT '金额计算规则版本,当前为1',
|
|
`fee_per_order_fen` BIGINT NOT NULL COMMENT '每笔订单抽成,单位分',
|
|
`order_count` INT NOT NULL COMMENT '实际纳入账单的订单笔数',
|
|
`merchant_count` INT NOT NULL COMMENT '关系全部商户快照数量,含零订单商户',
|
|
`gross_amount_fen` BIGINT NOT NULL COMMENT '原始订单金额合计,单位分',
|
|
`fee_amount_fen` BIGINT NOT NULL COMMENT '原始抽成合计,单位分',
|
|
`payable_amount_fen` BIGINT NOT NULL COMMENT '原始商户应付合计,单位分',
|
|
`state` VARCHAR(32) NOT NULL COMMENT 'WAIT_PAY待付款、PART_PAID部分已付、FINISHED已结清、VOID已作废',
|
|
`version` INT NOT NULL DEFAULT 0 COMMENT '每次账单状态汇总更新时递增的并发版本',
|
|
`create_request_id` VARCHAR(64) NOT NULL COMMENT '创建请求幂等号,租户内唯一',
|
|
`request_hash` CHAR(64) NOT NULL COMMENT '规范化创建内容的SHA256摘要',
|
|
`preview_token` VARCHAR(64) NOT NULL COMMENT '创建时的预览令牌,供缓存失效后幂等重试匹配',
|
|
`source_verified_at` DATETIME(6) NOT NULL COMMENT '创建前最近一次酒店源数据复核时间',
|
|
`remark` VARCHAR(500) DEFAULT NULL COMMENT '本次结账备注,最多500字',
|
|
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人账号',
|
|
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间,服务端时间',
|
|
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '最后修改人账号',
|
|
`update_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '最后修改时间,服务端时间',
|
|
`tenant_id` BIGINT NOT NULL COMMENT '所属租户,由平台上下文自动填写',
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY uk_checkout_bill_no (tenant_id, bill_no),
|
|
UNIQUE KEY uk_checkout_bill_request (tenant_id, create_request_id),
|
|
KEY idx_checkout_bill_page (tenant_id, create_time, id),
|
|
KEY idx_checkout_bill_state (tenant_id, state, create_time, id),
|
|
CONSTRAINT ck_checkout_bill_amount CHECK (gross_amount_fen > 0 AND fee_per_order_fen >= 0 AND fee_amount_fen >= 0 AND payable_amount_fen >= 0 AND order_count BETWEEN 1 AND 10000 AND merchant_count BETWEEN 1 AND 1000 AND version >= 0 AND gross_amount_fen = fee_amount_fen + payable_amount_fen)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商户结账账单,原始财务汇总及归属快照固定保存';
|
|
|
|
CREATE TABLE IF NOT EXISTS `mch_checkout_bill_merchant` (
|
|
`id` BIGINT NOT NULL COMMENT '应用分配的雪花主键',
|
|
`bill_id` BIGINT NOT NULL COMMENT '所属结账账单主键',
|
|
`merchant_id` BIGINT NOT NULL COMMENT '绑定商户主键快照',
|
|
`merchant_name` VARCHAR(255) NOT NULL COMMENT '绑定商户名称快照',
|
|
`dept_id` BIGINT NOT NULL COMMENT '发起时的商户直属部门,用于历史数据权限',
|
|
`dept_name` VARCHAR(255) DEFAULT NULL COMMENT '发起时的部门名称快照',
|
|
`merchant_create_by` VARCHAR(64) DEFAULT NULL COMMENT '商户创建人快照,用于本人数据权限',
|
|
`order_count` INT NOT NULL COMMENT '本次选择的订单笔数,零表示无结账订单',
|
|
`gross_amount_fen` BIGINT NOT NULL COMMENT '该商户原订单合计,单位分',
|
|
`fee_amount_fen` BIGINT NOT NULL COMMENT '该商户抽成合计,单位分',
|
|
`payable_amount_fen` BIGINT NOT NULL COMMENT '该商户应付,单位分',
|
|
`state` VARCHAR(32) NOT NULL COMMENT 'NO_ORDERS无订单、WAIT_PAY待付款、PAID已付款或结清、VOID已作废',
|
|
`version` INT NOT NULL DEFAULT 0 COMMENT '付款和作废操作使用的并发版本',
|
|
`payment_time` DATETIME(6) DEFAULT NULL COMMENT '实际线下付款时间,零元时为结清时间',
|
|
`paid_amount_fen` BIGINT DEFAULT NULL COMMENT '登记的全额实付,单位分,未付款为空',
|
|
`payment_no` VARCHAR(100) DEFAULT NULL COMMENT '线下付款流水号,与凭证至少提供一种',
|
|
`payment_pics` JSON DEFAULT NULL COMMENT '付款凭证地址JSON数组,最多9张',
|
|
`payment_remark` VARCHAR(500) DEFAULT NULL COMMENT '付款备注,最多500字',
|
|
`payment_request_id` VARCHAR(64) DEFAULT NULL COMMENT '付款请求幂等号',
|
|
`payment_request_hash` CHAR(64) DEFAULT NULL COMMENT '付款请求规范化内容摘要',
|
|
`void_reason` VARCHAR(500) DEFAULT NULL COMMENT '作废原因,最多500字',
|
|
`void_request_id` VARCHAR(64) DEFAULT NULL COMMENT '作废请求幂等号',
|
|
`void_request_hash` CHAR(64) DEFAULT NULL COMMENT '作废请求规范化内容摘要',
|
|
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人账号',
|
|
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间,服务端时间',
|
|
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '最后修改人账号',
|
|
`update_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '最后修改时间,服务端时间',
|
|
`tenant_id` BIGINT NOT NULL COMMENT '所属租户,由平台上下文自动填写',
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY uk_checkout_bill_merchant (tenant_id, bill_id, merchant_id),
|
|
UNIQUE KEY uk_checkout_merchant_pay_request (tenant_id, payment_request_id),
|
|
UNIQUE KEY uk_checkout_merchant_void_request (tenant_id, void_request_id),
|
|
KEY idx_checkout_merchant_scope (tenant_id, bill_id, dept_id),
|
|
KEY idx_checkout_merchant_state (tenant_id, bill_id, state),
|
|
CONSTRAINT ck_checkout_billmerchant_amount CHECK (gross_amount_fen >= 0 AND fee_amount_fen >= 0 AND payable_amount_fen >= 0 AND order_count >= 0 AND version >= 0 AND (paid_amount_fen IS NULL OR paid_amount_fen >= 0) AND gross_amount_fen = fee_amount_fen + payable_amount_fen),
|
|
CONSTRAINT ck_checkout_merchant_paid CHECK (state != 'PAID' OR (paid_amount_fen IS NOT NULL AND payment_time IS NOT NULL AND paid_amount_fen = payable_amount_fen))
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='结账商户明细及完整关系权限快照';
|
|
|
|
CREATE TABLE IF NOT EXISTS `mch_checkout_bill_order` (
|
|
`id` BIGINT NOT NULL COMMENT '应用分配的雪花主键',
|
|
`bill_id` BIGINT NOT NULL COMMENT '所属账单主键',
|
|
`bill_merchant_id` BIGINT NOT NULL COMMENT '所属商户结账明细主键',
|
|
`merchant_id` BIGINT NOT NULL COMMENT '归属商户主键快照',
|
|
`source_type` VARCHAR(32) NOT NULL COMMENT '源业务类型,当前为HOTEL',
|
|
`source_order_id` BIGINT NOT NULL COMMENT '酒店本地订单主键,唯一占用身份的一部分',
|
|
`hotel_id` BIGINT NOT NULL COMMENT '唯一解析的酒店主键快照',
|
|
`hotel_name` VARCHAR(255) DEFAULT NULL COMMENT '酒店名称快照',
|
|
`dept_id` BIGINT NOT NULL COMMENT '酒店直属归属部门快照',
|
|
`channel_no` VARCHAR(255) DEFAULT NULL COMMENT '渠道订单号快照',
|
|
`platform_no` VARCHAR(255) DEFAULT NULL COMMENT '上游订单号快照',
|
|
`check_in_date` DATE DEFAULT NULL COMMENT '源订单入住日期快照',
|
|
`check_out_date` DATE NOT NULL COMMENT '源订单离店日期快照',
|
|
`rooms` INT DEFAULT NULL COMMENT '房间数量快照,仅供核对',
|
|
`gross_amount_fen` BIGINT NOT NULL COMMENT '该笔订单售价,单位分',
|
|
`fee_amount_fen` BIGINT NOT NULL COMMENT '该笔抽成,单位分',
|
|
`payable_amount_fen` BIGINT NOT NULL COMMENT '该笔商户应付,单位分',
|
|
`order_status` VARCHAR(64) DEFAULT NULL COMMENT '酒店原始订单状态快照',
|
|
`book_status` VARCHAR(64) DEFAULT NULL COMMENT '酒店原始预订状态快照',
|
|
`pay_status` VARCHAR(64) DEFAULT NULL COMMENT '酒店原始支付状态快照',
|
|
`source_updated_at` DATETIME(6) DEFAULT NULL COMMENT '源订单最后更新时间快照',
|
|
`source_fingerprint` CHAR(64) NOT NULL COMMENT '源金额归属状态等关键事实的SHA256摘要',
|
|
`source_snapshot` JSON NOT NULL COMMENT '不含住客和联系人信息的酒店事实JSON快照',
|
|
`confirmed_user_id` BIGINT NOT NULL COMMENT '履约完成及收款核对人的管理用户主键',
|
|
`confirmed_by` VARCHAR(64) NOT NULL COMMENT '履约完成及收款核对人的账号',
|
|
`confirmed_at` DATETIME(6) NOT NULL COMMENT '服务端记录的履约与收款人工确认时间',
|
|
`last_check_status` VARCHAR(32) NOT NULL COMMENT 'NORMAL一致、DIFF差异、QUERY_FAILED查询失败、HANDLED人工处理',
|
|
`last_check_message` VARCHAR(500) DEFAULT NULL COMMENT '最近一次核对的可读结果',
|
|
`last_observed_fingerprint` CHAR(64) DEFAULT NULL COMMENT '最近观察到的源事实摘要',
|
|
`handled_fingerprint` CHAR(64) DEFAULT NULL COMMENT '已人工处理的差异摘要,新差异重新提醒',
|
|
`last_checked_at` DATETIME(6) DEFAULT NULL COMMENT '最近一次复核尝试时间',
|
|
`last_verified_at` DATETIME(6) DEFAULT NULL COMMENT '最近一次成功读取源数据时间,失败时保留',
|
|
`next_check_at` DATETIME(6) DEFAULT NULL COMMENT '下次后台复核时间,作废后为空',
|
|
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人账号',
|
|
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间,服务端时间',
|
|
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '最后修改人账号',
|
|
`update_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '最后修改时间,服务端时间',
|
|
`tenant_id` BIGINT NOT NULL COMMENT '所属租户,由平台上下文自动填写',
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY uk_checkout_bill_order (tenant_id, bill_id, source_type, source_order_id),
|
|
KEY idx_checkout_order_page (tenant_id, bill_id, bill_merchant_id, id),
|
|
KEY idx_checkout_order_recheck (tenant_id, next_check_at, id),
|
|
CONSTRAINT ck_checkout_billorder_amount CHECK (gross_amount_fen > 0 AND fee_amount_fen >= 0 AND payable_amount_fen >= 0 AND gross_amount_fen = fee_amount_fen + payable_amount_fen)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='结账订单不可变金额快照及后续复核结果';
|
|
|
|
CREATE TABLE IF NOT EXISTS `mch_checkout_order_claim` (
|
|
`id` BIGINT NOT NULL COMMENT '应用分配的雪花主键',
|
|
`source_type` VARCHAR(32) NOT NULL COMMENT '源业务类型,当前为HOTEL',
|
|
`source_order_id` BIGINT NOT NULL COMMENT '源订单主键,租户和类型下唯一占用',
|
|
`bill_id` BIGINT NOT NULL COMMENT '占用账单主键',
|
|
`bill_merchant_id` BIGINT NOT NULL COMMENT '占用的商户结账明细主键',
|
|
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人账号',
|
|
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间,服务端时间',
|
|
`tenant_id` BIGINT NOT NULL COMMENT '所属租户,由平台上下文自动填写',
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY uk_checkout_order_claim (tenant_id, source_type, source_order_id),
|
|
KEY idx_checkout_claim_merchant (tenant_id, bill_id, bill_merchant_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='当前有效结账订单占用,作废待付款明细时释放';
|
|
|
|
CREATE TABLE IF NOT EXISTS `mch_checkout_bill_event` (
|
|
`id` BIGINT NOT NULL COMMENT '应用分配的雪花主键',
|
|
`bill_id` BIGINT NOT NULL COMMENT '事件所属账单主键',
|
|
`bill_merchant_id` BIGINT DEFAULT NULL COMMENT '商户明细主键,整单事件为空',
|
|
`source_order_id` BIGINT DEFAULT NULL COMMENT '源订单主键,非订单事件为空',
|
|
`action` VARCHAR(32) NOT NULL COMMENT 'CREATE、PAY、VOID、RECHECK、DIFF、QUERY_FAILED、HANDLE业务动作',
|
|
`request_id` VARCHAR(64) NOT NULL COMMENT '该动作的请求幂等号或系统事件号',
|
|
`request_hash` CHAR(64) NOT NULL COMMENT '该动作请求摘要,供审计核对',
|
|
`payload` JSON NOT NULL COMMENT '业务依据和结果JSON,不包含凭据或酒店住客资料',
|
|
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人账号',
|
|
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间,服务端时间',
|
|
`tenant_id` BIGINT NOT NULL COMMENT '所属租户,由平台上下文自动填写',
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY uk_checkout_event_request (tenant_id, action, request_id),
|
|
KEY idx_checkout_event_page (tenant_id, bill_id, id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='结账业务追加式审计事件';
|