hasOne(Hospital::class, 'hospital_id', 'hospital_id'); } /** * 关联问诊配置表(一对多) * @return HasMany */ public function DoctorInquiryConfig(): HasMany { return $this->hasMany(DoctorInquiryConfig::class, "doctor_id", "doctor_id"); } /** * 关联医生专长表 * @return HasMany */ public function DoctorExpertise(): HasMany { return $this->hasMany(DoctorExpertise::class, "doctor_id", "doctor_id"); } /** * 关联订单-问诊表表 * @return HasMany */ public function OrderInquiry(): HasMany { return $this->hasMany(OrderInquiry::class, "doctor_id", "doctor_id"); } /** * 获取医生信息-单条 * @param array $params * @param array $fields * @return object|null */ public static function getOne(array $params, array $fields = ['*']): object|null { return self::where($params)->first($fields); } /** * 新增医生-批量 * @param array $data 新增数据 * @return \Hyperf\Database\Model\Model|UserDoctor */ public static function addUserDoctor(array $data): \Hyperf\Database\Model\Model|UserDoctor { return self::create($data); } /** * 修改医生-批量 * @param array $params * @param array $data * @return int */ public static function editUserDoctor(array $params = [], array $data = []): int { return self::where($params)->update($data); } /** * 首页推荐医生 * 推荐规则: * 1:平台深度合作医生 * 2:接诊量由高到低的医生 * 3:好评率由高到低的医生 * 5:在线 * 6:5个 * @param int $limit 数量 * @param array $fields * @return array|Collection|\Hyperf\Utils\Collection */ public static function getIndexRecommendDoctorLimit(int $limit = 5, array $fields = ['*']): array|Collection|\Hyperf\Utils\Collection { $params = array(); // 状态(0:禁用 1:正常 2:删除) $params["status"] = 1; // 身份认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) $params["iden_auth_status"] = 1; // 是否在线(0:不在线 1:在线) $params["is_online"] = 1; // 是否参加专家图文接诊(0:否 1:是) $params["is_img_expert_reception"] = 1; $datas = self::with([ 'Hospital:hospital_id,hospital_name,hospital_level_name', 'DoctorInquiryConfig', ]) ->where($params) ->orderBy("is_platform_deep_cooperation", "desc") ->orderBy("served_patients_num", "desc") ->orderBy("praise_rate", "desc") ->limit($limit) ->get($fields); return $datas; } /** * 获取问诊医生列表 * 专家问诊-公益问诊共用 * @param string $keyword * @param array $hospital_params 医院搜索条件 * @param array $doctor_params 医生搜索条件 * @param array $doctor_expertise_params * @param string|int $sort_order * @param array $fields * @param int|null $page * @param int|null $per_page * @return array */ public static function getInquiryDoctorPage(string $keyword = "", array $hospital_params = [], array $doctor_params = [], array $doctor_expertise_params = [], string|int $sort_order = 1, array $fields = ["*"], int $page = null, ?int $per_page = 10): array { $query = self::with([ "Hospital:hospital_id,hospital_name,hospital_status,hospital_level_name,province_id,city_id", "DoctorExpertise" => function ($query) use ($doctor_expertise_params) { $query->where($doctor_expertise_params); }, "DoctorExpertise.DiseaseClassExpertise:expertise_id,expertise_name", "DoctorInquiryConfig" => function ($query) use ($sort_order) { $params = array(); $params['inquiry_mode'] = 1;// 接诊方式:图文 $query->where($params)->whereIn('inquiry_type', [1, 3]); if ($sort_order == 1) { // 综合 $query->orderBy('inquiry_price', 'asc');// 价格从低到高 } elseif ($sort_order == 3) { // 价格从低到高 $query->orderBy('inquiry_price', 'asc'); } elseif ($sort_order == 4) { // 价格从高到低 $query->orderBy('inquiry_price', 'desc');// 价格从高到低 } return $query; }, ]) ->where($doctor_params) ->whereHas('Hospital', function ($query) use ($hospital_params) { $query->where($hospital_params); }) ->when($keyword, function ($query, $keyword) { $query->where(function ($query) use ($keyword) { $query->orwhere("user_name", 'like', '%' . $keyword . '%'); $query->orwhere("department_custom_name", 'like', '%' . $keyword . '%'); $query->orWhereHas('Hospital', function ($query) use ($keyword) { $query->where('hospital_name', 'like', '%' . $keyword . '%'); }); }); }) ->when($sort_order, function ($query, $sort_order) { if ($sort_order == 1) { $query->orderBy('is_recommend', 'desc');// 是否首页推荐(0:否 1:是) $query->orderBy('avg_response_time', 'desc');// 响应时间快 $query->orderBy('served_patients_num', 'desc');// 服务数从多到少 $query->orderBy(Db::raw("convert(substr(user_name,1,1) using `GBK`)"), 'asc');// 名称排名 } elseif ($sort_order == 2) { // 响应时间快 $query->orderBy('avg_response_time', 'desc'); $query->orderBy(Db::raw("convert(substr(user_name,1,1) using `GBK`)"), 'asc');// 名称排名 } elseif ($sort_order == 3) { // 响应时间快 $query->orderBy('avg_response_time', 'desc'); $query->orderBy(Db::raw("convert(substr(user_name,1,1) using `GBK`)"), 'asc');// 名称排名 } elseif ($sort_order == 4) { // 响应时间快 $query->orderBy('avg_response_time', 'desc'); $query->orderBy(Db::raw("convert(substr(user_name,1,1) using `GBK`)"), 'asc');// 名称排名 } elseif ($sort_order == 5) { // 服务数从多到少 $query->orderBy('served_patients_num', 'desc'); $query->orderBy(Db::raw("convert(substr(user_name,1,1) using `GBK`)"), 'asc');// 名称排名 } return $query; }); $result = $query->paginate($per_page, $fields, "page", $page); $data = array(); $data['current_page'] = $result->currentPage();// 当前页码 $data['total'] = $result->total();//数据总数 $data['data'] = $result->items();//数据 $data['per_page'] = $result->perPage();//每页个数 $data['last_page'] = $result->lastPage();//最后一页 return $data; } /** * 获取是否存在 * @param array $params * @return bool */ public static function getExists(array $params): bool { return self::where($params)->exists(); } /** * 获取医生数据 * 关联医院表 * @param array $params * @param array $fields * @return object|null */ public static function getWithHospitalOne(array $params,array $fields = ['*']): object|null { return self::with([ "Hospital:hospital_id,hospital_name,hospital_level_name" ]) ->where($params) ->first($fields); } /** * 获取数据单 * @param array $params * @param array $not_in_params * @param array $fields * @return object|null */ public static function getUserDoctorNotInOne(array $params = [], array $not_in_params = [],array $fields = ['*']): object|null { return self::where($params)->whereNotIn('doctor_id',$not_in_params)->first($fields); } }