# Qiwei Dashboard 开发过程记录

> 本文保留早期开发过程。当前能力以“2026-07 经营驾驶舱与行动闭环”一节、`skills/qiwei-dashboard/SKILL.md` 和实际 Dashboard 为准；后续“尚未实现”“Plan 修改建议”属于历史记录，不再代表当前版本状态。

## 2026-07 经营驾驶舱与行动闭环

### 经营总览

- 默认入口调整为 `#overview`，导航按经营驾驶舱、数字岗位、业务资产和系统重组。
- 汇总客户、社群、客服和交易数据边界，展示今日行动、运营健康度和数字员工状态。
- 支持自然语言经营问题和预设诊断入口；后端失败时允许前端规则降级，但不得伪造订单、成交、复购或 GMV 结论。

### 经营诊断

- MCP 工具：`qiwei_business_diagnosis`。
- Dashboard API：`POST /api/business-diagnosis`。
- 输出结论、证据、数据缺口和可下钻动作；交易数据未接入时明确返回无法判断。
- 对应 Skill：`skills/qiwei-business-diagnosis/`。

### 诊断建议进入行动中心

- MCP 工具：`qiwei_business_action_candidate`。
- Dashboard API：`POST /api/knowledge/tasks/diagnosis-candidate`。
- 诊断建议默认只进入候选池，按稳定来源键去重；必须人工点击“确认并转为任务”后才生成正式内部任务。
- 候选、正式任务和企微官方待办保持不同状态，不自动发送客户消息或同步真实待办。

### 行动效果反馈

- MCP 工具：`qiwei_business_action_feedback`。
- Dashboard API：`POST /api/knowledge/tasks/diagnosis-feedback`。
- 生命周期记录 `created`、`promoted`、`completed` / `dismissed` 和 `outcome_recorded`。
- 仅已完成的诊断来源正式任务可记录 `effective`、`partially_effective`、`ineffective` 或 `unknown`，并可附带内部复盘依据。
- 统一任务中心展示候选数、采纳数/采纳率、完成数、验证有效数/有效率；没有有效分母时显示未知，不伪造为 `0%`。

### Dashboard 适配与验证

- 支持桌面与移动端布局、侧栏遮罩和静态资源版本控制。
- 任务中心在 1440px 双栏工作区不产生横向滚动；移动端反馈选项保持至少 44px 点击高度。
- 发布检查覆盖 19 个 Skills、91 个 MCP 工具和 15 组隔离检查；诊断行动闭环 smoke test 覆盖候选创建、去重、晋升、完成、反馈和汇总指标。

## 项目背景

为 `claude-code/claude-code-qiwe-assistant` 项目构建一个本地 Web Dashboard，让用户可以通过浏览器直观地完成企微核心能力的操作，降低纯对话调用的门槛。第一期聚焦在**客户群管理**模块，同时搭建好账号状态、登录恢复等公共基础设施。

## 已完成的模块

### 1. Dashboard 基础设施

- **HTTP 桥接服务**：`mcp/src/dashboard/server.js`
  - 静态资源服务（HTML/CSS/JS）
  - REST API 路由封装
  - 异步 Job 队列（`createJob` / `getJob`）
  - 文件上传与下载（`/api/upload`、`/api/outputs`）
  - 状态汇总接口（`/api/status`）
  - 登录相关接口（`/api/login/start`、`/api/login/check`、`/api/login/verify`）
  - 群管理接口（`/api/groups/*`）
  - **客户运营接口（新增）**：`/api/customer-ops/*`
  - **画像与标签接口（新增）**：`/api/portraits/*`、`/api/tags/*`、`/api/personal-labels/*`
  - **客户交接接口（新增）**：`/api/transfers/*`

- **前端 SPA 骨架**：`mcp/src/dashboard/index.html`
  - 侧边栏导航、顶部账号切换器、主内容区、Toast 容器
  - **新增导航项（客户运营、画像与标签、客户交接）**

- **前端逻辑**：`mcp/src/dashboard/app.js`
  - 路由（hash 路由：`#groups`、`#status`、`#customer-ops`、`#portraits`、`#transfers`）
  - API 客户端封装
  - 状态管理（内存 + localStorage）
  - 公共组件：Toast、Modal、Job Tracker、Account Switcher
  - **新增页面渲染器**：`renderCustomerOpsPage`、`renderPortraitsPage`、`renderTransfersPage`

- **样式系统**：`mcp/src/dashboard/styles.css`
  - 复用企微品牌色（`#fa8c16`）
  - 卡片、表格、表单、按钮、Badge、进度条、骨架屏、动画

- **启动入口**：`scripts/start-dashboard.js`
- **文档**：`skills/qiwei-dashboard/SKILL.md`、`README.md` Dashboard 章节

### 2. 账号状态模块

实现位置：`app.js` 中 `renderStatusPage`、`attemptAutoRecover`、`recoverLogin`、`syncAccountOnlineStatus` 等函数。

- 显示当前账号在线/离线状态、订阅状态、鉴权配置状态
- **离线恢复登录按钮**：账号离线时显示「恢复登录」按钮
- **自动恢复登录**：检测到离线且 `statusCode === 0`（设备已配置）时，自动调用 `/api/login/check?manual=true` 尝试免扫码恢复
- 手动恢复时若无法免扫码，自动生成二维码/验证码流程
- **已保存账号状态同步**：修复了已保存账号表格状态与当前状态不一致的问题

### 3. 客户群管理模块

实现位置：`app.js` 中 `renderGroupsPage`、`renderGroupTable`、`renderGroupSyncCard`、`bindGroupSync`、`bindGroupFilters`、`bindGroupTableActions`、`confirmGroup`、`batchConfirmGroups`、`syncGroupMessages`、`openGroupDetailModal` 等函数。

#### 群列表展示

- 表格展示：群名、人数、识别结果、置信度、消息同步状态、命中关键词、操作
- 空状态提示
- 搜索过滤（按群名/roomId）
- 状态过滤（全部、自动确认、建议确认、已确认、已忽略）
- **显示切换按钮**：「只看可能的客户群」/「展示全部状态的群聊」，默认展示全部群聊

#### 扫描客户群

- 扫描范围：全部群、我创建的群、最近聊天里的群、从消息记录里找群
- 扫描深度（分页数）
- 客户群关键词、高置信度词配置
- 自动识别客户群开关
- 异步 Job 执行扫描，实时进度条
- 扫描结果统计卡片：扫描群数、自动确认、建议确认、普通群、已确认、已忽略

#### 批量操作

- 全选本页/单选
- **批量确认为客户群**：直接调用 confirm API，不弹窗
- **批量同步选中群消息**

#### 单行操作

- **确认**：直接确认为客户群（不弹窗）
- **忽略**：弹出原因输入框
- **同步消息**：同步单个群消息
- **群详情**（仅已确认群）：查看/编辑客户信息

#### 客户信息自动识别

- 后端 `qiwei-group-management-run.js` 中 `createRoomRecord` 现在保存群成员列表
- 已确认群的「群详情」弹窗会自动从成员列表中识别客户：
  - 优先选择 `type === 2` 的外部联系人
  - 无明确标识时排除常见内部角色后取第一个
  - 自动预填充客户姓名和客户企微 ID
- 用户可在弹窗中修改客户信息并保存

#### 消息同步状态持久化

- 已同步消息的群状态保存在 `localStorage`
- 修复了刷新页面后同步状态丢失的问题（移除了账号离线时清空同步状态的逻辑）

### 4. 客户运营模块（新增）

实现位置：`app.js` 中 `renderCustomerOpsPage`、`bindCustomerOpsPage` 及相关渲染函数。

#### 批量加好友

- 文本导入：每行 `13800138000 张三`，自动解析为可编辑表格
- Excel 上传：通过 `/api/upload` 保存后读取 customers 列表追加到表格
- 默认验证消息模板，支持 `{{name}}`、`{{phone}}` 变量
- 表格中每行可单独编辑姓名和验证消息，留空则使用默认模板
- 顶部实时预览第一条验证消息
- 执行设置：每分钟速率限制（1-60）、最大重试次数（1-5）
- 异步 Job 执行，结果展示统计卡片 + 明细表格

#### 好友状态检查

- 输入手机号列表，异步 Job 执行
- 结果展示：已确认、待通过、未找到统计 + 明细表格
- 状态徽标：已是好友、已被其他人添加、未添加、未找到

#### 客户档案

- 通过手机号或 externalUserId 查询
- 展示 externalUserId、匹配联系人、相关群、本地画像

#### 自动建群

- 输入成员 externalUserId、群名、协作成员、欢迎语
- 异步 Job 执行建群
- 展示 roomId、群名、成员数、协作成员邀请状态、欢迎语发送状态

### 5. 画像与标签模块（新增）

实现位置：`app.js` 中 `renderPortraitsPage`、`bindPortraitsPage` 及相关渲染函数。

#### 客户画像

- 关键词模式：直接生成并保存画像
- AI 分析模式：生成 context 文件，可下载后人工分析
- 手动保存画像 JSON：通过 prompt 输入 JSON 后保存

#### 批量画像

- 输入多个 externalUserId，关键词模式批量生成

#### 导出画像

- 异步 Job 导出全部本地画像为 Excel
- 结果提供下载链接

#### 本地标签

- 按客户添加/移除/查询标签
- 查看全部去重标签

#### 企微个人标签

- 同步企微个人标签列表
- 创建/更新/删除个人标签
- 应用标签到指定客户

### 6. 客户交接模块（新增）

实现位置：`app.js` 中 `renderTransfersPage`、`bindTransfersPage` 及相关渲染函数。

- 输入 `fromUserId` / `toUserId`
- 支持通过 externalUserIds 或已确认群 roomIds 指定客户
- 生成交接包预览文件，展示明细列表
- 执行交接：可移除原顾问、设置欢迎语
- 结果展示成功/失败/跳过统计与明细

### 7. Bug 修复与体验优化

| 问题 | 修复 |
| --- | --- |
| 账号状态页「已保存账号」状态与当前在线状态不一致 | 新增 `syncAccountOnlineStatus`，在渲染表格前先同步状态 |
| 刷新页面后已同步消息群显示「未同步」 | 移除 `checkExistingLogin` 中的 `resetSyncedGroups()` 无条件清空逻辑 |
| 账号离线时点击「扫描客户群」提示不明确 | 增加离线拦截，提示先恢复登录并跳转到状态页 |
| 离线时点击「同步消息」也会失败 | 同样增加离线拦截 |
| Dashboard 从错误目录启动导致「网络请求失败」 | 在 README 和 Skill 文档中明确必须在项目目录下启动 |

## 尚未实现的内容（对比原始 plan）

原始 plan 中提到的以下模块已在本轮实现：

- 客户运营：批量加好友、检查好友状态、客户档案、自动建群
- 画像与标签：客户画像、本地标签、企微个人标签
- 客户交接：交接包预览、执行交接

当前尚未实现的扩展模块：

- API Catalog
- 语音转写
- Webhook & Relay
- 顾问 Playbook

当前 Dashboard 已完成 plan 中「系统状态」、「群管理」、「客户运营」、「画像与标签」、「客户交接」五个模块的核心功能。

## 与原始 plan 的差异

### 客户运营模块实现与 plan 的差异

1. **Excel 上传流程**
   - Plan：前端直接解析 Excel。
   - 实际：前端通过 `/api/upload` 上传文件拿到路径后，调用 `qiweiBatchAddFriends` 读取 Excel 并追加到表格。这样复用了后端已有的 `readCustomersFromExcel` 逻辑。

2. **客户档案查询**
   - Plan：仅提及输入手机号查询。
   - 实际：同时支持手机号或 externalUserId 查询。

### 群管理模块实现与 plan 的差异

1. **确认客户群流程**
   - Plan：未明确描述确认流程细节
   - 实际：单个/批量确认均不弹窗，确认后才通过「群详情」编辑客户信息

2. **客户信息自动识别**
   - Plan：未提及
   - 实际：基于群成员列表自动识别外部联系人并预填充客户信息

3. **关键词配置**
   - Plan：独立的「关键词配置」折叠面板
   - 实际：关键词配置集成在「扫描客户群」卡片中

4. **同步群消息**
   - Plan：支持多选已确认群或「全部已确认群」，设置分页和每群消息上限
   - 实际：支持多选已确认群批量同步，但暂不支持「全部已确认群」一键同步和分页设置

5. **群列表默认展示**
   - Plan：未明确默认过滤行为
   - 实际：默认展示全部群聊，可通过按钮切换为「只看可能的客户群」

6. **添加已创建客户群按钮**
   - Plan：未明确
   - 实际：曾经实现后已删除

## Plan 修改建议

基于当前已完成的群管理模块，原始 plan 应在以下方面更新：

1. **群管理确认流程需要明确**
   - 当前 plan 只写「行操作包括确认、拒绝、分析、同步消息」，未说明确认时是否弹窗、是否需要填写客户信息。
   - 建议改为：「确认」操作不弹窗，直接标记为客户群；客户信息在确认后通过「群详情」编辑，并支持自动识别。

2. **新增「客户信息自动识别」功能**
   - 当前 plan 完全未提及。
   - 建议在群管理交互中增加：已确认群支持查看群成员，系统自动识别外部联系人并预填充客户姓名和企微 ID。

3. **关键词配置位置调整**
   - Plan 中写「关键词配置折叠面板」。
   - 实际实现中关键词配置集成在「扫描客户群」卡片内，以减少页面切换。Plan 应更新为「扫描客户群卡片内包含关键词/高置信度词输入」。

4. **同步群消息范围调整**
   - Plan 写「多选已确认群或全部已确认群，设置分页和每群消息上限」。
   - 当前仅实现「多选已确认群」批量同步。Plan 可拆分为已实现和后续增强：
     - 已实现：多选已确认群批量同步
     - 待实现：「全部已确认群」一键同步、分页/每群上限设置

5. **群列表默认展示状态**
   - Plan 未明确默认过滤行为。
   - 建议补充：默认展示全部扫描到的群聊，提供按钮切换为「只看可能的客户群」。

6. **系统状态模块补充**
   - Plan 中系统状态只写「登录状态、订阅状态、全局 guid 输入」。
   - 实际已实现：离线恢复登录按钮、自动恢复登录、已保存账号列表及状态同步。Plan 应补充这些功能。

7. **新增文件清单修正**
   - Plan 中列出 `mcp/src/dashboard/pages.js`（可选拆分）。
   - 当前未拆分，app.js 约 1300 行仍可维护。建议从 plan 中移除或标注为「未拆分」。

8. **范围与优先级调整**
   - 当前实际只完成了系统状态 + 群管理。建议把客户运营、画像标签、客户交接明确标注为「待实现/第二期」，避免与实际进度混淆。

9. **新增验证项**
   - Plan 的验证方案中应增加：
     - 账号离线时恢复登录按钮可用
     - 自动恢复登录成功/失败场景
     - 已同步消息状态刷新后保留
     - 批量确认客户群和群详情编辑

10. **移除「添加已创建客户群」按钮**
    - 实际开发中曾实现该按钮，后已删除。Plan 中如提到手动添加群，应说明通过业务工具或后续在群列表中提供入口。

## 后续建议

1. 群管理可补充「全部已确认群一键同步消息」和同步参数设置
2. 客户信息自动识别可进一步优化：结合群名正则、AI 分析群消息等多维度识别
3. 客户运营可补充「从已确认群批量导入客户」功能
4. 画像模块可接入 Claude API 自动分析 context 文件并保存
5. 增加 Dashboard 的使用统计和错误日志收集
6. 按需扩展 API Catalog、语音转写、Webhook & Relay、顾问 Playbook 等模块
