Files
zyt/DIAGNOSIS_VIEW_RECORD_FEATURE.md
T
2026-03-06 17:30:37 +08:00

219 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 诊单查看记录功能
## 功能概述
记录用户查看和确认诊单的行为,包括查看次数、查看时间、确认状态等信息。
## 数据库表结构
### la_diagnosis_view_records 表
```sql
CREATE TABLE `la_diagnosis_view_records` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '查看用户ID',
`diagnosis_id` int(11) NOT NULL DEFAULT '0' COMMENT '诊单ID',
`patient_id` int(11) NOT NULL DEFAULT '0' COMMENT '患者ID',
`share_user_id` int(11) NOT NULL DEFAULT '0' COMMENT '分享用户ID',
`view_count` int(11) NOT NULL DEFAULT '1' COMMENT '查看次数',
`first_view_time` int(11) NOT NULL DEFAULT '0' COMMENT '首次查看时间',
`last_view_time` int(11) NOT NULL DEFAULT '0' COMMENT '最后查看时间',
`is_confirmed` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已确认 0-未确认 1-已确认',
`confirmed_time` int(11) NOT NULL DEFAULT '0' COMMENT '确认时间',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`delete_time` int(11) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
KEY `idx_user_diagnosis` (`user_id`, `diagnosis_id`),
KEY `idx_diagnosis` (`diagnosis_id`),
KEY `idx_patient` (`patient_id`),
KEY `idx_share_user` (`share_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='诊单查看记录表';
```
## 字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| user_id | int | 查看用户ID(当前登录用户) |
| diagnosis_id | int | 诊单ID |
| patient_id | int | 患者ID(从诊单获取) |
| share_user_id | int | 分享用户ID(生成二维码的用户) |
| view_count | int | 查看次数(每次打开页面+1) |
| first_view_time | int | 首次查看时间戳 |
| last_view_time | int | 最后查看时间戳 |
| is_confirmed | tinyint | 是否已确认(0-未确认 1-已确认) |
| confirmed_time | int | 确认时间戳 |
## 后端实现
### 1. 模型文件
`server/app/common/model/DiagnosisViewRecord.php`
### 2. 控制器方法
`server/app/api/controller/TcmController.php`
#### diagnosisDetail - 获取诊单详情
```php
GET /api/tcm/diagnosisDetail
参数:
- id: 诊单ID(必填)
- user_id: 查看用户ID(选填,默认0
- share_user_id: 分享用户ID(选填,默认0
功能:
1. 获取诊单详情
2. 自动记录查看行为
3. 如果是首次查看,创建新记录
4. 如果已有记录,更新查看次数和最后查看时间
```
#### confirmDiagnosis - 确认诊单
```php
POST /api/tcm/confirmDiagnosis
参数:
- id: 诊单ID(必填)
- user_id: 查看用户ID(选填,默认0
- share_user: 分享用户ID(选填,默认0
功能:
1. 更新查看记录的确认状态
2. 记录确认时间
3. 如果没有查看记录,创建一条已确认的记录
```
### 3. 逻辑层方法
`server/app/adminapi/logic/tcm/DiagnosisLogic.php`
#### diagnosisDetailWithRecord
- 获取诊单详情并记录查看行为
- 调用 `recordDiagnosisView` 记录查看
#### recordDiagnosisView
- 查找是否已有记录
- 首次查看:创建新记录
- 再次查看:更新查看次数和最后查看时间
#### confirmDiagnosisRecord
- 更新确认状态
- 记录确认时间
## 前端实现
### 小程序页面
`TUICallKit-Vue3/pages/order/monad/monad.vue`
#### 参数解析
```javascript
const parsePageParams = (options) => {
// 解析scene参数(扫码进入)
// 解析普通参数(跳转进入)
// 获取当前登录用户ID
return params;
};
```
#### 加载诊单详情
```javascript
const res = await proxy.apiUrl({
url: '/api/tcm/diagnosisDetail',
method: 'GET',
data: {
id: diagnosisId,
user_id: params.user_id || 0,
share_user_id: params.share_user || 0
}
});
```
#### 确认诊单
```javascript
const res = await proxy.apiUrl({
url: '/api/tcm/confirmDiagnosis',
method: 'POST',
data: {
id: params.id,
user_id: params.user_id || 0,
share_user: params.share_user || 0
}
});
```
## 使用流程
### 1. 生成二维码
管理员在后台点击"小程序二维码"按钮
- 传递参数:`diagnosis_id`, `patient_id`, `share_user_id`
- 生成scene: `id=4&share_user=1`
### 2. 用户扫码
用户使用微信扫描二维码
- 小程序接收参数:`scene: "id%3D4%26share_user%3D1"`
- 解析参数:`{ id: "4", share_user: "1" }`
### 3. 查看诊单
小程序加载诊单详情
- 调用 `/api/tcm/diagnosisDetail`
- 传递:`id`, `user_id`, `share_user_id`
- 后端自动记录查看行为
### 4. 确认诊单
用户点击"确认诊单"按钮
- 调用 `/api/tcm/confirmDiagnosis`
- 传递:`id`, `user_id`, `share_user`
- 后端更新确认状态
## 数据统计
### 可统计的数据
1. 每个诊单的查看次数
2. 每个用户查看了哪些诊单
3. 诊单的确认率
4. 分享效果(通过share_user_id统计)
5. 首次查看到确认的时间间隔
### 查询示例
#### 查询某个诊单的查看记录
```php
$records = DiagnosisViewRecord::where('diagnosis_id', $diagnosisId)
->with(['user', 'shareUser'])
->select();
```
#### 查询某个用户的查看记录
```php
$records = DiagnosisViewRecord::where('user_id', $userId)
->with(['diagnosis'])
->select();
```
#### 统计诊单查看次数
```php
$viewCount = DiagnosisViewRecord::where('diagnosis_id', $diagnosisId)
->sum('view_count');
```
#### 统计确认率
```php
$total = DiagnosisViewRecord::where('diagnosis_id', $diagnosisId)->count();
$confirmed = DiagnosisViewRecord::where('diagnosis_id', $diagnosisId)
->where('is_confirmed', 1)
->count();
$rate = $total > 0 ? ($confirmed / $total * 100) : 0;
```
## 注意事项
1. **用户ID获取**: 需要在小程序中实现用户登录,获取当前用户ID
2. **匿名访问**: 如果允许匿名访问,user_id可以为0
3. **数据清理**: 建议定期清理过期的查看记录
4. **性能优化**: 查看记录表可能增长较快,注意添加索引
5. **隐私保护**: 查看记录涉及用户行为,注意数据安全
## TODO
- [ ] 在小程序中实现用户登录功能
- [ ]`parsePageParams` 中添加获取用户ID的逻辑
- [ ] 添加查看记录的管理界面
- [ ] 添加数据统计报表
- [ ] 实现查看记录的导出功能