-- ============================================================================ -- S0-FULL-DEMO-COVERAGE-CLOSURE-1 · STEP 1:合同评审周期菜单归位(三件套) -- -- 背景:Web/src/views/aidop/s0/sales/ContractReviewCycleList.vue(681 行)与 -- /api/s0/sales/contract-review-cycles 等 3 个接口、S0ContractReviewCycle 等 2 张表 -- 均已存在,唯独 SysMenu 缺行;前端 isRequestRoutes=true(路由由菜单驱动), -- 故该页在任何租户都不可达(BLOCKED_BY_MENU)。 -- -- 归位而非新造:产销建模子菜单占用 Id …001/002/003/005/006/007 与 OrderNo 1/2/3/5/6/7, -- Id 1329002000004 与 OrderNo 4 恰好双双空缺,与历史「菜单 Id 被复用删除」的记录吻合。 -- -- 三件套(缺一不可,只插 SysMenu 会导致租户/角色不可达): -- ① SysMenu 菜单本身 -- ② SysTenantMenu 租户可见(UATTEST_CHL) -- ③ SysRoleMenu 角色可授权(UAT_FUNCTION_USER) -- -- 幂等:三处均以 NOT EXISTS 保护;重复执行 affected rows = 0。 -- 边界:不改 SysOrg、不动业务数据、无 DDL、无 DELETE。 -- -- ⚠️ WIP:不占正式版本号,AutoVersionUpdate 不会自动应用;提交时 rename 为 -- UpdateScripts/1.0..sql 并登记 csproj Copy 条目。 -- ============================================================================ -- --------------------------------------------------------------------------- -- ① SysMenu:合同评审周期 -- 字段口径对齐同级兄弟菜单 1329002000006 / 1329002000007 -- (Type=2 菜单 / Status=1 启用 / IsHide=0 / IsKeepAlive=1 / IsAffix=0 / IsIframe=0) -- --------------------------------------------------------------------------- INSERT INTO SysMenu (Id, Pid, Type, Title, Path, Component, OrderNo, Status, IsHide, IsKeepAlive, IsAffix, IsIframe) SELECT 1329002000004, 1329002000000, 2, '合同评审周期', '/aidop/s0/sales/contract-review-cycle', '/aidop/s0/sales/ContractReviewCycleList', 4, 1, 0, 1, 0, 0 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SysMenu m WHERE m.Id = 1329002000004) AND NOT EXISTS (SELECT 1 FROM SysMenu m WHERE m.Path = '/aidop/s0/sales/contract-review-cycle') AND EXISTS (SELECT 1 FROM SysMenu p WHERE p.Id = 1329002000000); -- --------------------------------------------------------------------------- -- ② SysTenantMenu:租户可见性(按 SysOrg.Code 解析租户,不硬编码 TenantId) -- Id 取当前最大值 +1(该表无 auto_increment) -- --------------------------------------------------------------------------- SET @crc_menu_id := (SELECT Id FROM SysMenu WHERE Path = '/aidop/s0/sales/contract-review-cycle' LIMIT 1); SET @crc_tenant := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1); SET @crc_tm_base := (SELECT IFNULL(MAX(Id), 0) FROM SysTenantMenu); INSERT INTO SysTenantMenu (Id, TenantId, MenuId) SELECT @crc_tm_base + 1, @crc_tenant, @crc_menu_id FROM DUAL WHERE @crc_menu_id IS NOT NULL AND @crc_tenant IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SysTenantMenu x WHERE x.TenantId = @crc_tenant AND x.MenuId = @crc_menu_id); -- --------------------------------------------------------------------------- -- ③ SysRoleMenu:角色授权 UAT_FUNCTION_USER(UATAdminA 的菜单来源角色) -- 其余 SMART_OPS_* 角色在 SysRoleMenu 中本就 0 条菜单授权,本批不改其语义。 -- --------------------------------------------------------------------------- SET @crc_role := (SELECT r.Id FROM SysRole r WHERE r.TenantId = @crc_tenant AND r.Code = 'UAT_FUNCTION_USER' AND r.Status = 1 LIMIT 1); SET @crc_rm_base := (SELECT IFNULL(MAX(Id), 0) FROM SysRoleMenu); INSERT INTO SysRoleMenu (Id, RoleId, MenuId) SELECT @crc_rm_base + 1, @crc_role, @crc_menu_id FROM DUAL WHERE @crc_menu_id IS NOT NULL AND @crc_role IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SysRoleMenu x WHERE x.RoleId = @crc_role AND x.MenuId = @crc_menu_id);