perf: 优化仪表盘任务避免重复统计

This commit is contained in:
kuaifan 2024-12-03 09:14:55 +08:00
parent c16f316200
commit 7fedb7d275
5 changed files with 105 additions and 52 deletions

View File

@ -8,7 +8,7 @@
<template v-if="item.name === 'dashboard'"> <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-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.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>
<template v-else-if="item.name === 'dialog'"> <template v-else-if="item.name === 'dialog'">
<Badge class="tabbar-badge" :overflow-count="999" :text="msgUnreadMention"/> <Badge class="tabbar-badge" :overflow-count="999" :text="msgUnreadMention"/>

View File

@ -100,7 +100,7 @@
<div class="menu-title">{{$L('仪表盘')}}</div> <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-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.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>
<li @click="toggleRoute('calendar')" :class="classNameRoute('calendar')"> <li @click="toggleRoute('calendar')" :class="classNameRoute('calendar')">
<i class="taskfont">&#xe6f5;</i> <i class="taskfont">&#xe6f5;</i>

View File

@ -1685,14 +1685,16 @@ export default {
}) })
} }
// //
let dataA = this.$store.getters.transforTasks(this.$store.getters.dashboardTask['all']); const { overdue, today, todo } = this.$store.getters.dashboardTask;
if (dataA.length > 0) { const combinedTasks = [...overdue, ...today, ...todo];
dataA = dataA.sort((a, b) => { 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"); 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) }).splice(0, 100)
this.taskList.push({ this.taskList.push({
label: [{id: 0, value: this.$L('我的待完成任务'), disabled: true}], label: [{id: 0, value: this.$L('我的待完成任务'), disabled: true}],
list: dataA.map(item => { list: allTask.map(item => {
return { return {
id: item.id, id: item.id,
value: item.name value: item.name
@ -1701,14 +1703,14 @@ export default {
}) })
} }
// //
let dataB = this.$store.getters.assistTask; let assistTask = this.$store.getters.assistTask;
if (dataB.length > 0) { if (assistTask.length > 0) {
dataB = dataB.sort((a, b) => { 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"); 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) }).splice(0, 100)
this.taskList.push({ this.taskList.push({
label: [{id: 0, value: this.$L('我协助的任务'), disabled: true}], label: [{id: 0, value: this.$L('我协助的任务'), disabled: true}],
list: dataB.map(item => { list: assistTask.map(item => {
return { return {
id: item.id, id: item.id,
value: item.name value: item.name

View File

@ -31,10 +31,10 @@
<i class="taskfont">&#xe603;</i> <i class="taskfont">&#xe603;</i>
</div> </div>
</li> </li>
<li @click="scrollTo('all')"> <li @click="scrollTo('todo')">
<div class="block-title">{{getTitle('all')}}</div> <div class="block-title">{{getTitle('todo')}}</div>
<div class="block-data"> <div class="block-data">
<div class="block-num">{{dashboardTask.all_count}}</div> <div class="block-num">{{dashboardTask.todo_count}}</div>
<i class="taskfont">&#xe6f9;</i> <i class="taskfont">&#xe6f9;</i>
</div> </div>
</li> </li>
@ -48,7 +48,7 @@
<span> <span>
{{column.title}} {{column.title}}
<template v-if="column.hidden"> <template v-if="column.hidden">
({{column.list.length}}) ({{column.count}})
</template> </template>
</span> </span>
<i class="taskfont">&#xe702;</i> <i class="taskfont">&#xe702;</i>
@ -147,14 +147,15 @@ export default {
return this.$route.name return this.$route.name
}, },
columns({hiddenColumns}) { columns({hiddenColumns, dashboardTask, assistTask}) {
const list = []; const list = [];
['today', 'overdue', 'all'].some(type => { ['today', 'overdue', 'todo'].some(type => {
let data = this.transforTasks(this.dashboardTask[type]); let data = this.transforTasks(dashboardTask[type]);
list.push({ list.push({
type, type,
title: this.getTitle(type), title: this.getTitle(type),
hidden: hiddenColumns.includes(type), hidden: hiddenColumns.includes(type),
count: dashboardTask[`${type}_count`],
list: data.sort((a, b) => { 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"); 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', type: 'assist',
title: this.getTitle('assist'), title: this.getTitle('assist'),
hidden: hiddenColumns.includes('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"); 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() { total() {
const {dashboardTask} = this; 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}) { wrapperStyle({warningMsg}) {
@ -203,7 +205,7 @@ export default {
return this.$L('今日到期'); return this.$L('今日到期');
case 'overdue': case 'overdue':
return this.$L('超期任务'); return this.$L('超期任务');
case 'all': case 'todo':
return this.$L('待完成任务'); return this.$L('待完成任务');
case 'assist': case 'assist':
return this.$L('协助的任务'); return this.$L('协助的任务');

View File

@ -111,17 +111,25 @@ export default {
/** /**
* 仪表盘任务数据 * 仪表盘任务数据
* @param state * @param state
* @returns {{overdue: *, today: *,all:*}} * @returns {{
* overdue: Array, // 超期任务列表
* overdue_count: number, // 超期任务数量
* today: Array, // 今日任务列表
* today_count: number, // 今日任务数量
* todo: Array, // 待办任务列表
* todo_count: number // 待办任务数量
* }}
*/ */
dashboardTask(state) { dashboardTask(state) {
const todayStart = $A.daytz().startOf('day'), const todayStart = $A.daytz().startOf('day'),
todayEnd = $A.daytz().endOf('day'), todayEnd = $A.daytz().endOf('day'),
todayNow = $A.daytz(); todayNow = $A.daytz();
const filterTask = (task, chackCompleted = true) => {
const filterTask = (task, checkCompleted = true) => {
if (task.archived_at) { if (task.archived_at) {
return false; return false;
} }
if (task.complete_at && chackCompleted === true) { if (task.complete_at && checkCompleted === true) {
return false; return false;
} }
if (task.start_at && $A.dayjs(task.start_at) > todayNow) { if (task.start_at && $A.dayjs(task.start_at) > todayNow) {
@ -129,64 +137,105 @@ export default {
} }
return task.owner == 1; return task.owner == 1;
} }
// 获取所有未完成的任务
let array = state.cacheTasks.filter(task => filterTask(task)); let array = state.cacheTasks.filter(task => filterTask(task));
// 处理临时完成的任务
let tmpCount = 0; let tmpCount = 0;
if (state.taskCompleteTemps.length > 0) { if (state.taskCompleteTemps.length > 0) {
let tmps = state.cacheTasks.filter(task => state.taskCompleteTemps.includes(task.id) && filterTask(task, false)); let tmps = state.cacheTasks.filter(task => state.taskCompleteTemps.includes(task.id) && filterTask(task, false));
if (tmps.length > 0) { if (tmps.length > 0) {
tmpCount = tmps.length tmpCount = tmps.length;
array = $A.cloneJSON(array) array = $A.cloneJSON(array);
array.push(...tmps); 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 = { const result = {
today: todayTasks, overdue: [],
today_count: todayTasks.length, today: [],
todo: [],
overdue: overdueTasks, overdue_count: 0,
overdue_count: overdueTasks.length, today_count: 0,
todo_count: 0
all: array,
all_count: array.length,
}; };
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 array.forEach(task => {
result.all_count -= tmpCount const isTemp = state.taskCompleteTemps.includes(task.id);
}
return result 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 * @param state
* @returns {*} * @returns {Array} // 协助任务列表
*/ */
assistTask(state) { assistTask(state) {
const filterTask = (task, chackCompleted = true) => { const filterTask = (task, checkCompleted = true) => {
if (task.archived_at) { if (task.archived_at) {
return false; return false;
} }
if (task.complete_at && chackCompleted === true) { if (task.complete_at && checkCompleted === true) {
return false; return false;
} }
return task.assist && task.owner === 0; return task.assist && task.owner === 0;
} }
// 获取所有未完成的协助任务
let array = state.cacheTasks.filter(task => filterTask(task)); let array = state.cacheTasks.filter(task => filterTask(task));
// 处理临时完成的任务
if (state.taskCompleteTemps.length > 0) { 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) { if (tmps.length > 0) {
array = $A.cloneJSON(array) array = $A.cloneJSON(array);
array.push(...tmps); 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;
});
}, },
} }