Compare commits

...

5 Commits

Author SHA1 Message Date
f9a7954486 迭代多需求 2025-01-08 14:27:15 +08:00
5b99796f76 Merge branch 'main' into storymuchexec_250108
# Conflicts:
#	pom.xml
2025-01-08 10:54:35 +08:00
777823bd52 多数据源版本 2025-01-08 10:52:37 +08:00
517bddb5d7 mapper 2025-01-08 10:47:25 +08:00
74fa006bf7 发布等 2025-01-08 10:45:11 +08:00
17 changed files with 600 additions and 268 deletions

28
pom.xml
View File

@ -25,7 +25,11 @@
<version>1.5.2</version> <version>1.5.2</version>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
@ -102,10 +106,28 @@
<version>3.5.5</version> <version>3.5.5</version>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-spring-boot3-starter</artifactId>-->
<!-- <version>3.5.5</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>-->
<!-- <version>4.2.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-spring-boot3-starter</artifactId>-->
<!-- <version>3.5.5</version>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId> <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>3.5.5</version> <version>4.2.0</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -3,6 +3,7 @@ package com.sa.zentao.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.BusinessException;
import com.sa.zentao.dao.Result; import com.sa.zentao.dao.Result;
import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.dao.ZtProjectDTO;
import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryDTO;
@ -146,7 +147,7 @@ public class ZtStoryController {
//获取需求 根据id //获取需求 根据id
@RequestMapping(value = "/getStoryById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @RequestMapping(value = "/getStoryById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getStoryById(@RequestBody ZtStoryDTO dto){ public Result getStoryById(@RequestBody ZtStoryDTO dto){
ZtStoryDTO storyDTO = ztStoryService.getStoryById(dto.getId()); ZtStoryDTO storyDTO = ztStoryService.getStoryById(dto.getId(),dto.getExecution());
return Result.success(storyDTO); return Result.success(storyDTO);
} }
@ -159,8 +160,8 @@ public class ZtStoryController {
//切换执行 //切换执行
@RequestMapping(value = "/changeExecution", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @RequestMapping(value = "/changeExecution", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result changeExecution(@RequestBody ZtStoryDTO dto){ public Result changeExecution(@RequestBody ZtStoryDTO dto){
ztStoryService.changeExecution(dto); // ztStoryService.changeExecution(dto);
return Result.success(); throw new BusinessException("弃用");
} }
//切换指派 //切换指派
@RequestMapping(value = "/changeAssignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @RequestMapping(value = "/changeAssignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")

View File

@ -233,6 +233,8 @@ public class ZtStoryDTO implements Serializable {
private Integer execution; private Integer execution;
private List<Integer> executions;
private Boolean psFlag; private Boolean psFlag;
private String executionName; private String executionName;

View File

@ -24,7 +24,6 @@ public class ZtProjectstory implements Serializable {
private Integer product; private Integer product;
private Integer execution;
private Integer branch; private Integer branch;
@ -34,6 +33,9 @@ public class ZtProjectstory implements Serializable {
@TableField("`order`") @TableField("`order`")
private Integer order; private Integer order;
//execution project
@TableField("`type`")
private String type;
// private Integer execution;
} }

View File

@ -0,0 +1,41 @@
package com.sa.zentao.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
public enum ProjectTypeEnums {
//产品集
program(1,"program"),
//项目
project(2, "project"),
//执行
execution(3, "execution"),
;
@EnumValue
private int code;
private String value;
private ProjectTypeEnums(int code, String value) {
this.code = code;
this.value = value;
}
public int getCode() {
return this.code;
}
public String getValue() {
return this.value;
}
public static ProjectTypeEnums transferType(Integer code){
ProjectTypeEnums[] values = values();
for (ProjectTypeEnums v:values ) {
if(v.code==code){
return v;
}
}
return null;
}
}

View File

@ -0,0 +1,16 @@
package com.sa.zentao.mapper;
import com.sa.zentao.entity.ZtNotice;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author gqb
* @since 2024-12-26
*/
public interface ZtNoticeMapper extends BaseMapper<ZtNotice> {
}

View File

@ -0,0 +1,24 @@
package com.sa.zentao.mapper;
import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.entity.ZtReleaseDetails;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sa.zentao.qo.ZtReleaseQo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author gqb
* @since 2024-12-26
*/
public interface ZtReleaseDetailsMapper extends BaseMapper<ZtReleaseDetails> {
List<ZtStoryDTO> releasePageList(@Param("qo") ZtReleaseQo qo);
List<ZtStoryDTO> storyPageList(@Param("qo") ZtReleaseQo qo);
}

View File

@ -0,0 +1,25 @@
package com.sa.zentao.mapper;
import com.sa.zentao.dao.ZtReleaseDTO;
import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.entity.ZtRelease;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sa.zentao.qo.ZtReleaseQo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author gqb
* @since 2024-12-26
*/
public interface ZtReleaseMapper extends BaseMapper<ZtRelease> {
List<ZtReleaseDTO> pageList(@Param("qo") ZtReleaseQo qo);
List<ZtStoryDTO> storyPageList(@Param("qo")ZtReleaseQo qo,@Param("ids") List<Integer> ids);
}

View File

@ -101,5 +101,5 @@ public interface IZtProjectService extends IService<ZtProject> {
List<ZtProject> execListByProject(Integer project); List<ZtProject> execListByProject(Integer project);
void removeExecutionStory(Integer id); void removeExecutionStory(Integer id,List<Integer> execList);
} }

View File

@ -2,6 +2,7 @@ package com.sa.zentao.service;
import com.sa.zentao.entity.ZtProjectstory; import com.sa.zentao.entity.ZtProjectstory;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.enums.ProjectTypeEnums;
import java.util.List; import java.util.List;
@ -16,4 +17,10 @@ import java.util.List;
public interface IZtProjectstoryService extends IService<ZtProjectstory> { public interface IZtProjectstoryService extends IService<ZtProjectstory> {
List<ZtProjectstory> storyListPrd(Integer id); List<ZtProjectstory> storyListPrd(Integer id);
//根据 项目 迭代 查找需求
List<ZtProjectstory> projectStoryList(List<Integer> projectIds, ProjectTypeEnums type);
//根据需求查找项目 或者迭代
List<ZtProjectstory> projectListByStory(List<Integer> storyIds, ProjectTypeEnums type);
//一个项目只能关联一个story
ZtProjectstory getProject(Integer storyId);
} }

View File

@ -64,7 +64,7 @@ public interface IZtStoryService extends IService<ZtStory> {
void storyYs(ZtStoryDTO dto); void storyYs(ZtStoryDTO dto);
ZtStoryDTO getStoryById(Integer id); ZtStoryDTO getStoryById(Integer id,Integer execution);
List<ZtProject> execListByProject(ZtStoryDTO dto); List<ZtProject> execListByProject(ZtStoryDTO dto);
@ -80,5 +80,5 @@ public interface IZtStoryService extends IService<ZtStory> {
List<ZtStoryDTO> myStoryList(ZtProjectQo qo); List<ZtStoryDTO> myStoryList(ZtProjectQo qo);
public Map<Integer, ZtProject> getExecutionMapByStory(List<ZtStoryDTO> list); Map<Integer,List<ZtProject>> getExecutionMapByStory(List<ZtStoryDTO> list);
} }

View File

@ -15,6 +15,7 @@ import com.sa.zentao.conf.LoginRiskUser;
import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*; import com.sa.zentao.dao.*;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ProjectTypeEnums;
import com.sa.zentao.enums.TaskStatus; import com.sa.zentao.enums.TaskStatus;
import com.sa.zentao.enums.TaskType; import com.sa.zentao.enums.TaskType;
import com.sa.zentao.enums.UserType; import com.sa.zentao.enums.UserType;
@ -655,8 +656,8 @@ public class IZtCountService {
List<ZtProjectstory> storyList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda() List<ZtProjectstory> storyList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.in(ZtProjectstory::getExecution, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList())) .in(ZtProjectstory::getProject, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))
.in(ZtProjectstory::getStory,storyIds) .in(ZtProjectstory::getStory,storyIds).eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
); );
List<ZtStory> ztStories = CollectionUtils.isEmpty(storyList)?new ArrayList<>():this.storyService.listByIds(storyList.stream().map(o -> o.getStory()).collect(Collectors.toList())); List<ZtStory> ztStories = CollectionUtils.isEmpty(storyList)?new ArrayList<>():this.storyService.listByIds(storyList.stream().map(o -> o.getStory()).collect(Collectors.toList()));

View File

@ -12,6 +12,7 @@ import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionStatus;
import com.sa.zentao.enums.ActionType; import com.sa.zentao.enums.ActionType;
import com.sa.zentao.enums.ProjectTypeEnums;
import com.sa.zentao.enums.UserType; import com.sa.zentao.enums.UserType;
import com.sa.zentao.mapper.ZtProjectMapper; import com.sa.zentao.mapper.ZtProjectMapper;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
@ -175,7 +176,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
//执行 要加看板 //执行 要加看板
if("sprint".equalsIgnoreCase(ztProject.getType())){ if("sprint".equalsIgnoreCase(ztProject.getType())){
//执行手动加 关联产品 //执行手动加 关联产品
List<Integer> projectList = dto.getProjectList(); List<Integer> projectList = new ArrayList<>(Arrays.asList(dto.getProject()));
List<ZtExecutionproject> saveList=new ArrayList(); List<ZtExecutionproject> saveList=new ArrayList();
for (Integer pId :projectList) { for (Integer pId :projectList) {
ZtExecutionproject p=new ZtExecutionproject(); ZtExecutionproject p=new ZtExecutionproject();
@ -184,15 +185,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
saveList.add(p); saveList.add(p);
} }
this.executionprojectService.saveBatch(saveList); this.executionprojectService.saveBatch(saveList);
// ZtProjectproduct projectproduct = this.projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda()
// .eq(ZtProjectproduct::getProject, ztProject.getParent()));
// ZtProjectproduct p=new ZtProjectproduct();
// p.setProject(ztProject.getId());
// p.setProduct(projectproduct.getProduct());
// this.projectproductService.save(p);
// addKanbanLane 执行 三行
//addColumn 几十列
int index=5; int index=5;
@ -795,13 +788,12 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
Integer excludeId = dto.getExcludeId(); Integer excludeId = dto.getExcludeId();
ZtProject ztProject = this.baseMapper.selectById(excludeId);
List<ZtProjectstory> syncStoryList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>() List<ZtProjectstory> syncStoryList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>()
.lambda().ne(ZtProjectstory::getExecution, 0) .lambda().ne(ZtProjectstory::getProject, excludeId)
.in(ZtProjectstory::getStory, storyIds) .in(ZtProjectstory::getStory, storyIds)
); );
if(!CollectionUtils.isEmpty(syncStoryList)){ if(!CollectionUtils.isEmpty(syncStoryList)){
throw new BusinessException("当前已关联请刷新"); throw new BusinessException("当前已关联请刷新");
} }
@ -810,7 +802,8 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
for (Integer sId:storyIds) { for (Integer sId:storyIds) {
ZtProjectstory ztProjectstory = new ZtProjectstory(); ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setStory(sId); ztProjectstory.setStory(sId);
ztProjectstory.setExecution(excludeId); ztProjectstory.setProject(excludeId);
ztProjectstory.setType(ProjectTypeEnums.execution.getValue());
saveList.add(ztProjectstory); saveList.add(ztProjectstory);
order+=5; order+=5;
} }
@ -1237,17 +1230,25 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
} }
@Override @Override
public void removeExecutionStory(Integer id) { @Transactional
public void removeExecutionStory(Integer storyId,List<Integer> execList) {
List<ZtProjectstory> list = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
.in(ZtProjectstory::getProject, execList)
.eq(ZtProjectstory::getStory, storyId)
);
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getStory, id).ne(ZtProjectstory::getExecution, 0));
if(!CollectionUtils.isEmpty(list)){ if(!CollectionUtils.isEmpty(list)){
for (ZtProjectstory d:list) {
//删除迭代
this.projectstoryService.remove(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getStory,storyId).eq(ZtProjectstory::getProject,d.getProject()));
//删除看板
this.kanbanlaneService.removeExecutionStory(d.getProject(),storyId);
}
//删除迭代
this.projectstoryService.remove(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getStory,id).ne(ZtProjectstory::getExecution,0));
//删除看板
this.kanbanlaneService.removeExecutionStory(list.get(0).getExecution(),id);
} }
} }

View File

@ -1,11 +1,15 @@
package com.sa.zentao.service.impl; package com.sa.zentao.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sa.zentao.entity.ZtProjectstory; import com.sa.zentao.entity.ZtProjectstory;
import com.sa.zentao.enums.ProjectTypeEnums;
import com.sa.zentao.mapper.ZtProjectstoryMapper; import com.sa.zentao.mapper.ZtProjectstoryMapper;
import com.sa.zentao.service.IZtProjectstoryService; import com.sa.zentao.service.IZtProjectstoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -23,4 +27,33 @@ public class ZtProjectstoryServiceImpl extends ServiceImpl<ZtProjectstoryMapper,
public List<ZtProjectstory> storyListPrd(Integer id) { public List<ZtProjectstory> storyListPrd(Integer id) {
return this.baseMapper.storyListPrd(id); return this.baseMapper.storyListPrd(id);
} }
@Override
public List<ZtProjectstory> projectStoryList(List<Integer> projectIds, ProjectTypeEnums type) {
if(CollectionUtils.isEmpty(projectIds)){
return new ArrayList<>();
}
List<ZtProjectstory> ztProjectstories = this.baseMapper.selectList(new QueryWrapper<ZtProjectstory>().lambda().in(ZtProjectstory::getProject, projectIds)
.eq(ZtProjectstory::getType, type.getValue())
);
return ztProjectstories;
}
@Override
public List<ZtProjectstory> projectListByStory(List<Integer> storyIds, ProjectTypeEnums type) {
if(CollectionUtils.isEmpty(storyIds)){
return new ArrayList<>();
}
List<ZtProjectstory> ztProjectstories = this.baseMapper.selectList(new QueryWrapper<ZtProjectstory>().lambda().in(ZtProjectstory::getStory, storyIds)
.eq(ZtProjectstory::getType, type.getValue())
);
return ztProjectstories;
}
@Override
public ZtProjectstory getProject(Integer storyId) {
return this.baseMapper.selectOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory,storyId).eq(ZtProjectstory::getType,ProjectTypeEnums.project.getValue()));
}
} }

View File

@ -8,6 +8,7 @@ import com.github.pagehelper.PageInfo;
import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*; import com.sa.zentao.dao.*;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ProjectTypeEnums;
import com.sa.zentao.enums.StoryStageEnums; import com.sa.zentao.enums.StoryStageEnums;
import com.sa.zentao.mapper.ZtReleaseMapper; import com.sa.zentao.mapper.ZtReleaseMapper;
import com.sa.zentao.qo.ZtReleaseQo; import com.sa.zentao.qo.ZtReleaseQo;
@ -64,7 +65,9 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
List<String> execIds = new ArrayList<String>(Arrays.asList(execStr.split(","))); List<String> execIds = new ArrayList<String>(Arrays.asList(execStr.split(",")));
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda() List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.in(ZtProjectstory::getExecution, execIds)); .in(ZtProjectstory::getProject, execIds)
.eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
);
if(!CollectionUtils.isEmpty(list)){ if(!CollectionUtils.isEmpty(list)){
List<ZtStory> sList = this.storyService.list(new QueryWrapper<ZtStory>() List<ZtStory> sList = this.storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getStatus, "active") .lambda().eq(ZtStory::getStatus, "active")
@ -291,7 +294,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
Map<Integer, ZtProject> executionMapByStory = this.storyService.getExecutionMapByStory(list); // Map<Integer, List<ZtProject>> executionMapByStory = this.storyService.getExecutionMapByStory(list);
for (ZtStoryDTO d : list) { for (ZtStoryDTO d : list) {
@ -305,11 +308,11 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
if(ztUser!=null){ if(ztUser!=null){
d.setOpenedbyName(ztUser.getNickname()); d.setOpenedbyName(ztUser.getNickname());
} }
ZtProject ztProject = executionMapByStory.get(d.getId()); // List<ZtProject> ztProject = executionMapByStory.get(d.getId());
if(ztProject!=null){ // if(ztProject!=null){
d.setExecution(ztProject.getId()); // d.setExecution(ztProject.getId());
d.setExecutionName(ztProject.getName()); // d.setExecutionName(ztProject.getName());
} // }
} }
return new PageInfo<ZtStoryDTO>(list); return new PageInfo<ZtStoryDTO>(list);
} }
@ -326,13 +329,13 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
return new PageInfo<ZtStoryDTO>(); return new PageInfo<ZtStoryDTO>();
} }
//迭代查找所有需求 //迭代查找所有需求
List<ZtProjectstory> pStorys = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().in(ZtProjectstory::getExecution, List<ZtProjectstory> execStorys = projectstoryService.projectStoryList(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()),ProjectTypeEnums.execution);
execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())));
if(CollectionUtils.isEmpty(pStorys)){ if(CollectionUtils.isEmpty(execStorys)){
return new PageInfo<ZtStoryDTO>(); return new PageInfo<ZtStoryDTO>();
} }
//过滤掉已关联的迭代需求 //过滤掉已关联的迭代需求
List<Integer> storyIdList = pStorys.stream().map(o -> o.getStory()).collect(Collectors.toList()); List<Integer> storyIdList = execStorys.stream().map(o -> o.getStory()).collect(Collectors.toList());
List<ZtRelease> ztReleases = this.baseMapper.selectList(new QueryWrapper<ZtRelease>().lambda().eq(ZtRelease::getProject, project)); List<ZtRelease> ztReleases = this.baseMapper.selectList(new QueryWrapper<ZtRelease>().lambda().eq(ZtRelease::getProject, project));
@ -343,7 +346,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
if(!CollectionUtils.isEmpty(list)){ if(!CollectionUtils.isEmpty(list)){
List<Integer> fIds = list.stream().map(o -> o.getObjectId()).collect(Collectors.toList()); List<Integer> fIds = list.stream().map(o -> o.getObjectId()).collect(Collectors.toList());
Iterator<ZtProjectstory> iterator = pStorys.iterator(); Iterator<ZtProjectstory> iterator = execStorys.iterator();
while (iterator.hasNext()){ while (iterator.hasNext()){
ZtProjectstory next = iterator.next(); ZtProjectstory next = iterator.next();
if(fIds.contains(next.getStory())){ if(fIds.contains(next.getStory())){
@ -351,7 +354,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
} }
} }
} }
qo.setStoryList(pStorys.stream().map(o->o.getStory()).collect(Collectors.toList())); qo.setStoryList(execStorys.stream().map(o->o.getStory()).collect(Collectors.toList()));
Page<ZtReleaseDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); Page<ZtReleaseDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
List<ZtStoryDTO> storyList = this.releaseDetailsService.storyPageList(qo); List<ZtStoryDTO> storyList = this.releaseDetailsService.storyPageList(qo);
@ -359,7 +362,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
Map<Integer, ZtProject> executionMapByStory = this.storyService.getExecutionMapByStory(storyList); // Map<Integer, ZtProject> executionMapByStory = this.storyService.getExecutionMapByStory(storyList);
for (ZtStoryDTO d : storyList) { for (ZtStoryDTO d : storyList) {
@ -372,11 +375,11 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
if(ztUser!=null){ if(ztUser!=null){
d.setOpenedbyName(ztUser.getNickname()); d.setOpenedbyName(ztUser.getNickname());
} }
ZtProject ztProject = executionMapByStory.get(d.getId()); // ZtProject ztProject = executionMapByStory.get(d.getId());
if(ztProject!=null){ // if(ztProject!=null){
d.setExecution(ztProject.getId()); // d.setExecution(ztProject.getId());
d.setExecutionName(ztProject.getName()); // d.setExecutionName(ztProject.getName());
} // }
} }
return new PageInfo<ZtStoryDTO>(storyList); return new PageInfo<ZtStoryDTO>(storyList);
} }

View File

@ -109,7 +109,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list); Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list);
Map<Integer, ZtProject> executionMapByStory = getExecutionMapByStory(list); Map<Integer, List<ZtProject>> executionMapByStory = getExecutionMapByStory(list);
for (ZtStoryDTO d : list) { for (ZtStoryDTO d : list) {
@ -124,10 +124,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if(ztUser!=null){ if(ztUser!=null){
d.setOpenedbyName(ztUser.getNickname()); d.setOpenedbyName(ztUser.getNickname());
} }
ZtProject ztProject = executionMapByStory.get(d.getId()); List<ZtProject> ztProjectList = executionMapByStory.get(d.getId());
if(ztProject!=null){ if(!CollectionUtils.isEmpty(ztProjectList)){
d.setExecution(ztProject.getId()); // d.setExecution(ztProject.getId());
d.setExecutionName(ztProject.getName()); d.setExecutionName(ztProjectList.stream().map(o->o.getName()).collect(Collectors.joining(",")));
} }
} }
} }
@ -266,47 +266,55 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
this.projectstoryService.save(ztProjectstory); this.projectstoryService.save(ztProjectstory);
} }
// 1.如果是产品 那么关联 项目 执行 2.如果是项目 关联执行 List<Integer> executions = dto.getExecutions();
if(dto.getExecution()!=null&&dto.getExecution()!=0){ if(!CollectionUtils.isEmpty(executions)){
List<ZtProjectstory> syncList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, s.getId()) // this.projectproductService.getOne(new QueryWrapper<>().lambda().eq());
.eq(ZtProjectstory::getExecution, dto.getExecution())); //拿执行的项目id
if(CollectionUtils.isEmpty(syncList)){ // this.executionprojectService.getOne(new QueryWrapper<ZtExecutionproject>().lambda().eq())
if (s.getProduct() != null&&s.getProduct()!=0) { this.executionBindStory(s,executions);
List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
.eq(ZtExecutionproject::getExecution, dto.getExecution()));
if(CollectionUtils.isEmpty(execlist)){
List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>()
.lambda().eq(ZtProjectproduct::getProduct, s.getProduct()));
ZtProjectproduct ztProjectproduct = list.get(0);
ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(1);
ztProjectstory.setStory(s.getId());
ztProjectstory.setProject(ztProjectproduct.getProject());
this.projectstoryService.save(ztProjectstory);
//添加执行
}else{
ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(1);
ztProjectstory.setStory(s.getId());
ztProjectstory.setProject(execlist.get(0).getProject());
this.projectstoryService.save(ztProjectstory);
}
}
}
ZtProjectDTO d=new ZtProjectDTO();
d.setExcludeId(dto.getExecution());
d.setStoryIds(new ArrayList<>(){{add(s.getId());}});
projectService.executionSyncStory(d);
} }
// 1.如果是产品 那么关联 项目 执行 2.如果是项目 关联执行
// if(dto.getExecution()!=null&&dto.getExecution()!=0){
// List<ZtProjectstory> syncList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, s.getId())
// .eq(ZtProjectstory::getExecution, dto.getExecution()));
// if(CollectionUtils.isEmpty(syncList)){
// if (s.getProduct() != null&&s.getProduct()!=0) {
//
// List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
// .eq(ZtExecutionproject::getExecution, dto.getExecution()));
// if(CollectionUtils.isEmpty(execlist)){
// List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>()
// .lambda().eq(ZtProjectproduct::getProduct, s.getProduct()));
// ZtProjectproduct ztProjectproduct = list.get(0);
//
//
// ZtProjectstory ztProjectstory = new ZtProjectstory();
// ztProjectstory.setOrder(1);
// ztProjectstory.setStory(s.getId());
// ztProjectstory.setProject(ztProjectproduct.getProject());
// this.projectstoryService.save(ztProjectstory);
// //添加执行
// }else{
//
// ZtProjectstory ztProjectstory = new ZtProjectstory();
// ztProjectstory.setOrder(1);
// ztProjectstory.setStory(s.getId());
// ztProjectstory.setProject(execlist.get(0).getProject());
// this.projectstoryService.save(ztProjectstory);
// }
//
//
//
// }
// }
//
// ZtProjectDTO d=new ZtProjectDTO();
// d.setExcludeId(dto.getExecution());
// d.setStoryIds(new ArrayList<>(){{add(s.getId());}});
// projectService.executionSyncStory(d);
// }
} }
@ -321,18 +329,34 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
//老的迭代 //老的迭代
List<ZtProjectstory> pList = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId()) List<ZtProjectstory> pList = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId())
.ne(ZtProjectstory::getExecution, 0) .eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
); );
Integer execution = dto.getExecution(); //如果关联了迭代 执行
if(execution!=null&&execution!=0){ List<Integer> executions = dto.getExecutions();
if(!CollectionUtils.isEmpty(pList)&&pList.get(0).getExecution().intValue()!=execution.intValue()){ if(!CollectionUtils.isEmpty(executions)){
List<ZtTask> list = this.taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, ztStory.getId())); List<Integer> oldExecIds = pList.stream().map(o -> o.getProject()).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(list)){ //查找需求管理的项目 需求只会被项目关联一次
throw new BusinessException("当前任务已开始无法更换迭代");
List execList=new ArrayList();
for (Integer exec:executions) {
if(!oldExecIds.contains(exec)){
//新增迭代关联
execList.add(exec);
} }
} }
//迭代关联
executionBindStory(ztStory,execList);
execList.clear();
for (Integer oldExec:oldExecIds) {
if(!executions.contains(oldExec)){
//删除迭代关联
execList.add(oldExec);
}
}
//取消关联
executionUnBindStory(ztStory.getId(),execList);
} }
@ -346,7 +370,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
this.productService.updateById(product); this.productService.updateById(product);
} }
} }
if(!StringUtils.isEmpty(dto.getFileUrl())){
ZtStoryspec spec = this.storyspecService.getOne(new QueryWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory, id)); ZtStoryspec spec = this.storyspecService.getOne(new QueryWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory, id));
if(spec==null){ if(spec==null){
spec = new ZtStoryspec(); spec = new ZtStoryspec();
@ -358,11 +381,14 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
spec.setFiles(dto.getFileUrl()); spec.setFiles(dto.getFileUrl());
storyspecService.save(spec); storyspecService.save(spec);
}else{ }else{
spec.setVersion(1);
spec.setTitle(ztStory.getTitle());
spec.setSpec(dto.getSpec());
spec.setVerify(dto.getVerify());
spec.setFiles(dto.getFileUrl()); spec.setFiles(dto.getFileUrl());
storyspecService.update(new UpdateWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory,id).set(ZtStoryspec::getFiles,dto.getFileUrl()) storyspecService.update(new UpdateWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory,id).set(ZtStoryspec::getFiles,dto.getFileUrl())
); );
} }
}
@ -406,60 +432,60 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if(dto.getExecution()!=null&&dto.getExecution()!=0){ // if(dto.getExecution()!=null&&dto.getExecution()!=0){
//1.没有绑定 解绑 // //1.没有绑定 解绑
ZtProjectstory execStory = this.projectstoryService.getOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId()) // ZtProjectstory execStory = this.projectstoryService.getOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId())
.ne(ZtProjectstory::getExecution, 0)); // .ne(ZtProjectstory::getExecution, 0));
//如果没有关联过迭代 去关联 第一次 // //如果没有关联过迭代 去关联 第一次
if(execStory==null){ // if(execStory==null){
//如果是产品型需求 加项目 加迭代 如果是项目型产品 加迭代 // //如果是产品型需求 加项目 加迭代 如果是项目型产品 加迭代
//
if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) { // if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) {
List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda() // List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
.eq(ZtExecutionproject::getExecution, dto.getExecution())); // .eq(ZtExecutionproject::getExecution, dto.getExecution()));
if(CollectionUtils.isEmpty(execlist)){ // if(CollectionUtils.isEmpty(execlist)){
List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>() // List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>()
.lambda().eq(ZtProjectproduct::getProduct, ztStory.getProduct())); // .lambda().eq(ZtProjectproduct::getProduct, ztStory.getProduct()));
ZtProjectproduct ztProjectproduct = list.get(0); // ZtProjectproduct ztProjectproduct = list.get(0);
//
//
ZtProjectstory ztProjectstory = new ZtProjectstory(); // ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(1); // ztProjectstory.setOrder(1);
ztProjectstory.setStory(ztStory.getId()); // ztProjectstory.setStory(ztStory.getId());
ztProjectstory.setProject(ztProjectproduct.getProject()); // ztProjectstory.setProject(ztProjectproduct.getProject());
this.projectstoryService.save(ztProjectstory); // this.projectstoryService.save(ztProjectstory);
//添加执行 // //添加执行
}else{ // }else{
//
ZtProjectstory ztProjectstory = new ZtProjectstory(); // ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(1); // ztProjectstory.setOrder(1);
ztProjectstory.setStory(ztStory.getId()); // ztProjectstory.setStory(ztStory.getId());
ztProjectstory.setProject(execlist.get(0).getProject()); // ztProjectstory.setProject(execlist.get(0).getProject());
this.projectstoryService.save(ztProjectstory); // this.projectstoryService.save(ztProjectstory);
} // }
} // }
ZtProjectDTO d=new ZtProjectDTO(); // ZtProjectDTO d=new ZtProjectDTO();
d.setExcludeId(dto.getExecution()); // d.setExcludeId(dto.getExecution());
d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}}); // d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}});
projectService.executionSyncStory(d); // projectService.executionSyncStory(d);
} // }
else if(dto.getExecution().intValue()==pList.get(0).getExecution().intValue()){ // else if(dto.getExecution().intValue()==pList.get(0).getExecution().intValue()){
//编辑没动 不用管 // //编辑没动 不用管
}else{ // }else{
//
//
//
//2.绑定了 切换 // //2.绑定了 切换
//1. 删除projectStory 迭代的 删除看板 // //1. 删除projectStory 迭代的 删除看板
projectService.removeExecutionStory(ztStory.getId()); // projectService.removeExecutionStory(ztStory.getId(),dto.getExecution());
//2. 新增 // //2. 新增
ZtProjectDTO d=new ZtProjectDTO(); // ZtProjectDTO d=new ZtProjectDTO();
d.setExcludeId(dto.getExecution()); // d.setExcludeId(dto.getExecution());
d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}}); // d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}});
projectService.executionSyncStory(d); // projectService.executionSyncStory(d);
} // }
//
} // }
// else{ // else{
// List<ZtTask> list = this.taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, ztStory.getId())); // List<ZtTask> list = this.taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, ztStory.getId()));
// if(!CollectionUtils.isEmpty(list)){ // if(!CollectionUtils.isEmpty(list)){
@ -471,6 +497,121 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
private void executionBindStory(ZtStory story,List<Integer> execList){
Integer storyId=story.getId();
if(CollectionUtils.isEmpty(execList)){
return;
}
List<ZtExecutionproject> execProjectList = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().eq(ZtExecutionproject::getProject, execList));
for (Integer execId:execList) {
List<ZtExecutionproject> fProjectList = execProjectList.stream().filter(o -> o.getExecution().intValue() == execId.intValue()).collect(Collectors.toList());
Integer project = fProjectList.get(0).getProject();
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getProject, project)
.eq(ZtProjectstory::getStory, storyId)
);
if(CollectionUtils.isEmpty(list)){
ZtProjectDTO d=new ZtProjectDTO();
d.setStoryIds(new ArrayList<>(Arrays.asList(storyId)));
d.setProject(project);
this.projectService.projectSyncStory(d);
}
ZtProjectDTO d=new ZtProjectDTO();
d.setStoryIds(new ArrayList<>(Arrays.asList(storyId)));
d.setExcludeId(execId);
this.projectService.executionSyncStory(d);
}
}
private void executionUnBindStory(Integer storyId,List<Integer> execList){
if(CollectionUtils.isEmpty(execList)){
return;
}else{
List<ZtTask> list = this.taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, storyId)
.in(ZtTask::getExecution, execList)
);
if(!CollectionUtils.isEmpty(list)){
throw new BusinessException("当前迭代已开始任务,无法取消关联 迭代Id:"+list.get(0).getId());
}
}
projectService.removeExecutionStory(storyId,execList);
// if(dto.getExecution()!=null&&dto.getExecution()!=0){
// //1.没有绑定 解绑
// ZtProjectstory execStory = this.projectstoryService.getOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId())
// .ne(ZtProjectstory::getExecution, 0));
// //如果没有关联过迭代 去关联 第一次
// if(execStory==null){
// //如果是产品型需求 加项目 加迭代 如果是项目型产品 加迭代
//
// if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) {
// List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
// .eq(ZtExecutionproject::getExecution, dto.getExecution()));
// if(CollectionUtils.isEmpty(execlist)){
// List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>()
// .lambda().eq(ZtProjectproduct::getProduct, ztStory.getProduct()));
// ZtProjectproduct ztProjectproduct = list.get(0);
//
//
// ZtProjectstory ztProjectstory = new ZtProjectstory();
// ztProjectstory.setOrder(1);
// ztProjectstory.setStory(ztStory.getId());
// ztProjectstory.setProject(ztProjectproduct.getProject());
// this.projectstoryService.save(ztProjectstory);
// //添加执行
// }else{
//
// ZtProjectstory ztProjectstory = new ZtProjectstory();
// ztProjectstory.setOrder(1);
// ztProjectstory.setStory(ztStory.getId());
// ztProjectstory.setProject(execlist.get(0).getProject());
// this.projectstoryService.save(ztProjectstory);
// }
// }
// ZtProjectDTO d=new ZtProjectDTO();
// d.setExcludeId(dto.getExecution());
// d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}});
// projectService.executionSyncStory(d);
// }
// else if(dto.getExecution().intValue()==pList.get(0).getExecution().intValue()){
// //编辑没动 不用管
// }else{
//
//
//
// //2.绑定了 切换
// //1. 删除projectStory 迭代的 删除看板
// projectService.removeExecutionStory(ztStory.getId(),dto.getExecution());
// //2. 新增
// ZtProjectDTO d=new ZtProjectDTO();
// d.setExcludeId(dto.getExecution());
// d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}});
// projectService.executionSyncStory(d);
// }
//
// }
// else{
// List<ZtTask> list = this.taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, ztStory.getId()));
// if(!CollectionUtils.isEmpty(list)){
// throw new BusinessException("当前任务已开始无法更换迭代");
// }
// //3可能解绑 查询是否以前关联过
// projectService.removeExecutionStory(ztStory.getId());
// }
//
}
@Override @Override
public void addRemark(ZtStoryDTO dto) { public void addRemark(ZtStoryDTO dto) {
ZtStory ztStory = this.baseMapper.selectById(dto.getId()); ZtStory ztStory = this.baseMapper.selectById(dto.getId());
@ -479,13 +620,13 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
Integer projectId=null; Integer projectId=null;
Integer executionId=null; Integer executionId=null;
if(!CollectionUtils.isEmpty(list)){ if(!CollectionUtils.isEmpty(list)){
List<ZtProjectstory> projectList = list.stream().filter(o -> o.getProject() != null && o.getProject() != 0).collect(Collectors.toList()); List<ZtProjectstory> projectList = list.stream().filter(o -> o.getType().equals("project")).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(projectList)){ if(!CollectionUtils.isEmpty(projectList)){
projectId=projectList.get(0).getProject(); projectId=projectList.get(0).getProject();
} }
List<ZtProjectstory> executionList = list.stream().filter(o -> o.getProject() != null && o.getProject() != 0).collect(Collectors.toList()); List<ZtProjectstory> executionList = list.stream().filter(o -> o.getType().equals("execution")).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(executionList)){ if(!CollectionUtils.isEmpty(executionList)){
executionId=executionList.get(0).getExecution(); executionId=executionList.get(0).getProject();
} }
} }
actionService.addAction(ActionType.XQ, ActionStatus.TJBZ, dto.getId(), ztStory.getProduct() + "", projectId, executionId, actionService.addAction(ActionType.XQ, ActionStatus.TJBZ, dto.getId(), ztStory.getProduct() + "", projectId, executionId,
@ -520,7 +661,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list); Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list);
Map<Integer,ZtProject> execMap= getExecutionMapByStory(list); Map<Integer,List<ZtProject>> execMap= getExecutionMapByStory(list);
List<String> userIds = list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList()); List<String> userIds = list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList());
userIds.addAll(list.stream().map(o -> o.getOpenedby()).collect(Collectors.toList())); userIds.addAll(list.stream().map(o -> o.getOpenedby()).collect(Collectors.toList()));
@ -531,10 +672,14 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
for (ZtStoryDTO d : list) { for (ZtStoryDTO d : list) {
d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); d.setRevieweUser(d.getReviewedby().replaceAll(",", " "));
d.setViews(rMap.get(d.getId())); d.setViews(rMap.get(d.getId()));
ZtProject ztProject = execMap.get(d.getId());
if(ztProject!=null){ List<ZtProject> ztProjectList = execMap.get(d.getId());
d.setPlan(ztProject.getName());
if(!CollectionUtils.isEmpty(ztProjectList)){
d.setPlan(ztProjectList.stream().map(o->o.getName()).collect(Collectors.joining(",")));
} }
ZtUser ztUser = userMap.get(d.getAssignedTo()); ZtUser ztUser = userMap.get(d.getAssignedTo());
if(ztUser!=null){ if(ztUser!=null){
d.setAssignedToName(ztUser.getNickname()); d.setAssignedToName(ztUser.getNickname());
@ -551,8 +696,8 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
//需求id 执行 //需求id 执行
public Map<Integer, ZtProject> getExecutionMapByStory(List<ZtStoryDTO> list) { public Map<Integer,List<ZtProject>> getExecutionMapByStory(List<ZtStoryDTO> list) {
List<ZtProjectstory> pStoryList = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().ne(ZtProjectstory::getExecution, 0) List<ZtProjectstory> pStoryList = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
.in(ZtProjectstory::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList())) .in(ZtProjectstory::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList()))
); );
@ -560,15 +705,24 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return new HashMap<>(); return new HashMap<>();
} }
List<Integer> execIds = pStoryList.stream().map(o -> o.getExecution()).collect(Collectors.toList()); List<Integer> execIds = pStoryList.stream().map(o -> o.getProject()).collect(Collectors.toList());
List<ZtProject> ztProjects = this.projectService.listByIds(execIds); List<ZtProject> ztProjects = this.projectService.listByIds(execIds);
Map<Integer,ZtProject> result =new HashMap<>(); Map<Integer,List<ZtProject>> result =new HashMap<>();
for (ZtProjectstory st:pStoryList) { for (ZtProjectstory st:pStoryList) {
Integer execution = st.getExecution(); Integer execution = st.getProject();
List<ZtProject> fExecution = ztProjects.stream().filter(o -> o.getId().intValue() == execution.intValue()).collect(Collectors.toList()); List<ZtProject> fExecution = ztProjects.stream().filter(o -> o.getId().intValue() == execution.intValue()).collect(Collectors.toList());
ZtProject ztProject = fExecution.get(0); ZtProject ztProject = fExecution.get(0);
result.put(st.getStory(),ztProject);
List<ZtProject> mpList = result.get(st.getStory());
if(CollectionUtils.isEmpty(mpList)){
List<ZtProject> mList=new ArrayList<>();
mList.add(ztProject);
result.put(st.getStory(),mList);
}else{
mpList.add(ztProject);
}
} }
@ -592,17 +746,18 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
List<ZtProjectstory> allList = this.projectstoryService List<ZtProjectstory> allList = this.projectstoryService
.list(new QueryWrapper<ZtProjectstory>().lambda() .list(new QueryWrapper<ZtProjectstory>().lambda()
.in(ZtProjectstory::getProject, execList.stream().map(o->o.getProject()).collect(Collectors.toList())) .in(ZtProjectstory::getProject, execList.stream().map(o->o.getProject()).collect(Collectors.toList()))
.eq(ZtProjectstory::getExecution,0) .eq(ZtProjectstory::getType,ProjectTypeEnums.project.getValue())
); );
if(CollectionUtils.isEmpty(allList)){ if(CollectionUtils.isEmpty(allList)){
return new ArrayList<>(); return new ArrayList<>();
} }
//需求已经被绑定的列表 //需求已经被绑定的列表
List<ZtProjectstory> syncList = this.projectstoryService List<ZtProjectstory> syncList = this.projectstoryService
.list(new QueryWrapper<ZtProjectstory>().lambda() .list(new QueryWrapper<ZtProjectstory>().lambda()
.in(ZtProjectstory::getStory, .in(ZtProjectstory::getStory,
allList.stream().map(o->o.getStory()).collect(Collectors.toList())) allList.stream().map(o->o.getStory()).collect(Collectors.toList()))
.ne(ZtProjectstory::getExecution,0) .ne(ZtProjectstory::getProject,execution)
); );
List<Integer> syncIds = syncList.stream().map(o -> o.getStory()).collect(Collectors.toList()); List<Integer> syncIds = syncList.stream().map(o -> o.getStory()).collect(Collectors.toList());
@ -805,6 +960,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
//发布
@Override @Override
@Transactional @Transactional
public void releaseStory(Integer story) { public void releaseStory(Integer story) {
@ -827,6 +983,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if(!"tested".equals(ztStory.getStage())){ if(!"tested".equals(ztStory.getStage())){
throw new BusinessException("当前无法更改发布状态"); throw new BusinessException("当前无法更改发布状态");
} }
//这个需求被多少执行关联
List<Integer> execIds = getExecutionId(ztStory); List<Integer> execIds = getExecutionId(ztStory);
if(CollectionUtils.isEmpty(execIds)){ if(CollectionUtils.isEmpty(execIds)){
throw new BusinessException("当前无迭代,不可以更改"); throw new BusinessException("当前无迭代,不可以更改");
@ -844,15 +1001,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
String newStatus ="released"; String newStatus ="released";
ztStory.setStage(newStatus); ztStory.setStage(newStatus);
if("released".equals(newStatus)){
List<ZtProjectstory> execList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, story).ne(ZtProjectstory::getExecution, 0));
Integer execId=null;
if(!CollectionUtils.isEmpty(execList)){
execId=execList.get(0).getExecution();
}
actionService.addAction(ActionType.XQ, ActionStatus.FB, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execId,
RiskUserThreadLocal.get().getName(), null, "");
}
this.baseMapper.updateById(ztStory); this.baseMapper.updateById(ztStory);
for (Integer execId : execIds) { for (Integer execId : execIds) {
@ -870,7 +1018,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
this.productService.productChangeStatus(ztStory.getProduct(), oldPStatus, newPStatus); this.productService.productChangeStatus(ztStory.getProduct(), oldPStatus, newPStatus);
} }
} }
} }
actionService.addAction(ActionType.XQ, ActionStatus.FB, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execIds.get(0),
RiskUserThreadLocal.get().getName(), null, "");
} }
@Override @Override
@ -1024,61 +1175,61 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override @Override
@Transactional @Transactional
public void changeExecution(ZtStoryDTO dto) { public void changeExecution(ZtStoryDTO dto) {
List<Integer> idList = dto.getIdList(); // List<Integer> idList = dto.getIdList();
for (Integer i : idList) { // for (Integer i : idList) {
ZtStory ztStory = this.baseMapper.selectById(i); // ZtStory ztStory = this.baseMapper.selectById(i);
if("closed".equals(ztStory.getStatus())){ // if("closed".equals(ztStory.getStatus())){
throw new BusinessException("当前已关闭"); // throw new BusinessException("当前已关闭");
} // }
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName()); // ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
ztStory.setLastediteddate(new Date()); // ztStory.setLastediteddate(new Date());
this.baseMapper.updateById(ztStory); // this.baseMapper.updateById(ztStory);
//
//
// 1.如果是产品 那么关联 项目 执行 2.如果是项目 关联执行 // // 1.如果是产品 那么关联 项目 执行 2.如果是项目 关联执行
if(dto.getExecution()!=null&&dto.getExecution()!=0){ // if(dto.getExecution()!=null&&dto.getExecution()!=0){
//
//
ZtProjectstory execStory = this.projectstoryService.getOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId()) // ZtProjectstory execStory = this.projectstoryService.getOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId())
.ne(ZtProjectstory::getExecution, 0)); // .ne(ZtProjectstory::getExecution, 0));
//如果没有关联过迭代 // //如果没有关联过迭代
if(execStory==null){ // if(execStory==null){
//如果是产品型需求 加项目 加迭代 如果是项目型产品 加迭代 // //如果是产品型需求 加项目 加迭代 如果是项目型产品 加迭代
//
if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) { // if (ztStory.getProduct() != null&&ztStory.getProduct()!=0) {
List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda() // List<ZtExecutionproject> execlist = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
.eq(ZtExecutionproject::getExecution, dto.getExecution())); // .eq(ZtExecutionproject::getExecution, dto.getExecution()));
if(CollectionUtils.isEmpty(execlist)){ // if(CollectionUtils.isEmpty(execlist)){
List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>() // List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>()
.lambda().eq(ZtProjectproduct::getProduct, ztStory.getProduct())); // .lambda().eq(ZtProjectproduct::getProduct, ztStory.getProduct()));
ZtProjectproduct ztProjectproduct = list.get(0); // ZtProjectproduct ztProjectproduct = list.get(0);
//
//
ZtProjectstory ztProjectstory = new ZtProjectstory(); // ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(1); // ztProjectstory.setOrder(1);
ztProjectstory.setStory(ztStory.getId()); // ztProjectstory.setStory(ztStory.getId());
ztProjectstory.setProject(ztProjectproduct.getProject()); // ztProjectstory.setProject(ztProjectproduct.getProject());
this.projectstoryService.save(ztProjectstory); // this.projectstoryService.save(ztProjectstory);
//添加执行 // //添加执行
}else{ // }else{
//
ZtProjectstory ztProjectstory = new ZtProjectstory(); // ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(1); // ztProjectstory.setOrder(1);
ztProjectstory.setStory(ztStory.getId()); // ztProjectstory.setStory(ztStory.getId());
ztProjectstory.setProject(execlist.get(0).getProject()); // ztProjectstory.setProject(execlist.get(0).getProject());
this.projectstoryService.save(ztProjectstory); // this.projectstoryService.save(ztProjectstory);
} // }
} // }
ZtProjectDTO d=new ZtProjectDTO(); // ZtProjectDTO d=new ZtProjectDTO();
d.setExcludeId(dto.getExecution()); // d.setExcludeId(dto.getExecution());
d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}}); // d.setStoryIds(new ArrayList<>(){{add(ztStory.getId());}});
projectService.executionSyncStory(d); // projectService.executionSyncStory(d);
} // }
//
//
} // }
//
} // }
} }
@Override @Override
@ -1143,7 +1294,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list); Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(list);
Map<Integer,ZtProject> execMap= getExecutionMapByStory(list); Map<Integer,List<ZtProject>> execMap= getExecutionMapByStory(list);
List<String> userIds = list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList()); List<String> userIds = list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList());
userIds.addAll(list.stream().map(o -> o.getOpenedby()).collect(Collectors.toList())); userIds.addAll(list.stream().map(o -> o.getOpenedby()).collect(Collectors.toList()));
@ -1154,9 +1305,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
for (ZtStoryDTO d : list) { for (ZtStoryDTO d : list) {
d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); d.setRevieweUser(d.getReviewedby().replaceAll(",", " "));
d.setViews(rMap.get(d.getId())); d.setViews(rMap.get(d.getId()));
ZtProject ztProject = execMap.get(d.getId()); List<ZtProject> ztProjectList = execMap.get(d.getId());
if(ztProject!=null){ if(!CollectionUtils.isEmpty(ztProjectList)){
d.setPlan(ztProject.getName()); d.setPlan(ztProjectList.stream().map(o->o.getName()).collect(Collectors.joining(",")));
} }
ZtUser ztUser = userMap.get(d.getAssignedTo()); ZtUser ztUser = userMap.get(d.getAssignedTo());
if(ztUser!=null){ if(ztUser!=null){
@ -1205,12 +1356,12 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda() List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getStory, ztStory.getId()) .eq(ZtProjectstory::getStory, ztStory.getId())
.ne(ZtProjectstory::getExecution, 0) .ne(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
); );
if(CollectionUtils.isEmpty(list)){ if(CollectionUtils.isEmpty(list)){
return new ArrayList<>(); return new ArrayList<>();
}else{ }else{
return list.stream().map(o->o.getExecution()).collect(Collectors.toList()); return list.stream().map(o->o.getProject()).collect(Collectors.toList());
} }
} }
@ -1331,8 +1482,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo()); RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo());
} }
//
@Override @Override
public ZtStoryDTO getStoryById(Integer id) { public ZtStoryDTO getStoryById(Integer id,Integer execution) {
ZtStory ztStory = this.baseMapper.selectById(id); ZtStory ztStory = this.baseMapper.selectById(id);
ZtStoryDTO d=new ZtStoryDTO(); ZtStoryDTO d=new ZtStoryDTO();
@ -1350,13 +1502,15 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
d.setProjectId(ztProject.getId()); d.setProjectId(ztProject.getId());
d.setProjectName(ztProject.getName()); d.setProjectName(ztProject.getName());
} }
ZtProjectstory execstory = this.projectstoryService.getOne(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, ztStory.getId()).ne(ZtProjectstory::getExecution,0)); if(execution!=null){
if(execstory!=null){ ZtProject ztProject = this.projectService.getById(execution);
ZtProject ztProject = this.projectService.getById(execstory.getExecution()); if(ztProject!=null){
d.setImplementId(ztProject.getId());
d.setImplementId(ztProject.getId()); d.setImplementName(ztProject.getName());
d.setImplementName(ztProject.getName()); }
} }
List<String> userIds = new ArrayList<>(); List<String> userIds = new ArrayList<>();
userIds.add(ztStory.getAssignedTo()); userIds.add(ztStory.getAssignedTo());
userIds.add(ztStory.getOpenedby()); userIds.add(ztStory.getOpenedby());
@ -1537,7 +1691,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override @Override
public List<ZtStoryDTO> storyListByExecution(ZtProjectQo qo) { public List<ZtStoryDTO> storyListByExecution(ZtProjectQo qo) {
List<ZtProjectstory> list = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getExecution, qo.getId())); List<ZtProjectstory> list = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getProject, qo.getId())
.eq(ZtProjectstory::getType,ProjectTypeEnums.execution.getValue())
);
if (CollectionUtils.isEmpty(list)) { if (CollectionUtils.isEmpty(list)) {
return new ArrayList<>(); return new ArrayList<>();

View File

@ -188,22 +188,17 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
Integer projectId=null; Integer projectId=null;
Integer execution=null; Integer execution=null;
if(task.getStory()!=null&&task.getStory()!=0){ if(task.getStory()!=null&&task.getStory()!=0){
ZtStory story = this.storyService.getById(task.getStory());
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getStory, task.getStory()));
if(!CollectionUtils.isEmpty(list)){ execution=task.getExecution();
List<ZtProjectstory> projectList = list.stream().filter(o -> o.getProject() != null && o.getProject() != 0).collect(Collectors.toList()); projectId=task.getProject();
if(!CollectionUtils.isEmpty(projectList)){ if(task.getStory()!=null&&task.getStory()!=0){
projectId=projectList.get(0).getProject(); ZtStory story = this.storyService.getById(task.getStory());
} if(story!=null){
List<ZtProjectstory> executionList = list.stream().filter(o -> o.getProject() != null && o.getProject() != 0).collect(Collectors.toList()); productId=story.getProduct();
if(!CollectionUtils.isEmpty(executionList)){
execution=executionList.get(0).getExecution();
} }
} }
} }
actionService.addAction(ActionType.RW, ActionStatus.TJBZ, dto.getId(), productId==null?"":productId+"", projectId, task.getExecution(), actionService.addAction(ActionType.RW, ActionStatus.TJBZ, dto.getId(), productId==null?"":productId+"", projectId, task.getExecution(),
RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
} }
@ -216,9 +211,12 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
} }
ZtTaskDTO dto=new ZtTaskDTO(); ZtTaskDTO dto=new ZtTaskDTO();
BeanUtils.copyProperties(ztTask,dto); BeanUtils.copyProperties(ztTask,dto);
ZtProject project = this.ztProjectService.getById(ztTask.getExecution()); if(ztTask.getExecution()!=null&&ztTask.getExecution()!=0){
dto.setImplementId(project.getId()); ZtProject project = this.ztProjectService.getById(ztTask.getExecution());
dto.setImplementName(project.getName()); dto.setImplementId(project.getId());
dto.setImplementName(project.getName());
}
return dto; return dto;
} }