20260525061910_seed_price_adjust_cate_rule.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. use think\migration\Migrator;
  3. class SeedPriceAdjustCateRule extends Migrator
  4. {
  5. public function up(): void
  6. {
  7. $now = time();
  8. $db = $this->getAdapter()->getConnection();
  9. // 动态查找「财务模块」(基础数据-财务管理)节点 ID
  10. $financeMenu = $db->query("SELECT id FROM `oa_admin_rule` WHERE title='财务模块' AND module='finance' LIMIT 1")
  11. ->fetchAll(\PDO::FETCH_ASSOC);
  12. if (empty($financeMenu)) {
  13. throw new \RuntimeException('找不到财务模块菜单节点,请确认基础数据已安装');
  14. }
  15. $financePid = $financeMenu[0]['id'];
  16. // 动态查找超级权限角色 ID
  17. $superGroup = $db->query("SELECT id FROM `oa_admin_group` WHERE title='超级权限角色' LIMIT 1")
  18. ->fetchAll(\PDO::FETCH_ASSOC);
  19. if (empty($superGroup)) {
  20. throw new \RuntimeException('找不到超级权限角色,请确认基础数据已安装');
  21. }
  22. $superGroupId = $superGroup[0]['id'];
  23. // 菜单节点
  24. $this->execute("INSERT INTO `oa_admin_rule`
  25. (`pid`, `src`, `title`, `name`, `module`, `icon`, `menu`, `sort`, `status`, `create_time`)
  26. VALUES
  27. ({$financePid}, 'finance/priceadjustcate/datalist', '调价类型', '调价类型管理', 'finance', '', 1, 51, 1, {$now})");
  28. $ruleId = $db->lastInsertId();
  29. // 子权限节点
  30. $this->execute("INSERT INTO `oa_admin_rule`
  31. (`pid`, `src`, `title`, `name`, `module`, `icon`, `menu`, `sort`, `status`, `create_time`)
  32. VALUES
  33. ({$ruleId}, 'finance/priceadjustcate/datalist', '列表', '调价类型-列表', 'finance', '', 2, 1, 1, {$now}),
  34. ({$ruleId}, 'finance/priceadjustcate/add', '添加/编辑', '调价类型-添加编辑', 'finance', '', 2, 2, 1, {$now}),
  35. ({$ruleId}, 'finance/priceadjustcate/del', '删除', '调价类型-删除', 'finance', '', 2, 3, 1, {$now}),
  36. ({$ruleId}, 'finance/priceadjustcate/set', '设置', '调价类型-设置', 'finance', '', 2, 4, 1, {$now})");
  37. // 授权给超级权限角色
  38. $this->execute("UPDATE `oa_admin_group`
  39. SET `rules` = CONCAT(`rules`, ',', (
  40. SELECT GROUP_CONCAT(t.id) FROM (
  41. SELECT id FROM `oa_admin_rule` WHERE id = {$ruleId} OR pid = {$ruleId}
  42. ) t
  43. ))
  44. WHERE `id` = {$superGroupId}");
  45. }
  46. public function down(): void
  47. {
  48. $db = $this->getAdapter()->getConnection();
  49. $ruleIds = $db->query("SELECT id FROM `oa_admin_rule` WHERE src LIKE 'finance/priceadjustcate/%'")
  50. ->fetchAll(\PDO::FETCH_COLUMN);
  51. if (!empty($ruleIds)) {
  52. $this->removeRulesFromGroups($ruleIds);
  53. $in = implode(',', array_map('intval', $ruleIds));
  54. $this->execute("DELETE FROM `oa_admin_rule` WHERE id IN ({$in})");
  55. }
  56. }
  57. /**
  58. * 从所有角色的 rules 字段中剔除指定权限节点 ID
  59. *
  60. * @param array<int, int|string> $ruleIds
  61. */
  62. protected function removeRulesFromGroups(array $ruleIds): void
  63. {
  64. $db = $this->getAdapter()->getConnection();
  65. $ruleIds = array_map('strval', $ruleIds);
  66. $groups = $db->query("SELECT id, rules FROM `oa_admin_group`")->fetchAll(\PDO::FETCH_ASSOC);
  67. foreach ($groups as $group) {
  68. $rules = array_filter(explode(',', (string) $group['rules']), static fn($v) => $v !== '');
  69. $kept = array_values(array_diff($rules, $ruleIds));
  70. if (count($kept) !== count($rules)) {
  71. $newRules = implode(',', $kept);
  72. $this->execute("UPDATE `oa_admin_group` SET `rules` = '{$newRules}' WHERE `id` = {$group['id']}");
  73. }
  74. }
  75. }
  76. }