docs: add Mid prototype design spec (M7 device / M8 notification / M9 reporting)

This commit is contained in:
2026-05-25 00:50:38 +08:00
parent 339695c851
commit 0a43f8fbbe
@@ -0,0 +1,401 @@
# Mid 阶段原型设计 — M7 设备管理 / M8 通知待办 / M9 报表对账
> **基于**PRD `docs/chuangfei-platform-product-modules.md`2026-05-25 更新版)§16 原型已知局限
> **设计目标**:补齐 I1~I9 未覆盖的三个模块的 UI 原型,完善完整产品流程(登录 → 客户 → 合同 → 交付 → SN → Callback → 设备 → 待办 → 报表)
> **设计验证**:通过 Visual Companion 线框图确认,2026-05-25
> **关联文档**[BPM 与版本排期](../../chuangfei-platform-bpm-and-roadmap.md) · [并行迭代索引](../../engineering/PARALLEL_ITERATION_INDEX.md)
---
## 1. 背景与动机
### 1.1 当前状态
I1I9 已交付 M1M6 + M10-F01 + M11 基础 + 自研许可证管理(V6)。三个模块完全未开始:
| 模块 | PRD 优先级 | 计划迭代 | 功能点数 |
|------|-----------|---------|---------|
| M7 设备与终端治理 | P1 | I10I12 | 6F01F06 |
| M8 通知与待办 | P1 | I10I12 | 5F01F05 |
| M9 报表与对账 | P1 | I11 | 6F01F06 |
### 1.2 设计原则
- **遵循现有模式**:与 I1I9 的 Vue 3 + Element Plus + Pinia 风格一致
- **渐进增强**:现有原型框架不变,新增菜单项和路由
- **数据溯源**:优先复用已有 API 和数据库表,新增表最小化
- **角色一致的访问控制**:按 PRD §13 权限矩阵控制可见性
---
## 2. 导航结构更新
### 2.1 左侧菜单(新增项以 ★ 标记)
```
📊 首页
👥 客户管理
📋 项目
📋 合同管理
📦 交付管理
🔑 许可 SN
📨 Callback 收件箱
⚙️ 集成配置
🖥️ 设备管理 ★ M7 - SYS_ADMIN / DELIVERY / LICENSE_OPS
🔔 待办中心 / 通知设置 ★ M8 - 全员(按角色过滤)
📊 报表中心 ★ M9 - 管理层 / FINANCE_VIEW / COMPLIANCE
🔍 审计日志
```
### 2.2 新增路由表
| 路由 | 页面组件 | 模块 | 角色 |
|------|---------|------|------|
| `/devices` | `DeviceListView.vue` | M7 | SYS_ADMIN, DELIVERY, LICENSE_OPS |
| `/devices/:id` | `DeviceDetailView.vue` | M7 | 同上 |
| `/todos` | `TodoCenterView.vue` | M8 | 全员 |
| `/notifications/settings` | `NotificationSettingsView.vue` | M8 | SYS_ADMIN 或各角色自配置 |
| `/reports/contract-sn` | `ContractSnReportView.vue` | M9 | FINANCE_VIEW, COMPLIANCE, EXEC_VIEW |
| `/reports/callback-stats` | `CallbackStatsView.vue` | M9 | LICENSE_OPS, COMPLIANCE |
| `/reports/project-health` | `ProjectHealthView.vue` | M9 | EXEC_VIEW, SYS_ADMIN |
---
## 3. M7 设备与终端治理
### 3.1 数据模型(新增表)
```sql
-- M7:设备主表
CREATE TABLE platform_device (
id BIGSERIAL PRIMARY KEY,
mid VARCHAR(128) NOT NULL UNIQUE, -- 设备指纹 / 标识
alias VARCHAR(256), -- 别名(可读名称)
site VARCHAR(256), -- 场站 / 部署位置
customer_id BIGINT REFERENCES platform_customer(id),
project_id BIGINT REFERENCES platform_project(id),
status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', -- ACTIVE / INACTIVE / DECOMMISSIONED
first_seen_at TIMESTAMPTZ,
last_heartbeat_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- M7:设备↔SN 绑定历史(时间线)
CREATE TABLE platform_device_sn_binding (
id BIGSERIAL PRIMARY KEY,
device_id BIGINT NOT NULL REFERENCES platform_device(id),
license_sn_id BIGINT NOT NULL REFERENCES platform_license_sn(id),
bind_type VARCHAR(32) NOT NULL DEFAULT 'ACTIVATE', -- ACTIVATE / SWAP / RELEASE
bind_at TIMESTAMPTZ NOT NULL DEFAULT now(),
remark TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- M7:换机申请记录
CREATE TABLE platform_device_swap_request (
id BIGSERIAL PRIMARY KEY,
old_device_id BIGINT NOT NULL REFERENCES platform_device(id),
new_mid VARCHAR(128) NOT NULL,
sn_id BIGINT NOT NULL REFERENCES platform_license_sn(id),
reason VARCHAR(512),
status VARCHAR(32) NOT NULL DEFAULT 'PENDING', -- PENDING / APPROVED / REJECTED
processed_by VARCHAR(256),
processed_at TIMESTAMPTZ,
remark TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
```
### 3.2 页面规格
**P1. 设备列表页(/devices**
| 组件 | 说明 |
|------|------|
| 筛选栏 | 客户下拉(可搜索)、场站文本、SN 关键词、「查询」「重置」 |
| 工具栏 | 「登记设备」按钮 → 弹出登记对话框 |
| 表格列 | mid、别名、场站、关联客户、关联 SN、状态(Tag)、最近心跳时间、操作(详情) |
| 状态枚举 | Online(在线)/ Offline(离线)/ Decommissioned(已退役) |
| 分页 | 同现有模式:10/20/50 |
**P2. 设备详情页(/devices/:id**
| 区块 | 内容 |
|------|------|
| 头部 | ← 设备列表;mid 标识;状态 Tag |
| 信息区 | mid、别名、场站、客户/项目、首次发现时间、最近心跳时间 |
| 操作区 | 「编辑设备信息」按钮、「发起换机申请」按钮、「查看 SN 绑定历史」按钮 |
| SN 绑定时间线 | 列表展示:首次激活、换机、解绑等事件,按时间倒序 |
**P3. 换机申请对话框**
| 字段 | 类型 | 校验 |
|------|------|------|
| 原设备 | 只读 | 从设备详情传入 |
| 原 SN | 只读 | 该设备当前绑定的 SN |
| 新设备 mid | 文本输入 | 必填,maxlength=128 |
| 换机原因 | 下拉选择 | 硬件更换 / 场地迁移 / 性能升级 / 其他 |
| 备注 | 文本框 | 选填,maxlength=512 |
**P4. 登记设备对话框**
| 字段 | 类型 | 校验 |
|------|------|------|
| mid | 文本输入 | 必填,maxlength=128,唯一性校验 |
| 别名 | 文本输入 | 选填,maxlength=256 |
| 场站 | 文本输入 | 选填,maxlength=256 |
| 关联客户 | 下拉选择 | 选填,从已有客户列表选取 |
| 关联项目 | 下拉选择 | 选填,依赖所选客户过滤 |
### 3.3 API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/v1/devices` | 设备分页列表(支持 customerId, site, snCode 筛选) |
| POST | `/api/v1/devices` | 登记设备 |
| GET | `/api/v1/devices/{id}` | 设备详情 |
| PUT | `/api/v1/devices/{id}` | 编辑设备信息 |
| GET | `/api/v1/devices/{id}/bindings` | SN 绑定时间线 |
| POST | `/api/v1/devices/{id}/swap-request` | 提交换机申请 |
| GET | `/api/v1/swap-requests` | 换机申请列表(Ops 审批用) |
| PATCH | `/api/v1/swap-requests/{id}/status` | 审批换机申请 |
---
## 4. M8 通知与待办
### 4.1 数据模型(新增表)
```sql
-- M8:待办事项
CREATE TABLE platform_todo_item (
id BIGSERIAL PRIMARY KEY,
todo_type VARCHAR(64) NOT NULL, -- CALLBACK_PENDING / SN_PENDING / ACTIVATION_OVERDUE
title VARCHAR(512) NOT NULL,
source_id BIGINT, -- 关联业务 ID(如 callback_inbox_id
source_type VARCHAR(64), -- 关联业务类型
priority VARCHAR(16) NOT NULL DEFAULT 'MEDIUM', -- HIGH / MEDIUM / LOW
status VARCHAR(32) NOT NULL DEFAULT 'PENDING', -- PENDING / PROCESSED / IGNORED
assigned_role VARCHAR(64), -- 目标角色
assigned_user_id VARCHAR(256), -- 认领人
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
processed_at TIMESTAMPTZ,
remark TEXT
);
-- M8:通知配置(每个用户或角色)
CREATE TABLE platform_notification_config (
id BIGSERIAL PRIMARY KEY,
role_code VARCHAR(64), -- 角色级别默认配置
channel_email BOOLEAN DEFAULT FALSE,
channel_wecom BOOLEAN DEFAULT FALSE,
channel_in_app BOOLEAN DEFAULT TRUE,
event_type VARCHAR(64) NOT NULL, -- 订阅的事件类型
aggregation_rule VARCHAR(64), -- 聚合规则:NONE / 30MIN / DAILY_DIGEST
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
```
### 4.2 页面规格
**P1. 待办中心(/todos**
| 组件 | 说明 |
|------|------|
| 统计卡片 | 3 个 KPI 卡片:待处理 Callback 数 / 待发放 SN 数 / 待核对激活数(带角色过滤) |
| 筛选栏 | 类型下拉(全部 / Callback / SN 发放 / 激活核对)、状态、「查询」 |
| 表格列 | 类型(Tag)、标题、来源、优先级(高/中/低)、创建时间、操作(认领/前往/忽略) |
| 批量操作 | 「批量标记已处理」「批量忽略」 |
**P2. 通知设置(/notifications/settings**
| 区块 | 内容 |
|------|------|
| 通知通道 | 复选框组:站内待办 / 邮件 / 企业微信 / 短信。**MVP 实际仅实现「站内待办」**;邮件和企微为配置项占位,实际发送通道依赖独立基建,列 Mid 增强 |
| 事件订阅表 | 事件类型、通知方式、订阅角色、静默规则 |
| 操作 | "保存配置"按钮 |
**事件类型订阅清单**(与 Callback 事件类型对齐):
| 事件类型 | 默认通道 | 默认角色 | 聚合规则 |
|---------|---------|---------|---------|
| Callback 待处理 | 站内 + 邮件 | LICENSE_OPS | 30 分钟内合并 |
| SN 待发放 | 站内 | LICENSE_OPS | 每日汇总 |
| 激活超期 7 日 | 站内 + 邮件 | DELIVERY + LICENSE_OPS | 不重复 |
| 换机申请待审批 | 站内 | LICENSE_OPS | 不重复 |
| 合同到期提醒 | 邮件 | SALES | 每周汇总 |
### 4.3 API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/v1/todos` | 待办列表(支持 type, status, role 筛选) |
| PATCH | `/api/v1/todos/{id}/status` | 更新待办状态(认领/完成/忽略) |
| POST | `/api/v1/todos/batch-status` | 批量更新待办状态 |
| GET | `/api/v1/notifications/config` | 获取通知配置 |
| PUT | `/api/v1/notifications/config` | 更新通知配置 |
---
## 5. M9 报表与对账
### 5.1 数据说明
M9 **不新增独立表**,全部基于已有业务表做聚合查询:
| 视图 | 数据源 | 聚合逻辑 |
|------|--------|---------|
| 合同 vs SN 对账 | `platform_contract` + `platform_contract_line` + `platform_license_sn` | 按合同行分组 COUNT SN |
| 已发 vs 已激活 | `platform_license_sn` | 按 status 分组统计 |
| Callback 统计 | `platform_callback_inbox` | 按 event_type / status / 时间聚合 |
| 项目健康度 | 多表联合 | 交付率 / SN 发放率 / 激活率 加权计算 |
### 5.2 页面规格
**P1. 履约对账(/reports/contract-sn**
| 组件 | 说明 |
|------|------|
| 筛选栏 | 项目下拉、合同下拉、「查询」「导出 CSV」 |
| KPI 卡片 | 合同总行项数、已发 SN 数、未发缺口、已激活/已发 |
| 表格列 | 合同编号、客户、行项、应发、实发、已激活、缺口、状态(正常/缺额/超发) |
**P2. Callback 统计(/reports/callback-stats**
| 区块 | 内容 |
|------|------|
| 时间段选择 | 近 24 小时 / 近 7 天 / 近 30 天 / 自定义 |
| 事件类型分布 | 柱状图或百分比条:各事件类型占比 |
| 处理成功率趋势 | 日/周/月成功率 + 总量 |
| Top 失败原因 | 排名列表(失败原因 + 占比 + 趋势) |
**P3. 项目健康度看板(/reports/project-health**
| 组件 | 说明 |
|------|------|
| 表格列 | 项目名称、交付完成率、SN 发放率、激活率、健康度(🟢正常/🟡关注/🔴风险) |
| 健康度规则 | 绿:三项均 ≥80%;黄:任一项 <80%;红:任一项 <50% |
### 5.3 API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/v1/reports/contract-sn` | 履约对账报表(支持 projectId, contractId 筛选) |
| GET | `/api/v1/reports/callback-stats` | Callback 统计(支持时间范围、eventType 筛选) |
| GET | `/api/v1/reports/project-health` | 项目健康度列表 |
| GET | `/api/v1/reports/export` | 导出 CSV — 后端生成文件流,前端触发下载(Content-Disposition: attachment |
---
## 6. 实现注意事项
### 6.1 与现有系统的集成
- **设备↔SN 绑定**`platform_device_sn_binding.license_sn_id` → 引用已有 `platform_license_sn.id`
- **待办自动生成**`platform_todo_item``source_id` + `source_type` 可指向 `platform_callback_inbox.id` 等已有业务表
- **报表聚合**:复用现有 MyBatis-Plus Mapper,新增报表专用的 `@Select` 查询方法
### 6.2 角色与权限
- 初始角色配置使用简化三角色(SYS_ADMIN / DEVELOPER / OPS
- Mid 阶段实际交付时应按 PRD §13.2 的产品定义角色集落地:
- DELIVERY → M7 设备读写
- LICENSE_OPS → M7 设备读写、M8 待办、M9 Callback 统计
- SALES → M9 合同对账只读
- FINANCE_VIEW / COMPLIANCE → M9 报表只读
- EXEC_VIEW → M9 项目健康度只读
### 6.3 M7-F05 设备事件联动实现机制
Callback `device:*` 事件(`device:pre_activate` / `post_activate`)到达时:
1. Webhook Ingress 接收并写入 `platform_callback_inbox`
2. `CallbackInboxService` 解析事件中的 `mid` 字段
3.`mid``platform_device` 中已存在 → 更新 `last_heartbeat_at`,并在 `platform_device_sn_binding` 添加记录
4.`mid` 不存在 → 自动创建设备草稿记录(status=INACTIVE),并在待办中心生成一条「新设备待确认」待办
5. Ops 可在设备详情页手动补充别名/场站/客户关联
此机制**不依赖 M7 管理页面存在**即可在后台运行;M7 页面提供的是查看和手工干预入口。
### 6.4 与 PRD 状态对照
| 功能点 | 本设计覆盖 | 说明 |
|--------|-----------|------|
| M7-F01 设备登记 | ✅ | 登记对话框 + 列表 |
| M7-F02 绑定历史 | ✅ | 设备详情时间线 |
| M7-F03 换机申请 | ✅ | 换机申请对话框 + 审批 |
| M7-F04 设备检索 | ✅ | 列表多维度筛选 |
| M7-F05 Callback 联动 | ✅ | 待办自动生成 |
| M7-F06 策略展示 | ❌ 后续 | 依赖 BitAnswer 策略查询 |
| M8-F01 待办列表 | ✅ | 待办中心 |
| M8-F02 认领/完成 | ✅ | 状态 PATCH + 批量 |
| M8-F03 通知通道 | ✅ | 通知配置页 |
| M8-F04 通知模板 | ✅ | 事件→模板配置 |
| M8-F05 静默规则 | ✅ | 聚合规则配置 |
| M9-F01 合同 vs SN | ✅ | 履约对账页 |
| M9-F02 已发 vs 激活 | ✅ | 履约对账页含 |
| M9-F03 Callback 统计 | ✅ | Callback 统计页 |
| M9-F04 导出 CSV | ✅ | 导出按钮 |
| M9-F05 项目健康度 | ✅ | 健康度看板 |
| M9-F06 订阅报表 | ❌ 后续 | 定时邮件推送 |
---
## 7. 页面关系图
```mermaid
flowchart TB
subgraph Existing["已有页面(I1-I9"]
Login[登录页]
Home[首页]
Customers[客户管理]
Projects[项目]
Contracts[合同管理]
Deliveries[交付管理]
SNS[许可 SN]
Callbacks[Callback 收件箱]
Integration[集成配置]
Audit[审计日志]
end
subgraph New["新增页面(Mid"]
Devices[设备列表]
DeviceDetail[设备详情]
SwapRequest[换机申请]
Todos[待办中心]
NotifConfig[通知设置]
ReportCS[履约对账]
ReportCB[Callback 统计]
ReportPH[项目健康度]
end
Login --> Home
Home --> Customers --> Projects
Projects --> Contracts
Contracts --> Deliveries
Deliveries --> SNS
Callbacks --> SNS
Integration --> SNS
SNS --> Devices
Devices --> DeviceDetail
DeviceDetail --> SwapRequest
Callbacks --> Todos
SNS --> Todos
Devices --> Todos
Contracts --> ReportCS
SNS --> ReportCS
Callbacks --> ReportCB
ReportCS --> ReportPH
ReportCB --> ReportPH
```
---
## 8. 修订记录
| 日期 | 说明 |
|------|------|
| 2026-05-25 | 初版:基于 PRD 更新版和 Visual Companion 线框图确认结果撰写 |