This commit is contained in:
2026-08-11 09:25:41 +08:00
parent 66b3a0cc9b
commit 540a6f5d88
18 changed files with 757 additions and 90 deletions
+227
View File
@@ -0,0 +1,227 @@
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_subject (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
subject_code VARCHAR(64) NOT NULL,
subject_name VARCHAR(200) NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE',
version INT UNSIGNED NOT NULL DEFAULT 0,
created_by BIGINT UNSIGNED NOT NULL DEFAULT 0,
updated_by BIGINT UNSIGNED NOT NULL DEFAULT 0,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_fin_subject_code (subject_code)
) ENGINE=InnoDB COMMENT='平台财务主体;首期仅一个有效主体';
CREATE TABLE IF NOT EXISTS fin_customer_settlement_profile (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键',
customer_name_snapshot VARCHAR(200) NOT NULL,
credit_days INT UNSIGNED NOT NULL DEFAULT 30 COMMENT '默认30个自然日',
status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE',
version INT UNSIGNED NOT NULL DEFAULT 0,
created_by BIGINT UNSIGNED NOT NULL,
updated_by BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
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,
tenant_id BIGINT UNSIGNED NOT NULL,
bill_no VARCHAR(64) NOT NULL,
subject_id BIGINT UNSIGNED NOT NULL,
customer_name_snapshot VARCHAR(200) NOT NULL,
currency_code CHAR(3) NOT NULL DEFAULT 'CNY',
bill_date DATE NOT NULL,
due_date DATE NOT NULL,
status VARCHAR(24) NOT NULL DEFAULT 'DRAFT' COMMENT 'DRAFT/ISSUED/PARTIALLY_PAID/PAID/VOIDED',
total_amount DECIMAL(20,6) NOT NULL DEFAULT 0,
received_amount DECIMAL(20,6) NOT NULL DEFAULT 0,
outstanding_amount DECIMAL(20,6) NOT NULL DEFAULT 0,
remark VARCHAR(500) NULL,
issued_at DATETIME(3) NULL,
issued_by BIGINT UNSIGNED NULL,
voided_at DATETIME(3) NULL,
voided_by BIGINT UNSIGNED NULL,
void_reason VARCHAR(500) NULL,
version INT UNSIGNED NOT NULL DEFAULT 0,
created_by BIGINT UNSIGNED NOT NULL,
updated_by BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
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,
tenant_id BIGINT UNSIGNED NOT NULL,
bill_id BIGINT UNSIGNED NOT NULL,
source_type VARCHAR(32) NOT NULL DEFAULT 'FIRSTLEG_FEE',
source_id BIGINT UNSIGNED NOT NULL,
source_version INT UNSIGNED NOT NULL,
source_no VARCHAR(64) NULL,
order_id BIGINT UNSIGNED NULL,
inbound_id BIGINT UNSIGNED NULL,
fee_item_code VARCHAR(64) NOT NULL,
fee_item_name VARCHAR(200) NOT NULL,
amount DECIMAL(20,6) NOT NULL,
currency_code CHAR(3) NOT NULL DEFAULT 'CNY',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
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,
tenant_id BIGINT UNSIGNED NOT NULL,
receipt_no VARCHAR(64) NOT NULL,
subject_id BIGINT UNSIGNED NOT NULL,
currency_code CHAR(3) NOT NULL DEFAULT 'CNY',
received_amount DECIMAL(20,6) NOT NULL,
received_at DATETIME(3) NOT NULL,
payment_method VARCHAR(32) NULL,
voucher_no VARCHAR(128) NULL,
voucher_file_ids JSON NOT NULL COMMENT 'File服务文件ID字符串数组',
status VARCHAR(16) NOT NULL DEFAULT 'CONFIRMED' COMMENT 'CONFIRMED/VOIDED',
remark VARCHAR(500) NULL,
voided_at DATETIME(3) NULL,
voided_by BIGINT UNSIGNED NULL,
void_reason VARCHAR(500) NULL,
version INT UNSIGNED NOT NULL DEFAULT 0,
created_by BIGINT UNSIGNED NOT NULL,
updated_by BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
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,
tenant_id BIGINT UNSIGNED NOT NULL,
receipt_id BIGINT UNSIGNED NOT NULL,
bill_id BIGINT UNSIGNED NOT NULL,
applied_amount DECIMAL(20,6) NOT NULL,
created_by BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
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,
tenant_id BIGINT UNSIGNED NOT NULL,
cost_no VARCHAR(64) NOT NULL,
cost_type VARCHAR(24) NOT NULL COMMENT 'TICKET/CONTAINER',
order_id BIGINT UNSIGNED NULL,
inbound_id BIGINT UNSIGNED NULL,
container_id BIGINT UNSIGNED NULL,
supplier_id BIGINT UNSIGNED NULL,
supplier_name_snapshot VARCHAR(200) NULL,
fee_item_code VARCHAR(64) NOT NULL,
fee_item_name VARCHAR(200) NOT NULL,
currency_code CHAR(3) NOT NULL DEFAULT 'CNY',
cost_amount DECIMAL(20,6) NOT NULL,
voucher_file_ids JSON NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'DRAFT' COMMENT 'DRAFT/CONFIRMED/VOIDED',
remark VARCHAR(500) NULL,
confirmed_at DATETIME(3) NULL,
confirmed_by BIGINT UNSIGNED NULL,
voided_at DATETIME(3) NULL,
voided_by BIGINT UNSIGNED NULL,
void_reason VARCHAR(500) NULL,
version INT UNSIGNED NOT NULL DEFAULT 0,
created_by BIGINT UNSIGNED NOT NULL,
updated_by BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_fin_cost_no (tenant_id, cost_no),
KEY idx_fin_cost_ticket (tenant_id, order_id, inbound_id),
KEY idx_fin_cost_container (tenant_id, container_id),
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 = 'TICKET' AND order_id IS NOT NULL AND container_id IS NULL)
OR (cost_type = 'CONTAINER' AND container_id IS NOT NULL)
)
) ENGINE=InnoDB COMMENT='人工成本;单票直接归属,整柜按体积分摊';
CREATE TABLE IF NOT EXISTS fin_cost_allocation (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
tenant_id BIGINT UNSIGNED NOT NULL,
cost_id BIGINT UNSIGNED NOT NULL,
order_id BIGINT UNSIGNED NOT NULL,
inbound_id BIGINT UNSIGNED NULL,
volume_cbm DECIMAL(20,6) NOT NULL,
total_volume_cbm DECIMAL(20,6) NOT NULL,
allocation_rate DECIMAL(20,10) NOT NULL,
allocated_amount DECIMAL(20,6) NOT NULL,
rounding_adjustment TINYINT NOT NULL DEFAULT 0 COMMENT '1表示尾差归集行',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
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_idempotency_record (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
tenant_id BIGINT UNSIGNED NOT NULL,
operator_id BIGINT UNSIGNED NOT NULL,
operation VARCHAR(64) NOT NULL,
idempotency_key VARCHAR(128) NOT NULL,
request_hash CHAR(64) NOT NULL,
status VARCHAR(16) NOT NULL COMMENT 'PROCESSING/SUCCEEDED/FAILED',
result_resource_id BIGINT UNSIGNED NULL,
error_code VARCHAR(64) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
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_audit_log (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
tenant_id BIGINT UNSIGNED NOT NULL,
resource_type VARCHAR(32) NOT NULL,
resource_id BIGINT UNSIGNED NOT NULL,
action VARCHAR(64) NOT NULL,
reason VARCHAR(500) NULL,
before_data JSON NULL,
after_data JSON NULL,
operator_id BIGINT UNSIGNED NOT NULL,
operator_name_snapshot VARCHAR(128) NOT NULL,
request_id VARCHAR(128) NULL,
trace_id VARCHAR(128) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
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不可变业务审计明细';