优化
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
- 模块 `src/main/resources/db/` 下的 SQL 用于开发溯源;`deploy/sql/` 下已有日期文件全部冻结为历史记录,不再单独部署,也不得与固定入口重复执行。
|
||||
- 固定入口不包含 `auth/phase1-admin-accounts.sql` 和 `warehouse/warehouse-seed.sql`,不会写入固定密码账号、演示仓库、演示快递公司或演示订单;正式平台公共仓库主数据已内联到固定入口。
|
||||
- `warehouse/phase2-pallet-location-schema-migration.sql` 的有效结构已被当前 `phase2-pallet-location-schema.sql` 和后续共享溢出位迁移完整覆盖,因此不重复内联,避免每次部署无条件删除并重建同名唯一索引。
|
||||
- 脚本会创建 8 个独立数据库:`baiyue_auth`、`baiyue_iam`、`baiyue_order`、`baiyue_warehouse`、`baiyue_firstleg`、`baiyue_file`、`baiyue_audit`、`baiyue_event_bridge`。Gateway、Print、Integration Service 无数据库。
|
||||
- 脚本会创建 9 个独立数据库:`baiyue_auth`、`baiyue_iam`、`baiyue_order`、`baiyue_warehouse`、`baiyue_firstleg`、`baiyue_file`、`baiyue_audit`、`baiyue_event_bridge`、`baiyue_finance`。Gateway、Print、Integration Service 无数据库。
|
||||
- 完整执行所有增量区块并通过末段真实结构校验后,脚本最末才会返回唯一的 `PASS`;任一强校验失败会通过 `SIGNAL` 终止。
|
||||
|
||||
后续追加增量必须满足:
|
||||
@@ -20,6 +20,13 @@
|
||||
4. 每个增量区块末尾增加只读断言,并同步维护统一脚本末尾的总体验证。
|
||||
5. MySQL DDL 会隐式提交,执行前仍应在目标环境确认连接和授权;不能把跨库脚本视为可整体回滚事务。
|
||||
|
||||
## Finance 首期人工财务基线
|
||||
|
||||
- Finance 数据库为 `baiyue_finance`,模块溯源脚本为 `finance/src/main/resources/db/finance.sql`,测试和存量环境仍只执行统一入口。
|
||||
- 首期只支持 CNY,包含平台主体、客户默认 30 天账期、账单及明细、人工收款及账单分配、单票/整柜人工成本、体积分摊结果、Firstleg 费用来源事件、幂等记录和不可变审计日志。
|
||||
- 不包含钱包、发票、供应商在线应付、银行自动对账、复杂核销、汇率和月结。
|
||||
- 统一脚本末尾会强校验 12 张 Finance 表、客户隔离/CNY/人工凭证关键字段,以及费用来源、Inbox、账单、收款、成本和写操作幂等唯一约束;任一缺失不会返回 `PASS`。
|
||||
|
||||
## 历史一期回归脚本
|
||||
|
||||
- 历史文件:`2026-07-31一期回归测试环境增量迁移.sql`,仅供追溯,不再作为统一入口。
|
||||
|
||||
@@ -9946,12 +9946,322 @@ DROP PROCEDURE assert_phase3_warehouse_roles_ready;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_phase3_warehouse_role_permission;
|
||||
|
||||
-- Finance 首期人工财务基线:CNY 账单、收款、成本、来源事件、幂等与审计。
|
||||
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不可变业务审计明细';
|
||||
|
||||
|
||||
-- 三期统一最终总断言:稳定箱号、单箱测量、墨家收件箱、客户尺寸和装柜权限。
|
||||
USE baiyue_firstleg;
|
||||
DROP PROCEDURE IF EXISTS assert_unified_final_schema;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE assert_unified_final_schema()
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM information_schema.tables
|
||||
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
|
||||
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'))
|
||||
OR (table_name = 'fin_bill' AND column_name IN ('tenant_id', 'currency_code', 'total_amount', 'received_amount', 'outstanding_amount'))
|
||||
OR (table_name = 'fin_receipt' AND column_name IN ('tenant_id', 'currency_code', 'voucher_file_ids'))
|
||||
OR (table_name = 'fin_cost' AND column_name IN ('tenant_id', 'cost_type', 'currency_code', 'voucher_file_ids')))) <> 14 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '统一迁移失败:Finance 客户隔离、CNY 金额或人工凭证字段不完整';
|
||||
END IF;
|
||||
IF (SELECT COUNT(DISTINCT CONCAT(table_name, '.', index_name))
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = 'baiyue_finance'
|
||||
AND non_unique = 0
|
||||
AND ((table_name = 'fin_fee_source' AND index_name = 'uk_fin_fee_source')
|
||||
OR (table_name = 'fin_inbox_event' AND index_name = 'uk_fin_inbox_event')
|
||||
OR (table_name = 'fin_bill' AND index_name = 'uk_fin_bill_no')
|
||||
OR (table_name = 'fin_receipt' AND index_name = 'uk_fin_receipt_no')
|
||||
OR (table_name = 'fin_cost' AND index_name = 'uk_fin_cost_no')
|
||||
OR (table_name = 'fin_bill_revision' AND index_name = 'uk_fin_bill_revision')
|
||||
OR (table_name = 'fin_idempotency_record' AND index_name = 'uk_fin_idempotency'))) <> 6 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '统一迁移失败:Finance 来源事件或人工写操作幂等约束不完整';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema = 'baiyue_firstleg'
|
||||
AND table_name = 'fl_inbound_carton_label') <> 1 THEN
|
||||
@@ -10238,6 +10548,59 @@ BEGIN
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
-- Finance F1 人工财务权限:平台财务可写,客户财务仅本客户只读。
|
||||
INSERT INTO baiyue_iam.iam_permission
|
||||
(id, tenant_id, app_code, permission_type, parent_id, permission_code, permission_name, route_path, http_method, sort_no, status, deleted)
|
||||
VALUES
|
||||
(5105000, 0, 'PLATFORM', 'MENU', 0, 'platform:finance', '财务管理', '/finance', NULL, 60, 'ACTIVE', 0),
|
||||
(5105010, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:bill:view', '查看账单', NULL, 'GET', 10, 'ACTIVE', 0),
|
||||
(5105011, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:bill:create', '创建账单', NULL, 'POST', 20, 'ACTIVE', 0),
|
||||
(5105012, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:bill:update', '修改草稿账单', NULL, 'PUT', 30, 'ACTIVE', 0),
|
||||
(5105013, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:bill:issue', '出账', NULL, 'POST', 40, 'ACTIVE', 0),
|
||||
(5105014, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:bill:adjust', '调整账单', NULL, 'POST', 50, 'ACTIVE', 0),
|
||||
(5105015, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:bill:void', '作废账单', NULL, 'POST', 60, 'ACTIVE', 0),
|
||||
(5105016, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:receipt:view', '查看收款', NULL, 'GET', 70, 'ACTIVE', 0),
|
||||
(5105017, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:receipt:create', '登记收款', NULL, 'POST', 80, 'ACTIVE', 0),
|
||||
(5105018, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:cost:view', '查看成本', NULL, 'GET', 90, 'ACTIVE', 0),
|
||||
(5105019, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:cost:create', '登记成本', NULL, 'POST', 100, 'ACTIVE', 0),
|
||||
(5105020, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:customer-terms:view', '查看客户账期', NULL, 'GET', 110, 'ACTIVE', 0),
|
||||
(5105021, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:customer-terms:update', '修改客户账期', NULL, 'PUT', 120, 'ACTIVE', 0),
|
||||
(5205000, 10001, 'MERCHANT', 'MENU', 5200000, 'merchant:finance:statement', '财务账单', '/finance/statements', NULL, 40, 'ACTIVE', 0),
|
||||
(5205010, 10001, 'MERCHANT', 'BUTTON', 5205000, 'merchant:finance:statement:list', '查看账单', NULL, 'GET', 10, 'ACTIVE', 0),
|
||||
(5205011, 10001, 'MERCHANT', 'BUTTON', 5205000, 'merchant:finance:statement:view', '查看账单详情及收款', NULL, 'GET', 20, 'ACTIVE', 0)
|
||||
ON DUPLICATE KEY UPDATE permission_name=VALUES(permission_name), parent_id=VALUES(parent_id), route_path=VALUES(route_path), http_method=VALUES(http_method), status='ACTIVE', deleted=0;
|
||||
|
||||
INSERT INTO baiyue_iam.iam_role_permission (role_id, permission_id, tenant_id)
|
||||
SELECT 4000001, id, 0 FROM baiyue_iam.iam_permission
|
||||
WHERE tenant_id=0 AND app_code='PLATFORM' AND (permission_code='platform:finance' OR permission_code LIKE 'platform:finance:%')
|
||||
ON DUPLICATE KEY UPDATE tenant_id=VALUES(tenant_id);
|
||||
INSERT INTO baiyue_iam.iam_role_permission (role_id, permission_id, tenant_id)
|
||||
SELECT 4000101, id, 10001 FROM baiyue_iam.iam_permission
|
||||
WHERE tenant_id=10001 AND app_code='MERCHANT' AND (permission_code='merchant:finance:statement' OR permission_code LIKE 'merchant:finance:%')
|
||||
ON DUPLICATE KEY UPDATE tenant_id=VALUES(tenant_id);
|
||||
|
||||
-- Finance 权限和角色授权断言。
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE assert_finance_permissions()
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id=0 AND app_code='PLATFORM' AND permission_code LIKE 'platform:finance:%' AND status='ACTIVE' AND deleted=0) <> 12 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:平台 Finance 权限不完整';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id=10001 AND app_code='MERCHANT' AND permission_code IN ('merchant:finance:statement:list','merchant:finance:statement:view') AND status='ACTIVE' AND deleted=0) <> 2 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:客户 Finance 只读权限不完整';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission rp JOIN baiyue_iam.iam_permission p ON p.id=rp.permission_id AND p.tenant_id=rp.tenant_id WHERE rp.role_id=4000001 AND rp.tenant_id=0 AND (p.permission_code='platform:finance' OR p.permission_code LIKE 'platform:finance:%')) <> 13 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:平台管理员 Finance 授权不完整';
|
||||
END IF;
|
||||
IF (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission rp JOIN baiyue_iam.iam_permission p ON p.id=rp.permission_id AND p.tenant_id=rp.tenant_id WHERE rp.role_id=4000101 AND rp.tenant_id=10001 AND (p.permission_code='merchant:finance:statement' OR p.permission_code LIKE 'merchant:finance:%')) <> 3 THEN
|
||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:客户管理员 Finance 只读授权不完整';
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
CALL assert_finance_permissions();
|
||||
DROP PROCEDURE IF EXISTS assert_finance_permissions;
|
||||
|
||||
CALL assert_unified_final_schema();
|
||||
DROP PROCEDURE IF EXISTS assert_unified_final_schema;
|
||||
CALL assert_loading_pick_task_shapes(1);
|
||||
@@ -10245,4 +10608,4 @@ DROP PROCEDURE IF EXISTS assert_loading_pick_task_shapes;
|
||||
|
||||
-- 二、三期对外统一使用 INBOUNDED;历史 WAIT_SPLIT 仅由查询适配为 INBOUNDED,统一迁移不改写主表或历史状态。
|
||||
SELECT 'PASS' AS migration_status,
|
||||
'统一增量全部执行完成;父子订单、履约分片、装柜门禁、订舱拖车、报关船期、船司查询、仓库角色、费用、公共资源及可靠审计结构校验通过' AS message;
|
||||
'统一增量全部执行完成;父子订单、履约分片、装柜门禁、订舱拖车、报关船期、船司查询、仓库角色、费用、Finance人工财务、公共资源及可靠审计结构校验通过' AS message;
|
||||
|
||||
Reference in New Issue
Block a user