feat(task): 周期任务生成新任务时与原任务自动建立关联

This commit is contained in:
kuaifan 2026-10-10 02:48:43 +00:00
parent 5ce39a8dc4
commit adac87bf45
2 changed files with 17 additions and 4 deletions

View File

@ -8,6 +8,7 @@ use App\Module\ProjectTaskHandoffRecord;
use App\Models\ProjectFlow;
use App\Models\ProjectFlowItem;
use App\Models\ProjectTask;
use App\Models\ProjectTaskRelation;
use App\Models\ProjectTaskUser;
use Carbon\Carbon;
@ -50,18 +51,19 @@ class LoopTask extends AbstractTask
/**
* 按周期生成新任务并关闭原任务周期
* 复制、刷新周期、关闭旧周期在同一事务内,任一步失败整体回滚,不会留下 loop_at 仍在窗口内的残留副本
* 提交后再为新旧任务建立关联,关联失败不影响已生成的任务
* @param ProjectTask $item
*/
private function createLoopTask(ProjectTask $item)
{
AbstractModel::transaction(function () use ($item) {
$task = AbstractModel::transaction(function () use ($item) {
// 锁定并复核原任务:已被并发或上一轮处理(loop_at 已变化/清空)则跳过
$source = ProjectTask::whereKey($item->id)->lockForUpdate()->first();
if (!$source
|| $source->parent_id > 0
|| !$source->loop_at
|| Carbon::parse($source->loop_at)->toDateTimeString() !== Carbon::parse($item->loop_at)->toDateTimeString()) {
return;
return null;
}
$task = $source->copyTask();
ProjectTaskHandoffRecord::track($task, 'recurring', function () use ($task, $source) {
@ -113,7 +115,17 @@ class LoopTask extends AbstractTask
$source->loop_at = null;
$source->save();
$source->addLog("已创建新的周期任务ID:{$task->id},此任务关闭周期", [], $task->userid);
return $task;
});
if (!$task) {
return;
}
// 新旧任务建立关联
try {
ProjectTaskRelation::createRelation($item->id, $task->id, null, null, $task->userid);
} catch (\Throwable $e) {
info($e);
}
}
public function end()

View File

@ -23,7 +23,7 @@ negative:
- 自定义天数必须是正整数,0 或非数字会被拒绝
- 修改循环周期不会回填已生成的实例
- 所属项目已被删除或已归档时,不再自动生成新的周期任务
last_verified: v1.9.36
last_verified: v1.9.59
---
# 重复 / 循环任务
@ -51,7 +51,8 @@ DooTask 任务支持循环重复(字段 `loop` 重复周期 + `loop_at` 下个
2. 到 `loop_at` 后,系统创建新任务,复制:标题、描述、负责人和协助人员、附件、优先级、可见性、子任务
3. 新任务开始时间等于原任务的 `loop_at`,时长与原任务相同;状态为未完成(项目有工作流则回到起始状态),子任务也重置为未完成
4. 新任务自己算出下一个 `loop_at`;原任务的周期被关闭(`loop` 清空),并记一条日志
5. 创建失败时整体回滚,不会留下半成品,任务日志记「生成重复任务失败:原因」,到期后 10 分钟内每分钟重试
5. 新任务与原任务自动建立任务关联,双方任务详情「关联任务」区可互相跳转,任务动态各记一条「关联任务」
6. 创建失败时整体回滚,不会留下半成品,任务日志记「生成重复任务失败:原因」,到期后 10 分钟内每分钟重试
## 不支持
- 不能为同一任务并行启用多个周期