public function add_rule($hash_id, Request $request) { $enfermedad = Disease::findOrFail($this->decode($hash_id)); $sintomas = Symptom::orderBy('name', 'asc')->lists('name', 'id')->toArray(); $reglas = Rule::with('symptom')->where('disease_id', $enfermedad->id)->get()->groupBy('number'); if ($request->isMethod('post')) { $this->validate($request, ['sintomas' => 'required']); if ($this->checkIfRuleExists($request->sintomas)) { alert('La regla ya existe, por favor ingrese otros síntomas', 'danger'); return redirect()->back(); } $lastRule = Rule::orderBy('id', 'desc')->first(); if (is_null($lastRule)) { $numberRule = 1; } else { $numberRule = intval($lastRule->number) + 1; } $symptoms = Symptom::findOrFail($request->sintomas); foreach ($symptoms as $symptom) { $rule = new Rule(); $rule->number = $numberRule; $rule->disease()->associate($enfermedad); $rule->symptom()->associate($symptom); $rule->save(); } alert('Se registró la regla con éxito'); return redirect()->back(); } return view('admin.disease.add_rule')->with('enfermedad', $enfermedad)->with('reglas', $reglas)->with('sintomas', $sintomas); }
public function index() { $countDiagnostic = count(auth()->user()->diagnostics); $countDiseases = Disease::count(); $countSymptom = Symptom::count(); $diagnostics = Diagnostic::with('disease')->where('user_id', auth()->user()->id)->orderBy('created_at', 'desc')->take(5)->get(); return view('user.home')->with('countSymptom', $countSymptom)->with('countDiseases', $countDiseases)->with('countDiagnostic', $countDiagnostic)->with('diagnostics', $diagnostics); }
public function home() { $countDiseases = Disease::count(); $countSymptom = Symptom::count(); $countDiagnostic = Diagnostic::count(); $lastRegistered = User::orderBy('created_at', 'desc')->take(9)->get(); return view('admin.home')->with('countDiagnostic', $countDiagnostic)->with('countSymptom', $countSymptom)->with('countDiseases', $countDiseases)->with('lastRegistered', $lastRegistered); }
public function search(SearchRequest $request) { if (!$request->has('search')) { return redirect()->route('admin::sintoma::create'); } $sintomas = Symptom::search($request->search)->get(); return view('admin.symptom.result')->with('sintomas', $sintomas); }
public function analyze(Request $request) { if ($request->isMethod('post')) { $this->validate($request, ['sintoma' => 'required'], ['sintoma.required' => 'Debe seleccionar un síntoma para continuar']); if ($request->session()->has('session_sintomas')) { // Acá busca si el elemento no está en el array de session, para agregarlo $sessionSymptoms = $request->session()->get('session_sintomas'); if (!in_array($request->sintoma, $sessionSymptoms)) { $sessionSymptoms[] = $request->sintoma; $request->session()->put(['session_sintomas' => $sessionSymptoms]); } } else { $request->session()->put(['session_sintomas' => [$request->sintoma]]); } } $sessionSymptoms = $request->session()->get('session_sintomas'); // Buscamos en la tabla de reglas con los síntomas obtenidos de la sesión primero buscando // por síntomas y después buscando por número de regla $rules = Rule::with('symptom')->whereIn('symptom_id', $sessionSymptoms)->get()->groupBy('number'); //dd($rules, $sessionSymptoms); list($rulesKeys) = array_divide($rules->toArray()); // Después buscamos en la tabla de reglas en base a número de su regla // obtenido en la anterior operación $rules = Rule::with('symptom')->whereIn('number', $rulesKeys)->get()->groupBy('number'); //Agrupamos los interiores de las reglas en base al número de su síntoma $rules = $rules->map(function ($symptoms, $key) { return $symptoms->groupBy('symptom_id'); }); // Filtramos solo las reglas que contengan un número de síntomas igual a // los de la sesión o mayores y que los síntomas de la sesión estén // contenidos en cada una de las reglas. // Ej: [1,7,9] >= [1, 9] && [1,9] = [1,9] $rules = $rules->filter(function ($rule) use($sessionSymptoms) { list($symptomKeys) = array_divide($rule->toArray()); $intersect = array_intersect($sessionSymptoms, $symptomKeys); if ($rule->count() >= count($sessionSymptoms) && $intersect == $sessionSymptoms) { return true; } }); //dd($rules, $sessionSymptoms); $symptomsForSelect = []; $diagnosticId = 0; $maxSymptomKey = 0; //dd($rules); foreach ($rules as $key => $ruleNumber) { list($symptomKeys) = array_divide($ruleNumber->toArray()); $difference = array_diff($symptomKeys, $sessionSymptoms); // Contamos el arreglo de sintomas para saber cual es el que tendrá // más elementos y lo asignamos a la variable maxSymptomKey if (count($symptomKeys) > $maxSymptomKey) { $maxSymptomKey = count($symptomKeys); } //dd($difference, $symptomKeys); // Si esta vacío significa que no hay diferencias if (empty($difference)) { // tomamos el primer elemento del primer elemento de la coleccion // (está ordenado por id_sintoma) $diseaseKey = $ruleNumber->first()->first()->disease_id; $diagnosticId = $this->generateDiagnostic($diseaseKey, $request->user()->id); $request->session()->forget('session_sintomas'); return redirect()->route('user::diagnosticos::show', $this->encode($diagnosticId)); } elseif ($symptomKeys == $difference) { alert('No se encontró ninguna enfermedad con los síntomas brindados, intente de nuevo', 'danger'); return redirect()->route('user::diagnosticos::create'); } else { $tempSymptoms = Symptom::findOrFail($difference); foreach ($tempSymptoms as $tempSymptom) { $symptomsForSelect[$tempSymptom->id] = $tempSymptom->name; } } } // Si se acabaron los síntomas o si los síntomas en sesión son mayores // al mayor arreglo por regla entonces es porque la enfermedad es // indetectable con los síntomas ingresados. // Ej: Máxima Regla = [1, 3, 9, 10] // Ej: Síntoma en sesión = [1, 3, 4, 5, 9, 10, 13] $numberSessionSymtoms = count($request->session()->get('session_sintomas')); if (empty($symptomsForSelect) || $numberSessionSymtoms > $maxSymptomKey) { alert('No se encontró ninguna enfermedad con los síntomas brindados, intente de nuevo', 'danger'); return redirect()->route('user::diagnosticos::create'); } // Listar los síntomas escogidos $tempSymptoms = Symptom::findOrFail($request->session()->get('session_sintomas')); foreach ($tempSymptoms as $tempSymptom) { $showSymptoms[$tempSymptom->id] = $tempSymptom->name; } return view('user.diagnostic.create')->with('showSymptoms', $showSymptoms)->with('sintomas', $symptomsForSelect); }
public function index() { $sintomas = Symptom::orderBy('name', 'asc')->paginate(20); return view('user.symptom.index')->with('sintomas', $sintomas); }