feat(task): 建立与解除任务关联时记录双方任务动态

This commit is contained in:
kuaifan 2026-10-10 02:41:15 +00:00
parent f7c42f6985
commit 5ce39a8dc4
4 changed files with 41 additions and 3 deletions

View File

@ -2449,7 +2449,7 @@ class ProjectController extends AbstractController
$project = Project::userProject($task->project_id);
ProjectPermission::userTaskPermission($project, ProjectPermission::TASK_UPDATE, $task);
//
$success = ProjectTaskRelation::deleteRelation($task_id, $related_task_id);
$success = ProjectTaskRelation::deleteRelation($task_id, $related_task_id, User::userid());
if (!$success) {
return Base::retError('关联不存在');
}

View File

@ -97,6 +97,10 @@ class ProjectTaskRelation extends AbstractModel
return false;
}
$existed = static::whereTaskId($sourceTaskId)
->whereRelatedTaskId($targetTaskId)
->exists();
// 创建正向关联:源任务提及目标任务
$mentionRelation = static::updateOrCreate(
[
@ -125,6 +129,12 @@ class ProjectTaskRelation extends AbstractModel
]
);
// 记录任务动态(仅首次建立关联时)
if (!$existed) {
self::addRelationLog($sourceTask, $targetTask, '关联任务', $userid);
self::addRelationLog($targetTask, $sourceTask, '关联任务', $userid);
}
// 推送关联更新
if ($push) {
$needPush = $mentionRelation->wasRecentlyCreated || $mentionRelation->wasChanged()
@ -148,9 +158,10 @@ class ProjectTaskRelation extends AbstractModel
*
* @param int $taskId 任务ID
* @param int $relatedTaskId 关联任务ID
* @param int|null $userid 操作人
* @return bool 是否删除成功
*/
public static function deleteRelation(int $taskId, int $relatedTaskId): bool
public static function deleteRelation(int $taskId, int $relatedTaskId, ?int $userid = null): bool
{
// 删除正向关联
$deleted1 = static::whereTaskId($taskId)
@ -166,6 +177,11 @@ class ProjectTaskRelation extends AbstractModel
// 推送关联更新
$sourceTask = ProjectTask::with('project')->find($taskId);
$targetTask = ProjectTask::with('project')->find($relatedTaskId);
// 记录任务动态
if ($sourceTask && $targetTask) {
self::addRelationLog($sourceTask, $targetTask, '解除关联任务', $userid);
self::addRelationLog($targetTask, $sourceTask, '解除关联任务', $userid);
}
if ($sourceTask?->project) {
$sourceTask->pushMsg('relation', null, null, false);
}
@ -178,6 +194,21 @@ class ProjectTaskRelation extends AbstractModel
return false;
}
/**
* 记录任务关联变更动态
*
* @param ProjectTask $task 记录动态的任务
* @param ProjectTask $relatedTask 关联的任务
* @param string $detail 动态内容
* @param int|null $userid 操作人
*/
private static function addRelationLog(ProjectTask $task, ProjectTask $relatedTask, string $detail, ?int $userid): void
{
$task->addLog($detail, [
'change' => ['#' . $relatedTask->id . ' ' . $relatedTask->name],
], $userid ?: 0);
}
public static function recordMentionsFromMessage(WebSocketDialogMsg $msg): void
{
if ($msg->type !== 'text') {

View File

@ -1090,3 +1090,5 @@ WebDAV 未启用或你没有使用权限
最新版本已变化,请重新检查更新
发起系统更新失败
已开始更新系统
关联任务
解除关联任务

View File

@ -18,7 +18,7 @@ negative:
- 关联是平级的,不会形成父子层级(要拆层级用 [[task.subtask.concept]])
- 删除任意一方任务不会自动删除关联记录
- 关联不带过去字段数据(不是软链接,只是关系记录)
last_verified: v1.7.90
last_verified: v1.9.59
---
# 任务关联(消息提及 / 任务 ↔ 任务)
@ -48,6 +48,11 @@ DooTask 用 `ProjectTaskRelation` 表记录两类关联:
- 任务详情页底部「相关消息」区(来自 dialog mention)
- 任务详情页「关联任务」区(来自任务详情页直接关联)
- 关联任务双向显示:A 关联 B 后,B 那边也看到 A
- 任务动态:首次建立关联、解除关联时,双方任务的动态里都会记录「关联任务 / 解除关联任务: #任务ID 任务名称」
## 解除关联
- 任务详情页「关联任务」区,对某条关联点击移除并确认,即同时解除双向关联
- 需要对当前任务有修改权限(项目负责人、任务负责人或协助人员)
## 不支持
- 关联不产生权限继承