CREATE DATABASE IF NOT EXISTS baiyue_finance DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE baiyue_finance; CREATE TABLE IF NOT EXISTS fin_fee_source ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', source_system VARCHAR(32) NOT NULL COMMENT '费用来源系统:FIRSTLEG头程、LASTLEG海外仓等', source_fee_id BIGINT UNSIGNED NOT NULL COMMENT '来源系统费用记录ID', source_fee_version INT UNSIGNED NOT NULL COMMENT '来源费用版本号,用于固化不可变来源版本', customer_id BIGINT UNSIGNED NOT NULL COMMENT '费用来源所属客户ID', source_type VARCHAR(32) NOT NULL COMMENT '来源费用类型:INBOUND_FEE入库单费用、CONTAINER_FEE柜子费用', source_no VARCHAR(64) NULL COMMENT '来源入库单号或柜号快照,可为空', business_type VARCHAR(32) NULL COMMENT '来源业务类型,如海外入仓、采购、卡车或柜级分摊', business_id BIGINT UNSIGNED NULL COMMENT '来源业务记录ID,可为空', business_no VARCHAR(128) NULL COMMENT '来源业务编号快照,可为空', inbound_code VARCHAR(64) NULL COMMENT '来源入仓码快照;并非所有费用必填', warehouse_id BIGINT UNSIGNED NULL COMMENT '来源海外仓或业务仓ID,可为空', direction VARCHAR(16) NOT NULL COMMENT '费用方向:RECEIVABLE应收、PAYABLE应付', order_id BIGINT UNSIGNED NULL COMMENT '来源头程订单ID,可为空', inbound_id BIGINT UNSIGNED NULL COMMENT '来源入库单ID,可为空', container_id BIGINT UNSIGNED NULL COMMENT '来源Firstleg装柜计划ID,可为空', container_booking_id BIGINT UNSIGNED NULL COMMENT '来源订舱柜ID,可为空', container_no VARCHAR(64) NULL COMMENT '真实集装箱号快照,可为空', fee_item_code VARCHAR(64) NOT NULL COMMENT '来源费用项目编码快照', fee_item_name VARCHAR(200) NOT NULL COMMENT '来源费用项目名称快照', amount DECIMAL(20,6) NOT NULL COMMENT '来源费用金额,精度6位小数', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', settlement_mode VARCHAR(16) NULL COMMENT '仅PAYABLE:ON_ACCOUNT账期应付、DIRECT_PAID业务已付;RECEIVABLE为空', paid_at DATETIME(3) NULL COMMENT 'DIRECT_PAID业务已付时间', payment_method VARCHAR(32) NULL COMMENT 'DIRECT_PAID付款方式:ONLINE、BANK_TRANSFER、CASH、OTHER', payment_reference_no VARCHAR(128) NULL COMMENT 'DIRECT_PAID付款流水号', payment_voucher_file_ids JSON NULL COMMENT 'DIRECT_PAID付款凭证File ID数组', source_hash VARCHAR(71) NOT NULL COMMENT '业务费用来源完整快照SHA-256哈希,兼容sha256前缀格式', source_snapshot JSON NOT NULL COMMENT 'Firstleg费用来源完整不可变JSON快照', review_status VARCHAR(16) NOT NULL DEFAULT 'DRAFT' COMMENT 'Finance费用状态:DRAFT草稿、PENDING待审核、APPROVED已通过、REJECTED已驳回', review_reason VARCHAR(500) NULL COMMENT 'Finance费用审核说明或驳回原因', operation_version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '费用编辑、提交、审核、调整和作废操作版本号', wallet_hold_id BIGINT UNSIGNED NULL COMMENT '已由客户资金账户结算时关联的资金冻结记录ID', status VARCHAR(16) NOT NULL DEFAULT 'AVAILABLE' COMMENT '费用来源状态:AVAILABLE可结算、SETTLED资金账户已结清、SUPERSEDED已被新版本替代、VOIDED已作废', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '来源快照入池时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '来源状态最后更新时间,数据修改时自动刷新', PRIMARY KEY (id), UNIQUE KEY uk_fin_fee_source (source_system, source_type, source_fee_id, source_fee_version), KEY idx_fin_fee_source_customer (customer_id, status), KEY idx_fin_fee_source_customer_fund (customer_id, direction, settlement_mode, review_status, status, currency_code, id), KEY idx_fin_fee_source_wallet_hold (wallet_hold_id), CONSTRAINT chk_fin_fee_source_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_fee_source_amount CHECK (amount >= 0), CONSTRAINT chk_fin_fee_source_settlement CHECK ( (direction='RECEIVABLE' AND settlement_mode IS NULL AND paid_at IS NULL AND payment_method IS NULL AND payment_reference_no IS NULL AND payment_voucher_file_ids IS NULL) OR (direction='PAYABLE' AND settlement_mode='ON_ACCOUNT' AND paid_at IS NULL AND payment_method IS NULL AND payment_reference_no IS NULL AND payment_voucher_file_ids IS NULL) OR (direction='PAYABLE' AND settlement_mode='DIRECT_PAID' AND paid_at IS NOT NULL AND payment_method IN ('ONLINE','BANK_TRANSFER','CASH','OTHER') AND (payment_reference_no IS NOT NULL OR JSON_LENGTH(payment_voucher_file_ids)>0)) ) ) ENGINE=InnoDB COMMENT='多业务系统费用来源快照池;账单人工选择并固化明细'; CREATE TABLE IF NOT EXISTS fin_inbox_event ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', event_id VARCHAR(128) NOT NULL COMMENT '来源系统事件唯一ID', source_system VARCHAR(32) NOT NULL COMMENT '事件来源系统标识', event_type VARCHAR(64) NOT NULL COMMENT '来源事件类型', payload JSON NOT NULL COMMENT '来源事件原始JSON载荷快照', payload_hash VARCHAR(71) NOT NULL COMMENT '规范化事件内容SHA-256哈希,兼容sha256前缀格式', result_resource_id BIGINT UNSIGNED NULL COMMENT '成功处理生成或定位的费用来源快照ID', error_code VARCHAR(64) NULL COMMENT '处理失败时的稳定FIN错误码', status VARCHAR(16) NOT NULL DEFAULT 'RECEIVED' COMMENT '事件处理状态:RECEIVED已接收、PROCESSED已完成、FAILED处理失败', received_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '事件接收时间', processed_at DATETIME(3) NULL COMMENT '事件处理完成时间,未完成时为空', PRIMARY KEY (id), UNIQUE KEY uk_fin_inbox_event (source_system, event_id) ) ENGINE=InnoDB COMMENT='多业务系统费用事件幂等接收记录'; CREATE TABLE IF NOT EXISTS fin_subject ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', subject_code VARCHAR(64) NOT NULL COMMENT '平台财务主体唯一编码', subject_name VARCHAR(200) NOT NULL COMMENT '平台收付款及核算主体名称', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '财务主体状态,ACTIVE表示启用', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', created_by BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建操作人ID,0表示系统初始化', updated_by BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后修改操作人ID,0表示系统初始化', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间,数据修改时自动刷新', PRIMARY KEY (id), UNIQUE KEY uk_fin_subject_code (subject_code) ) ENGINE=InnoDB COMMENT='平台财务主体;首期仅一个有效主体'; INSERT INTO fin_subject (subject_code, subject_name, status, version, created_by, updated_by) VALUES ('PLATFORM_DEFAULT', '平台', 'ACTIVE', 0, 0, 0) ON DUPLICATE KEY UPDATE subject_name = VALUES(subject_name), status = 'ACTIVE', updated_by = 0; CREATE TABLE IF NOT EXISTS fin_customer_settlement_profile ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', customer_name_snapshot VARCHAR(200) NOT NULL COMMENT '客户名称快照,客户主数据后续变更不追改', credit_days INT UNSIGNED NOT NULL DEFAULT 30 COMMENT '客户账期自然日数,默认30天', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '客户结算配置状态,ACTIVE表示启用', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建操作人ID', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间,数据修改时自动刷新', PRIMARY KEY (id), UNIQUE KEY uk_fin_customer_profile (tenant_id), CONSTRAINT chk_fin_customer_profile_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_customer_profile_days CHECK (credit_days <= 3650) ) ENGINE=InnoDB COMMENT='客户结算配置;一客户一个结算对象'; CREATE TABLE IF NOT EXISTS fin_bill ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', bill_no VARCHAR(64) NOT NULL COMMENT '客户范围内唯一账单编号', subject_id BIGINT UNSIGNED NOT NULL COMMENT '平台财务主体ID', customer_name_snapshot VARCHAR(200) NOT NULL COMMENT '出账时客户名称快照', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', bill_date DATE NOT NULL COMMENT '账单日期', due_date DATE NOT NULL COMMENT '到期日期,由账单日期加客户账期计算', status VARCHAR(24) NOT NULL DEFAULT 'DRAFT' COMMENT '账单状态:DRAFT草稿、ISSUED已出账、PARTIALLY_PAID部分收款、PAID已收清、VOIDED已作废', total_amount DECIMAL(20,6) NOT NULL DEFAULT 0 COMMENT '账单全部明细总金额,精度6位小数', received_amount DECIMAL(20,6) NOT NULL DEFAULT 0 COMMENT '账单累计已收金额,精度6位小数', outstanding_amount DECIMAL(20,6) NOT NULL DEFAULT 0 COMMENT '账单未收余额,精度6位小数', remark VARCHAR(500) NULL COMMENT '平台账单内部备注', issued_at DATETIME(3) NULL COMMENT '出账时间,未出账时为空', issued_by BIGINT UNSIGNED NULL COMMENT '出账操作人ID,未出账时为空', customer_confirmation_status VARCHAR(24) NOT NULL DEFAULT 'NOT_REQUIRED' COMMENT '客户确认状态:NOT_REQUIRED无需确认、PENDING_CONFIRMATION待确认、CONFIRMED已确认', customer_confirmed_by BIGINT UNSIGNED NULL COMMENT '客户确认人用户ID', customer_confirmed_by_name VARCHAR(128) NULL COMMENT '客户确认人姓名快照', customer_confirmed_at DATETIME(3) NULL COMMENT '客户确认时间', voided_at DATETIME(3) NULL COMMENT '作废时间,未作废时为空', voided_by BIGINT UNSIGNED NULL COMMENT '作废操作人ID,未作废时为空', void_reason VARCHAR(500) NULL COMMENT '账单作废原因', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建操作人ID', created_by_name VARCHAR(128) NULL COMMENT '创建操作人名称快照', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', updated_by_name VARCHAR(128) NULL COMMENT '最后修改操作人名称快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间,数据修改时自动刷新', PRIMARY KEY (id), UNIQUE KEY uk_fin_bill_no (tenant_id, bill_no), KEY idx_fin_bill_customer_status_date (tenant_id, status, bill_date), CONSTRAINT chk_fin_bill_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_bill_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_bill_amounts CHECK (total_amount >= 0 AND received_amount >= 0 AND outstanding_amount >= 0) ) ENGINE=InnoDB COMMENT='客户CNY账单;首期账单即应收台账'; CREATE TABLE IF NOT EXISTS fin_bill_line ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', bill_id BIGINT UNSIGNED NOT NULL COMMENT '所属账单ID', source_type VARCHAR(32) NOT NULL DEFAULT 'FIRSTLEG_FEE' COMMENT '费用来源类型,FIRSTLEG_FEE表示头程费用', source_id BIGINT UNSIGNED NOT NULL COMMENT '来源费用ID', source_version INT UNSIGNED NOT NULL COMMENT '出账固化的来源费用版本号', source_no VARCHAR(64) NULL COMMENT '来源费用单号快照,可为空', order_id BIGINT UNSIGNED NULL COMMENT '来源头程订单ID,可为空', inbound_id BIGINT UNSIGNED NULL COMMENT '来源入库单ID,可为空', fee_item_code VARCHAR(64) NOT NULL COMMENT '出账时费用项目编码快照', fee_item_name VARCHAR(200) NOT NULL COMMENT '出账时费用项目名称快照', amount DECIMAL(20,6) NOT NULL COMMENT '账单明细金额,精度6位小数', adjustment_reason VARCHAR(500) NULL COMMENT '最近一次账单调整行原因;完整历史保存在修订与审计记录', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '账单明细创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_bill_line_source (source_type, source_id, source_version), KEY idx_fin_bill_line_bill (tenant_id, bill_id), CONSTRAINT chk_fin_bill_line_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_bill_line_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_bill_line_amount CHECK (amount >= 0) ) ENGINE=InnoDB COMMENT='账单费用来源快照明细'; CREATE TABLE IF NOT EXISTS fin_receipt ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', receipt_no VARCHAR(64) NOT NULL COMMENT '客户范围内唯一收款编号', subject_id BIGINT UNSIGNED NOT NULL COMMENT '实际收款的平台财务主体ID', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', received_amount DECIMAL(20,6) NOT NULL COMMENT '本次实际到账金额,精度6位小数', received_at DATETIME(3) NOT NULL COMMENT '实际到账时间', payment_method VARCHAR(32) NULL COMMENT '收款方式编码', voucher_no VARCHAR(128) NULL COMMENT '银行流水号或线下收款凭证号', voucher_file_ids JSON NOT NULL COMMENT 'File服务财务凭证文件ID字符串数组JSON', status VARCHAR(16) NOT NULL DEFAULT 'CONFIRMED' COMMENT '收款状态:CONFIRMED已确认、VOIDED已作废', remark VARCHAR(500) NULL COMMENT '平台收款内部备注', voided_at DATETIME(3) NULL COMMENT '收款作废时间', voided_by BIGINT UNSIGNED NULL COMMENT '收款作废操作人ID', void_reason VARCHAR(500) NULL COMMENT '收款作废原因', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建操作人ID', created_by_name VARCHAR(128) NULL COMMENT '创建操作人名称快照', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间,数据修改时自动刷新', PRIMARY KEY (id), UNIQUE KEY uk_fin_receipt_no (tenant_id, receipt_no), KEY idx_fin_receipt_customer_time (tenant_id, received_at), CONSTRAINT chk_fin_receipt_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_receipt_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_receipt_amount CHECK (received_amount > 0) ) ENGINE=InnoDB COMMENT='平台财务人工登记收款及凭证'; CREATE TABLE IF NOT EXISTS fin_receipt_bill ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', receipt_id BIGINT UNSIGNED NOT NULL COMMENT '收款记录ID', bill_id BIGINT UNSIGNED NOT NULL COMMENT '被分配收款的账单ID', applied_amount DECIMAL(20,6) NOT NULL COMMENT '本笔收款分配到该账单的金额,精度6位小数', created_by BIGINT UNSIGNED NOT NULL COMMENT '分配操作人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '收款分配创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_receipt_bill_pair (receipt_id, bill_id), KEY idx_fin_receipt_bill_bill (tenant_id, bill_id), CONSTRAINT chk_fin_receipt_bill_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_receipt_bill_amount CHECK (applied_amount > 0) ) ENGINE=InnoDB COMMENT='人工收款对应账单金额;UI不使用复杂核销术语'; CREATE TABLE IF NOT EXISTS fin_cost ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', cost_no VARCHAR(64) NOT NULL COMMENT '客户范围内唯一成本编号', cost_type VARCHAR(24) NOT NULL COMMENT '成本归属类型:SINGLE_ORDER单票、CONTAINER_SHARED整柜公共、SOURCE_DIRECT_PAID来源直接已付', cost_origin VARCHAR(24) NOT NULL DEFAULT 'MANUAL' COMMENT '成本来源:MANUAL人工补充、FIRSTLEG_DIRECT_PAID头程直接已付、BUSINESS_DIRECT_PAID其他业务直接已付', source_system VARCHAR(32) NULL COMMENT '直接已付来源系统,如FIRSTLEG或LASTLEG', source_type VARCHAR(32) NULL COMMENT '来源费用类型快照', source_fee_id BIGINT UNSIGNED NULL COMMENT '来源费用ID', source_fee_version INT UNSIGNED NULL COMMENT '来源费用版本', source_hash VARCHAR(71) NULL COMMENT '来源不可变快照SHA-256,兼容sha256前缀格式', order_id BIGINT UNSIGNED NULL COMMENT '成本归属的头程订单ID,单票成本必填', inbound_id BIGINT UNSIGNED NULL COMMENT '成本关联的入库单ID,可为空', container_id BIGINT UNSIGNED NULL COMMENT 'Firstleg真实货柜containerBookingId,整柜公共成本必填', warehouse_id BIGINT UNSIGNED NULL COMMENT '业务直接已付成本关联仓库ID,可为空', supplier_id BIGINT UNSIGNED NULL COMMENT 'Warehouse公共往来单位或供应商引用ID', supplier_name_snapshot VARCHAR(200) NULL COMMENT '登记成本时供应商或成本对象名称快照', fee_item_code VARCHAR(64) NOT NULL COMMENT '成本费用项目编码快照', fee_item_name VARCHAR(200) NOT NULL COMMENT '成本费用项目名称快照', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', cost_amount DECIMAL(20,6) NOT NULL COMMENT '成本总金额;来源直接已付且CONFIRMED计入已线下支付供应商款', voucher_file_ids JSON NOT NULL COMMENT 'File服务财务凭证文件ID字符串数组JSON', paid_at DATETIME(3) NULL COMMENT '直接已付时间;人工补充成本可为空', payment_method VARCHAR(32) NULL COMMENT '直接已付方式:ONLINE、BANK_TRANSFER、CASH、OTHER', payment_reference_no VARCHAR(128) NULL COMMENT '直接已付流水号', status VARCHAR(16) NOT NULL DEFAULT 'DRAFT' COMMENT '成本状态:DRAFT草稿、CONFIRMED已确认、VOIDED已作废', remark VARCHAR(500) NULL COMMENT '平台成本内部备注', confirmed_at DATETIME(3) NULL COMMENT '成本确认时间', confirmed_by BIGINT UNSIGNED NULL COMMENT '成本确认操作人ID', voided_at DATETIME(3) NULL COMMENT '成本作废时间', voided_by BIGINT UNSIGNED NULL COMMENT '成本作废操作人ID', void_reason VARCHAR(500) NULL COMMENT '成本作废原因', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建操作人ID', created_by_name VARCHAR(128) NULL COMMENT '创建操作人名称快照', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间,数据修改时自动刷新', PRIMARY KEY (id), UNIQUE KEY uk_fin_cost_no (tenant_id, cost_no), UNIQUE KEY uk_fin_cost_source_version (source_system, source_type, source_fee_id, source_fee_version), KEY idx_fin_cost_ticket (tenant_id, order_id, inbound_id), KEY idx_fin_cost_container (tenant_id, container_id), KEY idx_fin_cost_customer_origin_status (tenant_id, cost_origin, status), CONSTRAINT chk_fin_cost_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_cost_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_cost_amount CHECK (cost_amount > 0), CONSTRAINT chk_fin_cost_target CHECK ( (cost_type = 'SINGLE_ORDER' AND order_id IS NOT NULL AND container_id IS NULL) OR (cost_type = 'CONTAINER_SHARED' AND container_id IS NOT NULL) OR (cost_type = 'SOURCE_DIRECT_PAID' AND (order_id IS NOT NULL OR inbound_id IS NOT NULL OR container_id IS NOT NULL OR warehouse_id IS NOT NULL)) ), CONSTRAINT chk_fin_cost_origin CHECK ( (cost_origin='MANUAL' AND source_system IS NULL AND source_type IS NULL AND source_fee_id IS NULL AND source_fee_version IS NULL AND source_hash IS NULL) OR (cost_origin='FIRSTLEG_DIRECT_PAID' AND source_system='FIRSTLEG' AND source_type IS NOT NULL AND source_fee_id IS NOT NULL AND source_fee_version IS NOT NULL AND source_hash IS NOT NULL AND status IN ('CONFIRMED','VOIDED') AND paid_at IS NOT NULL AND payment_method IN ('ONLINE','BANK_TRANSFER','CASH','OTHER')) OR (cost_origin='BUSINESS_DIRECT_PAID' AND source_system NOT IN ('', 'FIRSTLEG') AND source_type IS NOT NULL AND source_fee_id IS NOT NULL AND source_fee_version IS NOT NULL AND source_hash IS NOT NULL AND status IN ('CONFIRMED','VOIDED') AND paid_at IS NOT NULL AND payment_method IN ('ONLINE','BANK_TRANSFER','CASH','OTHER')) ) ) ENGINE=InnoDB COMMENT='成本事实;人工补充成本与业务直接已付来源成本统一留痕'; CREATE TABLE IF NOT EXISTS fin_cost_allocation ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', cost_id BIGINT UNSIGNED NOT NULL COMMENT '整柜公共成本ID', order_id BIGINT UNSIGNED NOT NULL COMMENT '参与分摊的头程订单ID', inbound_id BIGINT UNSIGNED NULL COMMENT '参与分摊订单关联的入库单ID,可为空', volume_cbm DECIMAL(20,6) NOT NULL COMMENT '该订单分摊时有效体积快照,单位CBM、精度6位', total_volume_cbm DECIMAL(20,6) NOT NULL COMMENT '柜内有效订单总体积快照,单位CBM、精度6位', allocation_rate DECIMAL(20,10) NOT NULL COMMENT '订单体积占总体积的分摊比例,精度10位', allocated_amount DECIMAL(20,6) NOT NULL COMMENT '分摊到该订单的成本金额,精度6位', rounding_adjustment TINYINT NOT NULL DEFAULT 0 COMMENT '尾差归集标记:0未归集、1该行为实际尾差归集行', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '不可变分摊快照创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_cost_allocation_order (cost_id, order_id), KEY idx_fin_cost_allocation_query (tenant_id, order_id), CONSTRAINT chk_fin_cost_allocation_volume CHECK (volume_cbm >= 0 AND total_volume_cbm > 0), CONSTRAINT chk_fin_cost_allocation_amount CHECK (allocated_amount >= 0) ) ENGINE=InnoDB COMMENT='整柜成本按有效体积分摊的可审计结果'; CREATE TABLE IF NOT EXISTS fin_bill_revision ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', bill_id BIGINT UNSIGNED NOT NULL COMMENT '被调整账单ID', version INT UNSIGNED NOT NULL COMMENT '调整前账单乐观锁版本号', reason VARCHAR(500) NULL COMMENT '本次账单调整原因', bill_snapshot JSON NOT NULL COMMENT '调整前账单主记录不可变JSON快照', line_snapshot JSON NOT NULL COMMENT '调整前全部账单明细不可变JSON数组快照', created_by BIGINT UNSIGNED NOT NULL COMMENT '执行调整的操作人ID', created_by_name VARCHAR(128) NULL COMMENT '执行调整的操作人名称快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '修订快照创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_bill_revision (bill_id, version), KEY idx_fin_bill_revision_tenant (tenant_id, bill_id) ) ENGINE=InnoDB COMMENT='出账后调整前的不可变账单及明细版本快照'; CREATE TABLE IF NOT EXISTS fin_idempotency_record ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', operator_id BIGINT UNSIGNED NOT NULL COMMENT '发起幂等写操作的操作人ID', operation VARCHAR(64) NOT NULL COMMENT '幂等隔离的财务操作类型', idempotency_key VARCHAR(128) NOT NULL COMMENT '调用方提供的幂等键', request_hash CHAR(64) NOT NULL COMMENT '规范化完整请求的SHA-256十六进制哈希', status VARCHAR(16) NOT NULL COMMENT '幂等处理状态:PROCESSING处理中、SUCCEEDED成功、FAILED失败', result_resource_id BIGINT UNSIGNED NULL COMMENT '成功操作生成或更新的业务资源ID', error_code VARCHAR(64) NULL COMMENT '失败操作的稳定业务错误码', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '幂等请求首次登记时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '幂等处理状态最后更新时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_idempotency (tenant_id, operator_id, operation, idempotency_key) ) ENGINE=InnoDB COMMENT='Finance人工写操作幂等记录'; CREATE TABLE IF NOT EXISTS fin_document_sequence ( sequence_key VARCHAR(32) NOT NULL COMMENT '单据类型与北京时间日期组合键,例如REC:20260818', current_value INT UNSIGNED NOT NULL COMMENT '该类型当日已分配的最大序号', PRIMARY KEY (sequence_key), CONSTRAINT chk_fin_document_sequence_value CHECK (current_value > 0) ) ENGINE=InnoDB COMMENT='Finance业务单号日序列;生成YYMMDD加四位当日序号'; CREATE TABLE IF NOT EXISTS fin_audit_log ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', resource_type VARCHAR(32) NOT NULL COMMENT '被审计财务资源类型', resource_id BIGINT UNSIGNED NOT NULL COMMENT '被审计财务资源ID', action VARCHAR(64) NOT NULL COMMENT '审计业务动作类型', reason VARCHAR(500) NULL COMMENT '操作原因或说明', before_data JSON NULL COMMENT '操作前业务数据JSON快照', after_data JSON NULL COMMENT '操作后业务数据JSON快照', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name_snapshot VARCHAR(128) NOT NULL COMMENT '操作发生时的操作人名称快照', request_id VARCHAR(128) NULL COMMENT '入口请求ID,用于问题定位', trace_id VARCHAR(128) NULL COMMENT '分布式调用链追踪ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '不可变审计记录创建时间', PRIMARY KEY (id), KEY idx_fin_audit_resource (tenant_id, resource_type, resource_id, created_at), KEY idx_fin_audit_operator (operator_id, created_at) ) ENGINE=InnoDB COMMENT='Finance不可变业务审计明细'; CREATE TABLE IF NOT EXISTS fin_settlement ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '正式应收或应付结算单ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', settlement_no VARCHAR(64) NOT NULL COMMENT '客户范围内唯一结算单号', direction VARCHAR(16) NOT NULL COMMENT '结算方向:RECEIVABLE应收、PAYABLE应付', customer_name_snapshot VARCHAR(200) NOT NULL COMMENT '结算生成时客户名称快照', supplier_id BIGINT UNSIGNED NULL COMMENT '应付结算供应商ID;应收结算为空', supplier_name_snapshot VARCHAR(200) NULL COMMENT '应付结算供应商名称快照', reconciliation_statement_id BIGINT UNSIGNED NULL COMMENT '应收结算关联的已出账客户对账单ID', business_period VARCHAR(32) NULL COMMENT '结算业务期间快照', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', total_amount DECIMAL(20,6) NOT NULL COMMENT '正式结算总金额,精度6位小数', paid_amount DECIMAL(20,6) NOT NULL DEFAULT 0 COMMENT '累计已收或已付金额;PAYABLE已付计入已线下支付供应商款', outstanding_amount DECIMAL(20,6) NOT NULL COMMENT '未结清金额;RECEIVABLE计待收,PAYABLE与未制单ON_ACCOUNT来源共同计待付', generated_date DATE NOT NULL COMMENT '结算单生成日期', due_date DATE NOT NULL COMMENT '结算到期日期', payment_status VARCHAR(24) NOT NULL DEFAULT 'UNPAID' COMMENT '收付款状态:UNPAID未收付、PARTIALLY_PAID部分收付、PAID已结清', status VARCHAR(24) NOT NULL DEFAULT 'ISSUED' COMMENT '结算状态:ISSUED已生效、PARTIALLY_PAID部分收付、PAID已结清、VOIDED已作废', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', created_by BIGINT UNSIGNED NOT NULL COMMENT '创建操作人ID', updated_by BIGINT UNSIGNED NOT NULL COMMENT '最后修改操作人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_settlement_no (tenant_id, settlement_no), UNIQUE KEY uk_fin_settlement_receivable_statement (tenant_id, reconciliation_statement_id, direction), KEY idx_fin_settlement_customer_direction_status (tenant_id, direction, status), KEY idx_fin_settlement_supplier_status (supplier_id, direction, status), KEY idx_fin_settlement_receivable_statistics (direction, currency_code, generated_date, status, tenant_id), CONSTRAINT chk_fin_settlement_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_settlement_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_settlement_direction CHECK (direction IN ('RECEIVABLE', 'PAYABLE')), CONSTRAINT chk_fin_settlement_amounts CHECK (total_amount >= 0 AND paid_amount >= 0 AND outstanding_amount >= 0 AND total_amount = paid_amount + outstanding_amount) ) ENGINE=InnoDB COMMENT='正式应收与应付结算单;客户账户金额由本表派生'; CREATE TABLE IF NOT EXISTS fin_settlement_line ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '正式结算单明细ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', settlement_id BIGINT UNSIGNED NOT NULL COMMENT '所属正式结算单ID', fee_source_id BIGINT UNSIGNED NOT NULL COMMENT '结算固化的Finance费用来源ID', amount DECIMAL(20,6) NOT NULL COMMENT '结算明细金额,精度6位小数', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '明细创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_settlement_line_source (settlement_id, fee_source_id), KEY idx_fin_settlement_line_customer (tenant_id, settlement_id), KEY idx_fin_settlement_line_source (fee_source_id), CONSTRAINT chk_fin_settlement_line_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_settlement_line_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_settlement_line_amount CHECK (amount > 0) ) ENGINE=InnoDB COMMENT='正式结算单费用来源金额快照明细'; CREATE TABLE IF NOT EXISTS fin_settlement_payment ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '正式结算单收付款记录ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', settlement_id BIGINT UNSIGNED NOT NULL COMMENT '所属正式结算单ID', transaction_type VARCHAR(16) NOT NULL COMMENT '交易类型:RECEIPT收款、PAYMENT付款', transaction_no VARCHAR(64) NOT NULL COMMENT '客户范围内唯一收付款业务号', transaction_date DATE NOT NULL COMMENT '实际收款或付款日期', amount DECIMAL(20,6) NOT NULL COMMENT '本次收款或付款金额,精度6位小数', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', method VARCHAR(32) NOT NULL COMMENT '人工登记的收付款方式', reference_no VARCHAR(128) NULL COMMENT '银行流水号或外部参考号', voucher_file_ids JSON NOT NULL COMMENT 'File服务财务凭证文件ID字符串数组', remark VARCHAR(500) NULL COMMENT '收付款内部备注', created_by BIGINT UNSIGNED NOT NULL COMMENT '登记操作人ID', created_by_name VARCHAR(128) NULL COMMENT '登记操作人名称快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '登记时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_settlement_payment_no (tenant_id, transaction_no), KEY idx_fin_settlement_payment_settlement (tenant_id, settlement_id, created_at), KEY idx_fin_settlement_payment_customer_type_time (tenant_id, transaction_type, created_at, settlement_id), CONSTRAINT chk_fin_settlement_payment_tenant CHECK (tenant_id > 0), CONSTRAINT chk_fin_settlement_payment_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_settlement_payment_amount CHECK (amount > 0) ) ENGINE=InnoDB COMMENT='正式结算单人工收付款与凭证记录'; -- 一件代发客户资金账户:实际余额优先,授信额度补足;冻结后结算或解冻。 CREATE TABLE IF NOT EXISTS fin_wallet_account ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和隔离键', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT '当前仅CNY', actual_balance DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '账户实际余额,包含冻结资金', frozen_balance DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '冻结总额,包含实际资金与授信冻结', available_balance DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '总可用余额=实际余额+授信额度-已用授信-冻结总额', credit_limit DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '授信额度', credit_used DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '已结算使用的授信', credit_frozen DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '冻结总额中占用的授信', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '余额乐观锁版本', created_by BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建操作人ID', updated_by BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后操作人ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_wallet_account_customer (customer_id, currency_code), CONSTRAINT chk_fin_wallet_account_customer CHECK (customer_id > 0), CONSTRAINT chk_fin_wallet_account_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_wallet_account_balance CHECK (actual_balance >= 0 AND frozen_balance >= 0 AND available_balance >= 0 AND credit_limit >= 0 AND credit_used >= 0 AND credit_frozen >= 0 AND frozen_balance >= credit_frozen AND actual_balance >= frozen_balance-credit_frozen AND credit_limit >= credit_used+credit_frozen AND available_balance = actual_balance+credit_limit-credit_used-frozen_balance) ) ENGINE=InnoDB COMMENT='客户CNY资金账户主账'; CREATE TABLE IF NOT EXISTS fin_recharge_request ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和隔离键', request_no VARCHAR(32) NOT NULL COMMENT '充值申请业务编号RC-yyMMdd-####', amount DECIMAL(20,2) NOT NULL COMMENT '申请充值金额', payment_method VARCHAR(16) NOT NULL COMMENT 'WECHAT或ALIPAY', voucher_file_id BIGINT UNSIGNED NOT NULL COMMENT '付款截图File ID', voucher_file_name VARCHAR(255) NOT NULL COMMENT '付款截图文件名快照', status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '审核状态:PENDING待审核、APPROVED已通过、REJECTED已驳回', version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核乐观锁版本', submitted_by BIGINT UNSIGNED NOT NULL COMMENT '客户提交人ID', submitted_by_name VARCHAR(128) NULL COMMENT '客户提交人名称快照', reviewed_by BIGINT UNSIGNED NULL COMMENT '平台审核人ID', reviewed_by_name VARCHAR(128) NULL COMMENT '平台审核人名称快照', review_remark VARCHAR(500) NULL COMMENT '审核说明或驳回原因', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', reviewed_at DATETIME(3) NULL COMMENT '平台审核完成时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_recharge_request_no (request_no), KEY idx_fin_recharge_customer_status (customer_id, status, created_at, id), CONSTRAINT chk_fin_recharge_customer CHECK (customer_id > 0), CONSTRAINT chk_fin_recharge_amount CHECK (amount > 0), CONSTRAINT chk_fin_recharge_method CHECK (payment_method IN ('WECHAT','ALIPAY')), CONSTRAINT chk_fin_recharge_status CHECK (status IN ('PENDING','APPROVED','REJECTED')) ) ENGINE=InnoDB COMMENT='客户付款截图充值申请;平台审核通过后入账'; CREATE TABLE IF NOT EXISTS fin_wallet_ledger ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和隔离键', business_no VARCHAR(32) NOT NULL COMMENT '账户变动业务编号AC-yyMMdd-####', change_type VARCHAR(16) NOT NULL COMMENT '变动类型:充值、扣款、冻结、解冻、消费或授信调整', amount DECIMAL(20,2) NOT NULL COMMENT '带方向变动金额,充值为正、扣款为负', actual_balance_after DECIMAL(20,2) NOT NULL COMMENT '变动后实际余额', frozen_balance_after DECIMAL(20,2) NOT NULL COMMENT '变动后冻结金额', available_balance_after DECIMAL(20,2) NOT NULL COMMENT '变动后可用余额', credit_limit_after DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '变动后授信额度', credit_used_after DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '变动后已用授信', available_credit_after DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '变动后可用授信', source_type VARCHAR(32) NOT NULL COMMENT 'CLIENT_RECHARGE/MANUAL_RECHARGE/MANUAL_DEDUCTION等', source_no VARCHAR(128) NULL COMMENT '充值申请号或外部凭证号', occurred_date DATE NOT NULL COMMENT '业务发生日期', payment_method VARCHAR(32) NULL COMMENT '充值或扣款方式', reference_no VARCHAR(128) NULL COMMENT '收款凭证号或关联单据号', operator_id BIGINT UNSIGNED NOT NULL COMMENT '操作人ID', operator_name VARCHAR(128) NULL COMMENT '操作人名称快照', remark VARCHAR(500) NULL COMMENT '变动说明', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_wallet_ledger_no (business_no), KEY idx_fin_wallet_ledger_customer_time (customer_id, created_at, id), KEY idx_fin_wallet_ledger_source (customer_id, source_type, source_no), CONSTRAINT chk_fin_wallet_ledger_customer CHECK (customer_id > 0), CONSTRAINT chk_fin_wallet_ledger_amount CHECK (amount <> 0), CONSTRAINT chk_fin_wallet_ledger_balance CHECK (actual_balance_after >= 0 AND frozen_balance_after >= 0 AND available_balance_after >= 0 AND credit_limit_after >= 0 AND credit_used_after >= 0 AND available_credit_after >= 0 AND credit_limit_after >= credit_used_after+available_credit_after AND available_balance_after = actual_balance_after-frozen_balance_after+credit_limit_after-credit_used_after) ) ENGINE=InnoDB COMMENT='客户资金账户不可变余额流水'; CREATE TABLE IF NOT EXISTS fin_wallet_hold ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和隔离键', business_type VARCHAR(32) NOT NULL COMMENT '调用方业务类型', business_no VARCHAR(128) NOT NULL COMMENT '调用方业务单号', amount DECIMAL(20,2) NOT NULL COMMENT '冻结总额', actual_frozen_amount DECIMAL(20,2) NOT NULL COMMENT '冻结时占用实际资金', credit_frozen_amount DECIMAL(20,2) NOT NULL COMMENT '冻结时占用授信', status VARCHAR(16) NOT NULL COMMENT '冻结状态:FROZEN冻结中、SETTLED已结算、RELEASED已释放', freeze_ledger_id BIGINT UNSIGNED NULL COMMENT '冻结流水ID', action_ledger_id BIGINT UNSIGNED NULL COMMENT '结算或解冻流水ID', remark VARCHAR(500) NULL COMMENT '业务说明', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '冻结记录创建时间', completed_at DATETIME(3) NULL COMMENT '结算或释放完成时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间', PRIMARY KEY (id), UNIQUE KEY uk_fin_wallet_hold_business (customer_id,business_type,business_no), KEY idx_fin_wallet_hold_status (customer_id,status,created_at,id), CONSTRAINT chk_fin_wallet_hold_customer CHECK (customer_id > 0), CONSTRAINT chk_fin_wallet_hold_amount CHECK (amount > 0 AND actual_frozen_amount >= 0 AND credit_frozen_amount >= 0 AND amount=actual_frozen_amount+credit_frozen_amount), CONSTRAINT chk_fin_wallet_hold_status CHECK (status IN ('FROZEN','SETTLED','RELEASED')) ) ENGINE=InnoDB COMMENT='客户资金冻结及结算生命周期'; CREATE TABLE IF NOT EXISTS fin_wallet_command_inbox ( event_id VARCHAR(64) NOT NULL COMMENT '海外资金指令事件ID', event_type VARCHAR(96) NOT NULL COMMENT '事件类型', payload_hash VARCHAR(71) NOT NULL COMMENT '规范化载荷SHA-256,包含sha256:前缀', payload_json JSON NOT NULL COMMENT '冻结事件信封', status VARCHAR(16) NOT NULL COMMENT 'PROCESSING、SUCCEEDED或FAILED', result_json JSON NULL COMMENT '最终资金执行结果', received_at DATETIME(3) NOT NULL COMMENT '接收时间', processed_at DATETIME(3) NULL COMMENT '处理完成时间', PRIMARY KEY (event_id), KEY idx_fin_wallet_command_status (status,received_at) ) ENGINE=InnoDB COMMENT='跨区客户资金指令幂等收件箱'; CREATE TABLE IF NOT EXISTS fin_wallet_event_outbox ( event_id VARCHAR(64) NOT NULL COMMENT '资金结果事件ID', event_key VARCHAR(160) NOT NULL COMMENT '业务幂等键', payload_json JSON NOT NULL COMMENT '完整事件信封', status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING、SENDING、PUBLISHED或DEAD', retry_count INT NOT NULL DEFAULT 0 COMMENT '失败次数', next_retry_at DATETIME(3) NOT NULL COMMENT '下次投递时间', locked_by VARCHAR(128) NULL COMMENT '租约持有者', locked_at DATETIME(3) NULL COMMENT '租约时间', published_at DATETIME(3) NULL COMMENT '投递完成时间', last_error VARCHAR(1000) NULL COMMENT '最后失败摘要', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (event_id), UNIQUE KEY uk_fin_wallet_event_key (event_key), KEY idx_fin_wallet_event_publish (status,next_retry_at,created_at) ) ENGINE=InnoDB COMMENT='国内Finance到海外资金结果可靠发送箱';