mirror of
https://gitee.com/blossom-editor/blossom.git
synced 2025-12-06 16:58:26 +08:00
feat: 阶段性事项列表增加各阶段任务数量显示
This commit is contained in:
parent
fa0d86e1d3
commit
042ec82489
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,6 +55,10 @@ public class TodoGroupRes {
|
|||||||
* 任务数量
|
* 任务数量
|
||||||
*/
|
*/
|
||||||
private Integer taskCount;
|
private Integer taskCount;
|
||||||
|
/**
|
||||||
|
* 任务数量说明
|
||||||
|
*/
|
||||||
|
private String taskCountStat;
|
||||||
/**
|
/**
|
||||||
* 事项状态 1:完成 | 2:未完成
|
* 事项状态 1:完成 | 2:未完成
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -54,6 +54,10 @@ export interface TodoList {
|
|||||||
* 任务数量
|
* 任务数量
|
||||||
*/
|
*/
|
||||||
taskCount: number
|
taskCount: number
|
||||||
|
/**
|
||||||
|
* 任务数量统计
|
||||||
|
*/
|
||||||
|
taskCountStat: string
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user