generated from liutk/owl-admin-base
30天内的趋势
parent
89c39b7f60
commit
c7d7d40ef1
|
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Models\Ledger;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class StatsController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 30天内的销售金额和支出金额趋势图(不含当日)
|
||||||
|
*/
|
||||||
|
public function trendsOver30days(Request $request)
|
||||||
|
{
|
||||||
|
/** @var \App\Models\Employee */
|
||||||
|
$employee = $request->user();
|
||||||
|
|
||||||
|
$start = now()->subDays(30);
|
||||||
|
$end = $start->copy()->addDays(29);
|
||||||
|
|
||||||
|
/** @var \Illuminate\Database\Eloquent\Collection */
|
||||||
|
$ledgers = Ledger::select(['date', 'sales', 'expenditure'])
|
||||||
|
->whereBetween('date', [$start->format('Y-m-d'), $end->format('Y-m-d')])
|
||||||
|
->when(
|
||||||
|
$employee->isAdministrator(),
|
||||||
|
function ($query) use ($request) {
|
||||||
|
if ($request->filled('store_id')) {
|
||||||
|
return $query->where('store_id', $request->input('store_id'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $request->anyFilled(['province_code', 'city_code'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->whereHas('store', function ($query) use ($request) {
|
||||||
|
$request->whenFilled('province_code', fn ($code) => $query->where('region->provinceCode', $code));
|
||||||
|
$request->whenFilled('city_code', fn ($code) => $query->where('region->cityCode', $code));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
fn ($query) => $query->where('store_id', $employee->store_id ?: 0),
|
||||||
|
)
|
||||||
|
->get()
|
||||||
|
->keyBy('date');
|
||||||
|
|
||||||
|
$data = [];
|
||||||
|
|
||||||
|
do {
|
||||||
|
$ledger = $ledgers->get(
|
||||||
|
$date = $start->format('Y-m-d')
|
||||||
|
);
|
||||||
|
|
||||||
|
$data[] = [
|
||||||
|
'date' => $date,
|
||||||
|
'sales' => trim_zeros($ledger->sales ?? 0),
|
||||||
|
'expenditure' => trim_zeros($ledger->expenditure ?? 0),
|
||||||
|
];
|
||||||
|
|
||||||
|
$start->addDay();
|
||||||
|
} while ($start->lte($end));
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -87,6 +87,15 @@ class Employee extends Model implements AuthenticatableContract
|
||||||
return $this->employee_status === EmployeeStatus::Offline;
|
return $this->employee_status === EmployeeStatus::Offline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认当前员工是否是管理员
|
||||||
|
*/
|
||||||
|
public function isAdministrator(): bool
|
||||||
|
{
|
||||||
|
// @todo
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
protected function employeeStatusText(): Attribute
|
protected function employeeStatusText(): Attribute
|
||||||
{
|
{
|
||||||
return new Attribute(
|
return new Attribute(
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ use App\Http\Controllers\Api\Auth\AccessTokenController;
|
||||||
use App\Http\Controllers\Api\ComplaintController;
|
use App\Http\Controllers\Api\ComplaintController;
|
||||||
use App\Http\Controllers\Api\FeedbackController;
|
use App\Http\Controllers\Api\FeedbackController;
|
||||||
use App\Http\Controllers\Api\LotteryTypeController;
|
use App\Http\Controllers\Api\LotteryTypeController;
|
||||||
|
use App\Http\Controllers\Api\StatsController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::post('/auth/login', [AccessTokenController::class, 'store']);
|
Route::post('/auth/login', [AccessTokenController::class, 'store']);
|
||||||
|
|
@ -12,6 +13,8 @@ Route::delete('/auth/logout', [AccessTokenController::class, 'destroy']);
|
||||||
Route::group([
|
Route::group([
|
||||||
'middleware' => ['auth:api'],
|
'middleware' => ['auth:api'],
|
||||||
], function () {
|
], function () {
|
||||||
|
Route::get('/stats/trends-over-30days', [StatsController::class, 'trendsOver30days']);
|
||||||
|
|
||||||
// 彩种类型
|
// 彩种类型
|
||||||
Route::get('lottery-types', [LotteryTypeController::class, 'index']);
|
Route::get('lottery-types', [LotteryTypeController::class, 'index']);
|
||||||
// 举报投诉
|
// 举报投诉
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue