-- 1.0.535:Batch 4B · S5 IQC 检验单详情统一页 detail/:id 隐藏菜单 + 租户可见 + 角色授权 -- 背景:原「列表页内嵌 el-drawer」(IqcInspBillDetailDrawer)收敛为单一路由页 -- /aidop/s5/iqc/detail/:id(组件 /aidop/s5/iqc/iqcInspBillDetail)。 -- 来料检验任务列表的「待检任务」「检验单」两个 Tab、以及生成检验单后的自动进入, -- 三个入口统一跳此页;页面按后端 detail.canEdit / flowState 决定录入 / 审核 / 处置 / 只读。 -- 与 S7 FQC 的 1.0.382(result-detail 隐藏菜单)同构。 -- 幂等:菜单按 Id NOT EXISTS;租户可见性按 (TenantId,MenuId) NOT EXISTS;角色授权按 (RoleId,MenuId) NOT EXISTS。 -- 多行 Id 用 MAX(Id) + ROW_NUMBER() 一次性算定 —— 避免 @变量在 MySQL 8 求值顺序未定义导致重复 PK -- (窗口函数在 WHERE 之后求值,故行号只覆盖真正会插入的行,不会产生空洞或冲突)。 -- 授权口径:Detail menu authority = IQC business entry authority。 -- 直接**继承**「来料检验任务级列表」(Id=1329015010001,即三个详情入口所在页) 现有的 -- SysTenantMenu / SysRoleMenu 授权面,用子查询继承而非硬编码 Id 清单(跨环境 Id 不同也成立)。 -- 实测该入口菜单当前 = 10 个租户 / 23 个角色;三张 IQC 业务页授权面完全一致(并集=交集)。 -- 页面可打开 ≠ 可编辑:真正的编辑权仍由后端 IqcInspBillEditGate(canEdit) 与流程 Gate 控制。 -- 缓存:IsKeepAlive = 0。详情页是强状态页面(N1 可编辑 → N2 只读 → 退回 → N1 可编辑), -- 不允许 KeepAlive 缓存旧的 canEdit / flowState / 项目结果。 -- 边界:本脚本只建路由菜单与其授权,不新增业务数据、不改 qms_* / ado_s5_iqc_* 结构与数据、不改流程数据。 -- 方言:MySQL(主库 aidopdev)。SysMenu / SysTenantMenu / SysRoleMenu 为框架表 PascalCase。 -- ① 隐藏菜单:IQC检验单详情(Id=1329015010004 = iqcBase+4,Pid=来料检验目录 1322000000015) INSERT INTO SysMenu (Id, Pid, Type, Title, Name, Path, Component, Icon, IsIframe, IsHide, IsKeepAlive, IsAffix, OrderNo, Status, CreateTime) SELECT 1329015010004, 1322000000015, 2, 'IQC检验单详情', 'aidopS5IqcInspBillDetail', '/aidop/s5/iqc/detail/:id', '/aidop/s5/iqc/iqcInspBillDetail', 'ele-Document', 0, 1, 0, 0, 45, 1, NOW() WHERE NOT EXISTS (SELECT 1 FROM SysMenu WHERE Id = 1329015010004); -- ② 租户可见性:继承 1329015010001 的租户面(只插缺失项) INSERT INTO SysTenantMenu (Id, TenantId, MenuId) SELECT base.m + ROW_NUMBER() OVER (ORDER BY src.TenantId), src.TenantId, 1329015010004 FROM (SELECT COALESCE(MAX(Id), 0) AS m FROM SysTenantMenu) base CROSS JOIN (SELECT DISTINCT TenantId FROM SysTenantMenu WHERE MenuId = 1329015010001) src WHERE NOT EXISTS ( SELECT 1 FROM SysTenantMenu x WHERE x.TenantId = src.TenantId AND x.MenuId = 1329015010004 ); -- ③ 角色授权:继承 1329015010001 的角色面(只插缺失项) INSERT INTO SysRoleMenu (Id, RoleId, MenuId) SELECT base.m + ROW_NUMBER() OVER (ORDER BY src.RoleId), src.RoleId, 1329015010004 FROM (SELECT COALESCE(MAX(Id), 0) AS m FROM SysRoleMenu) base CROSS JOIN (SELECT DISTINCT RoleId FROM SysRoleMenu WHERE MenuId = 1329015010001) src WHERE NOT EXISTS ( SELECT 1 FROM SysRoleMenu x WHERE x.RoleId = src.RoleId AND x.MenuId = 1329015010004 );