# 商户端角色管理菜单树加载问题 - 完整分析报告

## 问题现象
商户端访问"系统管理 → 角色管理 → 新增"时，菜单权限树一直显示"加载中，请稍候"，无法加载菜单数据。
而平台端相同功能正常。

## 问题根源

### 核心原因
**商户端用户的角色分配的菜单，其 `platform_id` 不是 1（商户端），导致查询时被过滤掉。**

### 技术分析

1. **查询逻辑**（`SysMenuServiceImpl.selectMenuList`）：
   ```java
   // 第一步：权限过滤（非超管用户）
   if (!LoginHelper.isSuperAdmin(userId)) {
       wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId));
   }
   
   // 第二步：平台过滤
   int platformId = PlatformUtils.getId(); // 商户端返回 1
   wrapper.eq(SysMenu::getPlatformId, platformId);
   ```

2. **问题链路**：
   ```
   商户端用户登录
   → 请求头携带 PLATFORM_CODE: "SHANGHUDUAN"
   → PlatformUtils.getId() 返回 1
   → 查询条件：
      - 用户角色分配的菜单（通过 sys_role_menu）
      - AND platform_id = 1
   → 但角色分配的菜单都是 platform_id = 0 或 NULL
   → 结果为空
   ```

3. **数据验证结果**：
   - 数据库中 `platform_id = 0` 有 134 条菜单（平台端）
   - 数据库中 `platform_id = 1` 有 6 条菜单（商户端）
   - 商户端用户角色分配的菜单：`platform_id = NULL` 或 `0`，没有 `platform_id = 1` 的

## 解决方案

### 方案 1：为商户端角色重新分配菜单（推荐）

```sql
-- 1. 确认商户端用户ID和角色ID
SET @merchant_user_id = 2038434195944886273;

SELECT sur.role_id, sr.role_name
FROM sys_user_role sur
LEFT JOIN sys_role sr ON sur.role_id = sr.role_id
WHERE sur.user_id = @merchant_user_id;

-- 2. 删除旧的菜单权限
SET @merchant_role_id = 100; -- 替换为实际的角色ID
DELETE FROM sys_role_menu WHERE role_id = @merchant_role_id;

-- 3. 为角色分配所有 platform_id=1 的菜单
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT @merchant_role_id, menu_id
FROM sys_menu
WHERE platform_id = 1;
```

### 方案 2：将现有菜单改为商户端可用

如果商户端需要的菜单功能和平台端一致，可以将这些菜单的 `platform_id` 改为 1：

```sql
-- 将系统管理相关菜单设为商户端
UPDATE sys_menu SET platform_id = 1 
WHERE menu_id IN (
    1,    -- 系统管理
    100,  -- 用户管理
    101,  -- 角色管理
    102,  -- 菜单管理
    103,  -- 部门管理
    -- ... 其他需要的菜单ID
);
```

### 方案 3：同时支持多平台（修改代码）

如果希望某些菜单在两个平台都可见，需要修改查询逻辑，支持 `platform_id IN (0, 1)` 或引入菜单平台关联表。

## 验证步骤

1. **执行修复SQL**
2. **验证数据**：
   ```sql
   -- 查看角色菜单的平台分布
   SELECT sm.platform_id, COUNT(*) as count
   FROM sys_role_menu srm
   LEFT JOIN sys_menu sm ON srm.menu_id = sm.menu_id
   WHERE srm.role_id = @merchant_role_id
   GROUP BY sm.platform_id;
   
   -- 应该显示 platform_id = 1 有数据
   ```

3. **重启后端服务**
4. **清除浏览器缓存**
5. **商户端登录测试**：系统管理 → 角色管理 → 新增

## 相关文件

- 前端页面：`sj-merchant-web/src/views/system/role/index.vue`
- 前端API：`sj-merchant-web/src/api/system/menu/index.ts`
- 后端控制器：`ruoyi-system/.../SysMenuController.java:84-89`
- 后端服务：`ruoyi-system/.../SysMenuServiceImpl.java:73-93`
- 平台工具：`yp-common-platform/.../PlatformUtils.java`
- 修复脚本：`script/sql/fix_merchant_role_permission.sql`

## 总结

问题不在于代码逻辑或 `platform_id` 字段缺失，而是**数据配置问题**：
- 商户端用户的角色分配的菜单权限（`sys_role_menu`）指向的菜单，其 `platform_id` 不是商户端的值（1）
- 查询时先通过角色过滤，再通过平台过滤，两个条件的交集为空

修复方式：确保商户端角色分配的菜单，其 `platform_id = 1`。
