no message

This commit is contained in:
kuaifan 2022-01-10 00:25:36 +08:00
parent 982024f359
commit 92793b8ff8
12 changed files with 218 additions and 95 deletions

View File

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

View File

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

View File

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

View File

@ -355,6 +355,7 @@ export default {
$A.messageSuccess(msg);
}).catch(({msg}) => {
$A.modalError(msg);
this.setRenderRange();
});
}
},

View File

@ -1116,7 +1116,7 @@ export default {
openMenu(task) {
const el = this.$refs[`taskMenu_${task.id}`];
if (el) {
el[0].show()
el[0].handleClick()
}
},

View File

@ -73,8 +73,13 @@
<EDropdown
trigger="click"
class="more"
:class="{opacity: item.userids.length > 0}"
@command="onMore($event, item)">
<Icon type="ios-more" />
<div class="more-icon">
<EAvatar v-if="item.userids.length > 1" :size="20">{{item.userids.length}}</EAvatar>
<UserAvatar v-else-if="item.userids.length > 0" :userid="item.userids[0]" :size="20" tooltipDisabled/>
<Icon v-else type="ios-more" />
</div>
<EDropdownMenu slot="dropdown" class="taskflow-config-more-dropdown-menu">
<EDropdownItem v-if="item.userids.length > 0" command="user">
<div class="users">
@ -84,7 +89,7 @@
<EDropdownItem command="user">
<div class="item">
<Icon type="md-person" />
{{$L('自动添加负责人')}}
{{$L('自动负责人')}}
</div>
</EDropdownItem>
<EDropdownItem command="name">

View File

@ -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()
}
},

View File

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

View File

@ -248,7 +248,7 @@ export default {
openMenu(task) {
const el = this.$refs[`taskMenu_${task.id}`];
if (el) {
el[0].show()
el[0].handleClick()
}
},

View File

@ -148,7 +148,7 @@ export default {
openMenu(task) {
const el = this.$refs[`taskMenu_${task.id}`];
if (el) {
el[0].show()
el[0].handleClick()
}
},

View File

@ -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<unknown>}
*/
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})
}
});
});
},

View File

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