# 医生表单字段说明文档
## 文档信息
- **文档名称**:医生管理-新增医生表单字段说明
- **数据库表名**:`fa_doctors`
- **对应功能**:医生管理 - 医生信息 - 新增医生
- **源码路径**:`/application/admin/controller/doctor/Doctor.php`
- **表单视图**:`/application/admin/view/doctor/doctor/add.html`
- **生成日期**:2025-12-05
---
## 字段对照表
| 序号 | 表单显示名称 | 数据库字段名 | 字段类型 | 是否必填 | 取值说明 |
|------|-------------|-------------|---------|---------|---------|
| 1 | 用户名 | `username` | 文本 | 是 | 登录用户名,需符合username规则 |
| 2 | 密码 | `password` | 密码 | 是 | 登录密码,需符合password规则 |
| 3 | 医生姓名 | `realname` | 文本 | 是 | 医生真实姓名 |
| 4 | 医疗机构 | `institution_id` | 下拉选择 | 是 | 所属医疗机构ID |
| 5 | 科室 | `department_id` | 下拉选择 | 科室级必填 | 所属科室ID(医生等级为科室级时必填) |
| 6 | 医生等级 | `doctor_grade` | 单选 | 否 | 1=管理级(查看所有)
2=科室级(查看医生科室下数据)
3=医生级(查看该医生数据) |
| 7 | 职称 | `doctor_title` | 文本 | 否 | 医生职称 |
| 8 | 医生角色 | `doctor_role` | 树形多选 | 是 | 从doctor_menu表选择,逗号分隔存储ID |
| 9 | 报告权限 | `is_report` | 单选 | 是 | 1=启用, 0=禁用 |
| 10 | 状态 | `status` | 单选 | 是 | 1=正常, 0=禁用 |
| 11 | 医生分类 | `doctor_class` | 多选下拉 | 是 | 1=临床医生
2=报告医生
3=审核医生
4=确认医生
5=登记医生
6=远程申请医生
7=远程报告医生
8=远程审核医生
9=报告修改医生
10=影像检查删除医生
(逗号分隔) |
| 12 | 检查权限 | `exam_class` | 多选下拉 | 是 | CR, CT, DX, ES, MR, XA, ECG, MG, PT, RF, PETCT, US
(逗号分隔,*表示全部) |
| 13 | 是否为管理员 | `is_admin` | 单选 | 否 | 0=否, 1=是 |
| 14 | 登陆安全验证 | `is_send_message` | 单选 | 否 | 0=否, 1=是 |
| 15 | 短信消息推送 | `send_sms` | 单选 | 否 | 0=否, 1=是 |
| 16 | 检查分配权重 | `weight` | 数字 | 否 | 用于自动分配检查时的权重值 |
| 17 | 联系电话 | `phone` | 文本 | 否 | 医生联系电话 |
| 18 | 特殊机构 | `special_institution` | 下拉多选 | 否 | 医生可访问的特殊机构ID(逗号分隔) |
---
## 重要字段详细说明
### 1. 用户名 (username)
- **字段名**:`username`
- **数据类型**:VARCHAR
- **验证规则**:`required;username`
- **说明**:用于登录的用户名,必须符合username规则
- **唯一性**:在同一机构内需保证唯一
- **代码位置**:add.html:3-7
### 2. 密码 (password)
- **字段名**:`password`
- **数据类型**:VARCHAR
- **验证规则**:`required;password`
- **说明**:登录密码,需符合密码安全规则
- **存储方式**:加密存储(通常使用MD5或bcrypt)
- **代码位置**:add.html:8-13
### 3. 医生等级 (doctor_grade)
- **字段名**:`doctor_grade`
- **数据类型**:INT
- **取值**:
- `1`:管理级(查看所有数据)
- `2`:科室级(查看医生科室下数据,必须选择科室)
- `3`:医生级(查看该医生数据)
- **业务规则**:当选择"科室级"时,department_id字段变为必填
- **代码位置**:add.html:32-37, Doctor.php:131-138
### 4. 医生角色 (doctor_role)
- **字段名**:`doctor_role`
- **数据类型**:VARCHAR(逗号分隔的ID)
- **显示方式**:树形多选(jstree插件)
- **数据来源**:`doctor_menu` 表(医生权限菜单表)
- **存储格式**:逗号分隔的菜单ID,如 "1,2,3,5,8"
- **联动功能**:支持bind_ids联动选择
- **API接口**:`/admin/doctor/doctor/doctorRoleTree`
- **说明**:
- 树形结构展示所有可选权限
- 支持全选和展开全部
- 父节点选中时子节点自动选中
- 某些权限有bind_ids(绑定权限),选中时会联动选中绑定的权限
- **代码位置**:add.html:44-52, Doctor.php:314-358
### 5. 报告权限 (is_report)
- **字段名**:`is_report`
- **数据类型**:INT
- **取值**:
- `1`:启用(有报告权限)
- `0`:禁用(无报告权限)
- **说明**:控制医生是否有出具报告的权限
- **代码位置**:add.html:54-58
### 6. 医生分类 (doctor_class)
- **字段名**:`doctor_class`
- **数据类型**:VARCHAR(逗号分隔)
- **显示方式**:多选下拉(selectpicker)
- **可选值**:
- `1`:临床医生
- `2`:报告医生
- `3`:审核医生
- `4`:确认医生
- `5`:登记医生
- `6`:远程申请医生
- `7`:远程报告医生
- `8`:远程审核医生
- `9`:报告修改医生
- `10`:影像检查删除医生
- **存储方式**:逗号分隔存储,如 "2,3,7"
- **关联表**:`doctor_department_class` 表存储医生-科室-分类的关联关系
- **说明**:医生可以同时拥有多个分类,不同分类对应不同的业务权限
- **代码位置**:add.html:66-70, Doctor.php:46
### 7. 检查权限 (exam_class)
- **字段名**:`exam_class`
- **数据类型**:VARCHAR(逗号分隔)
- **显示方式**:多选下拉(selectpicker)
- **可选值**:
- `CR`:CR(计算机X射线摄影)
- `CT`:CT(计算机断层扫描)
- `DX`:DX(数字X射线摄影)
- `ES`:ES(内窥镜)
- `MR`:MR(磁共振)
- `XA`:XA(血管造影)
- `ECG`:ECG(心电图)
- `MG`:MG(乳腺摄影)
- `PT`:PT(正电子发射断层扫描)
- `RF`:RF(射频透视)
- `PETCT`:PETCT(正电子发射计算机断层扫描)
- `US`:US(超声)
- **存储方式**:
- 逗号分隔存储,如 "CT,MR,US"
- `*` 表示拥有所有检查类型的权限
- **默认值**:全选(所有检查类型)
- **说明**:控制医生可以查看和处理的检查类型
- **代码位置**:add.html:72-76, Doctor.php:45
### 8. 检查分配权重 (weight)
- **字段名**:`weight`
- **数据类型**:INT
- **说明**:用于检查自动分配功能,权重越高,分配到的检查越多
- **应用场景**:当机构开启"检查自动分配"功能时使用
- **代码位置**:add.html:102-106
### 9. 特殊机构 (special_institution)
- **字段名**:`special_institution`(表单输入字段)
- **关联表**:`special_contact`(实际存储表)
- **存储方式**:
- 表单提交:逗号分隔的机构ID
- 数据库存储:在 `special_contact` 表中建立多条关联记录
- 字段:`did`(医生ID), `sid`(特殊机构ID), `status`(状态)
- **说明**:
- 医生可访问的特殊机构列表
- 除了所属机构外,医生还可以访问这些特殊机构的数据
- **代码位置**:add.html:114-118, Doctor.php:255-258
---
## 数据处理流程
### 新增医生时的数据处理
1. **参数接收**
```php
$params = $this->request->post("row/a");
```
2. **业务验证**
- 检查医生等级:如果是科室级(doctor_grade=2),必须选择科室
- 代码位置:Doctor.php:131-138
3. **调用Service层处理**
```php
$res = $this->service->addDoctor($params);
```
4. **Service层处理(DoctorService::addDoctor)**
- 格式化参数(formatSaveParams)
- 检查用户名唯一性
- 加密密码
- 插入医生主表(doctors)
- 插入医生分类关联表(doctor_department_class)
- 插入特殊机构关联表(special_contact)
- 返回处理结果
5. **事务处理**
- 所有操作在事务中执行
- 任何步骤失败都会回滚
- 代码位置:Doctor.php:130-145
### 编辑医生时的数据处理
1. **额外处理**
- 更新医生分类:`updateDoctorClass()`
- 更新特殊机构:`updateSpecialInstitution()`
- 代码位置:Doctor.php:218-227
2. **exam_class 特殊处理**
- 读取时:`*` 转换为所有检查类型的列表
- 保存时:全选转换为 `*`
- 代码位置:Doctor.php:253
---
## 关联数据表
### 主表
- `fa_doctors`:医生主表
### 关联表
| 表名 | 关联字段 | 说明 |
|-----|---------|-----|
| `fa_institution` | `institution_id` | 医疗机构表 |
| `fa_department` | `department_id` | 科室表 |
| `doctor_menu` | `doctor_role` | 医生权限菜单表(树形结构) |
| `doctor_department_class` | `doctor_id`, `department_id`, `doctor_class` | 医生-科室-分类关联表 |
| `special_contact` | `did`(医生ID), `sid`(机构ID) | 医生-特殊机构关联表 |
| `device` | `device_ids` | 设备表(已注释,暂不使用) |
---
## 业务规则
### 1. 用户名唯一性
- 在同一机构内,用户名必须唯一
- 新增时检查用户名是否已存在
### 2. 医生等级与科室的关联
- **管理级(1)**:可查看所有数据,科室可选
- **科室级(2)**:只能查看所属科室数据,必须选择科室
- **医生级(3)**:只能查看自己的数据,科室可选
- 验证代码:Doctor.php:131-138, 205-211
### 3. 医生分类的存储
- 表单提交:数组形式 `['2','3','7']`
- 数据库存储:
- `doctors` 表不直接存储
- `doctor_department_class` 表存储每个分类的关联记录
- 每个分类一条记录:(doctor_id, department_id, doctor_class)
### 4. 检查权限的特殊标记
- 全选所有检查类型时,存储为 `*`
- 读取时 `*` 展开为所有类型
- 节省存储空间
### 5. 密码处理
- 新增时:必填,加密后存储
- 编辑时:不填表示不修改密码
- 加密方式:通常使用MD5或bcrypt
### 6. 状态字段特殊处理
- 数据库中 `NULL` 表示禁用(0)
- 页面显示时转换:`is_null($status) ? '0' : $status`
- 代码位置:Doctor.php:214, 252
### 7. 医生角色的联动选择
- 某些权限有 bind_ids 字段
- 选中某权限时,自动选中其绑定的权限
- 树形结构支持父子联动
---
## API接口说明
### 1. 医生角色树形列表
- **接口**:`/admin/doctor/doctor/doctorRoleTree`
- **方法**:GET/POST
- **参数**:
- `id`:医生ID(编辑时传入,用于回显已选权限)
- **返回**:jstree格式的树形数据
```json
[
{
"id": "1",
"parent": "#",
"text": "权限名称",
"type": "menu",
"state": {"selected": false},
"bind": ["2", "3"]
}
]
```
- **代码位置**:Doctor.php:314-358
### 2. 批量导入医生
- **接口**:`/admin/doctor/doctor/import`
- **方法**:POST
- **参数**:
- `file`:Excel文件路径
- **说明**:批量导入医生账号信息
- **代码位置**:Doctor.php:366-404
---
## 配置项说明
### 1. 检查类型配置
- **定义位置**:Doctor.php:45
- **配置项**:
```php
protected $exam_class = [
'CR' => 'CR', 'CT' => 'CT', 'DX' => 'DX',
'ES' => 'ES', 'MR' => 'MR', 'XA' => 'XA',
'ECG' => 'ECG', 'MG' => 'MG', 'PT' => 'PT',
'RF' => 'RF', 'PETCT' => 'PETCT', 'US' => 'US'
];
```
### 2. 医生分类配置
- **定义位置**:Doctor.php:46
- **配置项**:
```php
protected $doctor_class = [
1 => '临床医生', 2 => '报告医生',
3 => '审核医生', 4 => '确认医生',
5 => '登记医生', 6 => '远程申请医生',
7 => '远程报告医生', 8 => '远程审核医生',
9 => '报告修改医生', 10 => '影像检查删除医生'
];
```
### 3. 医生角色配置(已废弃,改用doctor_role字段)
- **定义位置**:Doctor.php:47
- **配置项**:
```php
protected $doctor_role = [
1 => '技师',
2 => '本地医生',
3 => '远程医生'
];
```
- **说明**:此配置项保留,但实际使用的是从 `doctor_menu` 表动态读取的权限树
---
## 数据验证规则
### 表单验证
- **用户名**:`required;username`
- **密码**:`required;password`
- **真实姓名**:`required`
- **医疗机构**:`required`
- **医生角色**:`required`
- **报告权限**:`required`
- **状态**:`required`
- **医生分类**:`required`(多选至少选一个)
- **检查权限**:`required`(多选至少选一个)
### 业务验证
- 医生等级为科室级时,科室必填
- 用户名在同机构内唯一
- 医生分类至少选择一个
---
## 注意事项
1. **必填字段**:username, password, realname, institution_id, doctor_role, is_report, status, doctor_class, exam_class 必须填写
2. **条件必填**:当 doctor_grade = 2(科室级)时,department_id 必须填写
3. **字段格式**:
- 逗号分隔字段:去除空值,trim处理
- 密码字段:加密存储,不可逆
4. **特殊处理**:
- exam_class = `*` 表示所有检查类型
- status = NULL 等同于 0(禁用)
- doctor_class 存储在关联表中,不在主表
5. **权限控制**:
- 医生角色(doctor_role)控制功能权限
- 医生等级(doctor_grade)控制数据权限
- 检查权限(exam_class)控制检查类型权限
- 医生分类(doctor_class)控制业务流程权限
6. **事务处理**:
- 所有增删改操作都在事务中执行
- 涉及多表操作,确保数据一致性
- 失败时自动回滚
7. **关联数据处理**:
- 医生分类:插入/更新 `doctor_department_class` 表
- 特殊机构:插入/更新 `special_contact` 表
- 删除医生时需同步删除关联数据
8. **下拉选择数据来源**:
- 医疗机构:从当前用户可访问的机构列表中选择
- 科室:根据选择的机构动态加载
- 特殊机构:从机构表中选择
- 医生角色:从 `doctor_menu` 表读取树形权限
---
## 相关Service方法
### DoctorService 主要方法
1. **addDoctor($params)**
- 功能:新增医生
- 处理:格式化参数、验证唯一性、插入主表和关联表
2. **formatSaveParams($params)**
- 功能:格式化保存参数
- 处理:处理数组字段、特殊字符、默认值
3. **getDoctorClass($doctorId)**
- 功能:获取医生的分类列表
- 返回:数组形式的分类ID列表
4. **updateDoctorClass($doctorId, $departmentId, $doctorClass)**
- 功能:更新医生分类关联
- 处理:删除旧记录,插入新记录
5. **updateSpecialInstitution($doctorId, $params)**
- 功能:更新特殊机构关联
- 处理:删除旧记录,插入新记录
6. **formatImportData($excelData)**
- 功能:格式化Excel导入数据
- 处理:数据转换、验证
---
## 更新记录
| 日期 | 版本 | 说明 | 修改人 |
|-----|------|------|-------|
| 2025-12-05 | v1.0 | 初始版本,整理医生表单所有字段说明 | - |
---
## 相关文档
- 数据库设计文档
- 权限管理说明
- API接口文档
- 医生角色权限说明