1.0.543.sql 5.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. -- =============================================================================
  2. -- S6-IPQC-BILL-PAGE-1 · 「IPQC 检查单」独立 Tab + 独立详情页菜单
  3. --
  4. -- 背景:S6 的过程检验单(S6_PROCESS_INSPECTION 链,源 ado_s6_process_inspection_bill)
  5. -- 此前没有任何菜单入口 —— 用户必须先进「生产指令单列表」,再从行操作打开一个 Drawer
  6. -- 才能完成录入/提交/审核/处置。本脚本为它建立独立入口,与 S7 FQC 的信息架构对齐。
  7. --
  8. -- 两条同名链务必区分(改错会白做):
  9. -- 本脚本服务的是 S6_PROCESS_INSPECTION(工序级、有 S0 检规快照、逐样本实测);
  10. -- 既有菜单 1329016020001「过程检验单列表」是另一条 IPQC_INSPECTION 链(源 qms_gcjyd、
  11. -- 单头级汇总),本脚本完全不动它。
  12. --
  13. -- 路由形态沿用 S5 IQC(1.0.535.sql)的修正版,而不是 S7 FQC(1.0.382.sql):
  14. -- * 详情页用 path param /:id,不用 ?id= —— 路径即状态,便于直链与刷新;
  15. -- * 详情页 IsKeepAlive = 0。它是强状态页面(可录入 → 只读 → 退回 → 可录入),
  16. -- KeepAlive 会缓存旧的 canEdit / flowState / 项目结果。S7 那条设成 1,是已知问题。
  17. -- * 列表页 IsKeepAlive = 1,从详情返回时保留分页与查询条件(页面自身 onActivated 重新取数)。
  18. --
  19. -- 授权口径同样沿用 S5:租户可见性与角色授权都**子查询继承**同目录入口菜单
  20. -- 1329016020001 的既有授权面(实测 10 个租户 / 23 个角色),不硬编码 RoleId、
  21. -- 不新建权限码(Permission 留 NULL,与 S6 其余菜单一致)。
  22. -- 这样后续给该目录加/减授权时,这两个新菜单自动跟随,不会漏配。
  23. --
  24. -- Id 生成沿用 1.0.535.sql 的 `MAX(Id) + ROW_NUMBER()`,且**一段只处理一个 MenuId** ——
  25. -- 两个菜单不合并成一条 CROSS JOIN。合并写法需要在 Id 里同时编码「菜单序」与「租户序」,
  26. -- 极易写出对同一菜单所有租户取同值的表达式而撞主键(本脚本第一版就是这么挂的)。
  27. --
  28. -- 幂等:每段 INSERT 都带 NOT EXISTS;重复执行 0 变更。
  29. -- =============================================================================
  30. -- ── 1. 列表页菜单(可见 Tab)──
  31. INSERT INTO SysMenu (Id, Pid, Type, Name, Path, Component, Title, Icon, IsIframe, IsHide, IsKeepAlive, IsAffix, OrderNo, Status, Remark, CreateTime)
  32. SELECT 1329016020002, 1322000000020, 2, 'aidopS6IpqcBillList',
  33. '/aidop/s6/process-quality/ipqc-bill-list',
  34. '/aidop/s6/process-quality/ipqcBillList',
  35. 'IPQC 检查单', 'ele-Tickets',
  36. 0, 0, 1, 0, 20, 1, 'S6-IPQC-BILL-PAGE-1 过程检验单(工序级)独立入口', NOW()
  37. FROM DUAL
  38. WHERE NOT EXISTS (SELECT 1 FROM (SELECT Id FROM SysMenu) t WHERE t.Id = 1329016020002);
  39. -- ── 2. 详情页菜单(hidden child route,不出现在菜单树里)──
  40. INSERT INTO SysMenu (Id, Pid, Type, Name, Path, Component, Title, Icon, IsIframe, IsHide, IsKeepAlive, IsAffix, OrderNo, Status, Remark, CreateTime)
  41. SELECT 1329016020003, 1322000000020, 2, 'aidopS6IpqcBillDetail',
  42. '/aidop/s6/process-quality/ipqc-bill-detail/:id',
  43. '/aidop/s6/process-quality/ipqcBillDetail',
  44. 'IPQC 检查单详情', 'ele-Document',
  45. 0, 1, 0, 0, 21, 1, 'S6-IPQC-BILL-PAGE-1 强状态详情页,IsKeepAlive=0', NOW()
  46. FROM DUAL
  47. WHERE NOT EXISTS (SELECT 1 FROM (SELECT Id FROM SysMenu) t WHERE t.Id = 1329016020003);
  48. -- ── 3. 列表页租户可见性:继承 1329016020001 的租户面 ──
  49. INSERT INTO SysTenantMenu (Id, TenantId, MenuId)
  50. SELECT base.m + ROW_NUMBER() OVER (ORDER BY src.TenantId), src.TenantId, 1329016020002
  51. FROM (SELECT COALESCE(MAX(Id), 0) AS m FROM SysTenantMenu) base
  52. CROSS JOIN (SELECT DISTINCT TenantId FROM SysTenantMenu WHERE MenuId = 1329016020001) src
  53. WHERE NOT EXISTS (
  54. SELECT 1 FROM (SELECT TenantId, MenuId FROM SysTenantMenu) x
  55. WHERE x.TenantId = src.TenantId AND x.MenuId = 1329016020002
  56. );
  57. -- ── 4. 详情页租户可见性:同上 ──
  58. INSERT INTO SysTenantMenu (Id, TenantId, MenuId)
  59. SELECT base.m + ROW_NUMBER() OVER (ORDER BY src.TenantId), src.TenantId, 1329016020003
  60. FROM (SELECT COALESCE(MAX(Id), 0) AS m FROM SysTenantMenu) base
  61. CROSS JOIN (SELECT DISTINCT TenantId FROM SysTenantMenu WHERE MenuId = 1329016020001) src
  62. WHERE NOT EXISTS (
  63. SELECT 1 FROM (SELECT TenantId, MenuId FROM SysTenantMenu) x
  64. WHERE x.TenantId = src.TenantId AND x.MenuId = 1329016020003
  65. );
  66. -- ── 5. 列表页角色授权:继承 1329016020001 的角色面 ──
  67. INSERT INTO SysRoleMenu (Id, RoleId, MenuId)
  68. SELECT base.m + ROW_NUMBER() OVER (ORDER BY src.RoleId), src.RoleId, 1329016020002
  69. FROM (SELECT COALESCE(MAX(Id), 0) AS m FROM SysRoleMenu) base
  70. CROSS JOIN (SELECT DISTINCT RoleId FROM SysRoleMenu WHERE MenuId = 1329016020001) src
  71. WHERE NOT EXISTS (
  72. SELECT 1 FROM (SELECT RoleId, MenuId FROM SysRoleMenu) x
  73. WHERE x.RoleId = src.RoleId AND x.MenuId = 1329016020002
  74. );
  75. -- ── 6. 详情页角色授权:同上 ──
  76. INSERT INTO SysRoleMenu (Id, RoleId, MenuId)
  77. SELECT base.m + ROW_NUMBER() OVER (ORDER BY src.RoleId), src.RoleId, 1329016020003
  78. FROM (SELECT COALESCE(MAX(Id), 0) AS m FROM SysRoleMenu) base
  79. CROSS JOIN (SELECT DISTINCT RoleId FROM SysRoleMenu WHERE MenuId = 1329016020001) src
  80. WHERE NOT EXISTS (
  81. SELECT 1 FROM (SELECT RoleId, MenuId FROM SysRoleMenu) x
  82. WHERE x.RoleId = src.RoleId AND x.MenuId = 1329016020003
  83. );