diff --git a/src/main/java/com/sa/zentao/conf/CodeGenerator.java b/src/main/java/com/sa/zentao/conf/CodeGenerator.java index 14cbc83..8e631ea 100644 --- a/src/main/java/com/sa/zentao/conf/CodeGenerator.java +++ b/src/main/java/com/sa/zentao/conf/CodeGenerator.java @@ -22,7 +22,7 @@ public class CodeGenerator { //自己的名字 static String Author = "gqb"; - public static String tableName = "zt_develop_feedback"; + public static String tableName = "zt_story_user_task"; /** *

diff --git a/src/main/java/com/sa/zentao/controller/CommonsController.java b/src/main/java/com/sa/zentao/controller/CommonsController.java index e511a65..832a624 100644 --- a/src/main/java/com/sa/zentao/controller/CommonsController.java +++ b/src/main/java/com/sa/zentao/controller/CommonsController.java @@ -15,6 +15,7 @@ import com.sa.zentao.utils.UploadUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -108,6 +109,24 @@ public class CommonsController { } } + @PostMapping("/copyFile") + public Result copyFile( UploadDTO file){ + String files = file.getFiles(); + + + if(StringUtils.isEmpty(files)){ + return Result.success(); + } + String[] split = files.split(","); + List ztFiles = this.fileService.listByIds(Arrays.asList(split)); + for (ZtFile f:ztFiles) { + f.setId(null); + f.setObjecttype(null); + f.setObjectid(null); + } + this.fileService.saveBatch(ztFiles); + return Result.success(ztFiles); + } diff --git a/src/main/java/com/sa/zentao/controller/ZtBugController.java b/src/main/java/com/sa/zentao/controller/ZtBugController.java index 6b467e2..52b784f 100644 --- a/src/main/java/com/sa/zentao/controller/ZtBugController.java +++ b/src/main/java/com/sa/zentao/controller/ZtBugController.java @@ -88,7 +88,8 @@ public class ZtBugController { @RequestMapping(value = "/bugById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result bugById(@RequestBody ZtBugQo qo){ - return Result.success(bugService.getById(qo.getId())); + + return Result.success(bugService.getBugById(qo.getId())); } @RequestMapping(value = "/assignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") diff --git a/src/main/java/com/sa/zentao/controller/ZtNoticeController.java b/src/main/java/com/sa/zentao/controller/ZtNoticeController.java index 741561b..ee1d5f5 100644 --- a/src/main/java/com/sa/zentao/controller/ZtNoticeController.java +++ b/src/main/java/com/sa/zentao/controller/ZtNoticeController.java @@ -8,6 +8,7 @@ import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.entity.ZtNotice; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.IZtNoticeService; +import com.sa.zentao.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import java.util.Date; import java.util.List; /** @@ -37,7 +39,9 @@ public class ZtNoticeController { public Result> pageList(@RequestBody ZtProjectQo qo){ List list = noticeService.list(new QueryWrapper().lambda() - .eq(ZtNotice::getFlag, 0).orderByDesc(ZtNotice::getId)); + .eq(ZtNotice::getFlag, 0).orderByDesc(ZtNotice::getId) + .gt(ZtNotice::getLoseDate, DateUtils.dateSubDay(new Date(),15)) + ); return Result.success(list); diff --git a/src/main/java/com/sa/zentao/controller/ZtProductController.java b/src/main/java/com/sa/zentao/controller/ZtProductController.java index fb9c7b1..3c2defe 100644 --- a/src/main/java/com/sa/zentao/controller/ZtProductController.java +++ b/src/main/java/com/sa/zentao/controller/ZtProductController.java @@ -143,4 +143,11 @@ public class ZtProductController { return Result.success(ztProductService.getAllBusinessSelect(dto)); } + + @RequestMapping(value = "/searchObj", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result searchObj(@RequestBody ZtAllBusinessDTO dto){ + + return Result.success(ztProductService.searchObj(dto)); + } + } diff --git a/src/main/java/com/sa/zentao/controller/ZtProjectController.java b/src/main/java/com/sa/zentao/controller/ZtProjectController.java index 65700d1..f9322fb 100644 --- a/src/main/java/com/sa/zentao/controller/ZtProjectController.java +++ b/src/main/java/com/sa/zentao/controller/ZtProjectController.java @@ -52,6 +52,13 @@ public class ZtProjectController { return Result.success(); } + //添加项目集 + @RequestMapping(value = "/getProjectById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result getProjectById(@RequestBody ZtProjectDTO dto){ + ZtProjectDTO p =ztProjectService.getProjectById(dto); + return Result.success(p); + } + //修改执行 @RequestMapping(value = "/editImplement", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result editImplement(@RequestBody ZtProjectDTO dto){ @@ -278,6 +285,12 @@ public class ZtProjectController { return Result.success(this.ztProjectService.executionListByProduct(qo)); } + //搜索执行根据产品 和 项目 + @RequestMapping(value = "/executionListNoClosedByProduct", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result executionListNoClosedByProduct(@RequestBody ZtProjectQo qo){ + return Result.success(this.ztProjectService.executionListNoClosedByProduct(qo)); + } + @RequestMapping(value = "/executionListByProject", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result executionListByProject(@RequestBody ZtProjectQo qo){ return Result.success(this.ztProjectService.executionListByProject(qo)); diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java index c7dd9c9..2becf8b 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java @@ -111,7 +111,23 @@ public class ZtStoryUserController { List list = storyUserService.myWaitYsStory(dto); return Result.success(CollectionUtils.isEmpty(list)?list:list.get(0)); } + //明确需求 以设计状态下去提交交付物 到待确认 + @RequestMapping(value = "/improveStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result improveStory(@RequestBody ZtStoryUserDTO dto){ + this.storyUserService.improveStory(dto); + return Result.success(); + } + //确认交付物按钮 待确认 到已确认 + @RequestMapping(value = "/confirmStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result confirmStory(@RequestBody ZtStoryUserDTO dto){ + this.storyUserService.confirmStory(dto); + return Result.success(); + } - - + //确认交付物按钮 待确认 到已确认 + @RequestMapping(value = "/needMeetOrDesign", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result needMeetOrDesign(@RequestBody ZtStoryUserDTO dto){ + this.storyUserService.needMeetOrDesign(dto); + return Result.success(); + } } diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java new file mode 100644 index 0000000..fa40e2f --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java @@ -0,0 +1,78 @@ +package com.sa.zentao.controller; + + +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.Result; +import com.sa.zentao.dao.ZtStoryUserDTO; +import com.sa.zentao.dao.ZtStoryUserTaskDTO; +import com.sa.zentao.dao.ZtTaskDTO; +import com.sa.zentao.entity.ZtStoryUserTask; +import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.service.IZtStoryUserTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author gqb + * @since 2025-03-25 + */ +@RestController +@RequestMapping("/zt-story-user-task") +public class ZtStoryUserTaskController { + @Autowired + private IZtStoryUserTaskService storyUserTaskService; + + @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result> pageList(@RequestBody ZtProjectQo qo){ + + return Result.success(storyUserTaskService.taskPageList(qo)); + } + + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result add(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.add(dto); + return Result.success(); + } + + @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result modify(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.modify(dto); + return Result.success(); + } + + @RequestMapping(value = "/closed", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result closed(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.closed(dto); + return Result.success(); + } + + + @RequestMapping(value = "/cancel", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result cancel(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.cancel(dto); + return Result.success(); + } + + @RequestMapping(value = "/getUserStoryTaskById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result getUserStoryTaskById(@RequestBody ZtProjectQo qo){ + return Result.success(storyUserTaskService.getUserStoryTaskById(qo)); + } + + @RequestMapping(value = "/finishedTask", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result> finishedTask(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.finishedTask(dto); + return Result.success(); + } + + + +} diff --git a/src/main/java/com/sa/zentao/controller/ZtTaskController.java b/src/main/java/com/sa/zentao/controller/ZtTaskController.java index 06a7390..ba5e4c3 100644 --- a/src/main/java/com/sa/zentao/controller/ZtTaskController.java +++ b/src/main/java/com/sa/zentao/controller/ZtTaskController.java @@ -12,6 +12,7 @@ import com.sa.zentao.dao.*; import com.sa.zentao.entity.*; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.*; +import com.sa.zentao.utils.BeanCopyUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -173,16 +174,22 @@ public class ZtTaskController { // 需求关联的迭代 List list = this.ztTaskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, dto.getStory())); + if(CollectionUtils.isEmpty(list)){ + return Result.success(); + } + Map userMap = this.userService.userMapByIds(null); - for (ZtTask t:list) { + List ztTaskDTOS = BeanCopyUtil.copyListProperties(list, ZtTaskDTO::new); + + for (ZtTaskDTO t:ztTaskDTOS) { ZtUser ztUser = userMap.get(t.getAssignedTo()); if(ztUser!=null){ - t.setAssignedTo(ztUser.getNickname()); + t.setAssignedToName(ztUser.getNickname()); } } - return Result.success(list); + return Result.success(ztTaskDTOS); } diff --git a/src/main/java/com/sa/zentao/dao/UploadDTO.java b/src/main/java/com/sa/zentao/dao/UploadDTO.java index 7602dc3..41a33b3 100644 --- a/src/main/java/com/sa/zentao/dao/UploadDTO.java +++ b/src/main/java/com/sa/zentao/dao/UploadDTO.java @@ -14,6 +14,8 @@ public class UploadDTO implements Serializable { private Integer id; private MultipartFile file; + // 根据,隔开的字符串 + private String files; private String url; diff --git a/src/main/java/com/sa/zentao/dao/ZtAllBusinessDTO.java b/src/main/java/com/sa/zentao/dao/ZtAllBusinessDTO.java index 0cd3b39..8d816a4 100644 --- a/src/main/java/com/sa/zentao/dao/ZtAllBusinessDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtAllBusinessDTO.java @@ -29,4 +29,7 @@ public class ZtAllBusinessDTO implements Serializable { private Integer bugId; + // story task bug userStory + private String searchType; + private String searchId; } diff --git a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java index db26d10..f27c13b 100644 --- a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java @@ -137,7 +137,7 @@ public class ZtBugDTO implements Serializable { @TableField("closedBy") private String closedby; - + private String closedbyName; @TableField("closedDate") private Date closeddate; @@ -178,7 +178,7 @@ public class ZtBugDTO implements Serializable { @TableField("lastEditedBy") private String lasteditedby; - + private String lasteditedbyName; @TableField("lastEditedDate") private Date lastediteddate; diff --git a/src/main/java/com/sa/zentao/dao/ZtProjectDTO.java b/src/main/java/com/sa/zentao/dao/ZtProjectDTO.java index da5d711..0dc7b63 100644 --- a/src/main/java/com/sa/zentao/dao/ZtProjectDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtProjectDTO.java @@ -129,7 +129,7 @@ public class ZtProjectDTO implements Serializable { @TableField("openedBy") private String openedBy; - + private String openedByName; @TableField("openedDate") private Date openedDate; @@ -167,7 +167,7 @@ public class ZtProjectDTO implements Serializable { @TableField("PM") private String pm; - + private String pmName; @TableField("QD") private String qd; @@ -212,7 +212,7 @@ public class ZtProjectDTO implements Serializable { // private boolean hasChildren=false; private List productIds; - + private Integer product; private Integer productId; private String productName; //迭代id diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java index e0faa2a..5f91b75 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java @@ -233,7 +233,7 @@ public class ZtStoryDTO implements Serializable { private Integer execution; private List executions; - + private List executionList; private Boolean psFlag; private String executionName; @@ -258,4 +258,7 @@ public class ZtStoryDTO implements Serializable { private Integer releaseFlag=0; private List bugList; + + + private Date ysDate; } diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java index a350a29..3dcd8b1 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java @@ -133,7 +133,7 @@ public class ZtStoryUserDTO implements Serializable { @TableField("closedBy") private String closedby; - + private String closedbyName; @TableField("closedDate") private Date closeddate; @@ -216,9 +216,21 @@ public class ZtStoryUserDTO implements Serializable { private List sList; + private List taskList; + private String revieweUser; private String files; private String verify; + + private Date psDate; + + private String ysRemark; + //交付 + private String deliverRemark; + // 1 需要 2不需要 + private Integer needDesign; + //1.需要 2.不需要 + private Integer needImprove; } diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java new file mode 100644 index 0000000..4cac45b --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java @@ -0,0 +1,122 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.sql.Blob; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-03-25 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtStoryUserTaskDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + + private ZtStoryUserTaskDTO info; + + private Integer id; + + private Integer userStoryId; + private String userStoryName; + private ZtStoryUserDTO storyUserInfo; + /** + * 明确 设计 设计 design 明确improve + */ + private String type; + + /** + * 预计工时 + */ + private Float estimate; + + private Float consumed; + + /** + * 剩余 + */ + private Float left; + + /** + * 指派给 + */ + private String assignedTo; + private String assignedToName; + /** + * 1 需要 2不需要 + */ + private Integer needMeeting; + + /** + * 1需要 2不需要 + */ + private Integer needDesign; + + private Integer product; + private String productName; + /** + * 任务名称 + */ + private String name; + + private String remark; + + @TableField("estStarted") + private Date eststarted; + + private Date deadline; + + @TableField("realStarted") + private Date realstarted; + + @TableField("finishedDate") + private Date finisheddate; + + @TableField("finishedBy") + private String finishedby; + private String finishedbyName; + @TableField("canceledBy") + private String canceledby; + private String canceledbyName; + @TableField("canceledDate") + private Date canceleddate; + + @TableField("closedBy") + private String closedby; + private String closedbyName; + @TableField("closedDate") + private Date closeddate; + + private String closedRemark; + + @TableField("openedBy") + private String openedby; + private String openedbyName; + + @TableField("openedDate") + private Date openeddate; + + private Integer pri; + + private String lastEditedBy; + + private String lastEditedByName; + private Date lastEditedDate; + + private String files; + + private String status; + +} diff --git a/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java b/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java index f5bc8cf..4dbe761 100644 --- a/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java @@ -47,7 +47,7 @@ public class ZtTaskDTO implements Serializable { private Integer design; private Integer story; - + private String storyName; @TableField("storyVersion") private Integer storyversion; @@ -93,7 +93,7 @@ public class ZtTaskDTO implements Serializable { @TableField("openedBy") private String openedby; - + private String openedbyName; @TableField("openedDate") private Date openeddate; @@ -120,13 +120,13 @@ public class ZtTaskDTO implements Serializable { @TableField("canceledBy") private String canceledby; - + private String canceledbyName; @TableField("canceledDate") private Date canceleddate; @TableField("closedBy") private String closedby; - + private String closedbyName; @TableField("closedDate") private Date closeddate; diff --git a/src/main/java/com/sa/zentao/entity/ZtEffort.java b/src/main/java/com/sa/zentao/entity/ZtEffort.java index 4415951..1388c8a 100644 --- a/src/main/java/com/sa/zentao/entity/ZtEffort.java +++ b/src/main/java/com/sa/zentao/entity/ZtEffort.java @@ -27,6 +27,7 @@ public class ZtEffort implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Integer id; + //task userStoryTask @TableField("objectType") private String objecttype; diff --git a/src/main/java/com/sa/zentao/entity/ZtStory.java b/src/main/java/com/sa/zentao/entity/ZtStory.java index 091c0e8..eb82f9d 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStory.java +++ b/src/main/java/com/sa/zentao/entity/ZtStory.java @@ -1,5 +1,6 @@ package com.sa.zentao.entity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.IdType; import java.time.LocalDate; import com.baomidou.mybatisplus.annotation.TableId; @@ -194,9 +195,13 @@ public class ZtStory implements Serializable { private String ysRemark; + + @TableField(updateStrategy = FieldStrategy.IGNORED) private Integer userStory; private String ysUser; private Integer taskCount; + + private Date ysDate; } diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java index 5dcdd1e..f2c99cb 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java @@ -103,7 +103,6 @@ public class ZtStoryFeedback implements Serializable { private String weixin; //1通过 2不通过 - @TableField(exist = false) private Integer ysFlag; private String dontHandSelect; diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java index bc53778..f414d2b 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java @@ -192,10 +192,14 @@ public class ZtStoryUser implements Serializable { * 1通过 2不通过 */ private Integer ysFlag; - + private String ysRemark; private String spec; private String fileUrl; private String verify; + + private Date psDate; + + private String deliverRemark; } diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUserTask.java b/src/main/java/com/sa/zentao/entity/ZtStoryUserTask.java new file mode 100644 index 0000000..5abf992 --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/ZtStoryUserTask.java @@ -0,0 +1,117 @@ +package com.sa.zentao.entity; + +import java.time.LocalDateTime; +import java.sql.Blob; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-03-25 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtStoryUserTask implements Serializable { + + private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer userStoryId; + + /** + * 设计 design 明确improve + */ + private String type; + + /** + * 预计工时 + */ + private Float estimate; + + private Float consumed; + + /** + * 剩余 + */ + @TableField("`left`") + private Float left; + + /** + * 指派给 + */ + private String assignedTo; + + /** + * 1 需要 2不需要 + */ + private Integer needMeeting; + + /** + * 1需要 2不需要 + */ + private Integer needDesign; + + private Integer product; + /** + * 任务名称 + */ + @TableField("`name`") + private String name; + + private String remark; + + @TableField("estStarted") + private Date eststarted; + + private Date deadline; + + @TableField("realStarted") + private Date realstarted; + + @TableField("finishedDate") + private Date finisheddate; + + @TableField("finishedBy") + private String finishedby; + + @TableField("canceledBy") + private String canceledby; + + @TableField("canceledDate") + private Date canceleddate; + + @TableField("closedBy") + private String closedby; + + @TableField("closed_date") + private Date closeddate; + + private String closedRemark; + + @TableField("opened_by") + private String openedby; + + @TableField("opened_date") + private Date openeddate; + @TableField("`pri`") + private Integer pri; + + private String lastEditedBy; + + private Date lastEditedDate; + //wait 未开始 doing 进行中 finished 完成 cancel取消 closed + @TableField("`status`") + private String status; +} diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java index 6e5ede8..9328ae6 100644 --- a/src/main/java/com/sa/zentao/enums/ActionStatus.java +++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java @@ -30,9 +30,16 @@ public enum ActionStatus { CSWC(20, "tested","测试完成"), KFWC(41, "developed","开发完成"), + ZTBG(41, "changeStatus","状态变更"), + MQXU(41, "mqxu","明确需求"), TJYS(51, "verified","提交验收"), + KSCL(61, "startHand","开始处理"), + WXCL(62, "dontHand","无需处理"), + + CLWC(65, "handFinished","处理完成"), + LOGIN(100, "login","登录"), XGMM(101, "xgmm","修改密码"), ; diff --git a/src/main/java/com/sa/zentao/enums/ActionType.java b/src/main/java/com/sa/zentao/enums/ActionType.java index ef3f0d4..5e44963 100644 --- a/src/main/java/com/sa/zentao/enums/ActionType.java +++ b/src/main/java/com/sa/zentao/enums/ActionType.java @@ -22,6 +22,8 @@ public enum ActionType { RW(5, "task","任务"), + STORYUSERTASK(21, "user-story-task","用户需求任务"), + BUG(6, "bug","BUG"), LOGIN(7, "LOGIN","登录"), diff --git a/src/main/java/com/sa/zentao/enums/FileTypes.java b/src/main/java/com/sa/zentao/enums/FileTypes.java index 23d0b81..673eb30 100644 --- a/src/main/java/com/sa/zentao/enums/FileTypes.java +++ b/src/main/java/com/sa/zentao/enums/FileTypes.java @@ -8,6 +8,8 @@ public enum FileTypes { story("story", "需求"), bug("bug", "BUG"), userStory("userStory", "用户需求"), + userStoryTask("userStoryTask", "用户需求任务"), + userStoryTaskImprove("userStoryTaskImprove", "用户需求任务交付物"), feedbackStory("feedbackStory", "问题反馈"), ywTask("ywTask", "运维任务"), meeting("meeting", "会议"), diff --git a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java new file mode 100644 index 0000000..b657c7a --- /dev/null +++ b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java @@ -0,0 +1,51 @@ +package com.sa.zentao.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; + +public enum UserStoryEnums { + + DPS("reviewing", "待评审"), + CG("draft", "草稿"), + JH("active", "激活"), + UNCFM("unconfirmed", "产品确认中"), + DGT("waitcommunicate", "待沟通"), + + DSJ("waitdesign","需求待设计"), + XXSJZ("designdoing","详细设计中"), + CPYSJ("designdone","产品已设计"), + //待确认 + DQR("storyunconfirmed","需求待确认"), + CFM("confirmed","需求已确认"), + KFZ("developing","研发中"), + YWC("finished","已完成"), + CLOSED("closed","已关闭"), + ; + + @EnumValue + private String code; + private String value; + + private UserStoryEnums(String code, String value) { + this.code = code; + this.value = value; + } + + public static UserStoryEnums transfer(String code){ + UserStoryEnums[] values = values(); + for (UserStoryEnums e:values) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public String getCode() { + return this.code; + } + + public String getValue() { + return this.value; + } + +} diff --git a/src/main/java/com/sa/zentao/mapper/ZtStoryUserTaskMapper.java b/src/main/java/com/sa/zentao/mapper/ZtStoryUserTaskMapper.java new file mode 100644 index 0000000..61c807a --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/ZtStoryUserTaskMapper.java @@ -0,0 +1,22 @@ +package com.sa.zentao.mapper; + +import com.sa.zentao.dao.ZtStoryUserTaskDTO; +import com.sa.zentao.entity.ZtStoryUserTask; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.qo.ZtProjectQo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author gqb + * @since 2025-03-25 + */ +public interface ZtStoryUserTaskMapper extends BaseMapper { + + List pageList(@Param("qo") ZtProjectQo qo); +} diff --git a/src/main/java/com/sa/zentao/qo/StoryQo.java b/src/main/java/com/sa/zentao/qo/StoryQo.java index 4d81ba6..5619b20 100644 --- a/src/main/java/com/sa/zentao/qo/StoryQo.java +++ b/src/main/java/com/sa/zentao/qo/StoryQo.java @@ -14,13 +14,13 @@ public class StoryQo extends BaseQo { private Integer id; private String title; - + private String assignedTo; private String userName; private String module; private String searchVal; - private Integer productId; - + private String openedby; + private String status; private List productIds; private String ids; diff --git a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java index eb1bfcc..11d8faf 100644 --- a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java @@ -30,6 +30,12 @@ public class ZtProjectQo extends BaseQo { @TableId(value = "id", type = IdType.AUTO) private Integer id; + private String name; + + private String assignedTo; + + private String severity; + private String productName; private Integer productId; @@ -61,7 +67,7 @@ public class ZtProjectQo extends BaseQo { private String title; private Integer module; - + private Integer moduleId; private Date date; private Integer kfz=0; @@ -85,4 +91,16 @@ public class ZtProjectQo extends BaseQo { private List storyIds; private Boolean needWeek=false; + + private String pri; + + private String openedby; + + private String stage; + + private Date openEndDate; + private Date openStartDate; + //如果查询 execution 迭代里面加的 + private String source; + private String spec; } diff --git a/src/main/java/com/sa/zentao/service/IZtBugService.java b/src/main/java/com/sa/zentao/service/IZtBugService.java index 18a9287..673147d 100644 --- a/src/main/java/com/sa/zentao/service/IZtBugService.java +++ b/src/main/java/com/sa/zentao/service/IZtBugService.java @@ -44,4 +44,6 @@ public interface IZtBugService extends IService { void taskStoryAddBug(ZtBugDTO dto); List bugListByTaskStory(ZtBugDTO dto); + + ZtBugDTO getBugById(Integer id); } diff --git a/src/main/java/com/sa/zentao/service/IZtProductService.java b/src/main/java/com/sa/zentao/service/IZtProductService.java index 1e6ef82..7d3dc1c 100644 --- a/src/main/java/com/sa/zentao/service/IZtProductService.java +++ b/src/main/java/com/sa/zentao/service/IZtProductService.java @@ -49,4 +49,5 @@ public interface IZtProductService extends IService { Map getAllBusinessSelect(ZtAllBusinessDTO dto); + Object searchObj(ZtAllBusinessDTO dto); } diff --git a/src/main/java/com/sa/zentao/service/IZtProjectService.java b/src/main/java/com/sa/zentao/service/IZtProjectService.java index 8b46398..5862fce 100644 --- a/src/main/java/com/sa/zentao/service/IZtProjectService.java +++ b/src/main/java/com/sa/zentao/service/IZtProjectService.java @@ -72,6 +72,8 @@ public interface IZtProjectService extends IService { void executionSyncStory(ZtProjectDTO dto); + //所有产品集 + List allAuthList(); //产品权限 List authProductList(); @@ -133,4 +135,8 @@ public interface IZtProjectService extends IService { List projectTeamById(ZtProjectQo qo); + List executionListNoClosedByProduct(ZtProjectQo qo); + + ZtProjectDTO getProjectById(ZtProjectDTO dto); + } diff --git a/src/main/java/com/sa/zentao/service/IZtStoryService.java b/src/main/java/com/sa/zentao/service/IZtStoryService.java index 8031ad8..7195c3f 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryService.java @@ -57,6 +57,9 @@ public interface IZtStoryService extends IService { //发布 void releaseStory(Integer story); + void taskFinishChangeStatus(Integer story,String finishBy); + + void changeStatus(ZtStoryDTO dto); List execNoSyncProject(ZtProjectQo qo); diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserService.java index 2645ded..f10785c 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryUserService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryUserService.java @@ -6,6 +6,7 @@ import com.sa.zentao.dao.ZtStoryUserDTO; import com.sa.zentao.entity.ZtProduct; import com.sa.zentao.entity.ZtStoryUser; import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.enums.UserStoryEnums; import com.sa.zentao.qo.StoryQo; import com.sa.zentao.qo.ZtProjectQo; @@ -41,4 +42,11 @@ public interface IZtStoryUserService extends IService { List myWaitYsStory(ZtStoryDTO dto); + void changeStatus(Integer id, UserStoryEnums status); + + void improveStory(ZtStoryUserDTO dto); + + void confirmStory(ZtStoryUserDTO dto); + + void needMeetOrDesign(ZtStoryUserDTO dto); } diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java new file mode 100644 index 0000000..ca88f0b --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java @@ -0,0 +1,34 @@ +package com.sa.zentao.service; + +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.ZtStoryUserDTO; +import com.sa.zentao.dao.ZtStoryUserTaskDTO; +import com.sa.zentao.entity.ZtStoryUser; +import com.sa.zentao.entity.ZtStoryUserTask; +import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.qo.ZtProjectQo; + +/** + *

+ * 服务类 + *

+ * + * @author gqb + * @since 2025-03-25 + */ +public interface IZtStoryUserTaskService extends IService { + + PageInfo taskPageList(ZtProjectQo qo); + + void add(ZtStoryUserTaskDTO dto); + + void modify(ZtStoryUserTaskDTO dto); + + void closed(ZtStoryUserTaskDTO dto); + + void cancel(ZtStoryUserTaskDTO dto); + + void finishedTask(ZtStoryUserTaskDTO dto); + + ZtStoryUserTaskDTO getUserStoryTaskById(ZtProjectQo qo); +} diff --git a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java index 1f09e75..a0be1af 100644 --- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java +++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java @@ -84,8 +84,15 @@ public class IZtCountService { Map result = new HashMap<>(); + List pIds = this.projectService.authProductList(); + + if(CollectionUtils.isEmpty(pIds)){ + return result; + } List storyList = storyService.list(new QueryWrapper().lambda() - .eq(ZtStory::getAssignedTo, name).ne(ZtStory::getStatus, "closed")); + .eq(ZtStory::getAssignedTo, name).ne(ZtStory::getStatus, "closed") + .in(ZtStory::getProduct,pIds) + ); List storyCountList = storyList.stream().filter(o -> o.getAssignedTo().equals(name)).filter(o -> !o.getStage().equals("verified")).collect(Collectors.toList()); @@ -104,6 +111,7 @@ public class IZtCountService { .map(o->o.getId()+"").collect(Collectors.joining(","))); List bugList = bugService.list(new QueryWrapper().lambda().eq(ZtBug::getAssignedTo, name) + .in(ZtBug::getProduct,pIds) .ne(ZtBug::getStatus, "closed") ); long bugCount = bugList.stream().filter(o->o.getStatus().equals("active")).count(); @@ -115,6 +123,7 @@ public class IZtCountService { if(userType==UserType.CS){ List myBugList = bugService.list(new QueryWrapper().lambda() .ne(ZtBug::getStatus, "closed") + .in(ZtBug::getProduct,pIds) .and(e->e.eq(ZtBug::getAssignedTo, name).or().eq(ZtBug::getOpenedby, name)) ); result.put("bugCount", myBugList.stream() .map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -122,12 +131,15 @@ public class IZtCountService { result.put("bugCount", bugList.stream().filter(o->o.getStatus().equals("active")) .map(o->o.getId()+"").collect(Collectors.joining(","))); } - result.put("bugTimeOutCount", bugList.stream().filter(o -> o.getDeadline() != null && o.getDeadline().getTime() < date.getTime()) + result.put("bugTimeOutCount", bugList.stream().filter(o -> o.getDeadline() != null &&DateUtils.getDayLast(o.getDeadline()).getTime() < date.getTime()) .filter(o -> "active".equalsIgnoreCase(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + // List taskList = taskService.list(new QueryWrapper().lambda() - .eq(ZtTask::getAssignedTo, name).ne(ZtTask::getStatus, "closed")); + .eq(ZtTask::getAssignedTo, name) + .in(ZtTask::getProduct,pIds) + .ne(ZtTask::getStatus, "closed")); @@ -136,7 +148,7 @@ public class IZtCountService { // taskService.count(new QueryWrapper().lambda() // .eq(ZtTask::getAssignedTo, name).eq(ZtTask::getStatus, "done")); - result.put("taskCount", taskList.stream().filter(o->o.getStatus().equals("doing")||o.getStatus().equals("wait")).map(o->o.getId()+"").collect(Collectors.joining(","))); + result.put("taskCount", taskList.stream().filter(o->o.getStatus().equals("reviewing")||o.getStatus().equals("doing")||o.getStatus().equals("wait")).map(o->o.getId()+"").collect(Collectors.joining(","))); result.put("taskTimeOutCount", taskList.stream().filter(o -> o.getDeadline() != null && DateUtils.getDayLast(o.getDeadline()).getTime() < date.getTime()) .filter(o -> o.getStatus().equalsIgnoreCase("doing")||o.getStatus().equalsIgnoreCase("wait")).map(o->o.getId()+"").collect(Collectors.joining(","))); if (taskCount == 0 && bugCount == 0) { @@ -147,9 +159,10 @@ public class IZtCountService { } List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda() .ne(ZtStoryFeedback::getStatus, "closed") + .in(ZtStoryFeedback::getProduct,pIds) .eq(ZtStoryFeedback::getAssignedTo,RiskUserThreadLocal.get().getName()) ); - //处理中 问题 + //处理中 问题 wait doing finished submitVerified 提交验收 closed reviewing verified result.put("feedbackActive",feedbacks.stream().filter(o->"doing".equals(o.getStatus())).map(o->o.getId()+"").collect(Collectors.joining(","))); //处理完 问题 result.put("feedbackFinished",feedbacks.stream().filter(o->"finished".equals(o.getStatus())).map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -172,40 +185,33 @@ public class IZtCountService { } - + //问题反馈 项目管理员看自己的 公司高层 产品看全部 public ZtStoryCountDTO storyCount(ZtCaseDTO dto) { LoginRiskUser loginRiskUser = RiskUserThreadLocal.get(); UserType userType = loginRiskUser.getUserType(); ZtStoryCountDTO result = new ZtStoryCountDTO(); + List pIds = this.projectService.authProductList(); if (loginRiskUser.getName().equals("admin")||userType == UserType.GSGC) { - List integers = this.projectService.authProductList(); + List list =null; - - if(!loginRiskUser.getName().equals("admin")){ - if(!CollectionUtils.isEmpty(integers)){ - list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getProduct,integers).in(ZtStoryUser::getStatus, "active", "reviewing")); - }else{ - list=new ArrayList<>(); - } - }else{ - list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); - } - List ztStory = null; - if(!loginRiskUser.getName().equals("admin")){ - if(!CollectionUtils.isEmpty(integers)){ + if(!CollectionUtils.isEmpty(pIds)){ + list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getProduct,pIds).in(ZtStoryUser::getStatus, "active", "reviewing")); ztStory = storyService.list(new QueryWrapper() .lambda().eq(ZtStory::getDeleted, "0") - .in(ZtStory::getProduct,integers) + .in(ZtStory::getProduct,pIds) .ne(ZtStory::getStatus, "closed") ); }else{ + list=new ArrayList<>(); ztStory=new ArrayList<>(); } }else{ + list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); + if(CollectionUtils.isEmpty(list)){ ztStory=new ArrayList<>(); }else{ @@ -214,10 +220,10 @@ public class IZtCountService { .ne(ZtStory::getStatus, "closed") ); } - } - List products = this.productService.list(new QueryWrapper().lambda().eq(ZtProduct::getStatus, "normal")); + + List products = this.productService.list(new QueryWrapper().lambda().eq(ZtProduct::getStatus, "normal").in(ZtProduct::getId, pIds)); if(!CollectionUtils.isEmpty(products)){ List userStrList = products.stream().filter(o -> !StringUtils.isEmpty(o.getReviewer())).map(o->o.getReviewer()).collect(Collectors.toList()); List users=new ArrayList<>(); @@ -262,8 +268,8 @@ public class IZtCountService { //延期需求改成延期任务 List tList = this.taskService.list(new QueryWrapper().lambda() .in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList())) - .notIn(ZtTask::getStatus,"pause","cancel","closed","done") - .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); + .notIn(ZtTask::getStatus,"pause","cancel","closed","done","reviewing") + .last(" and DATE(now()) > DATE(deadline) ")); result.setYqCount(tList.stream().map(o->o.getId()+"").collect(Collectors.joining(","))); } @@ -277,7 +283,7 @@ public class IZtCountService { .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setDysCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("released") - || (o.getStage().equals("verified")&&o.getYsFlag()==2) + ) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) @@ -289,29 +295,21 @@ public class IZtCountService { .filter(o -> o.getYsFlag() == 1||o.getYsFlag() == 0) .map(o->o.getId()+"").collect(Collectors.joining(","))); - List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda().ne(ZtStoryFeedback::getStatus, "closed")); - - //问题反馈 未受理 - result.setFeedbackWslCount(feedbacks.stream().filter(o->"wait".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //处理中的 - result.setFeedbackClzCount(feedbacks.stream().filter(o->"doing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //处理完的 - result.setFeedbackClwCount(feedbacks.stream().filter(o->"finished".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //延期的 - result.setFeedbackYqCount(feedbacks.stream().filter(o->!Arrays.asList("finished","closed").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); - result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda() + .in(ZtStoryFeedback::getProduct,pIds) + .ne(ZtStoryFeedback::getStatus, "closed")); + result= setFeedback(result,feedbacks); } else if (userType == UserType.CP ) { - List integers = this.projectService.authList(); List list =null; List storyUsers =null; - if(CollectionUtils.isEmpty(integers)){ + if(CollectionUtils.isEmpty(pIds)){ list=new ArrayList<>(); storyUsers=new ArrayList<>(); }else{ - list = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, integers)); - storyUsers = this.storyUserService.list(new QueryWrapper().lambda() + list = this.productService.listByIds(pIds); + storyUsers =CollectionUtils.isEmpty(list)?new ArrayList<>(): this.storyUserService.list(new QueryWrapper().lambda() .in(ZtStoryUser::getStatus, "active", "reviewing") .in(ZtStoryUser::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList())) // .eq(ZtStoryUser::getAssignedto,loginRiskUser.getName()) @@ -344,8 +342,8 @@ public class IZtCountService { //延期需求改成延期任务 TODO List tList = this.taskService.list(new QueryWrapper().lambda() .in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList())) - .notIn(ZtTask::getStatus,"pause","cancel","closed","done") - .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); + .notIn(ZtTask::getStatus,"pause","cancel","closed","done","reviewing") + .last(" and DATE(now()) > DATE(deadline) ")); result.setYqCount(tList.stream().map(o->o.getId()+"").collect(Collectors.joining(","))); } } @@ -382,27 +380,18 @@ public class IZtCountService { List feedbacks = this.storyFeedbackService.list(new QueryWrapper() .lambda().ne(ZtStoryFeedback::getStatus, "closed") + .in(ZtStoryFeedback::getProduct,pIds) .eq(ZtStoryFeedback::getAssignedTo,loginRiskUser.getName()).or().eq(ZtStoryFeedback::getOpenedBy,loginRiskUser.getName()) ); - //问题反馈 未受理 - result.setFeedbackWslCount(feedbacks.stream().filter(o->"wait".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //处理中的 - result.setFeedbackClzCount(feedbacks.stream().filter(o->"doing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //处理完的 - result.setFeedbackClwCount(feedbacks.stream().filter(o->"finished".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //延期的 - result.setFeedbackYqCount(feedbacks.stream().filter(o->!Arrays.asList("finished","closed").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); - result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + result= setFeedback(result,feedbacks); } else if (userType == UserType.XMGLY) { - List integers = this.projectService.authList(); - List pList = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, integers)); + List pList = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, pIds)); List storyUsers = this.storyUserService.list(new QueryWrapper().lambda() .in(ZtStoryUser::getStatus, "active", "reviewing") @@ -419,17 +408,9 @@ public class IZtCountService { // .or() // .in() - if(!CollectionUtils.isEmpty(integers)){ + if(!CollectionUtils.isEmpty(pIds)){ //所有的产品 - if(!CollectionUtils.isEmpty(pList)){ - eq.in(ZtStory::getProduct,pList.stream().map(o->o.getId()).collect(Collectors.toList())); - List list = this.projectproductService.list(new QueryWrapper().lambda() - .in(ZtProjectproduct::getProduct, pList.stream().map(o -> o.getId()).collect(Collectors.toList()))); - if(!CollectionUtils.isEmpty(list)){ - eq.or().in(ZtStory::getProject,list.stream().map(o->o.getProject()).collect(Collectors.toList())); - } - ztStory=this.storyService.list(eq); - } + eq.in(ZtStory::getProduct,pIds); } result.setDpsCount(storyUsers.stream().filter(o -> "reviewing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -441,10 +422,10 @@ public class IZtCountService { .filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("testing")) .map(o->o.getId()+"").collect(Collectors.joining(","))); + .filter(o -> Arrays.asList("testing","tested").contains(o.getStage())) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("developing")) .map(o->o.getId()+"").collect(Collectors.joining(","))); + .filter(o -> Arrays.asList("developing","developed").contains(o.getStage()) ) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setYqCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> !o.getStage().equals("verified") && !o.getStage().equals("verified")) .filter(o -> o.getPlanEndDate() != null && o.getPlanEndDate().getTime() < new Date().getTime()) @@ -467,8 +448,9 @@ public class IZtCountService { }else{ List tList = this.taskService.list(new QueryWrapper().lambda() .in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList())) - .notIn(ZtTask::getStatus,"pause","cancel","closed","done") - .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); + .notIn(ZtTask::getStatus,"pause","cancel","closed","done","reviewing") + .last(" and DATE(now()) > DATE(deadline) ")); +// .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); result.setYqCount(tList.stream().map(o->o.getId()+"").collect(Collectors.joining(","))); } @@ -476,6 +458,10 @@ public class IZtCountService { .filter(o -> o.getStage().equals("verified")) .filter(o -> o.getYsFlag() == 1) .map(o->o.getId()+"").collect(Collectors.joining(","))); + result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) + .filter(o -> o.getStage().equals("verified")) + .filter(o -> o.getYsFlag() == 2) + .map(o->o.getId()+"").collect(Collectors.joining(","))); List active = bugService.list(new QueryWrapper().lambda().eq(ZtBug::getStatus, "active")); result.setBugCount(active.stream(). map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -486,17 +472,7 @@ public class IZtCountService { .in(ZtStoryFeedback::getProduct,pList.stream().map(o->o.getId()).collect(Collectors.toList())) ); - - //问题反馈 未受理 - result.setFeedbackWslCount(feedbacks.stream().filter(o->"wait".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //处理中的 - result.setFeedbackClzCount(feedbacks.stream().filter(o->"doing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //处理完的 - result.setFeedbackClwCount(feedbacks.stream().filter(o->"finished".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - //延期的 - result.setFeedbackYqCount(feedbacks.stream().filter(o->!Arrays.asList("finished","closed").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); - - result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + result= setFeedback(result,feedbacks); } @@ -508,6 +484,21 @@ public class IZtCountService { return result; } + private ZtStoryCountDTO setFeedback(ZtStoryCountDTO result,List feedbacks) { + + + //问题反馈 未受理 + result.setFeedbackWslCount(feedbacks.stream().filter(o->"wait".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + //处理中的 wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理 + result.setFeedbackClzCount(feedbacks.stream().filter(o->Arrays.asList("doing","finished","submitVerified").contains(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + //处理完的 + result.setFeedbackClwCount(feedbacks.stream().filter(o->Arrays.asList("verified").contains(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + //延期的 + result.setFeedbackYqCount(feedbacks.stream().filter(o->Arrays.asList("doing","wait").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); + result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); + return result; + } + @Autowired private IZtExecutionprojectService executionprojectService; diff --git a/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java index 7e59ed3..f04cf1f 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java @@ -42,6 +42,8 @@ public class ZtActionServiceImpl extends ServiceImpl i @Autowired private IZtStoryService storyService; @Autowired + private IZtStoryFeedbackService storyFeedbackService; + @Autowired private IZtTaskService taskService; @Autowired private IZtBugService bugService; @@ -148,12 +150,18 @@ public class ZtActionServiceImpl extends ServiceImpl i } } + if(ActionType.WTFK.getValue().equals(t.getObjecttype())){ + ZtStoryFeedback storyFeedback = storyFeedbackService.getById(t.getObjectid()); + if(storyFeedback!=null){ + s.setActionValue("问题反馈:"+storyFeedback.getSpec()+"-"+s.getActionValue()); + } + } + if(ActionType.FB.getValue().equals(t.getObjecttype())){ ZtRelease release = releaseService.getById(t.getObjectid()); if(release!=null){ s.setActionValue("发布:"+release.getName()+"-"+s.getActionValue()); } - } if(ActionType.RW.getValue().equals(t.getObjecttype())){ diff --git a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java index 2816c78..e616e86 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java @@ -22,6 +22,7 @@ import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; +import com.sa.zentao.utils.DateUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -86,9 +87,35 @@ public class ZtBugServiceImpl extends ServiceImpl implements @Override public PageInfo bugPageList(ZtProjectQo qo) { + + List pIds = this.projectService.authProductList(); + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); qo.setUserName(RiskUserThreadLocal.get().getName()); - List result = this.baseMapper.bugPageList(qo); + + List result =null; + if(StringUtils.isEmpty(qo.getSource())){ + + if(CollectionUtils.isEmpty(pIds)){ + return new PageInfo<>(); + } + if (!StringUtils.isEmpty(qo.getIds())) { + String[] split = qo.getIds().split(","); + qo.setObjIds(new ArrayList<>(Arrays.asList(split))); + }else{ + qo.setProductIds(pIds); + } + + result = this.baseMapper.bugPageList(qo); + }else if("execution".equals(qo.getSource())){ + qo.setExecution(qo.getProject().toString()); + qo.setProject(null); + result = this.baseMapper.bugPageList(qo); + }else if("project".equals(qo.getSource())){ + result = this.baseMapper.bugPageList(qo); + } + long total = page.getTotal(); + if(!CollectionUtils.isEmpty(result)){ List fIds = result.stream().map(o -> o.getOpenedby()).collect(Collectors.toList()); fIds.addAll(result.stream().map(o->o.getAssignedTo()).collect(Collectors.toList())); @@ -112,7 +139,9 @@ public class ZtBugServiceImpl extends ServiceImpl implements } } } - return new PageInfo(result); + PageInfo ztBugDTOPageInfo = new PageInfo<>(result); + ztBugDTOPageInfo.setTotal(total); + return ztBugDTOPageInfo; } @@ -225,21 +254,52 @@ public class ZtBugServiceImpl extends ServiceImpl implements if(tostory!=null&&tostory!=0){ d.setZtStory(this.storyService.getById(tostory)); } + Integer productId = ztBug.getProduct(); + if(productId!=null&&productId!=0){ + ZtProduct product = this.productService.getById(productId); + d.setProductName(product==null?null:product.getName()); + } + String lasteditedby = d.getLasteditedby(); + + String closedby = d.getClosedby(); + Map userMap = this.userService.userMapByIds(null); ZtUser ztUser = userMap.get(d.getAssignedTo()); - if(ztUser!=null){ - d.setAssignedToName(ztUser.getNickname()); - } ztUser = userMap.get(d.getOpenedby()); if(ztUser!=null){ d.setOpenedbyName(ztUser.getNickname()); } - ztUser = userMap.get(d.getYsUser()); + ztUser = userMap.get(d.getAssignedTo()); + if(ztUser!=null){ + d.setAssignedToName(ztUser.getNickname()); + } + + ztUser = userMap.get(d.getResolvedby()); + if(ztUser!=null){ + d.setResolvedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getYsUser()); if(ztUser!=null){ d.setYsUserName(ztUser.getNickname()); } + ztUser = userMap.get(d.getLasteditedby()); + if(ztUser!=null){ + d.setLasteditedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getClosedby()); + if(ztUser!=null){ + d.setClosedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getLasteditedby()); + if(ztUser!=null){ + d.setLasteditedbyName(ztUser.getNickname()); + } + + if (d.getDeadline() != null) { + d.setDeadline(DateUtils.getDayLast(d.getDeadline())); + } return d; } @@ -255,7 +315,7 @@ public class ZtBugServiceImpl extends ServiceImpl implements if(!ztBug.getOpenedby().equals(loginRiskUser.getName())){ if(!ztBug.getAssignedTo().equals(loginRiskUser.getName())){ - if(loginRiskUser.getUserType()!=UserType.XMGLY||loginRiskUser.getUserType()!=UserType.GSGC){ + if(loginRiskUser.getUserType()!=UserType.XMGLY&&loginRiskUser.getUserType()!=UserType.GSGC){ throw new BusinessException("当前无法指派请联系管理员"); } } @@ -269,11 +329,12 @@ public class ZtBugServiceImpl extends ServiceImpl implements ztBug.setAssignedTo(qo.getAssignedTo()); + ztBug.setAssigneddate(new Date()); ztBug.setLasteditedby(RiskUserThreadLocal.get().getName()); ztBug.setLastediteddate(new Date()); this.baseMapper.updateById(ztBug); this.actionService.addAction(ActionType.BUG, ActionStatus.FP,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution() - ,RiskUserThreadLocal.get().getName(),ztBug.getSteps(),"" + ,RiskUserThreadLocal.get().getName(),null,qo.getAssignedTo() ); } @@ -444,6 +505,11 @@ public class ZtBugServiceImpl extends ServiceImpl implements return ztBugDTOS; } + @Override + public ZtBugDTO getBugById(Integer id) { + return this.bugInfoById(id); + } + @Override @Transactional @@ -544,6 +610,8 @@ public class ZtBugServiceImpl extends ServiceImpl implements if("closed".equalsIgnoreCase(qo.getStatus())){ // ztBug.setStatus("closed"); + ztBug.setClosedby(RiskUserThreadLocal.get().getName()); + ztBug.setCloseddate(new Date()); this.actionService.addAction(ActionType.BUG, ActionStatus.GB,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution() ,RiskUserThreadLocal.get().getName(),qo.getDesc(),"" ); @@ -577,6 +645,9 @@ public class ZtBugServiceImpl extends ServiceImpl implements ztBug.setResolution(dto.getResolution()); ztBug.setResolveddate(new Date()); ztBug.setAssignedTo(dto.getAssignedTo()); + ztBug.setAssigneddate(new Date()); + ztBug.setLastediteddate(ztBug.getResolveddate()); + ztBug.setLasteditedby(RiskUserThreadLocal.get().getName()); this.baseMapper.updateById(ztBug); if(ztBug.getExecution()!=null&&ztBug.getExecution()!=0) { kanbanlaneService.changeStatus(ztBug.getExecution(), ztBug.getId(), "bug", "fixed"); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java index eb6ac1d..f9004ad 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java @@ -87,6 +87,9 @@ public class ZtEffortServiceImpl extends ServiceImpl i } //剩余 ztTask.setLeft(max.getLeft()); + if(ztTask.getLeft()<0){ + ztTask.setLeft(0f); + } ztTask.setConsumed(ztTask.getConsumed()+f); this.saveBatch(saveList); taskService.updateById(ztTask); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java index 31919e8..ce1a8c9 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java @@ -2,10 +2,7 @@ package com.sa.zentao.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.sa.zentao.conf.RiskUserThreadLocal; -import com.sa.zentao.dao.Result; -import com.sa.zentao.dao.ZtKanbancolumnDTO; -import com.sa.zentao.dao.ZtKanbanlaneDTO; -import com.sa.zentao.dao.ZtStoryDTO; +import com.sa.zentao.dao.*; import com.sa.zentao.entity.*; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; @@ -113,7 +110,7 @@ public class ZtKanbanlaneServiceImpl extends ServiceImplo.getId()).collect(Collectors.toList())); } if(ztUser!=null){ - st.setAssignedTo(ztUser.getNickname()); + st.setAssignedToName(ztUser.getNickname()); st.setColor(ztUser.getColor()); } List storyspecs = storySpecList.stream().filter(o -> o.getStory().intValue() == st.getId().intValue()).collect(Collectors.toList()); @@ -131,49 +128,54 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl ztBugs = bugService.listByIds(ids); + List ztBugDTOS =new ArrayList<>(); + if(!CollectionUtils.isEmpty(ztBugs)){ - for (ZtBug st:ztBugs) { + ztBugDTOS=BeanCopyUtil.copyListProperties(ztBugs, ZtBugDTO::new); + for (ZtBugDTO st:ztBugDTOS) { ZtUser ztUser = userMap.get(st.getAssignedTo()); if(ztUser!=null){ st.setColor(ztUser.getColor()); - st.setAssignedTo(ztUser.getNickname()); + st.setAssignedToName(ztUser.getNickname()); } } } - d.setList(ztBugs); + d.setList(ztBugDTOS); }else if("task".equalsIgnoreCase(d.getCardType())){ List ztTasks = taskService.listByIds(ids); + List ztTaskDTOS =new ArrayList<>(); if(!CollectionUtils.isEmpty(ztTasks)){ - for (ZtTask st:ztTasks) { + ztTaskDTOS=BeanCopyUtil.copyListProperties(ztTasks,ZtTaskDTO::new); + for (ZtTaskDTO st:ztTaskDTOS) { ZtUser ztUser = userMap.get(st.getAssignedTo()); if(ztUser!=null){ st.setColor(ztUser.getColor()); - st.setAssignedTo(ztUser.getNickname()); + st.setAssignedToName(ztUser.getNickname()); } if(st.getDeadline()!=null){ st.setDeadline(DateUtils.getDayLast(st.getDeadline())); } ztUser = userMap.get(st.getOpenedby()); if(ztUser!=null){ - st.setOpenedby(ztUser.getNickname()); + st.setOpenedbyName(ztUser.getNickname()); } ztUser = userMap.get(st.getFinishedby()); if(ztUser!=null){ - st.setFinishedby(ztUser.getNickname()); + st.setFinishedbyName(ztUser.getNickname()); } ztUser = userMap.get(st.getCanceledby()); if(ztUser!=null){ - st.setCanceledby(ztUser.getNickname()); + st.setCanceledbyName(ztUser.getNickname()); } ztUser = userMap.get(st.getClosedby()); if(ztUser!=null){ - st.setClosedby(ztUser.getNickname()); + st.setClosedbyName(ztUser.getNickname()); } } } - d.setList(ztTasks); + d.setList(ztTaskDTOS); } } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java index cbe356a..b1f43bf 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java @@ -550,6 +550,21 @@ public class ZtProductServiceImpl extends ServiceImpl> getChildrenMap(List result) { List ztProjects = this.baseMapper.selectList( diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java index ca4a344..f489fa7 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java @@ -864,6 +864,8 @@ public class ZtProjectServiceImpl extends ServiceImpl authProductList() { List authList = authList(); @@ -877,7 +879,11 @@ public class ZtProjectServiceImpl extends ServiceImpl o.getId()).collect(Collectors.toList()); } } - + @Override + public List allAuthList() { + return this.baseMapper.selectList(new QueryWrapper() + .lambda().eq(ZtProject::getType, "program")).stream().map(o -> o.getId()).collect(Collectors.toList()); + } @Override public List authList() { ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName()); @@ -1003,6 +1009,55 @@ public class ZtProjectServiceImpl extends ServiceImpl o.getAccount()).collect(Collectors.toList()); } + + @Override + public List executionListNoClosedByProduct(ZtProjectQo qo) { + + Integer productId = qo.getProductId(); + Integer project = qo.getProject(); + + + if(project!=null&&project!=0){ + List list = this.executionprojectService.list(new QueryWrapper().lambda().eq(ZtExecutionproject::getProject, project)); + if(!CollectionUtils.isEmpty(list)){ + return this.listByIds(list.stream().map(o->o.getExecution()).collect(Collectors.toList())); + } + } + + if(productId!=null&&productId!=0){ + List list = this.projectproductService.list(new QueryWrapper() + .lambda().eq(ZtProjectproduct::getProduct, productId)); + if(!CollectionUtils.isEmpty(list)){ + List eList = this.executionprojectService.list(new QueryWrapper().lambda(). + in(ZtExecutionproject::getProject, list.stream().map(o->o.getProject()).collect(Collectors.toList()))); + if(!CollectionUtils.isEmpty(eList)){ + return this.list(new QueryWrapper().lambda().in(ZtProject::getId,eList.stream().map(o->o.getExecution()).collect(Collectors.toList())) + .ne(ZtProject::getStatus,"closed").ne(ZtProject::getDeleted,"1") + ); + } + } + } + + + return new ArrayList<>(); + } + + @Override + public ZtProjectDTO getProjectById(ZtProjectDTO dto) { + ZtProject project = this.baseMapper.selectById(dto.getId()); + if(project==null){ + throw new BusinessException("未查询到数据"); + } + ZtProjectDTO d=new ZtProjectDTO(); + BeanUtils.copyProperties(project,d); + + List list = this.projectproductService.list(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, dto.getId())); + + d.setProduct(list.get(0).getProduct()); + + return d; + } + @Override public void projectTeamUpdate(ZtProjectQo qo) { List teamList = qo.getTeamList(); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java index 5d9f684..e1eace0 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java @@ -137,8 +137,13 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl 0) { @@ -153,7 +158,7 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl ztStoryFeedbackDTO(ZtProjectQo qo) { - List authList = this.projectService.authList(); - if (CollectionUtils.isEmpty(authList)) { - return new ArrayList<>(); - } - List list = productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, authList)); - if (CollectionUtils.isEmpty(list)) { + List pList = this.projectService.authProductList(); + if (CollectionUtils.isEmpty(pList)) { return new ArrayList<>(); } LambdaQueryWrapper query = new QueryWrapper().lambda() - .eq(ZtStoryFeedback::getAssignedTo, RiskUserThreadLocal.get().getName()) - .or().eq(ZtStoryFeedback::getOpenedBy, RiskUserThreadLocal.get().getName()); + .and(o->o.eq(ZtStoryFeedback::getAssignedTo, RiskUserThreadLocal.get().getName()) + .or().eq(ZtStoryFeedback::getOpenedBy, RiskUserThreadLocal.get().getName())); + if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getSearchValue())) { if ("ALL".equals(qo.getSearchValue())) { query.eq(ZtStoryFeedback::getAssignedTo, RiskUserThreadLocal.get().getName()); @@ -283,10 +285,10 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl o.getId()).collect(Collectors.toList())); + }else { + query.in(ZtStoryFeedback::getProduct, pList); } query.orderByDesc(ZtStoryFeedback::getId); List closed = this.baseMapper.selectList( @@ -303,6 +305,9 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl authList = this.projectService.authList(); + if (RiskUserThreadLocal.get().getUserType()==UserType.GSGC) { + authList = this.projectService.allAuthList(); + } if (CollectionUtils.isEmpty(authList)) { return new PageInfo(); } @@ -312,7 +317,39 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + List listFeedback = this.myPageList(qo,list); + long total = page.getTotal(); + + + List ztStoryFeedbackDTOS = BeanCopyUtil.copyListProperties(listFeedback, ZtStoryFeedbackDTO::new); + if (!CollectionUtils.isEmpty(ztStoryFeedbackDTOS)) { + Map userMap = this.userService.userMapByIds(null); + Map pMap = this.productService.selectMapProduct(); + for (ZtStoryFeedbackDTO f : ztStoryFeedbackDTOS) { + ZtProduct ztProduct = pMap.get(f.getProduct()); + if (ztProduct != null) { + f.setProductName(ztProduct.getName()); + } + + ZtUser ztUser = userMap.get(f.getOpenedBy()); + if (ztUser != null) { + f.setOpenedByName(ztUser.getNickname()); + } + ztUser = userMap.get(f.getAssignedTo()); + if (ztUser != null) { + f.setAssignedToName(ztUser.getNickname()); + } + + } + } + PageInfo pageResult = new PageInfo<>(ztStoryFeedbackDTOS); + pageResult.setTotal(total); + + return pageResult; + } + + private List myPageList(ZtProjectQo qo,List list) { LambdaQueryWrapper query = new QueryWrapper().lambda(); // .and(w->{ // w.eq(ZtStoryFeedback::getAssignedTo, RiskUserThreadLocal.get().getName()) @@ -359,10 +396,26 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl o.getId()).collect(Collectors.toList())); } if (qo.getStartDate() != null) { - query.gt(ZtStoryFeedback::getOpenedDate, qo.getStartDate()); + query.ge(ZtStoryFeedback::getOpenedDate, qo.getStartDate()); } if (qo.getEndDate() != null) { - query.lt(ZtStoryFeedback::getOpenedDate, qo.getEndDate()); + query.le(ZtStoryFeedback::getOpenedDate, qo.getEndDate()); + } + if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getType())) { + query.eq(ZtStoryFeedback::getType, qo.getType()); + } + if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getSpec())) { + query.eq(ZtStoryFeedback::getSpec, qo.getSpec()); + } + if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getStatus())) { + query.eq(ZtStoryFeedback::getStatus, qo.getStatus()); + } + + if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getOpenedby())) { + query.eq(ZtStoryFeedback::getOpenedBy, qo.getOpenedby()); + } + if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getSource())) { + query.eq(ZtStoryFeedback::getSource, qo.getSource()); } query.orderByDesc(ZtStoryFeedback::getId); @@ -370,44 +423,20 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl listFeedback = this.baseMapper.selectList( query ); - - - List ztStoryFeedbackDTOS = BeanCopyUtil.copyListProperties(listFeedback, ZtStoryFeedbackDTO::new); - if (!CollectionUtils.isEmpty(ztStoryFeedbackDTOS)) { - Map userMap = this.userService.userMapByIds(null); - Map pMap = this.productService.selectMapProduct(); - for (ZtStoryFeedbackDTO f : ztStoryFeedbackDTOS) { - ZtProduct ztProduct = pMap.get(f.getProduct()); - if (ztProduct != null) { - f.setProductName(ztProduct.getName()); - } - - ZtUser ztUser = userMap.get(f.getOpenedBy()); - if (ztUser != null) { - f.setOpenedByName(ztUser.getNickname()); - } - ztUser = userMap.get(f.getAssignedTo()); - if (ztUser != null) { - f.setAssignedToName(ztUser.getNickname()); - } - - } - } - return new PageInfo<>(ztStoryFeedbackDTOS); - + return listFeedback; } @Override public void closedFeedback(ZtStoryFeedbackDTO dto) { -// ZtStoryFeedback ztStoryFeedback = this.baseMapper.selectById(dto.getId()); -// if(ztStoryFeedback==null){ -// throw new BusinessException("未查询到数据"); -// } -// ztStoryFeedback.setStatus("closed"); -// ztStoryFeedback.setCloseRemark(dto.getCloseRemark()); -// ztStoryFeedback.setCloseDate(new Date()); -// ztStoryFeedback.setClosedBy(RiskUserThreadLocal.get().getName()); -// this.baseMapper.updateById(ztStoryFeedback); + ZtStoryFeedback ztStoryFeedback = this.baseMapper.selectById(dto.getId()); + if(ztStoryFeedback==null){ + throw new BusinessException("未查询到数据"); + } + ztStoryFeedback.setStatus("closed"); + ztStoryFeedback.setCloseRemark(dto.getCloseRemark()); + ztStoryFeedback.setCloseDate(new Date()); + ztStoryFeedback.setClosedBy(RiskUserThreadLocal.get().getName()); + this.baseMapper.updateById(ztStoryFeedback); } @@ -454,6 +483,10 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl list = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getFeedback, feedbackId)); @@ -497,6 +532,10 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl storyDTOList = BeanCopyUtil.copyListProperties(storyList, ZtStoryDTO::new); for (ZtStoryDTO dto:storyDTOList ) { - ztUser = userMap.get(d.getAssignedTo()); + ztUser = userMap.get(dto.getAssignedTo()); if(ztUser!=null){ - d.setAssignedToName(ztUser.getNickname()); + dto.setAssignedToName(ztUser.getNickname()); } ztUser = userMap.get(dto.getOpenedby()); @@ -684,6 +728,7 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl impl List executions = dto.getExecutions(); if (!CollectionUtils.isEmpty(executions)) { + +// List oldExecIds = pList.stream().map(o -> o.getProject()).collect(Collectors.toList()); + //查找需求管理的项目 需求只会被项目关联一次 + + List list = this.executionprojectService.list(new QueryWrapper().lambda().in(ZtExecutionproject::getExecution, executions)); + if(!CollectionUtils.isEmpty(list)){ + Map> map = list.stream().collect(Collectors.groupingBy(ZtExecutionproject::getProject)); + if(map.keySet().size()>1){ + throw new BusinessException("当前无法关联多个项目请检查"); + } + + } + this.executionBindStory(s, executions); } @@ -267,6 +281,15 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } private ZtStory buildStory(ZtStoryDTO dto) { + if(dto.getUserStory()!=null&&dto.getUserStory()!=0){ + ZtStoryUser ztStoryUser = this.storyUserService.getById(dto.getUserStory()); + if(ztStoryUser==null){ + throw new BusinessException("未查询到用户需求"); + } + if(UserStoryEnums.transfer(ztStoryUser.getStatus())!=UserStoryEnums.CFM ){ + throw new BusinessException("无法关联未确认的需求"); + } + } ZtStory s = new ZtStory(); BeanUtils.copyProperties(dto, s); s.setVersion(1); @@ -426,6 +449,14 @@ public class ZtStoryServiceImpl extends ServiceImpl impl List oldExecIds = pList.stream().map(o -> o.getProject()).collect(Collectors.toList()); //查找需求管理的项目 需求只会被项目关联一次 + List list = this.executionprojectService.list(new QueryWrapper().lambda().in(ZtExecutionproject::getExecution, executions)); + if(!CollectionUtils.isEmpty(list)){ + Map> map = list.stream().collect(Collectors.groupingBy(ZtExecutionproject::getProject)); + if(map.keySet().size()>1){ + throw new BusinessException("当前无法关联多个项目请检查"); + } + + } List execList = new ArrayList(); for (Integer exec : executions) { if (!oldExecIds.contains(exec)) { @@ -681,23 +712,24 @@ public class ZtStoryServiceImpl extends ServiceImpl impl UserType userType = RiskUserThreadLocal.get().getUserType(); - List closed = this.baseMapper.selectList(new QueryWrapper().lambda() - .ne(ZtStory::getStatus, "closed") - .eq(ZtStory::getAssignedTo, RiskUserThreadLocal.get().getName()) - .or().eq(ZtStory::getOpenedby, RiskUserThreadLocal.get().getName()) - ); - List storyDTOList = BeanCopyUtil.copyListProperties(closed, ZtStoryDTO::new); - - if (userType == UserType.CP) { - List uStory = this.storyUserService.list(new QueryWrapper().lambda().ne(ZtStoryUser::getStatus, "closed") - .or().eq(ZtStoryUser::getOpenedby, RiskUserThreadLocal.get().getName()) - ); - if (!CollectionUtils.isEmpty(uStory)) { - List storyDTOList1 = BeanCopyUtil.copyListProperties(uStory, ZtStoryDTO::new); - storyDTOList.addAll(storyDTOList1); - - } + List pAuth = this.projectService.authProductList(); + if(CollectionUtils.isEmpty(pAuth)){ + return Arrays.asList(); } + + List sList = this.baseMapper.selectList(new QueryWrapper().lambda() + .ne(ZtStory::getStatus, "closed") + .in(ZtStory::getProduct,pAuth) + .and(o-> o.eq(ZtStory::getAssignedTo, RiskUserThreadLocal.get().getName()) + .or().eq(ZtStory::getOpenedby, RiskUserThreadLocal.get().getName())) + + ); + List storyDTOList = BeanCopyUtil.copyListProperties(sList, ZtStoryDTO::new,new BeanCopyUtilCallBack() { + @Override + public void callBack(ZtStory t, ZtStoryDTO s) { + s.setOpeneddate(t.getOpenedDate()); + } + }); if (!CollectionUtils.isEmpty(storyDTOList)) { Map> executionMapByStory = getExecutionMapByStory(storyDTOList); for (ZtStoryDTO d : storyDTOList) { @@ -710,6 +742,18 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } } + if (userType == UserType.CP) { + List uStory = this.storyUserService.list(new QueryWrapper().lambda().ne(ZtStoryUser::getStatus, "closed") + .in(ZtStoryUser::getProduct,pAuth) + .eq(ZtStoryUser::getOpenedby, RiskUserThreadLocal.get().getName()) + ); + if (!CollectionUtils.isEmpty(uStory)) { + List storyDTOList1 = BeanCopyUtil.copyListProperties(uStory, ZtStoryDTO::new); + storyDTOList.addAll(storyDTOList1); + + } + } + return storyDTOList; } @@ -735,11 +779,15 @@ public class ZtStoryServiceImpl extends ServiceImpl impl Map userMap = this.userService.userMapByIds(null); + Map> taskCountMap = getTaskCountMap(list); for (ZtStoryDTO d : list) { d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); d.setViews(rMap.get(d.getId())); + List ztTasks = taskCountMap.get(d.getId()); + + d.setTaskCount(ztTasks==null?0:ztTasks.size()); List ztProjectList = execMap.get(d.getId()); @@ -767,6 +815,16 @@ public class ZtStoryServiceImpl extends ServiceImpl impl return new PageInfo(list); } + private Map> getTaskCountMap(List list) { + + List tList = this.taskService.list(new QueryWrapper().lambda().in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if(CollectionUtils.isEmpty(tList)){ + return new HashMap<>(); + }else{ + return tList.stream().collect(Collectors.groupingBy(ZtTask::getStory)); + } + } + //需求id 执行 public Map> getExecutionMapByStory(List list) { List pStoryList = projectstoryService.list(new QueryWrapper().lambda().eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue()) @@ -942,7 +1000,8 @@ public class ZtStoryServiceImpl extends ServiceImpl impl //任务没有做完 如果任务还没开始 if (!CollectionUtils.isEmpty(taskList)) { if (Arrays.asList("wait", "projected").contains(ztStory.getStage())) { - this.startStory(id); + + this.taskFinishChangeStatus(id,null); } return; } @@ -972,7 +1031,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } if (Arrays.asList("wait").contains(ztStory.getStage()) && !CollectionUtils.isEmpty(taskList)) { - this.startStory(id); + this.taskFinishChangeStatus(id,null); return; } @@ -1144,6 +1203,77 @@ public class ZtStoryServiceImpl extends ServiceImpl impl RiskUserThreadLocal.get().getName(), null, ""); } + @Override + public void taskFinishChangeStatus(Integer story, String finishBy) { + if(story==null||story==0){ + return; + } + ZtStory ztStory = this.baseMapper.selectById(story); + + List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, "devel")); + //如果开发有任务 并且状态需要变为开发中 + if(!CollectionUtils.isEmpty(taskList)&&Arrays.asList( "wait", "projected", "developing").contains(ztStory.getStage())){ + //如果测试已经开始 那么测试进行中 + List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "doing", "done")) + .eq(ZtTask::getType, "test")); + if(!CollectionUtils.isEmpty(testList)){ + //测试任务已经开始 + this.testingStory(story); + }else{ + this.startStory(story); + } + } + + //如果开发中任务没有了 + if(CollectionUtils.isEmpty(taskList)){ + + List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause","done")) + .eq(ZtTask::getType, "test")); + //如果测试中有任务 + Long waitCount = testList.stream().filter(o -> Arrays.asList("wait").contains(o.getStatus())).count(); + + if(!CollectionUtils.isEmpty(testList)&&waitCount.intValue()!=testList.size()){ + Long doneCount = testList.stream().filter(o -> Arrays.asList("done").contains(o.getStatus())).count(); + if(doneCount.intValue()==testList.size()){ + testedStory(story,finishBy); + }else{ + this.testingStory(story); + } + }else{ + //如果开发任务没有了 并且测试还没开始 + this.finishStory(story,finishBy); + } + } + +// 如果有多个开发任务: +// 1、其中有一个开发进行中,并且所有测试任务未开始,则【开发进行中】 +// 2、所有开发任务已完成,并且所有测试任务未开始,则【开发完成】 +// 如果有多个测试任务: +// 1、其中有一个测试进行中,则【测试进行中】 +// 2、所有测试任务已完成,但还有一些开发任务没有结束,则【测试进行中】 +// 3、所有测试任务已完成,并且所有开发任务已完成,则【测试完成】 +// ZtStory ztStory = this.baseMapper.selectById(story); +// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested +// if(Arrays.asList("wait","projected","developing","developed").contains(ztStory.getStage())){ +// }else if(Arrays.asList("testing").contains(ztStory.getStage())){ +// this.testedStory(story,finishBy); +// } + + +// //开发完成 +// void finishStory(Integer story,String finishBy); +// //测试完毕 +// void testedStory(Integer story,String finishBy); +// //测试中 +// void testingStory(Integer story); +// //发布 +// void releaseStory(Integer story); + } + @Override public void testingStory(Integer story) { @@ -1406,6 +1536,13 @@ public class ZtStoryServiceImpl extends ServiceImpl impl List ids = new ArrayList<>(Arrays.asList(split)); qo.setObjIds(ids); // list=this.baseMapper.storyPageListByIds(ids); + }else{ + //自己有权限的 产品集 + List integers = this.projectService.authProductList(); + + if (!CollectionUtils.isEmpty(integers)) { + qo.setProductIds(integers); + } } // else{ if (UserType.KFZ == loginRiskUser.getUserType() || UserType.CS == loginRiskUser.getUserType()) { @@ -1413,25 +1550,11 @@ public class ZtStoryServiceImpl extends ServiceImpl impl page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); qo.setKfz(1); list = this.baseMapper.projectStoryPageList(qo); + }else{ + page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + list = this.baseMapper.myStoryPageList(qo); } -// else if(UserType.GSGC==loginRiskUser.getUserType()){ -// //全部 -// page= PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); -// list=this.baseMapper.allStoryPageList(qo); -// } - else { - //自己有权限的 产品集 - List integers = this.projectService.authProductList(); - if (!CollectionUtils.isEmpty(integers)) { - qo.setProductIds(integers); - page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); - list = this.baseMapper.myStoryPageList(qo); - } else { - list = new ArrayList<>(); - } - - } if (!CollectionUtils.isEmpty(list)) { @@ -1452,6 +1575,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl List ztProjectList = execMap.get(d.getId()); if (!CollectionUtils.isEmpty(ztProjectList)) { d.setPlan(ztProjectList.stream().map(o -> o.getName()).collect(Collectors.joining(","))); + d.setExecutionName(ztProjectList.stream().map(o -> o.getName()).collect(Collectors.joining(","))); } ZtUser ztUser = userMap.get(d.getAssignedTo()); if (ztUser != null) { @@ -1530,11 +1654,18 @@ public class ZtStoryServiceImpl extends ServiceImpl impl ztStory.setStatus("closed"); this.baseMapper.updateById(ztStory); actionService.addAction(ActionType.XQ, ActionStatus.GB, ztStory.getId(), ztStory.getProduct() + "", null, null, - RiskUserThreadLocal.get().getName(), dto.getClosedreason(), "Done|draft"); + RiskUserThreadLocal.get().getName(), dto.getClosedreason(), null); if (ztStory.getProduct() != null && ztStory.getProduct().intValue() != 0) { ProductStoryStatus oldPStatus = getProductStatus(status); this.productService.productChangeStatus(ztStory.getProduct(), oldPStatus, ProductStoryStatus.GB); } + List execList = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()),ProjectTypeEnums.execution); + if(!CollectionUtils.isEmpty(execList)){ + for (ZtProjectstory s:execList ) { + this.kanbanlaneService.changeStatus(s.getProject(),ztStory.getId(),"story","closed"); + } + } + this.closeTaskBug(ztStory.getId()); } @@ -1622,6 +1753,14 @@ public class ZtStoryServiceImpl extends ServiceImpl impl product.setYss(product.getYss() + 1); product.setReleases(product.getReleases() - 1); this.productService.updateById(product); + List pStory = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()), ProjectTypeEnums.execution); + if(CollectionUtils.isEmpty(pStory)){ + throw new BusinessException("当前未配置迭代无法验收"); + } + for (ZtProjectstory s:pStory ) { + this.kanbanlaneService.changeStatus(s.getProject(),s.getStory(),"story","verified"); + } + } //已发布 @@ -1649,12 +1788,15 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } else { status = ActionStatus.YSBTG; } + ztStory.setYsDate(new Date()); this.baseMapper.updateById(ztStory); if (revieweResult == 1 && ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { this.storyFeedbackService.ysFeedback(ztStory.getFeedback()); } + + //添加action actionService.addAction(ActionType.XQ, status, ztStory.getId(), ztStory.getProduct() + "", null, null, RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo()); @@ -1714,6 +1856,25 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } d.setReviewedbyName(b.toString()); } + List execStory = this.projectstoryService.projectListByStory(Arrays.asList(d.getId()),ProjectTypeEnums.execution); + + if(!CollectionUtils.isEmpty(execStory)){ + List ztProjects = this.projectService.listByIds(execStory.stream().map(o -> o.getProject()).collect(Collectors.toList())); + List execInfoList = BeanCopyUtil.copyListProperties(ztProjects, ZtProjectDTO::new); + for (ZtProjectDTO execInfo:execInfoList) { + ZtUser ztUser = userMap.get(execInfo.getPm()); + if(ztUser!=null){ + execInfo.setPmName(ztUser.getNickname()); + } + ztUser = userMap.get(execInfo.getOpenedBy()); + if(ztUser!=null){ + execInfo.setOpenedByName(ztUser.getNickname()); + } + + } + d.setExecutionList(execInfoList); + } + d.setViews(rMap.get(d.getId())); ZtUser ztUser = userMap.get(d.getAssignedTo()); @@ -1773,6 +1934,12 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (ztUser != null) { ztStoryUserDTO.setAssignedtoName(ztUser.getNickname()); } + + ztUser = userMap.get(ztStoryUserDTO.getClosedby()); + if (ztUser != null) { + ztStoryUserDTO.setClosedbyName(ztUser.getNickname()); + } + Integer parent = ztStoryUserDTO.getParent(); if(parent!=null&&parent!=0){ ZtStoryUser ztStoryUser = this.storyUserService.getById(parent); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java index d982fc7..2f39407 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java @@ -14,6 +14,7 @@ import com.sa.zentao.entity.*; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; import com.sa.zentao.enums.FileTypes; +import com.sa.zentao.enums.UserStoryEnums; import com.sa.zentao.mapper.ZtStoryUserMapper; import com.sa.zentao.qo.StoryQo; import com.sa.zentao.qo.ZtProjectQo; @@ -62,6 +63,11 @@ public class ZtStoryUserServiceImpl extends ServiceImpl tasks = this.storyUserTaskService.list(new QueryWrapper().lambda().eq(ZtStoryUserTask::getUserStoryId, dto.getId())); + if(!CollectionUtils.isEmpty(tasks)){ + List ztStoryUserTaskDTOS = BeanCopyUtil.copyListProperties(tasks, ZtStoryUserTaskDTO::new); + for (ZtStoryUserTaskDTO t:ztStoryUserTaskDTOS) { + ztUser = userMap.get(t.getAssignedTo()); + if(ztUser!=null){ + t.setAssignedToName(ztUser.getNickname()); + } + ztUser = userMap.get(t.getOpenedby()); + if(ztUser!=null){ + t.setOpenedbyName(ztUser.getNickname()); + } + } + dto.setTaskList(ztStoryUserTaskDTOS); + } + + + dto.setViews(rMap.get(d.getId())); return dto; @@ -443,7 +467,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl list = storyUserTaskService.list(new QueryWrapper().lambda().eq(ZtStoryUserTask::getUserStoryId, id)); + if(list.size()>1){ + return; + } + } + if(UserStoryEnums.CFM==status){ + //需求已确认 + } + String oldStatus = storyUser.getStatus(); + + storyUser.setStatus(status.getCode()); + storyUser.setLasteditedby(RiskUserThreadLocal.get().getName()); + storyUser.setLastediteddate(new Date()); + UserStoryEnums userStoryEnums = UserStoryEnums.transfer(oldStatus); + + actionService.addAction(ActionType.USERXQ, ActionStatus.ZTBG, id, storyUser.getProduct() + "", null, null, + RiskUserThreadLocal.get().getName(), userStoryEnums==null?"":userStoryEnums.getValue() +" 变更 "+status.getValue(), ""); + + } + + //明确需求 需要有交付物 + @Override + @Transactional + public void improveStory(ZtStoryUserDTO dto) { + ZtStoryUser storyUser = this.baseMapper.selectById(dto.getId()); + if(UserStoryEnums.transfer(storyUser.getStatus())!=UserStoryEnums.CPYSJ ){ + throw new BusinessException("当前无需明确"); + } + // + fileService.updateFile(dto.getFiles(),dto.getId(), FileTypes.userStoryTaskImprove); + storyUser.setDeliverRemark(dto.getDeliverRemark()); + this.baseMapper.updateById(storyUser); + this.changeStatus(dto.getId(),UserStoryEnums.DQR); + actionService.addAction(ActionType.USERXQ, ActionStatus.MQXU, storyUser.getId(), storyUser.getProduct() + "", null, null, + RiskUserThreadLocal.get().getName(),dto.getDeliverRemark(), ""); + } + + @Override + public void confirmStory(ZtStoryUserDTO dto) { + ZtStoryUser storyUser = this.baseMapper.selectById(dto.getId()); + if(UserStoryEnums.transfer(storyUser.getStatus())!=UserStoryEnums.DQR ){ + throw new BusinessException("当前无需明确"); + } + this.changeStatus(dto.getId(),UserStoryEnums.CFM); + } + + @Override + public void needMeetOrDesign(ZtStoryUserDTO dto) { + Integer needDesign = dto.getNeedDesign(); + Integer needImprove = dto.getNeedImprove(); + //需要设计 + if(needDesign!=null&&needDesign!=0){ + if(needDesign==1){ + this.changeStatus(dto.getId(),UserStoryEnums.DSJ); + }else{ + this.changeStatus(dto.getId(),UserStoryEnums.CFM); + } + } + //需要会议 + if(needImprove!=null&&needImprove!=0){ + if(needImprove==1){ + this.changeStatus(dto.getId(),UserStoryEnums.DSJ); + }else{ + this.changeStatus(dto.getId(),UserStoryEnums.CFM); + } + } + } private Map> getStoryUserMap(List list) { List ids = list.stream().map(o -> o.getId()).collect(Collectors.toList()); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java new file mode 100644 index 0000000..c961009 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java @@ -0,0 +1,328 @@ +package com.sa.zentao.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sa.zentao.conf.RiskUserThreadLocal; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.dao.ZtStoryUserDTO; +import com.sa.zentao.dao.ZtStoryUserTaskDTO; +import com.sa.zentao.dao.ZtTaskDTO; +import com.sa.zentao.entity.*; +import com.sa.zentao.enums.ActionStatus; +import com.sa.zentao.enums.ActionType; +import com.sa.zentao.enums.FileTypes; +import com.sa.zentao.enums.UserStoryEnums; +import com.sa.zentao.mapper.ZtStoryUserTaskMapper; +import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.service.*; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sa.zentao.utils.DateUtils; +import com.sa.zentao.utils.FloatUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author gqb + * @since 2025-03-25 + */ +@Service +public class ZtStoryUserTaskServiceImpl extends ServiceImpl implements IZtStoryUserTaskService { + + @Autowired + private IZtUserService userService; + + @Autowired + private IZtActionService actionService; + + @Autowired + private IZtStoryUserService storyUserService; + + @Autowired + private IZtEffortService effortService; + + @Autowired + private IZtProductService productService; + + @Autowired + private IZtFileService fileService; + + @Autowired + private IZtProjectService projectService; + + + @Override + public PageInfo taskPageList(ZtProjectQo qo) { + + + List pIds = this.projectService.authProductList(); + if(CollectionUtils.isEmpty(pIds)){ + return new PageInfo(); + } + qo.setProductIds(pIds); + qo.setUserName(RiskUserThreadLocal.get().getName()); + + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + List list = this.baseMapper.pageList(qo); + + if(!CollectionUtils.isEmpty(list)){ + Map userMap = userService.userMapByIds(null); + for (ZtStoryUserTaskDTO d:list) { + ZtUser ztUser = userMap.get(d.getOpenedby()); + if(ztUser!=null){ + d.setOpenedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getAssignedTo()); + if(ztUser!=null){ + d.setAssignedToName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getClosedby()); + if(ztUser!=null){ + d.setClosedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getFinishedby()); + if(ztUser!=null){ + d.setFinishedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getCanceledby()); + if(ztUser!=null){ + d.setCanceledbyName(ztUser.getNickname()); + } + ztUser = userMap.get(d.getLastEditedBy()); + if(ztUser!=null){ + d.setLastEditedByName(ztUser.getNickname()); + } + } + + } + + return new PageInfo(list); + } + + @Transactional + @Override + public void add(ZtStoryUserTaskDTO dto) { + + ZtStoryUser story = this.storyUserService.getById(dto.getUserStoryId()); + if(story==null){ + throw new BusinessException("未查询到用户需求"); + } + String type = dto.getType(); + + //wait 未开始 doing 进行中 finished + List hisList = this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtStoryUserTask::getType, type) + .eq(ZtStoryUserTask::getUserStoryId, dto.getUserStoryId()) + .in(ZtStoryUserTask::getStatus,"wait","doing","finished") + ); + if(!CollectionUtils.isEmpty(hisList)&&hisList.size()>1){ + throw new BusinessException("无法添加"); + } + if(type.equals("design")){ + //设计 + this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.XXSJZ); + }else if(type.equals("improve")){ + //明确 + this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.UNCFM); + } + + ZtStoryUserTask task = new ZtStoryUserTask(); + BeanUtils.copyProperties(dto,task); + task.setStatus("wait"); + task.setOpenedby(RiskUserThreadLocal.get().getName()); + task.setOpeneddate(new Date()); + task.setLeft(task.getConsumed()); + task.setConsumed(0F); + this.baseMapper.insert(task); + //产品确认中 + + + fileService.updateFile(dto.getFiles(),task.getId(), FileTypes.userStory); + actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.XJ, task.getId() + , task.getProduct().toString(), null, null, + RiskUserThreadLocal.get().getName(),"", null); + } + + @Override + @Transactional + public void modify(ZtStoryUserTaskDTO dto) { + + ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId()); + if(ztStoryUserTask==null){ + throw new BusinessException("未查询到数据"); + } + if(!Arrays.asList("wait","doing").contains(ztStoryUserTask.getStatus())){ + throw new BusinessException("当前状态无法更改"); + } + //wait 未开始 doing 进行中 finished + List hisList = this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtStoryUserTask::getType, dto.getType()) + .eq(ZtStoryUserTask::getUserStoryId, dto.getUserStoryId()) + .in(ZtStoryUserTask::getStatus,"wait","doing","finished") + .ne(ZtStoryUserTask::getId,dto.getId()) + ); + if(!CollectionUtils.isEmpty(hisList)&&hisList.size()>0){ + throw new BusinessException("当前类型无法更改"); + } + + BeanUtils.copyProperties(dto,ztStoryUserTask); + ztStoryUserTask.setLastEditedBy(RiskUserThreadLocal.get().getName()); + ztStoryUserTask.setLastEditedDate(new Date()); + this.baseMapper.updateById(ztStoryUserTask); + fileService.updateFile(dto.getFiles(),ztStoryUserTask.getId(), FileTypes.userStoryTask); + + actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.BJ, ztStoryUserTask.getId() + , ztStoryUserTask.getProduct().toString(), null, null, + RiskUserThreadLocal.get().getName(),"", null); + } + + @Override + @Transactional + public void closed(ZtStoryUserTaskDTO dto) { + ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId()); + if(ztStoryUserTask==null||ztStoryUserTask.getStatus().equals("closed")){ + throw new BusinessException("当前无法关闭"); + } + ztStoryUserTask.setStatus("closed"); + ztStoryUserTask.setClosedby(RiskUserThreadLocal.get().getName()); + ztStoryUserTask.setCloseddate(new Date()); + ztStoryUserTask.setClosedRemark(dto.getClosedRemark()); + this.baseMapper.updateById(ztStoryUserTask); + actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.GB, ztStoryUserTask.getId() + , ztStoryUserTask.getProduct().toString(), null, null, + RiskUserThreadLocal.get().getName(),"", null); + } + + @Override + @Transactional + public void cancel(ZtStoryUserTaskDTO dto) { + + ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId()); + if(ztStoryUserTask==null||ztStoryUserTask.getStatus().equals("closed")||ztStoryUserTask.getStatus().equals("finished")){ + throw new BusinessException("当前无法取消"); + } + ztStoryUserTask.setStatus("cancel"); + ztStoryUserTask.setCanceledby(RiskUserThreadLocal.get().getName()); + ztStoryUserTask.setCanceleddate(new Date()); + this.baseMapper.updateById(ztStoryUserTask); + + actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.QX, ztStoryUserTask.getId() + , ztStoryUserTask.getProduct().toString(), null, null, + RiskUserThreadLocal.get().getName(),"", null); + } + + @Override + @Transactional + public void finishedTask(ZtStoryUserTaskDTO dto) { + ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId()); + if(ztStoryUserTask==null||ztStoryUserTask.getStatus().equals("closed")||ztStoryUserTask.getStatus().equals("cancel")){ + throw new BusinessException("当前无法取消"); + } + ztStoryUserTask.setStatus("finished"); + // 设计 design 明确improve + if("improve".equals(ztStoryUserTask.getType())){ + //需要会议 + if((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==1)&&dto.getNeedDesign()==null){ + //用户状态待沟通 + this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.DGT); + }else if ((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==2)&&(dto.getNeedDesign()!=null&&dto.getNeedDesign()==2)){ + //用户状态待沟通 + this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.CFM); + }else if ((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==2)&&(dto.getNeedDesign()!=null&&dto.getNeedDesign()==1)){ + //用户状态待沟通 需要详细设计 + this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.DSJ); + this.add(dto.getInfo()); + } + }else if("design".equals(ztStoryUserTask.getType())){ + this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.CPYSJ); + + } + + + + float v = FloatUtils.floatSub(ztStoryUserTask.getEstimate(), FloatUtils.floatSub(ztStoryUserTask.getEstimate(), ztStoryUserTask.getConsumed())); + ztStoryUserTask.setLeft(v<0?0:v); + ztStoryUserTask.setConsumed(FloatUtils.floatAdd(ztStoryUserTask.getConsumed(),dto.getConsumed())); + ztStoryUserTask.setLastEditedBy(RiskUserThreadLocal.get().getName()); + ztStoryUserTask.setLastEditedDate(new Date()); + ztStoryUserTask.setFinishedby(RiskUserThreadLocal.get().getName()); + ztStoryUserTask.setFinisheddate(new Date()); + + this.baseMapper.updateById(ztStoryUserTask); + + ZtEffort e=new ZtEffort(); + e.setObjectid(ztStoryUserTask.getId()); + e.setObjecttype("userStoryTask"); + e.setConsumed(ztStoryUserTask.getConsumed()); + e.setLeft(ztStoryUserTask.getLeft()); + e.setAccount(RiskUserThreadLocal.get().getName()); + e.setDate(new Date()); + effortService.save(e); + + + actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.WC, ztStoryUserTask.getId() + , ztStoryUserTask.getProduct().toString(), null, null, + RiskUserThreadLocal.get().getName(),"", null); + } + + @Override + public ZtStoryUserTaskDTO getUserStoryTaskById(ZtProjectQo qo) { + + ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(qo.getId()); + ZtStoryUserTaskDTO ztStoryUserTaskDTO = new ZtStoryUserTaskDTO(); + BeanUtils.copyProperties(ztStoryUserTask,ztStoryUserTaskDTO); + + if(ztStoryUserTask.getProduct()!=null&&ztStoryUserTask.getProduct()!=0){ + ZtProduct ztProduct = this.productService.getById(ztStoryUserTask.getProduct()); + ztStoryUserTaskDTO.setProductName(ztProduct.getName()); + } + + ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStoryUserTask.getUserStoryId()); + ZtStoryUserDTO ztStoryUserDTO = new ZtStoryUserDTO(); + BeanUtils.copyProperties(ztStoryUser,ztStoryUserDTO); + ztStoryUserTaskDTO.setUserStoryName(ztStoryUser.getTitle()); + ztStoryUserTaskDTO.setStoryUserInfo(ztStoryUserDTO); + + Map userMap = this.userService.userMapByIds(null); + ztStoryUserTaskDTO.setEststarted(DateUtils.getDayStartDate(ztStoryUserTaskDTO.getEststarted())); + ztStoryUserTaskDTO.setDeadline(DateUtils.getDayLast(ztStoryUserTaskDTO.getDeadline())); + + ZtUser ztUser = userMap.get(ztStoryUserTaskDTO.getOpenedby()); + if(ztUser!=null){ + ztStoryUserTaskDTO.setOpenedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(ztStoryUserTaskDTO.getAssignedTo()); + if(ztUser!=null){ + ztStoryUserTaskDTO.setAssignedToName(ztUser.getNickname()); + } + ztUser = userMap.get(ztStoryUserTaskDTO.getClosedby()); + if(ztUser!=null){ + ztStoryUserTaskDTO.setClosedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(ztStoryUserTaskDTO.getFinishedby()); + if(ztUser!=null){ + ztStoryUserTaskDTO.setFinishedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(ztStoryUserTaskDTO.getCanceledby()); + if(ztUser!=null){ + ztStoryUserTaskDTO.setCanceledbyName(ztUser.getNickname()); + } + ztUser = userMap.get(ztStoryUserTaskDTO.getLastEditedBy()); + if(ztUser!=null){ + ztStoryUserTaskDTO.setLastEditedByName(ztUser.getNickname()); + } + return ztStoryUserTaskDTO; + } + +} diff --git a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java index a3ac960..2f54894 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java @@ -177,9 +177,19 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme @Override public List myTaskList(ZtProjectQo qo) { + + List pList = this.ztProjectService.authProductList(); + if(CollectionUtils.isEmpty(pList)){ + return Arrays.asList(); + } + + List closed = this.baseMapper.selectList(new QueryWrapper().lambda() - .ne(ZtTask::getStatus, "closed").eq(ZtTask::getOpenedby, RiskUserThreadLocal.get().getName()) - .or().eq(ZtTask::getAssignedTo, RiskUserThreadLocal.get().getName()) + .in(ZtTask::getProduct, pList) + .notIn(ZtTask::getStatus, Arrays.asList("closed","cancel","done") ) + .and(o->o.eq(ZtTask::getOpenedby, RiskUserThreadLocal.get().getName()) + .or().eq(ZtTask::getAssignedTo, RiskUserThreadLocal.get().getName())) + .orderByDesc(ZtTask::getDeadline) .orderByDesc(ZtTask::getId) ); @@ -229,13 +239,40 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme dto.setImplementId(project.getId()); dto.setImplementName(project.getName()); } + Integer story = dto.getStory(); + if(story!=null&&story!=0){ + ZtStory ztStory = this.storyService.getById(story); + if(ztStory!=null){ + dto.setStoryName(ztStory.getTitle()); + } + } + if (dto.getDeadline() != null) { - dto.setDeadline(DateUtils.getDayLast(ztTask.getDeadline())); + dto.setDeadline(DateUtils.getDayLast(dto.getDeadline())); } ZtUser ztUser = userMap.get(ztTask.getAssignedTo()); if (ztUser != null) { dto.setAssignedToName(ztUser.getNickname()); } + + ztUser = userMap.get(ztTask.getOpenedby()); + if (ztUser != null) { + dto.setOpenedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(ztTask.getFinishedby()); + if (ztUser != null) { + dto.setFinishedbyName(ztUser.getNickname()); + + } + ztUser = userMap.get(ztTask.getClosedby()); + if (ztUser != null) { + dto.setClosedbyName(ztUser.getNickname()); + } + + ztUser = userMap.get(ztTask.getCanceledby()); + if (ztUser != null) { + dto.setCanceledbyName(ztUser.getNickname()); + } List list = this.bugService.list(new QueryWrapper().lambda().eq(ZtBug::getTotask, id)); if(!CollectionUtils.isEmpty(list)){ @@ -250,17 +287,39 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if(ztUser!=null){ bug.setAssignedToName(ztUser.getNickname()); } - ztUser = userMap.get(bug.getYsUser()); + ztUser = userMap.get(bug.getResolvedby()); + if(ztUser!=null){ + bug.setResolvedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(bug.getYsUser()); if(ztUser!=null){ bug.setYsUserName(ztUser.getNickname()); } + ztUser = userMap.get(bug.getLasteditedby()); + if(ztUser!=null){ + bug.setLasteditedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(bug.getClosedby()); + if(ztUser!=null){ + bug.setClosedbyName(ztUser.getNickname()); + } + ztUser = userMap.get(bug.getLasteditedby()); + if(ztUser!=null){ + bug.setLasteditedbyName(ztUser.getNickname()); + } + + + if(bug.getDeadline()!=null){ + bug.setDeadline(DateUtils.getDayLast(bug.getDeadline())); + } } dto.setBugList(ztBugDTOS); }else{ dto.setBugList(Arrays.asList()); } - + ZtProduct ztProduct = this.productService.getById(dto.getProduct()); + dto.setProductName(ztProduct==null?null:ztProduct.getName()); return dto; } @@ -305,11 +364,13 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme return new PageInfo(); } Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); - qo.setProjectIds(projectAuthList); + if (!StringUtils.isEmpty(qo.getIds())) { String[] split = qo.getIds().split(","); qo.setObjIds(new ArrayList<>(Arrays.asList(split))); + }else{ + qo.setProjectIds(projectAuthList); } if (!StringUtils.isEmpty(qo.getProductName())) { List pList = this.productService.selectProductByName(qo.getProductName()); @@ -469,9 +530,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if (ztTask == null) { throw new BusinessException("未查询到数据"); } -// if(!Arrays.asList("draft","reviewing").contains(ztTask.getStatus())){ -// throw new BusinessException("当前无法编辑"); -// } + //cancel取消 closed 关闭 done + if(Arrays.asList("cancel","closed","done").contains(ztTask.getStatus())){ + throw new BusinessException("当前无法编辑"); + } String desc = ztTask.getDesc(); String status = ztTask.getStatus(); BeanUtils.copyProperties(dto, ztTask, "left", "consumed"); @@ -484,7 +546,11 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setDeadlineTime(ztTask.getDeadline().getTime() / 1000); } UserType userType = RiskUserThreadLocal.get().getUserType(); + if (dto.getDraftFlag() != null && dto.getDraftFlag() == 1) { + if(status.equals("wait")){ + throw new BusinessException("开始后不可以存为草稿"); + } ztTask.setStatus("draft"); }else{ if(status.equals("draft")){ @@ -498,8 +564,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setStatus("wait"); ztTask.setReviewingUser(null); } - }else if ((userType==UserType.XMGLY||userType==UserType.GSGC) &&status.equals("wait")){ + }else if (status.equals("wait")){ ztTask.setStatus("wait"); + }else if (status.equals("doing")){ + ztTask.setStatus("doing"); }else{ ztTask.setStatus("reviewing"); ZtProject ztProject = this.ztProjectService.getById(ztTask.getExecution()); @@ -549,13 +617,21 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme @Transactional public void startTask(ZtTaskDTO dto) { - if (dto.getLeft() < dto.getConsumed()) { - throw new BusinessException("工时填写错误"); - } +// if (dto.getLeft() < dto.getConsumed()) { +// throw new BusinessException("工时填写错误"); +// } + String name = RiskUserThreadLocal.get().getName(); + ZtTask ztTask = this.baseMapper.selectById(dto.getId()); + if(StringUtils.isEmpty(ztTask.getAssignedTo())){ + throw new BusinessException("未指派任务无法开始"); + } + if(!ztTask.getAssignedTo().equals(name)){ + throw new BusinessException("无法开始"); + } String status = ztTask.getStatus(); if (!"wait".equalsIgnoreCase(ztTask.getStatus())) { - throw new BusinessException("未查询到数据"); + throw new BusinessException("未查询到数据或者检查状态"); } ztTask.setAssignedTo(dto.getAssignedTo()); ztTask.setRealstarted(new Date()); @@ -571,6 +647,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setLastediteddate(new Date()); ztTask.setConsumed(dto.getConsumed()); ztTask.setLeft(dto.getLeft() - dto.getConsumed()); + if(ztTask.getLeft()<0){ + ztTask.setLeft(0f); + } this.baseMapper.updateById(ztTask); if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){ if("doing".equals(ztTask.getStatus())){ @@ -629,17 +708,17 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme //处理需求 if ("done".equals(ztTask.getStatus())) { - this.storyService.finishStory(ztTask.getStory(),null); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); } else if ("doing".equals(ztTask.getStatus())) { - this.storyService.startStory(ztTask.getStory()); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); } } if ("test".equals(ztTask.getType())) { //处理需求 if ("done".equals(ztTask.getStatus())) { - this.storyService.testedStory(ztTask.getStory(),null); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); } else if ("doing".equals(ztTask.getStatus())) { - this.storyService.testingStory(ztTask.getStory()); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); } } @@ -655,10 +734,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme String type = ztTask.getType(); if (ztTask.getStory() != null && ztTask.getStory() != 0) { if ("test".equals(type)) { - this.storyService.testedStory(ztTask.getStory(),null); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); } else if ("devel".equals(type)) { //开发 - this.storyService.finishStory(ztTask.getStory(),null); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); } } @@ -676,6 +755,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } ztTask.setConsumed(dto.getConsumed() + ztTask.getConsumed()); ztTask.setLeft(ztTask.getEstimate() - ztTask.getConsumed()); + if(ztTask.getLeft()<0){ + ztTask.setLeft(0f); + } ztTask.setStatus("done"); if(ztTask.getFinishedFlag()!=null&&ztTask.getFinishedFlag()==1){ ztTask.setFinishedby(ztTask.getAssignedTo()); @@ -735,10 +817,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme String type = ztTask.getType(); if (ztTask.getStory() != null && ztTask.getStory() != 0) { if ("test".equals(type)) { - this.storyService.testedStory(ztTask.getStory(),finishBy); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy); } else if ("devel".equals(type)) { //开发 - this.storyService.finishStory(ztTask.getStory(),finishBy); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy); } } if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){ @@ -797,6 +879,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setStatus("cancel"); ztTask.setLasteditedby(RiskUserThreadLocal.get().getName()); ztTask.setLastediteddate(new Date()); + ztTask.setCanceledby(RiskUserThreadLocal.get().getName()); + ztTask.setCanceleddate(new Date()); + ztTask.setClosedreason(dto.getDesc()); this.baseMapper.updateById(ztTask); ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject())); @@ -818,6 +903,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme kanbanlaneService.changeStatus(qo); } } + if(ztTask.getStory()!=null&&ztTask.getStory()!=0){ + this.storyService.finishStory(ztTask.getStory(),null); + } + } diff --git a/src/main/java/com/sa/zentao/utils/FloatUtils.java b/src/main/java/com/sa/zentao/utils/FloatUtils.java new file mode 100644 index 0000000..1ba4fdf --- /dev/null +++ b/src/main/java/com/sa/zentao/utils/FloatUtils.java @@ -0,0 +1,37 @@ +package com.sa.zentao.utils; + +import java.math.BigDecimal; + +public class FloatUtils { + + + + public static float floatSub(Float a,Float b){ + if(a==null){ + a=0f; + } + if(b==null){ + b=0f; + } + BigDecimal a1 = BigDecimal.valueOf(a); + + BigDecimal a2 = BigDecimal.valueOf(b); + + BigDecimal subtract = a1.subtract(a2); + return subtract.floatValue(); + } + public static float floatAdd(Float a,Float b){ + if(a==null){ + a=0f; + } + if(b==null){ + b=0f; + } + BigDecimal a1 = BigDecimal.valueOf(a); + + BigDecimal a2 = BigDecimal.valueOf(b); + + BigDecimal subtract = a1.add(a2); + return subtract.floatValue(); + } +} diff --git a/src/main/java/com/sa/zentao/utils/KanBanConstant.java b/src/main/java/com/sa/zentao/utils/KanBanConstant.java index 5e7b87b..132a69d 100644 --- a/src/main/java/com/sa/zentao/utils/KanBanConstant.java +++ b/src/main/java/com/sa/zentao/utils/KanBanConstant.java @@ -37,6 +37,19 @@ public class KanBanConstant { put("tested","测试完毕"); put("closed","已关闭"); }}); + + put(1,new LinkedHashMap<>(){{ + put("unconfirmed","待解决"); +// put("confirmed","已确认"); +// put("resolving","解决中"); +// put("fixing","进行中"); + put("fixed","完成"); +// put("test","测试"); +// put("testing","测试中"); +// put("tested","测试完毕"); + put("closed","已关闭"); + }}); + put(2,new LinkedHashMap<>(){{ put("wait","未开始"); put("develop","开发"); diff --git a/src/main/resources/mapper/ZtBugMapper.xml b/src/main/resources/mapper/ZtBugMapper.xml index 24afde9..b87f0f7 100644 --- a/src/main/resources/mapper/ZtBugMapper.xml +++ b/src/main/resources/mapper/ZtBugMapper.xml @@ -74,10 +74,67 @@ and project =#{qo.project} + + and id = #{qo.id} + + + + and title like concat('%', #{qo.name}, '%') + + + and severity = #{qo.severity} + + + + and pri = #{qo.pri} + + + + and `type` = #{qo.type} + + + and assignedTo = #{qo.assignedTo} + + + and openedDate =]]> #{qo.startDate} + + + and openedDate #{qo.endDate} + + + and openedby = #{qo.openedby} + + + + and openedDate =]]> #{qo.openStartDate} + + + and openedDate #{qo.openEndDate} + and execution =#{qo.execution} + + + and product in + + #{id} + + + + + + and id in + + #{id} + + + + + @@ -139,7 +196,23 @@ -- //研发需求变动 - order by id desc + + + + + + order by ${qo.orderName} ${qo.orderSort} + + + order by id desc + + + + + order by id desc + + + @@ -149,13 +222,47 @@ SELECT s.*,pt.name productName from zt_bug s left join zt_product pt on s.product = pt.id WHERE 1=1 + + and s.id = #{qo.id} + + + + and s.title like concat('%', #{qo.name}, '%') + + + and s.severity = #{qo.severity} + + + + and pri = #{qo.pri} + + + + and s.`type` = #{qo.type} + + + and s.assignedTo = #{qo.assignedTo} + + + and s.openedby = #{qo.openedby} + + + + and s.openedDate =]]> #{qo.openStartDate} + + + and s.openedDate #{qo.openEndDate} + + - and s.openedDate =]]> #{qo.startDate} + and s.deadline =]]> #{qo.startDate} - and s.openedDate #{qo.endDate} + and s.deadline #{qo.endDate} + + and pt.name like concat('%', #{qo.productName}, '%') diff --git a/src/main/resources/mapper/ZtStoryFeedbackMapper.xml b/src/main/resources/mapper/ZtStoryFeedbackMapper.xml index 6116edc..1667fee 100644 --- a/src/main/resources/mapper/ZtStoryFeedbackMapper.xml +++ b/src/main/resources/mapper/ZtStoryFeedbackMapper.xml @@ -17,7 +17,21 @@ SELECT * from zt_story_feedback s WHERE 1 = 1 - + + and s.`type` = #{qo.type} + + + and s.spec like concat('%', #{qo.spec}, '%') + + + and s.status = #{qo.status} + + + and s.opened_by = #{qo.openedby} + + + and s.source = #{qo.source} + and s.product = #{qo.productId} @@ -34,7 +48,12 @@ and s.opened_by= #{qo.userName} - + + and s.opened_date =]]> #{qo.startDate} + + + and s.opened_date #{qo.endDate} + and s.status = 'finished' diff --git a/src/main/resources/mapper/ZtStoryMapper.xml b/src/main/resources/mapper/ZtStoryMapper.xml index 5ef9523..0795702 100644 --- a/src/main/resources/mapper/ZtStoryMapper.xml +++ b/src/main/resources/mapper/ZtStoryMapper.xml @@ -123,23 +123,56 @@ and s.ys_flag =0) or (s.stage = 'verified' and s.ys_flag =2) + + and s.title like concat('%', #{qo.name}, '%') + + + and s.title like concat('%', #{qo.title}, '%') + and s.id = #{qo.id} - and s.title = #{qo.title} + and s.title like concat('%', #{qo.title}, '%') and s.module = #{qo.module} + + and s.assignedTo = #{qo.assignedTo} + + + and s.pri = #{qo.pri} + + + and s.status = #{qo.status} + + + + + and s.stage = #{qo.stage} + + + and s.openedBy = #{qo.openedby} + + + + and s.openedDate =]]> #{qo.startDate} + + + and s.openedDate #{qo.endDate} + and s.status ='closed' and closedBy =#{qo.userName} - + + and s.status ='closed' + and closedBy =#{qo.userName} + @@ -185,14 +218,44 @@ WHERE 1=1 + + + + + + + + and s.pri = #{qo.pri} + + + and s.status = #{qo.status} + + + and s.title like concat('%', #{qo.title}, '%') + + + + and s.stage = #{qo.stage} + + + and s.openedBy = #{qo.openedby} + + - and s.openedDate =]]> #{qo.startDate} + and s.openedDate =]]> #{qo.startDate} - and s.openedDate #{qo.endDate} + and s.openedDate #{qo.endDate} + + + and s.assignedTo = #{qo.assignedTo} + + + and s.id = #{qo.id} + + + and s.title like concat('%', #{qo.name}, '%') - - and pt.name like concat('%', #{qo.productName}, '%') @@ -206,8 +269,8 @@ and ps.project =#{qo.execution} and ps.type= 'execution' - - and s.module =#{qo.module} + + and s.module =#{qo.moduleId} @@ -222,8 +285,10 @@ - and s.assignedTo = #{qo.userName} + and + (s.assignedTo = #{qo.userName} or s.openedBy = #{qo.userName} + ) @@ -372,6 +437,41 @@ left join zt_storyreview v on s.id = v.story and s.version = v.version WHERE 1=1 + + + + and s.pri = #{qo.pri} + + + and s.status = #{qo.status} + + + + + and s.stage = #{qo.stage} + + + and s.openedBy = #{qo.openedby} + + + + and s.openedDate =]]> #{qo.startDate} + + + and s.openedDate #{qo.endDate} + + + and s.title like concat('%', #{qo.name}, '%') + + + and s.id = #{qo.id} + + + and s.title like concat('%', #{qo.title}, '%') + + + and s.assignedTo = #{qo.assignedTo} + and ps.project =#{qo.project} @@ -473,6 +573,44 @@ left join zt_storyreview v on s.id = v.story and s.version = v.version WHERE 1=1 + + + + + and s.pri = #{qo.pri} + + + and s.status = #{qo.status} + + + + + and s.stage = #{qo.stage} + + + and s.openedBy = #{qo.openedby} + + + + and s.assignedTo = #{qo.assignedTo} + + + and s.title like concat('%', #{qo.name}, '%') + + + and s.openedDate =]]> #{qo.startDate} + + + and s.openedDate #{qo.endDate} + + + + and s.id = #{qo.id} + + + and s.title like concat('%', #{qo.title}, '%') + + and s.product in - and s.assignedTo = #{qo.userName} + and ( s.assignedTo = #{qo.userName} or s.openedBy = #{qo.userName} + ) diff --git a/src/main/resources/mapper/ZtStoryUserMapper.xml b/src/main/resources/mapper/ZtStoryUserMapper.xml index d40a0be..6b90c1e 100644 --- a/src/main/resources/mapper/ZtStoryUserMapper.xml +++ b/src/main/resources/mapper/ZtStoryUserMapper.xml @@ -87,8 +87,12 @@ and s.openedDate #{qo.endDate} - - + + and s.openedBy = #{qo.openedby} + + + and s.status = #{qo.status} + and pt.name like concat('%', #{qo.productName}, '%') diff --git a/src/main/resources/mapper/ZtStoryUserTaskMapper.xml b/src/main/resources/mapper/ZtStoryUserTaskMapper.xml new file mode 100644 index 0000000..4a95257 --- /dev/null +++ b/src/main/resources/mapper/ZtStoryUserTaskMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/ZtTaskMapper.xml b/src/main/resources/mapper/ZtTaskMapper.xml index bb7664c..d7d1413 100644 --- a/src/main/resources/mapper/ZtTaskMapper.xml +++ b/src/main/resources/mapper/ZtTaskMapper.xml @@ -63,6 +63,31 @@ left join zt_product pt on s.product = pt.id where 1= 1 + + + and s.id = #{qo.id} + + + + and s.name like concat('%', #{qo.name}, '%') + + + + and s.`type` = #{qo.type} + + + + and s.pri = #{qo.pri} + + + + and s.assignedTo = #{qo.assignedTo} + + + + and s.status = #{qo.status} + + and s.openedDate =]]> #{qo.startDate}