har-order-refund-menu.sql 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. -- 汇安融订单管理:新增「退款」权限点(2026-09-28)
  2. --
  3. -- 执行人:用户。本平台没有直连该库的通道,所以这份脚本**由我编写、只由你执行**。
  4. -- 本脚本是幂等的:重复执行不会产生第二行(两处 INSERT 都带 NOT EXISTS)。
  5. --
  6. -- 为什么是新增一个权限点,而不是复用 sync / create:
  7. -- PermissionCheck.hasAny 是按 authorities 集合做**精确匹配**(全等)。
  8. -- 复用 sync 的后果不是「少一层保护」而是**放大权限** —— 能查一笔单的人就能把钱退了。
  9. -- 后端那一侧由 HarOrderControllerTest#refund_hasItsOwnPermission_notReusedFromAnyOtherEndpoint
  10. -- 钉住,这里这一行必须与它逐字一致:module_payment:har:order:refund
  11. --
  12. -- 谁拿到这个权限:
  13. -- role 1 = ADMIN、role 2 = tenant 都授予 —— 与现状一致,租户本来就能通过
  14. -- 开放 API(POST /payment/openapi/alipay/refund)退自己商户的单,后台按钮只是同一能力的界面。
  15. -- 若要**只给 ADMIN、不给租户**:执行完把最后那段 role 2 的 INSERT 换成它下面注释里的 DELETE。
  16. -- ---------- 权限点:挂在「订单管理」页面下 ----------
  17. -- type=3 = 按钮级权限点。parent 必须指向已存在的那一页,否则 UserService.buildMenuTree
  18. -- 会把父节点不在集合里的子节点**直接丢弃**(静默消失,不报错)。
  19. INSERT INTO sys_menu (parent_id, name, title, permission, type, "order",
  20. hidden, keep_alive, always_show, affix, status, created_time, updated_time)
  21. SELECT (SELECT id FROM sys_menu WHERE route_path = '/payment/har/order' AND type = 2),
  22. '订单退款', '订单退款', 'module_payment:har:order:refund', 3,
  23. (SELECT COALESCE(MAX("order"), 0) + 1 FROM sys_menu
  24. WHERE parent_id = (SELECT id FROM sys_menu WHERE route_path = '/payment/har/order' AND type = 2)),
  25. false, false, false, false, '0', now(), now()
  26. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE permission = 'module_payment:har:order:refund');
  27. -- ---------- 角色授权 ----------
  28. -- 只授权**这一个**权限点(不像 har-menu.sql 那样按 `module_payment:har:order:%` 通配),
  29. -- 免得将来加权限点时这份脚本被重跑一次就顺带全授出去。
  30. INSERT INTO sys_role_menus (role_id, menu_id)
  31. SELECT 1, id FROM sys_menu WHERE permission = 'module_payment:har:order:refund'
  32. AND NOT EXISTS (SELECT 1 FROM sys_role_menus rm
  33. WHERE rm.role_id = 1
  34. AND rm.menu_id = (SELECT id FROM sys_menu WHERE permission = 'module_payment:har:order:refund'));
  35. INSERT INTO sys_role_menus (role_id, menu_id)
  36. SELECT 2, id FROM sys_menu WHERE permission = 'module_payment:har:order:refund'
  37. AND NOT EXISTS (SELECT 1 FROM sys_role_menus rm
  38. WHERE rm.role_id = 2
  39. AND rm.menu_id = (SELECT id FROM sys_menu WHERE permission = 'module_payment:har:order:refund'));
  40. -- 若不想给租户(role 2),改用下面这句代替上面那段 role 2 的 INSERT:
  41. -- DELETE FROM sys_role_menus
  42. -- WHERE role_id = 2
  43. -- AND menu_id = (SELECT id FROM sys_menu WHERE permission = 'module_payment:har:order:refund');
  44. -- ---------- 只读核对(可随时复量,不写任何数据)----------
  45. -- 期望:一行,type=3,parent 指向 /payment/har/order 那一页,两个角色各有一条授权。
  46. SELECT m.id, m.parent_id, m.title, m.permission, m.type, m."order",
  47. (SELECT string_agg(rm.role_id::text, ',' ORDER BY rm.role_id)
  48. FROM sys_role_menus rm WHERE rm.menu_id = m.id) AS granted_roles
  49. FROM sys_menu m
  50. WHERE m.permission = 'module_payment:har:order:refund';
  51. -- ★ 执行后必须**重新登录**才生效:权限集合在登录时进 token / 权限 store,
  52. -- 不重登的话菜单里不会有这一项,后端也会照旧 403。