mirror of
https://github.com/kuaifan/dootask.git
synced 2026-01-02 17:28:17 +00:00
perf: 优化仪表盘任务避免重复统计
This commit is contained in:
parent
c16f316200
commit
7fedb7d275
@ -8,7 +8,7 @@
|
||||
<template v-if="item.name === 'dashboard'">
|
||||
<Badge v-if="dashboardTask.overdue_count > 0" class="tabbar-badge" type="error" :overflow-count="999" :count="dashboardTask.overdue_count"/>
|
||||
<Badge v-else-if="dashboardTask.today_count > 0" class="tabbar-badge" type="info" :overflow-count="999" :count="dashboardTask.today_count"/>
|
||||
<Badge v-else-if="dashboardTask.all_count > 0" class="tabbar-badge" type="primary" :overflow-count="999" :count="dashboardTask.all_count"/>
|
||||
<Badge v-else-if="dashboardTask.todo_count > 0" class="tabbar-badge" type="primary" :overflow-count="999" :count="dashboardTask.todo_count"/>
|
||||
</template>
|
||||
<template v-else-if="item.name === 'dialog'">
|
||||
<Badge class="tabbar-badge" :overflow-count="999" :text="msgUnreadMention"/>
|
||||
|
||||
@ -100,7 +100,7 @@
|
||||
<div class="menu-title">{{$L('仪表盘')}}</div>
|
||||
<Badge v-if="dashboardTask.overdue_count > 0" class="menu-badge" type="error" :overflow-count="999" :count="dashboardTask.overdue_count"/>
|
||||
<Badge v-else-if="dashboardTask.today_count > 0" class="menu-badge" type="info" :overflow-count="999" :count="dashboardTask.today_count"/>
|
||||
<Badge v-else-if="dashboardTask.all_count > 0" class="menu-badge" type="primary" :overflow-count="999" :count="dashboardTask.all_count"/>
|
||||
<Badge v-else-if="dashboardTask.todo_count > 0" class="menu-badge" type="primary" :overflow-count="999" :count="dashboardTask.todo_count"/>
|
||||
</li>
|
||||
<li @click="toggleRoute('calendar')" :class="classNameRoute('calendar')">
|
||||
<i class="taskfont"></i>
|
||||
|
||||
@ -1685,14 +1685,16 @@ export default {
|
||||
})
|
||||
}
|
||||
// 待完成任务
|
||||
let dataA = this.$store.getters.transforTasks(this.$store.getters.dashboardTask['all']);
|
||||
if (dataA.length > 0) {
|
||||
dataA = dataA.sort((a, b) => {
|
||||
const { overdue, today, todo } = this.$store.getters.dashboardTask;
|
||||
const combinedTasks = [...overdue, ...today, ...todo];
|
||||
let allTask = this.$store.getters.transforTasks(combinedTasks);
|
||||
if (allTask.length > 0) {
|
||||
allTask = allTask.sort((a, b) => {
|
||||
return $A.dayjs(a.end_at || "2099-12-31 23:59:59") - $A.dayjs(b.end_at || "2099-12-31 23:59:59");
|
||||
}).splice(0, 100)
|
||||
this.taskList.push({
|
||||
label: [{id: 0, value: this.$L('我的待完成任务'), disabled: true}],
|
||||
list: dataA.map(item => {
|
||||
list: allTask.map(item => {
|
||||
return {
|
||||
id: item.id,
|
||||
value: item.name
|
||||
@ -1701,14 +1703,14 @@ export default {
|
||||
})
|
||||
}
|
||||
// 我协助的任务
|
||||
let dataB = this.$store.getters.assistTask;
|
||||
if (dataB.length > 0) {
|
||||
dataB = dataB.sort((a, b) => {
|
||||
let assistTask = this.$store.getters.assistTask;
|
||||
if (assistTask.length > 0) {
|
||||
assistTask = assistTask.sort((a, b) => {
|
||||
return $A.dayjs(a.end_at || "2099-12-31 23:59:59") - $A.dayjs(b.end_at || "2099-12-31 23:59:59");
|
||||
}).splice(0, 100)
|
||||
this.taskList.push({
|
||||
label: [{id: 0, value: this.$L('我协助的任务'), disabled: true}],
|
||||
list: dataB.map(item => {
|
||||
list: assistTask.map(item => {
|
||||
return {
|
||||
id: item.id,
|
||||
value: item.name
|
||||
|
||||
@ -31,10 +31,10 @@
|
||||
<i class="taskfont"></i>
|
||||
</div>
|
||||
</li>
|
||||
<li @click="scrollTo('all')">
|
||||
<div class="block-title">{{getTitle('all')}}</div>
|
||||
<li @click="scrollTo('todo')">
|
||||
<div class="block-title">{{getTitle('todo')}}</div>
|
||||
<div class="block-data">
|
||||
<div class="block-num">{{dashboardTask.all_count}}</div>
|
||||
<div class="block-num">{{dashboardTask.todo_count}}</div>
|
||||
<i class="taskfont"></i>
|
||||
</div>
|
||||
</li>
|
||||
@ -48,7 +48,7 @@
|
||||
<span>
|
||||
{{column.title}}
|
||||
<template v-if="column.hidden">
|
||||
({{column.list.length}})
|
||||
({{column.count}})
|
||||
</template>
|
||||
</span>
|
||||
<i class="taskfont"></i>
|
||||
@ -147,14 +147,15 @@ export default {
|
||||
return this.$route.name
|
||||
},
|
||||
|
||||
columns({hiddenColumns}) {
|
||||
columns({hiddenColumns, dashboardTask, assistTask}) {
|
||||
const list = [];
|
||||
['today', 'overdue', 'all'].some(type => {
|
||||
let data = this.transforTasks(this.dashboardTask[type]);
|
||||
['today', 'overdue', 'todo'].some(type => {
|
||||
let data = this.transforTasks(dashboardTask[type]);
|
||||
list.push({
|
||||
type,
|
||||
title: this.getTitle(type),
|
||||
hidden: hiddenColumns.includes(type),
|
||||
count: dashboardTask[`${type}_count`],
|
||||
list: data.sort((a, b) => {
|
||||
return $A.dayjs(a.end_at || "2099-12-31 23:59:59") - $A.dayjs(b.end_at || "2099-12-31 23:59:59");
|
||||
})
|
||||
@ -164,7 +165,8 @@ export default {
|
||||
type: 'assist',
|
||||
title: this.getTitle('assist'),
|
||||
hidden: hiddenColumns.includes('assist'),
|
||||
list: this.assistTask.sort((a, b) => {
|
||||
count: assistTask.length,
|
||||
list: assistTask.sort((a, b) => {
|
||||
return $A.dayjs(a.end_at || "2099-12-31 23:59:59") - $A.dayjs(b.end_at || "2099-12-31 23:59:59");
|
||||
})
|
||||
})
|
||||
@ -173,7 +175,7 @@ export default {
|
||||
|
||||
total() {
|
||||
const {dashboardTask} = this;
|
||||
return dashboardTask.today_count + dashboardTask.overdue_count + dashboardTask.all_count;
|
||||
return dashboardTask.today_count + dashboardTask.overdue_count + dashboardTask.todo_count;
|
||||
},
|
||||
|
||||
wrapperStyle({warningMsg}) {
|
||||
@ -203,7 +205,7 @@ export default {
|
||||
return this.$L('今日到期');
|
||||
case 'overdue':
|
||||
return this.$L('超期任务');
|
||||
case 'all':
|
||||
case 'todo':
|
||||
return this.$L('待完成任务');
|
||||
case 'assist':
|
||||
return this.$L('协助的任务');
|
||||
|
||||
113
resources/assets/js/store/getters.js
vendored
113
resources/assets/js/store/getters.js
vendored
@ -111,17 +111,25 @@ export default {
|
||||
/**
|
||||
* 仪表盘任务数据
|
||||
* @param state
|
||||
* @returns {{overdue: *, today: *,all:*}}
|
||||
* @returns {{
|
||||
* overdue: Array, // 超期任务列表
|
||||
* overdue_count: number, // 超期任务数量
|
||||
* today: Array, // 今日任务列表
|
||||
* today_count: number, // 今日任务数量
|
||||
* todo: Array, // 待办任务列表
|
||||
* todo_count: number // 待办任务数量
|
||||
* }}
|
||||
*/
|
||||
dashboardTask(state) {
|
||||
const todayStart = $A.daytz().startOf('day'),
|
||||
todayEnd = $A.daytz().endOf('day'),
|
||||
todayNow = $A.daytz();
|
||||
const filterTask = (task, chackCompleted = true) => {
|
||||
|
||||
const filterTask = (task, checkCompleted = true) => {
|
||||
if (task.archived_at) {
|
||||
return false;
|
||||
}
|
||||
if (task.complete_at && chackCompleted === true) {
|
||||
if (task.complete_at && checkCompleted === true) {
|
||||
return false;
|
||||
}
|
||||
if (task.start_at && $A.dayjs(task.start_at) > todayNow) {
|
||||
@ -129,64 +137,105 @@ export default {
|
||||
}
|
||||
return task.owner == 1;
|
||||
}
|
||||
|
||||
// 获取所有未完成的任务
|
||||
let array = state.cacheTasks.filter(task => filterTask(task));
|
||||
|
||||
// 处理临时完成的任务
|
||||
let tmpCount = 0;
|
||||
if (state.taskCompleteTemps.length > 0) {
|
||||
let tmps = state.cacheTasks.filter(task => state.taskCompleteTemps.includes(task.id) && filterTask(task, false));
|
||||
if (tmps.length > 0) {
|
||||
tmpCount = tmps.length
|
||||
array = $A.cloneJSON(array)
|
||||
tmpCount = tmps.length;
|
||||
array = $A.cloneJSON(array);
|
||||
array.push(...tmps);
|
||||
}
|
||||
}
|
||||
const todayTasks = array.filter(task => {
|
||||
const end = $A.dayjs(task.end_at);
|
||||
return todayStart <= end && end <= todayEnd;
|
||||
})
|
||||
const overdueTasks = array.filter(task => {
|
||||
return task.end_at && $A.dayjs(task.end_at) <= todayNow;
|
||||
})
|
||||
|
||||
// 使用一次遍历完成任务分类
|
||||
const result = {
|
||||
today: todayTasks,
|
||||
today_count: todayTasks.length,
|
||||
|
||||
overdue: overdueTasks,
|
||||
overdue_count: overdueTasks.length,
|
||||
|
||||
all: array,
|
||||
all_count: array.length,
|
||||
overdue: [],
|
||||
today: [],
|
||||
todo: [],
|
||||
overdue_count: 0,
|
||||
today_count: 0,
|
||||
todo_count: 0
|
||||
};
|
||||
if (tmpCount > 0) {
|
||||
result.today_count -= todayTasks.filter(task => state.taskCompleteTemps.includes(task.id)).length
|
||||
result.overdue_count -= overdueTasks.filter(task => state.taskCompleteTemps.includes(task.id)).length
|
||||
result.all_count -= tmpCount
|
||||
}
|
||||
return result
|
||||
|
||||
// 遍历任务进行分类
|
||||
array.forEach(task => {
|
||||
const isTemp = state.taskCompleteTemps.includes(task.id);
|
||||
|
||||
if (task.end_at && $A.dayjs(task.end_at) <= todayNow) {
|
||||
// 超期任务
|
||||
result.overdue.push(task);
|
||||
if (!isTemp) {
|
||||
result.overdue_count++;
|
||||
}
|
||||
} else if (task.end_at) {
|
||||
const end = $A.dayjs(task.end_at);
|
||||
if (todayStart <= end && end <= todayEnd) {
|
||||
// 今日任务
|
||||
result.today.push(task);
|
||||
if (!isTemp) {
|
||||
result.today_count++;
|
||||
}
|
||||
} else {
|
||||
// 待办任务
|
||||
result.todo.push(task);
|
||||
if (!isTemp) {
|
||||
result.todo_count++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 无截止日期的任务归类为待办
|
||||
result.todo.push(task);
|
||||
if (!isTemp) {
|
||||
result.todo_count++;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
/**
|
||||
* 协助任务
|
||||
* @param state
|
||||
* @returns {*}
|
||||
* @returns {Array} // 协助任务列表
|
||||
*/
|
||||
assistTask(state) {
|
||||
const filterTask = (task, chackCompleted = true) => {
|
||||
const filterTask = (task, checkCompleted = true) => {
|
||||
if (task.archived_at) {
|
||||
return false;
|
||||
}
|
||||
if (task.complete_at && chackCompleted === true) {
|
||||
if (task.complete_at && checkCompleted === true) {
|
||||
return false;
|
||||
}
|
||||
return task.assist && task.owner === 0;
|
||||
}
|
||||
|
||||
// 获取所有未完成的协助任务
|
||||
let array = state.cacheTasks.filter(task => filterTask(task));
|
||||
|
||||
// 处理临时完成的任务
|
||||
if (state.taskCompleteTemps.length > 0) {
|
||||
let tmps = state.cacheTasks.filter(task => state.taskCompleteTemps.includes(task.id) && filterTask(task, false));
|
||||
const tmps = state.cacheTasks.filter(task =>
|
||||
state.taskCompleteTemps.includes(task.id) &&
|
||||
filterTask(task, false)
|
||||
);
|
||||
|
||||
if (tmps.length > 0) {
|
||||
array = $A.cloneJSON(array)
|
||||
array = $A.cloneJSON(array);
|
||||
array.push(...tmps);
|
||||
}
|
||||
}
|
||||
return array
|
||||
|
||||
// 按截止时间排序:无截止时间的任务排在最后
|
||||
return array.sort((a, b) => {
|
||||
const timeA = a.end_at ? $A.dayjs(a.end_at) : $A.dayjs('2099-12-31 23:59:59');
|
||||
const timeB = b.end_at ? $A.dayjs(b.end_at) : $A.dayjs('2099-12-31 23:59:59');
|
||||
return timeA - timeB;
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user