mirror of
https://github.com/kuaifan/dootask.git
synced 2026-01-04 02:38:11 +00:00
perf: 优化仪表盘任务避免重复统计
This commit is contained in:
parent
c16f316200
commit
7fedb7d275
@ -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"/>
|
||||||
|
|||||||
@ -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"></i>
|
<i class="taskfont"></i>
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -31,10 +31,10 @@
|
|||||||
<i class="taskfont"></i>
|
<i class="taskfont"></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"></i>
|
<i class="taskfont"></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"></i>
|
<i class="taskfont"></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('协助的任务');
|
||||||
|
|||||||
113
resources/assets/js/store/getters.js
vendored
113
resources/assets/js/store/getters.js
vendored
@ -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;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user