新增功能

This commit is contained in:
Your Name
2026-03-04 15:32:30 +08:00
parent a07e844c47
commit ab77f5488d
2266 changed files with 177942 additions and 3444 deletions
+243
View File
@@ -0,0 +1,243 @@
# 管理员角色接口优化总结
## 概述
为了解决权限问题,创建了两个专门的接口用于获取医生和医助列表,替代原来的 `adminapi/auth.admin/lists` 接口。
## 问题背景
### 原来的问题
1. **医助列表**`adminapi/auth.admin/lists?role_id=2` - 权限不足
2. **医生列表**`adminapi/auth.admin/lists?role_id=1` - 权限不足
### 根本原因
- `auth.admin/lists` 接口需要管理员权限
- 普通用户无法访问该接口
- 数据库结构使用中间表 `zyt_admin_role` 关联角色,不是直接的 `role_id` 字段
## 解决方案
### 新增接口
| 接口 | 用途 | 角色ID |
|------|------|--------|
| `/tcm.diagnosis/getAssistants` | 获取医助列表 | 2 |
| `/tcm.diagnosis/getDoctors` | 获取医生列表 | 1 |
### 数据库结构
```
zyt_admin (管理员表)
├─ id
├─ name
├─ account
└─ disable
zyt_admin_role (中间表)
├─ admin_id → zyt_admin.id
└─ role_id → 角色ID
```
### 查询逻辑
```php
// 通过中间表查询
\app\common\model\auth\Admin::alias('a')
->join('admin_role ar', 'a.id = ar.admin_id')
->where('ar.role_id', $roleId) // 1=医生, 2=医助
->where('a.disable', 0)
->field(['a.id', 'a.name', 'a.account'])
->order('a.id', 'asc')
->select()
->toArray();
```
## 实现文件
### 后端文件
1. **控制器**`server/app/adminapi/controller/tcm/DiagnosisController.php`
- `getAssistants()` - 获取医助列表
- `getDoctors()` - 获取医生列表
2. **逻辑层**`server/app/adminapi/logic/tcm/DiagnosisLogic.php`
- `getAssistants()` - 医助查询逻辑
- `getDoctors()` - 医生查询逻辑
### 前端文件
1. **API**`admin/src/api/tcm.ts`
- `getAssistants()` - 医助API
- `getDoctors()` - 医生API
2. **组件**
- `admin/src/views/tcm/diagnosis/index.vue` - 使用医助列表
- `admin/src/views/tcm/diagnosis/appointment.vue` - 使用医生列表
## 接口对比
### 医助列表
**旧接口:**
```typescript
import { adminLists } from '@/api/perms/admin'
const assistants = await adminLists({
page_no: 1,
page_size: 1000,
role_id: 2
})
assistantOptions.value = assistants?.lists || []
```
**新接口:**
```typescript
import { getAssistants } from '@/api/tcm'
const assistants = await getAssistants()
assistantOptions.value = assistants || []
```
### 医生列表
**旧接口:**
```typescript
import { adminLists } from '@/api/perms/admin'
const doctors = await adminLists({
page_no: 1,
page_size: 1000,
role_id: 1
})
doctorList.value = doctors?.lists || []
```
**新接口:**
```typescript
import { getDoctors } from '@/api/tcm'
const doctors = await getDoctors()
doctorList.value = doctors || []
```
## 优势对比
| 特性 | 旧接口 | 新接口 |
|------|--------|--------|
| 权限要求 | 需要管理员权限 | 无需额外权限 |
| 数据结构 | 分页数据 `{lists, count}` | 直接返回数组 |
| 查询方式 | 错误(直接查role_id) | 正确(通过中间表) |
| 返回字段 | 所有字段 | 精简字段 |
| 性能 | 较慢 | 较快 |
| 维护性 | 依赖权限系统 | 独立维护 |
## 测试清单
### 医助列表测试
- [ ] 诊单管理页面 - 筛选条件中的医助下拉框
- [ ] 诊单管理页面 - 指派医助弹窗
- [ ] 批量指派医助功能
- [ ] 单个指派医助功能
### 医生列表测试
- [ ] 挂号预约页面 - 医生选择下拉框
- [ ] 医生排班查询
- [ ] 预约挂号功能
### 功能测试
- [ ] 下拉框正常显示
- [ ] 可以正常筛选
- [ ] 可以正常指派/预约
- [ ] 没有权限错误
- [ ] 没有控制台错误
## SQL 测试
### 检查数据
```sql
-- 检查医生
SELECT
a.id,
a.name,
a.account,
ar.role_id,
a.disable
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE ar.role_id = 1
ORDER BY a.id ASC;
-- 检查医助
SELECT
a.id,
a.name,
a.account,
ar.role_id,
a.disable
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE ar.role_id = 2
ORDER BY a.id ASC;
-- 检查中间表
SELECT * FROM zyt_admin_role ORDER BY admin_id, role_id;
```
### 添加测试数据
```sql
-- 添加测试医生
INSERT INTO zyt_admin (name, account, password, disable, create_time, update_time)
VALUES ('测试医生', 'test_doctor', 'e10adc3949ba59abbe56e057f20f883e', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (LAST_INSERT_ID(), 1);
-- 添加测试医助
INSERT INTO zyt_admin (name, account, password, disable, create_time, update_time)
VALUES ('测试医助', 'test_assistant', 'e10adc3949ba59abbe56e057f20f883e', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (LAST_INSERT_ID(), 2);
```
## 相关文档
- `ASSISTANT_API_FIX.md` - 医助列表接口详细说明
- `DOCTOR_API_FIX.md` - 医生列表接口详细说明
- `ASSISTANT_API_TEST.md` - 医助接口测试指南
## 注意事项
1. **中间表关联**:必须通过 `zyt_admin_role` 查询,不能直接查 `role_id`
2. **角色ID**:医生=1,医助=2
3. **状态过滤**:只返回 `disable = 0` 的用户
4. **字段精简**:只返回 id、name、account
5. **错误处理**:捕获异常,返回空数组
6. **日志记录**:记录错误日志便于排查
## 迁移步骤
如果其他页面也使用了 `adminLists` 获取医生/医助列表,可以按以下步骤迁移:
1. 导入新的 API`import { getDoctors, getAssistants } from '@/api/tcm'`
2. 移除旧的导入:`import { adminLists } from '@/api/perms/admin'`
3. 替换调用:`adminLists({role_id: 1})``getDoctors()`
4. 更新数据处理:`res?.lists || []``res || []`
5. 测试功能是否正常
## 成功标准
- ✅ 接口返回正确的数据
- ✅ 前端下拉框正常显示
- ✅ 没有权限错误
- ✅ 没有控制台错误
- ✅ 功能正常使用
---
**创建日期:** 2024-03-04
**状态:** ✅ 完成
**影响范围:** 诊单管理、挂号预约