This commit is contained in:
2023-03-08 09:16:04 +08:00
commit e78454540f
1318 changed files with 210569 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
<?php
namespace Modules\Task\Models;
use App\Models\Model;
use App\Traits\HasCovers;
use App\Traits\HasStatus;
use Modules\Linker\Traits\HasLinker;
class Category extends Model
{
use HasLinker,
HasCovers,
HasStatus;
public string $cover_field = 'cover';
protected $table = 'task_categories';
}

View File

@@ -0,0 +1,19 @@
<?php
namespace Modules\Task\Models;
use App\Models\Model;
use Modules\Task\Models\Traits\BelongsToTask;
use Modules\User\Traits\BelongsToUser;
class Log extends Model
{
use BelongsToUser, BelongsToTask;
protected $table = 'task_logs';
public $casts = [
'source' => 'json',
];
}

View File

@@ -0,0 +1,203 @@
<?php
namespace Modules\Task\Models;
use App\Models\Model;
use App\Traits\HasCovers;
use App\Traits\HasStatus;
use App\Traits\WithPosition;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Modules\Linker\Traits\HasLinker;
use Modules\Task\Models\Traits\TaskAttribute;
use Modules\User\Models\AccountRule;
use Modules\User\Models\Identity;
use Modules\User\Models\User;
use Modules\Task\Models\User as TaskUser;
class Task extends Model
{
use HasLinker,
HasCovers,
WithPosition,
TaskAttribute,
HasStatus;
const CYCLE_DAY = 'day';
const CYCLE_WEEK = 'week';
const CYCLE_MONTH = 'month';
const CYCLE_YEAR = 'year';
const CYCLE_ONE = 'one';
const CYCLES = [
self::CYCLE_DAY => '日',
self::CYCLE_WEEK => '周',
self::CYCLE_MONTH => '月',
self::CYCLE_YEAR => '年',
self::CYCLE_ONE => '一次',
];
const TYPE_SUM = 'sum';
const TYPE_COUNT = 'count';
const TYPES = [
self::TYPE_SUM => '和值',
self::TYPE_COUNT => '计数',
];
const COMPANY_CERTIFICATION_YES = 1;
const COMPANY_CERTIFICATION_NO = 0;
const COMPANY_CERTIFICATIONS = [
self::COMPANY_CERTIFICATION_YES => '是',
self::COMPANY_CERTIFICATION_NO => '否',
];
const COMPANY_CERTIFICATION_LABEL = [
self::COMPANY_CERTIFICATION_YES => 'info',
self::COMPANY_CERTIFICATION_NO => 'success',
];
const POSITION_RECOMMENDED = 1;
public array $position_map = [
self::POSITION_RECOMMENDED => '推荐',
];
public string $cover_field = 'cover';
public $casts = [
'identity' => 'json',
];
const STATUS_DOWN = 0;
const STATUS_UP = 1;
public array $status_map = [
self::STATUS_UP => '开启',
self::STATUS_DOWN => '关闭',
];
public function getIcoUrlAttribute(): string
{
return $this->parseImageUrl($this->ico);
}
/**
* Notes: 关联分类
*
* @Author: 玄尘
* @Date: 2022/10/19 16:45
* @return BelongsTo
*/
public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
/**
* Notes: 关联规则
*
* @Author: 玄尘
* @Date : 2021/9/30 14:30
* @return BelongsTo
*/
public function rule(): BelongsTo
{
return $this->belongsTo(AccountRule::class, 'rule_id');
}
/**
* Notes: 获取账变值
*
* @Author: 玄尘
* @Date: 2022/10/20 11:05
*/
public function getRuleNumber()
{
$variable = $this->rule_number;
if (! $variable) {
$variable = $this->rule ? $this->rule->variable : 0;
}
return $variable;
}
/**
* Notes: description
*
* @Author: 玄尘
* @Date : 2021/9/29 11:53
* @param Builder $query
* @param User $user
* @return Builder
*/
public function scopeOfUser(Builder $query, User $user): Builder
{
$identity = $user->identities->first();
return $query->where('identity', 'like', "%$identity->id%");
}
/**
* Notes: description
*
* @Author: 玄尘
* @Date : 2021/9/29 11:53
* @param Builder $query
* @param Identity $identity
* @return Builder
*/
public function scopeOfIdentity(Builder $query, Identity $identity): Builder
{
return $query->where('identity', 'like', "%$identity->id%");
}
/**
* Notes: 是否完成
*
* @Author: 玄尘
* @Date : 2021/9/30 13:25
*/
public function getFinish($user): bool
{
$rule = $this->rule;
if ($rule) {
if (method_exists($this, $rule->name)) {
return $this->{$rule->name}($user);
}
}
return false;
}
/**
* Notes: 任务数据
*
* @Author: 玄尘
* @Date: 2022/10/20 10:43
*/
public function taskUsers(): HasMany
{
return $this->hasMany(TaskUser::class);
}
/**
* Notes: 任务记录
*
* @Author: 玄尘
* @Date: 2022/10/20 10:45
*/
public function taskLogs(): HasMany
{
return $this->hasMany(Log::class);
}
public function getIdentities()
{
return Identity::query()->whereIn('id',$this->identity)->pluck('name');
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Modules\Task\Models\Traits;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Modules\Task\Models\Task;
trait BelongsToTask
{
/**
* Notes: 关联任务
*
* @Author: 玄尘
* @Date: 2022/10/20 10:23
*/
public function task(): BelongsTo
{
return $this->belongsTo(Task::class);
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace Modules\Task\Models\Traits;
use Modules\Task\Facades\TaskFacade;
trait TaskAttribute
{
/**
* Notes: 获取任务状态
*
* @Author: 玄尘
* @Date: 2022/10/21 9:52
*/
public function getUserTask($user): array
{
$data = [
'all' => $this->task_number,
];
if ($user) {
$timeRange = TaskFacade::getTimeInterval($this->cycle);
$taskUser = $this->taskUsers()
->when($this->cycle != 'one', function ($q) use ($timeRange) {
$q->whereBetween('task_at', $timeRange);
})
->byUser($user)
->first();
if ($taskUser) {
return array_merge($data, [
'task_id' => $taskUser->id,
'finish' => $taskUser->status,
'total' => min($taskUser->total, $data['all']),
]);
} else {
return array_merge($data, [
'finish' => 0,
'total' => 0,
]);
}
} else {
return array_merge($data, [
'finish' => 0,
'total' => 0,
]);
}
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace Modules\Task\Models;
use App\Models\Model;
use App\Traits\HasStatus;
use Illuminate\Support\Facades\Cache;
use Modules\Task\Models\Traits\BelongsToTask;
use Modules\User\Traits\BelongsToUser;
class User extends Model
{
use BelongsToUser, BelongsToTask, HasStatus;
protected $table = 'task_users';
const STATUS_INTI = 0;
const STATUS_FINISH = 1;
public array $status_map = [
self::STATUS_INTI => '进行中',
self::STATUS_FINISH => '完成',
];
/**
* Notes: 增加任务数
*
* @Author: 玄尘
* @Date: 2022/10/20 11:10
* @param int $step
*/
public function incrementTotal(int $step = 1)
{
if ($this->task->key == 'steps') {
$this->total = $step;
$this->save();
} else {
$this->increment('total', $step);
}
}
}