Преглед изворни кода

feat: bug、tree增加处理人字段,bug、tree、project规范创建更新

370774330@qq.com пре 5 година
родитељ
комит
2618b2a594
23 измењених фајлова са 230 додато и 104 уклоњено
  1. 1 1
      web/src/main/java/seecoder/devcloud/web/aspect/TreeLoggingAspect.java
  2. 1 1
      web/src/main/java/seecoder/devcloud/web/controller/gitlab/HookController.java
  3. 0 8
      web/src/main/java/seecoder/devcloud/web/controller/project/BugListController.java
  4. 5 3
      web/src/main/java/seecoder/devcloud/web/controller/project/ProjectController.java
  5. 12 10
      web/src/main/java/seecoder/devcloud/web/controller/tree/TreeNodesController.java
  6. 2 2
      web/src/main/java/seecoder/devcloud/web/model/enums/PriorityEnum.java
  7. 4 2
      web/src/main/java/seecoder/devcloud/web/model/po/project/BugListPO.java
  8. 10 5
      web/src/main/java/seecoder/devcloud/web/model/po/tree/TreeNodePO.java
  9. 6 3
      web/src/main/java/seecoder/devcloud/web/model/vo/project/BugListCreateVO.java
  10. 2 2
      web/src/main/java/seecoder/devcloud/web/model/vo/project/BugListUpdateBasicVO.java
  11. 9 3
      web/src/main/java/seecoder/devcloud/web/model/vo/project/BugListVO.java
  12. 19 0
      web/src/main/java/seecoder/devcloud/web/model/vo/project/ProjectCreateVO.java
  13. 46 0
      web/src/main/java/seecoder/devcloud/web/model/vo/tree/TreeNodeCreateVO.java
  14. 41 0
      web/src/main/java/seecoder/devcloud/web/model/vo/tree/TreeNodeUpdateBasicVO.java
  15. 6 6
      web/src/main/java/seecoder/devcloud/web/model/vo/tree/TreeNodeVO.java
  16. 13 11
      web/src/main/java/seecoder/devcloud/web/service/impl/project/BugListServiceImpl.java
  17. 26 20
      web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java
  18. 15 12
      web/src/main/java/seecoder/devcloud/web/service/impl/tree/TreeNodeServiceImpl.java
  19. 1 3
      web/src/main/java/seecoder/devcloud/web/service/project/BugListService.java
  20. 4 7
      web/src/main/java/seecoder/devcloud/web/service/project/ProjectService.java
  21. 5 3
      web/src/main/java/seecoder/devcloud/web/service/tree/TreeNodeService.java
  22. 1 1
      web/src/test/java/seecoder/devcloud/web/service/TreeNodeServiceTest.java
  23. 1 1
      web/src/test/java/seecoder/devcloud/web/service/tree/TreeNodeServiceTest.java

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/aspect/TreeLoggingAspect.java

@@ -12,7 +12,7 @@ import seecoder.devcloud.web.dao.tree.TreeLogMapper;
 import seecoder.devcloud.web.model.po.tree.TreeLog;
 import seecoder.devcloud.web.model.po.user.UserPO;
 import seecoder.devcloud.web.model.vo.Response;
-import seecoder.devcloud.web.model.vo.TreeNodeVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeVO;
 import seecoder.devcloud.web.service.user.UserService;
 
 import java.lang.reflect.Method;

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/controller/gitlab/HookController.java

@@ -61,7 +61,7 @@ public class HookController {
         List<GitWebHookVO.Commit> commits = gitWebHookVO.getCommits();
         for (GitWebHookVO.Commit commit:commits){
             if (commitService.isResolved(commit.getId())){
-                //以及解析过了
+                //已经解析过了
                 continue;
             }
             CommitRule rule = CommitResolver.resolve(commit.getTitle());

+ 0 - 8
web/src/main/java/seecoder/devcloud/web/controller/project/BugListController.java

@@ -38,14 +38,6 @@ public class BugListController {
         return Response.buildSuccess();
     }
 
-    @PutMapping("/finish")
-    @ApiOperation(value = "标记bug list已解决", httpMethod = "POST")
-    @ApiImplicitParam(value = "id", dataType = "int", paramType = "query")
-    public Response finish(@RequestParam("id") Integer id){
-        bugListService.finish(id);
-        return Response.buildSuccess();
-    }
-
     @GetMapping("/list")
     @ApiOperation(value = "获取一个项目所有bug list", httpMethod = "GET")
     @ApiImplicitParam(value = "projectId", dataType = "int", paramType = "query")

+ 5 - 3
web/src/main/java/seecoder/devcloud/web/controller/project/ProjectController.java

@@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
+import seecoder.devcloud.web.model.vo.project.ProjectCreateVO;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
 import seecoder.devcloud.web.service.project.ProjectService;
 
@@ -46,10 +47,11 @@ public class ProjectController {
 
     @ApiOperation(value = "创建项目,传入的参数中不必带有效的projectId字段,返回一个创建后的结果,注入id", httpMethod = "POST")
     @PostMapping("/create")
-    @ApiImplicitParam(name = "project",dataType = "object", paramType = "body")
-    public Response<ProjectVO> createProject(@RequestBody ProjectVO project) throws ServiceException {
-        return Response.buildSuccess(projectService.createProject(project));
+    @ApiImplicitParam(name = "projectCreateVO",dataType = "object", paramType = "body")
+    public Response<ProjectVO> createProject(@RequestParam("projectCreateVO") ProjectCreateVO projectCreateVO) throws ServiceException {
+        return Response.buildSuccess(projectService.createProject(projectCreateVO));
     }
 
 
+
 }

+ 12 - 10
web/src/main/java/seecoder/devcloud/web/controller/tree/TreeNodesController.java

@@ -8,7 +8,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
-import seecoder.devcloud.web.model.vo.TreeNodeVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeCreateVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeUpdateBasicVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeVO;
 import seecoder.devcloud.web.service.tree.TreeNodeService;
 
 import java.util.List;
@@ -43,10 +45,10 @@ public class TreeNodesController {
     }
 
     @ApiOperation(value = "插入节点", httpMethod = "POST")
-    @ApiImplicitParam(value = "treeNodeVO",dataType ="object", paramType = "body")
+    @ApiImplicitParam(value = "treeNodeCreateVO",dataType ="object", paramType = "body")
     @PostMapping("/node")
-    public Response insertTreeNode(@RequestBody TreeNodeVO treeNodeVO) throws ServiceException {
-        treeNodeService.insertTreeNode(treeNodeVO);
+    public Response insertTreeNode(@RequestBody TreeNodeCreateVO treeNodeCreateVO) throws ServiceException {
+        treeNodeService.insertTreeNode(treeNodeCreateVO);
         return Response.buildSuccess();
     }
 
@@ -66,17 +68,17 @@ public class TreeNodesController {
 
     @ApiOperation(value = "修改节点属性", httpMethod = "PUT")
     @PutMapping("/node")
-    @ApiImplicitParam(value = "treeNodeVO",dataType = "object", paramType = "body")
-    public Response updateTreeNode(@RequestBody TreeNodeVO treeNodeVO){
-        treeNodeService.updateTreeNode(treeNodeVO);
+    @ApiImplicitParam(value = "treeNodeUpdateBasicVO",dataType = "object", paramType = "body")
+    public Response updateTreeNode(@RequestBody TreeNodeUpdateBasicVO treeNodeUpdateBasicVO){
+        treeNodeService.updateTreeNode(treeNodeUpdateBasicVO);
         return Response.buildSuccess();
     }
 
     @ApiOperation(value = "根据项目id返回某个项目所有type为task的节点", httpMethod = "GET")
     @GetMapping("/node/type/task/{projectId}")
     @ApiImplicitParam(value = "projectId",dataType = "int", paramType = "path")
-    public Response getNodesWithTaskTypeByProjectid(@PathVariable("projectId") int projectId){
-        List<TreeNodeVO> nodesWithTaskTypeByProjectid = treeNodeService.getNodesWithTaskTypeByProjectId(projectId);
-        return Response.buildSuccess(nodesWithTaskTypeByProjectid);
+    public Response getNodesWithTaskTypeByProjectId(@PathVariable("projectId") int projectId){
+        List<TreeNodeVO> nodesWithTaskTypeByProjectId = treeNodeService.getNodesWithTaskTypeByProjectId(projectId);
+        return Response.buildSuccess(nodesWithTaskTypeByProjectId);
     }
 }

+ 2 - 2
web/src/main/java/seecoder/devcloud/web/model/enums/BugListPriorityEnum.java → web/src/main/java/seecoder/devcloud/web/model/enums/PriorityEnum.java

@@ -5,7 +5,7 @@ package seecoder.devcloud.web.model.enums;
  * @date 2021/3/21
  * @description:
  */
-public enum BugListPriorityEnum {
+public enum PriorityEnum {
 
     HIGH("紧急"),
 
@@ -15,7 +15,7 @@ public enum BugListPriorityEnum {
 
     private final String value;
 
-    BugListPriorityEnum(String value) {
+    PriorityEnum(String value) {
 
         this.value = value;
     }

+ 4 - 2
web/src/main/java/seecoder/devcloud/web/model/po/project/BugListPO.java

@@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import seecoder.devcloud.web.model.enums.BugListPriorityEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
 import seecoder.devcloud.web.model.enums.BugListStateEnum;
 
 import java.sql.Timestamp;
@@ -35,7 +35,7 @@ public class BugListPO {
 
     private Timestamp endTime;
 
-    private BugListPriorityEnum priority;
+    private PriorityEnum priority;
 
     private BugListStateEnum state;
 
@@ -44,4 +44,6 @@ public class BugListPO {
      */
     private Integer projectId;
 
+    private Integer processorId;
+
 }

+ 10 - 5
web/src/main/java/seecoder/devcloud/web/model/po/tree/TreeNodePO.java

@@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import seecoder.devcloud.web.model.enums.NodeStateEnum;
 import seecoder.devcloud.web.model.enums.NodeTypeEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
 
 @Data
 @AllArgsConstructor
@@ -17,17 +18,21 @@ public class TreeNodePO {
     private int id;
     private String title;
     private String description;
-
-    private int userId; /*操作用户的ID*/
-
     private NodeTypeEnum type;
-    private int priority;
+    private PriorityEnum priority;
     private NodeStateEnum state;
-    private int timeToTake;
+    /**
+     * 预计完成时间花销
+     */
+    private long timeToTake;
     private String startTime;
     private String endTime;
     private boolean leaf;
     private int projectId;
     private int parentId;
     private int deep;
+    /**
+     * 负责人 id,没有分配则为-1
+     */
+    private int processorId;
 }

+ 6 - 3
web/src/main/java/seecoder/devcloud/web/model/vo/project/BugListCreateVO.java

@@ -3,7 +3,7 @@ package seecoder.devcloud.web.model.vo.project;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import seecoder.devcloud.web.model.enums.BugListPriorityEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
 
 /**
  * @author PuHong Weng
@@ -23,13 +23,16 @@ public class BugListCreateVO {
     @ApiModelProperty("描述")
     private String description;
 
-    @ApiModelProperty("预计花销时间,单位毫秒")
+    @ApiModelProperty("预计花销时间,单位意义按前端来,比如可以是 x 人天")
     private Long expectedTimeCost;
 
     @ApiModelProperty("优先级:‘紧急’、‘一般’、‘宽松’。默认一般")
-    private BugListPriorityEnum priority = BugListPriorityEnum.MIDDLE;
+    private PriorityEnum priority = PriorityEnum.MIDDLE;
 
     @ApiModelProperty("关联的项目id")
     private Integer projectId;
 
+    @ApiModelProperty("负责人的id")
+    private Integer processorId;
+
 }

+ 2 - 2
web/src/main/java/seecoder/devcloud/web/model/vo/project/BugListUpdateBasicVO.java

@@ -3,7 +3,7 @@ package seecoder.devcloud.web.model.vo.project;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import seecoder.devcloud.web.model.enums.BugListPriorityEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
 
 /**
  * @author PuHong Weng
@@ -17,7 +17,7 @@ public class BugListUpdateBasicVO {
     @ApiModelProperty("bug id")
     private Integer id;
     @ApiModelProperty("优先级")
-    private BugListPriorityEnum priority;
+    private PriorityEnum priority;
     @ApiModelProperty("标题")
     private String title;
     @ApiModelProperty("描述")

+ 9 - 3
web/src/main/java/seecoder/devcloud/web/model/vo/project/BugListVO.java

@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.beans.BeanUtils;
-import seecoder.devcloud.web.model.enums.BugListPriorityEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
 import seecoder.devcloud.web.model.enums.BugListStateEnum;
 import seecoder.devcloud.web.model.po.project.BugListPO;
 import seecoder.devcloud.web.model.po.project.CommitPO;
@@ -41,7 +41,7 @@ public class BugListVO {
     private Timestamp endTime;
 
     @ApiModelProperty("优先级")
-    private BugListPriorityEnum priority;
+    private PriorityEnum priority;
 
     @ApiModelProperty("状态")
     private BugListStateEnum state;
@@ -49,9 +49,15 @@ public class BugListVO {
     @ApiModelProperty
     private List<CommitVO> commits;
 
+    @ApiModelProperty("负责人id")
+    private Integer processorId;
 
-    public BugListVO(BugListPO bugListPO, List<CommitPO> commits){
+    @ApiModelProperty("负责人名字")
+    private String processorName;
+
+    public BugListVO(BugListPO bugListPO, List<CommitPO> commits, String username){
         this.commits = commits.stream().map(CommitVO::new).collect(Collectors.toList());
         BeanUtils.copyProperties(bugListPO,this);
+        processorName = username;
     }
 }

+ 19 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/project/ProjectCreateVO.java

@@ -0,0 +1,19 @@
+package seecoder.devcloud.web.model.vo.project;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/23
+ * @description:
+ */
+@Data
+@ApiModel("项目创建表单")
+public class ProjectCreateVO {
+    @ApiModelProperty("项目名")
+    private String name;
+    @ApiModelProperty("项目描述")
+    private String description;
+}

+ 46 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/tree/TreeNodeCreateVO.java

@@ -0,0 +1,46 @@
+package seecoder.devcloud.web.model.vo.tree;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import seecoder.devcloud.web.model.enums.NodeStateEnum;
+import seecoder.devcloud.web.model.enums.NodeTypeEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/23
+ * @description:
+ */
+@NoArgsConstructor
+@Data
+@AllArgsConstructor
+@ApiModel("树节点")
+public class TreeNodeCreateVO {
+    @ApiModelProperty("树节点id")
+    private int id;
+    @ApiModelProperty("节点名称")
+    private String title;
+    @ApiModelProperty("节点描述")
+    private String description;
+    @ApiModelProperty("节点类型,有效值为 “需求”, “任务”")
+    private NodeTypeEnum type;
+    @ApiModelProperty("节点优先级")
+    private PriorityEnum priority;
+    @ApiModelProperty("节点状态类型,有效值为 “已创建”, “进行中”, “已结束”")
+    private NodeStateEnum state;
+    @ApiModelProperty("预计完成时间")
+    private long timeToTake;
+    @ApiModelProperty("是否为叶节点")
+    private boolean leaf;
+    @ApiModelProperty("所属项目id")
+    private int projectId;
+    @ApiModelProperty("父节点id")
+    private int parentId;
+    @ApiModelProperty("节点深度")
+    private int deep;
+    @ApiModelProperty("负责人id,不分配为则默认 -1")
+    private int processorId = -1;
+}

+ 41 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/tree/TreeNodeUpdateBasicVO.java

@@ -0,0 +1,41 @@
+package seecoder.devcloud.web.model.vo.tree;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import seecoder.devcloud.web.model.enums.NodeStateEnum;
+import seecoder.devcloud.web.model.enums.NodeTypeEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/23
+ * @description:
+ */
+@ApiModel("更新节点基本信息")
+public class TreeNodeUpdateBasicVO {
+    @ApiModelProperty("树节点id")
+    private int id;
+    @ApiModelProperty("节点名称")
+    private String title;
+    @ApiModelProperty("节点描述")
+    private String description;
+    @ApiModelProperty("节点类型,有效值为 “需求”, “任务”")
+    private NodeTypeEnum type;
+    @ApiModelProperty("节点优先级")
+    private PriorityEnum priority;
+    @ApiModelProperty("节点状态类型,有效值为 “已创建”, “进行中”, “已结束”")
+    private NodeStateEnum state;
+    @ApiModelProperty("预计完成时间")
+    private long timeToTake;
+    @ApiModelProperty("是否为叶节点")
+    private boolean leaf;
+    @ApiModelProperty("所属项目id")
+    private int projectId;
+    @ApiModelProperty("父节点id")
+    private int parentId;
+    @ApiModelProperty("节点深度")
+    private int deep;
+    @ApiModelProperty("负责人id,不分配为则默认 -1")
+    private int processorId = -1;
+
+}

+ 6 - 6
web/src/main/java/seecoder/devcloud/web/model/vo/TreeNodeVO.java → web/src/main/java/seecoder/devcloud/web/model/vo/tree/TreeNodeVO.java

@@ -1,4 +1,4 @@
-package seecoder.devcloud.web.model.vo;
+package seecoder.devcloud.web.model.vo.tree;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import seecoder.devcloud.web.model.enums.NodeStateEnum;
 import seecoder.devcloud.web.model.enums.NodeTypeEnum;
+import seecoder.devcloud.web.model.enums.PriorityEnum;
 import seecoder.devcloud.web.model.po.project.CommitPO;
 import seecoder.devcloud.web.model.po.tree.TreeNodePO;
 import seecoder.devcloud.web.model.vo.project.CommitVO;
@@ -25,11 +26,11 @@ public class TreeNodeVO {
     @ApiModelProperty("树节点id")
     private int id;
 
-    @ApiModelProperty("用户id")
+    @ApiModelProperty("负责人的用户id")
     private int userId; /*操作用户的ID*/
 
 
-    @ApiModelProperty("用户名")
+    @ApiModelProperty("负责人的用户名")
     private String username; /*操作用户的ID*/
 
     @ApiModelProperty("节点名称")
@@ -40,11 +41,11 @@ public class TreeNodeVO {
     @ApiModelProperty("节点类型,有效值为 “需求”, “任务”")
     private NodeTypeEnum type;
     @ApiModelProperty("节点优先级")
-    private int priority;
+    private PriorityEnum priority;
     @ApiModelProperty("节点状态类型,有效值为 “已创建”, “进行中”, “已结束”")
     private NodeStateEnum state;
     @ApiModelProperty("预计完成时间")
-    private int timeToTake;
+    private long timeToTake;
     @ApiModelProperty("起始时间")
     private String startTime;
     @ApiModelProperty("结束时间")
@@ -60,7 +61,6 @@ public class TreeNodeVO {
     @ApiModelProperty("关联的Commit信息")
     List<CommitVO> commits;
 
-
     public TreeNodeVO(TreeNodePO po, String username, List<CommitPO> commits){
         BeanUtils.copyProperties(po,this);
         this.username = username;

+ 13 - 11
web/src/main/java/seecoder/devcloud/web/service/impl/project/BugListServiceImpl.java

@@ -5,15 +5,19 @@ import org.springframework.stereotype.Service;
 import seecoder.devcloud.core.commit.CommitState;
 import seecoder.devcloud.web.dao.project.BugListMapper;
 import seecoder.devcloud.web.dao.project.CommitMapper;
+import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.model.enums.BugListStateEnum;
 import seecoder.devcloud.web.model.enums.CommitRelatedType;
 import seecoder.devcloud.web.model.po.project.BugListPO;
 import seecoder.devcloud.web.model.po.project.CommitPO;
+import seecoder.devcloud.web.model.po.user.UserPO;
 import seecoder.devcloud.web.model.vo.project.BugListCreateVO;
 import seecoder.devcloud.web.model.vo.project.BugListUpdateBasicVO;
 import seecoder.devcloud.web.model.vo.project.BugListVO;
 import seecoder.devcloud.web.service.project.BugListService;
 
+import java.sql.Timestamp;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -30,10 +34,13 @@ public class BugListServiceImpl implements BugListService {
 
     private final CommitMapper commitMapper;
 
+    private final UserMapper userMapper;
+
     @Autowired
-    public BugListServiceImpl(BugListMapper bugListMapper, CommitMapper commitMapper) {
+    public BugListServiceImpl(BugListMapper bugListMapper, CommitMapper commitMapper, UserMapper userMapper) {
         this.bugListMapper = bugListMapper;
         this.commitMapper = commitMapper;
+        this.userMapper = userMapper;
     }
 
 
@@ -45,27 +52,21 @@ public class BugListServiceImpl implements BugListService {
                 .expectedTimeCost(vo.getExpectedTimeCost())
                 .state(BugListStateEnum.CREATED)
                 .priority(vo.getPriority())
-                .startTime(null)
+                .startTime(new Timestamp(new Date().getTime()))
                 .endTime(null)
                 .projectId(vo.getProjectId())
                 .build();
         bugListMapper.insert(po, "startTime");
     }
 
-    @Override
-    public void finish(Integer id) {
-        BugListPO bugListPO = new BugListPO();
-        bugListPO.setId(id);
-        bugListPO.setState(BugListStateEnum.FINISHED);
-        bugListMapper.update(bugListPO);
-    }
-
     @Override
     public List<BugListVO> list(Integer projectId) {
         List<BugListPO> bugs = bugListMapper.selectByProjectId(projectId);
         List<CommitPO> commits = commitMapper.selectByProjectIdAndType(projectId, CommitRelatedType.BUG_ID);
         Map<Integer,List<CommitPO>> commitsMap = commits.stream().collect(Collectors.groupingBy(CommitPO::getRelatedId));
-        return bugs.stream().map(x->new BugListVO(x,commitsMap.get(x.getId()))).collect(Collectors.toList());
+        List<UserPO> users = userMapper.selectByIds(bugs.stream().map(BugListPO::getProcessorId).collect(Collectors.toList()));
+        Map<Integer,String> usernameMap = users.stream().collect(Collectors.toMap(UserPO::getId, UserPO::getUsername));
+        return bugs.stream().map(x->new BugListVO(x,commitsMap.get(x.getId()),usernameMap.get(x.getProcessorId()))).collect(Collectors.toList());
     }
 
 
@@ -90,6 +91,7 @@ public class BugListServiceImpl implements BugListService {
                 break;
             case FIX:
                 po.setState(BugListStateEnum.FINISHED);
+                po.setEndTime(new Timestamp(new Date().getTime()));
                 break;
         }
         bugListMapper.update(po);

+ 26 - 20
web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java

@@ -6,10 +6,11 @@ import com.nju.edu.gitlab.dto.project.VisibilityForm;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import seecoder.devcloud.common.exceptions.ConflictException;
+import seecoder.devcloud.api.ApplicationProperties;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.dao.project.ProjectMapper;
 import seecoder.devcloud.web.model.po.project.ProjectPO;
+import seecoder.devcloud.web.model.vo.project.ProjectCreateVO;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
 import seecoder.devcloud.web.service.project.ProjectService;
 
@@ -23,18 +24,15 @@ public class ProjectServiceImpl implements ProjectService {
 
     private final SeecoderGitlabApi seecoderGitlabApi;
 
+    private final ApplicationProperties properties;
+
     @Autowired
-    public ProjectServiceImpl(ProjectMapper projectMapper, SeecoderGitlabApi seecoderGitlabApi) {
+    public ProjectServiceImpl(ProjectMapper projectMapper, SeecoderGitlabApi seecoderGitlabApi, ApplicationProperties properties) {
         this.projectMapper = projectMapper;
         this.seecoderGitlabApi = seecoderGitlabApi;
+        this.properties = properties;
     }
 
-//    @Override
-//    public List<ProjectVO> listProjectsByGroupId(int groupId) {
-//        List<ProjectPO> projects = projectMapper.listProjectsByGroupId(groupId);
-//        return projects.stream().map(ProjectVO::new).collect(Collectors.toList());
-//    }
-
     @Override
     // TODO:该方法待测试
     public List<ProjectVO> listProjectsByUserId(int userId) {
@@ -50,24 +48,32 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Override
-    public ProjectVO createProject(ProjectVO projectVO) throws ServiceException {
-        ProjectPO projectPO = new ProjectPO();
-        BeanUtils.copyProperties(projectVO, projectPO);
-        if (projectMapper.getProjectCountsByGitRemoteUrl(projectPO.getGitRemoteUrl())!=0){
-            throw new ConflictException("创建的项目git url已存在");
-        }
+    public ProjectVO createProject(ProjectCreateVO vo) throws ServiceException {
+        ProjectPO po = new ProjectPO();
+        BeanUtils.copyProperties(vo,po);
+
         try {
-            int projectId = seecoderGitlabApi.createProject(projectVO.getName(), VisibilityForm.PRIVATE);
-            projectPO.setId(projectId);
+            //todo 创建完项目还要设置url
+            int projectId = seecoderGitlabApi.createProject(po.getName(), VisibilityForm.PRIVATE);
+            po.setId(projectId);
         } catch (SeecoderGitlabException e) {
-            throw new ServiceException("创建项目时发生异常[" + e.getMessage() + "]", e);
+            throw new ServiceException("创建项目时发生异常[project id:"+po.getId()+", " + e.getMessage() + "]", e);
         }
-        projectMapper.insertProject(projectPO);
+        projectMapper.insertProject(po);
 
 
         // TODO:在对应的gitlab仓库中注册WEBHOOK
-        //seecoderGitlabApi.addWebHook()
-        return new ProjectVO(projectPO);
+        try {
+            seecoderGitlabApi.addWebHook(po.getId(), properties.getGitlab().getWebhookProxy(), true,false,false);
+        } catch (SeecoderGitlabException e) {
+            throw new ServiceException("给项目添加webhook发生异常[project id:"+po.getId()+", " + e.getMessage() + "]", e);
+        }
+        return new ProjectVO(po);
+
+    }
+
+    @Override
+    public void addMember(Integer projectId, Integer userId) {
 
     }
 

+ 15 - 12
web/src/main/java/seecoder/devcloud/web/service/impl/tree/TreeNodeServiceImpl.java

@@ -11,14 +11,13 @@ import seecoder.devcloud.web.aop.TreeLogging;
 import seecoder.devcloud.web.dao.project.CommitMapper;
 import seecoder.devcloud.web.dao.tree.TreeNodeMapper;
 import seecoder.devcloud.web.dao.user.UserMapper;
-import seecoder.devcloud.web.model.enums.CommitRelatedType;
-import seecoder.devcloud.web.model.enums.NodeStateEnum;
-import seecoder.devcloud.web.model.enums.NodeTypeEnum;
-import seecoder.devcloud.web.model.enums.OperationEnum;
+import seecoder.devcloud.web.model.enums.*;
 import seecoder.devcloud.web.model.po.project.CommitPO;
 import seecoder.devcloud.web.model.po.tree.TreeNodePO;
 import seecoder.devcloud.web.model.po.user.UserPO;
-import seecoder.devcloud.web.model.vo.TreeNodeVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeCreateVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeUpdateBasicVO;
 import seecoder.devcloud.web.service.tree.TreeNodeService;
 
 import java.text.SimpleDateFormat;
@@ -56,9 +55,9 @@ public class TreeNodeServiceImpl implements TreeNodeService {
 
     @Override
     @TreeLogging(OperationEnum.START)
-    public void insertTreeNode(TreeNodeVO treeNodeVO) throws ServiceException {
+    public void insertTreeNode(TreeNodeCreateVO treeNodeCreateVO) throws ServiceException {
         TreeNodePO treeNodePO = new TreeNodePO();
-        BeanUtils.copyProperties(treeNodeVO,treeNodePO);
+        BeanUtils.copyProperties(treeNodeCreateVO,treeNodePO);
         int res = treeNodeMapper.insertTreeNode(treeNodePO);
         // TODO:safety check
         if (res <= 0) {
@@ -68,16 +67,18 @@ public class TreeNodeServiceImpl implements TreeNodeService {
 
     @Override
     @TreeLogging(OperationEnum.UPDATE)
-    public void updateTreeNode(TreeNodeVO treeNodeVO) {
+    public void updateTreeNode(TreeNodeUpdateBasicVO treeNodeUpdateBasicVO) {
         TreeNodePO treeNodePO = new TreeNodePO();
-        BeanUtils.copyProperties(treeNodeVO,treeNodePO);
+        BeanUtils.copyProperties(treeNodeUpdateBasicVO,treeNodePO);
         treeNodeMapper.updateTreeNode(treeNodePO);
         // TODO:safety check
     }
 
     @Override
     public void deleteTreeNode(int nodeId) {
+
         treeNodeMapper.deleteTreeNode(nodeId);
+        //todo 删除子节点
         // TODO:safety check
     }
 
@@ -116,7 +117,7 @@ public class TreeNodeServiceImpl implements TreeNodeService {
         treeNodePO.setTitle("title");
         treeNodePO.setDescription("description");
         treeNodePO.setType(NodeTypeEnum.TASK);
-        treeNodePO.setPriority(3);
+        treeNodePO.setPriority(PriorityEnum.MIDDLE);
         treeNodePO.setState(NodeStateEnum.CREATED);
         treeNodePO.setTimeToTake(10);
         treeNodePO.setStartTime(format.format(new Date()));
@@ -132,12 +133,14 @@ public class TreeNodeServiceImpl implements TreeNodeService {
     public void updateNodeState(Integer id, CommitState state) {
         TreeNodePO po = new TreeNodePO();
         po.setId(id);
+        SimpleDateFormat format = DateUtil.getSimpleDateFormat();
         switch (state){
             case WORKING_ON:
                 po.setState(NodeStateEnum.PROCESSING);
                 break;
             case COMPLETE:
                 po.setState(NodeStateEnum.FINISHED);
+                po.setEndTime(format.format(new Date()));
                 break;
         }
         treeNodeMapper.update(po);
@@ -149,11 +152,11 @@ public class TreeNodeServiceImpl implements TreeNodeService {
      */
     private List<TreeNodeVO> getTreeNodeVOS(List<TreeNodePO> nodesPO) {
         int projectId = nodesPO.get(0).getProjectId();
-        List<Integer> userIds = nodesPO.stream().map(TreeNodePO::getUserId).collect(Collectors.toList());
+        List<Integer> userIds = nodesPO.stream().map(TreeNodePO::getProcessorId).collect(Collectors.toList());
 
         Map<Integer,String> usernameMap = userMapper.selectByIds(userIds).stream().collect(Collectors.toMap(UserPO::getId, UserPO::getUsername));
         List<CommitPO> commits = commitMapper.selectByProjectIdAndType(projectId, CommitRelatedType.TREE_ID);
         Map<Integer, List<CommitPO>> commitsMap = commits.stream().collect(Collectors.groupingBy(CommitPO::getRelatedId));
-        return nodesPO.stream().map(po -> new TreeNodeVO(po,usernameMap.get(po.getUserId()),commitsMap.get(po.getId()))).collect(Collectors.toList());
+        return nodesPO.stream().map(po -> new TreeNodeVO(po,usernameMap.get(po.getProcessorId()),commitsMap.get(po.getId()))).collect(Collectors.toList());
     }
 }

+ 1 - 3
web/src/main/java/seecoder/devcloud/web/service/project/BugListService.java

@@ -16,13 +16,11 @@ public interface BugListService {
 
     void create(BugListCreateVO bugListCreateVO);
 
-    void finish(Integer id);
-
     List<BugListVO> list(Integer projectId);
 
     /**
      * 更改基本信息,可以更改的信息如下
-     *     private BugListPriorityEnum priority;
+     *     private PriorityEnum priority;
      *     private String title;
      *     private String description;
      *     private Long ExpectedTimeCost;

+ 4 - 7
web/src/main/java/seecoder/devcloud/web/service/project/ProjectService.java

@@ -1,16 +1,12 @@
 package seecoder.devcloud.web.service.project;
 
 import seecoder.devcloud.common.exceptions.ServiceException;
+import seecoder.devcloud.web.model.vo.project.ProjectCreateVO;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
 
 import java.util.List;
 
 public interface ProjectService {
-//    /**
-//     * 根据group找projects
-//     * @return
-//     */
-//    List<ProjectVO> listProjectsByGroupId(int groupId);
 
     /**
      * 根据user找Project
@@ -27,10 +23,9 @@ public interface ProjectService {
 
     /**
      * 创建项目
-     * @param project 不包含id
      * @return 注入id后返回
      */
-    ProjectVO createProject(ProjectVO project) throws ServiceException;
+    ProjectVO createProject(ProjectCreateVO vo) throws ServiceException;
 
     /**
      * 删除项目,懒删除
@@ -39,6 +34,8 @@ public interface ProjectService {
     @Deprecated
     void deleteProject(int projectId);
 
+    void addMember(Integer projectId, Integer userId);
+
     //todo 项目获取所有用户id
 
     //todo 用户id获取所有项目

+ 5 - 3
web/src/main/java/seecoder/devcloud/web/service/tree/TreeNodeService.java

@@ -5,7 +5,9 @@ package seecoder.devcloud.web.service.tree;
 
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.core.commit.CommitState;
-import seecoder.devcloud.web.model.vo.TreeNodeVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeCreateVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeUpdateBasicVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeVO;
 
 import java.util.List;
 
@@ -24,13 +26,13 @@ public interface TreeNodeService {
      * 新增一条需求
      * @param treeNodeVO
      */
-    void insertTreeNode(TreeNodeVO treeNodeVO) throws ServiceException;
+    void insertTreeNode(TreeNodeCreateVO treeNodeCreateVO) throws ServiceException;
 
     /**
      * 更新一条需求
      * @param treeNodeVO
      */
-    void updateTreeNode(TreeNodeVO treeNodeVO);
+    void updateTreeNode(TreeNodeUpdateBasicVO treeNodeUpdateBasicVO);
 
     /**
      * 删除一条需求,级联删除消息

+ 1 - 1
web/src/test/java/seecoder/devcloud/web/service/TreeNodeServiceTest.java

@@ -12,7 +12,7 @@
 //import seecoder.devcloud.web.model.enums.NodeTypeEnum;
 //import seecoder.devcloud.web.model.po.tree.TreeNodePO;
 //import seecoder.devcloud.web.service.tree.TreeNodeService;
-//import seecoder.devcloud.web.model.vo.TreeNodeVO;
+//import seecoder.devcloud.web.model.vo.tree.TreeNodeVO;
 //
 //import java.util.List;
 //

+ 1 - 1
web/src/test/java/seecoder/devcloud/web/service/tree/TreeNodeServiceTest.java

@@ -6,7 +6,7 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
-import seecoder.devcloud.web.model.vo.TreeNodeVO;
+import seecoder.devcloud.web.model.vo.tree.TreeNodeVO;
 
 import java.util.List;