perf: 项目可自定义任务归档时间

This commit is contained in:
kuaifan 2024-12-01 11:44:24 +08:00
parent a011f82912
commit 94cefe52dd
8 changed files with 155 additions and 28 deletions

View File

@ -286,6 +286,8 @@ class ProjectController extends AbstractController
* @apiParam {Number} project_id 项目ID
* @apiParam {String} name 项目名称
* @apiParam {String} [desc] 项目介绍
* @apiParam {String} [archive_method] 归档方式
* @apiParam {Number} [archive_days] 自动归档天数
*
* @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述)
@ -298,6 +300,8 @@ class ProjectController extends AbstractController
$project_id = intval(Request::input('project_id'));
$name = trim(Request::input('name', ''));
$desc = trim(Request::input('desc', ''));
$archive_method = Request::input('archive_method');
$archive_days = intval(Request::input('archive_days'));
if (mb_strlen($name) < 2) {
return Base::retError('项目名称不可以少于2个字');
} elseif (mb_strlen($name) > 32) {
@ -306,9 +310,14 @@ class ProjectController extends AbstractController
if (mb_strlen($desc) > 255) {
return Base::retError('项目介绍最多只能设置255个字');
}
if ($archive_method == 'custom') {
if ($archive_days < 1 || $archive_days > 365) {
return Base::retError('自动归档天数设置错误范围1-365');
}
}
//
$project = Project::userProject($project_id, true, true);
AbstractModel::transaction(function () use ($desc, $name, $project) {
AbstractModel::transaction(function () use ($archive_days, $archive_method, $desc, $name, $project) {
if ($project->name != $name) {
$project->addLog("修改项目名称", [
'change' => [$project->name, $name]
@ -322,6 +331,18 @@ class ProjectController extends AbstractController
$project->desc = $desc;
$project->addLog("修改项目介绍");
}
if ($project->archive_method != $archive_method) {
$project->addLog("修改归档方式", [
'change' => [$project->archive_method, $archive_method]
]);
$project->archive_method = $archive_method;
}
if ($project->archive_method == 'custom') {
$project->addLog("修改自动归档天数", [
'change' => [$project->archive_days, $archive_days]
]);
$project->archive_days = $archive_days;
}
$project->save();
});
$project->pushMsg('update');

View File

@ -20,6 +20,8 @@ use Request;
* @property string|null $desc 描述、备注
* @property int|null $userid 创建人
* @property int|null $personal 是否个人项目
* @property string|null $archive_method 自动归档方式
* @property int|null $archive_days 自动归档天数
* @property string|null $user_simple 成员总数|1,2,3
* @property int|null $dialog_id 聊天会话ID
* @property \Illuminate\Support\Carbon|null $archived_at 归档时间
@ -48,6 +50,8 @@ use Request;
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel saveOrIgnore()
* @method static \Illuminate\Database\Eloquent\Builder|Project whereArchivedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project whereArchivedUserid($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project whereArchiveDays($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project whereArchiveMethod($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project whereDesc($value)

View File

@ -21,25 +21,62 @@ class AutoArchivedTask extends AbstractTask
}
public function start()
{
$this->systemAutoArchived();
$this->projectAutoArchived();
}
/**
* 处理已完成未归档的任务(系统默认)
*/
private function systemAutoArchived()
{
$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);
//获取已完成未归档的任务
$taskLists = ProjectTask::whereNotNull('complete_at')
->where('complete_at', '<=', $archivedTime)
->where('archived_userid', 0)
->whereNull('archived_at')
->take(100)
->get();
/** @var ProjectTask $task */
foreach ($taskLists AS $task) {
$task->archivedTask(Carbon::now(), true);
}
}
if ($setting['auto_archived'] !== 'open') {
return;
}
$archivedDay = min(365, floatval($setting['archived_day']));
if ($archivedDay <= 0) {
return;
}
$taskLists = ProjectTask::select('project_tasks.*')
->join('projects', 'projects.id', '=', 'project_tasks.project_id')
->whereNotNull('project_tasks.complete_at')
->where('project_tasks.complete_at', '<=', Carbon::now()->subDays($archivedDay))
->where('project_tasks.archived_userid', 0)
->whereNull('project_tasks.archived_at')
->where('projects.archive_method', '!=', 'custom')
->take(100)
->get();
/** @var ProjectTask $task */
foreach ($taskLists as $task) {
$task->archivedTask(Carbon::now(), true);
}
}
/**
* 处理已完成未归档的任务(项目自定义)
*/
private function projectAutoArchived()
{
// 获取设置了自定义归档的项目的任务
$prefix = \DB::getTablePrefix();
$taskLists = ProjectTask::select('project_tasks.*')
->join('projects', 'projects.id', '=', 'project_tasks.project_id')
->whereNotNull('project_tasks.complete_at')
->where('project_tasks.archived_userid', 0)
->whereNull('project_tasks.archived_at')
->where('projects.archive_method', 'custom')
->whereRaw("DATEDIFF(NOW(), {$prefix}project_tasks.complete_at) >= {$prefix}projects.archive_days")
->with(['project' => function ($query) {
$query->select('id', 'archive_days');
}])
->take(100)
->get();
/** @var ProjectTask $task */
foreach ($taskLists as $task) {
$task->archivedTask(Carbon::now(), true);
}
}

View File

@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddArchiveFieldsToPreProjectsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('projects', function (Blueprint $table) {
if (!Schema::hasColumn('projects', 'archive_method')) {
$table->after('personal', function ($table) {
$table->string('archive_method', 20)->nullable()->default('system')->comment('自动归档方式');
$table->integer('archive_days')->nullable()->default(30)->comment('自动归档天数');
});
$table->index('archive_method');
}
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('projects', function (Blueprint $table) {
$table->dropIndex('idx_projects_archive_method');
$table->dropColumn([
'archive_method',
'archive_days'
]);
});
}
}

View File

@ -770,3 +770,7 @@ webhook地址最长仅支持255个字符。
此功能仅管理员可用
此功能仅指定用户可用
此功能已禁止使用
自动归档天数设置错误,范围:(*)
修改归档方式
修改自动归档天数

View File

@ -1833,3 +1833,5 @@ WiFi签到延迟时长为±1分钟。
例如你是一个人开发的AI助手
仅支持 http 代理
例如http://proxy.com 或 https://proxy.com
系统默认

View File

@ -338,6 +338,21 @@
<FormItem prop="desc" :label="$L('项目介绍')">
<Input ref="projectDesc" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }" v-model="settingData.desc" :maxlength="255" :placeholder="`${$L('选填')} (${$L('支持 Markdown 格式')})`"></Input>
</FormItem>
<FormItem :label="$L('自动归档')" prop="archive_method">
<RadioGroup :value="settingData.archive_method" @on-change="formArchived">
<Radio label="system">{{$L('系统默认')}}</Radio>
<Radio label="custom">{{$L('自定义')}}</Radio>
</RadioGroup>
<template v-if="settingData.archive_method=='custom'">
<div class="form-tip">{{$L('任务完成 (*) 天后自动归档。', settingData.archive_days || 'n')}}</div>
<div class="setting-auto-day">
<Input v-model="settingData.archive_days" type="number">
<span slot="append">{{$L('天')}}</span>
</Input>
</div>
</template>
</FormItem>
</Form>
<div slot="footer" class="adaption">
<Button type="default" @click="settingShow=false">{{$L('取消')}}</Button>
@ -1270,8 +1285,12 @@ export default {
projectDropdown(name) {
switch (name) {
case "setting":
this.$set(this.settingData, 'name', this.projectData.name);
this.$set(this.settingData, 'desc', this.projectData.desc);
Object.assign(this.settingData, {
name: this.projectData.name,
desc: this.projectData.desc,
archive_method: this.projectData.archive_method,
archive_days: this.projectData.archive_days
});
this.settingShow = true;
this.$nextTick(() => {
this.$refs.projectName.focus()
@ -1280,13 +1299,7 @@ export default {
break;
case "permissions":
// this.$set(this.settingData, 'name', this.projectData.name);
// this.$set(this.settingData, 'desc', this.projectData.desc);
this.permissionShow = true;
// this.$nextTick(() => {
// this.$refs.projectName.focus()
// setTimeout(this.$refs.projectDesc.resizeTextarea, 0)
// });
break;
case "user":
@ -1556,7 +1569,11 @@ export default {
} else {
this.goBack();
}
}
},
formArchived(value) {
this.settingData = { ...this.settingData, archive_method: value };
},
}
}
</script>

View File

@ -92,7 +92,7 @@
<span slot="append">{{$L('天')}}</span>
</Input>
</div>
<div slot="content">{{$L('任务完成 (*) 天后自动归档。', formDatum.archived_day)}}</div>
<div slot="content">{{$L('任务完成 (*) 天后自动归档。', formDatum.archived_day || 'n')}}</div>
</ETooltip>
</FormItem>
<FormItem :label="$L('可见性选项')" prop="taskVisible">