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, source_system VARCHAR(32) NOT NULL DEFAULT 'FIRSTLEG', source_fee_id BIGINT UNSIGNED NOT NULL, source_fee_version INT UNSIGNED NOT NULL, customer_id BIGINT UNSIGNED NOT NULL, order_id BIGINT UNSIGNED NULL, inbound_id BIGINT UNSIGNED NULL, fee_item_name VARCHAR(200) NOT NULL, amount DECIMAL(20,6) NOT NULL, currency_code CHAR(3) NOT NULL DEFAULT 'CNY', status VARCHAR(16) NOT NULL DEFAULT 'AVAILABLE', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_fin_fee_source (source_system, source_fee_id, source_fee_version), KEY idx_fin_fee_source_customer (customer_id, status), CONSTRAINT chk_fin_fee_source_currency CHECK (currency_code = 'CNY'), CONSTRAINT chk_fin_fee_source_amount CHECK (amount >= 0) ) ENGINE=InnoDB COMMENT='Firstleg费用来源快照池;账单人工选择并固化明细'; CREATE TABLE IF NOT EXISTS fin_inbox_event ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, event_id VARCHAR(128) NOT NULL, source_system VARCHAR(32) NOT NULL, event_type VARCHAR(64) NOT NULL, payload JSON NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'RECEIVED', received_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), processed_at DATETIME(3) NULL, PRIMARY KEY (id), UNIQUE KEY uk_fin_inbox_event (source_system, event_id) ) ENGINE=InnoDB COMMENT='Firstleg费用事件幂等接收记录'; 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 'SINGLE_ORDER/CONTAINER_SHARED', 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 = 'SINGLE_ORDER' AND order_id IS NOT NULL AND container_id IS NULL) OR (cost_type = 'CONTAINER_SHARED' 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_bill_revision ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, bill_id BIGINT UNSIGNED NOT NULL, version INT UNSIGNED NOT NULL, reason VARCHAR(500) NULL, bill_snapshot JSON NOT NULL, line_snapshot JSON 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_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, 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不可变业务审计明细';