用户需求看板,全局搜索等

This commit is contained in:
2025-11-03 11:42:38 +08:00
parent 253ea7035e
commit c9e6f781fa
25 changed files with 767 additions and 249 deletions

View File

@ -2,21 +2,29 @@ package com.sa.zentao.conf;
//import com.dritec.FastDFSClient; //import com.dritec.FastDFSClient;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.sa.zentao.dao.BusinessException;
import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.dao.ZtProjectDTO;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.service.*; import com.sa.zentao.service.*;
import com.sa.zentao.task.SpringTaskJob; import com.sa.zentao.task.SpringTaskJob;
import com.sa.zentao.utils.DateUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.*;
import java.util.List; import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Component @Component
@Order(value = 1) @Order(value = 1)
@ -33,19 +41,149 @@ public class AfterRunner implements ApplicationRunner {
@Autowired @Autowired
private IZtYwTaskService ywTaskService; private IZtYwTaskService ywTaskService;
@Autowired
private IZtStoryService ztStoryService;
@Autowired
private IZtStoryUserService ztStoryUserService;
@Autowired
private IZtStoryspecService ztStoryspecService;
@Autowired
private IZtStoryFeedbackService ztStoryFeedbackService;
@Autowired
private IZtTaskService ztTaskService;
@Autowired
private IZtBugService ztBugService;
@Autowired
private IZtStoryUserspecService ztStoryUserSpecService;
@Value("${file.baseUrl}")
String baseUrl;
@Autowired
private Base64ImageSaver base64ImageSaver;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
//初始化假期 //初始化假期
festivalConfigService.initfestivalAndHoliday(); festivalConfigService.initfestivalAndHoliday();
springTaskJob.dkEveryDay(); springTaskJob.dkEveryDay();
new Thread(new DevopsRunner()).start(); new Thread(new DevopsRunner()).start();
// handStory();
// ywTaskService.remindMail();; // handUserStory();
// handStoryFeedback();
// handTask();
// handBug();
} }
private void handStory(){
// ZtStory byId = this.ztStoryService.getById(6493);
// LambdaQueryWrapper<ZtStoryspec> lambda = new QueryWrapper<ZtStoryspec>().lambda();
// lambda.eq(ZtStoryspec::getStory,6493);
List<ZtStoryspec> list = ztStoryspecService.list();
for (ZtStoryspec ztStoryspec : list) {
if(!StringUtils.isEmpty(ztStoryspec.getSpec())){
System.out.println(ztStoryspec);
System.out.println(ztStoryspec);
// 正则表达式匹配Base64图片
String pattern = "<img\\s+src=\"data:image/[^;]+;base64,[^\"]+\"\\s*/?>";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(ztStoryspec.getSpec());
String s = base64ImageSaver.saveBase64Images(ztStoryspec.getSpec());
ztStoryspec.setSpec(s);
LambdaUpdateWrapper<ZtStoryspec> lambda1 = new UpdateWrapper<ZtStoryspec>().lambda();
lambda1.set(ZtStoryspec::getSpec,s);
lambda1.eq(ZtStoryspec::getStory,ztStoryspec.getStory());
ztStoryspecService.update(lambda1);
System.out.println("<UNK>" + s + "<UNK>");
}
}
}
private void handUserStory(){
// ZtStory byId = this.ztStoryService.getById(6493);
// LambdaQueryWrapper<ZtStoryspec> lambda = new QueryWrapper<ZtStoryspec>().lambda();
// lambda.eq(ZtStoryspec::getStory,6493);
List<ZtStoryUserspec> list = ztStoryUserSpecService.list();
for (ZtStoryUserspec ztStoryspec : list) {
if(!StringUtils.isEmpty(ztStoryspec.getSpec())){
System.out.println(ztStoryspec);
System.out.println(ztStoryspec);
// 正则表达式匹配Base64图片
String pattern = "<img\\s+src=\"data:image/[^;]+;base64,[^\"]+\"\\s*/?>";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(ztStoryspec.getSpec());
String s = base64ImageSaver.saveBase64Images(ztStoryspec.getSpec());
ztStoryspec.setSpec(s);
LambdaUpdateWrapper<ZtStoryUserspec> lambda1 = new UpdateWrapper<ZtStoryUserspec>().lambda();
lambda1.set(ZtStoryUserspec::getSpec,s);
lambda1.eq(ZtStoryUserspec::getStory,ztStoryspec.getStory());
ztStoryUserSpecService.update(lambda1);
System.out.println("<UNK>" + s + "<UNK>");
}
}
}
private void handStoryFeedback(){
// ZtStory byId = this.ztStoryService.getById(6493);
// LambdaQueryWrapper<ZtStoryspec> lambda = new QueryWrapper<ZtStoryspec>().lambda();
// lambda.eq(ZtStoryspec::getStory,6493);
List<ZtStoryFeedback> list = ztStoryFeedbackService.list();
for (ZtStoryFeedback ztStoryspec : list) {
if(!StringUtils.isEmpty(ztStoryspec.getRemark())){
System.out.println(ztStoryspec);
System.out.println(ztStoryspec);
// 正则表达式匹配Base64图片
String pattern = "<img\\s+src=\"data:image/[^;]+;base64,[^\"]+\"\\s*/?>";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(ztStoryspec.getRemark());
String s = base64ImageSaver.saveBase64Images(ztStoryspec.getRemark());
ztStoryspec.setRemark(s);
ztStoryFeedbackService.updateById(ztStoryspec);
System.out.println("<UNK>" + s + "<UNK>");
}
}
}
public void handTask(){
// ZtStory byId = this.ztStoryService.getById(6493);
// LambdaQueryWrapper<ZtStoryspec> lambda = new QueryWrapper<ZtStoryspec>().lambda();
// lambda.eq(ZtStoryspec::getStory,6493);
List<ZtTask> list = ztTaskService.list();
for (ZtTask ztStoryspec : list) {
if(!StringUtils.isEmpty(ztStoryspec.getDesc())){
System.out.println(ztStoryspec);
System.out.println(ztStoryspec);
// 正则表达式匹配Base64图片
String pattern = "<img\\s+src=\"data:image/[^;]+;base64,[^\"]+\"\\s*/?>";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(ztStoryspec.getDesc());
String s = base64ImageSaver.saveBase64Images(ztStoryspec.getDesc());
ztStoryspec.setDesc(s);
ztTaskService.updateById(ztStoryspec);
System.out.println("<UNK>" + s + "<UNK>");
}
}
}
public void handBug(){
// ZtStory byId = this.ztStoryService.getById(6493);
// LambdaQueryWrapper<ZtStoryspec> lambda = new QueryWrapper<ZtStoryspec>().lambda();
// lambda.eq(ZtStoryspec::getStory,6493);
List<ZtBug> list = Arrays.asList(ztBugService.getById(287));
for (ZtBug ztStoryspec : list) {
if(!StringUtils.isEmpty(ztStoryspec.getSteps())){
System.out.println(ztStoryspec);
System.out.println(ztStoryspec);
// 正则表达式匹配Base64图片
String pattern = "<img\\s+src=\"data:image/[^;]+;base64,[^\"]+\"\\s*/?>";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(ztStoryspec.getSteps());
String s = base64ImageSaver.saveBase64Images(ztStoryspec.getSteps());
ztStoryspec.setSteps(s);
ztBugService.updateById(ztStoryspec);
System.out.println("<UNK>" + s + "<UNK>");
}
}
}
} }

View File

@ -0,0 +1,75 @@
package com.sa.zentao.conf;
import com.sa.zentao.utils.DateUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.*;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;
import java.util.regex.*;
@Component
public class Base64ImageSaver {
@Value("${file.path.windows}")
private String windowsFilePath;
@Value("${file.path.linux}")
private String linuxFilePath;
@Value("${file.baseUrl}")
private String baseUrl;
// 正则表达式匹配Base64图片
private static final String IMG_PATTERN = "<img\\s+src=\"data:image/([^;]+);base64,([^\"]+)\"\\s*/?>";
/**
* 从HTML内容中提取并保存Base64图片
* @param htmlContent 包含Base64图片的HTML文本
* @param outputDir 输出目录路径
* @return 保存成功的图片数量
*/
public String saveBase64Images(String htmlContent) {
Pattern pattern = Pattern.compile(IMG_PATTERN);
Matcher m = pattern.matcher(htmlContent);
int counter = 0;
StringBuffer sb = new StringBuffer();
while (m.find()) {
String imageType = m.group(1); // 图片类型(png/jpeg等)
String base64Data = m.group(2); // Base64数据
try {
// 解码Base64数据
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
String fName= DateUtils.formatDate(new Date(),"yyyyMMddHHmmss")+ UUID.randomUUID().toString().replaceAll("-","")+ "." + imageType;
// 生成输出文件名
String os = System.getProperty("os.name");
if (os.toLowerCase().startsWith("win")) { //如果是Windows系统
os=windowsFilePath +"\\";
}else{ //linux和mac系统
os=linuxFilePath+"/";
}
// 写入文件
try (FileOutputStream fos = new FileOutputStream(os+fName)) {
fos.write(imageBytes);
}
// 替换为网络URL路径
String replacement = "<img src=\""+ baseUrl+"/zentao/img/"+fName+ "\">";
m.appendReplacement(sb, replacement);
counter++;
System.out.println("图片保存成功: " + os+fName);
} catch (IOException e) {
System.err.println("保存图片失败: " + e.getMessage());
}
}
m.appendTail(sb);
System.out.println("<UNK>: " + sb.toString());
return sb.toString();
}
}

View File

@ -33,6 +33,11 @@ import java.util.stream.Collectors;
@RequestMapping("/common") @RequestMapping("/common")
public class CommonsController { public class CommonsController {
@PostMapping("/test")
public Result<String> test( UploadDTO file){
System.out.println(file);
return Result.success();
}
// @PostMapping("/upload") // @PostMapping("/upload")
// public Result<String> upload(@RequestParam("file") MultipartFile file){ // public Result<String> upload(@RequestParam("file") MultipartFile file){
@ -67,6 +72,7 @@ public class CommonsController {
if (file.getFile().isEmpty()) { if (file.getFile().isEmpty()) {
return Result.fail(Code.FAIL); return Result.fail(Code.FAIL);
} }
try { try {
// 获取文件名 // 获取文件名
String fName = file.getFile().getOriginalFilename(); String fName = file.getFile().getOriginalFilename();

View File

@ -6,6 +6,7 @@ import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.*; import com.sa.zentao.dao.*;
import com.sa.zentao.entity.ZtProject; import com.sa.zentao.entity.ZtProject;
import com.sa.zentao.entity.ZtProjectproduct; import com.sa.zentao.entity.ZtProjectproduct;
import com.sa.zentao.qo.SearchQo;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.IZtProjectproductService; import com.sa.zentao.service.IZtProjectproductService;
import com.sa.zentao.service.IZtStoryService; import com.sa.zentao.service.IZtStoryService;
@ -185,6 +186,13 @@ public class ZtStoryController {
return Result.success(list); return Result.success(list);
} }
//全局搜索 bug 需求 任务 问题反馈等
@RequestMapping(value = "/searchByName", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result<PageInfo> searchByName(@RequestBody SearchQo qo){
PageInfo<SearchDTO> searchDTOPageInfo = ztStoryService.searchByName(qo);
return Result.success(searchDTOPageInfo);
}
//迭代列表根据项目id //迭代列表根据项目id

View File

@ -17,11 +17,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -63,6 +59,10 @@ public class ZtStoryUserController {
storyUserService.addStory(dto); storyUserService.addStory(dto);
return Result.success(); return Result.success();
} }
@RequestMapping(value = "/getKanban", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getKanban(@RequestParam(name = "productId",required = true) Integer productId){
return Result.success(storyUserService.getKanban(productId));
}
@RequestMapping(value = "/editStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @RequestMapping(value = "/editStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result editStory(@RequestBody ZtStoryUserDTO dto){ public Result editStory(@RequestBody ZtStoryUserDTO dto){
@ -88,7 +88,7 @@ public class ZtStoryUserController {
if(CollectionUtils.isEmpty( qo.getStatusList())){ if(CollectionUtils.isEmpty( qo.getStatusList())){
eq.notIn(ZtStoryUser::getStatus,UserStoryEnums.CLOSED.getCode()); eq.notIn(ZtStoryUser::getStatus,UserStoryEnums.CLOSED.getCode());
}else { }else {
eq.in(ZtStoryUser::getStatus, UserStoryEnums.CFM.getCode(),UserStoryEnums.KFZ.getCode()); eq.in(ZtStoryUser::getStatus, UserStoryEnums.JH.getCode(),UserStoryEnums.CFM.getCode(),UserStoryEnums.KFZ.getCode());
} }
eq.select(ZtStoryUser::getId,ZtStoryUser::getTitle,ZtStoryUser::getProduct, eq.select(ZtStoryUser::getId,ZtStoryUser::getTitle,ZtStoryUser::getProduct,
ZtStoryUser::getOpenedby,ZtStoryUser::getAssignedto,ZtStoryUser::getYsUser ZtStoryUser::getOpenedby,ZtStoryUser::getAssignedto,ZtStoryUser::getYsUser

View File

@ -0,0 +1,35 @@
package com.sa.zentao.dao;
import lombok.Data;
import java.util.Date;
@Data
public class SearchDTO {
/**
* id
*/
private Integer id;
/**
* 1 用户需求 2研发需求 3 任务 4 问题反馈 5 bug
*/
private Integer type;
/**
* 标题
*/
private String name;
/**
* 描述
*/
private String spec;
/**
* 验收标准
*/
private String verify;
/**
* 创建日期
*/
private Date openedDate;
}

View File

@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@ -25,6 +26,6 @@ public class UploadDTO implements Serializable {
private Integer objectId; private Integer objectId;
private List<Integer> testIds;
} }

View File

@ -29,7 +29,7 @@ public class ZtAllBusinessDTO implements Serializable {
private Integer bugId; private Integer bugId;
// story task bug userStory // story task bug userStory feedback
private String searchType; private String searchType;
private String searchId; private String searchId;
} }

View File

@ -120,4 +120,8 @@ public class ZtStoryUserTaskDTO implements Serializable {
private String status; private String status;
private String desc; private String desc;
/**
* 交付物
*/
private String deliverContent;
} }

View File

@ -114,4 +114,8 @@ public class ZtStoryUserTask implements Serializable {
//wait 未开始 doing 进行中 finished 完成 cancel取消 closed //wait 未开始 doing 进行中 finished 完成 cancel取消 closed
@TableField("`status`") @TableField("`status`")
private String status; private String status;
/**
* 交付物
*/
private String deliverContent;
} }

View File

@ -1,6 +1,7 @@
package com.sa.zentao.mapper; package com.sa.zentao.mapper;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import com.sa.zentao.dao.SearchDTO;
import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.entity.ZtStory; import com.sa.zentao.entity.ZtStory;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@ -37,4 +38,25 @@ public interface ZtStoryMapper extends BaseMapper<ZtStory> {
//pids 产品id //pids 产品id
List<ZtStory> getStoryListByDatePidsProject(@Param("ids")List<Integer> pids, @Param("project")Integer project List<ZtStory> getStoryListByDatePidsProject(@Param("ids")List<Integer> pids, @Param("project")Integer project
, @Param("start")Date firstDayOfMonth, @Param("end")Date lastDayOfMonth); , @Param("start")Date firstDayOfMonth, @Param("end")Date lastDayOfMonth);
List<SearchDTO> searchBug(@Param("keyword") String keyword);
List<SearchDTO> searchTask(@Param("keyword") String keyword);
List<SearchDTO> searchStory(@Param("keyword") String keyword);
List<SearchDTO> searchFeedback(@Param("keyword") String keyword);
/**
*
* @param keyword 搜索内容
* @return
*/
List<SearchDTO> searchUserStory(@Param("keyword") String keyword);
/**
*
* @param keyword 搜索内容
* @return
*/
List<SearchDTO> searchAll(@Param("keyword") String keyword,@Param("pIds")List<Integer> pIds);
} }

View File

@ -0,0 +1,18 @@
package com.sa.zentao.qo;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class SearchQo extends BaseQo {
/**
* 搜索项
*/
private String keyword;
/**
* 搜索类型 1 用户需求 2研发需求 3 任务 4 问题反馈 5 bug
*/
private String searchType;
}

View File

@ -1,6 +1,7 @@
package com.sa.zentao.service; package com.sa.zentao.service;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.SearchDTO;
import com.sa.zentao.dao.ZtStoryCaseDTO; import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.dao.ZtStoryUserDTO; import com.sa.zentao.dao.ZtStoryUserDTO;
@ -9,6 +10,7 @@ import com.sa.zentao.entity.ZtStory;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.entity.ZtStoryCase; import com.sa.zentao.entity.ZtStoryCase;
import com.sa.zentao.enums.TaskType; import com.sa.zentao.enums.TaskType;
import com.sa.zentao.qo.SearchQo;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -50,6 +52,7 @@ public interface IZtStoryService extends IService<ZtStory> {
PageInfo<ZtStoryDTO> projectStoryPageList(ZtProjectQo qo); PageInfo<ZtStoryDTO> projectStoryPageList(ZtProjectQo qo);
List<ZtStoryDTO> storyNoSyncProject(ZtProjectQo qo); List<ZtStoryDTO> storyNoSyncProject(ZtProjectQo qo);
//未开始 //未开始
void waitStory(Integer story); void waitStory(Integer story);
void startStory(Integer story); void startStory(Integer story);
@ -100,4 +103,6 @@ public interface IZtStoryService extends IService<ZtStory> {
public Map<Integer, ZtStoryCaseDTO> getStoryCaseMap(List<ZtStoryDTO> list); public Map<Integer, ZtStoryCaseDTO> getStoryCaseMap(List<ZtStoryDTO> list);
List<ZtStory> getStoryListByDatePidsProject(List<Integer> pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth); List<ZtStory> getStoryListByDatePidsProject(List<Integer> pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth);
PageInfo<SearchDTO> searchByName(SearchQo qo);
} }

View File

@ -11,6 +11,7 @@ import com.sa.zentao.qo.StoryQo;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
@ -26,6 +27,8 @@ public interface IZtStoryUserService extends IService<ZtStoryUser> {
public void editStory(ZtStoryUserDTO dto); public void editStory(ZtStoryUserDTO dto);
public Map<String,List<ZtStoryUserDTO>> getKanban(Integer productId);
PageInfo<ZtStoryUserDTO> pageList(StoryQo dto); PageInfo<ZtStoryUserDTO> pageList(StoryQo dto);
void changeStatus(ZtStoryUserDTO dto); void changeStatus(ZtStoryUserDTO dto);

View File

@ -190,7 +190,7 @@ public class IZtCountService {
return new ZtStoryCountDTO(); return new ZtStoryCountDTO();
} }
String name = loginRiskUser.getName(); String name = loginRiskUser.getName();
if (userType == UserType.GSGC) { if (userType == UserType.GSGC || userType == UserType.XMZL) {
List<ZtStoryUser> list = null; List<ZtStoryUser> list = null;
List<ZtStory> ztStory = null; List<ZtStory> ztStory = null;
@ -208,19 +208,6 @@ public class IZtCountService {
list = new ArrayList<>(); list = new ArrayList<>();
ztStory = new ArrayList<>(); ztStory = new ArrayList<>();
} }
// } else {
// list = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda().in(ZtStoryUser::getStatus, "active", "reviewing", "active", "unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed"));
//
// if (CollectionUtils.isEmpty(list)) {
// ztStory = new ArrayList<>();
// } else {
// ztStory = storyService.list(new QueryWrapper<ZtStory>()
// .lambda().eq(ZtStory::getDeleted, "0")
// .ne(ZtStory::getStatus, "closed")
// );
// }
// }
List<ZtProduct> products = this.productService.list(new QueryWrapper<ZtProduct>().lambda().eq(ZtProduct::getStatus, "normal").in(ZtProduct::getId, pIds)); List<ZtProduct> products = this.productService.list(new QueryWrapper<ZtProduct>().lambda().eq(ZtProduct::getStatus, "normal").in(ZtProduct::getId, pIds));
if (!CollectionUtils.isEmpty(products)) { if (!CollectionUtils.isEmpty(products)) {
@ -405,11 +392,6 @@ public class IZtCountService {
.lambda().eq(ZtStory::getDeleted, "0") .lambda().eq(ZtStory::getDeleted, "0")
.ne(ZtStory::getStatus, "closed"); .ne(ZtStory::getStatus, "closed");
// .in(ZtStory::getProduct,integers)
// .or()
// .in()
//所有的产品 //所有的产品
eq.in(ZtStory::getProduct, pIds); eq.in(ZtStory::getProduct, pIds);
List<ZtStory> ztStory = this.storyService.list(eq); List<ZtStory> ztStory = this.storyService.list(eq);
@ -421,8 +403,12 @@ public class IZtCountService {
Arrays.asList("active", "unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed").contains(o.getStatus())) Arrays.asList("active", "unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed").contains(o.getStatus()))
.map(o -> o.getId() + "").collect(Collectors.joining(","))); .map(o -> o.getId() + "").collect(Collectors.joining(",")));
result.setPlanCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) // result.setPlanCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
.filter(o -> o.getStage().equals("wait")).map(o -> o.getId() + "").collect(Collectors.joining(","))); // .filter(o -> o.getStage().equals("wait")).map(o -> o.getId() + "").collect(Collectors.joining(",")));
//改为待确认
result.setPlanCount(storyUsers.stream().filter(o -> "storyunconfirmed".equals(o.getStatus()))
.map(o -> o.getId() + "").collect(Collectors.joining(",")));
result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
.filter(o -> Arrays.asList("testing", "tested").contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(","))); .filter(o -> Arrays.asList("testing", "tested").contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(",")));
@ -733,7 +719,7 @@ public class IZtCountService {
List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth,csAccountIds, BugTypeEnums.RELEASE); List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth,csAccountIds, BugTypeEnums.RELEASE);
//获取测试需求 //获取测试需求
List<ZtStory> cswcStoryList = CollectionUtils.isEmpty(csAccountIds)?Collections.EMPTY_LIST:this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids) List<ZtStory> cswcStoryList = CollectionUtils.isEmpty(csAccountIds)?Collections.EMPTY_LIST:this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, csAccountIds).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth)); .in(ZtStory::getAssignedTo, csAccountIds).ge(ZtStory::getReleaseddate, firstDayOfMonth).le(ZtStory::getReleaseddate, lastDayOfMonth));
for (ZtUser u : ztUsers) { for (ZtUser u : ztUsers) {
@ -812,7 +798,7 @@ public class IZtCountService {
List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth,csAccountIds , BugTypeEnums.RELEASE); List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth,csAccountIds , BugTypeEnums.RELEASE);
//获取测试需求 //获取测试需求
List<ZtStory> cswcStoryList = CollectionUtils.isEmpty(csAccountIds)?Collections.EMPTY_LIST:this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids) List<ZtStory> cswcStoryList = CollectionUtils.isEmpty(csAccountIds)?Collections.EMPTY_LIST:this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, csAccountIds).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth)); .in(ZtStory::getAssignedTo, csAccountIds).ge(ZtStory::getReleaseddate, firstDayOfMonth).le(ZtStory::getReleaseddate, lastDayOfMonth));
for (ZtUser u : ztUsers) { for (ZtUser u : ztUsers) {
@ -2321,6 +2307,7 @@ public class IZtCountService {
int i = bugRate.multiply(BigDecimal.valueOf(100)).intValue(); int i = bugRate.multiply(BigDecimal.valueOf(100)).intValue();
if (i <= 5) { if (i <= 5) {
result.setBugScore(BigDecimal.valueOf(20)); result.setBugScore(BigDecimal.valueOf(20));
return result;
} }
//严重10 分 轻微3分一个 //严重10 分 轻微3分一个
int bugScore = 0; int bugScore = 0;
@ -2500,7 +2487,7 @@ public class IZtCountService {
dataMap.put("name", name); dataMap.put("name", name);
dataMap.put("date", DateUtils.formatDate(d, "yyyy-MM")); dataMap.put("date", DateUtils.formatDate(d, "yyyy-MM"));
dataMap.put("准时率得分", performanceDTO.getPunctualityScore()==null?"0": performanceDTO.getPunctualityScore().toString()); dataMap.put("准时率得分", performanceDTO.getPunctualityScore()==null?"0": performanceDTO.getPunctualityScore().toString());
dataMap.put("缺陷检出率", performanceDTO.getBugFindScore() ==null?"0":performanceDTO.getBugFindScore().toString()); dataMap.put("缺陷检出率", performanceDTO.getBugFindRate() ==null?"0":performanceDTO.getBugFindRate().multiply(BigDecimal.valueOf(100)).toString());
dataMap.put("测试文档", performanceDTO.getDocumentQualityScore()==null?"0":performanceDTO.getDocumentQualityScore().toString()); dataMap.put("测试文档", performanceDTO.getDocumentQualityScore()==null?"0":performanceDTO.getDocumentQualityScore().toString());
dataMap.put("工作态度", performanceDTO.getWorkAttitude()==null?"0":performanceDTO.getWorkAttitude().toString()); dataMap.put("工作态度", performanceDTO.getWorkAttitude()==null?"0":performanceDTO.getWorkAttitude().toString());
@ -2518,12 +2505,12 @@ public class IZtCountService {
dataMap.put("测试普通bug", performanceDTO.getDevSlightBug()==null?"0": performanceDTO.getDevSlightBug().toString()); dataMap.put("测试普通bug", performanceDTO.getDevSlightBug()==null?"0": performanceDTO.getDevSlightBug().toString());
dataMap.put("测试重大bug", performanceDTO.getDevSeriousBug() ==null?"0": performanceDTO.getDevSeriousBug().toString()); dataMap.put("测试重大bug", performanceDTO.getDevSeriousBug() ==null?"0": performanceDTO.getDevSeriousBug().toString());
dataMap.put("缺陷检出分数", performanceDTO.getBugFindScore()==null?"0": performanceDTO.getBugFindScore().multiply(BigDecimal.valueOf(100)).toString()); dataMap.put("缺陷检出分数", performanceDTO.getBugFindScore()==null?"0": performanceDTO.getBugFindScore().toString());
dataMap.put("线上普通bug", performanceDTO.getSlightBug() ==null?"0": performanceDTO.getSlightBug().toString()); dataMap.put("线上普通bug", performanceDTO.getSlightBug() ==null?"0": performanceDTO.getSlightBug().toString());
dataMap.put("线上重大bug", performanceDTO.getSeriousBug()==null?"0": performanceDTO.getSeriousBug().toString()); dataMap.put("线上重大bug", performanceDTO.getSeriousBug()==null?"0": performanceDTO.getSeriousBug().toString());
dataMap.put("总分", devlopTotal(dataMap.get("准时率得分") dataMap.put("总分", devlopTotal(dataMap.get("准时率得分")
, dataMap.get("缺陷检出"), , dataMap.get("缺陷检出分数"),
dataMap.get("测试文档"), dataMap.get("工作态度"), dataMap.get("测试文档"), dataMap.get("工作态度"),
dataMap.get("质量贡献"), dataMap.get("线上Bug"), dataMap.get("创新贡献")) dataMap.get("质量贡献"), dataMap.get("线上Bug"), dataMap.get("创新贡献"))
); );
@ -2599,7 +2586,7 @@ public class IZtCountService {
List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth, Arrays.asList(u.getAccount()), BugTypeEnums.RELEASE); List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth, Arrays.asList(u.getAccount()), BugTypeEnums.RELEASE);
//获取测试需求 //获取测试需求
List<ZtStory> cswcStoryList = this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids) List<ZtStory> cswcStoryList = this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, Arrays.asList(u.getAccount())).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth)); .in(ZtStory::getAssignedTo, Arrays.asList(u.getAccount())).ge(ZtStory::getReleaseddate, firstDayOfMonth).le(ZtStory::getReleaseddate, lastDayOfMonth));
if (name.equals("liyuyan")) { if (name.equals("liyuyan")) {
result = buildXMZLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d); result = buildXMZLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);

View File

@ -432,12 +432,16 @@ public class ZtProductServiceImpl extends ServiceImpl<ZtProductMapper, ZtProduct
List<ZtProject> ztProjects = this.projectService.listByIds(projectproductlist.stream().map(o -> o.getProject()).collect(Collectors.toList())); List<ZtProject> ztProjects = this.projectService.listByIds(projectproductlist.stream().map(o -> o.getProject()).collect(Collectors.toList()));
result.put("project",ztProjects); result.put("project",ztProjects);
List<ZtExecutionproject> list = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().in(ZtExecutionproject::getProject, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); List<ZtExecutionproject> list = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().in(ZtExecutionproject::getProject, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList())));
List<ZtProject> execList = this.projectService List<ZtProject> execList = new ArrayList<>();
.list(new QueryWrapper<ZtProject>().lambda() if(!CollectionUtils.isEmpty(list)){
.ne(ZtProject::getStatus,"closed") execList=this.projectService
.in(ZtProject::getId,list.stream().map(o -> o.getExecution()).collect(Collectors.toList())) .list(new QueryWrapper<ZtProject>().lambda()
.orderByDesc(ZtProject::getId) .ne(ZtProject::getStatus,"closed")
); .in(ZtProject::getId,list.stream().map(o -> o.getExecution()).collect(Collectors.toList()))
.orderByDesc(ZtProject::getId)
);
}
result.put("execution",execList); result.put("execution",execList);
}else{ }else{
result.put("project",Arrays.asList()); result.put("project",Arrays.asList());
@ -603,6 +607,8 @@ public class ZtProductServiceImpl extends ServiceImpl<ZtProductMapper, ZtProduct
result=this.storyUserService.getById(dto.getSearchId()); result=this.storyUserService.getById(dto.getSearchId());
}else if("bug".equals(dto.getSearchType())){ }else if("bug".equals(dto.getSearchType())){
result=this.bugService.getById(dto.getSearchId()); result=this.bugService.getById(dto.getSearchId());
} if("feedback".equals(dto.getSearchType())){
result=this.storyFeedbackService.getById(dto.getSearchId());
} }
return result; return result;

View File

@ -1,10 +1,12 @@
package com.sa.zentao.service.impl; package com.sa.zentao.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -14,15 +16,14 @@ import com.sa.zentao.dao.*;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.enums.*; import com.sa.zentao.enums.*;
import com.sa.zentao.mapper.ZtStoryMapper; import com.sa.zentao.mapper.ZtStoryMapper;
import com.sa.zentao.qo.KanbanQo; import com.sa.zentao.qo.*;
import com.sa.zentao.qo.ZtBugQo;
import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.qo.ZtReleaseQo;
import com.sa.zentao.service.*; import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.*; import com.sa.zentao.utils.*;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -30,6 +31,9 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -132,7 +136,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
ZtProduct ztProduct = pMap.get(d.getProduct()); ZtProduct ztProduct = pMap.get(d.getProduct());
if(ztProduct!=null){ if (ztProduct != null) {
d.setProductName(ztProduct.getName()); d.setProductName(ztProduct.getName());
} }
ztUser = userMap.get(d.getOpenedby()); ztUser = userMap.get(d.getOpenedby());
@ -209,15 +213,15 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (dto.getFeedback() != null && dto.getFeedback() != 0) { if (dto.getFeedback() != null && dto.getFeedback() != 0) {
ZtStoryFeedback storyFeedback = this.storyFeedbackService.getById(dto.getFeedback()); ZtStoryFeedback storyFeedback = this.storyFeedbackService.getById(dto.getFeedback());
if (!Arrays.asList("wait","doing").contains(storyFeedback.getStatus())) { if (!Arrays.asList("wait", "doing").contains(storyFeedback.getStatus())) {
throw new BusinessException("问题反馈已被处理"); throw new BusinessException("问题反馈已被处理");
} }
this.storyFeedbackService.feedbackStart(dto.getFeedback()); this.storyFeedbackService.feedbackStart(dto.getFeedback());
} }
if (dto.getUserStory() != null && dto.getUserStory() != 0) { if (dto.getUserStory() != null && dto.getUserStory() != 0) {
ZtStoryUser storyUser = storyUserService.getById(dto.getUserStory()); ZtStoryUser storyUser = storyUserService.getById(dto.getUserStory());
if(storyUser.getStatus().equals(UserStoryEnums.CFM.getCode())){ if (storyUser.getStatus().equals(UserStoryEnums.CFM.getCode())) {
storyUserService.storyFinishedChangeStatus(storyUser.getId(),UserStoryEnums.KFZ); storyUserService.storyFinishedChangeStatus(storyUser.getId(), UserStoryEnums.KFZ);
} }
} }
@ -258,9 +262,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
//查找需求管理的项目 需求只会被项目关联一次 //查找需求管理的项目 需求只会被项目关联一次
List<ZtExecutionproject> list = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().in(ZtExecutionproject::getExecution, executions)); List<ZtExecutionproject> list = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().in(ZtExecutionproject::getExecution, executions));
if(!CollectionUtils.isEmpty(list)){ if (!CollectionUtils.isEmpty(list)) {
Map<Integer, List<ZtExecutionproject>> map = list.stream().collect(Collectors.groupingBy(ZtExecutionproject::getProject)); Map<Integer, List<ZtExecutionproject>> map = list.stream().collect(Collectors.groupingBy(ZtExecutionproject::getProject));
if(map.keySet().size()>1){ if (map.keySet().size() > 1) {
throw new BusinessException("当前无法关联多个项目请检查"); throw new BusinessException("当前无法关联多个项目请检查");
} }
@ -269,28 +273,30 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
this.executionBindStory(s, executions); this.executionBindStory(s, executions);
} }
storySendZpMessage(s.getId(),"",s.getAssignedTo()); storySendZpMessage(s.getId(), "", s.getAssignedTo());
} }
private void storySendZpMessage(Integer id, String oldUser,String newUser) { private void storySendZpMessage(Integer id, String oldUser, String newUser) {
if(ObjectUtils.notEqual(oldUser, newUser)&&!StringUtils.isEmpty(newUser)){ if (ObjectUtils.notEqual(oldUser, newUser) && !StringUtils.isEmpty(newUser)) {
List<ZtProjectstory> storyExecutions = this.projectstoryService.projectListByStory(Arrays.asList(id), ProjectTypeEnums.execution); List<ZtProjectstory> storyExecutions = this.projectstoryService.projectListByStory(Arrays.asList(id), ProjectTypeEnums.execution);
if(!CollectionUtils.isEmpty(storyExecutions)){ if (!CollectionUtils.isEmpty(storyExecutions)) {
this.vxService.sendMessageToVx(newUser, VxMessageUtils.storyMessage.assignToMessage(id),new Date()); this.vxService.sendMessageToVx(newUser, VxMessageUtils.storyMessage.assignToMessage(id), new Date());
} }
} }
} }
private void storyYsFalseSendMessage(Integer id, List<String> newUsers) { private void storyYsFalseSendMessage(Integer id, List<String> newUsers) {
if(!CollectionUtils.isEmpty(newUsers)){ if (!CollectionUtils.isEmpty(newUsers)) {
for (String u:newUsers) { for (String u : newUsers) {
if(!StringUtils.isEmpty(u)){ if (!StringUtils.isEmpty(u)) {
this.vxService.sendMessageToVx(u, VxMessageUtils.storyMessage.ysFalseMessage(id),new Date()); this.vxService.sendMessageToVx(u, VxMessageUtils.storyMessage.ysFalseMessage(id), new Date());
} }
} }
} }
} }
private ZtStoryspec buildSpec(ZtStoryDTO dto, ZtStory s) { private ZtStoryspec buildSpec(ZtStoryDTO dto, ZtStory s) {
ZtStoryspec spec = new ZtStoryspec(); ZtStoryspec spec = new ZtStoryspec();
@ -305,16 +311,16 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
private ZtStory buildStory(ZtStoryDTO dto) { private ZtStory buildStory(ZtStoryDTO dto) {
if(dto.getUserStory()!=null&&dto.getUserStory()!=0){ if (dto.getUserStory() != null && dto.getUserStory() != 0) {
ZtStoryUser ztStoryUser = this.storyUserService.getById(dto.getUserStory()); ZtStoryUser ztStoryUser = this.storyUserService.getById(dto.getUserStory());
if(ztStoryUser==null){ if (ztStoryUser == null) {
throw new BusinessException("未查询到用户需求"); throw new BusinessException("未查询到用户需求");
} }
if(!Arrays.asList(UserStoryEnums.CFM.getCode(),UserStoryEnums.KFZ.getCode(),UserStoryEnums.JH.getCode()).contains(ztStoryUser.getStatus())){ if (!Arrays.asList(UserStoryEnums.CFM.getCode(), UserStoryEnums.KFZ.getCode(), UserStoryEnums.JH.getCode()).contains(ztStoryUser.getStatus())) {
throw new BusinessException("用户需求无法关联请检查"); throw new BusinessException("用户需求无法关联请检查");
} }
if(UserStoryEnums.JH.getCode().equals(ztStoryUser.getStatus())){ if (UserStoryEnums.JH.getCode().equals(ztStoryUser.getStatus())) {
this.storyUserService.changeStatus(ztStoryUser.getId(),UserStoryEnums.CFM); this.storyUserService.changeStatus(ztStoryUser.getId(), UserStoryEnums.CFM);
} }
} }
ZtStory s = new ZtStory(); ZtStory s = new ZtStory();
@ -458,12 +464,12 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override @Override
public List<ZtStory> getNormalStory(List<ZtStory> sList) { public List<ZtStory> getNormalStory(List<ZtStory> sList) {
List result=new ArrayList(); List result = new ArrayList();
for (ZtStory st:sList) { for (ZtStory st : sList) {
if(!st.getStatus().equals("closed")){ if (!st.getStatus().equals("closed")) {
result.add(st); result.add(st);
} }
if(st.getStatus().equals("closed")&&st.getYsFlag()!=null&&st.getYsFlag()!=0){ if (st.getStatus().equals("closed") && st.getYsFlag() != null && st.getYsFlag() != 0) {
result.add(st); result.add(st);
} }
@ -493,9 +499,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
//查找需求管理的项目 需求只会被项目关联一次 //查找需求管理的项目 需求只会被项目关联一次
List<ZtExecutionproject> list = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().in(ZtExecutionproject::getExecution, executions)); List<ZtExecutionproject> list = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().in(ZtExecutionproject::getExecution, executions));
if(!CollectionUtils.isEmpty(list)){ if (!CollectionUtils.isEmpty(list)) {
Map<Integer, List<ZtExecutionproject>> map = list.stream().collect(Collectors.groupingBy(ZtExecutionproject::getProject)); Map<Integer, List<ZtExecutionproject>> map = list.stream().collect(Collectors.groupingBy(ZtExecutionproject::getProject));
if(map.keySet().size()>1){ if (map.keySet().size() > 1) {
throw new BusinessException("当前无法关联多个项目请检查"); throw new BusinessException("当前无法关联多个项目请检查");
} }
@ -577,13 +583,13 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
ztStory.setLastediteddate(new Date());
this.baseMapper.updateById(ztStory); this.baseMapper.updateById(ztStory);
if(dto.getReleaseId()!=null&&dto.getReleaseId()!=0){ if (dto.getReleaseId() != null && dto.getReleaseId() != 0) {
this.releaseService.changeRelease(dto.getReleaseId(),ztStory.getId(),"story"); this.releaseService.changeRelease(dto.getReleaseId(), ztStory.getId(), "story");
}else{ } else {
ZtReleaseQo qo =new ZtReleaseQo(); ZtReleaseQo qo = new ZtReleaseQo();
qo.setStoryList(Arrays.asList(id)); qo.setStoryList(Arrays.asList(id));
this.releaseService.removeStory(qo); this.releaseService.removeStory(qo);
} }
@ -594,12 +600,12 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
s.setStage(dto.getStage()); s.setStage(dto.getStage());
this.changeStatus(s); this.changeStatus(s);
} }
if(ObjectUtils.notEqual(userStory,newUserStory)){ if (ObjectUtils.notEqual(userStory, newUserStory)) {
if(userStory!=null&&userStory!=0){ if (userStory != null && userStory != 0) {
this.storyUserService.storyFinishedChangeStatus(userStory,UserStoryEnums.YWC); this.storyUserService.storyFinishedChangeStatus(userStory, UserStoryEnums.YWC);
} }
if(newUserStory!=null&&newUserStory!=0){ if (newUserStory != null && newUserStory != 0) {
this.storyUserService.storyFinishedChangeStatus(newUserStory,UserStoryEnums.KFZ); this.storyUserService.storyFinishedChangeStatus(newUserStory, UserStoryEnums.KFZ);
} }
} }
@ -631,7 +637,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
} }
storySendZpMessage(ztStory.getId(),oldAssignedTo,ztStory.getAssignedTo()); storySendZpMessage(ztStory.getId(), oldAssignedTo, ztStory.getAssignedTo());
} }
@ -659,7 +665,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
//一个需求如果绑定多个项目 不是当前的项目 //一个需求如果绑定多个项目 不是当前的项目
List<ZtProjectstory> bindProject = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda() List<ZtProjectstory> bindProject = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.ne(ZtProjectstory::getProject, project) .ne(ZtProjectstory::getProject, project)
.eq(ZtProjectstory::getType,"project") .eq(ZtProjectstory::getType, "project")
.eq(ZtProjectstory::getStory, storyId) .eq(ZtProjectstory::getStory, storyId)
); );
@ -669,7 +675,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
切换的迭代不是当前需求已经绑定的迭代 切换的迭代不是当前需求已经绑定的迭代
this.projectstoryService.remove(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getProject, oldProject).eq(ZtProjectstory::getStory, storyId)); this.projectstoryService.remove(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getProject, oldProject).eq(ZtProjectstory::getStory, storyId));
*/ */
if(!CollectionUtils.isEmpty(bindProject)) throw new BusinessException("需求被多个项目关联"); if (!CollectionUtils.isEmpty(bindProject)) throw new BusinessException("需求被多个项目关联");
if (CollectionUtils.isEmpty(list)) { if (CollectionUtils.isEmpty(list)) {
ZtProjectDTO d = new ZtProjectDTO(); ZtProjectDTO d = new ZtProjectDTO();
@ -719,18 +725,18 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
List<Integer> pAuth = this.projectService.authProductList(); List<Integer> pAuth = this.projectService.authProductList();
if(CollectionUtils.isEmpty(pAuth)){ if (CollectionUtils.isEmpty(pAuth)) {
return Arrays.asList(); return Arrays.asList();
} }
List<ZtStory> sList = this.baseMapper.selectList(new QueryWrapper<ZtStory>().lambda() List<ZtStory> sList = this.baseMapper.selectList(new QueryWrapper<ZtStory>().lambda()
.ne(ZtStory::getStatus, "closed") .ne(ZtStory::getStatus, "closed")
.in(ZtStory::getProduct,pAuth) .in(ZtStory::getProduct, pAuth)
.and(o-> o.eq(ZtStory::getAssignedTo, RiskUserThreadLocal.get().getName()) .and(o -> o.eq(ZtStory::getAssignedTo, RiskUserThreadLocal.get().getName())
.or().eq(ZtStory::getOpenedby, RiskUserThreadLocal.get().getName())) .or().eq(ZtStory::getOpenedby, RiskUserThreadLocal.get().getName()))
.orderByDesc(ZtStory::getId) .orderByDesc(ZtStory::getId)
); );
List<ZtStoryDTO> storyDTOList = BeanCopyUtil.copyListProperties(sList, ZtStoryDTO::new,new BeanCopyUtilCallBack<ZtStory,ZtStoryDTO>() { List<ZtStoryDTO> storyDTOList = BeanCopyUtil.copyListProperties(sList, ZtStoryDTO::new, new BeanCopyUtilCallBack<ZtStory, ZtStoryDTO>() {
@Override @Override
public void callBack(ZtStory t, ZtStoryDTO s) { public void callBack(ZtStory t, ZtStoryDTO s) {
s.setOpeneddate(t.getOpenedDate()); s.setOpeneddate(t.getOpenedDate());
@ -750,7 +756,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
if (userType == UserType.CP) { if (userType == UserType.CP) {
List<ZtStoryUser> uStory = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda().ne(ZtStoryUser::getStatus, "closed") List<ZtStoryUser> uStory = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda().ne(ZtStoryUser::getStatus, "closed")
.in(ZtStoryUser::getProduct,pAuth) .in(ZtStoryUser::getProduct, pAuth)
.eq(ZtStoryUser::getOpenedby, RiskUserThreadLocal.get().getName()).orderByDesc(ZtStoryUser::getId) .eq(ZtStoryUser::getOpenedby, RiskUserThreadLocal.get().getName()).orderByDesc(ZtStoryUser::getId)
); );
if (!CollectionUtils.isEmpty(uStory)) { if (!CollectionUtils.isEmpty(uStory)) {
@ -785,9 +791,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
Map<String, ZtUser> userMap = this.userService.userMapByIds(null); Map<String, ZtUser> userMap = this.userService.userMapByIds(null);
Map<Integer,List<ZtTask>> taskCountMap = getTaskCountMap(list); Map<Integer, List<ZtTask>> taskCountMap = getTaskCountMap(list);
Map<Integer,ZtStoryCaseDTO> caseMap = getStoryCaseMap(list); Map<Integer, ZtStoryCaseDTO> caseMap = getStoryCaseMap(list);
for (ZtStoryDTO d : list) { for (ZtStoryDTO d : list) {
@ -795,24 +801,24 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
d.setViews(rMap.get(d.getId())); d.setViews(rMap.get(d.getId()));
List<ZtTask> ztTasks = taskCountMap.get(d.getId()); List<ZtTask> ztTasks = taskCountMap.get(d.getId());
ZtStoryCaseDTO ztStoryCaseDTO = caseMap.get(d.getId()); ZtStoryCaseDTO ztStoryCaseDTO = caseMap.get(d.getId());
if(ztStoryCaseDTO!=null){ if (ztStoryCaseDTO != null) {
ZtUser ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser()); ZtUser ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser());
if(ztUser!=null){ if (ztUser != null) {
ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname()); ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname());
} }
ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser()); ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser());
if(ztUser!=null){ if (ztUser != null) {
ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname()); ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname());
} }
ztUser = userMap.get(ztStoryCaseDTO.getPsUser()); ztUser = userMap.get(ztStoryCaseDTO.getPsUser());
if(ztUser!=null){ if (ztUser != null) {
ztStoryCaseDTO.setPsUserName(ztUser.getNickname()); ztStoryCaseDTO.setPsUserName(ztUser.getNickname());
} }
d.setCaseInfo(ztStoryCaseDTO); d.setCaseInfo(ztStoryCaseDTO);
} }
d.setTaskCount(ztTasks==null?0:ztTasks.size()); d.setTaskCount(ztTasks == null ? 0 : ztTasks.size());
List<ZtProject> ztProjectList = execMap.get(d.getId()); List<ZtProject> ztProjectList = execMap.get(d.getId());
@ -843,7 +849,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
public Map<Integer, ZtStoryCaseDTO> getStoryCaseMap(List<ZtStoryDTO> list) { public Map<Integer, ZtStoryCaseDTO> getStoryCaseMap(List<ZtStoryDTO> list) {
if(CollectionUtils.isEmpty(list)){ if (CollectionUtils.isEmpty(list)) {
return new HashMap<>(); return new HashMap<>();
} }
List<Integer> sIds = list.stream().map(o -> o.getId()).collect(Collectors.toList()); List<Integer> sIds = list.stream().map(o -> o.getId()).collect(Collectors.toList());
@ -851,9 +857,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
List<ZtStoryCase> caseList = this.storyCaseService.list(new QueryWrapper<ZtStoryCase>().lambda() List<ZtStoryCase> caseList = this.storyCaseService.list(new QueryWrapper<ZtStoryCase>().lambda()
.select(SFunctionColums.caseColumes()) .select(SFunctionColums.caseColumes())
.in(ZtStoryCase::getStory, sIds)); .in(ZtStoryCase::getStory, sIds));
if(CollectionUtils.isEmpty(caseList)){ if (CollectionUtils.isEmpty(caseList)) {
return new HashMap<>(); return new HashMap<>();
}else{ } else {
List<ZtStoryCaseDTO> ztStoryCaseDTOS = BeanCopyUtil.copyListProperties(caseList, ZtStoryCaseDTO::new); List<ZtStoryCaseDTO> ztStoryCaseDTOS = BeanCopyUtil.copyListProperties(caseList, ZtStoryCaseDTO::new);
return ztStoryCaseDTOS.stream().collect(Collectors.toMap(ZtStoryCaseDTO::getStory, o -> o)); return ztStoryCaseDTOS.stream().collect(Collectors.toMap(ZtStoryCaseDTO::getStory, o -> o));
} }
@ -861,7 +867,108 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override @Override
public List<ZtStory> getStoryListByDatePidsProject(List<Integer> pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth) { public List<ZtStory> getStoryListByDatePidsProject(List<Integer> pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth) {
return this.baseMapper.getStoryListByDatePidsProject(pids,id,firstDayOfMonth,lastDayOfMonth); return this.baseMapper.getStoryListByDatePidsProject(pids, id, firstDayOfMonth, lastDayOfMonth);
}
@Autowired
private SqlSession sqlSession;
@Override
public PageInfo<SearchDTO> searchByName(SearchQo qo) {
Page<SearchDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
// 1 用户需求 2研发需求 3 任务 4 问题反馈 5 bug
List<SearchDTO> searchDTOS = new ArrayList<>();
List<Integer> pIds = this.projectService.authProductList();
if(CollectionUtils.isEmpty(pIds)) {
throw new BusinessException("当前无权限");
}
if (qo.getSearchType().contains("100")) {
searchDTOS = searchAll(qo,pIds);
} else {
StringBuilder builder = new StringBuilder();
String[] split = qo.getSearchType().split(",");
for (int i =0;i<split.length;i++) {
builder.append(" (");
if(split[i].equals("1")){
builder.append("SELECT id,st.title name, spc.spec spec,spc.verify verify,1 type,openedDate from zt_story_user st " +
" LEFT JOIN zt_story_userspec spc on st.id=spc.story WHERE 1=1" +
" and product in (" + pIds.stream().map(o->o.toString()).collect(Collectors.joining(",")) +
") and (spc.spec like concat('%', '"+qo.getKeyword()+"', '%') or spc.verify like concat('%', '"+qo.getKeyword()+"', '%') or st.title like concat('%', '"+qo.getKeyword()+"', '%') ) order by id desc");
}else if(split[i].equals("2")){
builder.append("SELECT id,st.title name, spc.spec spec,spc.verify verify,2 type,openedDate from zt_story st" +
" left join zt_storyspec spc on st.id=spc.story WHERE 1=1 " +
" and product in (" + pIds.stream().map(o->o.toString()).collect(Collectors.joining(",")) +
") and (spc.spec like concat('%', '"+qo.getKeyword()+"', '%') or spc.verify like concat('%', '"+qo.getKeyword()+"', '%') or st.title like concat('%', '"+qo.getKeyword()+"', '%') ) order by id desc");
}else if(split[i].equals("3")){
builder.append("SELECT id,name name, `desc` spec,'' verify,3 type,openedDate from zt_task WHERE 1=1" +
" and product in (" + pIds.stream().map(o->o.toString()).collect(Collectors.joining(",")) +
") and (name like concat('%', '"+qo.getKeyword()+"', '%') or `desc` like concat('%','"+qo.getKeyword()+"', '%') ) order by id desc");
}else if(split[i].equals("4")){
builder.append("SELECT id,remark name, spec spec,'' verify,4 type,opened_date openedDate from zt_story_feedback WHERE 1=1" +
" and product in (" + pIds.stream().map(o->o.toString()).collect(Collectors.joining(",")) +
") and (remark like concat('%', '"+qo.getKeyword()+"', '%') or spec like concat('%', '"+qo.getKeyword()+"', '%') ) order by id desc ");
}else if(split[i].equals("5")){
builder.append(" SELECT id,title name, steps spec,'' verify,5 type,openedDate from zt_bug WHERE 1=1 and product in ("+
pIds.stream().map(o->o.toString()).collect(Collectors.joining(","))
+ ") and (title like concat('%','"+qo.getKeyword()+"', '%') or steps like concat('%', '"+qo.getKeyword()+"', '%') ) order by id desc ");
}
builder.append(") ");
if(split.length>1&&i!=split.length-1){
builder.append(" UNION ");
}
}
List<Map<String, Object>> result = SqlRunner.db().selectList(builder.toString());
for (Map<String, Object> map : result) {
if(map.get("spec")!=null&&map.get("spec") instanceof byte[]){
map.put("spec", new String((byte[]) map.get("spec")));
}
if(map.get("verify")!=null&&map.get("verify") instanceof byte[]){
map.put("verify", new String((byte[]) map.get("verify")));
}
searchDTOS.add(JSON.parseObject(JSON.toJSONString(map),SearchDTO.class) );
}
}
// if (qo.getSearchType() == 1) {
// searchDTOS = searchUserStory(qo);
// } else if (qo.getSearchType() == 2) {
// searchDTOS = searchStory(qo);
// } else if (qo.getSearchType() == 3) {
// searchDTOS = searchTask(qo);
// } else if (qo.getSearchType() == 4) {
// searchDTOS = searchFeedback(qo);
// } else if (qo.getSearchType() == 5) {
// searchDTOS = searchBug(qo);
// }
long total = page.getTotal();
PageInfo<SearchDTO> searchDTOPageInfo = new PageInfo<>(searchDTOS);
searchDTOPageInfo.setTotal(total);
return searchDTOPageInfo;
}
private List<SearchDTO> searchBug(SearchQo qo) {
return this.baseMapper.searchBug(qo.getKeyword());
}
private List<SearchDTO> searchTask(SearchQo qo) {
return this.baseMapper.searchTask(qo.getKeyword());
}
private List<SearchDTO> searchStory(SearchQo qo) {
return this.baseMapper.searchStory(qo.getKeyword());
}
private List<SearchDTO> searchFeedback(SearchQo qo) {
return this.baseMapper.searchFeedback(qo.getKeyword());
}
private List<SearchDTO> searchUserStory(SearchQo qo) {
return this.baseMapper.searchUserStory(qo.getKeyword());
}
private List<SearchDTO> searchAll(SearchQo qo,List<Integer> pIds) {
return this.baseMapper.searchAll(qo.getKeyword(),pIds);
} }
private Map<Integer, List<ZtTask>> getTaskCountMap(List<ZtStoryDTO> list) { private Map<Integer, List<ZtTask>> getTaskCountMap(List<ZtStoryDTO> list) {
@ -869,9 +976,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
List<ZtTask> tList = this.taskService.list(new QueryWrapper<ZtTask>().lambda() List<ZtTask> tList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes()) .select(SFunctionColums.taskColumes())
.in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList()))); .in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList())));
if(CollectionUtils.isEmpty(tList)){ if (CollectionUtils.isEmpty(tList)) {
return new HashMap<>(); return new HashMap<>();
}else{ } else {
return tList.stream().collect(Collectors.groupingBy(ZtTask::getStory)); return tList.stream().collect(Collectors.groupingBy(ZtTask::getStory));
} }
} }
@ -988,7 +1095,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override @Override
@Transactional @Transactional
public void waitStory(Integer id){ public void waitStory(Integer id) {
if (id == null || id == 0) { if (id == null || id == 0) {
return; return;
} }
@ -1020,7 +1127,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if ("closed".equals(ztStory.getStatus())) { if ("closed".equals(ztStory.getStatus())) {
throw new BusinessException("需求当前已关闭"); throw new BusinessException("需求当前已关闭");
} }
if("developing".equals(ztStory.getStage())){ if ("developing".equals(ztStory.getStage())) {
return; return;
} }
@ -1050,7 +1157,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (ztStory == null) { if (ztStory == null) {
throw new BusinessException("未查询到需求"); throw new BusinessException("未查询到需求");
} }
if(ztStory.getStatus().equals("developed")){ if (ztStory.getStatus().equals("developed")) {
return; return;
} }
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
@ -1165,7 +1272,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ZtStory ztStory = this.baseMapper.selectById(story); ZtStory ztStory = this.baseMapper.selectById(story);
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(),null); this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(), null);
} }
if (ztStory == null) { if (ztStory == null) {
@ -1208,7 +1315,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
String ysUser = ztStory.getYsUser(); String ysUser = ztStory.getYsUser();
for (Integer execId : execIds) { for (Integer execId : execIds) {
if (execId != null) { if (execId != null) {
this.kanbanlaneService.changeStatus(execId, ztStory.getId(), "story", "released"); this.kanbanlaneService.changeStatus(execId, ztStory.getId(), "story", "released");
@ -1228,53 +1334,57 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(),null); this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(), null);
} }
actionService.addAction(ActionType.XQ, ActionStatus.FBCG, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execIds.get(0), actionService.addAction(ActionType.XQ, ActionStatus.FBCG, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execIds.get(0),
RiskUserThreadLocal.get().getName(), null, ""); RiskUserThreadLocal.get().getName(), null, "");
} }
@Override @Override
public void taskFinishChangeStatus(Integer story, String finishBy,TaskType type,Boolean cancelFlag) { public void taskFinishChangeStatus(Integer story, String finishBy, TaskType type, Boolean cancelFlag) {
ZtStory ztStory = this.getById(story); ZtStory ztStory = this.getById(story);
if(ztStory!=null&&ztStory.getStatus().equals("closed")){ if(ztStory == null) {
return; return;
} }
if(type!=TaskType.test&&type!=TaskType.devel){ if (ztStory != null && ztStory.getStatus().equals("closed")) {
return; return;
} }
if(story==null||story==0){ if (type != TaskType.test && type != TaskType.devel) {
// return;
}
if (story == null || story == 0) {
return; return;
} }
if(cancelFlag&&type==TaskType.devel){ if (cancelFlag && type == TaskType.devel) {
List<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, type.getCode())); .eq(ZtTask::getType, type.getCode()));
if(!CollectionUtils.isEmpty(develList)){ if (!CollectionUtils.isEmpty(develList)) {
this.startStory(story); this.startStory(story);
}else{ } else {
List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, TaskType.test.getCode())); .eq(ZtTask::getType, TaskType.test.getCode()));
if(!CollectionUtils.isEmpty(testList)){ if (!CollectionUtils.isEmpty(testList)) {
testingStory(story); testingStory(story);
}else{ } else {
List<ZtTask> doneList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> doneList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "done"))); .in(ZtTask::getStatus, Arrays.asList("done")));
if(CollectionUtils.isEmpty(doneList)){ if (CollectionUtils.isEmpty(doneList)) {
this.waitStory(story); this.waitStory(story);
return; return;
} }
List<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "done")) .in(ZtTask::getStatus, Arrays.asList("done"))
.eq(ZtTask::getType, TaskType.test.getCode())); .eq(ZtTask::getType, TaskType.test.getCode()));
if(!CollectionUtils.isEmpty(testedList)){ if (!CollectionUtils.isEmpty(testedList)) {
testedStory(story,finishBy); testedStory(story, finishBy);
}else{ } else {
this.finishStory(story,finishBy); this.finishStory(story, finishBy);
} }
} }
@ -1282,92 +1392,112 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return; return;
} }
//测试任务取消 //测试任务取消
if(cancelFlag&&type==TaskType.test){ if (cancelFlag && type == TaskType.test) {
List<ZtTask> develing = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> develing = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, TaskType.devel.getCode())); .eq(ZtTask::getType, TaskType.devel.getCode()));
if(!CollectionUtils.isEmpty(develing)){ if (!CollectionUtils.isEmpty(develing)) {
startStory(story); startStory(story);
return; return;
} }
List<ZtTask> testling = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> testling = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, TaskType.test.getCode())); .eq(ZtTask::getType, TaskType.test.getCode()));
if(!CollectionUtils.isEmpty(testling)){ if (!CollectionUtils.isEmpty(testling)) {
testingStory(story); testingStory(story);
return; return;
} }
List<ZtTask> doneList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> doneList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "done"))); .in(ZtTask::getStatus, Arrays.asList("done")));
if(CollectionUtils.isEmpty(doneList)){ if (CollectionUtils.isEmpty(doneList)) {
this.waitStory(story); this.waitStory(story);
return; return;
} }
List<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.eq(ZtTask::getType,TaskType.test.getCode()) .eq(ZtTask::getType, TaskType.test.getCode())
.in(ZtTask::getStatus, Arrays.asList( "done"))); .in(ZtTask::getStatus, Arrays.asList("done")));
if(!CollectionUtils.isEmpty(testedList)){ if (!CollectionUtils.isEmpty(testedList)) {
this.testedStory(story,finishBy); this.testedStory(story, finishBy);
return; return;
} }
List<ZtTask> develedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> develedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.eq(ZtTask::getType,TaskType.devel.getCode()) .eq(ZtTask::getType, TaskType.devel.getCode())
.in(ZtTask::getStatus, Arrays.asList( "done"))); .in(ZtTask::getStatus, Arrays.asList("done")));
if(!CollectionUtils.isEmpty(develedList)){ if (!CollectionUtils.isEmpty(develedList)) {
this.finishStory(story,finishBy); this.finishStory(story, finishBy);
return; return;
} }
return; return;
} }
if(type==TaskType.test){ if (type == TaskType.test) {
// 测试 // 测试
List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, type.getCode())); .eq(ZtTask::getType, type.getCode()));
List<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, TaskType.devel.getCode())); .eq(ZtTask::getType, TaskType.devel.getCode()));
if (CollectionUtils.isEmpty(develList) && CollectionUtils.isEmpty(testList)) {
if(CollectionUtils.isEmpty(develList)&&CollectionUtils.isEmpty(testList)){
long done = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) long done = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.eq(ZtTask::getType,type.getCode()) .eq(ZtTask::getType, type.getCode())
.in(ZtTask::getStatus, Arrays.asList("done"))); .in(ZtTask::getStatus, Arrays.asList("done")));
if(done<1){ if (done < 1) {
return; return;
} }
this.testedStory(story,finishBy); this.testedStory(story, finishBy);
}else{ } else {
if(CollectionUtils.isEmpty(develList)){ if (CollectionUtils.isEmpty(develList)) {
this.testingStory(story); this.testingStory(story);
}else if(!CollectionUtils.isEmpty(develList)){ } else if (!CollectionUtils.isEmpty(develList)) {
this.startStory(story); this.startStory(story);
}else if(!CollectionUtils.isEmpty(testList)){ } else if (!CollectionUtils.isEmpty(testList)) {
this.testingStory(story); this.testingStory(story);
} }
} }
}else if(type==TaskType.devel){ } else if (type == TaskType.devel) {
// 开发 // 开发
List<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType, type.getCode())); .eq(ZtTask::getType, type.getCode()));
if(!CollectionUtils.isEmpty(taskList)){ if (!CollectionUtils.isEmpty(taskList)) {
this.startStory(story); this.startStory(story);
}else{ } else {
long done = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) long done = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList("done"))); .in(ZtTask::getStatus, Arrays.asList("done")));
if(done<1){ if (done < 1) {
}else{ } else {
this.finishStory(story,finishBy); this.finishStory(story, finishBy);
} }
} }
} else {
//开发测试任务
long kfTaskCount = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause", "done", "reviewing"))
.in(ZtTask::getType, Arrays.asList("devel", "test")));
if (kfTaskCount > 0) {
return;
}
//其他类型任务完成
long otherWaitCount = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause", "reviewing"))
.notIn(ZtTask::getType, Arrays.asList("devel", "test")));
String srotyType=null;
if (otherWaitCount > 0) {
srotyType="backlog";
}else{
srotyType="ready";
}
List<Integer> executionId = this.getExecutionId(ztStory);
for (Integer execution : executionId) {
kanbanlaneService.changeStatus(execution, story, "story", srotyType);
}
} }
} }
@ -1382,7 +1512,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (ztStory == null) { if (ztStory == null) {
throw new BusinessException("未查询到数据-需求"); throw new BusinessException("未查询到数据-需求");
} }
if(ztStory.getStatus().equals("testing")){ if (ztStory.getStatus().equals("testing")) {
return; return;
} }
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
@ -1634,9 +1764,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
qo.setObjIds(ids); qo.setObjIds(ids);
// list=this.baseMapper.storyPageListByIds(ids); // list=this.baseMapper.storyPageListByIds(ids);
} }
if(productId!=null&&productId!=0){ if (productId != null && productId != 0) {
qo.setProductIds(Arrays.asList(productId)); qo.setProductIds(Arrays.asList(productId));
}else{ } else {
List<Integer> pids = this.projectService.authProductList(); List<Integer> pids = this.projectService.authProductList();
if (!CollectionUtils.isEmpty(pids)) { if (!CollectionUtils.isEmpty(pids)) {
@ -1650,13 +1780,12 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
qo.setKfz(1); qo.setKfz(1);
list = this.baseMapper.projectStoryPageList(qo); list = this.baseMapper.projectStoryPageList(qo);
}else{ } else {
page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
list = this.baseMapper.myStoryPageList(qo); list = this.baseMapper.myStoryPageList(qo);
} }
if (!CollectionUtils.isEmpty(list)) { if (!CollectionUtils.isEmpty(list)) {
Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list); Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list);
@ -1759,17 +1888,17 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ProductStoryStatus oldPStatus = getProductStatus(status); ProductStoryStatus oldPStatus = getProductStatus(status);
this.productService.productChangeStatus(ztStory.getProduct(), oldPStatus, ProductStoryStatus.GB); this.productService.productChangeStatus(ztStory.getProduct(), oldPStatus, ProductStoryStatus.GB);
} }
List<ZtProjectstory> execList = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()),ProjectTypeEnums.execution); List<ZtProjectstory> execList = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()), ProjectTypeEnums.execution);
if(!CollectionUtils.isEmpty(execList)){ if (!CollectionUtils.isEmpty(execList)) {
for (ZtProjectstory s:execList ) { for (ZtProjectstory s : execList) {
this.kanbanlaneService.changeStatus(s.getProject(),ztStory.getId(),"story","closed"); this.kanbanlaneService.changeStatus(s.getProject(), ztStory.getId(), "story", "closed");
} }
} }
this.closeTaskBug(ztStory.getId()); this.closeTaskBug(ztStory.getId());
if(ztStory.getUserStory()!=null&&ztStory.getUserStory()!=0){ if (ztStory.getUserStory() != null && ztStory.getUserStory() != 0) {
//研发需求关闭去验收用户需求 //研发需求关闭去验收用户需求
storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.YWC); storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(), UserStoryEnums.YWC);
// storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.CFM); // storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.CFM);
} }
} }
@ -1791,7 +1920,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
actionService.addAction(ActionType.XQ, ActionStatus.FP, ztStory.getId(), ztStory.getProduct() + "", null, null, actionService.addAction(ActionType.XQ, ActionStatus.FP, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo()); RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo());
storySendZpMessage(ztStory.getId(),oldAssignedTo,ztStory.getAssignedTo()); storySendZpMessage(ztStory.getId(), oldAssignedTo, ztStory.getAssignedTo());
} }
@ -1861,11 +1990,11 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
product.setReleases(product.getReleases() - 1); product.setReleases(product.getReleases() - 1);
this.productService.updateById(product); this.productService.updateById(product);
List<ZtProjectstory> pStory = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()), ProjectTypeEnums.execution); List<ZtProjectstory> pStory = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()), ProjectTypeEnums.execution);
if(CollectionUtils.isEmpty(pStory)){ if (CollectionUtils.isEmpty(pStory)) {
throw new BusinessException("当前未配置迭代无法验收"); throw new BusinessException("当前未配置迭代无法验收");
} }
for (ZtProjectstory s:pStory ) { for (ZtProjectstory s : pStory) {
this.kanbanlaneService.changeStatus(s.getProject(),s.getStory(),"story","verified"); this.kanbanlaneService.changeStatus(s.getProject(), s.getStory(), "story", "verified");
} }
} }
@ -1889,10 +2018,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (revieweResult == 1 && ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (revieweResult == 1 && ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.ysFeedback(ztStory.getFeedback()); this.storyFeedbackService.ysFeedback(ztStory.getFeedback());
} }
if(ztStory.getStatus().equals("finished")){ if (ztStory.getStatus().equals("finished")) {
//验收通过 //验收通过
storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.YWC); storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(), UserStoryEnums.YWC);
}else{ } else {
//验收不通过 发送微信通知 //验收不通过 发送微信通知
sendYsFalseToVx(ztStory); sendYsFalseToVx(ztStory);
} }
@ -1903,8 +2032,8 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
private void sendYsFalseToVx(ZtStory ztStory) { private void sendYsFalseToVx(ZtStory ztStory) {
List<ZtTeam> teamList = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getRoot, ztStory.getProduct()).eq(ZtTeam::getType, "product")); List<ZtTeam> teamList = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getRoot, ztStory.getProduct()).eq(ZtTeam::getType, "product"));
if(!CollectionUtils.isEmpty(teamList)){ if (!CollectionUtils.isEmpty(teamList)) {
storyYsFalseSendMessage(ztStory.getId(),teamList.stream().map(o->o.getAccount()).collect(Collectors.toList())); storyYsFalseSendMessage(ztStory.getId(), teamList.stream().map(o -> o.getAccount()).collect(Collectors.toList()));
} }
} }
@ -1920,7 +2049,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
BeanUtils.copyProperties(ztStory, d); BeanUtils.copyProperties(ztStory, d);
ZtRelease release = releaseService.getReleaseByStory(ztStory.getId()); ZtRelease release = releaseService.getReleaseByStory(ztStory.getId());
if(release!=null){ if (release != null) {
d.setReleaseId(release.getId()); d.setReleaseId(release.getId());
d.setReleaseName(release.getName()); d.setReleaseName(release.getName());
} }
@ -1946,9 +2075,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
} }
Integer feedback = ztStory.getFeedback(); Integer feedback = ztStory.getFeedback();
if(feedback!=null&&feedback!=0){ if (feedback != null && feedback != 0) {
ZtStoryFeedback ztStoryFeedback = this.storyFeedbackService.getById(feedback); ZtStoryFeedback ztStoryFeedback = this.storyFeedbackService.getById(feedback);
if(ztStoryFeedback!=null){ if (ztStoryFeedback != null) {
d.setFeedbackSpec(ztStoryFeedback.getSpec()); d.setFeedbackSpec(ztStoryFeedback.getSpec());
} }
} }
@ -1974,18 +2103,18 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
d.setReviewedbyName(b.toString()); d.setReviewedbyName(b.toString());
} }
List<ZtProjectstory> execStory = this.projectstoryService.projectListByStory(Arrays.asList(d.getId()),ProjectTypeEnums.execution); List<ZtProjectstory> execStory = this.projectstoryService.projectListByStory(Arrays.asList(d.getId()), ProjectTypeEnums.execution);
if(!CollectionUtils.isEmpty(execStory)){ if (!CollectionUtils.isEmpty(execStory)) {
List<ZtProject> ztProjects = this.projectService.listByIds(execStory.stream().map(o -> o.getProject()).collect(Collectors.toList())); List<ZtProject> ztProjects = this.projectService.listByIds(execStory.stream().map(o -> o.getProject()).collect(Collectors.toList()));
List<ZtProjectDTO> execInfoList = BeanCopyUtil.copyListProperties(ztProjects, ZtProjectDTO::new); List<ZtProjectDTO> execInfoList = BeanCopyUtil.copyListProperties(ztProjects, ZtProjectDTO::new);
for (ZtProjectDTO execInfo:execInfoList) { for (ZtProjectDTO execInfo : execInfoList) {
ZtUser ztUser = userMap.get(execInfo.getPm()); ZtUser ztUser = userMap.get(execInfo.getPm());
if(ztUser!=null){ if (ztUser != null) {
execInfo.setPmName(ztUser.getNickname()); execInfo.setPmName(ztUser.getNickname());
} }
ztUser = userMap.get(execInfo.getOpenedBy()); ztUser = userMap.get(execInfo.getOpenedBy());
if(ztUser!=null){ if (ztUser != null) {
execInfo.setOpenedByName(ztUser.getNickname()); execInfo.setOpenedByName(ztUser.getNickname());
} }
@ -2059,22 +2188,22 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
Integer parent = ztStoryUserDTO.getParent(); Integer parent = ztStoryUserDTO.getParent();
if(parent!=null&&parent!=0){ if (parent != null && parent != 0) {
ZtStoryUser ztStoryUser = this.storyUserService.getById(parent); ZtStoryUser ztStoryUser = this.storyUserService.getById(parent);
if(ztStoryUser!=null){ if (ztStoryUser != null) {
ztStoryUserDTO.setParentName(ztStoryUser.getTitle()); ztStoryUserDTO.setParentName(ztStoryUser.getTitle());
} }
} }
Integer product = ztStoryUserDTO.getProduct(); Integer product = ztStoryUserDTO.getProduct();
if(product!=null&&product!=0){ if (product != null && product != 0) {
ZtProduct ztProduct = this.productService.getById(product); ZtProduct ztProduct = this.productService.getById(product);
ztStoryUserDTO.setProductName(ztProduct.getName()); ztStoryUserDTO.setProductName(ztProduct.getName());
} }
Integer module = ztStoryUserDTO.getModule(); Integer module = ztStoryUserDTO.getModule();
if(module!=null&&module!=0){ if (module != null && module != 0) {
ZtModule ztModule = this.moduleService.getById(module); ZtModule ztModule = this.moduleService.getById(module);
@ -2084,22 +2213,22 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
List<ZtBug> bugs = this.bugService.list(new QueryWrapper<ZtBug>().lambda().eq(ZtBug::getTostory, d.getId())); List<ZtBug> bugs = this.bugService.list(new QueryWrapper<ZtBug>().lambda().eq(ZtBug::getTostory, d.getId()));
if(!CollectionUtils.isEmpty(bugs)){ if (!CollectionUtils.isEmpty(bugs)) {
List<ZtBugDTO> ztBugDTOS = BeanCopyUtil.copyListProperties(bugs, ZtBugDTO::new); List<ZtBugDTO> ztBugDTOS = BeanCopyUtil.copyListProperties(bugs, ZtBugDTO::new);
if(!CollectionUtils.isEmpty(ztBugDTOS)){ if (!CollectionUtils.isEmpty(ztBugDTOS)) {
for (ZtBugDTO bug:ztBugDTOS) { for (ZtBugDTO bug : ztBugDTOS) {
ztUser = userMap.get(bug.getOpenedby()); ztUser = userMap.get(bug.getOpenedby());
if(ztUser!=null){ if (ztUser != null) {
bug.setOpenedbyName(ztUser.getNickname()); bug.setOpenedbyName(ztUser.getNickname());
} }
ztUser = userMap.get(bug.getAssignedTo()); ztUser = userMap.get(bug.getAssignedTo());
if(ztUser!=null){ if (ztUser != null) {
bug.setAssignedToName(ztUser.getNickname()); bug.setAssignedToName(ztUser.getNickname());
} }
ztUser = userMap.get(bug.getYsUser()); ztUser = userMap.get(bug.getYsUser());
if(ztUser!=null){ if (ztUser != null) {
bug.setYsUserName(ztUser.getNickname()); bug.setYsUserName(ztUser.getNickname());
} }
} }
@ -2107,7 +2236,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
d.setBugList(ztBugDTOS); d.setBugList(ztBugDTOS);
} }
List<ZtStoryspec> specList = this.storyspecService.list(new QueryWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory, d.getId())); List<ZtStoryspec> specList = this.storyspecService.list(new QueryWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory, d.getId()));
if(!CollectionUtils.isEmpty(specList)){ if (!CollectionUtils.isEmpty(specList)) {
ZtStoryspec ztStoryspec = specList.get(0); ZtStoryspec ztStoryspec = specList.get(0);
d.setSpec(ztStoryspec.getSpec()); d.setSpec(ztStoryspec.getSpec());
d.setVerify(ztStoryspec.getVerify()); d.setVerify(ztStoryspec.getVerify());
@ -2115,19 +2244,19 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ZtStoryCase ztStoryCase = this.storyCaseService.getOne(new QueryWrapper<ZtStoryCase>().lambda().eq(ZtStoryCase::getStory, d.getId())); ZtStoryCase ztStoryCase = this.storyCaseService.getOne(new QueryWrapper<ZtStoryCase>().lambda().eq(ZtStoryCase::getStory, d.getId()));
if(ztStoryCase!=null){ if (ztStoryCase != null) {
ZtStoryCaseDTO ztStoryCaseDTO=new ZtStoryCaseDTO(); ZtStoryCaseDTO ztStoryCaseDTO = new ZtStoryCaseDTO();
BeanUtils.copyProperties(ztStoryCase,ztStoryCaseDTO); BeanUtils.copyProperties(ztStoryCase, ztStoryCaseDTO);
ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser()); ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser());
if(ztUser!=null){ if (ztUser != null) {
ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname()); ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname());
} }
ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser()); ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser());
if(ztUser!=null){ if (ztUser != null) {
ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname()); ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname());
} }
ztUser = userMap.get(ztStoryCaseDTO.getPsUser()); ztUser = userMap.get(ztStoryCaseDTO.getPsUser());
if(ztUser!=null){ if (ztUser != null) {
ztStoryCaseDTO.setPsUserName(ztUser.getNickname()); ztStoryCaseDTO.setPsUserName(ztUser.getNickname());
} }
d.setCaseInfo(ztStoryCaseDTO); d.setCaseInfo(ztStoryCaseDTO);

View File

@ -21,6 +21,7 @@ import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.*; import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil; import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.BeanCopyUtilCallBack;
import com.sa.zentao.utils.SendEmail; import com.sa.zentao.utils.SendEmail;
import com.sa.zentao.utils.VxMessageUtils; import com.sa.zentao.utils.VxMessageUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -244,6 +245,35 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
} }
@Override
public Map<String, List<ZtStoryUserDTO>> getKanban(Integer productId) {
List<ZtStoryUser> ztStoryUsers = this.baseMapper.selectList(new QueryWrapper<ZtStoryUser>().lambda().eq(ZtStoryUser::getProduct, productId).orderByDesc(ZtStoryUser::getId));
Map<String, List<ZtStoryUserDTO>> map = new HashMap<>();
Map<String, ZtUser> stringZtUserMap = this.userService.userMapByIds(ztStoryUsers.stream().map(o -> o.getOpenedby()).collect(Collectors.toList()));
List<ZtStoryUserDTO> ztStoryUserDTOS = BeanCopyUtil.copyListProperties(ztStoryUsers, ZtStoryUserDTO::new, new BeanCopyUtilCallBack<ZtStoryUser, ZtStoryUserDTO>() {
@Override
public void callBack(ZtStoryUser t, ZtStoryUserDTO s) {
ZtUser ztUser = stringZtUserMap.get(t.getOpenedby());
if(ztUser!=null){
s.setOpenedbyName(ztUser.getNickname());
}
}
});
map.put("active",ztStoryUserDTOS.stream().filter(o->"active".equals(o.getStatus())).collect(Collectors.toList()));
map.put("unconfirmed",ztStoryUserDTOS.stream().filter(o->"unconfirmed".equals(o.getStatus())).collect(Collectors.toList()));
map.put("waitcommunicate",ztStoryUserDTOS.stream().filter(o->"waitcommunicate".equals(o.getStatus())).collect(Collectors.toList()));
map.put("waitdesign",ztStoryUserDTOS.stream().filter(o->"waitdesign".equals(o.getStatus())).collect(Collectors.toList()));
map.put("designdoing",ztStoryUserDTOS.stream().filter(o->"designdoing".equals(o.getStatus())).collect(Collectors.toList()));
map.put("designdone",ztStoryUserDTOS.stream().filter(o->"designdone".equals(o.getStatus())).collect(Collectors.toList()));
map.put("storyunconfirmed",ztStoryUserDTOS.stream().filter(o->"storyunconfirmed".equals(o.getStatus())).collect(Collectors.toList()));
map.put("confirmed",ztStoryUserDTOS.stream().filter(o->"confirmed".equals(o.getStatus())).collect(Collectors.toList()));
return Map.of();
}
@Override @Override
public PageInfo<ZtStoryUserDTO> pageList(StoryQo qo) { public PageInfo<ZtStoryUserDTO> pageList(StoryQo qo) {

View File

@ -296,16 +296,9 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
ztStoryUserTask.setLastEditedDate(new Date()); ztStoryUserTask.setLastEditedDate(new Date());
ztStoryUserTask.setFinishedby(RiskUserThreadLocal.get().getName()); ztStoryUserTask.setFinishedby(RiskUserThreadLocal.get().getName());
ztStoryUserTask.setFinisheddate(new Date()); ztStoryUserTask.setFinisheddate(new Date());
ztStoryUserTask.setDeliverContent(dto.getDeliverContent());
this.baseMapper.updateById(ztStoryUserTask); this.baseMapper.updateById(ztStoryUserTask);
// if("improve".equals(ztStoryUserTask.getType())){
// //需要会议
// if ((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==2)&&(dto.getNeedDesign()!=null&&dto.getNeedDesign()==1)){
// //用户状态待沟通 需要详细设计
// this.add(dto.getInfo());
// }
// }
ZtEffort e=new ZtEffort(); ZtEffort e=new ZtEffort();
e.setObjectid(ztStoryUserTask.getId()); e.setObjectid(ztStoryUserTask.getId());
@ -316,10 +309,18 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
e.setDate(new Date()); e.setDate(new Date());
effortService.save(e); effortService.save(e);
if("improve".equals(ztStoryUserTask.getType())&&StringUtils.isNotBlank(dto.getDeliverContent())){
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.MQXU, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),dto.getDeliverContent(), null);
actionService.addAction(ActionType.USERXQ, ActionStatus.MQXU, ztStoryUserTask.getUserStoryId()
, ztStoryUserTask.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),dto.getDeliverContent(), null);
}
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.WC, ztStoryUserTask.getId() actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.WC, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(), null, null, , ztStoryUserTask.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),dto.getDesc(), null); RiskUserThreadLocal.get().getName(),dto.getDesc(), null);
} }
@Override @Override

View File

@ -912,23 +912,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
project.setStatus("doing"); project.setStatus("doing");
this.ztProjectService.updateById(project); this.ztProjectService.updateById(project);
} }
// if (dto.getFinishedFlag() == 1) {
// String type = ztTask.getType();
// if (ztTask.getStory() != null && ztTask.getStory() != 0) {
//// if ("test".equals(type)) {
//// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
//// } else if ("devel".equals(type)) {
//// //开发
//// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
//// }
// this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(type), false);
// }
// }else{
//
// }
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false); this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false);
} }
@Override @Override
@ -991,12 +975,6 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
String type = ztTask.getType(); String type = ztTask.getType();
if (ztTask.getStory() != null && ztTask.getStory() != 0) { if (ztTask.getStory() != null && ztTask.getStory() != 0) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(), finishBy, TaskType.transferType(type), false); this.storyService.taskFinishChangeStatus(ztTask.getStory(), finishBy, TaskType.transferType(type), false);
// if ("test".equals(type)) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.test);
// } else if ("devel".equals(type)) {
// //开发
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.devel);
// }
} }
if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) { if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) {
this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark()); this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark());

View File

@ -31,7 +31,8 @@ spring:
file: file:
baseUrl: http://192.168.3.200:8013 # baseUrl: http://192.168.3.200:8013
baseUrl: https://itsm.sino-assist.com
meeting: /data/buildzentao/meeting.docx meeting: /data/buildzentao/meeting.docx
#vx: #vx:

View File

@ -40,6 +40,7 @@ spring:
file: file:
baseUrl: http://192.168.1.161:8085 baseUrl: http://192.168.1.161:8085
# baseUrl: http://127.0.0.1:8085
meeting: /data/buildzentao/meeting.docx meeting: /data/buildzentao/meeting.docx
#spring: #spring:

View File

@ -37,8 +37,10 @@ mybatis:
typeEnumsPackage: com.sa.zentao.enums typeEnumsPackage: com.sa.zentao.enums
file: file:
path: path:
windows: D:\files windows: D:\files
linux: /files linux: /files
mybatis-plus:
global-config:
enable-sql-runner: true

View File

@ -1209,4 +1209,68 @@
</if> </if>
</select> </select>
<select id="searchBug" resultType="com.sa.zentao.dao.SearchDTO">
SELECT id,title name, steps spec,5 type,openedDate from zt_bug WHERE 1=1 and (title like concat('%', #{keyword}, '%') or steps like concat('%', #{keyword}, '%') ) order by id desc
</select>
<select id="searchTask" resultType="com.sa.zentao.dao.SearchDTO">
SELECT id,name name, `desc` spec,3 type,openedDate from zt_task WHERE 1=1 and (name like concat('%', #{keyword}, '%') or `desc` like concat('%', #{keyword}, '%') ) order by id desc
</select>
<select id="searchStory" resultType="com.sa.zentao.dao.SearchDTO">
SELECT id,st.title name, spc.spec spec,spc.verify verify,2 type,openedDate from zt_story st,zt_storyspec spc WHERE 1=1 and st.id=spc.story and (spc.spec like concat('%', #{keyword}, '%') or spc.verify like concat('%', #{keyword}, '%') ) order by id desc
</select>
<select id="searchFeedback" resultType="com.sa.zentao.dao.SearchDTO">
SELECT id,remark name, spec spec,4 type,opened_date from zt_story_feedback WHERE 1=1 and (remark like concat('%', #{keyword}, '%') or spec like concat('%', #{keyword}, '%') ) order by id desc
</select>
<select id="searchUserStory" resultType="com.sa.zentao.dao.SearchDTO">
SELECT id,st.title name, spc.spec spec,spc.verify verify,1 type,openedDate from zt_story_user st,zt_story_userspec spc WHERE 1=1 and st.id=spc.story and (spc.spec like concat('%', #{keyword}, '%') or spc.verify like concat('%', #{keyword}, '%') ) order by id desc
</select>
<select id="searchAll" resultType="com.sa.zentao.dao.SearchDTO">
(SELECT id,st.title name, spc.spec spec,spc.verify verify,2 type,openedDate from zt_story st left join zt_storyspec spc on st.id=spc.story
WHERE 1=1 and (spc.spec like concat('%', #{keyword}, '%') or spc.verify like concat('%', #{keyword}, '%') or st.title like concat('%', #{keyword}, '%') )
and st.product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
order by id desc )
UNION
(SELECT id,title name, steps spec,'' verify,5 type,openedDate from zt_bug
WHERE 1=1 and (title like concat('%', #{keyword}, '%') or steps like concat('%', #{keyword}, '%') )
and product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
order by id desc )
UNION
(SELECT id,remark name, spec spec,'' verify,4 type,opened_date from zt_story_feedback
WHERE 1=1 and (remark like concat('%', #{keyword}, '%') or spec like concat('%', #{keyword}, '%') )
and product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
order by id desc )
UNION
(SELECT id,name name, `desc` spec,'' verify,3 type,openedDate from zt_task
WHERE 1=1 and (name like concat('%', #{keyword}, '%') or `desc` like concat('%', #{keyword}, '%') )
and product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
order by id desc )
UNION
(SELECT id,st.title name, spc.spec spec,spc.verify verify,1 type,openedDate from zt_story_user st left join zt_story_userspec spc on st.id=spc.story
WHERE 1=1
and product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
and (spc.spec like concat('%', #{keyword}, '%') or spc.verify like concat('%', #{keyword}, '%') or st.title like concat('%', #{keyword}, '%') ) order by id desc )
</select>
</mapper> </mapper>