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,80 @@
# P8→NS1/RNS1 缺失项 #1三看板 Tab 切换的缓存策略
## 简要结论
- 状态:⚠️ 部分解决
- 风险等级:🔴 高
- 三看板 Tab 切换已实现,但采用页面跳转而非组件切换,切换回来时不保持筛选状态和滚动位置。
## 详细审查
### 审查范围
- `apps/miniprogram/miniprogram/app.json`tabBar 配置)
- `apps/miniprogram/miniprogram/custom-tab-bar/index.ts`(自定义 TabBar
- `apps/miniprogram/miniprogram/components/board-tab-bar/board-tab-bar.ts`(看板内 Tab 组件)
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts`(财务看板 Tab 切换)
- `apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts`(助教看板 Tab 切换)
- `apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts`(客户看板 Tab 切换)
### 发现
1. **Tab 切换方式:页面跳转,非组件内切换**
- `app.json` 中 tabBar 仅注册了 `board-finance` 为 tabBar 页面
- `board-customer``board-coach` 是普通页面(非 tabBar 页面)
-`board-finance` 切换到其他看板使用 `wx.navigateTo()`(页面栈压入)
-`board-coach`/`board-customer` 切换到 `board-finance` 使用 `wx.switchTab()`(清空页面栈)
2. **筛选状态不保持**
- 每个看板页面的筛选状态(`selectedSort``selectedDimension``selectedTime` 等)存储在 Page data 中
- 使用 `wx.navigateTo` 跳转时,离开的页面会被销毁(返回时重新 `onLoad`
- 使用 `wx.switchTab` 回到 `board-finance` 时,该页面会触发 `onShow` 但不会重新 `onLoad`tabBar 页面有缓存)
-`board-coach``board-customer` 作为非 tabBar 页面,每次进入都会重新创建
3. **滚动位置不保持**
- 三个看板页面均无滚动位置保存/恢复逻辑
- 页面重新加载后滚动位置归零
4. **切换动画**
- 未实现 P8 定义的切换动画
- 使用微信默认的页面跳转动画(右滑进入/左滑返回)
### 证据
```typescript
// board-finance.ts — 切换到其他看板
onTabChange(e: WechatMiniprogram.TouchEvent) {
const tab = e.currentTarget.dataset.tab as string
if (tab === 'customer') {
wx.navigateTo({ url: '/pages/board-customer/board-customer' })
} else if (tab === 'coach') {
wx.navigateTo({ url: '/pages/board-coach/board-coach' })
}
}
// board-coach.ts — 切换回财务看板
onTabChange(e: WechatMiniprogram.TouchEvent) {
const tab = e.currentTarget.dataset.tab as string
if (tab === 'finance') {
wx.switchTab({ url: '/pages/board-finance/board-finance' })
} else if (tab === 'customer') {
wx.navigateTo({ url: '/pages/board-customer/board-customer' })
}
}
```
```json
// app.json — 仅 board-finance 是 tabBar 页面
"tabBar": {
"custom": true,
"list": [
{ "pagePath": "pages/task-list/task-list", "text": "任务" },
{ "pagePath": "pages/board-finance/board-finance", "text": "看板" },
{ "pagePath": "pages/my-profile/my-profile", "text": "我的" }
]
}
```
### 建议
1. **方案 A推荐**:将筛选状态持久化到 `getApp().globalData``wx.setStorageSync`,页面 `onLoad` 时恢复
2. **方案 B**:将三个看板合并为一个页面,使用 `wx:if``hidden` 切换内容区域,天然保持状态
3. 滚动位置可通过 `onPageScroll` 记录 + `onLoad``wx.pageScrollTo` 恢复
4. 切换动画可通过 CSS transition 在顶部 Tab 区域实现高亮滑动效果