From 4e4bd33e1c0f929b45d4f763c37ef40998b30a3f Mon Sep 17 00:00:00 2001 From: ShiPengHui <1527550984@qq.com> Date: Tue, 5 Jul 2022 22:03:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E9=A1=B9=E7=9B=AEid?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=E9=A1=B9=E7=9B=AE=E6=88=90=E5=91=98id,?= =?UTF-8?q?=E6=97=A0=E6=9F=A5=E8=AF=A2=E6=9D=83=E9=99=90=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProjectGroupController.java | 35 +++++++++++++++++++ .../mapper/ProjectGroupMapper.java | 5 ++- .../service/IProjectGroupService.java | 5 +++ .../service/impl/ProjectGroupServiceImpl.java | 17 +++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java new file mode 100644 index 0000000..2d78481 --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java @@ -0,0 +1,35 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.controller; + +import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; +import cn.edu.hfut.rmdjzz.projectmanagement.service.IProjectGroupService; +import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.ResponseList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author 史鹏辉 + * @since 2022/7/5 9:32 + */ + +@RestController +@RequestMapping("/project/{projectId}/group") +public class ProjectGroupController { + @Autowired + private IProjectGroupService projectGroupService; + + @GetMapping + public ResponseList getGroupNumber(@PathVariable Integer projectId) { + List res = null; + try { + res = projectGroupService.findAllProjectNumber(projectId); + } catch (BadRequestException e) { + throw new RuntimeException(e); + } + return ResponseList.ofSuccess("查询成功", res); + } +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/ProjectGroupMapper.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/ProjectGroupMapper.java index ac8daff..beb4168 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/ProjectGroupMapper.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/ProjectGroupMapper.java @@ -1,12 +1,15 @@ package cn.edu.hfut.rmdjzz.projectmanagement.mapper; import cn.edu.hfut.rmdjzz.projectmanagement.entity.ProjectGroup; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.ProjectType; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @author 张韬 * created at 2022/6/30 21:34 */ public interface ProjectGroupMapper extends BaseMapper { - } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IProjectGroupService.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IProjectGroupService.java index 225671d..3f63b5c 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IProjectGroupService.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IProjectGroupService.java @@ -1,8 +1,11 @@ package cn.edu.hfut.rmdjzz.projectmanagement.service; import cn.edu.hfut.rmdjzz.projectmanagement.entity.ProjectGroup; +import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * @author 张韬 * created at 2022/6/30 21:36 @@ -14,4 +17,6 @@ public interface IProjectGroupService extends IService { * @return 如果不存在就返回0,否则返回AccessLevel */ Integer getUserLevelInGroup(String token, Integer projectId); + + List findAllProjectNumber(Integer projectId) throws BadRequestException; } \ No newline at end of file diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java index 3fd794b..a3d1850 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java @@ -1,6 +1,8 @@ package cn.edu.hfut.rmdjzz.projectmanagement.service.impl; import cn.edu.hfut.rmdjzz.projectmanagement.entity.ProjectGroup; +import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; +import cn.edu.hfut.rmdjzz.projectmanagement.exception.TokenException; import cn.edu.hfut.rmdjzz.projectmanagement.mapper.ProjectGroupMapper; import cn.edu.hfut.rmdjzz.projectmanagement.service.IProjectGroupService; import cn.edu.hfut.rmdjzz.projectmanagement.utils.TokenUtils; @@ -8,6 +10,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * @author 张韬 * created at 2022/6/30 21:38 @@ -41,4 +46,16 @@ public class ProjectGroupServiceImpl extends ServiceImpl findAllProjectNumber(Integer projectId) throws BadRequestException { + List res= new ArrayList<>(); + List targetProject = baseMapper.selectList(Wrappers.lambdaQuery().eq(ProjectGroup::getProjectId, projectId)); + if(targetProject.size() == 0) + throw new BadRequestException("项目不存在"); + for (int i = 0; i < targetProject.size(); i++) { + res.add(targetProject.get(i).getStaffId()); + } + return res; + } } From e3462d0ed7bf0b1ff68e8655b2030e3bc4660442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B0=81=E7=BE=BD?= <2360164671@qq.com> Date: Tue, 5 Jul 2022 22:14:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E9=A1=B9=E6=96=B0=E5=BB=BA=E5=92=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TaskController.java | 27 +++++++- .../rmdjzz/projectmanagement/entity/Task.java | 39 ++++++++++- .../service/ITaskService.java | 1 + .../service/impl/TaskServiceImpl.java | 67 ++++++++++++++----- 4 files changed, 116 insertions(+), 18 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 0e782ee..870b22b 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 @@ -44,8 +44,8 @@ public class TaskController { } @SneakyThrows - @PostMapping("/subtask/exist") - public ResponseMap createTask( + @GetMapping("/subtask/exist") + public ResponseMap existSubTask( @RequestHeader("Token") String token, @PathVariable("projectId") Integer projectId, @RequestParam("taskId") Long taskId @@ -54,4 +54,27 @@ public class TaskController { .put("existSubTask" ,taskService.existSubTask(token, projectId, taskId)); } + @SneakyThrows + @PostMapping("/") + public ResponseMap createTask( + @RequestHeader("Token") String token, + @PathVariable("projectId") Integer projectId, + @RequestBody Task task + ) { + task.setTaskProjectId(projectId); + taskService.insertTask(token,task); + return ResponseMap.ofSuccess("操作成功"); + } + + @SneakyThrows + @PutMapping("/") + public ResponseMap modifyTask( + @RequestHeader("Token") String token, + @PathVariable("projectId") Integer projectId, + @RequestBody Task task + ) { + task.setTaskProjectId(projectId); + taskService.modifyTask(token,task); + return ResponseMap.ofSuccess("操作成功"); + } } 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 ebb3446..5205173 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import lombok.Data; import java.time.LocalDateTime; +import java.util.Objects; /** * @author 阳勇权 @@ -20,6 +21,7 @@ public class Task { private Integer taskProjectId; private Integer taskHolderId; private String taskStatus; + private String taskType; private Long taskFatherId; private LocalDateTime taskCreatedTime; private LocalDateTime taskStartTime; @@ -27,7 +29,7 @@ public class Task { private LocalDateTime taskClosedTime; private Integer taskPriority; private String taskDescription; - private String attachedInfo; //TODO: 验证 + private String attachedInfo; @TableField("is_deleted") @TableLogic private Boolean deleted; @@ -38,4 +40,39 @@ public class Task { return false; return !this.getTaskEndTime().isBefore(this.getTaskStartTime()); } + public Boolean checkLegalFather(Task father) { + if(father==null||father.getTaskId()==null) + return false; + if(father.getTaskId()==0) + return true; + if(this.getTaskType().equals("缺陷")){ + return false; + } + else if(this.getTaskType().equals("需求")){ + return father.getTaskType().equals("需求"); + } + else if(this.getTaskType().equals("任务")){ + return father.getTaskType().equals("需求")||father.getTaskType().equals("任务"); + } + return false; + } + public Boolean checkModification(Task rawTask){ + if(rawTask.getTaskStatus().equals("已完成")||rawTask.getTaskStatus().equals("关闭")) + return false; + if(!rawTask.getTaskStatus().equals("待进行")&&this.getTaskStatus().equals("待进行")) + return false; + if(!Objects.equals(rawTask.getTaskId(),this.getTaskId())) + return false; + if(!Objects.equals(rawTask.getTaskProjectId(),this.getTaskProjectId())) + return false; + if(!Objects.equals(rawTask.getTaskFatherId(),this.getTaskFatherId())) + return false; + if(!Objects.equals(rawTask.getTaskType(),this.getTaskType())) + return false; + if(!Objects.equals(rawTask.getTaskCreatedTime(),this.getTaskCreatedTime())) + return false; + if(!Objects.equals(rawTask.getTaskClosedTime(),this.getTaskClosedTime())) + return false; + return true; + } } 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 ae15b08..7b6527f 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 @@ -21,4 +21,5 @@ public interface ITaskService extends IService { List getMyTaskList(String token,Integer projectId) throws BadRequestException; Boolean canBeDone(Long taskId); Task insertTask(String token,Task task) throws BadRequestException; + Task modifyTask(String token,Task task) throws BadRequestException; } 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 8783a17..7eadf49 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 @@ -40,7 +40,7 @@ public class TaskServiceImpl extends ServiceImpl implements IT @Override public Boolean existSubTask(String token, Integer projectId, Long taskId) throws BadRequestException { - if(projectGroupService.getUserLevelInGroup(token, projectId) == 0) { + if (projectGroupService.getUserLevelInGroup(token, projectId) == 0) { throw new BadRequestException("请求参数错误"); } return baseMapper.exists(Wrappers.lambdaQuery().eq(Task::getTaskFatherId, taskId)); @@ -62,8 +62,7 @@ public class TaskServiceImpl extends ServiceImpl implements IT while (true) { List list = baseMapper.selectList( Wrappers.lambdaQuery() - .in(Task::getTaskFatherId, res) - .ne(Task::getTaskStatus, "已完成")); + .in(Task::getTaskFatherId, res)); baseMapper.delete(Wrappers.lambdaQuery().in(Task::getTaskId, res)); if (list == null || list.isEmpty()) break; res = list.stream().map(Task::getTaskId).collect(Collectors.toList()); @@ -92,12 +91,14 @@ public class TaskServiceImpl extends ServiceImpl implements IT Wrappers.lambdaQuery() .in(Task::getTaskFatherId, res) .ne(Task::getTaskStatus, "已完成") + .ne(Task::getTaskStatus, "关闭") ); baseMapper.update( null, Wrappers.lambdaUpdate() .in(Task::getTaskId, res) .set(Task::getTaskStatus, "关闭") + .set(Task::getTaskClosedTime,LocalDateTime.now()) ); if (list == null || list.isEmpty()) break; res = list.stream().map(Task::getTaskId).collect(Collectors.toList()); @@ -109,7 +110,6 @@ public class TaskServiceImpl extends ServiceImpl implements IT } /** - * * @return 1:all rights 2:father holder 3:current holder 0:no right */ @Override @@ -118,8 +118,8 @@ public class TaskServiceImpl extends ServiceImpl implements IT Task task = baseMapper.selectOne(Wrappers.lambdaQuery().eq(Task::getTaskId, taskId)); if (task == null || staffId <= 0) return 0; - int count=0; - if(task.getTaskHolderId().equals(staffId)) + int count = 0; + if (task.getTaskHolderId().equals(staffId)) count++; task = baseMapper.selectOne(Wrappers.lambdaQuery().eq(Task::getTaskId, task.getTaskFatherId())); while (task.getTaskId() != 0) { @@ -134,7 +134,6 @@ public class TaskServiceImpl extends ServiceImpl implements IT } /** - * * @return 1:all rights 2:father holder 3:current holder 0:no right */ @Override @@ -168,13 +167,13 @@ public class TaskServiceImpl extends ServiceImpl implements IT public Boolean canBeDone(Long taskId) { try { Task task = baseMapper.selectOne(Wrappers.lambdaQuery().eq(Task::getTaskId, taskId)); - if (task == null || !"打开".equals(task.getTaskStatus()) || !"进行中".equals(task.getTaskStatus())) + if (task == null || (!"待进行".equals(task.getTaskStatus()) && !"进行中".equals(task.getTaskStatus()))) return false; List childTask = baseMapper.selectList(Wrappers.lambdaQuery().eq(Task::getTaskFatherId, task.getTaskId())); if (childTask == null || childTask.isEmpty()) return true; for (Task cTask : childTask) { - if (cTask.getTaskStatus().equals("打开") || cTask.getTaskStatus().equals("进行中")) + if (cTask.getTaskStatus().equals("待进行") || cTask.getTaskStatus().equals("进行中")) return false; } return true; @@ -187,25 +186,63 @@ public class TaskServiceImpl extends ServiceImpl implements IT public Task insertTask(String token, Task task) throws BadRequestException { task.setTaskId(null); Integer userLevel = projectGroupService.getUserLevelInGroup(token, task.getTaskProjectId()); - if (userLevel == 0 || (userLevel == 1 && task.getTaskFatherId() == 0)) { + if (userLevel == 0) { System.out.println(userLevel); throw new BadRequestException("错误的操作"); } if (!task.checkInsert()) { throw new BadRequestException("工作项参数错误"); } - if (checkHolder(token, task.getTaskFatherId()) == 0) { - throw new BadRequestException("非法的父级参数"); - } try { + Task father = baseMapper.selectOne(Wrappers.lambdaQuery().eq(Task::getTaskId, task.getTaskFatherId())); + if (!task.checkLegalFather(father) || (checkHolder(token, task.getTaskFatherId()) == 0 && userLevel == 3)) { + throw new BadRequestException("无法指定该父级"); + } task.setTaskCreatedTime(LocalDateTime.now()); - task.setTaskStatus("打开"); + task.setTaskStatus("待进行"); task.setTaskClosedTime(null); + System.out.println("-------------------------\n"); if (baseMapper.insert(task) == 0) { throw new BadRequestException("新建失败"); } } catch (Exception e) { - throw new BadRequestException("新建失败"); + System.out.println(e); + throw new BadRequestException("111"); + } + return task; + } + + @Override + public Task modifyTask(String token, Task task) throws BadRequestException { + Integer userLevel = projectGroupService.getUserLevelInGroup(token, task.getTaskProjectId()); + Task rawTask = baseMapper.selectOne(Wrappers.lambdaQuery().eq(Task::getTaskId, task.getTaskId())); + if (userLevel == 0 || (userLevel == 3 && checkHolder(token, task.getTaskId()) == 0)) { + throw new BadRequestException("没有权限"); + } + int typeChangeValue = 0; + if (!task.getTaskStatus().equals(rawTask.getTaskStatus())) { + if (task.getTaskStatus().equals("已完成")) + typeChangeValue = 1; + if (task.getTaskStatus().equals("关闭")) + typeChangeValue = 2; + } + System.out.println(!task.checkModification(rawTask)); + if (!task.checkModification(rawTask) || !task.checkInsert() || (typeChangeValue == 1 && !canBeDone(task.getTaskId()))) { + throw new BadRequestException("该修改无法应用"); + } + + try { + if (typeChangeValue != 0) { + task.setTaskClosedTime(LocalDateTime.now()); + } + if (typeChangeValue == 2) { + closeTaskAndSubTask(token, task.getTaskProjectId(), task.getTaskId()); + } + if (baseMapper.update(task, Wrappers.lambdaQuery().eq(Task::getTaskId, task.getTaskId())) == 0) { + throw new BadRequestException("修改失败"); + } + } catch (Exception e) { + throw new BadRequestException("修改失败"); } return task; } From 5e26599858fb45dc4fa89e20fb6931d896c28370 Mon Sep 17 00:00:00 2001 From: ArgonarioD Date: Wed, 6 Jul 2022 00:07:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86UnauthorizedExce?= =?UTF-8?q?ption=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=BA=86Task=E4=BB=A5=E9=80=82?= =?UTF-8?q?=E9=85=8DattachedInfo=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86FIXME?= =?UTF-8?q?=EF=BC=8C=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BA=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advice/ExceptionHandlerAdvice.java | 6 +- .../controller/ProjectGroupController.java | 9 +- .../rmdjzz/projectmanagement/entity/Task.java | 89 ++++++++++++++----- .../exception/TokenException.java | 2 +- .../exception/UnauthorizedException.java | 11 +++ .../service/impl/ProjectGroupServiceImpl.java | 6 +- .../service/impl/TaskServiceImpl.java | 1 - .../projectmanagement/utils/BeanUtils.java | 9 +- 8 files changed, 95 insertions(+), 38 deletions(-) create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/UnauthorizedException.java diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/advice/ExceptionHandlerAdvice.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/advice/ExceptionHandlerAdvice.java index 70705ab..98d79c4 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/advice/ExceptionHandlerAdvice.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/advice/ExceptionHandlerAdvice.java @@ -1,7 +1,7 @@ package cn.edu.hfut.rmdjzz.projectmanagement.advice; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; -import cn.edu.hfut.rmdjzz.projectmanagement.exception.TokenException; +import cn.edu.hfut.rmdjzz.projectmanagement.exception.UnauthorizedException; import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.ResponseMap; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -16,9 +16,9 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; @Slf4j @RestControllerAdvice public class ExceptionHandlerAdvice { - @ExceptionHandler(TokenException.class) + @ExceptionHandler(UnauthorizedException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) - public ResponseMap handleTokenException(TokenException e) { + public ResponseMap handleUnauthorizedException(Exception e) { // log.error(ExceptionUtils.getStackTrace(e)); log.error(e.getMessage()); return ResponseMap.of(HttpStatus.UNAUTHORIZED.value(), e.getMessage()); diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java index 2d78481..3141609 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java @@ -3,6 +3,7 @@ package cn.edu.hfut.rmdjzz.projectmanagement.controller; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; import cn.edu.hfut.rmdjzz.projectmanagement.service.IProjectGroupService; import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.ResponseList; +import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -22,14 +23,10 @@ public class ProjectGroupController { @Autowired private IProjectGroupService projectGroupService; + @SneakyThrows @GetMapping public ResponseList getGroupNumber(@PathVariable Integer projectId) { - List res = null; - try { - res = projectGroupService.findAllProjectNumber(projectId); - } catch (BadRequestException e) { - throw new RuntimeException(e); - } + List res = projectGroupService.findAllProjectNumber(projectId); return ResponseList.ofSuccess("查询成功", res); } } 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 5205173..d439e70 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 @@ -1,12 +1,16 @@ package cn.edu.hfut.rmdjzz.projectmanagement.entity; +import cn.edu.hfut.rmdjzz.projectmanagement.utils.BeanUtils; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; +import java.util.Map; import java.util.Objects; /** @@ -15,6 +19,12 @@ import java.util.Objects; */ @Data public class Task { + + private static final String ATTACH_DEMAND_SOURCE = "demandSource"; + private static final String ATTACH_ESTIMATED_MAN_HOURS = "estimatedManHours"; + private static final String ATTACH_SEVERITY = "severity"; + private static final String ATTACH_RECURRENCE_PROBABILITY = "recurrenceProbability"; + @TableId(type = IdType.AUTO) private Long taskId; private String taskName; @@ -29,50 +39,83 @@ public class Task { private LocalDateTime taskClosedTime; private Integer taskPriority; private String taskDescription; - private String attachedInfo; + @ApiModelProperty( + "demandSource:需求来源 (String), estimatedManHours:预估工时 (Integer), severity:严重程度 (String), recurrenceProbability:复现概率 (String)") + @TableField(typeHandler = JacksonTypeHandler.class) + private Map attachedInfo; @TableField("is_deleted") @TableLogic private Boolean deleted; public Boolean checkInsert() { - if (this.getTaskName() == null || this.getTaskName().length() <= 0 || this.getTaskName().length() >= 100|| - (this.getAttachedInfo()!=null&&this.getAttachedInfo().length() > 250)) + if (this.getTaskName() == null + || this.getTaskName().length() <= 0 + || this.getTaskName().length() >= 100 + || !this.checkAttachedInfo()) return false; return !this.getTaskEndTime().isBefore(this.getTaskStartTime()); } - public Boolean checkLegalFather(Task father) { - if(father==null||father.getTaskId()==null) - return false; - if(father.getTaskId()==0) + + private Boolean checkAttachedInfo() { + if (attachedInfo == null || attachedInfo.isEmpty()) { return true; - if(this.getTaskType().equals("缺陷")){ + } + if (attachedInfo.containsKey(ATTACH_DEMAND_SOURCE) && + !(attachedInfo.get(ATTACH_DEMAND_SOURCE) instanceof String s + && BeanUtils.checkInSet(s, "产品规划", "用户反馈", "内部需求", "竞品调研", "其他") + ) + ) { return false; } - else if(this.getTaskType().equals("需求")){ - return father.getTaskType().equals("需求"); + if (attachedInfo.containsKey(ATTACH_ESTIMATED_MAN_HOURS) && + !(attachedInfo.get(ATTACH_ESTIMATED_MAN_HOURS) instanceof Integer i + && i > 0 + ) + ) { + return false; } - else if(this.getTaskType().equals("任务")){ - return father.getTaskType().equals("需求")||father.getTaskType().equals("任务"); + if (attachedInfo.containsKey(ATTACH_SEVERITY) || attachedInfo.containsKey(ATTACH_RECURRENCE_PROBABILITY)) { + return (attachedInfo.containsKey(ATTACH_SEVERITY) && attachedInfo.containsKey(ATTACH_RECURRENCE_PROBABILITY)) + && + (attachedInfo.get(ATTACH_SEVERITY) instanceof String severity + && BeanUtils.checkInSet(severity, "致命", "严重", "一般", "建议")) + && + (attachedInfo.get(ATTACH_RECURRENCE_PROBABILITY) instanceof String recurrenceProbability + && BeanUtils.checkInSet(recurrenceProbability, "必现", "大概率复现", "小概率复现", "仅出现一次")); + } + return true; + } + + public Boolean checkLegalFather(Task father) { + if (father == null || father.getTaskId() == null) + return false; + if (father.getTaskId() == 0) + return true; + if (this.getTaskType().equals("缺陷")) { + return false; + } else if (this.getTaskType().equals("需求")) { + return father.getTaskType().equals("需求"); + } else if (this.getTaskType().equals("任务")) { + return father.getTaskType().equals("需求") || father.getTaskType().equals("任务"); } return false; } - public Boolean checkModification(Task rawTask){ - if(rawTask.getTaskStatus().equals("已完成")||rawTask.getTaskStatus().equals("关闭")) + + public Boolean checkModification(Task rawTask) { + if (rawTask.getTaskStatus().equals("已完成") || rawTask.getTaskStatus().equals("关闭")) return false; - if(!rawTask.getTaskStatus().equals("待进行")&&this.getTaskStatus().equals("待进行")) + if (!rawTask.getTaskStatus().equals("待进行") && this.getTaskStatus().equals("待进行")) return false; - if(!Objects.equals(rawTask.getTaskId(),this.getTaskId())) + if (!Objects.equals(rawTask.getTaskId(), this.getTaskId())) return false; - if(!Objects.equals(rawTask.getTaskProjectId(),this.getTaskProjectId())) + if (!Objects.equals(rawTask.getTaskProjectId(), this.getTaskProjectId())) return false; - if(!Objects.equals(rawTask.getTaskFatherId(),this.getTaskFatherId())) + if (!Objects.equals(rawTask.getTaskFatherId(), this.getTaskFatherId())) return false; - if(!Objects.equals(rawTask.getTaskType(),this.getTaskType())) + if (!Objects.equals(rawTask.getTaskType(), this.getTaskType())) return false; - if(!Objects.equals(rawTask.getTaskCreatedTime(),this.getTaskCreatedTime())) + if (!Objects.equals(rawTask.getTaskCreatedTime(), this.getTaskCreatedTime())) return false; - if(!Objects.equals(rawTask.getTaskClosedTime(),this.getTaskClosedTime())) - return false; - return true; + return Objects.equals(rawTask.getTaskClosedTime(), this.getTaskClosedTime()); } } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/TokenException.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/TokenException.java index e87f6d0..60d3779 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/TokenException.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/TokenException.java @@ -5,7 +5,7 @@ package cn.edu.hfut.rmdjzz.projectmanagement.exception; * created at 2022/6/28 23:34 */ //FIXME: 是否加入RequestUrl与RequestMethod作为错误信息log到日志 -public class TokenException extends Exception { +public class TokenException extends UnauthorizedException { public TokenException(String message) { super(message); } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/UnauthorizedException.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/UnauthorizedException.java new file mode 100644 index 0000000..c9db5df --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/exception/UnauthorizedException.java @@ -0,0 +1,11 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.exception; + +/** + * @author 佘语殊 + * @since 2022/7/5 23:36 + */ +public class UnauthorizedException extends Exception { + public UnauthorizedException(String message) { + super(message); + } +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java index a3d1850..4d5d953 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/ProjectGroupServiceImpl.java @@ -2,7 +2,6 @@ package cn.edu.hfut.rmdjzz.projectmanagement.service.impl; import cn.edu.hfut.rmdjzz.projectmanagement.entity.ProjectGroup; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; -import cn.edu.hfut.rmdjzz.projectmanagement.exception.TokenException; import cn.edu.hfut.rmdjzz.projectmanagement.mapper.ProjectGroupMapper; import cn.edu.hfut.rmdjzz.projectmanagement.service.IProjectGroupService; import cn.edu.hfut.rmdjzz.projectmanagement.utils.TokenUtils; @@ -31,6 +30,7 @@ public class ProjectGroupServiceImpl extends ServiceImpl findAllProjectNumber(Integer projectId) throws BadRequestException { - List res= new ArrayList<>(); + List res = new ArrayList<>(); List targetProject = baseMapper.selectList(Wrappers.lambdaQuery().eq(ProjectGroup::getProjectId, projectId)); - if(targetProject.size() == 0) + if (targetProject.size() == 0) throw new BadRequestException("项目不存在"); for (int i = 0; i < targetProject.size(); i++) { res.add(targetProject.get(i).getStaffId()); 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 7eadf49..057a856 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 @@ -23,7 +23,6 @@ import java.util.stream.Collectors; * @author 张韬 * created at 2022/7/4 14:51 */ -//FIXME: 修改delete/close函数 @Service public class TaskServiceImpl extends ServiceImpl implements ITaskService { @Autowired diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/BeanUtils.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/BeanUtils.java index 37c2a54..02bb33c 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/BeanUtils.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/BeanUtils.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -17,7 +18,7 @@ public class BeanUtils { /** * 将bean转成map,被标注{@link DoNotDeserialize}注释的变量会被跳过 * - * @param putNulls 是否将值为null的变量也放入结果map + * @param putNulls 是否将值为null的变量也放入结果map * @param toUnderline 是否将变量命名转为下划线型 */ public static Map beanToMap(Object object, boolean toUnderline, boolean putNulls) { @@ -57,6 +58,7 @@ public class BeanUtils { /** * 检查是否objects全都非null + * * @return 都非null则true,否则false */ public static boolean checkAllNotNull(Object... objects) { @@ -70,6 +72,7 @@ public class BeanUtils { /** * 检查是否objects含有非null + * * @return 有则true,否则false */ public static boolean checkAnyNotNull(Object... objects) { @@ -80,4 +83,8 @@ public class BeanUtils { } return false; } + + public static boolean checkInSet(Object object, Object... set) { + return Arrays.asList(set).contains(object); + } }