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