From 92793b8ff87391bb075080a766fc3978827b329a Mon Sep 17 00:00:00 2001 From: kuaifan Date: Mon, 10 Jan 2022 00:25:36 +0800 Subject: [PATCH] no message --- app/Models/ProjectTask.php | 64 ++++----- resources/assets/js/functions/common.js | 10 +- resources/assets/js/functions/web.js | 18 +++ resources/assets/js/pages/manage/calendar.vue | 1 + .../pages/manage/components/ProjectList.vue | 2 +- .../manage/components/ProjectWorkflow.vue | 9 +- .../js/pages/manage/components/TaskDetail.vue | 33 ++--- .../js/pages/manage/components/TaskMenu.vue | 34 ++--- .../js/pages/manage/components/TaskRow.vue | 2 +- .../assets/js/pages/manage/dashboard.vue | 2 +- resources/assets/js/store/actions.js | 127 +++++++++++++++--- .../pages/components/project-workflow.scss | 11 +- 12 files changed, 218 insertions(+), 95 deletions(-) diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index f51f0889..85910780 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -422,12 +422,13 @@ class ProjectTask extends AbstractModel // 工作流 $projectFlow = ProjectFlow::whereProjectId($project_id)->orderByDesc('id')->first(); if ($projectFlow) { - $turns = ProjectFlowItem::select(['id', 'name', 'status', 'turns'])->whereFlowId($projectFlow->id)->orderBy('sort')->get(); + $projectFlowItem = ProjectFlowItem::whereFlowId($projectFlow->id)->orderBy('sort')->get(); // 赋一个开始状态 - foreach ($turns as $turn) { - if ($turn->status == 'start') { - $task->flow_item_id = $turn->id; - $task->flow_item_name = $turn->status . "|" . $turn->name; + foreach ($projectFlowItem as $item) { + if ($item->status == 'start') { + $task->flow_item_id = $item->id; + $task->flow_item_name = $item->status . "|" . $item->name; + $owner = array_merge($owner, $item->userids); break; } } @@ -435,6 +436,7 @@ class ProjectTask extends AbstractModel // return AbstractModel::transaction(function() use ($times, $subtasks, $content, $owner, $task) { $task->save(); + $owner = array_values(array_unique($owner)); foreach ($owner as $uid) { ProjectTaskUser::createInstance([ 'project_id' => $task->project_id, @@ -599,6 +601,7 @@ class ProjectTask extends AbstractModel } // 计划时间(原则:子任务时间在主任务时间内) if (Arr::exists($data, 'times')) { + $oldAt = [Carbon::parse($this->start_at), Carbon::parse($this->end_at)]; $this->start_at = null; $this->end_at = null; $times = $data['times']; @@ -607,51 +610,48 @@ class ProjectTask extends AbstractModel $start_at = Carbon::parse($start); $end_at = Carbon::parse($end); if ($this->parent_id > 0) { - // 子任务时间处理 + // 判断同步主任务时间(子任务时间 超出 主任务) $mainTask = self::find($this->parent_id); - $isUp = false; if ($mainTask) { - // 超过主任务时间自动同步主任务 - if (empty($mainTask->start_at) || $start_at->lt($mainTask->start_at)) { + $isUp = false; + if ($start_at->lt(Carbon::parse($mainTask->start_at))) { $mainTask->start_at = $start_at; $isUp = true; } - if (empty($mainTask->end_at) || $end_at->gt($mainTask->end_at)) { + if ($end_at->gt(Carbon::parse($mainTask->end_at))) { $mainTask->end_at = $end_at; $isUp = true; } - } - if ($isUp) { - $updateMarking['is_update_maintask'] = true; - $mainTask->addLog("同步修改{任务}时间"); - $mainTask->save(); + if ($isUp) { + $updateMarking['is_update_maintask'] = true; + $mainTask->addLog("同步修改{任务}时间"); + $mainTask->save(); + } } } $this->start_at = $start_at; $this->end_at = $end_at; + } else { + if ($this->parent_id > 0) { + // 清空子任务时间(子任务时间等于主任务时间) + $mainTask = self::find($this->parent_id); + $this->start_at = $mainTask->start_at; + $this->end_at = $mainTask->end_at; + } } if ($this->parent_id == 0) { - // 主任务时间处理 - self::whereParentId($this->id)->chunk(100, function($list) use (&$updateMarking) { + // 判断同步子任务时间(主任务时间 不在 子任务时间 之外) + self::whereParentId($this->id)->chunk(100, function($list) use ($oldAt, &$updateMarking) { /** @var self $subTask */ foreach ($list as $subTask) { + $start_at = Carbon::parse($subTask->start_at); + $end_at = Carbon::parse($subTask->end_at); $isUp = false; - if ($subTask->start_at) { - $subTask->start_at = Carbon::parse($subTask->start_at); - if (empty($this->start_at) || $subTask->start_at->lt($this->start_at)) { - $subTask->start_at = $this->start_at; - $isUp = true; - } - } - if ($subTask->end_at) { - $subTask->end_at = Carbon::parse($subTask->end_at); - if (empty($this->end_at) || $subTask->end_at->gt($this->end_at)) { - $subTask->end_at = $this->end_at; - $isUp = true; - } - } - if ($subTask->start_at && $subTask->end_at && $subTask->start_at->gt($subTask->end_at)) { + if ($start_at->eq($oldAt[0]) || $start_at->lt(Carbon::parse($this->start_at))) { $subTask->start_at = $this->start_at; + $isUp = true; + } + if ($end_at->eq($oldAt[1]) || $end_at->gt(Carbon::parse($this->end_at))) { $subTask->end_at = $this->end_at; $isUp = true; } diff --git a/resources/assets/js/functions/common.js b/resources/assets/js/functions/common.js index 42221657..4c7bd449 100755 --- a/resources/assets/js/functions/common.js +++ b/resources/assets/js/functions/common.js @@ -233,15 +233,19 @@ }, /** - * 返回时间对象 + * 返回 时间对象|时间戳 * @param v - * @returns {Date} + * @param stamp 是否返回时间戳 + * @returns {Date|number} * @constructor */ - Date(v) { + Date(v, stamp = false) { if (typeof v === "string" && this.strExists(v, "-")) { v = v.replace(/-/g, '/'); } + if (stamp === true) { + return Math.round(new Date(v).getTime() / 1000) + } return new Date(v); }, diff --git a/resources/assets/js/functions/web.js b/resources/assets/js/functions/web.js index 8494106c..b6219bb3 100755 --- a/resources/assets/js/functions/web.js +++ b/resources/assets/js/functions/web.js @@ -397,6 +397,9 @@ }, modalConfirm(config, millisecond = 0) { + if (config === false) { + return; + } if (millisecond > 0) { setTimeout(() => { $A.modalConfirm(config) }, millisecond); return; @@ -405,6 +408,9 @@ }, modalSuccess(config, millisecond = 0) { + if (config === false) { + return; + } if (millisecond > 0) { setTimeout(() => { $A.modalSuccess(config) }, millisecond); return; @@ -413,6 +419,9 @@ }, modalInfo(config, millisecond = 0) { + if (config === false) { + return; + } if (millisecond > 0) { setTimeout(() => { $A.modalInfo(config) }, millisecond); return; @@ -421,6 +430,9 @@ }, modalWarning(config, millisecond = 0) { + if (config === false) { + return; + } if (millisecond > 0) { setTimeout(() => { $A.modalWarning(config) }, millisecond); return; @@ -429,6 +441,9 @@ }, modalError(config, millisecond = 0) { + if (config === false) { + return; + } if (millisecond > 0) { setTimeout(() => { $A.modalError(config) }, millisecond); return; @@ -437,6 +452,9 @@ }, modalAlert(msg) { + if (msg === false) { + return; + } alert($A.L(msg)); }, diff --git a/resources/assets/js/pages/manage/calendar.vue b/resources/assets/js/pages/manage/calendar.vue index b696f848..9706bc08 100644 --- a/resources/assets/js/pages/manage/calendar.vue +++ b/resources/assets/js/pages/manage/calendar.vue @@ -355,6 +355,7 @@ export default { $A.messageSuccess(msg); }).catch(({msg}) => { $A.modalError(msg); + this.setRenderRange(); }); } }, diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index dc58f06f..de213c48 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -1116,7 +1116,7 @@ export default { openMenu(task) { const el = this.$refs[`taskMenu_${task.id}`]; if (el) { - el[0].show() + el[0].handleClick() } }, diff --git a/resources/assets/js/pages/manage/components/ProjectWorkflow.vue b/resources/assets/js/pages/manage/components/ProjectWorkflow.vue index 49d0ad1b..db7ab057 100644 --- a/resources/assets/js/pages/manage/components/ProjectWorkflow.vue +++ b/resources/assets/js/pages/manage/components/ProjectWorkflow.vue @@ -73,8 +73,13 @@ - +
+ {{item.userids.length}} + + +
@@ -84,7 +89,7 @@
- {{$L('自动添加负责人')}} + {{$L('自动负责人')}}
diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue index 7fa47389..ec82edae 100644 --- a/resources/assets/js/pages/manage/components/TaskDetail.vue +++ b/resources/assets/js/pages/manage/components/TaskDetail.vue @@ -563,15 +563,16 @@ export default { }, cutTime() { - const {nowTime, taskDetail} = this; - let string = ""; + const {taskDetail} = this; let start_at = Math.round($A.Date(taskDetail.start_at).getTime() / 1000); - if (start_at > nowTime) { - string = $A.formatDate('Y/m/d H:i', start_at) + " ~ " - } let end_at = Math.round($A.Date(taskDetail.end_at).getTime() / 1000); - string+= $A.formatDate('Y/m/d H:i', end_at); - return string; + let string = ""; + if ($A.formatDate('Y/m/d', start_at) == $A.formatDate('Y/m/d', end_at)) { + string = $A.formatDate('Y/m/d H:i', start_at) + " ~ " + $A.formatDate('H:i', end_at) + } else { + string = $A.formatDate('Y/m/d H:i', start_at) + " ~ " + $A.formatDate('Y/m/d H:i', end_at) + } + return string.replace(/( 00:00| 23:59)/g, "") }, getOwner() { @@ -724,10 +725,8 @@ export default { if (Object.keys(dataJson).length <= 1) return; // this.$store.dispatch("taskUpdate", dataJson).then(({msg}) => { - // 更新成功 $A.messageSuccess(msg); }).catch(({msg}) => { - // 更新失败 $A.modalError(msg); }) }, @@ -852,17 +851,11 @@ export default { }, timeClear() { - $A.modalConfirm({ - content: '你确定要取消任务时间吗?', - cancelText: '不是', - onOk: () => { - this.updateData('times', { - start_at: false, - end_at: false, - }); - this.timeOpen = false; - } + this.updateData('times', { + start_at: false, + end_at: false, }); + this.timeOpen = false; }, timeOk() { @@ -1056,7 +1049,7 @@ export default { openMenu(task) { const el = this.$refs[`taskMenu_${task.id}`]; if (el) { - el.show() + el.handleClick() } }, diff --git a/resources/assets/js/pages/manage/components/TaskMenu.vue b/resources/assets/js/pages/manage/components/TaskMenu.vue index 797adc16..937568e0 100644 --- a/resources/assets/js/pages/manage/components/TaskMenu.vue +++ b/resources/assets/js/pages/manage/components/TaskMenu.vue @@ -148,6 +148,10 @@ export default { this.$refs.dropdown.hide() }, + handleClick() { + this.$refs.dropdown.handleClick() + }, + dropTask(command) { if ($A.isJson(command)) { if (command.name) { @@ -196,23 +200,19 @@ export default { }, updateTask(updata) { - return new Promise((resolve, reject) => { - if (this.loadIng) { - reject() - return; - } - // - Object.keys(updata).forEach(key => this.$set(this.task, key, updata[key])); - // - this.$store.dispatch("taskUpdate", Object.assign(updata, { - task_id: this.task.id, - })).then(() => { - resolve() - }).catch(({msg}) => { - $A.modalError(msg); - this.$store.dispatch("getTaskOne", this.task.id); - reject() - }); + if (this.loadIng) { + return; + } + // + Object.keys(updata).forEach(key => this.$set(this.task, key, updata[key])); + // + this.$store.dispatch("taskUpdate", Object.assign(updata, { + task_id: this.task.id, + })).then(({msg}) => { + $A.messageSuccess(msg); + }).catch(({msg}) => { + $A.modalError(msg); + this.$store.dispatch("getTaskOne", this.task.id); }); }, diff --git a/resources/assets/js/pages/manage/components/TaskRow.vue b/resources/assets/js/pages/manage/components/TaskRow.vue index 36947338..5ac01c1f 100644 --- a/resources/assets/js/pages/manage/components/TaskRow.vue +++ b/resources/assets/js/pages/manage/components/TaskRow.vue @@ -248,7 +248,7 @@ export default { openMenu(task) { const el = this.$refs[`taskMenu_${task.id}`]; if (el) { - el[0].show() + el[0].handleClick() } }, diff --git a/resources/assets/js/pages/manage/dashboard.vue b/resources/assets/js/pages/manage/dashboard.vue index 8d94e4a1..e230b530 100644 --- a/resources/assets/js/pages/manage/dashboard.vue +++ b/resources/assets/js/pages/manage/dashboard.vue @@ -148,7 +148,7 @@ export default { openMenu(task) { const el = this.$refs[`taskMenu_${task.id}`]; if (el) { - el[0].show() + el[0].handleClick() } }, diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 76295dad..280090ce 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -1380,22 +1380,119 @@ export default { */ taskUpdate({state, dispatch}, data) { return new Promise(function (resolve, reject) { - const post = $A.cloneJSON($A.date2string(data)); + dispatch("taskBeforeUpdate", data).then(post => { + dispatch("taskLoadStart", post.task_id) + dispatch("call", { + url: 'project/task/update', + data: post, + method: 'post', + }).then(result => { + dispatch("taskLoadEnd", post.task_id) + dispatch("saveTask", result.data) + resolve(result) + }).catch(e => { + console.error(e); + dispatch("taskLoadEnd", post.task_id) + dispatch("getTaskOne", post.task_id); + reject(e) + }); + }).catch(reject) + }); + }, + + /** + * 更新任务之前判断 + * @param state + * @param dispatch + * @param data + * @returns {Promise} + */ + taskBeforeUpdate({state, dispatch}, data) { + return new Promise(function (resolve, reject) { + let post = $A.cloneJSON($A.date2string(data)); + let title = "温馨提示"; + let content = null; + // 修改时间前置判断 + if (typeof post.times !== "undefined") { + if (data.times[0] === false) { + content = "你确定要取消任务时间吗?" + } + const currentTask = state.cacheTasks.find(({id}) => id == post.task_id); + title = currentTask.parent_id > 0 ? "更新子任务" : "更新主任务" + if (currentTask) { + if (currentTask.parent_id > 0) { + // 修改子任务,判断主任务 + if (post.times[0]) { + state.cacheTasks.some(parentTask => { + if (parentTask.id != currentTask.parent_id) { + return false; + } + if (!parentTask.end_at) { + content = "主任务没有设置时间,设置子任务将同步设置主任务" + return true; + } + let n1 = $A.Date(post.times[0], true), + n2 = $A.Date(post.times[1], true), + o1 = $A.Date(parentTask.start_at, true), + o2 = $A.Date(parentTask.end_at, true); + if (n1 < o1) { + content = "新设置的子任务开始时间在主任务时间之外,修改后将同步修改主任务" // 子任务开始时间 < 主任务开始时间 + return true; + } + if (n2 > o2) { + content = "新设置的子任务结束时间在主任务时间之外,修改后将同步修改主任务" // 子任务结束时间 > 主任务结束时间 + return true; + } + }) + } + } else { + // 修改主任务,判断子任务 + state.cacheTasks.some(subTask => { + if (subTask.parent_id != currentTask.id) { + return false; + } + if (!subTask.end_at) { + return false; + } + let n1 = $A.Date(post.times[0], true), + n2 = $A.Date(post.times[1], true), + c1 = $A.Date(currentTask.start_at, true), + c2 = $A.Date(currentTask.end_at, true), + o1 = $A.Date(subTask.start_at, true), + o2 = $A.Date(subTask.end_at, true); + if (c1 == o1 && c2 == o2) { + return false; + } + if (!post.times[0]) { + content = `子任务(${subTask.name})已设置时间,清除主任务时间后将同步清除子任务的时间` + return true; + } + if (n1 > o1) { + content = `新设置的开始时间在子任务(${subTask.name})时间之内,修改后将同步修改子任务` // 主任务开始时间 > 子任务开始时间 + return true; + } + if (n2 < o2) { + content = `新设置的结束时间在子任务(${subTask.name})时间之内,修改后将同步修改子任务` // 主任务结束时间 < 子任务结束时间 + return true; + } + }) + } + } + } // - dispatch("taskLoadStart", post.task_id) - dispatch("call", { - url: 'project/task/update', - data: post, - method: 'post', - }).then(result => { - dispatch("taskLoadEnd", post.task_id) - dispatch("saveTask", result.data) - resolve(result) - }).catch(e => { - console.error(e); - dispatch("taskLoadEnd", post.task_id) - dispatch("getTaskOne", post.task_id); - reject(e) + if (content === null) { + resolve(post); + return + } + $A.modalConfirm({ + title, + content, + onOk: () => { + resolve(post); + }, + onCancel: () => { + reject({msg: false}) + } }); }); }, diff --git a/resources/assets/sass/pages/components/project-workflow.scss b/resources/assets/sass/pages/components/project-workflow.scss index 6c27fe37..041ac17b 100644 --- a/resources/assets/sass/pages/components/project-workflow.scss +++ b/resources/assets/sass/pages/components/project-workflow.scss @@ -397,13 +397,18 @@ display: flex; align-items: center; justify-content: center; - width: 36px; + width: 38px; font-size: 18px; - opacity: 0; - transition: opacity 0.2s; + font-weight: normal !important; + opacity: 0.2; + transition: opacity 0.3s; &.opacity { opacity: 1; } + .more-icon { + display: flex; + align-items: center; + } } }