参数说明: - id:机构ID(必传) - is_special:是否特殊机构(1=特殊机构,其他=普通机构) - exam_class:检查类型(普通机构时需要) 2. 服务层 (SuperService.php:58-75) public function getDoctorInfo($params, $doctor) { if(empty($params['id'])){ return ''; } if($params['is_special'] == 1){ // 查询特殊机构的医生 $info = $this->super->getSpecialDoctor($params['id']); } else { // 查询普通机构的医生 $field = ['name']; $institution_name = $this->super->getInstitutionInfo($params['id'], $field); $info = $this->super->getDoctor($params['id'], $params['exam_class'], $doctor['institution_id']); // 给每个医生添加机构名称 foreach($info as $k => $v){ $info[$k]['institution_name'] = $institution_name['name']; } } return $info; } 3. 模型层查询逻辑 3.1 特殊机构医生查询 (InstitutionModel.php:32-44) public function getSpecialDoctor($id) { $info = ScontantModel::alias('sc') ->join('doctors d', 'sc.did = d.id') ->join('institution i', 'sc.hid = i.id') ->join('doctor_class dc', 'dc.doctor_id=d.id and find_in_set("7", dc.doctor_class)') ->where('sc.sid', $id) ->where('sc.status', 1) ->order('sc.sort asc') ->field('sc.id as scid, sc.sid, sc.did as id, sc.hid, convert(sc.cost/100, decimal(10,2)) as cost, sc.describe as introduce, i.name as institution_name, d.realname') ->select(); return $info; } SQL 逻辑: - 主表:scontant(特殊机构联系人表) - 关联表: - doctors:医生表 - institution:机构表 - doctor_class:医生分类表(必须包含分类"7") - 查询条件: - sc.sid = $id(特殊机构ID) - sc.status = 1(状态有效) - 医生分类包含"7" - 排序:按 sc.sort 升序 - 返回字段:医生ID、机构ID、费用、介绍、机构名称、医生姓名等 3.2 普通机构医生查询 (InstitutionModel.php:61-79) public function getDoctor($id, $class, $remote) { // 第一次查询:优先查询管理员医生 $info = DoctorModel::alias('d') ->join('doctor_class dc', 'dc.doctor_id=d.id and find_in_set("7", dc.doctor_class)') ->join('remote_cost rc', "rc.super_doctor_id=d.id and rc.exam_class='".$class."' and super_hospital_id=d.institution_id and hospital_id='".$remote."'") ->where('d.institution_id', $id) ->where('d.is_admin', '1') // 优先查询管理员 ->field('d.id, d.institution_id as hid, d.realname, convert(rc.money/100, decimal(10,2)) as cost, introduce, null as scid, null as sid') ->select(); // 如果没有管理员,查询所有符合条件的医生 if(empty(json_decode(json_encode($info), true))){ $info = DoctorModel::alias('d') ->join('doctor_class dc', 'dc.doctor_id=d.id and find_in_set("7", dc.doctor_class)') ->join('remote_cost rc', "rc.super_doctor_id=d.id and rc.exam_class='".$class."' and super_hospital_id=d.institution_id and hospital_id='".$remote."'") ->where('d.institution_id', $id) ->field('d.id, d.institution_id as hid, realname, d.introduce, convert(rc.money/100, decimal(10,2)) as cost, null as scid, null as sid') ->select(); } return $info; } SQL 逻辑: - 主表:doctors(医生表) - 关联表: - doctor_class:医生分类表(必须包含分类"7") - remote_cost:远程费用表 - 查询条件: - d.institution_id = $id(机构ID) - 医生分类包含"7" - 费用配置匹配:检查类型、上级机构、远程机构 - 第一次查询限制 is_admin = 1(管理员) - 返回字段:医生ID、机构ID、姓名、费用、介绍等 数据库表说明 涉及的表: 1. scontant:特殊机构联系人/医生配置表 - sid:特殊机构ID - did:医生ID - hid:机构ID - cost:费用(分为单位) - describe:介绍 - status:状态 - sort:排序 2. doctors:医生表 - id:医生ID - institution_id:所属机构ID - realname:真实姓名 - is_admin:是否管理员 - introduce:介绍 3. doctor_class:医生分类表 - doctor_id:医生ID - doctor_class:分类(逗号分隔,"7"表示远程医生) 4. remote_cost:远程费用配置表 - super_doctor_id:上级医生ID - exam_class:检查类型 - super_hospital_id:上级机构ID - hospital_id:远程机构ID - money:费用(分为单位) 5. institution:机构表 - id:机构ID - name:机构名称 功能总结 这个接口用于查询上级医生列表,根据不同场景返回不同的医生: 1. 特殊机构 (is_special=1): - 返回特殊机构配置的医生列表 - 按排序字段排序 - 包含费用、介绍、机构名称 2. 普通机构: - 首先查询管理员医生 - 如果没有管理员,返回所有符合条件的医生 - 根据检查类型和费用配置筛选 - 返回医生姓名、费用、介绍等信息