219 lines
6.2 KiB
Markdown
219 lines
6.2 KiB
Markdown
# 诊单查看记录功能
|
||
|
||
## 功能概述
|
||
记录用户查看和确认诊单的行为,包括查看次数、查看时间、确认状态等信息。
|
||
|
||
## 数据库表结构
|
||
|
||
### 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的逻辑
|
||
- [ ] 添加查看记录的管理界面
|
||
- [ ] 添加数据统计报表
|
||
- [ ] 实现查看记录的导出功能
|