feat: 阶段性事项列表增加各阶段任务数量显示

This commit is contained in:
xiaozzzi 2024-01-20 22:29:05 +08:00
parent fa0d86e1d3
commit 042ec82489
6 changed files with 53 additions and 20 deletions

View File

@ -41,19 +41,34 @@ public class TodoService extends ServiceImpl<TodoMapper, TodoEntity> {
public TodoGroupRes listTodo() { public TodoGroupRes listTodo() {
List<TodoEntity> todos = baseMapper.listTodo(AuthContext.getUserId()); List<TodoEntity> todos = baseMapper.listTodo(AuthContext.getUserId());
TodoGroupRes res = TodoGroupRes.build(); TodoGroupRes res = TodoGroupRes.build();
for (TodoEntity todo : todos) {
TodoGroupRes.TodoGroup group = todo.to(TodoGroupRes.TodoGroup.class); Map<String, List<TodoEntity>> map = todos.stream().collect(Collectors.groupingBy(TodoEntity::getTodoId));
if (TodoTypeEnum.DAY.getType().equals(todo.getTodoType())) { map.forEach((todoId, data) -> {
TodoGroupRes.TodoGroup group = data.get(0).to(TodoGroupRes.TodoGroup.class);
Map<String, List<TodoEntity>> taskStatusMap = data.stream().collect(Collectors.groupingBy(TodoEntity::getTaskStatus));
int w = 0, p = 0, c = 0;
if (CollUtil.isNotEmpty(taskStatusMap.get(TaskStatusEnum.WAITING.name()))) {
w = taskStatusMap.get(TaskStatusEnum.WAITING.name()).get(0).getTaskCount();
}
if (CollUtil.isNotEmpty(taskStatusMap.get(TaskStatusEnum.PROCESSING.name()))) {
p = taskStatusMap.get(TaskStatusEnum.PROCESSING.name()).get(0).getTaskCount();
}
if (CollUtil.isNotEmpty(taskStatusMap.get(TaskStatusEnum.COMPLETED.name()))) {
c = taskStatusMap.get(TaskStatusEnum.COMPLETED.name()).get(0).getTaskCount();
}
group.setTaskCountStat(String.format("%d|%d|%d", w, p, c));
if (TodoTypeEnum.DAY.getType().equals(data.get(0).getTodoType())) {
res.getTodoDays().put(group.getTodoId(), group); res.getTodoDays().put(group.getTodoId(), group);
} else { } else {
// 未完成的阶段性事项 // 未完成的阶段性事项
if (TodoStatusEnum.OPEN.getType().equals(todo.getTodoStatus())) { if (TodoStatusEnum.OPEN.getType().equals(data.get(0).getTodoStatus())) {
res.getTaskPhased().add(group); res.getTaskPhased().add(group);
} else { } else {
res.getTaskPhasedClose().add(group); res.getTaskPhasedClose().add(group);
} }
} }
} });
return res; return res;
} }

View File

@ -55,6 +55,10 @@ public class TodoGroupRes {
* 任务数量 * 任务数量
*/ */
private Integer taskCount; private Integer taskCount;
/**
* 任务数量说明
*/
private String taskCountStat;
/** /**
* 事项状态 1:完成 | 2:未完成 * 事项状态 1:完成 | 2:未完成
*/ */

View File

@ -47,12 +47,12 @@
</select> </select>
<select id="listTodo" resultType="com.blossom.backend.server.todo.pojo.TodoEntity"> <select id="listTodo" resultType="com.blossom.backend.server.todo.pojo.TodoEntity">
select min(id) as id,todo_id,todo_name,todo_type,todo_status, select min(id) as id,todo_id,todo_name,todo_type,todo_status,task_status,
count(*) as taskCount count(*) as taskCount
from blossom_todo from blossom_todo
where user_id = #{userId} where user_id = #{userId}
group by todo_id,todo_name,todo_type,todo_status group by todo_id,todo_name,todo_type,todo_status,task_status
order by id desc order by id desc
</select> </select>
<select id="selectByTodoId" resultType="com.blossom.backend.server.todo.pojo.TodoEntity"> <select id="selectByTodoId" resultType="com.blossom.backend.server.todo.pojo.TodoEntity">

View File

@ -7,7 +7,7 @@
<div class="task-collapse"> <div class="task-collapse">
<el-collapse v-model="activeName" accordion> <el-collapse v-model="activeName" accordion>
<el-collapse-item title="每日待办事项" name="1" class="collapse-item"> <el-collapse-item title="每日待办事项" name="1" class="collapse-item">
<el-calendar ref="CalendarRef" class="task-day-calendar" v-model="selectDay"> <el-calendar ref="CalendarRef" class="task-day-calendar">
<template #header="{ date }"> <template #header="{ date }">
<bl-row just="space-between" class="header" style="margin: 8px 10px"> <bl-row just="space-between" class="header" style="margin: 8px 10px">
<div class="month">{{ date.split(' ')[2] }}{{ date.split(' ')[3] }}</div> <div class="month">{{ date.split(' ')[2] }}{{ date.split(' ')[3] }}</div>
@ -21,7 +21,7 @@
<template #date-cell="{ data }"> <template #date-cell="{ data }">
<div class="cell-wrapper" @click="toTask(data.day, data.day, 10)"> <div class="cell-wrapper" @click="toTask(data.day, data.day, 10)">
<div class="day">{{ data.day.split('-')[2] }}</div> <div class="day">{{ data.day.split('-')[2] }}</div>
<div v-if="getCount(data.day) > 0"> <div v-if="getCount(data.day) != 0">
<bl-tag>{{ getCount(data.day) }}</bl-tag> <bl-tag>{{ getCount(data.day) }}</bl-tag>
</div> </div>
</div> </div>
@ -35,13 +35,13 @@
<!-- update name --> <!-- update name -->
<el-input <el-input
v-if="phased.updTodoName" v-if="phased.updTodoName"
:id="'phased-name-input-' + phased.todoId"
v-model="phased.todoName" v-model="phased.todoName"
type="textarea" type="textarea"
:id="'phased-name-input-' + phased.todoId"
:rows="3" :rows="3"
@blur="blurPhasedUpdHandle(phased.todoId!)"></el-input> @blur="blurPhasedUpdHandle(phased.todoId!)"></el-input>
<div v-else @dblclick="showPhasedUpdHandle(phased.todoId!)">{{ phased.todoName }}</div> <div v-else @dblclick="showPhasedUpdHandle(phased.todoId!)">{{ phased.todoName }}</div>
<bl-tag v-if="phased.taskCount > 0">{{ phased.taskCount }}</bl-tag> <bl-tag>{{ phased.taskCountStat }}</bl-tag>
</div> </div>
<!-- add phased --> <!-- add phased -->
@ -49,6 +49,7 @@
v-if="showPhasedAdd" v-if="showPhasedAdd"
ref="phasedAddInputRef" ref="phasedAddInputRef"
v-model="phasedAddName" v-model="phasedAddName"
@keyup.enter="blurPhasedAddHandle"
@blur="blurPhasedAddHandle" @blur="blurPhasedAddHandle"
style="margin-top: 10px"></el-input> style="margin-top: 10px"></el-input>
<div v-else class="task-phased-add" @click="showPhasedAddHandle">新增计划</div> <div v-else class="task-phased-add" @click="showPhasedAddHandle">新增计划</div>
@ -58,7 +59,7 @@
<el-collapse-item title="阶段性事项 已完成" name="3"> <el-collapse-item title="阶段性事项 已完成" name="3">
<div v-for="phased in todoPhasedClose" class="task-phased" @click="toTask(phased.todoId, phased.todoName, phased.todoType)"> <div v-for="phased in todoPhasedClose" class="task-phased" @click="toTask(phased.todoId, phased.todoName, phased.todoType)">
{{ phased.todoName }} {{ phased.todoName }}
<bl-tag v-if="phased.taskCount > 0">{{ phased.taskCount }}</bl-tag> <bl-tag>{{ phased.taskCountStat }}</bl-tag>
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -101,8 +102,6 @@ useLifecycle(
) )
//#region ----------------------------------------< >-------------------------------------- //#region ----------------------------------------< >--------------------------------------
const selectDay = ref()
const CalendarRef = ref<CalendarInstance>() const CalendarRef = ref<CalendarInstance>()
const selectDate = (val: CalendarDateType) => { const selectDate = (val: CalendarDateType) => {
if (!CalendarRef.value) return if (!CalendarRef.value) return
@ -128,6 +127,7 @@ const getTodos = () => {
todoType: 10, todoType: 10,
today: false, today: false,
taskCount: todo.taskCount > 0 ? todo.taskCount : 0, taskCount: todo.taskCount > 0 ? todo.taskCount : 0,
taskCountStat: '0|0|0',
updTodoName: false updTodoName: false
}) })
} }
@ -136,9 +136,17 @@ const getTodos = () => {
}) })
} }
/**
* @todo 日历每一项点击时由于内部数据变更, 都会触发查询
* @param day
*/
const getCount = (day: string): number => { const getCount = (day: string): number => {
if (!todoDayMaps.value) return 0 if (!todoDayMaps.value) {
if (!todoDayMaps.value.get(day)) return 0 return 0
}
if (!todoDayMaps.value.has(day)) {
return 0
}
return todoDayMaps.value.get(day)!.taskCount return todoDayMaps.value.get(day)!.taskCount
} }
@ -316,6 +324,7 @@ const blurPhasedUpdHandle = (todoId: string) => {
.task-phased { .task-phased {
@include flex(row, flex-start, center); @include flex(row, flex-start, center);
@include font(13px, 300); @include font(13px, 300);
flex-wrap: wrap;
padding: 1px 3px; padding: 1px 3px;
border-radius: 4px; border-radius: 4px;
color: var(--bl-text-color); color: var(--bl-text-color);
@ -327,6 +336,7 @@ const blurPhasedUpdHandle = (todoId: string) => {
&:first-child { &:first-child {
margin-top: 5px; margin-top: 5px;
word-break: break-all;
} }
&:last-child { &:last-child {

View File

@ -54,6 +54,10 @@ export interface TodoList {
* *
*/ */
taskCount: number taskCount: number
/**
*
*/
taskCountStat: string
} }
/** /**

View File

@ -169,10 +169,10 @@
border: 3px solid var(--el-color-primary); border: 3px solid var(--el-color-primary);
.iconbl { .iconbl {
@include themeColor(#e4e4e4, #2c2c2c);
display: inherit; display: inherit;
margin-top: 40px; margin-top: 40px;
font-size: 90px; font-size: 90px;
color: #e4e4e4;
} }
} }
} }