['patient_name'], '=' => ['patient_id', 'gender', 'diagnosis_type', 'syndrome_type', 'assistant_id', 'status'], 'between_time' => ['diagnosis_date'], ]; } /** * @notes 获取列表 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function lists(): array { // 获取当前管理员的角色ID $roleIds = AdminRole::where('admin_id', $this->adminId)->column('role_id'); // 构建查询 $query = Diagnosis::where($this->searchWhere); // 如果是医助角色(role_id=2),只显示自己添加的患者 if (in_array(2, $roleIds)) { $query->where('assistant_id', $this->adminId); } // 是否确认诊单:1=已确认 0=未确认 if (isset($this->params['diagnosis_confirmed']) && $this->params['diagnosis_confirmed'] !== '') { $confirmed = (int)$this->params['diagnosis_confirmed']; $dvrTbl = (new DiagnosisViewRecord())->getTable(); $diagTbl = (new Diagnosis())->getTable(); $subSql = "SELECT 1 FROM {$dvrTbl} dvr WHERE dvr.diagnosis_id = {$diagTbl}.id AND dvr.is_confirmed = 1 AND dvr.delete_time IS NULL"; if ($confirmed === 1) { $query->whereExists($subSql); } else { $query->whereNotExists($subSql); } } // 挂号日期筛选:当天/明天/后天 if (!empty($this->params['appointment_date'])) { $aptDate = addslashes($this->params['appointment_date']); $aptTbl = (new Appointment())->getTable(); $diagTbl = (new Diagnosis())->getTable(); $query->whereExists("SELECT 1 FROM {$aptTbl} apt WHERE apt.patient_id = {$diagTbl}.patient_id AND apt.appointment_date = '{$aptDate}' AND apt.status IN (1,3)"); } // 挂号状态:1=已挂号 0=未挂号 if (isset($this->params['has_appointment']) && $this->params['has_appointment'] !== '') { $aptTbl = (new Appointment())->getTable(); $diagTbl = (new Diagnosis())->getTable(); if ((int)$this->params['has_appointment'] === 1) { $query->whereExists("SELECT 1 FROM {$aptTbl} apt WHERE apt.patient_id = {$diagTbl}.patient_id AND apt.status IN (1,3)"); } else { $query->whereNotExists("SELECT 1 FROM {$aptTbl} apt WHERE apt.patient_id = {$diagTbl}.patient_id AND apt.status IN (1,3)"); } } $lists = $query ->with(['DiagnosisViewRecord']) ->field(['id', 'patient_id', 'patient_name', 'id_card', 'phone', 'gender', 'age', 'diagnosis_date', 'diagnosis_type', 'syndrome_type', 'assistant_id', 'status', 'create_time', 'update_time']) ->append(['gender_desc', 'status_desc', 'diagnosis_date_text']) ->order(['id' => 'desc']) ->limit($this->limitOffset, $this->limitLength) ->select() ->toArray(); // 关联挂号信息:获取患者最新有效挂号(已预约或已完成) $patientIds = array_filter(array_unique(array_column($lists, 'patient_id'))); if (!empty($patientIds)) { $appointmentMap = []; $subQuery = Appointment::where('patient_id', 'in', $patientIds) ->where('status', 'in', [1, 3]) // 1=已预约 3=已完成 ->field('id, patient_id, doctor_id, appointment_date, appointment_time, create_time') ->order('id', 'desc'); $appointments = $subQuery->select()->toArray(); foreach ($appointments as $apt) { $pid = $apt['patient_id']; if (!isset($appointmentMap[$pid])) { $appointmentMap[$pid] = $apt; } } // 获取医生名称 $doctorIds = array_unique(array_column($appointmentMap, 'doctor_id')); $doctorNames = []; if (!empty($doctorIds)) { $doctors = Admin::whereIn('id', $doctorIds)->column('name', 'id'); $doctorNames = $doctors ?: []; } // 合并到诊单列表 foreach ($lists as &$item) { $apt = $appointmentMap[$item['patient_id']] ?? null; if ($apt) { $item['has_appointment'] = 1; $item['appointment_id'] = $apt['id']; $item['appointment_doctor_id'] = $apt['doctor_id']; $item['appointment_doctor_name'] = $doctorNames[$apt['doctor_id']] ?? '-'; $timePart = $apt['appointment_time'] ?? ''; if (strlen($timePart) > 5) { $timePart = substr($timePart, 0, 5); // 09:00:00 -> 09:00 } $item['appointment_time_text'] = trim(($apt['appointment_date'] ?? '') . ' ' . $timePart); } else { $item['has_appointment'] = 0; $item['appointment_id'] = null; $item['appointment_doctor_id'] = null; $item['appointment_doctor_name'] = ''; $item['appointment_time_text'] = ''; } } } else { foreach ($lists as &$item) { $item['has_appointment'] = 0; $item['appointment_id'] = null; $item['appointment_doctor_id'] = null; $item['appointment_doctor_name'] = ''; $item['appointment_time_text'] = ''; } } // 关联是否开方:诊单是否有处方记录 $diagnosisIds = array_column($lists, 'id'); $prescriptionMap = []; if (!empty($diagnosisIds)) { $prescriptionTbl = (new Prescription())->getTable(); $prescribedIds = Prescription::whereIn('diagnosis_id', $diagnosisIds) ->whereNull('delete_time') ->column('diagnosis_id'); $prescriptionMap = array_fill_keys($prescribedIds, 1); } foreach ($lists as &$item) { $item['has_prescription'] = isset($prescriptionMap[$item['id']]) ? 1 : 0; } return $lists; } /** * @notes 获取数量 * @return int */ public function count(): int { // 获取当前管理员的角色ID $roleIds = AdminRole::where('admin_id', $this->adminId)->column('role_id'); // 构建查询 $query = Diagnosis::where($this->searchWhere); // 如果是医助角色(role_id=2),只显示自己添加的患者 if (in_array(2, $roleIds)) { $query->where('assistant_id', $this->adminId); } // 是否确认诊单 if (isset($this->params['diagnosis_confirmed']) && $this->params['diagnosis_confirmed'] !== '') { $confirmed = (int)$this->params['diagnosis_confirmed']; $dvrTbl = (new DiagnosisViewRecord())->getTable(); $diagTbl = (new Diagnosis())->getTable(); $subSql = "SELECT 1 FROM {$dvrTbl} dvr WHERE dvr.diagnosis_id = {$diagTbl}.id AND dvr.is_confirmed = 1 AND dvr.delete_time IS NULL"; if ($confirmed === 1) { $query->whereExists($subSql); } else { $query->whereNotExists($subSql); } } // 挂号日期筛选 if (!empty($this->params['appointment_date'])) { $aptDate = addslashes($this->params['appointment_date']); $aptTbl = (new Appointment())->getTable(); $diagTbl = (new Diagnosis())->getTable(); $query->whereExists("SELECT 1 FROM {$aptTbl} apt WHERE apt.patient_id = {$diagTbl}.patient_id AND apt.appointment_date = '{$aptDate}' AND apt.status IN (1,3)"); } // 挂号状态 if (isset($this->params['has_appointment']) && $this->params['has_appointment'] !== '') { $aptTbl = (new Appointment())->getTable(); $diagTbl = (new Diagnosis())->getTable(); if ((int)$this->params['has_appointment'] === 1) { $query->whereExists("SELECT 1 FROM {$aptTbl} apt WHERE apt.patient_id = {$diagTbl}.patient_id AND apt.status IN (1,3)"); } else { $query->whereNotExists("SELECT 1 FROM {$aptTbl} apt WHERE apt.patient_id = {$diagTbl}.patient_id AND apt.status IN (1,3)"); } } return $query->count(); } }