From 0cda29574fb95890faf267fa90732e16d16dfc84 Mon Sep 17 00:00:00 2001 From: "yang.yongquan" <3395816735@qq.com> Date: Sun, 10 Jul 2022 21:30:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E9=A1=B9=E5=AE=8C=E6=88=90=E7=9A=84=E6=97=B6=E9=97=B4=E7=BA=BF?= =?UTF-8?q?=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TaskController.java | 12 ++ .../rmdjzz/projectmanagement/entity/Task.java | 1 + .../projectmanagement/mapper/TaskMapper.java | 12 +- .../service/ITaskService.java | 4 + .../service/impl/TaskServiceImpl.java | 108 +++++++++++++++++- src/main/resources/mapper/TaskMapper.xml | 55 +++++++++ 6 files changed, 186 insertions(+), 6 deletions(-) diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java index de27d6f..a4adf14 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java @@ -96,4 +96,16 @@ public class TaskController { return ResponseMap.ofSuccess(); } + @SneakyThrows + @GetMapping("/stats") + public ResponseMap getTaskTrend( + @RequestHeader("Token") String token, + @PathVariable Integer projectId + ) { + if(!projectService.checkOpenStatus(projectId)) { + throw new BadRequestException(IProjectService.PROJECT_UNOPENED); + } + return ResponseMap.ofSuccess("查询成功", taskService.getProjectTaskTrend(token, projectId)); + } + } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Task.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Task.java index a82c2b0..bad2e28 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Task.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Task.java @@ -36,6 +36,7 @@ public class Task { public static final String STATUS_PROCESSING = "进行中"; public static final String STATUS_COMPLETED = "已完成"; public static final String STATUS_CLOSED = "关闭"; + public static final String STATUS_UNCLOSED = "未关闭"; @TableId(type = IdType.AUTO) private Long taskId; diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/TaskMapper.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/TaskMapper.java index 88d1406..2402cdf 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/TaskMapper.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/TaskMapper.java @@ -1,11 +1,13 @@ package cn.edu.hfut.rmdjzz.projectmanagement.mapper; import cn.edu.hfut.rmdjzz.projectmanagement.entity.Task; -import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskDTO; import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.StaffProcessDTO; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskDTO; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskTrendDTO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; +import java.time.LocalDate; import java.util.List; /** @@ -16,4 +18,12 @@ public interface TaskMapper extends BaseMapper { List selectSubTaskList(@Param("projectId") Integer projectId, @Param("fatherId") Long fatherId); List selectProjectProcessOfStaff(@Param("projectId") Integer projectId, @Param("staffId") Integer staffId); + + List selectClosedTaskTrendBeforeDate(@Param("projectId") Integer projectId, @Param("startDate") LocalDate startDate); + + TaskTrendDTO selectUnclosedTaskTrendBeforeDate(@Param("projectId") Integer projectId, @Param("startDate") LocalDate startDate); + + List selectTaskClosedNum(@Param("projectId") Integer projectId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate); + + List selectTaskUnclosedNum(@Param("projectId") Integer projectId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate); } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/ITaskService.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/ITaskService.java index 4aad1d5..08d2893 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/ITaskService.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/ITaskService.java @@ -3,11 +3,13 @@ package cn.edu.hfut.rmdjzz.projectmanagement.service; import cn.edu.hfut.rmdjzz.projectmanagement.entity.Task; import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.StaffProcessDTO; import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskDTO; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskTrendDTO; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; import cn.edu.hfut.rmdjzz.projectmanagement.exception.ForbiddenException; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** * @author 张韬 @@ -41,4 +43,6 @@ public interface ITaskService extends IService { Task insertTask(String token, Task task) throws BadRequestException, ForbiddenException; Task modifyTask(String token, Task task) throws BadRequestException, ForbiddenException; + + Map> getProjectTaskTrend(String token, Integer projectId) throws BadRequestException, ForbiddenException; } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java index a552c73..c8b9762 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java @@ -3,6 +3,7 @@ package cn.edu.hfut.rmdjzz.projectmanagement.service.impl; import cn.edu.hfut.rmdjzz.projectmanagement.entity.Task; import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.StaffProcessDTO; import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskDTO; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskTrendDTO; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; import cn.edu.hfut.rmdjzz.projectmanagement.exception.ForbiddenException; import cn.edu.hfut.rmdjzz.projectmanagement.mapper.TaskMapper; @@ -11,16 +12,16 @@ import cn.edu.hfut.rmdjzz.projectmanagement.service.ITaskService; import cn.edu.hfut.rmdjzz.projectmanagement.utils.TokenUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -233,10 +234,10 @@ public class TaskServiceImpl extends ServiceImpl implements IT typeChangeValue = 2; } System.out.println(!task.checkModification(rawTask)); - if (!task.checkModification(rawTask) || !task.checkInsert() ) { + if (!task.checkModification(rawTask) || !task.checkInsert()) { throw new BadRequestException(BadRequestException.WRONG_PARAMETERS); } - if(typeChangeValue == 1 && !canBeDone(task.getTaskId())){ + if (typeChangeValue == 1 && !canBeDone(task.getTaskId())) { throw new BadRequestException("还有子工作尚未完成"); } try { @@ -255,4 +256,101 @@ public class TaskServiceImpl extends ServiceImpl implements IT } return task; } + + @Override + public Map> getProjectTaskTrend(String token, Integer projectId) throws BadRequestException, ForbiddenException { + if (projectGroupService.getProjectAccessLevel(token, projectId) == 0) { + throw new ForbiddenException(ForbiddenException.UNABLE_TO_OPERATE); + } + LocalDate endDate = LocalDate.now(); + LocalDate startDate = endDate.plusDays(-14); + Map> res = new HashMap<>(); + + List resList = getResultTaskStatus(projectId, startDate); + + TaskTrendDTO lastTaskTrend = new TaskTrendDTO(); + lastTaskTrend.setTaskDate(endDate.plusDays(1)); + List unclosedList = baseMapper.selectTaskUnclosedNum(projectId, startDate, endDate); + unclosedList.add(lastTaskTrend); + List closedList = baseMapper.selectTaskClosedNum(projectId, startDate, endDate); + closedList.add(lastTaskTrend); + + for (TaskTrendDTO iterTask : resList) { + List taskList = new ArrayList<>(); + ListIterator closedIter = closedList.listIterator(); + ListIterator unclosedIter = unclosedList.listIterator(); + TaskTrendDTO closedTaskTrend = null; + TaskTrendDTO unclosedTaskTrend = null; + + closedTaskTrend = closedIter.next(); + unclosedTaskTrend = unclosedIter.next(); + + Long lastNum = iterTask.getTaskNum(); + LocalDate iterDate = startDate; + while (!iterDate.isAfter(endDate)) { + TaskTrendDTO taskTrend = new TaskTrendDTO(); + taskTrend.setTaskDate(iterDate); + taskTrend.setTaskStatus(iterTask.getTaskStatus()); + taskTrend.setTaskNum(lastNum); + while (true) { + if (iterDate.isBefore(unclosedTaskTrend.getTaskDate())) { + break; + } + taskTrend.changeForUnclosed(unclosedTaskTrend); + if (unclosedIter.hasNext()) { + unclosedTaskTrend = unclosedIter.next(); + } + } + while (true) { + if (iterDate.isBefore(closedTaskTrend.getTaskDate())) { + break; + } + taskTrend.changeForClosed(closedTaskTrend); + if (closedIter.hasNext()) { + closedTaskTrend = closedIter.next(); + } + } + taskList.add(taskTrend); + iterDate = iterDate.plusDays(1); + lastNum = taskTrend.getTaskNum(); +// System.out.println(taskTrend.toString()); + } + res.put(iterTask.getTaskStatus(), taskList); + } + return res; + } + + private List getResultTaskStatus(Integer projectId, LocalDate startDate) { + List resList = baseMapper.selectClosedTaskTrendBeforeDate(projectId, startDate); + List taskList = new ArrayList<>(); + Boolean existClosed = false; + Boolean existCompleted = false; + for(TaskTrendDTO taskTrendDTO: resList) { + if(Objects.equals(Task.STATUS_CLOSED, taskTrendDTO.getTaskStatus())) { + existClosed = true; + } + if(Objects.equals(Task.STATUS_COMPLETED, taskTrendDTO.getTaskStatus())) { + existCompleted = true; + } + taskList.add(taskTrendDTO); + } + if(!existClosed) { + taskList.add(getZeroNumInstance(Task.STATUS_CLOSED)); + } + if(!existCompleted) { + taskList.add(getZeroNumInstance(Task.STATUS_COMPLETED)); + } + TaskTrendDTO unclosedTask = baseMapper.selectUnclosedTaskTrendBeforeDate(projectId, startDate); + taskList.add(unclosedTask); + return taskList; + } + + @NonNull + private TaskTrendDTO getZeroNumInstance(String taskStatus) { + TaskTrendDTO taskTrendDTO = new TaskTrendDTO(); + taskTrendDTO.setTaskStatus(taskStatus); + taskTrendDTO.setTaskNum(0L); + return taskTrendDTO; + } + } diff --git a/src/main/resources/mapper/TaskMapper.xml b/src/main/resources/mapper/TaskMapper.xml index c5393a6..08a8a95 100644 --- a/src/main/resources/mapper/TaskMapper.xml +++ b/src/main/resources/mapper/TaskMapper.xml @@ -48,4 +48,59 @@ RIGHT JOIN (SELECT DISTINCT task_type FROM task) AS t2 ON t1.task_type = t2.task_type + + + +