669 lines
48 KiB
SQL
669 lines
48 KiB
SQL
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 fin_vehicle_cost (
|
||
id BIGINT NOT NULL COMMENT '公司费用主键',
|
||
subject_id BIGINT UNSIGNED NOT NULL COMMENT '平台财务主体',
|
||
cost_no VARCHAR(64) NOT NULL COMMENT '公司车辆费用编号',
|
||
source_type VARCHAR(32) NOT NULL COMMENT '费用来源类型',
|
||
source_no VARCHAR(64) NOT NULL COMMENT '来源业务编号',
|
||
source_version BIGINT NOT NULL COMMENT '来源快照版本',
|
||
source_hash VARCHAR(71) NOT NULL COMMENT '来源内容摘要',
|
||
source_json JSON NOT NULL COMMENT '原币及折算不可变来源快照',
|
||
supplier_id BIGINT NOT NULL COMMENT '收款供应商标识',
|
||
supplier_name VARCHAR(200) NOT NULL COMMENT '供应商名称快照',
|
||
amount DECIMAL(17,2) NOT NULL COMMENT 'CNY公司费用金额',
|
||
paid_amount DECIMAL(17,2) NOT NULL DEFAULT 0 COMMENT 'CNY累计实际付款',
|
||
status VARCHAR(32) NOT NULL COMMENT '入账与付款状态',
|
||
record_version BIGINT NOT NULL COMMENT '并发版本',
|
||
created_at DATETIME(3) NOT NULL COMMENT '创建时间UTC',
|
||
updated_at DATETIME(3) NOT NULL COMMENT '更新时间UTC',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_fin_vehicle_cost_no (cost_no),
|
||
UNIQUE KEY uk_fin_vehicle_cost_source (subject_id,source_type,source_no),
|
||
KEY idx_fin_vehicle_cost_page (subject_id,updated_at,id),
|
||
CONSTRAINT fk_fin_vehicle_cost_subject FOREIGN KEY (subject_id) REFERENCES fin_subject(id),
|
||
CONSTRAINT chk_fin_vehicle_cost_amount CHECK (amount>0 AND paid_amount>=0 AND paid_amount<=amount),
|
||
CONSTRAINT chk_fin_vehicle_cost_owner CHECK (subject_id>0 AND supplier_id>0),
|
||
CONSTRAINT chk_fin_vehicle_cost_status CHECK (status IN ('PENDING','APPROVED','PARTIALLY_PAID','PAID','VOIDED'))
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司车辆费用,不进入客户账务';
|
||
|
||
CREATE TABLE fin_vehicle_cost_revision (
|
||
id BIGINT NOT NULL COMMENT '公司车辆费用历史主键',
|
||
cost_id BIGINT NOT NULL COMMENT '所属公司费用',
|
||
record_version BIGINT NOT NULL COMMENT '费用版本',
|
||
action VARCHAR(32) NOT NULL COMMENT '接收入账作废付款动作',
|
||
request_key VARCHAR(128) NOT NULL COMMENT '动作幂等键',
|
||
request_hash VARCHAR(71) NOT NULL COMMENT '请求摘要',
|
||
operator_id BIGINT NOT NULL COMMENT '操作人或系统标识',
|
||
operator_name VARCHAR(128) NOT NULL COMMENT '操作人名称快照',
|
||
reason VARCHAR(1000) NULL COMMENT '更正或操作说明',
|
||
snapshot_json JSON NOT NULL COMMENT '不可变费用快照',
|
||
occurred_at DATETIME(3) NOT NULL COMMENT '操作时间UTC',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_fin_vehicle_cost_revision (cost_id,record_version),
|
||
UNIQUE KEY uk_fin_vehicle_cost_request (operator_id,action,request_key),
|
||
CONSTRAINT fk_fin_vehicle_revision_cost FOREIGN KEY (cost_id) REFERENCES fin_vehicle_cost(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司车辆费用不可变审计';
|
||
|
||
CREATE TABLE fin_vehicle_cost_payment (
|
||
id BIGINT NOT NULL COMMENT '公司车辆付款主键',
|
||
cost_id BIGINT NOT NULL COMMENT '所属公司费用',
|
||
payment_no VARCHAR(64) NOT NULL COMMENT '公司付款业务编号',
|
||
amount DECIMAL(17,2) NOT NULL COMMENT 'CNY实际付款金额',
|
||
payment_json JSON NOT NULL COMMENT '实际付款及凭证不可变快照',
|
||
created_at DATETIME(3) NOT NULL COMMENT '付款登记时间UTC',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_fin_vehicle_payment_no (payment_no),
|
||
KEY idx_fin_vehicle_payment_cost (cost_id,id),
|
||
CONSTRAINT fk_fin_vehicle_payment_cost FOREIGN KEY (cost_id) REFERENCES fin_vehicle_cost(id),
|
||
CONSTRAINT chk_fin_vehicle_payment_amount CHECK (amount>0)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司车辆实际付款记录';
|
||
|
||
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 '冻结总额中占用的授信',
|
||
credit_expires_on DATE NULL 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 (frozen_balance >= 0 AND credit_limit >= 0 AND credit_used >= 0 AND credit_frozen >= 0 AND frozen_balance >= credit_frozen)
|
||
) 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 '申请充值金额',
|
||
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_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 '变动后可用授信',
|
||
credit_expires_on_after DATE NULL 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 OR change_type='CREDIT_LIMIT'),
|
||
CONSTRAINT chk_fin_wallet_ledger_balance CHECK (frozen_balance_after >= 0 AND credit_limit_after >= 0 AND credit_used_after >= 0 AND available_credit_after >= 0)
|
||
) 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到海外资金结果可靠发送箱';
|
||
|
||
CREATE TABLE IF NOT EXISTS event_delivery_retry_audit (
|
||
request_id VARCHAR(36) NOT NULL COMMENT '人工重试请求UUID和幂等键',
|
||
producer_table VARCHAR(64) NOT NULL COMMENT '本服务发件箱表名',
|
||
entry_id VARCHAR(64) NOT NULL COMMENT '发件箱记录主键',
|
||
event_id VARCHAR(128) NOT NULL COMMENT '原事件全局标识',
|
||
event_type VARCHAR(64) NOT NULL COMMENT '原事件类型',
|
||
payload_hash VARCHAR(71) NOT NULL COMMENT '原事件不可变负载摘要',
|
||
operator_name VARCHAR(128) NOT NULL COMMENT '持有运维凭据的操作人标识',
|
||
reason VARCHAR(500) NOT NULL COMMENT '人工重试原因',
|
||
previous_failures INT NOT NULL COMMENT '重试前累计失败次数',
|
||
previous_error VARCHAR(1000) NULL COMMENT '重试前最后一次脱敏错误',
|
||
requested_at DATETIME(3) NOT NULL COMMENT '重试申请提交时间',
|
||
PRIMARY KEY (request_id),
|
||
KEY idx_event_retry_entry (producer_table,entry_id,requested_at),
|
||
KEY idx_event_retry_event (event_id,requested_at)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务事件人工重试审计,与恢复待发送状态同事务提交';
|
||
|
||
CREATE TABLE IF NOT EXISTS event_delivery_attempt (
|
||
attempt_id VARCHAR(36) NOT NULL COMMENT '本次投递租约UUID和审计主键',
|
||
service_name VARCHAR(32) NOT NULL COMMENT '本库所属生产服务',
|
||
event_type VARCHAR(96) NOT NULL COMMENT '白名单业务事件类型',
|
||
entry_id VARCHAR(128) NOT NULL COMMENT '生产者发件箱主键',
|
||
event_id VARCHAR(128) NULL COMMENT '合法原事件UUID或ULID;格式错误时为空',
|
||
target_name VARCHAR(64) NOT NULL COMMENT '固定目标业务服务',
|
||
started_at DATETIME(3) NOT NULL COMMENT '领取及审计事务提交前的开始时间',
|
||
finished_at DATETIME(3) NULL COMMENT '尝试完成或租约过期恢复时间',
|
||
duration_ms BIGINT NULL COMMENT '尝试耗时毫秒',
|
||
outcome VARCHAR(24) NOT NULL COMMENT 'STARTED/APPLIED/DUPLICATE/STALE/RETRY/DEAD/LEASE_EXPIRED',
|
||
error_code VARCHAR(64) NULL COMMENT '有限错误类别或HTTP状态;不含载荷与令牌',
|
||
next_retry_at DATETIME(3) NULL COMMENT '本次失败后下次计划投递时间',
|
||
PRIMARY KEY (attempt_id),
|
||
KEY idx_delivery_attempt_entry (service_name,entry_id,started_at),
|
||
KEY idx_delivery_attempt_outcome (outcome,started_at)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='本服务业务事件逐次投递审计';
|