# 客诉数据权限隔离（2026-07-29）

## 问题

初始仅按 `area`（区域）过滤，但同一区域（如"销售拓展部"）含 12+ 名销售员 → 非管理员看到同事客诉。

## 修复：双重过滤

```javascript
// 第一层：区域过滤
var uas = getUserAreas(); // admin→null, 宋学伟→['销售拓展部'], 赵云浩→['大客户']
if (uas) items = items.filter(function(c){return uas.indexOf(c.area)>=0;});

// 第二层：操作人过滤（非admin）
var isAdmin = (state.user || {}).role === 'admin';
var userName = (state.user||{}).name;
if (!isAdmin && userName) {
  items = items.filter(function(c) {
    var ops = (c.operator||[]).concat(c.creator||[]);
    return ops.indexOf(userName) >= 0;
  });
}
```

## USER_AREA_MAP 陷阱

dept 登录后是全称（如 `诊断原料大客户销售部`），不是简称。映射表必须同时包含两者：

```javascript
var USER_AREA_MAP = {
  '大客户部':'大客户', '销售拓展部':'销售拓展部',
  '诊断原料大客户销售部':'大客户', '诊断原料销售拓展部':'销售拓展部',
  '诊断原料销售部':'销售拓展部',
  '浙江':'浙江', '广东':'广东'
};
```

## 数据验证

```python
# 验证各用户客诉数
comps = json.load(open('mcp_complaints.json'))
for user, area in [('宋学伟','销售拓展部'),('赵云浩','大客户')]:
    area_items = [c for c in comps['items'] if c['area']==area]
    user_items = [c for c in area_items 
                  if user in (c.get('operator') or []) or user == c.get('creator')]
    print(f'{user}: {len(user_items)}条 (area共{len(area_items)}条)')
```
