From ba5f635687b9c9093d99a803318235f48f4f83db Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 31 Dec 2021 11:07:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=90=E4=BB=BB=E5=8A=A1=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8E=E4=B8=BB=E4=BB=BB=E5=8A=A1=E7=9B=B8?= =?UTF-8?q?=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 12 ++-- app/Models/ProjectTask.php | 58 ++++++++++++++----- .../js/pages/manage/components/TaskDetail.vue | 7 ++- resources/assets/js/store/actions.js | 6 ++ .../sass/pages/components/task-detail.scss | 4 +- 5 files changed, 66 insertions(+), 21 deletions(-) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index c2336621..db19478f 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -873,6 +873,8 @@ class ProjectController extends AbstractController 'parent_id' => $task->id, 'project_id' => $task->project_id, 'column_id' => $task->column_id, + 'start_at' => $task->start_at, + 'end_at' => $task->end_at, 'owner' => [User::userid()] ]); $data = [ @@ -918,6 +920,7 @@ class ProjectController extends AbstractController // $updateComplete = false; $updateContent = false; + $updateSubTask = false; if (Base::isDate($data['complete_at'])) { // 标记已完成 if ($task->complete_at) { @@ -934,11 +937,12 @@ class ProjectController extends AbstractController $updateComplete = true; } else { // 更新任务 - $task->updateTask($data, $updateContent); + $task->updateTask($data, $updateContent, $updateSubTask); } - $data = ProjectTask::with(['taskUser', 'taskTag'])->find($task->id); - $data->is_update_complete = $task->parent_id == 0 && $updateComplete; - $data->is_update_content = $updateContent; + $data = ProjectTask::with(['taskUser', 'taskTag'])->find($task->id)->toArray(); + $data['is_update_complete'] = $task->parent_id == 0 && $updateComplete; + $data['is_update_content'] = $updateContent; + $data['is_update_subtask'] = $updateSubTask; $task->pushMsg('update', $data); return Base::retSuccess('修改成功', $data); } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 6f308a11..82994fac 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -381,11 +381,9 @@ class ProjectTask extends AbstractModel // 时间 if ($times) { list($start, $end) = is_string($times) ? explode(",", $times) : (is_array($times) ? $times : []); - if (Base::isDate($start) && Base::isDate($end)) { - if ($start != $end) { - $task->start_at = Carbon::parse($start); - $task->end_at = Carbon::parse($end); - } + if (Base::isDate($start) && Base::isDate($end) && $start != $end) { + $task->start_at = Carbon::parse($start); + $task->end_at = Carbon::parse($end); } } // 负责人 @@ -408,7 +406,7 @@ class ProjectTask extends AbstractModel $task->sort = intval(self::whereColumnId($task->column_id)->orderByDesc('sort')->value('sort')) + 1; } // - return AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) { + return AbstractModel::transaction(function() use ($times, $subtasks, $content, $owner, $task) { $task->save(); foreach ($owner as $uid) { ProjectTaskUser::createInstance([ @@ -428,6 +426,17 @@ class ProjectTask extends AbstractModel } if ($task->parent_id == 0 && $subtasks && is_array($subtasks)) { foreach ($subtasks as $subtask) { + list($start, $end) = is_string($subtask['times']) ? explode(",", $subtask['times']) : (is_array($subtask['times']) ? $subtask['times'] : []); + if (Base::isDate($start) && Base::isDate($end) && $start != $end) { + if (Carbon::parse($start)->lt($task->start_at)) { + throw new ApiException('子任务开始时间不能小于主任务开始时间'); + } + if (Carbon::parse($end)->gt($task->end_at)) { + throw new ApiException('子任务结束时间不能大于主任务结束时间'); + } + } else { + $subtask['times'] = $times; + } $subtask['parent_id'] = $task->id; $subtask['project_id'] = $task->project_id; $subtask['column_id'] = $task->column_id; @@ -443,11 +452,12 @@ class ProjectTask extends AbstractModel * 修改任务 * @param $data * @param $updateContent + * @param $updateSubTask * @return bool */ - public function updateTask($data, &$updateContent) + public function updateTask($data, &$updateContent = false, &$updateSubTask = false) { - AbstractModel::transaction(function () use ($data, &$updateContent) { + AbstractModel::transaction(function () use ($data, &$updateContent, &$updateSubTask) { // 标题 if (Arr::exists($data, 'name') && $this->name != $data['name']) { if (empty($data['name'])) { @@ -498,15 +508,37 @@ class ProjectTask extends AbstractModel } // 计划时间 if (Arr::exists($data, 'times')) { + $originalWhere = [ + 'parent_id' => $this->id, + 'start_at' => $this->start_at, + 'end_at' => $this->end_at, + ]; $this->start_at = null; $this->end_at = null; $times = $data['times']; list($start, $end) = is_string($times) ? explode(",", $times) : (is_array($times) ? $times : []); - if (Base::isDate($start) && Base::isDate($end)) { - if ($start != $end) { - $this->start_at = Carbon::parse($start); - $this->end_at = Carbon::parse($end); + if (Base::isDate($start) && Base::isDate($end) && $start != $end) { + if ($this->parent_id > 0 && $data['skipTimesCheck'] !== true) { + // 如果是子任务,则不能超过主任务时间 + $mainTask = self::find($this->parent_id); + if (Carbon::parse($start)->lt($mainTask->start_at)) { + throw new ApiException('子任务开始时间不能小于主任务开始时间'); + } + if (Carbon::parse($end)->gt($mainTask->end_at)) { + throw new ApiException('子任务结束时间不能大于主任务结束时间'); + } } + $this->start_at = Carbon::parse($start); + $this->end_at = Carbon::parse($end); + } + if ($this->parent_id == 0) { + // 如果是主任务,则同步跟主任务相同时间的子任务 + self::where($originalWhere)->chunk(100, function($list) use ($times, &$updateSubTask) { + foreach ($list as $item) { + $item->updateTask(['times' => $times, 'skipTimesCheck' => true]); + } + $updateSubTask = true; + }); } $this->addLog("修改{任务}时间"); } @@ -525,7 +557,7 @@ class ProjectTask extends AbstractModel 'userid' => $uid, ], [ 'project_id' => $this->project_id, - 'task_pid' => $this->parent_id ?: $this->id, + 'task_pid' => $this->id, 'owner' => 0, ]); $array[] = $uid; diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue index e808f966..784d44d4 100644 --- a/resources/assets/js/pages/manage/components/TaskDetail.vue +++ b/resources/assets/js/pages/manage/components/TaskDetail.vue @@ -59,7 +59,7 @@ @on-ok="timeOk" transfer>
- {{taskDetail.end_at ? expiresFormat(taskDetail.end_at) : ' '}} + {{taskDetail.end_at && taskDetail.end_at != mainEndAt ? expiresFormat(taskDetail.end_at) : ' '}}
{{$L('子任务')}}