This commit is contained in:
2026-08-13 16:14:54 +08:00
parent 8bcd23f307
commit 226ef6a839
20 changed files with 486 additions and 58 deletions
@@ -10436,6 +10436,80 @@ CREATE TABLE IF NOT EXISTS fin_audit_log (
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 '累计已收或已付金额,精度6位小数',
outstanding_amount DECIMAL(20,6) NOT NULL COMMENT '未结清金额,精度6位小数',
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),
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_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),
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='正式结算单人工收付款与凭证记录';
USE baiyue_firstleg;
-- 来源:firstleg/src/main/resources/db/finance-fee-source-migration.sql
-- Firstleg -> Finance 费用来源事件和柜次费用模型(MySQL 8,可重复执行)
@@ -13569,11 +13643,19 @@ BEGIN
WHERE table_schema = 'baiyue_finance'
AND table_name IN ('fin_fee_source', 'fin_inbox_event', 'fin_subject',
'fin_customer_settlement_profile', 'fin_bill', 'fin_bill_line',
'fin_receipt', 'fin_receipt_bill', 'fin_cost', 'fin_cost_allocation',
'fin_bill_revision', 'fin_idempotency_record', 'fin_audit_log')) <> 13 THEN
'fin_receipt', 'fin_receipt_bill', 'fin_cost', 'fin_cost_allocation',
'fin_bill_revision', 'fin_idempotency_record', 'fin_audit_log',
'fin_settlement', 'fin_settlement_line', 'fin_settlement_payment')) <> 16 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '统一迁移失败:Finance 首期人工财务表未完整创建';
END IF;
IF (SELECT COUNT(*) FROM information_schema.statistics
WHERE table_schema='baiyue_finance' AND table_name='fin_settlement'
AND index_name='idx_fin_settlement_customer_direction_status'
AND column_name IN ('tenant_id','direction','status')) <> 3 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '统一迁移失败:Finance 客户结算汇总索引未完整创建';
END IF;
IF (SELECT COUNT(*) FROM information_schema.columns
WHERE table_schema = 'baiyue_finance'
AND ((table_name = 'fin_customer_settlement_profile' AND column_name IN ('tenant_id', 'credit_days'))