diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index ce32001cb..6d41dcd95 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -735,7 +735,9 @@ class ProjectTask extends AbstractModel if (count($older) == 0 && count($array) == 1 && $array[0] == User::userid()) { $this->addLog("认领{任务}"); } else { - $this->addLog("修改{任务}负责人", ['userid' => $array]); + if (array_merge(array_diff($array, $older), array_diff($older, $array))) { + $this->addLog("修改{任务}负责人", ['userid' => $array]); + } } $this->taskPush(array_values(array_diff($array, $older)), 0); } @@ -890,6 +892,7 @@ class ProjectTask extends AbstractModel } // 协助人员 if (Arr::exists($data, 'assist')) { + $older = $this->taskUser->where('owner', 0)->pluck('userid')->toArray(); $array = []; $assist = is_array($data['assist']) ? $data['assist'] : [$data['assist']]; if (count($assist) > 10) { @@ -910,7 +913,9 @@ class ProjectTask extends AbstractModel $array[] = $uid; } if ($array) { - $this->addLog("修改{任务}协助人员", ['userid' => $array]); + if (array_merge(array_diff($array, $older), array_diff($older, $array))) { + $this->addLog("修改{任务}协助人员", ['userid' => $array]); + } } $rows = ProjectTaskUser::whereTaskId($this->id)->whereOwner(0)->whereNotIn('userid', $array)->get(); if ($rows->isNotEmpty()) { @@ -1349,6 +1354,9 @@ class ProjectTask extends AbstractModel $addMsg = $this->parent_id == 0 && $this->dialog_id > 0; if ($complete_at === null) { // 标记未完成 + if (!$this->complete_at) { + return; // 本来就未完成 + } $this->complete_at = null; $this->addLog("标记{任务}未完成"); if ($addMsg) { @@ -1358,6 +1366,9 @@ class ProjectTask extends AbstractModel } } else { // 标记已完成 + if ($this->complete_at) { + return; // 本来就已完成 + } if ($this->parent_id == 0) { if (self::whereParentId($this->id)->whereCompleteAt(null)->exists()) { throw new ApiException('子任务未完成', [ @@ -1848,6 +1859,12 @@ class ProjectTask extends AbstractModel AbstractModel::transaction(function () use ($projectId, $columnId, $flowItemId, $owner, $assist, $completeAt) { $newTaskUser = array_merge($owner, $assist); // + $oldProject = Project::find($this->project_id); + $newProject = $this->project_id != $projectId ? Project::find($projectId) : $oldProject; + if (!$oldProject || !$newProject) { + throw new ApiException('项目不存在'); + } + // $this->project_id = $projectId; $this->column_id = $columnId; // 任务内容 @@ -1883,6 +1900,7 @@ class ProjectTask extends AbstractModel ]); // if ($flowItemId) { + // 更新任务流程 $flowItem = projectFlowItem::whereProjectId($projectId)->whereId($flowItemId)->first(); $this->flow_item_id = $flowItemId; $this->flow_item_name = $flowItem->status . "|" . $flowItem->name; @@ -1892,17 +1910,25 @@ class ProjectTask extends AbstractModel $this->completeTask(null); } } else { + // 没有流程只更新状态 $this->flow_item_id = 0; $this->flow_item_name = ''; - } - // - if ($completeAt) { - $this->complete_at = $completeAt; + if ($completeAt) { + $this->completeTask(Carbon::parse($completeAt)); + } else { + $this->completeTask(null); + } } // $this->save(); // - $this->addLog("移动{任务}"); + $log = $this->addLog("移动{任务}", [ + 'change' => [$oldProject->name, $newProject->name] + ]); + if ($this->dialog_id) { + $notice = $oldProject->id != $newProject->id ? "「{$oldProject->name}」移动至「{$newProject->name}」" : $log->detail; + WebSocketDialogMsg::sendMsg(null, $this->dialog_id, 'notice', ['notice' => $notice], User::userid(), true, true); + } }); $this->pushMsg('update'); return true; diff --git a/language/original-api.txt b/language/original-api.txt index d833723e8..63155d228 100644 --- a/language/original-api.txt +++ b/language/original-api.txt @@ -352,6 +352,7 @@ LDAP 用户禁止修改邮箱 移交子任务身份 任务取消归档 自动任务归档 +任务自动归档 任务归档 创建任务来自周期任务ID:(*) 已创建新的周期任务ID:(*),此任务关闭周期 @@ -844,3 +845,4 @@ AI机器人不存在 请输入删除备注 删除备注长度限制(*)个字 系统机器人不能删除 +「(*)」移动至「(*)」 diff --git a/language/original-web.txt b/language/original-web.txt index affb1be32..ea8ed7693 100644 --- a/language/original-web.txt +++ b/language/original-web.txt @@ -2044,3 +2044,6 @@ AI开启新会话 AI开启新会话失败 打开会话窗口 +转为已完成 +转为未完成 +「(*)」移动至「(*)」 diff --git a/language/translate.json b/language/translate.json index 6a385f7ea..8f42c7868 100644 --- a/language/translate.json +++ b/language/translate.json @@ -22440,7 +22440,7 @@ "ru": "Задача не архивирована" }, { - "key": "自动任务归档", + "key": "任务自动归档", "zh": "", "zh-CHT": "自動任務歸檔", "en": "Automatic task archiving", @@ -29459,4 +29459,4 @@ "id": "Buka Jendela Sesi", "ru": "Открыть окно сессии" } -] \ No newline at end of file +] diff --git a/resources/assets/js/pages/manage/components/TaskMenu.vue b/resources/assets/js/pages/manage/components/TaskMenu.vue index 1a5ab819a..1971bbbb3 100644 --- a/resources/assets/js/pages/manage/components/TaskMenu.vue +++ b/resources/assets/js/pages/manage/components/TaskMenu.vue @@ -44,6 +44,10 @@ export default { type: String, default: 'small' }, + placement: { + type: String, + default: 'bottom' + }, icon: { type: String, default: 'md-radio-button-off' @@ -83,6 +87,7 @@ export default { updateBefore: this.updateBefore, disabled: this.disabled, size: this.size, + placement: this.placement, projectId: this.projectId, onUpdate: data => { this.$emit("on-update", data) diff --git a/resources/assets/js/pages/manage/components/TaskMove.vue b/resources/assets/js/pages/manage/components/TaskMove.vue index c206aa7f0..25b5a6b71 100644 --- a/resources/assets/js/pages/manage/components/TaskMove.vue +++ b/resources/assets/js/pages/manage/components/TaskMove.vue @@ -2,21 +2,23 @@
+ v-model="cascader" + :data="cascaderData" + :clearable="false" + :placeholder="$L('请选择项目')" + :load-data="cascaderLoadData" + @on-visible-change="cascaderShow=!cascaderShow" + filterable/>
{{ $L('移动前') }}
{{$L('状态')}}: -
- {{task.flow_item_name}} +
+ {{task.flow_item_name}} + {{$L('已完成')}} + {{$L('未完成')}}
@@ -51,8 +53,8 @@ :color-show="false" :operation-show="false" :load-status="task.loading === true" - @on-update="onStatusUpdate" - /> + placement="bottom-start" + @on-update="onStatusUpdate"/>
{{updateData.flow.flow_item_name}}
@@ -290,8 +292,14 @@ export default { }, onStatusUpdate(val) { - if (val.complete_at && !val.flow_item_id) { - val.flow_item_name = this.$L('已完成'); + if (!val.flow_item_id) { + if (this.updateData.flow.flow_item_name) { + val.flow_item_status = ""; + val.flow_item_name = ""; + } else { + val.flow_item_status = val.complete_at ? 'end' : 'start'; + val.flow_item_name = this.$L(val.complete_at ? '转为已完成' : '转为未完成'); + } } this.tasks.flow_item_id = val.flow_item_id; this.updateData.flow = val diff --git a/resources/assets/js/pages/manage/components/TaskOperation.vue b/resources/assets/js/pages/manage/components/TaskOperation.vue index 9ceaeb671..14e2d5849 100644 --- a/resources/assets/js/pages/manage/components/TaskOperation.vue +++ b/resources/assets/js/pages/manage/components/TaskOperation.vue @@ -5,9 +5,9 @@ trigger="click" :disabled="disabled" :size="size" + :placement="placement" :style="styles" class="general-operation-dropdown" - placement="bottom" @command="dropTask" @visible-change="visibleChange">
@@ -127,6 +127,7 @@ export default { updateBefore: false, disabled: false, size: 'small', + placement: 'bottom', projectId: 0, onUpdate: null, @@ -193,6 +194,7 @@ export default { this.updateBefore = typeof data.updateBefore === "undefined" ? false : data.updateBefore; this.disabled = typeof data.disabled === "undefined" ? false : data.disabled; this.size = typeof data.size === "undefined" ? "small" : data.size; + this.placement = typeof data.placement === "undefined" ? "bottom" : data.placement; this.projectId = typeof data.projectId === "undefined" ? 0 : data.projectId; this.onUpdate = typeof data.onUpdate === "function" ? data.onUpdate : null; //