getAdapter()->getConnection(); // 动态查找财务管理菜单节点 ID $financeMenu = $db->query("SELECT id FROM `oa_admin_rule` WHERE title='财务管理' AND module='finance' AND pid=0 LIMIT 1") ->fetchAll(\PDO::FETCH_ASSOC); if (empty($financeMenu)) { throw new \RuntimeException('找不到财务管理菜单节点,请确认基础数据已安装'); } $financePid = $financeMenu[0]['id']; // 动态查找审批流程财务模块 ID(oa_flow_module.title='财务') $flowModule = $db->query("SELECT id FROM `oa_flow_module` WHERE title='财务' LIMIT 1") ->fetchAll(\PDO::FETCH_ASSOC); if (empty($flowModule)) { throw new \RuntimeException('找不到审批流程财务模块,请确认基础数据已安装'); } $flowModuleId = $flowModule[0]['id']; // 动态查找超级权限角色 ID $superGroup = $db->query("SELECT id FROM `oa_admin_group` WHERE title='超级权限角色' LIMIT 1") ->fetchAll(\PDO::FETCH_ASSOC); if (empty($superGroup)) { throw new \RuntimeException('找不到超级权限角色,请确认基础数据已安装'); } $superGroupId = $superGroup[0]['id']; // 1. 注册审批类型 $this->execute("INSERT INTO `oa_flow_cate` (`title`, `name`, `module_id`, `check_table`, `icon`, `department_ids`, `sort`, `is_copy`, `is_file`, `is_export`, `is_back`, `is_reversed`, `form`, `add_url`, `view_url`, `form_id`, `is_list`, `status`, `template_id`, `create_time`, `update_time`) VALUES ('授信&核销申请', 'credit_writeoff', {$flowModuleId}, 'credit_writeoff', 'icon-shoukuanzuofei', '', 51, 1, 1, 0, 1, 0, 1, '/finance/creditwriteoff/add', '/finance/creditwriteoff/view', 0, 1, 1, 0, {$now}, 0)"); $cateId = $db->lastInsertId(); // 2. 创建默认审批流程(自由审批流) $this->execute("INSERT INTO `oa_flow` (`title`, `cate_id`, `check_type`, `department_ids`, `copy_uids`, `flow_list`, `status`, `remark`, `admin_id`, `create_time`) VALUES ('授信&核销申请审批', {$cateId}, 1, '', '', '', 1, '', 1, {$now})"); // 3. 注册消息模板 $this->execute("INSERT INTO `oa_template` (`title`, `name`, `types`, `check_types`, `remark`, `msg_link`, `msg_title_0`, `msg_content_0`, `msg_title_1`, `msg_content_1`, `msg_title_2`, `msg_content_2`, `msg_title_3`, `msg_content_3`, `email_link`, `status`, `admin_id`, `create_time`, `update_time`) VALUES ('授信&核销申请审批', 'credit_writeoff', 2, 0, '', '/finance/creditwriteoff/view/id/{action_id}', '{from_user}提交了一个『授信&核销申请』,请及时审批', '您有一个新的『授信&核销申请』需要处理。', '您提交的『授信&核销申请』已被审批通过。', '您在{create_time}提交的『授信&核销申请』已于{date}被审批通过。', '您提交的『授信&核销申请』已被驳回拒绝。', '您在{create_time}提交的『授信&核销申请』已于{date}被驳回拒绝。', '{from_user}提交的『授信&核销申请』已被审批通过并抄送给你', '{from_user}在{create_time}提交的『授信&核销申请』已被审批通过并抄送给你,请及时查看详情。', '', 1, 1, {$now}, 0)"); $tplId = $db->lastInsertId(); $this->execute("UPDATE `oa_flow_cate` SET `template_id` = {$tplId} WHERE `id` = {$cateId}"); // 4. 菜单 + 权限节点 $this->execute("INSERT INTO `oa_admin_rule` (`pid`, `src`, `title`, `name`, `module`, `icon`, `menu`, `sort`, `status`, `create_time`) VALUES ({$financePid}, 'finance/creditwriteoff/datalist', '授信&核销申请', '授信&核销申请', 'finance', 'icon-shoukuanzuofei', 1, 51, 1, {$now})"); $ruleId = $db->lastInsertId(); $this->execute("INSERT INTO `oa_admin_rule` (`pid`, `src`, `title`, `name`, `module`, `icon`, `menu`, `sort`, `status`, `create_time`) VALUES ({$ruleId}, 'finance/creditwriteoff/datalist', '列表', '授信核销申请-列表', 'finance', '', 2, 1, 1, {$now}), ({$ruleId}, 'finance/creditwriteoff/add', '添加/编辑', '授信核销申请-添加编辑', 'finance', '', 2, 2, 1, {$now}), ({$ruleId}, 'finance/creditwriteoff/view', '详情', '授信核销申请-详情', 'finance', '', 2, 3, 1, {$now}), ({$ruleId}, 'finance/creditwriteoff/del', '删除', '授信核销申请-删除', 'finance', '', 2, 4, 1, {$now})"); // 5. 授权给超级权限角色 $this->execute("UPDATE `oa_admin_group` SET `rules` = CONCAT(`rules`, ',', ( SELECT GROUP_CONCAT(t.id) FROM ( SELECT id FROM `oa_admin_rule` WHERE id = {$ruleId} OR pid = {$ruleId} ) t )) WHERE `id` = {$superGroupId}"); } public function down(): void { $db = $this->getAdapter()->getConnection(); // 1. 回收权限节点:先从超级权限角色 rules 中剔除,再删除节点 $ruleIds = $db->query("SELECT id FROM `oa_admin_rule` WHERE src LIKE 'finance/creditwriteoff/%'") ->fetchAll(\PDO::FETCH_COLUMN); if (!empty($ruleIds)) { $this->removeRulesFromGroups($ruleIds); $in = implode(',', array_map('intval', $ruleIds)); $this->execute("DELETE FROM `oa_admin_rule` WHERE id IN ({$in})"); } // 2. 删除审批流程(依赖审批类型 cate_id,需先删) $cateIds = $db->query("SELECT id FROM `oa_flow_cate` WHERE name='credit_writeoff'") ->fetchAll(\PDO::FETCH_COLUMN); if (!empty($cateIds)) { $in = implode(',', array_map('intval', $cateIds)); $this->execute("DELETE FROM `oa_flow` WHERE `cate_id` IN ({$in})"); } // 3. 删除消息模板与审批类型 $this->execute("DELETE FROM `oa_template` WHERE `name` = 'credit_writeoff'"); $this->execute("DELETE FROM `oa_flow_cate` WHERE `name` = 'credit_writeoff'"); } /** * 从所有角色的 rules 字段中剔除指定权限节点 ID * * @param array $ruleIds */ protected function removeRulesFromGroups(array $ruleIds): void { $db = $this->getAdapter()->getConnection(); $ruleIds = array_map('strval', $ruleIds); $groups = $db->query("SELECT id, rules FROM `oa_admin_group`")->fetchAll(\PDO::FETCH_ASSOC); foreach ($groups as $group) { $rules = array_filter(explode(',', (string) $group['rules']), static fn($v) => $v !== ''); $kept = array_values(array_diff($rules, $ruleIds)); if (count($kept) !== count($rules)) { $newRules = implode(',', $kept); $this->execute("UPDATE `oa_admin_group` SET `rules` = '{$newRules}' WHERE `id` = {$group['id']}"); } } } }