1
0
Fork 0
medical-record-server/app/Admin/Services/TotalProfitService.php

89 lines
3.7 KiB
PHP

<?php
namespace App\Admin\Services;
use App\Models\AdminUser;
use App\Models\PatientRecord;
class TotalProfitService extends BaseService
{
protected string $modelName = AdminUser::class;
protected array $withRelationships = [];
protected string $modelFilterName = '';
public function listQuery()
{
$filter = $this->getModelFilter();
$query = $this->query();
if ($this->withRelationships) {
$query->with($this->withRelationships);
}
if ($filter) {
$query->filter(request()->input(), $filter);
}
$request = request();
if ($request->filled('id')) {
$id = $request->input('id');
$query->whereIn('id', is_array($id) ? $id : explode(',', $id));
}
$subQuery = fn ($q) => $q->filter(request()->except(['id']));
$query->select(['id', 'name'])->with([
'doctors' => $subQuery,
'inviters' => $subQuery,
'salers' => $subQuery
]);
return $query;
}
public function list()
{
$query = $this->listQuery();
$list = (clone $query)->paginate(request()->input('perPage', 20));
$items = collect($list->items())->map(function ($item) {
$item['doctor_money'] = round($item->doctors->sum('doctor_money'), 2, PHP_ROUND_HALF_DOWN);
$item['inviter_money'] = round($item->inviters->sum('inviter_money'), 2, PHP_ROUND_HALF_DOWN);
$item['saler_money'] = round($item->salers->sum('saler_money'), 2, PHP_ROUND_HALF_DOWN);
$item['records_count'] = floor($item->doctors->count() + $item->inviters->count() + $item->salers->count());
$item['total_money'] = round($item['doctor_money'] + $item['inviter_money'] + $item['saler_money'], 2, PHP_ROUND_HALF_DOWN);
return $item;
});
$doctorQuery = PatientRecord::filter([
'type_id' => request('type_id'),
'treat_range' => request('treat_range'),
'doctor_id' => request('id')
]);
$inviterQuery = PatientRecord::filter([
'type_id' => request('type_id'),
'treat_range' => request('treat_range'),
'inviter_id' => request('id')
]);
$salerQuery = PatientRecord::filter([
'type_id' => request('type_id'),
'treat_range' => request('treat_range'),
'saler_id' => request('id')
]);
$records_count = $doctorQuery->count() + $inviterQuery->count() + $salerQuery->count();
$doctor_money = $doctorQuery->sum('doctor_money');
$inviter_money = $inviterQuery->sum('inviter_money');
$saler_money = $salerQuery->sum('saler_money');
$total_money = round($doctor_money + $inviter_money + $saler_money, 2, PHP_ROUND_HALF_DOWN);
// $allList = (clone $query)->get();
// $records_count = $allList->sum(fn ($item) => $item->doctors->count() + $item->inviters->count() + $item->salers->count());
// $doctor_money = round($allList->sum(fn ($item) => $item->doctors->sum('doctor_money')), 2, PHP_ROUND_HALF_DOWN);
// $inviter_money = round($allList->sum(fn ($item) => $item->inviters->sum('inviter_money')), 2, PHP_ROUND_HALF_DOWN);
// $saler_money = round($allList->sum(fn ($item) => $item->salers->sum('saler_money')), 2, PHP_ROUND_HALF_DOWN);
// $total_money = round($allList->sum(fn ($item) => $item->salers->sum('saler_money') + $item->inviters->sum('inviter_money') + $item->doctors->sum('doctor_money')), 2, PHP_ROUND_HALF_DOWN);
$total = $list->total();
$this->sortable($query);
return compact('items', 'total', 'records_count', 'doctor_money', 'inviter_money', 'saler_money', 'total_money');
}
}