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'">
<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"/>

View File

@ -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">&#xe6f5;</i>

View File

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

View File

@ -31,10 +31,10 @@
<i class="taskfont">&#xe603;</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">&#xe6f9;</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">&#xe702;</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('协助的任务');

View File

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