docs: 三端审计修复实施计划 Phase 2 — 6 个 Task (#7-#11)

Chunk 2: 体验补全阶段
- Task 9: 患者详情快捷导航卡片
- Task 10: 5 个列表页支持 URL patient_id 过滤
- Task 11: AI 分析列表患者 Link
- Task 12: 小程序 AI 建议跳转修复
- Task 13: 小程序通知 Tab 对接 erp-message API
- Task 14: 小程序咨询功能入口
This commit is contained in:
iven
2026-05-01 17:20:45 +08:00
parent ac2797e1b7
commit 73119fe026

View File

@@ -787,3 +787,324 @@ git commit -m "fix(server): 事件清理保留期从 90 天调整为 7 天"
- [ ] `cd apps/web && pnpm build` — 前端构建通过
- [ ] 浏览器验证:登录页品牌信息、侧边栏菜单图标、主题设置品牌编辑
- [ ] `git push` — 推送到远程
---
## Chunk 2: Phase 2 — 体验补全 (#7-#11)
### Task 9: 患者详情快捷导航卡片
**Files:**
- Modify: `apps/web/src/pages/health/PatientDetail.tsx:222-224`
- [ ] **Step 1: 在 PatientDetail.tsx 插入快捷导航卡片**
在第 222 行(患者信息卡片 `</Card>` 闭合标签)和第 224 行Tabs `<Card>` 开始标签)之间插入:
```tsx
{/* 快捷导航 */}
<Card style={{ ...cardStyle, marginBottom: 16, padding: '12px 16px' }}>
<Space size={8} wrap>
<Text type="secondary" style={{ marginRight: 8 }}>:</Text>
<Button type="link" size="small" onClick={() => navigate(`/health/appointments?patient_id=${id}`)}></Button>
<Button type="link" size="small" onClick={() => navigate(`/health/consultations?patient_id=${id}`)}></Button>
<Button type="link" size="small" onClick={() => navigate(`/health/dialysis?patient_id=${id}`)}></Button>
<Button type="link" size="small" onClick={() => navigate(`/health/follow-up-tasks?patient_id=${id}`)}>访</Button>
<Button type="link" size="small" onClick={() => navigate(`/health/ai-analysis?patient_id=${id}`)}>AI </Button>
</Space>
</Card>
```
确认 `Button``Space``Text` 已在文件顶部 import通常已导入。确认 `navigate` 来自 `useNavigate()`
- [ ] **Step 2: 验证编译**
Run: `cd apps/web && pnpm build`
Expected: 构建成功
- [ ] **Step 3: 提交**
```bash
git add apps/web/src/pages/health/PatientDetail.tsx
git commit -m "feat(web): 患者详情页增加快捷导航卡片 — 预约/咨询/透析/随访/AI"
```
---
### Task 10: 列表页面支持 URL 参数 patient_id 过滤
**Files:**
- Modify: `apps/web/src/pages/health/AppointmentList.tsx`
- Modify: `apps/web/src/pages/health/ConsultationList.tsx`
- Modify: `apps/web/src/pages/health/DialysisManageList.tsx`
- Modify: `apps/web/src/pages/health/FollowUpTaskList.tsx`
- Modify: `apps/web/src/pages/health/AiAnalysisList.tsx`
这 5 个页面需要支持从 URL 读取 `patient_id` 参数作为默认筛选条件。统一模式如下:
- [ ] **Step 1: 逐一检查各页面当前的筛选逻辑**
对每个页面,确认:
- 是否已使用 `useSearchParams()``useLocation()` 读取 URL 参数
- 筛选器状态如何初始化useState 初始值)
- API 调用的参数传递方式
> 此步骤为调研,不修改代码。根据调研结果决定每个页面的具体修改方案。
- [ ] **Step 2: 为每个页面添加 URL patient_id 读取**
统一模式:在组件初始化时从 URL 读取 `patient_id`,设为筛选器默认值。
```typescript
import { useSearchParams } from 'react-router-dom';
// 在组件函数体内
const [searchParams] = useSearchParams();
const urlPatientId = searchParams.get('patient_id');
// 在筛选器状态中设置默认值
const [filters, setFilters] = useState({
// ... 已有筛选器
patient_id: urlPatientId || undefined,
});
```
如果页面使用 `PatientSelect` 组件,将 `urlPatientId` 作为初始值传入。
- [ ] **Step 3: 验证编译**
Run: `cd apps/web && pnpm build`
Expected: 构建成功
- [ ] **Step 4: 提交**
```bash
git add apps/web/src/pages/health/AppointmentList.tsx \
apps/web/src/pages/health/ConsultationList.tsx \
apps/web/src/pages/health/DialysisManageList.tsx \
apps/web/src/pages/health/FollowUpTaskList.tsx \
apps/web/src/pages/health/AiAnalysisList.tsx
git commit -m "feat(web): 5 个列表页支持 URL 参数 patient_id 自动筛选"
```
---
### Task 11: AI 分析列表添加患者 Link
**Files:**
- Modify: `apps/web/src/pages/health/AiAnalysisList.tsx:1-2,316-323`
- [ ] **Step 1: 添加 Link 导入**
`apps/web/src/pages/health/AiAnalysisList.tsx` 顶部 import 区域添加:
```typescript
import { Link } from 'react-router-dom';
```
- [ ] **Step 2: 修改 patient_id 列渲染**
将第 316-323 行的列定义从:
```tsx
{
title: '患者 ID',
dataIndex: 'patient_id',
key: 'patient_id',
width: 120,
render: (v: string) => (
<span style={{ fontFamily: 'monospace', fontSize: 12 }}>{v.slice(0, 8)}</span>
),
},
```
改为:
```tsx
{
title: '患者',
dataIndex: 'patient_id',
key: 'patient_id',
width: 140,
render: (v: string) => (
<Link to={`/health/patients/${v}`} style={{ fontFamily: 'monospace', fontSize: 12 }}>
{v.slice(0, 8)}
</Link>
),
},
```
- [ ] **Step 3: 验证编译**
Run: `cd apps/web && pnpm build`
Expected: 构建成功
- [ ] **Step 4: 提交**
```bash
git add apps/web/src/pages/health/AiAnalysisList.tsx
git commit -m "feat(web): AI 分析列表患者 ID 改为可点击 Link 跳转详情"
```
---
### Task 12: 小程序 AI 建议跳转修复
**Files:**
- Modify: `apps/miniprogram/src/pages/health/index.tsx:178`
- [ ] **Step 1: 修改 AI 建议卡片 onClick**
`apps/miniprogram/src/pages/health/index.tsx` 第 178 行,将:
```tsx
<View className='ai-suggestion-card' onClick={() => Taro.navigateTo({ url: '/pages/pkg-profile/settings/index' })}>
```
改为:
```tsx
<View className='ai-suggestion-card' onClick={() => {
const firstSuggestion = aiSuggestions[0];
if (firstSuggestion?.suggestion_type === 'appointment') {
Taro.navigateTo({ url: `/pages/pkg-appointment/create/index?patientId=${firstSuggestion.patient_id}` });
} else if (firstSuggestion?.suggestion_type === 'followup') {
Taro.navigateTo({ url: `/pages/pkg-profile/followups/index` });
} else {
Taro.navigateTo({ url: '/pages/health/index' });
}
}}>
```
> **注意**: 卡片整体只有一个 onClick跳转基于第一条建议的类型。如果需要每条建议单独点击需要将 onClick 移到 `ai-suggestion-item` 上并传入具体 item。
- [ ] **Step 2: 验证小程序编译**
Run: `cd apps/miniprogram && pnpm build:weapp`
Expected: 构建成功
- [ ] **Step 3: 提交**
```bash
git add apps/miniprogram/src/pages/health/index.tsx
git commit -m "fix(miniprogram): AI 建议卡片按 suggestion_type 跳转 — 而非统一跳设置页"
```
---
### Task 13: 小程序通知 Tab 对接消息 API
**Files:**
- Create: `apps/miniprogram/src/services/notification.ts`
- Modify: `apps/miniprogram/src/pages/messages/index.tsx:34-38`
- [ ] **Step 1: 创建通知服务**
创建 `apps/miniprogram/src/services/notification.ts`
```typescript
import { api } from './request';
export const notificationService = {
list: (params?: { page?: number; page_size?: number }) =>
api.get('/messages', params as Record<string, string | number | undefined>),
markRead: (id: string) =>
api.put(`/messages/${id}/read`),
markAllRead: () =>
api.put('/messages/read-all'),
getUnreadCount: () =>
api.get('/messages/unread-count'),
};
```
- [ ] **Step 2: 替换硬编码空数组**
`apps/miniprogram/src/pages/messages/index.tsx` 中:
1. 在顶部添加导入:
```typescript
import { notificationService } from '../../services/notification';
```
2. 将第 35-38 行的 `else` 分支从:
```typescript
} else {
// 通知目前从咨询中提取状态变化作为示例
// 后续可对接独立通知 API
setNotifications([]);
}
```
改为:
```typescript
} else {
const res = await notificationService.list({ page: 1, page_size: 20 });
setNotifications(res?.data || []);
}
```
- [ ] **Step 3: 验证小程序编译**
Run: `cd apps/miniprogram && pnpm build:weapp`
Expected: 构建成功
- [ ] **Step 4: 提交**
```bash
git add apps/miniprogram/src/services/notification.ts apps/miniprogram/src/pages/messages/index.tsx
git commit -m "feat(miniprogram): 通知 Tab 对接 erp-message 消息 API — 替换空壳"
```
---
### Task 14: 小程序咨询功能入口
**Files:**
- Modify: `apps/miniprogram/src/pages/profile/index.tsx:8-22,24-38`
- [ ] **Step 1: 在 MENU_ITEMS 添加在线咨询**
`apps/miniprogram/src/pages/profile/index.tsx``MENU_ITEMS` 数组(第 21 行 "设置" 之前)添加:
```typescript
{ label: '我的预约', icon: '📅', bg: '#E8F0F8' },
{ label: '在线咨询', icon: '💬', bg: '#E8F0E8' },
```
- [ ] **Step 2: 在 MENU_PATHS 添加路径映射**
`MENU_PATHS`(第 24-38 行)添加对应路径:
```typescript
'我的预约': '/pages/pkg-appointment/index',
'在线咨询': '/pages/consultation/index',
```
> **注意**: 需确认 `/pages/pkg-appointment/index` 路径存在。如果预约页面路径不同,按实际路径填写。
- [ ] **Step 3: 验证小程序编译**
Run: `cd apps/miniprogram && pnpm build:weapp`
Expected: 构建成功
- [ ] **Step 4: 提交**
```bash
git add apps/miniprogram/src/pages/profile/index.tsx
git commit -m "feat(miniprogram): 个人中心添加我的预约+在线咨询入口"
```
---
## Phase 2 验证清单
完成所有 Task 后执行:
- [ ] `cd apps/web && pnpm build` — Web 前端构建通过
- [ ] `cd apps/miniprogram && pnpm build:weapp` — 小程序构建通过
- [ ] 浏览器验证:患者详情快捷导航 → 目标页面自动过滤
- [ ] 浏览器验证AI 分析列表患者 Link 跳转正常
- [ ] 小程序验证AI 建议卡片跳转到正确页面(非设置页)
- [ ] 小程序验证:消息页通知 Tab 展示后端消息数据
- [ ] 小程序验证:个人中心出现"在线咨询"入口
- [ ] `git push` — 推送到远程