[驾驶舱] 基础统计, 年度统计

main
Jing Li 2024-04-23 11:04:27 +08:00
parent 8f84d61d50
commit 08a24f4d5a
5 changed files with 105 additions and 1 deletions

View File

@ -0,0 +1,77 @@
<?php
namespace App\Admin\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Employee;
use App\Models\Store;
use App\Models\TaskPerformance;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CockpitController extends Controller
{
/**
* 基础数据统计
*/
public function basic(): array
{
// 门店总数
$storesCount = Store::onlyOpen()->count();
// 员工总数
$employeesCount = Employee::onlyOnline()->count();
return [
'stores_count' => $storesCount,
'employees_count' => $employeesCount,
];
}
/**
* 销售趋势
*/
public function salesTrend(Request $request): array
{
return [];
}
/**
* 彩种销售趋势
*/
public function lotterySalesTrend(Request $request): array
{
return [];
}
/**
* 门店销量排名
*/
public function storeSalesRanking(Request $request): array
{
return [];
}
/**
* 年度目标
*/
public function yearlyGoals(Request $request): array
{
$request->validate(
rules: [
'year' => ['bail', 'required', 'int'],
],
);
$aggregates = TaskPerformance::select([
DB::raw('SUM(`expected_performance`) as expected_performance'),
DB::raw('SUM(`actual_performance`) as actual_performance'),
])->whereYear(DB::raw("STR_TO_DATE(CONCAT(`month`, '-01'), '%Y-%m-%d')"), $request->input('year'))->first();
return [
// 目标业绩
'expected_performance' => trim_zeros($aggregates['expected_performance'] ?? 0),
// 实际业绩
'actual_performance' => trim_zeros($aggregates['actual_performance'] ?? 0),
];
}
}

View File

@ -2,6 +2,7 @@
use App\Admin\Controllers\AgreementController; use App\Admin\Controllers\AgreementController;
use App\Admin\Controllers\BaseKeywordController; use App\Admin\Controllers\BaseKeywordController;
use App\Admin\Controllers\CockpitController;
use App\Admin\Controllers\Complaint\ComplaintController; use App\Admin\Controllers\Complaint\ComplaintController;
use App\Admin\Controllers\Complaint\FeedbackController; use App\Admin\Controllers\Complaint\FeedbackController;
use App\Admin\Controllers\Finance\CommissionIncomeController; use App\Admin\Controllers\Finance\CommissionIncomeController;
@ -237,5 +238,19 @@ Route::group([
$router->get('workflow/logs', [WorkflowController::class, 'logs']); $router->get('workflow/logs', [WorkflowController::class, 'logs']);
$router->get('tasks', [TaskController::class, 'shareList']); $router->get('tasks', [TaskController::class, 'shareList']);
//----------------------------------
// 驾驶舱数据统计
//----------------------------------
// 基础统计
$router->get('cockpit/basic', [CockpitController::class, 'basic']);
// 销售走势
$router->get('cockpit/sales-trend', [CockpitController::class, 'salesTrend']);
// 彩种销售走势
$router->get('cockpit/lottery-sales-trend', [CockpitController::class, 'lotterySalesTrend']);
// 门店销量排名
$router->get('cockpit/store-sales-ranking', [CockpitController::class, 'storeSalesRanking']);
// 年度目标
$router->get('cockpit/yearly-goals', [CockpitController::class, 'yearlyGoals']);
}); });
}); });

View File

@ -13,6 +13,7 @@ use Illuminate\Database\Eloquent\Model;
use Laravel\Sanctum\HasApiTokens; use Laravel\Sanctum\HasApiTokens;
use Slowlyo\OwlAdmin\Models\AdminUser; use Slowlyo\OwlAdmin\Models\AdminUser;
use App\Enums\UserRole; use App\Enums\UserRole;
use Illuminate\Database\Eloquent\Builder;
/** /**
* 员工 * 员工
@ -44,6 +45,11 @@ class Employee extends Model implements AuthenticatableContract
return EmployeeFilter::class; return EmployeeFilter::class;
} }
public function scopeOnlyOnline(Builder $query)
{
$query->where('employee_status', EmployeeStatus::Online);
}
public function avatar(): Attribute public function avatar(): Attribute
{ {
return Attribute::make( return Attribute::make(

View File

@ -5,6 +5,7 @@ namespace App\Models;
use App\Enums\BusinessStatus; use App\Enums\BusinessStatus;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
@ -31,6 +32,11 @@ class Store extends Model
return \App\Admin\Filters\StoreFilter::class; return \App\Admin\Filters\StoreFilter::class;
} }
public function scopeOnlyOpen(Builder $query)
{
$query->where('business_status', BusinessStatus::Open);
}
// 店长 // 店长
public function master() public function master()
{ {

View File

@ -57,7 +57,7 @@ return [
], ],
], ],
'except' => [ 'except' => [
'/api/cockpit/*',
], ],
], ],