@@ -278,7 +278,7 @@ PREPARE auth_password_change_required_stmt FROM @auth_password_change_required_s
EXECUTE auth_password_change_required_stmt ;
DEALLOCATE PREPARE auth_password_change_required_stmt ;
-- 开发/测试环境最小登录基线:一个 平台系统管理员和一个 IT 测试客户管理员 。
-- 开发/测试环境最小登录基线只保留 平台系统管理员;客户必须走正式建档/注册流程创建 。
-- 缺失账号首次创建时写入开发基线 BCrypt 哈希;重复执行统一增量绝不覆盖现有密码。
INSERT INTO auth_account (
id , username , password_hash , display_name , account_status ,
@@ -286,9 +286,7 @@ INSERT INTO auth_account (
operator_tenant_id , default_membership_id , default_app_code , deleted
) VALUES
( 1000001 , ' platform_admin ' , ' $2a$12$AMZJjd88leYPLI9uKvjZiew2CTQXI32BXoHFX.FrCi28/IeZ7mZ96 ' ,
' 平台系统管理员 ' , ' ACTIVE ' , 0 , 1 , 0 , 0 , 0 , 3000001 , ' PLATFORM ' , 0 ) ,
( 1000002 , ' merchant_admin ' , ' $2a$12$AMZJjd88leYPLI9uKvjZiew2CTQXI32BXoHFX.FrCi28/IeZ7mZ96 ' ,
' IT 测试客户管理员 ' , ' ACTIVE ' , 0 , 1 , 0 , 10001 , 10001 , 3000002 , ' MERCHANT ' , 0 )
' 平台系统管理员 ' , ' ACTIVE ' , 0 , 1 , 0 , 0 , 0 , 3000001 , ' PLATFORM ' , 0 )
ON DUPLICATE KEY UPDATE
display_name = VALUES ( display_name ) ,
account_status = ' ACTIVE ' ,
@@ -1194,10 +1192,7 @@ INSERT INTO iam_tenant (
approved_at , approved_by , created_by , deleted , version
) VALUES
( 0 , ' PLATFORM ' , ' 虫虫出海平台 ' , ' PLATFORM ' , ' ACTIVE ' , ' 虫虫出海平台 ' ,
NULL , ' 平台系统管理员 ' , NULL , NULL , NOW ( 3 ) , 1000001 , 1000001 , 0 , 0 ) ,
( 10001 , ' IT_TEST ' , ' IT 测试客户 ' , ' MERCHANT ' , ' ACTIVE ' , ' IT 测试客户 ' ,
' 91310000ITTEST0001 ' , ' IT 测试客户管理员 ' , ' 13800000000 ' , ' it-test@example.com ' ,
NOW ( 3 ) , 1000001 , 1000001 , 0 , 0 )
NULL , ' 平台系统管理员 ' , NULL , NULL , NOW ( 3 ) , 1000001 , 1000001 , 0 , 0 )
ON DUPLICATE KEY UPDATE
tenant_code = VALUES ( tenant_code ) , tenant_name = VALUES ( tenant_name ) , tenant_type = VALUES ( tenant_type ) ,
status = ' ACTIVE ' , legal_name = VALUES ( legal_name ) ,
@@ -1206,28 +1201,10 @@ ON DUPLICATE KEY UPDATE
contact_email = VALUES ( contact_email ) , approved_at = COALESCE ( approved_at , NOW ( 3 ) ) ,
approved_by = VALUES ( approved_by ) , deleted = 0 ;
-- The built-in IT customer must be immediately usable for order acceptance tests.
-- These approved metadata rows intentionally have no document URL: initialization must not
-- point at qualification files that do not exist in File service storage.
INSERT INTO iam_tenant_qualification (
id , tenant_id , qualification_type , certificate_no , document_url ,
valid_from , valid_to , status , review_comment , deleted
) VALUES
( 2100001 , 10001 , ' BUSINESS_LICENSE ' , ' 91310000ITTEST0001 ' , NULL ,
NULL , NULL , ' APPROVED ' , ' 开发测试初始化资质,无文件附件 ' , 0 ) ,
( 2100002 , 10001 , ' LEGAL_PERSON_ID ' , NULL , NULL ,
NULL , NULL , ' APPROVED ' , ' 开发测试初始化资质,无文件附件 ' , 0 )
ON DUPLICATE KEY UPDATE
tenant_id = VALUES ( tenant_id ) , qualification_type = VALUES ( qualification_type ) ,
certificate_no = VALUES ( certificate_no ) , status = ' APPROVED ' ,
review_comment = VALUES ( review_comment ) , deleted = 0 ;
INSERT INTO iam_user (
id , auth_user_id , user_type , display_name , phone , email , status , deleted , version
) VALUES
( 2000001 , 1000001 , ' INTERNAL ' , ' 平台系统管理员 ' , NULL , NULL , ' ACTIVE ' , 0 , 0 ) ,
( 2000002 , 1000002 , ' ENTERPRISE ' , ' IT 测试客户管理员 ' , ' 13800000000 ' ,
' it-test@example.com ' , ' ACTIVE ' , 0 , 0 )
( 2000001 , 1000001 , ' INTERNAL ' , ' 平台系统管理员 ' , NULL , NULL , ' ACTIVE ' , 0 , 0 )
ON DUPLICATE KEY UPDATE
display_name = VALUES ( display_name ) , phone = VALUES ( phone ) , email = VALUES ( email ) ,
status = ' ACTIVE ' , deleted = 0 ;
@@ -1235,8 +1212,7 @@ ON DUPLICATE KEY UPDATE
INSERT INTO iam_membership (
id , tenant_id , user_id , member_type , member_no , status , joined_at , deleted , version
) VALUES
( 3000001 , 0 , 2000001 , ' EMPLOYEE ' , ' PLATFORM-ADMIN-001 ' , ' ACTIVE ' , NOW ( 3 ) , 0 , 0 ) ,
( 3000002 , 10001 , 2000002 , ' OWNER ' , ' MERCHANT-OWNER-001 ' , ' ACTIVE ' , NOW ( 3 ) , 0 , 0 )
( 3000001 , 0 , 2000001 , ' EMPLOYEE ' , ' PLATFORM-ADMIN-001 ' , ' ACTIVE ' , NOW ( 3 ) , 0 , 0 )
ON DUPLICATE KEY UPDATE
member_type = VALUES ( member_type ) , member_no = VALUES ( member_no ) ,
status = ' ACTIVE ' , joined_at = COALESCE ( joined_at , NOW ( 3 ) ) , left_at = NULL , deleted = 0 ;
@@ -1246,9 +1222,7 @@ INSERT INTO iam_role (
) VALUES
( 4000001 , 0 , ' PLATFORM ' , ' PLATFORM_ADMIN ' , ' 平台超级管理员 ' , ' SYSTEM ' , ' ACTIVE ' , ' 一期平台全部菜单和按钮 ' , 0 , 0 ) ,
( 4000002 , 0 , ' PLATFORM ' , ' CUSTOMER_REVIEWER ' , ' 企业审核员 ' , ' SYSTEM ' , ' ACTIVE ' , ' 企业资料与入驻审核 ' , 0 , 0 ) ,
( 4000003 , 0 , ' PLATFORM ' , ' ORDER_OPERATOR ' , ' 平台订单运营 ' , ' SYSTEM ' , ' ACTIVE ' , ' 头程订单审核与履约处理 ' , 0 , 0 ) ,
( 4000101 , 10001 , ' MERCHANT ' , ' MERCHANT_OWNER ' , ' 企业管理员 ' , ' SYSTEM ' , ' ACTIVE ' , ' 本企业一期全部菜单和按钮 ' , 0 , 0 ) ,
( 4000102 , 10001 , ' MERCHANT ' , ' MERCHANT_ORDER_MANAGER ' , ' 企业订单管理员 ' , ' SYSTEM ' , ' ACTIVE ' , ' 本企业头程订单操作 ' , 0 , 0 )
( 4000003 , 0 , ' PLATFORM ' , ' ORDER_OPERATOR ' , ' 平台订单运营 ' , ' SYSTEM ' , ' ACTIVE ' , ' 头程订单审核与履约处理 ' , 0 , 0 )
ON DUPLICATE KEY UPDATE
role_name = VALUES ( role_name ) , role_type = VALUES ( role_type ) , status = ' ACTIVE ' ,
description = VALUES ( description ) , deleted = 0 ;
@@ -1335,39 +1309,8 @@ SELECT 4000003, id, 0 FROM iam_permission
WHERE id IN ( 5102019 , 5102024 , 5102025 )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
-- Merchant: level-one menus, level-two menus and buttons.
INSERT INTO iam_permission
( id , tenant_id , app_code , permission_type , parent_id , permission_code , permission_name , route_path , http_method , sort_no , status , deleted )
VALUES
( 5200000 , 10001 , ' MERCHANT ' , ' MENU ' , 0 , ' merchant:enterprise ' , ' 企业管理 ' , ' /enterprise ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5201000 , 10001 , ' MERCHANT ' , ' MENU ' , 0 , ' merchant:order ' , ' 头程订单 ' , ' /first-leg-orders ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5202000 , 10001 , ' MERCHANT ' , ' MENU ' , 0 , ' merchant:master-data ' , ' 基础资料 ' , ' /master-data ' , NULL , 30 , ' ACTIVE ' , 0 ) ,
( 5200010 , 10001 , ' MERCHANT ' , ' MENU ' , 5200000 , ' merchant:profile:view ' , ' 企业资料 ' , ' /enterprise/profile ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5200020 , 10001 , ' MERCHANT ' , ' MENU ' , 5200000 , ' merchant:member:list ' , ' 企业成员 ' , ' /enterprise/members ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5200030 , 10001 , ' MERCHANT ' , ' MENU ' , 5200000 , ' merchant:role:list ' , ' 角色管理 ' , ' /enterprise/roles ' , NULL , 30 , ' ACTIVE ' , 0 ) ,
( 5201010 , 10001 , ' MERCHANT ' , ' MENU ' , 5201000 , ' merchant:order:list ' , ' 我的订单 ' , ' /first-leg-orders/list ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5201020 , 10001 , ' MERCHANT ' , ' MENU ' , 5201000 , ' merchant:order:create-page ' , ' 新建订单 ' , ' /first-leg-orders/create ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5202010 , 10001 , ' MERCHANT ' , ' MENU ' , 5202000 , ' merchant:warehouse:list ' , ' 收货仓选择 ' , ' /master-data/warehouses ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5202020 , 10001 , ' MERCHANT ' , ' MENU ' , 5202000 , ' merchant:counterparty:list ' , ' 往来单位 ' , ' /master-data/counterparties ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5200011 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200010 , ' merchant:profile:edit ' , ' 编辑企业资料 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5200012 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200010 , ' merchant:qualification:upload ' , ' 上传企业资质 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5200021 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200020 , ' merchant:member:create ' , ' 新增成员 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5200022 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200020 , ' merchant:member:grant-role ' , ' 分配角色 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5200031 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200030 , ' merchant:role:create ' , ' 新增角色 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5200032 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200030 , ' merchant:role:grant ' , ' 角色授权 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5201011 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5201010 , ' merchant:order:view ' , ' 查看订单 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5201012 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5201010 , ' merchant:order:cancel ' , ' 取消订单 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5201021 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5201020 , ' merchant:order:create ' , ' 创建草稿 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5201022 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5201020 , ' merchant:order:edit ' , ' 编辑草稿 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5201023 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5201020 , ' merchant:order:submit ' , ' 提交订单 ' , NULL , NULL , 30 , ' ACTIVE ' , 0 )
ON DUPLICATE KEY UPDATE
permission_type = VALUES ( permission_type ) , parent_id = VALUES ( parent_id ) ,
permission_name = VALUES ( permission_name ) , route_path = VALUES ( route_path ) ,
http_method = NULL , sort_no = VALUES ( sort_no ) , status = ' ACTIVE ' , deleted = 0 ;
INSERT INTO iam_membership_role ( membership_id , role_id , tenant_id ) VALUES
( 3000001 , 4000001 , 0 ) ,
( 3000002 , 4000101 , 10001 )
( 3000001 , 4000001 , 0 )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
-- Full administrator roles receive all phase-one permissions in their application scope.
@@ -1376,11 +1319,6 @@ SELECT 4000001, id, 0 FROM iam_permission
WHERE app_code = ' PLATFORM ' AND tenant_id = 0 AND permission_type IN ( ' MENU ' , ' BUTTON ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000101 , id , 10001 FROM iam_permission
WHERE app_code = ' MERCHANT ' AND tenant_id = 10001 AND permission_type IN ( ' MENU ' , ' BUTTON ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
-- Limited platform and merchant operational roles.
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000002 , id , 0 FROM iam_permission
@@ -1396,17 +1334,10 @@ SELECT 4000003, id, 0 FROM iam_permission
WHERE permission_code LIKE ' platform:order% ' OR permission_code LIKE ' platform:firstleg% '
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000102 , id , 10001 FROM iam_permission
WHERE permission_code LIKE ' merchant:order% ' OR permission_code IN ( ' merchant:master-data ' , ' merchant:warehouse:list ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
INSERT INTO iam_data_scope ( id , role_id , tenant_id , scope_type , scope_expression ) VALUES
( 6000001 , 4000001 , 0 , ' TENANT ' , NULL ) ,
( 6000002 , 4000002 , 0 , ' TENANT ' , NULL ) ,
( 6000003 , 4000003 , 0 , ' TENANT ' , NULL ) ,
( 6000101 , 4000101 , 10001 , ' TENANT ' , NULL ) ,
( 6000102 , 4000102 , 10001 , ' TENANT ' , NULL )
( 6000003 , 4000003 , 0 , ' TENANT ' , NULL )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) , scope_type = VALUES ( scope_type ) , scope_expression = NULL ;
-- ============================================================================
@@ -1455,17 +1386,34 @@ INSERT INTO iam_role (
)
ON DUPLICATE KEY UPDATE status = ' ACTIVE ' , deleted = 0 ;
-- C lone the一期 merchant menu/butt on template into the global scope .
-- G lobal merchant permissi on template used by every formally onboarded customer .
INSERT INTO iam_permission (
id , tenant_id , app_code , permission_type , parent_id , permission_code ,
permission_name , route_path , http_method , sort_no , status , deleted
)
SELECT id + 100000 , 0 , app_code , permission_type ,
CASE WHEN parent_id = 0 THEN 0 ELSE parent_id + 100000 END ,
permission_code , permission_name , route_path , NULL , sort_no , ' ACTIVE ' , 0
FROM iam_permission
WHERE tenant_id = 10001 AND app_code = ' MERCHANT '
AND permission_type IN ( ' MENU ' , ' BUTTON ' )
VALUES
( 5300000 , 0 , ' MERCHANT ' , ' MENU ' , 0 , ' merchant:enterprise ' , ' 企业管理 ' , ' /enterprise ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5301000 , 0 , ' MERCHANT ' , ' MENU ' , 0 , ' merchant:order ' , ' 头程订单 ' , ' /first-leg-orders ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5302000 , 0 , ' MERCHANT ' , ' MENU ' , 0 , ' merchant:master-data ' , ' 基础资料 ' , ' /master-data ' , NULL , 30 , ' ACTIVE ' , 0 ) ,
( 5300010 , 0 , ' MERCHANT ' , ' MENU ' , 5300000 , ' merchant:profile:view ' , ' 企业资料 ' , ' /enterprise/profile ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5300020 , 0 , ' MERCHANT ' , ' MENU ' , 5300000 , ' merchant:member:list ' , ' 企业成员 ' , ' /enterprise/members ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5300030 , 0 , ' MERCHANT ' , ' MENU ' , 5300000 , ' merchant:role:list ' , ' 角色管理 ' , ' /enterprise/roles ' , NULL , 30 , ' ACTIVE ' , 0 ) ,
( 5301010 , 0 , ' MERCHANT ' , ' MENU ' , 5301000 , ' merchant:order:list ' , ' 我的订单 ' , ' /first-leg-orders/list ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5301020 , 0 , ' MERCHANT ' , ' MENU ' , 5301000 , ' merchant:order:create-page ' , ' 新建订单 ' , ' /first-leg-orders/create ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5302010 , 0 , ' MERCHANT ' , ' MENU ' , 5302000 , ' merchant:warehouse:list ' , ' 收货仓选择 ' , ' /master-data/warehouses ' , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5302020 , 0 , ' MERCHANT ' , ' MENU ' , 5302000 , ' merchant:counterparty:list ' , ' 往来单位 ' , ' /master-data/counterparties ' , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5300011 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300010 , ' merchant:profile:edit ' , ' 编辑企业资料 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5300012 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300010 , ' merchant:qualification:upload ' , ' 上传企业资质 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5300021 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300020 , ' merchant:member:create ' , ' 新增成员 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5300022 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300020 , ' merchant:member:grant-role ' , ' 分配成员角色 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5300031 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300030 , ' merchant:role:create ' , ' 新增角色 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5300032 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300030 , ' merchant:role:grant ' , ' 角色授权 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5301011 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301010 , ' merchant:order:view ' , ' 查看订单 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5301012 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301010 , ' merchant:order:cancel ' , ' 取消订单 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5301021 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301020 , ' merchant:order:create ' , ' 创建草稿 ' , NULL , NULL , 10 , ' ACTIVE ' , 0 ) ,
( 5301022 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301020 , ' merchant:order:edit ' , ' 编辑草稿 ' , NULL , NULL , 20 , ' ACTIVE ' , 0 ) ,
( 5301023 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301020 , ' merchant:order:submit ' , ' 提交订单 ' , NULL , NULL , 30 , ' ACTIVE ' , 0 ) ,
( 5301024 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301020 , ' merchant:order:quick-create ' , ' 快速下单 ' , NULL , NULL , 40 , ' ACTIVE ' , 0 )
ON DUPLICATE KEY UPDATE
permission_name = VALUES ( permission_name ) , route_path = VALUES ( route_path ) ,
parent_id = VALUES ( parent_id ) , sort_no = VALUES ( sort_no ) , status = ' ACTIVE ' , deleted = 0 ;
@@ -1507,20 +1455,11 @@ DEALLOCATE PREPARE member_no_index_stmt;
INSERT INTO iam_permission
( id , tenant_id , app_code , permission_type , parent_id , permission_code , permission_name , sort_no , status , deleted )
VALUES
( 5200023 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200020 , ' merchant:member:edit ' , ' 编辑成员 ' , 30 , ' ACTIVE ' , 0 ) ,
( 5200024 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200020 , ' merchant:member:status ' , ' 启停成员 ' , 40 , ' ACTIVE ' , 0 ) ,
( 5200025 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200020 , ' merchant:member:reset-password ' , ' 重置成员密码 ' , 50 , ' ACTIVE ' , 0 ) ,
( 5300023 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300020 , ' merchant:member:edit ' , ' 编辑成员 ' , 30 , ' ACTIVE ' , 0 ) ,
( 5300024 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300020 , ' merchant:member:status ' , ' 启停成员 ' , 40 , ' ACTIVE ' , 0 ) ,
( 5300025 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300020 , ' merchant:member:reset-password ' , ' 重置成员密码 ' , 50 , ' ACTIVE ' , 0 )
ON DUPLICATE KEY UPDATE permission_name = VALUES ( permission_name ) , status = VALUES ( status ) , deleted = 0 ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000101 , id , 10001 FROM iam_permission
WHERE tenant_id = 10001 AND permission_code IN
( ' merchant:member:edit ' , ' merchant:member:status ' , ' merchant:member:reset-password ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000100 , id , 0 FROM iam_permission
WHERE tenant_id = 0 AND permission_code IN
@@ -1548,9 +1487,6 @@ VALUES
( 5101013 , 0 , ' PLATFORM ' , ' BUTTON ' , 5101010 , ' platform:user:status ' , ' 启停用户 ' , 30 , ' ACTIVE ' , 0 ) ,
( 5101014 , 0 , ' PLATFORM ' , ' BUTTON ' , 5101010 , ' platform:user:reset-password ' , ' 重置密码 ' , 40 , ' ACTIVE ' , 0 ) ,
( 5101015 , 0 , ' PLATFORM ' , ' BUTTON ' , 5101010 , ' platform:user:grant-role ' , ' 分配内部用户角色 ' , 50 , ' ACTIVE ' , 0 ) ,
( 5200033 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200030 , ' merchant:role:edit ' , ' 编辑角色 ' , 30 , ' ACTIVE ' , 0 ) ,
( 5200034 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200030 , ' merchant:role:status ' , ' 启停角色 ' , 40 , ' ACTIVE ' , 0 ) ,
( 5200035 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5200030 , ' merchant:role:delete ' , ' 删除角色 ' , 50 , ' ACTIVE ' , 0 ) ,
( 5300033 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300030 , ' merchant:role:edit ' , ' 编辑角色 ' , 30 , ' ACTIVE ' , 0 ) ,
( 5300034 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300030 , ' merchant:role:status ' , ' 启停角色 ' , 40 , ' ACTIVE ' , 0 ) ,
( 5300035 , 0 , ' MERCHANT ' , ' BUTTON ' , 5300030 , ' merchant:role:delete ' , ' 删除角色 ' , 50 , ' ACTIVE ' , 0 )
@@ -1569,12 +1505,6 @@ WHERE tenant_id = 0 AND app_code = 'PLATFORM'
' platform:user:grant-role ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000101 , id , 10001 FROM iam_permission
WHERE tenant_id = 10001 AND app_code = ' MERCHANT '
AND permission_code IN ( ' merchant:role:edit ' , ' merchant:role:status ' , ' merchant:role:delete ' )
ON DUPLICATE KEY UPDATE tenant_id = VALUES ( tenant_id ) ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT 4000100 , id , 0 FROM iam_permission
WHERE tenant_id = 0 AND app_code = ' MERCHANT '
@@ -4286,23 +4216,9 @@ SET @unified_ddl = IF(
PREPARE unified_stmt FROM @ unified_ddl ; EXECUTE unified_stmt ; DEALLOCATE PREPARE unified_stmt ;
-- ============================================================================
-- 重新同步 一期商户管理员全局模板,包含一期后续追加的菜单和按钮
-- 重新授权 一期商户管理员全局模板,包含一期后续追加的菜单和按钮
-- ============================================================================
USE baiyue_iam ;
INSERT INTO iam_permission (
id , tenant_id , app_code , permission_type , parent_id , permission_code ,
permission_name , route_path , http_method , sort_no , status , deleted
)
SELECT id + 100000 , 0 , app_code , permission_type ,
CASE WHEN parent_id = 0 THEN 0 ELSE parent_id + 100000 END ,
permission_code , permission_name , route_path , NULL , sort_no , ' ACTIVE ' , 0
FROM iam_permission
WHERE tenant_id = 10001 AND app_code = ' MERCHANT '
AND permission_type IN ( ' MENU ' , ' BUTTON ' )
ON DUPLICATE KEY UPDATE
permission_name = VALUES ( permission_name ) , route_path = VALUES ( route_path ) ,
parent_id = VALUES ( parent_id ) , sort_no = VALUES ( sort_no ) , status = ' ACTIVE ' , deleted = 0 ;
INSERT INTO iam_role_permission ( role_id , permission_id , tenant_id )
SELECT owner_role . id , permission . id , 0
FROM iam_role owner_role
@@ -5983,7 +5899,7 @@ BEGIN
SELECT MAX ( plan_status ) INTO current_plan_status FROM fl_loading_plan
WHERE container_booking_id = NEW . container_booking_id ;
IF current_plan_status = ' COMPLETED '
AND NEW . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' ) THEN
AND NEW . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' , ' DELIVERY_ORDER ' , ' PICKUP_ORDER ' ) THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 装柜完成后货柜文件不可新增 ' ;
END IF ;
END $ $
@@ -5999,7 +5915,7 @@ BEGIN
SELECT MAX ( plan_status ) INTO current_plan_status FROM fl_loading_plan
WHERE container_booking_id = OLD . container_booking_id ;
IF current_plan_status = ' COMPLETED '
AND OLD . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' ) THEN
AND OLD . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' , ' DELIVERY_ORDER ' , ' PICKUP_ORDER ' ) THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 装柜完成后货柜文件不可修改 ' ;
END IF ;
END $ $
@@ -6440,7 +6356,7 @@ JOIN wh_warehouse warehouse
ON DUPLICATE KEY UPDATE
tenant_id = VALUES ( tenant_id ) ;
-- 国内固定 作业仓必须启用收货能力,FBA 目的地址仍不得创建作业能力。
-- 四个固定平台 作业仓必须启用收货能力,FBA 目的地址仍不得创建作业能力。
INSERT INTO wh_service_capability (
id , tenant_id , warehouse_id , capability_code , capability_name , enabled , cutoff_time ,
description , created_by , created_at , updated_by , updated_at , deleted , version
@@ -6449,7 +6365,11 @@ VALUES
( 193000000000400001 , 0 , 193000000000200001 , ' RECEIVING ' , ' 头程收货 ' , 1 , ' 16:00:00 ' ,
' 义乌仓头程订单收货能力 ' , NULL , CURRENT_TIMESTAMP ( 3 ) , NULL , CURRENT_TIMESTAMP ( 3 ) , 0 , 0 ) ,
( 193000000000400002 , 0 , 193000000000200002 , ' RECEIVING ' , ' 头程收货 ' , 1 , ' 16:00:00 ' ,
' 东莞仓头程订单收货能力 ' , NULL , CURRENT_TIMESTAMP ( 3 ) , NULL , CURRENT_TIMESTAMP ( 3 ) , 0 , 0 )
' 东莞仓头程订单收货能力 ' , NULL , CURRENT_TIMESTAMP ( 3 ) , NULL , CURRENT_TIMESTAMP ( 3 ) , 0 , 0 ) ,
( 193000000000400003 , 0 , 193000000000200003 , ' RECEIVING ' , ' 海外收货 ' , 1 , ' 16:00:00 ' ,
' 洛杉矶仓海外接柜入仓收货能力 ' , NULL , CURRENT_TIMESTAMP ( 3 ) , NULL , CURRENT_TIMESTAMP ( 3 ) , 0 , 0 ) ,
( 193000000000400004 , 0 , 193000000000200004 , ' RECEIVING ' , ' 海外收货 ' , 1 , ' 16:00:00 ' ,
' 纽约仓海外接柜入仓收货能力 ' , NULL , CURRENT_TIMESTAMP ( 3 ) , NULL , CURRENT_TIMESTAMP ( 3 ) , 0 , 0 )
ON DUPLICATE KEY UPDATE
capability_name = VALUES ( capability_name ) ,
enabled = VALUES ( enabled ) ,
@@ -7096,11 +7016,11 @@ BEGIN
IF ( SELECT COUNT ( * )
FROM wh_service_capability capability
WHERE capability . tenant_id = 0
AND capability . warehouse_id IN ( 193000000000200001 , 193000000000200002 )
AND capability . warehouse_id IN ( 193000000000200001 , 193000000000200002 , 193000000000200003 , 193000000000200004 )
AND capability . capability_code = ' RECEIVING '
AND capability . enabled = 1
AND capability . deleted = 0 ) < > 2 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 国内 固定作业仓收货能力写入校验失败' ;
AND capability . deleted = 0 ) < > 4 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 固定平台 作业仓收货能力写入校验失败 ' ;
END IF ;
END / /
DELIMITER ;
@@ -9109,6 +9029,7 @@ CREATE TABLE IF NOT EXISTS fl_ocean_booking (
bill_of_lading_no VARCHAR ( 128 ) NULL COMMENT ' 提单号 ' ,
shipping_company_id BIGINT UNSIGNED NULL COMMENT ' 船公司逻辑ID快照 ' ,
shipping_company_name VARCHAR ( 128 ) NULL COMMENT ' 船公司名称快照 ' ,
carrier_code VARCHAR ( 16 ) NULL COMMENT ' 船司标准编码:MATSON/SML/ZIM/COSCO/EMC/HEDE/OTHER;发布前必填 ' ,
booking_agent_id BIGINT UNSIGNED NULL COMMENT ' 订舱代理逻辑ID快照 ' ,
booking_agent_name VARCHAR ( 128 ) NULL COMMENT ' 订舱代理名称快照 ' ,
vessel_name VARCHAR ( 128 ) NULL COMMENT ' 当前确认船名快照 ' ,
@@ -9137,10 +9058,38 @@ CREATE TABLE IF NOT EXISTS fl_ocean_booking (
CONSTRAINT chk_ocean_booking_customer CHECK ( customer_id > 0 ) ,
CONSTRAINT chk_ocean_booking_status CHECK ( status IN
( ' DRAFT ' , ' RELEASED ' ) ) ,
CONSTRAINT chk_ocean_booking_carrier_code CHECK
( carrier_code IS NULL OR carrier_code IN ( ' MATSON ' , ' SML ' , ' ZIM ' , ' COSCO ' , ' EMC ' , ' HEDE ' , ' OTHER ' ) ) ,
CONSTRAINT chk_ocean_booking_schedule CHECK
( estimated_sailing_at IS NULL OR estimated_arrival_at IS NULL OR estimated_arrival_at > = estimated_sailing_at )
) ENGINE = InnoDB COMMENT = ' 独立海运订舱聚合;柜次仍由fl_container_booking承载 ' ;
SET @ ocean_add_carrier_code = (
SELECT IF ( COUNT ( * ) = 0 ,
' ALTER TABLE fl_ocean_booking ADD COLUMN carrier_code VARCHAR(16) NULL COMMENT '' 船司标准编码:MATSON/SML/ZIM/COSCO/EMC/HEDE/OTHER;发布前必填 '' AFTER shipping_company_name ' ,
' SELECT 1 ' )
FROM information_schema . columns
WHERE table_schema = DATABASE ( ) AND table_name = ' fl_ocean_booking ' AND column_name = ' carrier_code '
) ;
PREPARE ocean_add_carrier_code_stmt FROM @ ocean_add_carrier_code ;
EXECUTE ocean_add_carrier_code_stmt ;
DEALLOCATE PREPARE ocean_add_carrier_code_stmt ;
SET @ ocean_drop_carrier_code_check = (
SELECT IF ( COUNT ( * ) > 0 ,
' ALTER TABLE fl_ocean_booking DROP CHECK chk_ocean_booking_carrier_code ' ,
' SELECT 1 ' )
FROM information_schema . table_constraints
WHERE constraint_schema = DATABASE ( ) AND table_name = ' fl_ocean_booking '
AND constraint_name = ' chk_ocean_booking_carrier_code ' AND constraint_type = ' CHECK '
) ;
PREPARE ocean_drop_carrier_code_check_stmt FROM @ ocean_drop_carrier_code_check ;
EXECUTE ocean_drop_carrier_code_check_stmt ;
DEALLOCATE PREPARE ocean_drop_carrier_code_check_stmt ;
ALTER TABLE fl_ocean_booking
ADD CONSTRAINT chk_ocean_booking_carrier_code CHECK
( carrier_code IS NULL OR carrier_code IN ( ' MATSON ' , ' SML ' , ' ZIM ' , ' COSCO ' , ' EMC ' , ' HEDE ' , ' OTHER ' ) ) ;
-- CREATE TABLE IF NOT EXISTS does not reconcile a database initialized before customer became optional.
ALTER TABLE fl_ocean_booking
MODIFY COLUMN customer_id BIGINT UNSIGNED NULL COMMENT ' 可选客户ID快照 ' ,
@@ -10377,11 +10326,11 @@ CREATE TABLE IF NOT EXISTS fl_carrier_schedule_query (
ocean_booking_id BIGINT UNSIGNED NOT NULL COMMENT ' 关联海运订舱ID ' ,
container_booking_id BIGINT UNSIGNED NULL COMMENT ' 指定查询的柜次ID;整票订舱查询时为空 ' ,
container_scope_id BIGINT UNSIGNED GENERATED ALWAYS AS ( COALESCE ( container_booking_id , 0 ) ) STORED COMMENT ' 柜次唯一作用域计算值;整票订舱查询固定为0 ' ,
carrier_code VARCHAR ( 16 ) NOT NULL COMMENT ' 船公司编码:MATSON美森、SML森罗、ZIM以星、COSCO中远海运、EMC长荣、HEDE合德 ' ,
carrier_code VARCHAR ( 16 ) NOT NULL COMMENT ' 船公司标准编码;OTHER表示人工跟踪 ' ,
tracking_type VARCHAR ( 32 ) NOT NULL COMMENT ' 官网跟踪类型:BOOKING_NO订舱号、BILL_OF_LADING提单号、CONTAINER_NO箱号 ' ,
tracking_no VARCHAR ( 128 ) NOT NULL COMMENT ' 提交至船公司官网的跟踪号码 ' ,
official_url VARCHAR ( 500 ) NOT NULL COMMENT ' 船公司官网查询入口地址快照 ' ,
access_mode VARCHAR ( 32 ) NOT NULL COMMENT ' 船司访问方式: PUBLIC_FORM、PUBLIC_WEB_PROXY、PUBLIC_HTML、HCAPTCHA、OFFICIAL_API ' ,
access_mode VARCHAR ( 32 ) NOT NULL COMMENT ' 船司访问方式; MANUAL表示仅人工补录节点 ' ,
status VARCHAR ( 24 ) NOT NULL COMMENT ' 任务操作状态:READY、MANUAL_REQUIRED、STOPPED ' ,
trigger_source VARCHAR ( 32 ) NOT NULL DEFAULT ' MANUAL ' COMMENT ' 任务触发来源:OUTBOUND_CONFIRM或MANUAL ' ,
latest_standard_node VARCHAR ( 32 ) NULL COMMENT ' 最近实际标准船节点;预计事实不推进 ' ,
@@ -10423,11 +10372,11 @@ CREATE TABLE IF NOT EXISTS fl_carrier_schedule_query (
CONSTRAINT fk_carrier_schedule_query_result FOREIGN KEY ( result_port_schedule_id ) REFERENCES fl_port_schedule ( id ) ,
CONSTRAINT chk_carrier_schedule_query_customer CHECK ( customer_id > 0 ) ,
CONSTRAINT chk_carrier_schedule_query_carrier CHECK
( carrier_code IN ( ' MATSON ' , ' SML ' , ' ZIM ' , ' COSCO ' , ' EMC ' , ' HEDE ' ) ) ,
( carrier_code IN ( ' MATSON ' , ' SML ' , ' ZIM ' , ' COSCO ' , ' EMC ' , ' HEDE ' , ' OTHER ' ) ) ,
CONSTRAINT chk_carrier_schedule_query_tracking CHECK
( tracking_type IN ( ' BOOKING_NO ' , ' BILL_OF_LADING ' , ' CONTAINER_NO ' ) ) ,
CONSTRAINT chk_carrier_schedule_query_access CHECK
( access_mode IN ( ' PUBLIC_FORM ' , ' PUBLIC_WEB_PROXY ' , ' PUBLIC_HTML ' , ' HCAPTCHA ' , ' OFFICIAL_API ' ) ) ,
( access_mode IN ( ' PUBLIC_FORM ' , ' PUBLIC_WEB_PROXY ' , ' PUBLIC_HTML ' , ' HCAPTCHA ' , ' OFFICIAL_API ' , ' MANUAL ' ) ) ,
CONSTRAINT chk_carrier_schedule_query_status CHECK
( status IN ( ' READY ' , ' MANUAL_REQUIRED ' , ' STOPPED ' ) ) ,
CONSTRAINT chk_carrier_schedule_query_node CHECK
@@ -10786,6 +10735,7 @@ DROP PROCEDURE IF EXISTS migrate_carrier_schedule_retry_columns;
-- CREATE TABLE IF NOT EXISTS 不会替换历史 CHECK 与唯一索引。统一收敛到当前
-- READY/MANUAL_REQUIRED/STOPPED、五种访问方式、十个实际节点和每业务范围唯一任务。
ALTER TABLE fl_carrier_schedule_query
DROP CHECK chk_carrier_schedule_query_carrier ,
DROP CHECK chk_carrier_schedule_query_access ,
DROP CHECK chk_carrier_schedule_query_status ;
DROP PROCEDURE IF EXISTS drop_legacy_carrier_schedule_node_check ;
@@ -10802,8 +10752,10 @@ DELIMITER ;
CALL drop_legacy_carrier_schedule_node_check ( ) ;
DROP PROCEDURE IF EXISTS drop_legacy_carrier_schedule_node_check ;
ALTER TABLE fl_carrier_schedule_query
ADD CONSTRAINT chk_carrier_schedule_query_carrier CHECK
( carrier_code IN ( ' MATSON ' , ' SML ' , ' ZIM ' , ' COSCO ' , ' EMC ' , ' HEDE ' , ' OTHER ' ) ) ,
ADD CONSTRAINT chk_carrier_schedule_query_access CHECK
( access_mode IN ( ' PUBLIC_FORM ' , ' PUBLIC_WEB_PROXY ' , ' PUBLIC_HTML ' , ' HCAPTCHA ' , ' OFFICIAL_API ' ) ) ,
( access_mode IN ( ' PUBLIC_FORM ' , ' PUBLIC_WEB_PROXY ' , ' PUBLIC_HTML ' , ' HCAPTCHA ' , ' OFFICIAL_API ' , ' MANUAL ' ) ) ,
ADD CONSTRAINT chk_carrier_schedule_query_status CHECK
( status IN ( ' READY ' , ' MANUAL_REQUIRED ' , ' STOPPED ' ) ) ,
ADD CONSTRAINT chk_carrier_schedule_query_node CHECK
@@ -13928,6 +13880,7 @@ CALL queue_column_comment('baiyue_firstleg', 'fl_mojia_measurement_receipt', 'up
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_mojia_measurement_receipt ' , ' weight_kg ' , ' 设备实测重量kg ' ) ;
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_mojia_measurement_receipt ' , ' width_cm ' , ' 设备实测宽度cm ' ) ;
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_ocean_booking ' , ' bill_of_lading_no ' , ' 提单号 ' ) ;
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_ocean_booking ' , ' carrier_code ' , ' 船司标准编码:MATSON/SML/ZIM/COSCO/EMC/HEDE/OTHER;发布前必填 ' ) ;
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_ocean_booking ' , ' booking_agent_id ' , ' 订舱代理逻辑ID快照 ' ) ;
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_ocean_booking ' , ' booking_agent_name ' , ' 订舱代理名称快照 ' ) ;
CALL queue_column_comment ( ' baiyue_firstleg ' , ' fl_ocean_booking ' , ' booking_no ' , ' 平台海运订舱编号 ' ) ;
@@ -14892,6 +14845,21 @@ BEGIN
' baiyue_firstleg ' , ' baiyue_file ' , ' baiyue_audit ' , ' baiyue_event_bridge ' , ' baiyue_finance ' ) ) < > 9 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:九个业务数据库未完整创建 ' ;
END IF ;
IF ( SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_iam ' AND table_name = ' iam_tenant '
AND column_name = ' dimension_initialization_status ' ) < > 1
OR ( SELECT COUNT ( * ) FROM information_schema . tables
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_customer_dimension_initialization_task ' ) < > 1
OR ( SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_iam '
AND table_name = ' iam_customer_dimension_initialization_task '
AND column_name IN ( ' tenant_id ' , ' initialization_key ' , ' action ' , ' status ' , ' attempt_count ' ,
' next_retry_at ' , ' lease_owner ' , ' lease_until ' , ' last_error_code ' , ' last_error_message ' ,
' task_version ' ) ) < > 11 THEN
SIGNAL SQLSTATE ' 45000 '
SET MESSAGE_TEXT = ' 统一迁移失败:IAM客户默认尺寸后台初始化状态或可靠任务结构不完整 ' ;
END IF ;
IF ( SELECT COUNT ( * ) FROM information_schema . columns
WHERE table_schema = ' baiyue_firstleg ' AND table_name = ' fl_carrier_schedule_query '
AND column_name IN ( ' trigger_source ' , ' latest_standard_node ' , ' latest_node_observed_at ' ,
@@ -15335,10 +15303,9 @@ VALUES
( 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 ) ,
( 5205012 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5205000 , ' merchant:finance:statement:confirm ' , ' 确认客户对账单 ' , NULL , ' POST ' , 30 , ' ACTIVE ' , 0 ) ,
( 5305000 , 0 , ' MERCHANT ' , ' MENU ' , 5300000 , ' merchant:finance:statement ' , ' 财务账单 ' , ' /finance/statements ' , NULL , 40 , ' ACTIVE ' , 0 ) ,
( 5305010 , 0 , ' MERCHANT ' , ' BUTTON ' , 5305000 , ' merchant:finance:statement:list ' , ' 查看账单 ' , NULL , ' GET ' , 10 , ' ACTIVE ' , 0 ) ,
( 5305011 , 0 , ' MERCHANT ' , ' BUTTON ' , 5305000 , ' merchant:finance:statement:view ' , ' 查看账单详情及收款 ' , NULL , ' GET ' , 20 , ' ACTIVE ' , 0 ) ,
( 5305012 , 0 , ' MERCHANT ' , ' BUTTON ' , 5305000 , ' merchant:finance:statement:confirm ' , ' 确认客户对账单 ' , NULL , ' POST ' , 30 , ' 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 ;
@@ -15471,11 +15438,6 @@ WHERE tenant_id=0 AND app_code='PLATFORM' AND permission_code IN (
' platform:finance:settlement-ap:create ' , ' platform:finance:payment:create ' ,
' platform:finance:settlement:void ' )
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 ) ;
-- 开发期 list-only 收口:先移除角色关联并停用旧只读资源,再执行最终 Finance 断言。
DELETE rp 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
@@ -15851,7 +15813,7 @@ CREATE TRIGGER trg_container_document_before_insert BEFORE INSERT ON fl_containe
BEGIN
DECLARE current_plan_status VARCHAR ( 24 ) ;
SELECT MAX ( plan_status ) INTO current_plan_status FROM fl_loading_plan WHERE container_booking_id = NEW . container_booking_id ;
IF current_plan_status = ' COMPLETED ' AND NEW . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' ) THEN
IF current_plan_status = ' COMPLETED ' AND NEW . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' , ' DELIVERY_ORDER ' , ' PICKUP_ORDER ' ) THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 装柜完成后货柜物流文件不可新增 ' ;
END IF ;
END $ $
@@ -15862,7 +15824,7 @@ CREATE TRIGGER trg_container_document_before_update BEFORE UPDATE ON fl_containe
BEGIN
DECLARE current_plan_status VARCHAR ( 24 ) ;
SELECT MAX ( plan_status ) INTO current_plan_status FROM fl_loading_plan WHERE container_booking_id = OLD . container_booking_id ;
IF current_plan_status = ' COMPLETED ' AND OLD . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' ) THEN
IF current_plan_status = ' COMPLETED ' AND OLD . document_type NOT IN ( ' DESTINATION_CLEARANCE ' , ' CUSTOMS_DECLARATION ' , ' DELIVERY_ORDER ' , ' PICKUP_ORDER ' ) THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 装柜完成后货柜物流文件不可修改 ' ;
END IF ;
END $ $
@@ -15941,22 +15903,18 @@ SELECT 0, r.id, p.id, CURRENT_TIMESTAMP(3) FROM iam_role r JOIN iam_permission p
WHERE r . tenant_id = 0 AND r . app_code = ' PLATFORM ' AND r . role_code = ' PLATFORM_ADMIN ' AND p . permission_code IN ( ' platform:finance:customer-account:list ' , ' platform:finance:customer-arap:list ' , ' platform:finance:receivable-statistics:list ' , ' platform:finance:customer-statement:list ' , ' platform:finance:settlement-ar:list ' , ' platform:finance:settlement-ap:list ' , ' platform:finance:customer-account:export ' , ' platform:finance:customer-arap:export ' , ' platform:finance:receivable-statistics:export ' , ' platform:finance:customer-statement:export ' , ' platform:finance:settlement-ar:export ' , ' platform:finance:settlement-ap:export ' , ' platform:download:list ' ) ;
UPDATE iam_permission p JOIN ( SELECT ' platform:finance:fee-source:review ' code , 5105041 parent_id UNION ALL SELECT ' platform:finance:fee-source:edit ' , 5105041 UNION ALL SELECT ' platform:finance:reconciliation:create ' , 5105042 UNION ALL SELECT ' platform:finance:reconciliation:review ' , 5105042 UNION ALL SELECT ' platform:finance:reconciliation:issue ' , 5105042 UNION ALL SELECT ' platform:finance:reconciliation:adjust ' , 5105042 UNION ALL SELECT ' platform:finance:reconciliation:void ' , 5105042 UNION ALL SELECT ' platform:finance:settlement-ar:create ' , 5105043 UNION ALL SELECT ' platform:finance:settlement-ap:create ' , 5105044 UNION ALL SELECT ' platform:finance:payment:create ' , 5105044 ) mapping ON mapping . code = p . permission_code SET p . parent_id = mapping . parent_id WHERE p . tenant_id = 0 AND p . app_code = ' PLATFORM ' AND p . permission_type = ' BUTTON ' ;
INSERT IGNORE INTO iam_role_permission ( tenant_id , role_id , permission_id , created_at )
SELECT 10001 , r . id , p . id , CURRENT_TIMESTAMP ( 3 ) FROM iam_role r JOIN iam_permission p ON p . tenant_id = 10001 AND p . app_code = ' MERCHANT '
WHERE r . tenant_id = 10001 AND r . app_code = ' MERCHANT ' AND r . role_code IN ( ' MERCHANT_OWNER ' , ' MERCHANT_ADMIN ' )
AND p . permission_code = ' merchant:finance:statement:confirm ' ;
INSERT IGNORE INTO iam_role_permission ( tenant_id , role_id , permission_id , created_at )
SELECT 0 , r . id , p . id , CURRENT_TIMESTAMP ( 3 ) FROM iam_role r JOIN iam_permission p ON p . tenant_id = 0 AND p . app_code = ' MERCHANT '
WHERE r . tenant_id = 0 AND r . app_code = ' MERCHANT ' AND r . role_code = ' MERCHANT_OWNER '
AND r . status = ' ACTIVE ' AND r . deleted = 0
AND p . permission_code = ' merchant:finance:statement:confirm '
AND p . permission_code IN ( ' merchant:finance:statement ' , ' merchant:finance:statement:list ' ,
' merchant:finance:statement:view ' , ' merchant:finance:statement:confirm ' )
AND p . status = ' ACTIVE ' AND p . deleted = 0 ;
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
( 5201024 , 10001 , ' MERCHANT ' , ' BUTTON ' , 5201020 , ' merchant:order:quick-create ' , ' 快速下单 ' , NULL , NULL , 40 , ' ACTIVE ' , 0 )
( 5301024 , 0 , ' MERCHANT ' , ' BUTTON ' , 5301020 , ' merchant:order:quick-create ' , ' 快速下单 ' , NULL , NULL , 40 , ' ACTIVE ' , 0 )
ON DUPLICATE KEY UPDATE
permission_type = VALUES ( permission_type ) , parent_id = VALUES ( parent_id ) , permission_name = VALUES ( permission_name ) ,
route_path = VALUES ( route_path ) , sort_no = VALUES ( sort_no ) , status = ' ACTIVE ' , deleted = 0 ;
@@ -16172,11 +16130,8 @@ 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 ) < > 32 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 ' , ' merchant:finance:statement:confirm ' ) AND status = ' ACTIVE ' AND deleted = 0 ) < > 3 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:客户 Finance 查询与确认 权限不完整 ' ;
END IF ;
IF ( SELECT COUNT ( * ) FROM baiyue_iam . iam_permission WHERE tenant_id = 0 AND app_code = ' MERCHANT ' AND permission_code = ' merchant:finance:statement:confirm ' AND status = ' ACTIVE ' AND deleted = 0 ) < > 1 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:客户全局对账单确认权限不完整 ' ;
IF ( SELECT COUNT ( * ) FROM baiyue_iam . iam_permission WHERE tenant_id = 0 AND app_code = ' MERCHANT ' AND permission_code IN ( ' merchant:finance:statement ' , ' merchant:finance:statement :list' , ' merchant:finance:statement:view ' , ' merchant:finance:statement:confirm ' ) AND status = ' ACTIVE ' AND deleted = 0 ) < > 4 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:% ' ) ) < > 33 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:平台管理员 Finance 授权不完整 ' ;
@@ -16184,11 +16139,8 @@ BEGIN
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 . status = ' ACTIVE ' AND p . deleted = 0 AND p . permission_code IN ( ' platform:download:list ' , ' platform:finance:customer-account:export ' , ' platform:finance:customer-arap:export ' , ' platform:finance:receivable-statistics:export ' , ' platform:finance:customer-statement:export ' , ' platform:finance:settlement-ar:export ' , ' platform:finance:settlement-ap:export ' ) ) < > 7 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:% ' ) ) < > 4 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:客户管理员 Finance 查询与确认 授权不完整 ' ;
END IF ;
IF ( SELECT COUNT ( * ) FROM baiyue_iam . iam_role_permission rp JOIN baiyue_iam . iam_role r ON r . id = rp . role_id AND r . tenant_id = rp . tenant_id JOIN baiyue_iam . iam_permission p ON p . id = rp . permission_id AND p . tenant_id = rp . tenant_id WHERE r . tenant_id = 0 AND r . app_code = ' MERCHANT ' AND r . role_code = ' MERCHANT_OWNER ' AND r . status = ' ACTIVE ' AND r . deleted = 0 AND p . permission_code = ' merchant:finance:statement:confirm ' AND p . status = ' ACTIVE ' AND p . deleted = 0 ) < > 1 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:客户全局管理员缺少对账单确认权限 ' ;
IF ( SELECT COUNT ( * ) FROM baiyue_iam . iam_role_permission rp JOIN baiyue_iam . iam_role r ON r . id = rp . role_id AND r . tenant_id = rp . tenant_id JOIN baiyue_iam . iam_permission p ON p . id = rp . permission_id AND p . tenant_id = rp . tenant_id WHERE r . id = 4000100 AND r . tenant_id = 0 AND r . app_code = ' MERCHANT ' AND r . role_code = ' MERCHANT_OWNER ' AND r . status = ' ACTIVE ' AND r . deleted = 0 AND p . permission_code IN ( ' merchant:finance:statement ' , ' merchant:finance:statement:list ' , ' merchant:finance:statement:view ' , ' merchant:finance:statement:confirm ' ) AND p . status = ' ACTIVE ' AND p . deleted = 0 ) < > 4 THEN
SIGNAL SQLSTATE ' 45000 ' SET MESSAGE_TEXT = ' 统一迁移失败:客户全局 管理员 Finance 模板 授权不完整 ' ;
END IF ;
END $ $
DELIMITER ;
@@ -16632,6 +16584,38 @@ SELECT 0,role.id,permission.id,NOW(3) FROM baiyue_iam.iam_role role
JOIN baiyue_iam . iam_permission permission ON permission . id BETWEEN 5107070 AND 5107082 AND permission . tenant_id = 0
WHERE role . tenant_id = 0 AND role . app_code = ' PLATFORM ' AND role . role_code = ' PLATFORM_ADMIN ' AND role . status = ' ACTIVE ' AND role . deleted = 0 ;
-- IAM 客户提交即成功,默认尺寸通过持久化任务后台初始化;已有客户按历史事实标记 READY。
USE baiyue_iam ;
SET @ customer_dimension_status_ddl = ( SELECT IF (
EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE ( )
AND table_name = ' iam_tenant ' AND column_name = ' dimension_initialization_status ' ) ,
' SELECT 1 ' ,
' ALTER TABLE iam_tenant ADD COLUMN dimension_initialization_status VARCHAR(16) NOT NULL DEFAULT '' READY '' COMMENT '' 默认尺寸初始化状态:PENDING待处理、READY已就绪、FAILED失败 '' AFTER status ' ) ) ;
PREPARE customer_dimension_status_stmt FROM @ customer_dimension_status_ddl ;
EXECUTE customer_dimension_status_stmt ;
DEALLOCATE PREPARE customer_dimension_status_stmt ;
CREATE TABLE IF NOT EXISTS iam_customer_dimension_initialization_task (
tenant_id BIGINT NOT NULL COMMENT ' 客户ID及任务聚合ID ' ,
operator_id BIGINT NOT NULL COMMENT ' 触发初始化的操作人ID;系统补偿为0 ' ,
initialization_key VARCHAR ( 128 ) NOT NULL COMMENT ' 稳定初始化幂等键:iam-customer-create:{tenantId} ' ,
action VARCHAR ( 16 ) NOT NULL DEFAULT ' INITIALIZE ' COMMENT ' 目标动作:INITIALIZE初始化、COMPENSATE补偿 ' ,
status VARCHAR ( 16 ) NOT NULL DEFAULT ' PENDING ' COMMENT ' 投递状态:PENDING、SENDING、READY、FAILED、CANCELLED ' ,
attempt_count INT NOT NULL DEFAULT 0 COMMENT ' 当前动作已失败尝试次数 ' ,
next_retry_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT ' 下次允许投递时间 ' ,
lease_owner VARCHAR ( 128 ) NULL COMMENT ' 当前任务租约持有者 ' ,
lease_until DATETIME ( 3 ) NULL COMMENT ' 当前任务租约截止时间 ' ,
last_error_code VARCHAR ( 32 ) NULL COMMENT ' 最后下游错误码 ' ,
last_error_message VARCHAR ( 1000 ) NULL COMMENT ' 最后诊断错误,不保存敏感凭证 ' ,
remote_config_id BIGINT NULL COMMENT ' Firstleg返回的首条默认尺寸配置ID ' ,
task_version INT NOT NULL DEFAULT 0 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 ' 任务更新时间 ' ,
completed_at DATETIME ( 3 ) NULL COMMENT ' READY或CANCELLED完成时间 ' ,
PRIMARY KEY ( tenant_id ) ,
KEY idx_customer_dimension_task_dispatch ( status , next_retry_at , lease_until ) ,
KEY idx_customer_dimension_task_diagnosis ( status , updated_at )
) ENGINE = InnoDB COMMENT = ' IAM客户默认尺寸可靠后台初始化任务及诊断状态 ' ;
CALL baiyue_firstleg . assert_unified_final_schema ( ) ;
DROP PROCEDURE IF EXISTS baiyue_firstleg . assert_unified_final_schema ;
SELECT ' PASS ' AS migration_status ,