20260525090005_seed_vcc_payment_data.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. use think\migration\Migrator;
  3. class SeedVccPaymentData 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' AND pid=0 LIMIT 1")
  11. ->fetchAll(\PDO::FETCH_ASSOC);
  12. if (empty($financeMenu)) {
  13. throw new \RuntimeException('找不到财务管理菜单节点,请确认基础数据已安装');
  14. }
  15. $financePid = $financeMenu[0]['id'];
  16. // 动态查找审批流程财务模块 ID(oa_flow_module.title='财务')
  17. $flowModule = $db->query("SELECT id FROM `oa_flow_module` WHERE title='财务' LIMIT 1")
  18. ->fetchAll(\PDO::FETCH_ASSOC);
  19. if (empty($flowModule)) {
  20. throw new \RuntimeException('找不到审批流程财务模块,请确认基础数据已安装');
  21. }
  22. $flowModuleId = $flowModule[0]['id'];
  23. // 动态查找超级权限角色 ID
  24. $superGroup = $db->query("SELECT id FROM `oa_admin_group` WHERE title='超级权限角色' LIMIT 1")
  25. ->fetchAll(\PDO::FETCH_ASSOC);
  26. if (empty($superGroup)) {
  27. throw new \RuntimeException('找不到超级权限角色,请确认基础数据已安装');
  28. }
  29. $superGroupId = $superGroup[0]['id'];
  30. // 1. 注册审批类型
  31. $this->execute("INSERT INTO `oa_flow_cate`
  32. (`title`, `name`, `module_id`, `check_table`, `icon`,
  33. `department_ids`, `sort`, `is_copy`, `is_file`, `is_export`, `is_back`, `is_reversed`,
  34. `form`, `add_url`, `view_url`, `form_id`, `is_list`, `status`,
  35. `template_id`, `create_time`, `update_time`)
  36. VALUES
  37. ('VCC返点/提成付款申请', 'vcc_payment', {$flowModuleId}, 'vcc_payment', 'icon-fukuanshenqing',
  38. '', 52, 1, 1, 0, 1, 0,
  39. 1, '/finance/vccpayment/add', '/finance/vccpayment/view', 0, 1, 1,
  40. 0, {$now}, 0)");
  41. $cateId = $db->lastInsertId();
  42. // 2. 创建默认审批流程(自由审批流)
  43. $this->execute("INSERT INTO `oa_flow`
  44. (`title`, `cate_id`, `check_type`, `department_ids`, `copy_uids`, `flow_list`,
  45. `status`, `remark`, `admin_id`, `create_time`)
  46. VALUES
  47. ('VCC返点/提成付款申请审批', {$cateId}, 1, '', '', '', 1, '', 1, {$now})");
  48. // 3. 注册消息模板
  49. $this->execute("INSERT INTO `oa_template`
  50. (`title`, `name`, `types`, `check_types`, `remark`, `msg_link`,
  51. `msg_title_0`, `msg_content_0`,
  52. `msg_title_1`, `msg_content_1`,
  53. `msg_title_2`, `msg_content_2`,
  54. `msg_title_3`, `msg_content_3`,
  55. `email_link`, `status`, `admin_id`, `create_time`, `update_time`)
  56. VALUES
  57. ('VCC返点/提成付款申请审批', 'vcc_payment', 2, 0, '', '/finance/vccpayment/view/id/{action_id}',
  58. '{from_user}提交了一个『VCC返点/提成付款申请』,请及时审批',
  59. '您有一个新的『VCC返点/提成付款申请』需要处理。',
  60. '您提交的『VCC返点/提成付款申请』已被审批通过。',
  61. '您在{create_time}提交的『VCC返点/提成付款申请』已于{date}被审批通过。',
  62. '您提交的『VCC返点/提成付款申请』已被驳回拒绝。',
  63. '您在{create_time}提交的『VCC返点/提成付款申请』已于{date}被驳回拒绝。',
  64. '{from_user}提交的『VCC返点/提成付款申请』已被审批通过并抄送给你',
  65. '{from_user}在{create_time}提交的『VCC返点/提成付款申请』已被审批通过并抄送给你,请及时查看详情。',
  66. '', 1, 1, {$now}, 0)");
  67. $tplId = $db->lastInsertId();
  68. $this->execute("UPDATE `oa_flow_cate` SET `template_id` = {$tplId} WHERE `id` = {$cateId}");
  69. // 4. 菜单 + 权限节点
  70. $this->execute("INSERT INTO `oa_admin_rule`
  71. (`pid`, `src`, `title`, `name`, `module`, `icon`, `menu`, `sort`, `status`, `create_time`)
  72. VALUES
  73. ({$financePid}, 'finance/vccpayment/datalist', 'VCC返点/提成付款申请', 'VCC返点/提成付款申请', 'finance', 'icon-fukuanshenqing', 1, 52, 1, {$now})");
  74. $ruleId = $db->lastInsertId();
  75. $this->execute("INSERT INTO `oa_admin_rule`
  76. (`pid`, `src`, `title`, `name`, `module`, `icon`, `menu`, `sort`, `status`, `create_time`)
  77. VALUES
  78. ({$ruleId}, 'finance/vccpayment/datalist', '列表', 'VCC付款申请-列表', 'finance', '', 2, 1, 1, {$now}),
  79. ({$ruleId}, 'finance/vccpayment/add', '添加/编辑', 'VCC付款申请-添加编辑', 'finance', '', 2, 2, 1, {$now}),
  80. ({$ruleId}, 'finance/vccpayment/view', '详情', 'VCC付款申请-详情', 'finance', '', 2, 3, 1, {$now}),
  81. ({$ruleId}, 'finance/vccpayment/del', '删除', 'VCC付款申请-删除', 'finance', '', 2, 4, 1, {$now})");
  82. // 5. 授权给超级权限角色
  83. $this->execute("UPDATE `oa_admin_group`
  84. SET `rules` = CONCAT(`rules`, ',', (
  85. SELECT GROUP_CONCAT(t.id) FROM (
  86. SELECT id FROM `oa_admin_rule` WHERE id = {$ruleId} OR pid = {$ruleId}
  87. ) t
  88. ))
  89. WHERE `id` = {$superGroupId}");
  90. }
  91. public function down(): void
  92. {
  93. $db = $this->getAdapter()->getConnection();
  94. // 1. 回收权限节点:先从超级权限角色 rules 中剔除,再删除节点
  95. $ruleIds = $db->query("SELECT id FROM `oa_admin_rule` WHERE src LIKE 'finance/vccpayment/%'")
  96. ->fetchAll(\PDO::FETCH_COLUMN);
  97. if (!empty($ruleIds)) {
  98. $this->removeRulesFromGroups($ruleIds);
  99. $in = implode(',', array_map('intval', $ruleIds));
  100. $this->execute("DELETE FROM `oa_admin_rule` WHERE id IN ({$in})");
  101. }
  102. // 2. 删除审批流程(依赖审批类型 cate_id,需先删)
  103. $cateIds = $db->query("SELECT id FROM `oa_flow_cate` WHERE name='vcc_payment'")
  104. ->fetchAll(\PDO::FETCH_COLUMN);
  105. if (!empty($cateIds)) {
  106. $in = implode(',', array_map('intval', $cateIds));
  107. $this->execute("DELETE FROM `oa_flow` WHERE `cate_id` IN ({$in})");
  108. }
  109. // 3. 删除消息模板与审批类型
  110. $this->execute("DELETE FROM `oa_template` WHERE `name` = 'vcc_payment'");
  111. $this->execute("DELETE FROM `oa_flow_cate` WHERE `name` = 'vcc_payment'");
  112. }
  113. /**
  114. * 从所有角色的 rules 字段中剔除指定权限节点 ID
  115. *
  116. * @param array<int, int|string> $ruleIds
  117. */
  118. protected function removeRulesFromGroups(array $ruleIds): void
  119. {
  120. $db = $this->getAdapter()->getConnection();
  121. $ruleIds = array_map('strval', $ruleIds);
  122. $groups = $db->query("SELECT id, rules FROM `oa_admin_group`")->fetchAll(\PDO::FETCH_ASSOC);
  123. foreach ($groups as $group) {
  124. $rules = array_filter(explode(',', (string) $group['rules']), static fn($v) => $v !== '');
  125. $kept = array_values(array_diff($rules, $ruleIds));
  126. if (count($kept) !== count($rules)) {
  127. $newRules = implode(',', $kept);
  128. $this->execute("UPDATE `oa_admin_group` SET `rules` = '{$newRules}' WHERE `id` = {$group['id']}");
  129. }
  130. }
  131. }
  132. }