no message
This commit is contained in:
parent
982024f359
commit
92793b8ff8
@ -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;
|
||||
}
|
||||
|
10
resources/assets/js/functions/common.js
vendored
10
resources/assets/js/functions/common.js
vendored
@ -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);
|
||||
},
|
||||
|
||||
|
18
resources/assets/js/functions/web.js
vendored
18
resources/assets/js/functions/web.js
vendored
@ -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));
|
||||
},
|
||||
|
||||
|
@ -355,6 +355,7 @@ export default {
|
||||
$A.messageSuccess(msg);
|
||||
}).catch(({msg}) => {
|
||||
$A.modalError(msg);
|
||||
this.setRenderRange();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
@ -1116,7 +1116,7 @@ export default {
|
||||
openMenu(task) {
|
||||
const el = this.$refs[`taskMenu_${task.id}`];
|
||||
if (el) {
|
||||
el[0].show()
|
||||
el[0].handleClick()
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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()
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -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);
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -248,7 +248,7 @@ export default {
|
||||
openMenu(task) {
|
||||
const el = this.$refs[`taskMenu_${task.id}`];
|
||||
if (el) {
|
||||
el[0].show()
|
||||
el[0].handleClick()
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -148,7 +148,7 @@ export default {
|
||||
openMenu(task) {
|
||||
const el = this.$refs[`taskMenu_${task.id}`];
|
||||
if (el) {
|
||||
el[0].show()
|
||||
el[0].handleClick()
|
||||
}
|
||||
},
|
||||
|
||||
|
127
resources/assets/js/store/actions.js
vendored
127
resources/assets/js/store/actions.js
vendored
@ -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})
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user