diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 3e998b85..4e060409 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -25,7 +25,7 @@ class SystemController extends AbstractController * @apiParam {String} type * - get: 获取(默认) * - all: 获取所有(需要管理员权限) - * - save: 保存设置(参数:reg、reg_invite、login_code、password_policy、project_invite、chat_nickname) + * - save: 保存设置(参数:reg、reg_invite、login_code、password_policy、project_invite、chat_nickname、auto_archived、archived_day) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -41,10 +41,18 @@ class SystemController extends AbstractController User::auth('admin'); $all = Request::input(); foreach ($all AS $key => $value) { - if (!in_array($key, ['reg', 'reg_invite', 'login_code', 'password_policy', 'project_invite', 'chat_nickname'])) { + if (!in_array($key, ['reg', 'reg_invite', 'login_code', 'password_policy', 'project_invite', 'chat_nickname', 'auto_archived', 'archived_day'])) { unset($all[$key]); } } + $all['archived_day'] = floatval($all['archived_day']); + if ($all['auto_archived'] == 'open') { + if ($all['archived_day'] <= 0) { + return Base::retError('自动归档时间不可小于1天!'); + } elseif ($all['archived_day'] > 100) { + return Base::retError('自动归档时间不可大于100天!'); + } + } $setting = Base::setting('system', Base::newTrim($all)); } else { $setting = Base::setting('system'); @@ -62,6 +70,8 @@ class SystemController extends AbstractController $setting['password_policy'] = $setting['password_policy'] ?: 'simple'; $setting['project_invite'] = $setting['project_invite'] ?: 'open'; $setting['chat_nickname'] = $setting['chat_nickname'] ?: 'optional'; + $setting['auto_archived'] = $setting['auto_archived'] ?: 'close'; + $setting['archived_day'] = floatval($setting['archived_day']) ?: 7; // return Base::retSuccess('success', $setting ?: json_decode('{}')); } diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php index 68969fa0..d5ec0c19 100755 --- a/app/Http/Controllers/IndexController.php +++ b/app/Http/Controllers/IndexController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Module\Base; +use App\Tasks\AutoArchivedTask; use App\Tasks\DeleteTmpTask; use Hhxsv5\LaravelS\Swoole\Task\Task; use Redirect; @@ -58,6 +59,8 @@ class IndexController extends InvokeController // 删除过期的临时表数据 Task::deliver(new DeleteTmpTask('wg_tmp_msgs', 1)); Task::deliver(new DeleteTmpTask('tmp', 24)); + // 自动归档任务 + Task::deliver(new AutoArchivedTask()); return "success"; } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index ad4c67bb..8a7239ff 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -765,9 +765,9 @@ class ProjectTask extends AbstractModel * @param Carbon|null $archived_at 归档时间 * @return bool */ - public function archivedTask($archived_at) + public function archivedTask($archived_at, $isAuto = false) { - AbstractModel::transaction(function () use ($archived_at) { + AbstractModel::transaction(function () use ($isAuto, $archived_at) { if ($archived_at === null) { // 取消归档 $this->archived_at = null; @@ -775,14 +775,21 @@ class ProjectTask extends AbstractModel $this->addLog("任务取消归档:" . $this->name); $this->pushMsg('add', [ 'new_column' => null, - 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($this->id), + 'task' => ProjectTask::oneTask($this->id), ]); } else { // 归档任务 + if ($isAuto === true) { + $logText = "自动任务归档:" . $this->name; + $userid = 0; + } else { + $logText = "任务归档:" . $this->name; + $userid = User::userid(); + } $this->archived_at = $archived_at; - $this->archived_userid = User::userid(); + $this->archived_userid = $userid; $this->archived_follow = 0; - $this->addLog("任务归档:" . $this->name); + $this->addLog($logText, $userid); $this->pushMsg('archived'); } $this->save(); diff --git a/app/Tasks/AutoArchivedTask.php b/app/Tasks/AutoArchivedTask.php new file mode 100644 index 00000000..c0afdcfa --- /dev/null +++ b/app/Tasks/AutoArchivedTask.php @@ -0,0 +1,46 @@ + 0) { + $archivedDay = min(100, $archivedDay); + $archivedTime = Carbon::now()->subDays($archivedDay); + //获取已完成未归档的任务 + AbstractModel::transaction(function() use ($archivedTime) { + $taskLists = ProjectTask::whereNotNull('complete_at') + ->where('complete_at', '<=', $archivedTime) + ->whereNull('archived_at') + ->take(100) + ->get(); + foreach ($taskLists AS $task) { + $task->archivedTask(Carbon::now(), true); + } + }); + } + } + } +} diff --git a/resources/assets/js/pages/manage/setting/system.vue b/resources/assets/js/pages/manage/setting/system.vue index 9db08a14..66af9fcc 100644 --- a/resources/assets/js/pages/manage/setting/system.vue +++ b/resources/assets/js/pages/manage/setting/system.vue @@ -45,6 +45,18 @@
{{$L('必填:发送聊天内容前必须设置昵称。')}}
+ + + {{$L('开启')}} + {{$L('关闭')}} + + + + {{$L('天')}} + +
{{$L('任务完成 % 天后自动归档。', formDatum.archived_day)}}
+
+