# 商户端角色管理菜单树加载问题 - Debug 指南

## 问题现象
商户端访问"角色管理-新增"时，菜单权限树一直显示"加载中，请稍候"，无法正常加载菜单数据。

## 根本原因
**数据库 `sys_menu` 表缺少 `platform_id` 字段**，导致后端查询时 SQL 报错或返回空结果。

## 技术分析

### 1. 接口调用链
```
前端: sj-merchant-web/src/views/system/role/index.vue
  → handleAdd() 方法
  → getMenuTreeselect() 
  → API: GET /system/menu/treeselect

后端: SysMenuController.treeselect()
  → SysMenuServiceImpl.selectMenuList()
  → 查询条件包含: .eq(SysMenu::getPlatformId, platformId)
```

### 2. 平台识别机制
- 前端配置: `.env.development` 中 `VITE_APP_PLATFORM_CODE="SHANGHUDUAN"`
- 请求头: `PLATFORM_CODE: SHANGHUDUAN`
- 后端解析: `PlatformUtils.getId()` → 返回 1（商户端）
- 平台枚举:
  - `ADMIN(0, "PINGTAIDUAN", "平台端")`
  - `MERCHANT(1, "SHANGHUDUAN", "商户端")`

### 3. 问题代码位置
**SysMenuServiceImpl.java:82-87**
```java
int platformId = menu.getPlatformId()==null? PlatformUtils.getId() : menu.getPlatformId();
menuList = baseMapper.selectVoList(
    wrapper.eq(SysMenu::getPlatformId, platformId) // ← 这里强制过滤 platform_id
```

**SysMenu.java:104-105**
```java
// 平台ID
private Integer platformId;  // ← 实体类有字段
```

**ry_vue_5.X.sql:235-257**
```sql
create table sys_menu (
    menu_id           bigint(20)      not null,
    menu_name         varchar(50)     not null,
    -- ... 其他字段
    remark            varchar(500)    default '',
    -- ❌ 缺少 platform_id 字段
    primary key (menu_id)
);
```

## 解决方案

### 步骤 1: 执行数据库修复脚本
```bash
# 在 MySQL 中执行
mysql -u root -p your_database < script/sql/add_platform_id_to_menu.sql
```

### 步骤 2: 为现有菜单分配平台
根据业务需求，决定哪些菜单属于哪个平台：

```sql
-- 查看当前所有菜单
SELECT menu_id, menu_name, parent_id FROM sys_menu ORDER BY menu_id;

-- 方案 A: 所有菜单都设为平台端（管理端和商户端共享）
UPDATE sys_menu SET platform_id = 0;

-- 方案 B: 区分平台（根据实际业务调整）
-- 平台端菜单（租户管理、系统监控等）
UPDATE sys_menu SET platform_id = 0 WHERE menu_id IN (6, 2, 109, 113);

-- 商户端菜单（用户管理、角色管理等）
UPDATE sys_menu SET platform_id = 1 WHERE menu_id IN (1, 100, 101, 102, 103, 104, 105);
```

### 步骤 3: 验证修复
1. 重启后端服务
2. 清除浏览器缓存
3. 商户端登录 → 系统管理 → 角色管理 → 新增
4. 检查菜单树是否正常加载

## Debug 断点位置

如需进一步调试，可在以下位置打断点：

1. **控制器层**
   - `SysMenuController.java:87` - 查看返回的菜单列表

2. **服务层**
   - `SysMenuServiceImpl.java:83` - 查看 SQL 查询条件
   - `SysMenuServiceImpl.java:87` - 查看 platformId 值

3. **平台工具类**
   - `PlatformUtils.java:8` - 查看请求头中的 PLATFORM_CODE
   - `Platform.java:38` - 查看平台 ID 转换逻辑

## 常见问题

### Q1: 执行脚本后仍然加载不出来？
检查后端日志，查看是否有 SQL 异常或权限问题。

### Q2: 如何确认 platform_id 字段已添加？
```sql
DESC sys_menu;
-- 或
SHOW COLUMNS FROM sys_menu LIKE 'platform_id';
```

### Q3: 商户端应该看到哪些菜单？
根据业务设计，通常商户端只能看到 `platform_id = 1` 的菜单。如果需要共享某些菜单，可以考虑：
- 复制菜单数据，分别设置不同的 platform_id
- 或修改后端逻辑，支持 `platform_id IN (0, 1)` 的查询

## 相关文件
- 前端接口定义: `sj-merchant-web/src/api/system/menu/index.ts`
- 前端页面: `sj-merchant-web/src/views/system/role/index.vue`
- 后端控制器: `ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java`
- 后端服务: `ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java`
- 平台工具: `yp-common-platform/src/main/java/org/dromara/common/platform/`
