store-manage/app/Models/TaskPerformance.php

77 lines
2.0 KiB
PHP

<?php
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
{
use HasFactory, HasDateTimeFormatter;
protected $fillable = [
'month',
'store_id',
'store_master_id',
'expected_performance',
'actual_performance',
];
public function task(): MorphOne
{
return $this->morphOne(Task::class, 'taskable');
}
public function store(): BelongsTo
{
return $this->belongsTo(Store::class);
}
public function storeMaster(): BelongsTo
{
return $this->belongsTo(Employee::class, 'store_master_id');
}
/**
* 此业绩指标是否已完成
*/
public function isCompleted(): bool
{
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;
},
);
}
}