门店业绩

main
Jing Li 2024-04-19 23:46:46 +08:00
parent 69cf9f0ada
commit 776842c376
5 changed files with 153 additions and 0 deletions

View File

@ -0,0 +1,11 @@
<?php
namespace App\Enums;
enum TaskPerformanceStatus: int
{
case Todo = 1; // 未开始
case Processing = 2; // 进行中
case Success = 3; // 已完成
case Failed = 4; // 未完成
}

View File

@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Api\Account;
use App\Http\Controllers\Api\Controller;
use App\Models\Ledger;
use App\Models\TaskPerformance;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
class StorePerformanceController extends Controller
{
public function __invoke(Request $request)
{
$request->validate(
rules: [
'month' => ['filled', 'date_format:Y-m'],
],
attributes: [
'month' => '月份',
],
);
/** @var \Carbon\Carbon */
$month = Carbon::createFromFormat('Y-m', $request->input('month') ?: date('Y-m'));
/** @var \App\Models\Employee */
$user = $request->user();
/**
* 当月的业绩指标任务
* @var \App\Models\TaskPerformance
*/
$taskPerformance = TaskPerformance::where('store_id', $user->store_id)
->where('month', $month->format('Y-m'))
->first();
$actualPerformance = Ledger::where('store_id', $user->store_id)
->whereBetween('date', [$month->copy()->startOfMonth()->format('Y-m-d'), $month->copy()->endOfMonth()->format('Y-m-d')])
->sum('sales');
return [
'actual_performance' => trim_zeros($actualPerformance),
'expected_performance' => trim_zeros($taskPerformance->expected_performance ?? 0),
];
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers\Api\Account;
use App\Http\Controllers\Api\Controller;
use App\Models\TaskPerformance;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
class TaskPerformanceController extends Controller
{
public function index(Request $request)
{
/** @var \App\Models\Employee */
$user = $request->user();
/** @var \Illuminate\Database\Eloquent\Collection */
$taskPerformances = TaskPerformance::where('store_id', $user->store_id)
->when($request->input('filter'), function ($query, $filter) {
$now = now();
switch ($filter) {
case 'future':
$query->whereHas('task', fn ($query) => $query->where('end_at', '>', $now));
break;
case 'history':
$query->whereHas('task', fn ($query) => $query->where('end_at', '<=', $now));
break;
}
})
->get();
return $taskPerformances->map(function (TaskPerformance $taskable) {
return [
'id' => $taskable->id,
'month' => $taskable->month,
'actual_performance' => trim_zeros($taskable->actual_performance),
'expected_performance' => trim_zeros($taskable->expected_performance),
'status' => $taskable->task_status,
];
});
// return $taskPerformances->groupBy(fn (TaskPerformance $taskable) => Carbon::createFromFormat('Y-m', $taskable->month)->year)
// ->map(function (Collection $collection) {
// return $collection->mapWithKeys(function (TaskPerformance $taskable) {
// return [
// Carbon::createFromFormat('Y-m', $taskable->month)->month => [
// 'id' => $taskable->id,
// 'month' => $taskable->month,
// 'actual_performance' => trim_zeros($taskable->actual_performance),
// 'expected_performance' => trim_zeros($taskable->expected_performance),
// 'status' => $taskable->task_status,
// ],
// ];
// })->sortKeysDesc();
// });
}
}

View File

@ -2,11 +2,14 @@
namespace App\Models;
use App\Enums\TaskPerformanceStatus;
use App\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Support\Carbon;
class TaskPerformance extends Model
{
@ -42,4 +45,32 @@ class TaskPerformance extends Model
{
return bccomp($this->actual_performance, $this->expected_performance, 2) >= 0;
}
/**
* 任务状态
*/
protected function taskStatus(): Attribute
{
return Attribute::make(
get: function (mixed $value, array $attributes) {
if ($this->isCompleted()) {
return TaskPerformanceStatus::Success;
}
// 任务开始时间
$startAt = Carbon::createFromFormat('Y-m-d H:i:s', "{$this->month}-01 00:00:00");
// 任务结束时间
$endAt = $startAt->copy()->endOfMonth();
// 当前时间
$datetime = now();
if ($datetime->lt($startAt)) {
return TaskPerformanceStatus::Todo;
} elseif ($datetime->gte($endAt)) {
return TaskPerformanceStatus::Failed;
}
return TaskPerformanceStatus::Processing;
},
);
}
}

View File

@ -1,6 +1,8 @@
<?php
use App\Http\Controllers\Api\Account\StoreMasterCommissionController;
use App\Http\Controllers\Api\Account\StorePerformanceController;
use App\Http\Controllers\Api\Account\TaskPerformanceController;
use App\Http\Controllers\Api\Auth\AccessTokenController;
use App\Http\Controllers\Api\ComplaintController;
use App\Http\Controllers\Api\FeedbackController;
@ -35,6 +37,10 @@ Route::group([
// 个人账户 - 佣金提成
Route::get('/account/store-master-commissions', [StoreMasterCommissionController::class, 'index']);
// 个人账户 - 门店业绩数据
Route::get('/account/store-performance', StorePerformanceController::class);
// 个人账户 - 门店业绩指标任务
Route::get('/account/store-performance-tasks', [TaskPerformanceController::class, 'index']);
// 统计数据 - 首页统计
Route::get('/statistics/dashboard', [StatisticsController::class, 'dashboard']);