feat: 自动归档已完成任务
This commit is contained in:
parent
369577a2c8
commit
7c64b27ef4
@ -25,7 +25,7 @@ class SystemController extends AbstractController
|
|||||||
* @apiParam {String} type
|
* @apiParam {String} type
|
||||||
* - get: 获取(默认)
|
* - get: 获取(默认)
|
||||||
* - all: 获取所有(需要管理员权限)
|
* - 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 {Number} ret 返回状态码(1正确、0错误)
|
||||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
@ -41,10 +41,18 @@ class SystemController extends AbstractController
|
|||||||
User::auth('admin');
|
User::auth('admin');
|
||||||
$all = Request::input();
|
$all = Request::input();
|
||||||
foreach ($all AS $key => $value) {
|
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]);
|
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));
|
$setting = Base::setting('system', Base::newTrim($all));
|
||||||
} else {
|
} else {
|
||||||
$setting = Base::setting('system');
|
$setting = Base::setting('system');
|
||||||
@ -62,6 +70,8 @@ class SystemController extends AbstractController
|
|||||||
$setting['password_policy'] = $setting['password_policy'] ?: 'simple';
|
$setting['password_policy'] = $setting['password_policy'] ?: 'simple';
|
||||||
$setting['project_invite'] = $setting['project_invite'] ?: 'open';
|
$setting['project_invite'] = $setting['project_invite'] ?: 'open';
|
||||||
$setting['chat_nickname'] = $setting['chat_nickname'] ?: 'optional';
|
$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('{}'));
|
return Base::retSuccess('success', $setting ?: json_decode('{}'));
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
|
use App\Tasks\AutoArchivedTask;
|
||||||
use App\Tasks\DeleteTmpTask;
|
use App\Tasks\DeleteTmpTask;
|
||||||
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
||||||
use Redirect;
|
use Redirect;
|
||||||
@ -58,6 +59,8 @@ class IndexController extends InvokeController
|
|||||||
// 删除过期的临时表数据
|
// 删除过期的临时表数据
|
||||||
Task::deliver(new DeleteTmpTask('wg_tmp_msgs', 1));
|
Task::deliver(new DeleteTmpTask('wg_tmp_msgs', 1));
|
||||||
Task::deliver(new DeleteTmpTask('tmp', 24));
|
Task::deliver(new DeleteTmpTask('tmp', 24));
|
||||||
|
// 自动归档任务
|
||||||
|
Task::deliver(new AutoArchivedTask());
|
||||||
|
|
||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
|
@ -765,9 +765,9 @@ class ProjectTask extends AbstractModel
|
|||||||
* @param Carbon|null $archived_at 归档时间
|
* @param Carbon|null $archived_at 归档时间
|
||||||
* @return bool
|
* @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) {
|
if ($archived_at === null) {
|
||||||
// 取消归档
|
// 取消归档
|
||||||
$this->archived_at = null;
|
$this->archived_at = null;
|
||||||
@ -775,14 +775,21 @@ class ProjectTask extends AbstractModel
|
|||||||
$this->addLog("任务取消归档:" . $this->name);
|
$this->addLog("任务取消归档:" . $this->name);
|
||||||
$this->pushMsg('add', [
|
$this->pushMsg('add', [
|
||||||
'new_column' => null,
|
'new_column' => null,
|
||||||
'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($this->id),
|
'task' => ProjectTask::oneTask($this->id),
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
// 归档任务
|
// 归档任务
|
||||||
|
if ($isAuto === true) {
|
||||||
|
$logText = "自动任务归档:" . $this->name;
|
||||||
|
$userid = 0;
|
||||||
|
} else {
|
||||||
|
$logText = "任务归档:" . $this->name;
|
||||||
|
$userid = User::userid();
|
||||||
|
}
|
||||||
$this->archived_at = $archived_at;
|
$this->archived_at = $archived_at;
|
||||||
$this->archived_userid = User::userid();
|
$this->archived_userid = $userid;
|
||||||
$this->archived_follow = 0;
|
$this->archived_follow = 0;
|
||||||
$this->addLog("任务归档:" . $this->name);
|
$this->addLog($logText, $userid);
|
||||||
$this->pushMsg('archived');
|
$this->pushMsg('archived');
|
||||||
}
|
}
|
||||||
$this->save();
|
$this->save();
|
||||||
|
46
app/Tasks/AutoArchivedTask.php
Normal file
46
app/Tasks/AutoArchivedTask.php
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Tasks;
|
||||||
|
|
||||||
|
@error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
|
||||||
|
|
||||||
|
use App\Models\AbstractModel;
|
||||||
|
use App\Models\ProjectTask;
|
||||||
|
use App\Module\Base;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 完成的任务自动归档
|
||||||
|
* Class AutoArchivedTask
|
||||||
|
* @package App\Tasks
|
||||||
|
*/
|
||||||
|
class AutoArchivedTask extends AbstractTask
|
||||||
|
{
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function start()
|
||||||
|
{
|
||||||
|
$setting = Base::setting('system');
|
||||||
|
if ($setting['auto_archived'] === 'open') {
|
||||||
|
$archivedDay = floatval($setting['archived_day']);
|
||||||
|
if ($archivedDay > 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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -45,6 +45,18 @@
|
|||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
<div v-if="formDatum.chat_nickname == 'required'" class="form-tip">{{$L('必填:发送聊天内容前必须设置昵称。')}}</div>
|
<div v-if="formDatum.chat_nickname == 'required'" class="form-tip">{{$L('必填:发送聊天内容前必须设置昵称。')}}</div>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
<FormItem :label="$L('自动归档任务')" prop="autoArchived">
|
||||||
|
<RadioGroup :value="formDatum.auto_archived" @on-change="formArchived">
|
||||||
|
<Radio label="open">{{$L('开启')}}</Radio>
|
||||||
|
<Radio label="close">{{$L('关闭')}}</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
<Tooltip v-if="formDatum.auto_archived=='open'" class="setting-auto-day" placement="right">
|
||||||
|
<Input v-model="formDatum.archived_day" type="number">
|
||||||
|
<span slot="append">{{$L('天')}}</span>
|
||||||
|
</Input>
|
||||||
|
<div slot="content">{{$L('任务完成 % 天后自动归档。', formDatum.archived_day)}}</div>
|
||||||
|
</Tooltip>
|
||||||
|
</FormItem>
|
||||||
</Form>
|
</Form>
|
||||||
<div class="setting-footer">
|
<div class="setting-footer">
|
||||||
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
|
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
|
||||||
@ -80,6 +92,10 @@ export default {
|
|||||||
this.formDatum = $A.cloneJSON(this.formDatum_bak);
|
this.formDatum = $A.cloneJSON(this.formDatum_bak);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
formArchived(value) {
|
||||||
|
this.formDatum = { ...this.formDatum, auto_archived: value };
|
||||||
|
},
|
||||||
|
|
||||||
systemSetting(save) {
|
systemSetting(save) {
|
||||||
this.loadIng++;
|
this.loadIng++;
|
||||||
this.$store.dispatch("call", {
|
this.$store.dispatch("call", {
|
||||||
|
22
resources/assets/sass/pages/page-setting.scss
vendored
22
resources/assets/sass/pages/page-setting.scss
vendored
@ -138,18 +138,30 @@
|
|||||||
min-width: 94px;
|
min-width: 94px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.setting-auto-day {
|
||||||
|
display: block;
|
||||||
|
width: 110px;
|
||||||
|
margin-top: 12px;
|
||||||
|
line-height: 32px;
|
||||||
|
margin-bottom: -10px;
|
||||||
|
}
|
||||||
&.submit {
|
&.submit {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 0 !important;
|
||||||
|
.ivu-form {
|
||||||
|
flex: 1;
|
||||||
|
padding: 24px 40px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
.setting-footer {
|
.setting-footer {
|
||||||
position: absolute;
|
flex-shrink: 0;
|
||||||
left: 0;
|
position: static;
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 1;
|
|
||||||
padding: 16px 24px 0;
|
padding: 16px 24px 0;
|
||||||
border-top: 1px solid #F4F4F5;
|
border-top: 1px solid #F4F4F5;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user