子任务默认时间与主任务相同

This commit is contained in:
kuaifan 2021-12-31 11:07:44 +08:00
parent bae5afc0da
commit ba5f635687
5 changed files with 66 additions and 21 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -59,7 +59,7 @@
@on-ok="timeOk"
transfer>
<div @click="openTime" :class="['time', taskDetail.today ? 'today' : '', taskDetail.overdue ? 'overdue' : '']">
{{taskDetail.end_at ? expiresFormat(taskDetail.end_at) : ' '}}
{{taskDetail.end_at && taskDetail.end_at != mainEndAt ? expiresFormat(taskDetail.end_at) : ' '}}
</div>
</DatePicker>
<Poptip
@ -315,7 +315,7 @@
<i class="taskfont">&#xe6f0;</i>{{$L('子任务')}}
</div>
<ul class="item-content subtask">
<TaskDetail v-for="(task, key) in subList" :key="key" :task-id="task.id" :open-task="task"/>
<TaskDetail v-for="(task, key) in subList" :key="key" :task-id="task.id" :open-task="task" :main-end-at="taskDetail.end_at"/>
</ul>
<ul :class="['item-content', subList.length === 0 ? 'nosub' : '']">
<li>
@ -427,6 +427,9 @@ export default {
return {};
}
},
mainEndAt: {
default: null
},
},
data() {
return {

View File

@ -863,11 +863,17 @@ export default {
dispatch("getTaskOne", data.parent_id);
}
if (data.is_update_complete) {
data.is_update_complete = false;
dispatch("getProjectOne", data.project_id);
}
if (data.is_update_content) {
data.is_update_content = false;
dispatch("getTaskContent", data.id);
}
if (data.is_update_subtask) {
data.is_update_subtask = false;
dispatch("getTasks", {parent_id: data.id});
}
//
setTimeout(() => {
state.method.setStorage("cacheTasks", state.cacheTasks = state.tasks);

View File

@ -312,8 +312,8 @@
}
}
.subtask-avatar {
height: 26px;
line-height: 26px;
height: 20px;
margin-top: 3px;
cursor: pointer;
}
.ivu-icon-ios-loading {