# 医生表单字段说明文档 ## 文档信息 - **文档名称**:医生管理-新增医生表单字段说明 - **数据库表名**:`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接口文档 - 医生角色权限说明