upgrade(); echo "[OK] Shopro::upgrade() 执行完成\n"; } catch (\Exception $e) { echo "[WARN] Shopro::upgrade() 异常: " . $e->getMessage() . "\n"; } // 2. 若仍未写入,使用 menuCreateOrUpdate 强制补写 $menus = \think\Db::name('auth_rule') ->where('name', 'like', 'shopro/regional_agent%') ->column('name'); if (!$menus && $hasRegionalInFile) { echo "[INFO] 尝试强制补写菜单...\n"; try { $reflection = new ReflectionClass(\addons\shopro\Shopro::class); $getMenu = $reflection->getMethod('getMenu'); $getMenu->setAccessible(true); $menuData = $getMenu->invoke(null); $menuCreateOrUpdate = $reflection->getMethod('menuCreateOrUpdate'); $menuCreateOrUpdate->setAccessible(true); $menuCreateOrUpdate->invoke(null, $menuData['new'], $menuData['old']); $menus = \think\Db::name('auth_rule') ->where('name', 'like', 'shopro/regional_agent%') ->column('name'); echo $menus ? "[OK] 强制补写成功\n" : "[FAIL] 强制补写后仍未找到菜单\n"; } catch (\Exception $e) { echo "[FAIL] 强制补写失败: " . $e->getMessage() . "\n"; } } // 3. 最终检查 $menus = \think\Db::name('auth_rule') ->where('name', 'like', 'shopro/regional_agent%') ->column('name'); if ($menus) { echo "[OK] 区域代理菜单已存在 (" . count($menus) . " 条):\n"; foreach ($menus as $name) { echo " - {$name}\n"; } } else { echo "[WARN] 数据库中仍未找到 shopro/regional_agent 菜单\n"; echo " 请执行 SQL: addons/shopro/upgrade_regional_agent_menu.sql\n"; } // 3.1 修正 pid:与「分销中心」挂在同一父级(避免挂在隐藏的 shopro 根节点下) $commission = \think\Db::name('auth_rule')->where('name', 'shopro/commission')->find(); $regional = \think\Db::name('auth_rule')->where('name', 'shopro/regional_agent')->find(); if ($commission && $regional) { if ((int) $regional['pid'] !== (int) $commission['pid']) { \think\Db::name('auth_rule')->where('id', $regional['id'])->update([ 'pid' => $commission['pid'], 'ismenu' => 1, 'status' => 'normal', 'weigh' => 5, ]); echo "[OK] 已将区域代理 pid 修正为 {$commission['pid']}(与分销中心同级)\n"; } else { echo "[OK] 区域代理 pid={$regional['pid']} 已与分销中心一致\n"; } } // 3.2 清除菜单缓存 \think\Cache::rm('__menu__'); echo "[OK] 已清除菜单缓存 __menu__\n"; // 4. 文件检查 $files = [ 'addons/shopro/config/menu.php', 'addons/shopro/listener/regional_agent/RegionalAgentHook.php', 'application/admin/controller/shopro/regional_agent/Agent.php', 'public/assets/js/backend/shopro/regional_agent/agent.js', ]; echo "\n文件检查:\n"; foreach ($files as $f) { $path = ROOT_PATH . $f; echo file_exists($path) ? "[OK] {$f}\n" : "[MISS] {$f} 未上传\n"; } // 5. 分配超级管理员权限 $newRuleIds = \think\Db::name('auth_rule') ->where('name', 'like', 'shopro/regional_agent%') ->column('id'); if ($newRuleIds) { $group = \think\Db::name('auth_group')->where('id', 1)->find(); if ($group) { $rules = $group['rules'] === '*' ? '*' : ($group['rules'] ? explode(',', $group['rules']) : []); if ($rules !== '*') { $merged = array_unique(array_merge($rules, $newRuleIds)); \think\Db::name('auth_group')->where('id', 1)->update([ 'rules' => implode(',', $merged), ]); } echo "\n[OK] 已为超级管理员组(id=1)分配区域代理菜单权限\n"; } } echo "\n=== 完成。请退出后台重新登录 ===\n";