generated from liutk/owl-admin-base
门店业绩
parent
69cf9f0ada
commit
776842c376
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
enum TaskPerformanceStatus: int
|
||||
{
|
||||
case Todo = 1; // 未开始
|
||||
case Processing = 2; // 进行中
|
||||
case Success = 3; // 已完成
|
||||
case Failed = 4; // 未完成
|
||||
}
|
||||
|
|
@ -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),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
// });
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
Loading…
Reference in New Issue