feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本

包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Neo
2026-04-06 00:03:48 +08:00
parent 70324d8542
commit 6f8f12314f
515 changed files with 76604 additions and 7456 deletions

View File

@@ -0,0 +1,178 @@
# P15 — 小程序前后端联调Mock → 真实 API 切换
> 创建时间2026-03-22
> 状态:草案
> 优先级P0dev-trace-log 的前置依赖)
> 关联 Specdev-trace-log调试工具链
---
## 一、背景
小程序前端已完成 H5 → 原生迁移h5-miniprogram-migration spec和格式统一P13 spec
26 个后端接口已全部实现API 契约文档确认)。但当前 `services/api.ts` 所有函数返回空 Mock 数据,
`request` 导入已注释,前端与后端之间没有真实的 HTTP 通信。
本 PRD 覆盖"前后端联调"中 dev-trace-log 未涵盖的部分:将小程序从 Mock 数据切换到真实后端接口。
## 二、目标用户与场景
- 用户:开发者(前后端联调阶段)
- 场景:小程序连接本地 FastAPI 后端localhost验证登录、审核、任务、AI 模块的完整数据流
## 三、切换范围
### 3.1 本期切换P0
| 模块 | 涉及页面 | 涉及接口 |
|------|---------|---------|
| 认证 | login、apply、reviewing、no-permission | AUTH-1~5login、dev-login、me、refresh、apply |
| 任务 | task-list、task-detail4 变体) | TASK-1~4列表、详情、操作、绩效概览 |
| 审核 | reviewing、apply | AUTH-3me状态判断、AUTH-5apply |
| AI | chat、chat-history | CHAT-1~3对话列表、发送消息/SSE、历史记录 |
### 3.2 本期不做
| 模块 | 页面 | 原因 |
|------|------|------|
| 看板 | board-finance、board-customer、board-coach | 用户明确排除 |
| 助教 | coach-detail | 非优先联调模块 |
| 客户 | customer-detail、customer-service-records | 非优先联调模块 |
| 备注 | notes | 非优先联调模块 |
| 绩效 | performance、performance-records | 非优先联调模块 |
| 个人 | my-profile | 非优先联调模块 |
## 四、需求清单
### REQ-1API 环境配置
**描述**:创建统一的 API 配置模块,支持开发/测试/生产环境切换。
**验收标准**
- 创建 `apps/miniprogram/miniprogram/config/api.ts`
- 定义 `API_BASE_URL` 常量,开发环境指向 `http://localhost:8000`
- 支持通过构建变量或条件编译切换环境
- `utils/request.ts` 从配置模块读取 base URL禁止硬编码
### REQ-2恢复真实 API 调用
**描述**:将 `services/api.ts` 从 Mock 数据恢复为真实 HTTP 请求。
**验收标准**
- 取消 `request` 导入的注释
- 移除 `delay()` 辅助函数
- 移除所有空 Mock 数据返回
- P0 模块认证、任务、审核、AI的 service 函数改为调用 `request()` 发起真实 HTTP 请求
- 非 P0 模块暂时保留 Mock添加 `// TODO: P15 后续批次切换` 注释)
### REQ-3请求层统一封装
**描述**:确保 `utils/request.ts` 提供完整的请求封装能力。
**验收标准**
- 自动附加 `Authorization: Bearer <token>` 请求头(从 Storage 读取)
- 统一解析响应格式 `{ code: 0, data: ... }` / `{ code: number, message: string }`
- code ≠ 0 时抛出业务错误(含 code 和 message
- 网络异常(超时、断连)抛出网络错误(区分于业务错误)
- Token 过期401自动尝试 refreshrefresh 失败跳转登录页
- 请求超时设置(默认 30sAI 接口 120s
### REQ-4错误处理与用户反馈
**描述**:切换到真实接口后,网络错误、超时、空数据等场景需要有明确的用户反馈。
**验收标准**
- 网络错误:显示"网络连接失败,请检查网络后重试"+ 重试按钮
- 请求超时:显示"请求超时,请稍后重试"+ 重试按钮
- 业务错误code ≠ 0显示后端返回的 message
- 鉴权失败401/403跳转登录页或显示无权限页
- 空数据:显示对应的空态页面(已有四态框架,确保正确触发)
- 所有错误场景记录到 console开发环境便于调试
- 页面级 `pageState` 四态loading/empty/error/normal在真实 API 场景下正确流转
### REQ-5数据格式适配验证
**描述**:验证前端数据结构与后端接口返回的数据结构一致,不一致处做适配。
**验收标准**
- 后端响应统一 camelCaseResponseWrapperMiddleware 已处理)
- 前端类型定义(`services/api.ts` 中的 interface与后端实际返回字段一一对应
- 分页格式对齐:`{ items: T[], total, page, pageSize }`
- 金额字段number 类型,保留 2 位小数,前端通过 `formatMoney()` 展示
- 时间字段ISO 8601 字符串,前端通过 `formatDateShort()` / `formatDateFull()` 展示
- 不一致处在 service 层做适配转换,不在页面层处理
### REQ-6SSE 流式对接AI 模块)
**描述**AI 对话模块的 SSE 流式响应需要特殊处理,不能用普通 HTTP 请求。
**验收标准**
- `services/api.ts` 中 chat 相关函数使用 SSE 方式调用后端
- 支持流式接收 token 并实时渲染到对话界面
- SSE 连接异常时显示错误提示并允许重试
- SSE 超时处理AI 响应可能较慢,超时阈值 120s
- 流式过程中显示"正在思考..."loading 态
### REQ-7登录流程对接
**描述**:小程序登录流程从 Mock 切换到真实微信登录 → 后端换 Token 流程。
**验收标准**
- 开发环境使用 `POST /api/xcx/dev-login`openid 模拟登录)
- 登录成功后将 access_token 和 refresh_token 存入 Storage
- `app.ts``checkAuthStatus()` 调用真实 `GET /api/xcx/me` 判断用户状态
- 根据用户 statusnew/pending/approved/rejected/disabled正确路由到对应页面
- Token 过期自动 refreshrefresh 失败清除 Storage 并跳转登录页
## 五、数据流
```
小程序页面
↓ 调用 service 函数
services/api.ts
↓ 调用 request()
utils/request.ts
↓ wx.request() + Authorization header
↓ 响应解析 + 错误处理
FastAPI 后端 (localhost:8000)
↓ ResponseWrapperMiddleware (camelCase)
↓ { code: 0, data: ... }
返回页面 → 更新 data → 渲染
```
## 六、依赖与约束
| 依赖项 | 状态 | 说明 |
|--------|------|------|
| 后端 26 个接口 | ✅ 已实现 | API 契约文档确认 |
| API 契约文档 | ✅ 已就绪 | `docs/miniprogram-dev/API-contract.md` |
| 前端类型定义 | ✅ 已定义 | `services/api.ts` 中的 interface |
| 四态框架 | ✅ 已实现 | loading/empty/error/normal |
| 格式化工具函数 | ✅ 已实现 | P13 spec 已完成 |
| request.ts 封装 | ⚠️ 需验证 | 文件存在但当前未使用 |
| dev-trace-log | 🔜 并行开发 | 联调时提供调试可视化 |
## 七、验收标准(整体)
1. 登录流程dev-login → 获取 token → 自动路由到正确页面
2. 任务列表:真实数据加载、分页、筛选正常工作
3. 任务详情4 种变体页面正确渲染真实数据
4. AI 对话SSE 流式响应实时渲染,错误时有提示
5. 错误场景断网、超时、401、403、空数据均有正确的用户反馈
6. 非 P0 模块:保持 Mock 不受影响
## 八、风险
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 后端接口返回格式与前端类型不一致 | 页面渲染异常 | REQ-5 要求逐字段验证 |
| 微信开发者工具不支持 localhost | 无法联调 | 使用 dev-login 绕过微信登录;配置开发者工具"不校验合法域名" |
| SSE 在小程序中的兼容性 | AI 模块无法工作 | 需验证 wx.request 的 enableChunked 或使用 requestTask |
| Token 过期处理不完善 | 用户体验中断 | REQ-3 要求自动 refresh |
## 九、与 dev-trace-log 的关系
本 PRD 是 dev-trace-log 的前置依赖:
- 没有真实 API 调用 → trace 系统无数据可采集
- 建议并行推进:先完成 REQ-1~3基础设施再逐模块切换REQ-7 → REQ-2 → REQ-4~6
- 切换过程中使用 dev-trace-log 的 span 链路验证每个接口的完整处理流程