Skip to content

Commit 570ba41

Browse files
committed
Final version
1 parent 99e69dc commit 570ba41

File tree

12 files changed

+3336
-961
lines changed

12 files changed

+3336
-961
lines changed

.DS_Store

2 KB
Binary file not shown.

app/Http/Controllers/MainController.php

+217-10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,32 @@ class MainController extends Controller
1616
{
1717
# Рендер главной страницы приложения
1818
public function index() {
19+
$section = Subsection::where('id', 1)->first();
20+
# Диагнозы
21+
$diagnoses = [];
22+
# Вопросы
23+
$questions = [];
24+
# Ответы
25+
$answers = [];
26+
foreach ($section->diagnoses() as $diag) {
27+
$answersArray = [];
28+
foreach ($diag->answers() as $answer) {
29+
$answersArray[] = $answer->id;
30+
$answers[] = $answer;
31+
$questions[] = [
32+
'id' => $answer->question()->id,
33+
'title' => $answer->question()->title,
34+
'priority' => $answer->question()->priority,
35+
];
36+
}
37+
38+
$diag['answers'] = $answersArray;
39+
$diagnoses[] = $diag;
40+
}
41+
42+
# Сортировка массива вопросов по приоритету
43+
$questions = array_unique($questions, SORT_REGULAR);
44+
1945
$sections = Section::all();
2046
$subsections = Subsection::all();
2147
return view('welcome', compact('sections', 'subsections'));
@@ -50,7 +76,12 @@ public function section(Request $request, $id) {
5076

5177
# Выбор подраздела
5278
public function subsection($id) {
53-
$section = Subsection::where('id', $id)->first();
79+
return Main::apiData($id);
80+
}
81+
82+
# API Первичное получение данных
83+
public function apiIndex() {
84+
$section = Subsection::where('id', 1)->first();
5485
# Диагнозы
5586
$diagnoses = [];
5687
# Вопросы
@@ -66,7 +97,7 @@ public function subsection($id) {
6697
'id' => $answer->question()->id,
6798
'title' => $answer->question()->title,
6899
'priority' => $answer->question()->priority,
69-
];
100+
];
70101
}
71102

72103
$diag['answers'] = $answersArray;
@@ -75,13 +106,189 @@ public function subsection($id) {
75106

76107
# Сортировка массива вопросов по приоритету
77108
$questions = array_unique($questions, SORT_REGULAR);
78-
// usort($questions, function($a, $b){
79-
// return ($a['priority'] - $b['priority']);
80-
// });
81-
return [
82-
'diagnoses' => $diagnoses,
83-
'questions' => $questions,
84-
'answers' => $answers,
85-
];
109+
110+
$sections = Section::all();
111+
$subsections = Subsection::all();
112+
return compact('sections', 'subsections');
113+
}
114+
115+
# API Получения раздела
116+
public function apiSection(Request $request, $id) {
117+
$sex = $request->sex;
118+
if(!$sex) {
119+
$sex = 'w';
120+
}
121+
if($id == '*') {
122+
# Обнулить пол (вывести все и для М и для Ж)
123+
$subsectionsList = Subsection::all();
124+
} else {
125+
# выбираем все разделы и конвертируем json
126+
$subsections = Subsection::all();
127+
$subsectionsList = [];
128+
foreach ($subsections as $sub) {
129+
try {
130+
foreach (json_decode($sub->sections) as $section) {
131+
# Если в JSON найден id секции то добавляем подраздел в массив для вывода
132+
if($section == $id && (($sub->sex == $sex) || !isset($sub->sex))) {
133+
$subsectionsList[] = $sub;
134+
}
135+
}
136+
} catch (Throwable $e) {
137+
138+
}
139+
}
140+
}
141+
142+
return $subsectionsList;
143+
}
144+
145+
# API Получения подраздела
146+
public function apiSubsection($id) {
147+
$data = Main::apiData($id);
148+
if (!$data) {
149+
return Main::$error;
150+
}
151+
152+
return reset($data['questions']);
153+
}
154+
155+
# API Ответа на вопрос
156+
public function apiAnswer(Request $request) {
157+
if(!isset($request->questions) || !isset($request->subsection)) {
158+
return ['error' => 'Некорректные данные'];
159+
}
160+
161+
# Получить массив результатов
162+
$results = json_decode($request->questions, true);
163+
164+
$data = Main::apiData((int)$request->subsection);
165+
if (!$data) {
166+
return Main::$error;
167+
}
168+
169+
$questions = $data['questions'];
170+
$userAnswers = Array();
171+
172+
# Получаем массив с id ответов пользователя
173+
foreach ($data['answers'] as $answer) {
174+
foreach ($results as $key => $res) {
175+
if ($answer->question_id == $key && $answer->answer == $res) {
176+
$userAnswers[] = $answer->id;
177+
}
178+
}
179+
}
180+
181+
$deleting = Array();
182+
# Пускаем цикл по диагнозам
183+
foreach ($data['diagnoses'] as $key => $diagnoses) {
184+
$deleteAnswers = Array();
185+
$deleteQuestions = Array();
186+
$opposite = 0;
187+
188+
foreach ($diagnoses->answers as $delDiagnoses) {
189+
foreach ($data['answers'] as $answer) {
190+
if ($delDiagnoses == $answer->id) {
191+
foreach ($userAnswers as $userAnswer) {
192+
foreach ($data['answers'] as $answer2) {
193+
if ($userAnswer == $answer2->id) {
194+
if ($answer2->question_id == $answer->question_id && ($answer->answer != $answer2->answer)) {
195+
$opposite++;
196+
}
197+
}
198+
}
199+
}
200+
}
201+
}
202+
}
203+
204+
if ($opposite > 0) {
205+
206+
} else {
207+
foreach ($diagnoses->answers as $delDiagnoses) {
208+
$count = 0;
209+
210+
foreach ($userAnswers as $userAnswer) {
211+
if ($userAnswer == $delDiagnoses) {
212+
$count++;
213+
}
214+
}
215+
216+
if ($count == 0) {
217+
$deleteAnswers[] = $delDiagnoses;
218+
}
219+
}
220+
221+
// Получаем ID вопросов для удаления из массива
222+
foreach ($deleteAnswers as $del) {
223+
foreach ($data['answers'] as $delAnswer) {
224+
if($delAnswer->id == $del) {
225+
$deleteQuestions[] = $delAnswer->question_id;
226+
}
227+
}
228+
}
229+
230+
$questCount = 0;
231+
// Цикл по вопросам
232+
foreach ($deleteQuestions as $kek) {
233+
foreach ($questions as $ques) {
234+
// Добавить проверку на противоположный ответ
235+
if($kek == $ques['id']) {
236+
$questCount++;
237+
}
238+
}
239+
}
240+
241+
// Если все вопросы найдены в массиве - то мы их удаляем из массива
242+
// Удаления
243+
if($questCount == count($deleteQuestions)) {
244+
// Удалить из массива TEST -> deleteQuestions
245+
// Добавить в массив для удаления
246+
foreach ($deleteQuestions as $del) {
247+
$deleting[] = $del;
248+
}
249+
}
250+
}
251+
}
252+
253+
254+
# Проверка на диагноз
255+
$diagnos = Main::checkDiagnos($request->subsection, $userAnswers);
256+
257+
if ($diagnos) {
258+
return ['diagnoses' => $diagnos];
259+
}
260+
261+
######################################################
262+
######################################################
263+
############ Удаление вопросов из массива ############
264+
######################################################
265+
######################################################
266+
267+
# Удаление вопросов на которые уже ответили
268+
foreach ($questions as $keyQuestion => $quest) {
269+
foreach ($results as $keyResult => $res) {
270+
if ($quest['id'] == $keyResult) {
271+
unset($questions[$keyQuestion]);
272+
}
273+
}
274+
}
275+
276+
$newQuestions = $questions;
277+
# Удаление вопросов
278+
foreach ($questions as $keyQuestion => $quest) {
279+
$foundCount = 0;
280+
foreach ($deleting as $res) {
281+
if ($quest['id'] == $res) {
282+
$foundCount++;
283+
}
284+
}
285+
286+
# Если вопрос не найден - то удаляем его из массива
287+
if($foundCount == 0) {
288+
unset($newQuestions[$keyQuestion]);
289+
}
290+
}
291+
292+
return reset($newQuestions);
86293
}
87294
}

app/Models/Main.php

+58-19
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,70 @@ class Main extends Model
99
{
1010
use HasFactory;
1111

12-
public static function check($answer, $request) {
13-
# Вызываем метод ДА или НЕТ
14-
switch ($answer) {
15-
case TRUE:
16-
$result = self::answerTrue();
17-
break;
18-
case FALSE:
19-
$result = self::answerFalse();
20-
break;
12+
public static $error;
13+
14+
public static function apiData($id) {
15+
$section = Subsection::where('id', $id)->first();
16+
17+
if (!$section) {
18+
self::$error = ['error' => 'Некорректные данные'];
19+
return false;
2120
}
2221

23-
# Если диагноз определяется - то выводим его
24-
// if() {
25-
// return 'Диагноз';
26-
// }
22+
# Диагнозы
23+
$diagnoses = [];
24+
# Вопросы
25+
$questions = [];
26+
# Ответы
27+
$answers = [];
28+
foreach ($section->diagnoses() as $diag) {
29+
$answersArray = [];
30+
foreach ($diag->answers() as $answer) {
31+
$answersArray[] = $answer->id;
32+
$answers[] = $answer;
33+
$questions[] = [
34+
'id' => $answer->question()->id,
35+
'title' => $answer->question()->title,
36+
];
37+
}
2738

28-
# Если нет - то формируем новый массив
29-
return 'Массив';
30-
}
39+
$diag['answers'] = $answersArray;
40+
$diagnoses[] = $diag;
41+
}
42+
43+
# Сортировка массива вопросов по приоритету
44+
$questions = array_unique($questions, SORT_REGULAR);
3145

32-
protected static function answerTrue() {
33-
return true;
46+
return [
47+
'diagnoses' => $diagnoses,
48+
'questions' => $questions,
49+
'answers' => $answers,
50+
];
3451
}
3552

36-
protected static function answerFalse() {
53+
# Проверка на получение диагноза исходя из результатов опроса
54+
public static function checkDiagnos($subsection_id, $results) {
55+
$data = self::apiData($subsection_id);
56+
57+
foreach ($data['diagnoses'] as $diagnos) {
58+
$count = 0;
59+
60+
foreach ($diagnos->answers as $answer) {
61+
foreach ($results as $result) {
62+
if ($answer == $result) {
63+
$count++;
64+
}
65+
}
66+
}
67+
68+
if ($count == count($diagnos->answers)) {
69+
return [
70+
'title' => $diagnos->title,
71+
'description' => $diagnos->description,
72+
];
73+
}
74+
}
75+
3776
return false;
3877
}
3978
}

app/Models/Question.php

+4
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@
88
class Question extends Model
99
{
1010
use HasFactory;
11+
12+
protected $hidden = [
13+
'priority'
14+
];
1115
}

app/Providers/RouteServiceProvider.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function boot()
3030

3131
$this->routes(function () {
3232
Route::middleware('api')
33-
->prefix('api')
33+
->prefix('api/v1')
3434
->group(base_path('routes/api.php'));
3535

3636
Route::middleware('web')

0 commit comments

Comments
 (0)