Роли, переделывание отчета, изменение на главной странице

This commit is contained in:
brusnitsyn
2026-01-11 23:37:18 +09:00
parent eb019504d7
commit d4f077cdaf
59 changed files with 2099 additions and 366 deletions

View File

@@ -0,0 +1,151 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\Mis\FormattedPatientResource;
use App\Models\MetrikaGroup;
use App\Models\MetrikaResult;
use App\Models\MisMedicalHistory;
use App\Models\ObservationPatient;
use App\Models\Report;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Inertia\Inertia;
class ReportController extends Controller
{
public function index(Request $request)
{
$user = $request->user();
$department = $user->department;
$beds = (int)$department->metrikaDefault()->where('rf_metrika_item_id', 1)->first()->value;
$occupiedBeds = optional(Report::where('rf_department_id', $user->rf_department_id)
->join('metrika_results', 'reports.report_id', '=', 'metrika_results.rf_report_id')
->where('metrika_results.rf_metrika_item_id', 8)
->orderBy('sent_at', 'desc')->first())->value ?? 0;
$percentLoadedBeds = intval($occupiedBeds) * 100 / $beds;
$metrikaGroup = MetrikaGroup::whereMetrikaGroupId(2)->first();
$metrikaItems = $metrikaGroup->metrikaItems;
return response()->json([
'department' => [
'beds' => $beds,
'percentLoadedBeds' => $percentLoadedBeds,
],
'metrikaItems' => $metrikaItems
]);
}
public function store(Request $request)
{
$data = $request->validate([
'metrics' => 'required',
'observationPatients' => 'nullable',
'departmentId' => 'required|integer',
]);
$metrics = $data['metrics'];
$observationPatients = $data['observationPatients'];
$metriks = [];
foreach ($metrics as $key => $value) {
$metrika = new MetrikaResult;
$metrikaId = (int)Str::replace('metrika_item_', '', $key);
$metrika->rf_metrika_item_id = $metrikaId;
$metrika->value = $value;
$metriks[] = $metrika;
}
\DB::beginTransaction();
$report = Report::create([
'rf_department_id' => $data['departmentId'],
'rf_user_id' => Auth::user()->id,
'created_at' => now(),
'sent_at' => now()
]);
foreach ($metriks as $metrika) {
$metrika->rf_report_id = $report->report_id;
$metrika->save();
}
foreach ($observationPatients as $observationPatient) {
ObservationPatient::create([
'rf_department_id' => $data['departmentId'],
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $observationPatient['id'],
'rf_mkab_id' => null
]);
}
\DB::commit();
return response()->json([
'message' => 'success'
]);
}
public function getPatients(Request $request)
{
$data = $request->validate([
'status' => 'required|string', // plan emergency
]);
$status = $data['status'];
$model = new MisMedicalHistory();
if ($status === 'plan') {
$patients = MisMedicalHistory::select(
[
...$model->getFillable(),
DB::raw('ROW_NUMBER() OVER (ORDER BY "DateRecipient" DESC) as num')
])
->where('rf_EmerSignID', 1)
->orderBy('DateRecipient', 'DESC')
->get();
} else if ($status === 'emergency') {
$patients = MisMedicalHistory::select(
[
...$model->getFillable(),
DB::raw('ROW_NUMBER() OVER (ORDER BY "DateRecipient" DESC) as num')
])
->where('rf_EmerSignID', 2)
->orderBy('DateRecipient', 'DESC')
->get();
}
return response()->json(FormattedPatientResource::collection($patients));
}
public function getPatientsCount(Request $request)
{
$data = $request->validate([
'status' => 'required|string', // plan emergency
]);
$status = $data['status'];
$model = new MisMedicalHistory();
if ($status === 'plan') {
$count = MisMedicalHistory::select($model->getFillable())
->where('rf_EmerSignID', 1)
->orderBy('DateRecipient', 'DESC')
->count();
} else if ($status === 'emergency') {
$count = MisMedicalHistory::select($model->getFillable())
->where('rf_EmerSignID', 2)
->orderBy('DateRecipient', 'DESC')
->count();
}
return response()->json($count);
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Role;
use Illuminate\Http\Request;
class RoleController extends Controller
{
public function getUserRoles(Request $request)
{
$roles = $request->user()->roles;
return response()->json(
$roles
);
}
public function setUserRole(Request $request)
{
$data = $request->validate([
'role_id' => 'required|integer|exists:roles,id'
]);
}
public function getRoles()
{
$roles = Role::all();
return response()->json($roles);
}
}

View File

@@ -20,9 +20,7 @@ class IndexController extends Controller
$fillableModel =
$departments = Department::with(['lpu'])->whereHas('lpu', function ($query) {
$query->where('mainlpuid', 1);
})->get();
$departments = Department::all();
return Inertia::render('Report/Index', [
'depatments' => $departments,

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ReportController extends Controller
{
public function index(Request $request)
{
$user = $request->user();
$department = $user->department;
$beds = $department->metrikaDefault()->where('rf_metrika_item_id', 1)->first()->value;
return Inertia::render('Report/Index', [
'department' => [
'beds' => $beds
],
]);
}
}

View File

@@ -3,9 +3,13 @@
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Models\Department;
use App\Models\MetrikaForm;
use App\Models\MetrikaGroup;
use App\Models\MetrikaItem;
use App\Models\MetrikaResult;
use App\Models\Report;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
@@ -15,6 +19,64 @@ use Inertia\Inertia;
class StatisticController extends Controller
{
public function index(Request $request)
{
$user = $request->user();
$userDepartment = $user->department;
$data = [];
$departments = Department::select('department_id', 'name_short')->get();
foreach ($departments as $department) {
$allCount = MetrikaResult::whereHas('report', function ($query) use ($userDepartment, $department) {
$query->where('rf_department_id', $department->department_id);
})->where('rf_metrika_item_id', 3)
->sum(DB::raw('value::integer'));
$leaveCount = MetrikaResult::whereHas('report', function ($query) use ($userDepartment, $department) {
$query->where('rf_department_id', $department->department_id);
})->where('rf_metrika_item_id', 7)
->sum(DB::raw('value::integer'));
$consistCount = optional(MetrikaResult::where('rf_metrika_item_id', 8)
->whereHas('report', function (Builder $query) use ($department) {
$query->where('rf_department_id', $department->department_id);
})->join('reports', 'metrika_results.rf_report_id', '=', 'reports.report_id')
->select('metrika_results.value')
->orderBy('reports.sent_at', 'desc')
)->value('value') ?? 0;
$beds = (int)optional($department->metrikaDefault()
->where('rf_metrika_item_id', 1)
->first())->value ?? 0;
$occupiedBeds = (int)optional(Report::where('rf_department_id', $department->department_id)
->join('metrika_results', 'reports.report_id', '=', 'metrika_results.rf_report_id')
->where('metrika_results.rf_metrika_item_id', 8)
->orderBy('reports.sent_at', 'desc')
->first())->value ?? 0;
$percentLoadedBeds = $beds > 0 ? $occupiedBeds * 100 / $beds : 0;
$data[] = [
'department' => $department->name_short,
'beds' => $beds,
'all' => $allCount,
'plan' => '0',
'emergency' => '0',
'leave' => $leaveCount,
'consist' => $consistCount,
'percentLoadedBeds' => $percentLoadedBeds,
];
}
return Inertia::render('Statistic/Index', [
'data' => $data
]);
}
public function indexOld(Request $request)
{
$user = Auth::user();

View File

@@ -44,6 +44,7 @@ class HandleInertiaRequests extends Middleware
'name' => $user->name,
'token' => Session::get('token'),
'permissions' => $user->permissions(),
'role' => $user->currentRole(),
'available_departments' => $user->availableDepartments(),
'current_department' => $user->department
] : null,

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Resources\Mis;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
use Illuminate\Support\Str;
class FormattedPatientResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->MedicalHistoryID,
'num' => $this->num,
'fullname' => Str::ucwords(Str::lower("$this->FAMILY $this->Name $this->OT")),
'age' => Carbon::parse($this->BD)->diff(Carbon::now())->format('%y'),
'birth_date' => Carbon::parse($this->BD)->format('d.m.Y'),
];
}
}