* добавил исход спец контингенту
* оптимизация обновления при редактировании спец контингента * добавил поддержку заключительных диагнозов * изменил определение законченной операции * добавил поддержку исхода операции * добавил определение отмены для операции через назначение * работа над диапазонами календарей, подсчет статистики * добавил статусы отчетов и подкорректировал привязку спец контингента к отчету * добавил новые сервисы для будущего кеширования * частичное разделение логики подсчета пациентов
This commit is contained in:
@@ -10,6 +10,7 @@ use App\Models\MetrikaResult;
|
||||
use App\Models\MetrikaResultValue;
|
||||
use App\Models\Report;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
@@ -66,11 +67,14 @@ class MetrikaFormController extends Controller
|
||||
}
|
||||
|
||||
// Создаем или обновляем отчет
|
||||
[$periodStart, $periodEnd] = $this->getTodayPeriodBounds();
|
||||
$report = Report::create(
|
||||
[
|
||||
'rf_user_id' => $user->id,
|
||||
'created_at' => now()->toDateString(),
|
||||
'sent_at' => now()->toDateString(),
|
||||
'created_at' => $periodEnd,
|
||||
'sent_at' => $periodEnd,
|
||||
'period_start' => $periodStart,
|
||||
'period_end' => $periodEnd,
|
||||
'rf_department_id' => $user->department->departmentid
|
||||
]
|
||||
);
|
||||
@@ -150,7 +154,7 @@ class MetrikaFormController extends Controller
|
||||
|
||||
// Находим последний отчет пользователя за сегодня
|
||||
$report = Report::where('rf_user_id', $user->id)
|
||||
->whereDate('created_at', now()->toDateString())
|
||||
->exactPeriod(...$this->getTodayPeriodBounds())
|
||||
->orderBy('created_at', 'desc')
|
||||
->first();
|
||||
|
||||
@@ -252,6 +256,7 @@ class MetrikaFormController extends Controller
|
||||
|
||||
$dateStart = date('Y-m-d', $startAt) . ' 00:00:00';
|
||||
$dateEnd = date('Y-m-d', $endAt) . ' 23:59:59';
|
||||
$dateEndExclusive = Carbon::parse($dateEnd, 'Asia/Yakutsk')->addSecond()->format('Y-m-d H:i:s');
|
||||
|
||||
$group = MetrikaGroup::findOrFail($groupId);
|
||||
|
||||
@@ -260,9 +265,8 @@ class MetrikaFormController extends Controller
|
||||
->join('metrika_result_values as mv', 'mr.metrika_result_id', '=', 'mv.rf_metrika_result_id')
|
||||
->join('reports as r', 'mr.rf_report_id', '=', 'r.report_id')
|
||||
->where('mr.rf_metrika_group_id', $groupId)
|
||||
// ->whereBetween('r.sent_at', [$dateStart, $dateEnd])
|
||||
->where('r.sent_at', '>', $dateStart)
|
||||
->where('r.sent_at', '<=', $dateEnd)
|
||||
->where('r.period_start', '>=', $dateStart)
|
||||
->where('r.period_end', '<', $dateEndExclusive)
|
||||
->when(!$user->isAdmin() && !$user->isHeadOfDepartment(), function ($query) use ($user) {
|
||||
return $query->where('r.rf_user_id', $user->id);
|
||||
})
|
||||
@@ -355,9 +359,8 @@ class MetrikaFormController extends Controller
|
||||
$endDate = date("{$year}-{$month}-t", strtotime($startDate));
|
||||
|
||||
$reports = Report::where('rf_user_id', $user->id)
|
||||
// ->whereBetween('sent_at', [$startDate, $endDate])
|
||||
->where('sent_at', '>', $startDate)
|
||||
->where('sent_at', '<=', $endDate)
|
||||
->where('period_start', '>=', $startDate)
|
||||
->where('period_end', '<', Carbon::parse($endDate, 'Asia/Yakutsk')->addDay()->startOfDay()->format('Y-m-d H:i:s'))
|
||||
->get();
|
||||
|
||||
// Создаем календарь
|
||||
@@ -406,7 +409,7 @@ class MetrikaFormController extends Controller
|
||||
// Дни месяца
|
||||
for ($day = 1; $day <= $daysInMonth; $day++) {
|
||||
$date = date("{$year}-{$month}-" . sprintf('%02d', $day));
|
||||
$report = $reports->firstWhere('sent_at', $date);
|
||||
$report = $reports->first(fn (Report $item) => $item->period_end && $item->period_end->toDateString() === $date);
|
||||
$timestamp = strtotime($date) * 1000; // В миллисекундах
|
||||
|
||||
$dayData = [
|
||||
@@ -420,7 +423,7 @@ class MetrikaFormController extends Controller
|
||||
'is_weekend' => date('N', strtotime($date)) >= 6,
|
||||
'has_report' => !is_null($report),
|
||||
'report_status' => $report ? $report->status : null,
|
||||
'sent_at' => $report && $report->sent_at ? $report->sent_at->getTimestamp() * 1000 : $timestamp
|
||||
'sent_at' => $report && $report->period_end ? $report->period_end->getTimestamp() * 1000 : $timestamp
|
||||
];
|
||||
|
||||
$calendar['days'][] = $dayData;
|
||||
@@ -564,7 +567,7 @@ class MetrikaFormController extends Controller
|
||||
$user = Auth::user();
|
||||
|
||||
$report = Report::where('rf_user_id', $user->id)
|
||||
->whereDate('created_at', now()->toDateString())
|
||||
->exactPeriod(...$this->getTodayPeriodBounds())
|
||||
->first();
|
||||
|
||||
if (!$report) {
|
||||
@@ -593,4 +596,14 @@ class MetrikaFormController extends Controller
|
||||
];
|
||||
}
|
||||
|
||||
private function getTodayPeriodBounds(): array
|
||||
{
|
||||
$now = now('Asia/Yakutsk');
|
||||
|
||||
return [
|
||||
$now->copy()->subDay()->setTime(7, 0)->format('Y-m-d H:i:s'),
|
||||
$now->copy()->setTime(7, 0)->format('Y-m-d H:i:s'),
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -244,8 +244,10 @@ class ReportController extends Controller
|
||||
'rf_department_id' => $data['departmentId'],
|
||||
'rf_user_id' => Auth::user()->id,
|
||||
'rf_lpudoctor_id' => $data['userId'],
|
||||
'created_at' => now(),
|
||||
'sent_at' => now()
|
||||
'created_at' => $dateRange->endSql(),
|
||||
'sent_at' => $dateRange->endSql(),
|
||||
'period_start' => $dateRange->startSql(),
|
||||
'period_end' => $dateRange->endSql(),
|
||||
]
|
||||
);
|
||||
} else {
|
||||
@@ -253,8 +255,10 @@ class ReportController extends Controller
|
||||
'rf_department_id' => $data['departmentId'],
|
||||
'rf_user_id' => Auth::user()->id,
|
||||
'rf_lpudoctor_id' => $data['userId'],
|
||||
'created_at' => now(),
|
||||
'sent_at' => now()
|
||||
'created_at' => $dateRange->endSql(),
|
||||
'sent_at' => $dateRange->endSql(),
|
||||
'period_start' => $dateRange->startSql(),
|
||||
'period_end' => $dateRange->endSql(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -869,6 +873,10 @@ class ReportController extends Controller
|
||||
$user = Auth::user();
|
||||
$data = $request->validate([
|
||||
'departmentId' => 'required|integer',
|
||||
'report_id' => 'nullable|integer',
|
||||
'startAt' => 'required_without:report_id',
|
||||
'endAt' => 'required_without:report_id',
|
||||
'user_id' => 'nullable|integer',
|
||||
'full_name' => 'required|string|max:255',
|
||||
'birth_date' => 'required|date',
|
||||
'patient_kind' => 'required|in:plan,emergency',
|
||||
@@ -880,18 +888,22 @@ class ReportController extends Controller
|
||||
$department = Department::where('department_id', $data['departmentId'])->firstOrFail();
|
||||
$patient = $this->reportService->createManualPatient($department, $user, $data);
|
||||
|
||||
return response()->json($patient, 201);
|
||||
return response()->json([
|
||||
'patient' => $patient,
|
||||
'report_id' => $patient->rf_report_id,
|
||||
], 201);
|
||||
}
|
||||
|
||||
public function setManualPatientOutcome(Request $request, int $departmentPatientId)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$data = $request->validate([
|
||||
'outcome_type' => 'required|in:discharged,transferred,deceased',
|
||||
'outcome_at' => 'nullable|date',
|
||||
]);
|
||||
|
||||
return response()->json(
|
||||
$this->reportService->setManualPatientOutcome($departmentPatientId, $data)
|
||||
$this->reportService->setManualPatientOutcome($user, $departmentPatientId, $data)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -903,6 +915,8 @@ class ReportController extends Controller
|
||||
'full_name' => 'required|string|max:255',
|
||||
'birth_date' => 'required|date',
|
||||
'patient_kind' => 'required|in:plan,emergency',
|
||||
'manual_status' => 'nullable|in:current,discharged,deceased',
|
||||
'outcome_at' => 'nullable|date',
|
||||
'diagnosis_code' => 'nullable|string|max:255',
|
||||
'diagnosis_name' => 'nullable|string|max:1000',
|
||||
'admitted_at' => 'nullable|date',
|
||||
@@ -1087,15 +1101,13 @@ class ReportController extends Controller
|
||||
{
|
||||
if (Carbon::parse($startDate)->diffInDays(Carbon::parse($endDate)) > 1.0)
|
||||
return Report::where('rf_department_id', $departmentId)
|
||||
// ->whereBetween('created_at', [$startDate, $endDate])
|
||||
->where('sent_at', '>=', $startDate)
|
||||
->where('sent_at', '<=', $endDate)
|
||||
->orderBy('sent_at', 'ASC')
|
||||
->withinPeriod($startDate, $endDate)
|
||||
->orderBy('period_end', 'ASC')
|
||||
->get();
|
||||
else
|
||||
return Report::where('rf_department_id', $departmentId)
|
||||
->whereDate('created_at', $endDate)
|
||||
->orderBy('created_at', 'ASC')
|
||||
->exactPeriod($startDate, $endDate)
|
||||
->orderBy('period_end', 'ASC')
|
||||
->get();
|
||||
}
|
||||
|
||||
@@ -1106,12 +1118,12 @@ class ReportController extends Controller
|
||||
]);
|
||||
|
||||
$report = Report::where('rf_department_id', $request->department_id)
|
||||
->whereDate('created_at', now()->toDateString())
|
||||
->exactPeriod(now('Asia/Yakutsk')->subDay()->setTime(7, 0)->format('Y-m-d H:i:s'), now('Asia/Yakutsk')->setTime(7, 0)->format('Y-m-d H:i:s'))
|
||||
->first();
|
||||
|
||||
return response()->json([
|
||||
'report_id' => $report?->report_id,
|
||||
'exists' => $report->exists
|
||||
'exists' => (bool) $report
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,4 +22,11 @@ class TestController extends Controller
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
public function testIndex()
|
||||
{
|
||||
return Inertia::render('TestIndex', [
|
||||
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,8 @@ class ReportController extends Controller
|
||||
'unwantedEvents' => 'nullable|array',
|
||||
'dates' => 'required|array',
|
||||
'userId' => 'required|integer',
|
||||
'reportId' => 'nullable|integer'
|
||||
'reportId' => 'nullable|integer',
|
||||
'status' => 'nullable|in:draft,submitted',
|
||||
]);
|
||||
|
||||
$this->reportService->storeReport($validated, Auth::user(), false);
|
||||
|
||||
Reference in New Issue
Block a user