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