需求bug

This commit is contained in:
2025-01-09 18:10:24 +08:00
parent 70afa5c332
commit a30c53996e
22 changed files with 391 additions and 155 deletions

View File

@ -40,6 +40,13 @@ public class ZtReleaseController {
return Result.success();
}
@RequestMapping(value = "/getById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getById(@RequestBody ZtReleaseQo qo){
ZtReleaseDTO ztRelease = releaseService.getReleaseById(qo.getId());
return Result.success(ztRelease);
}
@RequestMapping(value = "/modifyRelease", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result modifyRelease(@RequestBody ZtReleaseDTO dto){
releaseService.modifyRelease(dto);

View File

@ -44,6 +44,32 @@ public class ZtTaskController {
@Autowired
private IZtTaskService ztTaskService;
@Autowired
private IZtProjectService projectService;
@Autowired
private IZtStoryService storyService;
@Autowired
private IZtUserService userService;
@Autowired
private IZtProjectstoryService projectstoryService;
@Autowired
private IZtKanbanlaneService kanbanlaneService;
@Autowired
private com.sa.zentao.service.IZtStoryService IZtStoryService;
@Autowired
private IZtExecutionprojectService executionprojectService;
@Autowired
private IZtProjectproductService projectproductService;
@Autowired
private IZtStoryspecService storyspecService;
@RequestMapping(value = "/taskPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result<PageInfo<ZtTaskDTO>> taskPageList(@RequestBody ZtProjectQo qo){
@ -160,16 +186,7 @@ public class ZtTaskController {
return Result.success(list);
}
@Autowired
private IZtProjectService projectService;
@Autowired
private IZtStoryService storyService;
@Autowired
private IZtUserService userService;
@Autowired
private IZtProjectstoryService projectstoryService;
@Autowired
private IZtKanbanlaneService kanbanlaneService;
@RequestMapping(value = "/uploadTask", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
@ -256,19 +273,6 @@ public class ZtTaskController {
@Autowired
private com.sa.zentao.service.IZtStoryService IZtStoryService;
@Autowired
private IZtExecutionprojectService executionprojectService;
@Autowired
private IZtProjectproductService projectproductService;
@Autowired
private IZtStoryspecService storyspecService;
//同步中道
@ -421,6 +425,87 @@ public class ZtTaskController {
//同步中道
@RequestMapping(value = "/syncZdTaskByExecution", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public Result syncZdTaskByExecution(@RequestParam("implementName")String implementName){
if(StringUtils.isEmpty(implementName)){
return Result.success();
}
List<ZtProject> list1 = this.projectService.list(new QueryWrapper<ZtProject>().lambda().eq(ZtProject::getName, implementName)
.eq(ZtProject::getType,"sprint")
);
if(CollectionUtils.isEmpty(list1)){
throw new BusinessException("未查询到");
}
ZtProject sprint = this.projectService.getOne(new QueryWrapper<ZtProject>().lambda().eq(ZtProject::getName, implementName)
.eq(ZtProject::getType, "sprint"));
ZtProjectDTO d=projectService.selectPrdByName(implementName);
if(d!=null){
// 新系统执行id
Integer myExecId = list1.get(0).getId();
//执行id
Integer id = d.getId();
List<ZtTaskDTO> taskDTOS=this.ztTaskService.taskListPrd(id);
for (ZtTaskDTO task:taskDTOS) {
List<ZtTask> list = this.ztTaskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getName, task.getName()));
// if(!CollectionUtils.isEmpty(list)){
// continue;
// }
//老的
ZtTask ztTask = new ZtTask();
BeanUtils.copyProperties(task,ztTask,"id");
if(ztTask.getDeadline()!=null){
ztTask.setDeadlineTime(ztTask.getDeadline().getTime()/1000);
}
ZtExecutionproject project = this.executionprojectService.getOne(new QueryWrapper<ZtExecutionproject>().lambda()
.eq(ZtExecutionproject::getExecution, myExecId));
Integer projectId = project.getProject();
ztTask.setExecution(myExecId);
ztTask.setProject(projectId);
this.ztTaskService.save(ztTask);
kanbanlaneService.addTask( myExecId, Arrays.asList(ztTask));
if(ztTask.getStatus().equals("closed")){
kanbanlaneService.changeStatus(myExecId,ztTask.getId(),"task","closed");
}
if(ztTask.getStatus().equals("doing")){
try {
kanbanlaneService.changeStatus(myExecId,ztTask.getId(),"task","developing");
}catch (Exception e){
log.error("",e);
}
}
if(ztTask.getStatus().equals("done")){
kanbanlaneService.changeStatus(myExecId,ztTask.getId(),"task","developed");
}
if(ztTask.getStatus().equals("cancel")){
kanbanlaneService.changeStatus(myExecId,ztTask.getId(),"task","canceled");
}
if(ztTask.getStatus().equals("wait")){
kanbanlaneService.changeStatus(myExecId,ztTask.getId(),"task","wait");
}
if(ztTask.getStatus().equals("pause")){
kanbanlaneService.changeStatus(myExecId,ztTask.getId(),"task","pause");
}
}
}
return Result.success();
}
//同步中道
@RequestMapping(value = "/test", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public Result test(@RequestParam("implementName")String implementName){

View File

@ -171,7 +171,8 @@ public class ZtUserController {
.set(ZtUser::getUserType,user.getUserType())
.set(ZtUser::getEmail,user.getEmail())
.set(ZtUser::getProductIds,ztUser.getProductIds())
.set(ZtUser::getPhone,ztUser.getPhone())
.set(ZtUser::getColor,user.getColor())
.set(ZtUser::getPhone,ztUser.getPhone())
.eq(ZtUser::getId,ztUser.getId())
);
this.actionService.addAction(ActionType.USER, ActionStatus.BJ,ztUser.getId(),null,null,null,RiskUserThreadLocal.get().getName(),null,user.getAccount());

View File

@ -30,10 +30,10 @@ public class ZtReleaseDTO implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String project;
private Integer project;
private String projectName;
private Integer product;
private String productName;
private String branch;
private Integer shadow;

View File

@ -29,6 +29,9 @@ public class ZtProject implements Serializable {
private Integer project;
@TableField(exist = false)
private String projectName;
private Integer charter;
private String model;

View File

@ -28,7 +28,7 @@ public class ZtRelease implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String project;
private Integer project;
private Integer product;

View File

@ -27,7 +27,7 @@ public class ZtReleaseDetails implements Serializable {
private Integer releaseId;
private Integer objectId;
//story
private String objectType;
// released已发布 closed 关闭
private String status;

View File

@ -28,6 +28,7 @@ public enum ActionStatus {
KSCE(21, "tested","开始测试"),
CSWC(20, "tested","测试完成"),
LOGIN(100, "login","登录"),
;

View File

@ -11,6 +11,8 @@ public enum ActionType {
XQ(4, "story","需求"),
FB(4, "release","发布"),
USERXQ(14, "user-story","用户需求"),
WTFK(15, "story-feedback","问题反馈"),
@ -21,6 +23,8 @@ public enum ActionType {
LOGIN(7, "LOGIN","登录"),
USER(8, "user","用户"),
;

View File

@ -1,5 +1,6 @@
package com.sa.zentao.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sa.zentao.dao.ZtTaskDTO;
import com.sa.zentao.entity.ZtTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@ -19,4 +20,7 @@ import java.util.List;
public interface ZtTaskMapper extends BaseMapper<ZtTask> {
List<ZtTaskDTO> taskPageList(@Param("qo") ZtProjectQo qo);
@DS("slave")
List<ZtTaskDTO> taskListPrd(@Param("id") Integer id);
}

View File

@ -27,6 +27,8 @@ public class ZtReleaseQo extends BaseQo {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String assignedTo;
private Integer project;

View File

@ -46,4 +46,6 @@ public interface IZtReleaseService extends IService<ZtRelease> {
void removeStory(ZtReleaseQo qo);
void batchSyncStory(ZtReleaseQo qo);
ZtReleaseDTO getReleaseById(Integer id);
}

View File

@ -46,9 +46,9 @@ public interface IZtStoryService extends IService<ZtStory> {
List<ZtStoryDTO> storyNoSyncProject(ZtProjectQo qo);
void startStory(Integer story,Integer execution);
void startStory(Integer story);
void finishStory(Integer story,Integer execution);
void finishStory(Integer story);
//测试完毕
void testedStory(Integer story);
//测试中

View File

@ -52,4 +52,5 @@ public interface IZtTaskService extends IService<ZtTask> {
ZtTaskDTO getTaskById(Integer id);
List<ZtTaskDTO> taskListPrd(Integer id);
}

View File

@ -141,7 +141,7 @@ public class ZtProductServiceImpl extends ServiceImpl<ZtProductMapper, ZtProduct
}
for (ZtProjectDTO d:ztProjectDTOS) {
d.setChildren(result.stream().filter(o->o.getProgram()==d.getId()).collect(Collectors.toList()));
d.setChildren(result.stream().filter(o->o.getProgram().equals(d.getId())).collect(Collectors.toList()));
d.setId(100000000+d.getId());
if(!StringUtils.isEmpty(d.getPm())){
ZtUser ztUser = userMap.get(d.getPm());

View File

@ -139,6 +139,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
ztProject.setPath(String.format(",%d,",ztProject.getId()));
ztProject.setGrade(1);
ztProject.setLeft(0f);
ztProject.setEstimate(0f);
ztProject.setConsumed(0f);
ztProject.setOrder(0);
ztProject.setParent(0);
@ -147,8 +148,9 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
ztProject.setPath(pProject.getPath()+""+String.format("%d,",ztProject.getId()));
ztProject.setGrade(pProject.getGrade()+1);
ztProject.setLeft(2f);
ztProject.setConsumed(4f);
ztProject.setEstimate(0f);
ztProject.setLeft(0f);
ztProject.setConsumed(0f);
ztProject.setOrder(pProject.getOrder()+5);
}
this.baseMapper.updateById(ztProject);
@ -622,11 +624,18 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
order=ztProjectstory.getOrder()+5;
}
List saveList=new ArrayList();
Map<Integer,ZtStory> sMap = getStoryMap(storyIds);
for (Integer sId:storyIds) {
ZtProjectstory ztProjectstory = new ZtProjectstory();
ztProjectstory.setOrder(order);
ztProjectstory.setStory(sId);
ztProjectstory.setProduct(ztProject.getParent());
ZtStory ztStory = sMap.get(sId);
if(ztStory!=null){
ztProjectstory.setProduct(ztStory.getProduct());
}
ztProjectstory.setType(ProjectTypeEnums.project.getValue());
ztProjectstory.setProject(project);
saveList.add(ztProjectstory);
order+=5;
@ -636,6 +645,18 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
}
private Map<Integer, ZtStory> getStoryMap(List<Integer> storyIds) {
if(CollectionUtils.isEmpty(storyIds)){
return new HashMap<>();
}
List<ZtStory> storyList = this.storyService.listByIds(storyIds);
if(CollectionUtils.isEmpty(storyList)){
return new HashMap<>();
}else{
return storyList.stream().collect(Collectors.toMap(ZtStory::getId,o->o));
}
}
@Override
public List<ZtProjectDTO> implementByProject(ZtProjectQo qo) {
@ -790,7 +811,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
List<ZtProjectstory> syncStoryList = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>()
.lambda().ne(ZtProjectstory::getProject, excludeId)
.lambda().eq(ZtProjectstory::getProject, excludeId)
.in(ZtProjectstory::getStory, storyIds)
);

View File

@ -8,6 +8,8 @@ import com.github.pagehelper.PageInfo;
import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*;
import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ActionStatus;
import com.sa.zentao.enums.ActionType;
import com.sa.zentao.enums.ProjectTypeEnums;
import com.sa.zentao.enums.StoryStageEnums;
import com.sa.zentao.mapper.ZtReleaseMapper;
@ -43,11 +45,29 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
private IZtProjectService projectService;
@Autowired
private IZtUserService userService;
@Autowired
private IZtActionService actionService;
@Autowired
private IZtProjectproductService projectproductService;
@Autowired
private IZtProductService productService;
@Autowired
private IZtNoticeService noticeService;
@Autowired
private IZtProjectstoryService projectstoryService;
@Autowired
private IZtStoryService storyService;
@Override
public void addRelease(ZtReleaseDTO dto) {
if(StringUtils.isEmpty(dto.getProject())){
Integer project = dto.getProject();
if(project==null||project==0){
throw new BusinessException("请选择项目");
}
@ -57,6 +77,12 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
ztRelease.setCreatedby(RiskUserThreadLocal.get().getName());
ztRelease.setStatus("reviewing");
ztRelease.setCreateddate(new Date());
ZtProjectproduct projectproduct = this.projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda()
.eq(ZtProjectproduct::getProject, project));
if(projectproduct!=null){
ztRelease.setProduct(projectproduct.getProduct());
}
this.baseMapper.insert(ztRelease);
@ -71,7 +97,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
if(!CollectionUtils.isEmpty(list)){
List<ZtStory> sList = this.storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getStatus, "active")
.in(ZtStory::getId,list.stream().map(o->o.getStory()).collect(Collectors.toList()))
.in(ZtStory::getId,list.stream().map(o->o.getStory()).distinct().collect(Collectors.toList()))
.eq(ZtStory::getStage, StoryStageEnums.tested.getValue()));
if(!CollectionUtils.isEmpty(sList)){
List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
@ -95,12 +121,17 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
}
}
actionService.addAction(ActionType.FB, ActionStatus.XJ, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(), dto.getDanger(), "");
}
@Override
@Transactional
public void modifyRelease(ZtReleaseDTO dto) {
ZtRelease ztRelease = this.baseMapper.selectById(dto.getId());
String danger = ztRelease.getDanger();
String executions = ztRelease.getExecutions();
if(ztRelease==null){
throw new BusinessException("未查询到数据");
@ -111,6 +142,46 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
String project = ztRelease.getExecutions();
String[] split = project.split(",");
String execStr = dto.getExecutions();
if(!StringUtils.isEmpty(execStr)&&!execStr.equals(executions)){
List<String> execIds = new ArrayList<String>(Arrays.asList(execStr.split(",")));
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.in(ZtProjectstory::getProject, execIds)
.eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
);
if(!CollectionUtils.isEmpty(list)){
List<ZtStory> sList = this.storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getStatus, "active")
.in(ZtStory::getId,list.stream().map(o->o.getStory()).distinct().collect(Collectors.toList()))
.eq(ZtStory::getStage, StoryStageEnums.tested.getValue()));
if(!CollectionUtils.isEmpty(sList)){
List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
.in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList())));
List<Integer> sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList());
this.releaseDetailsService.remove(new QueryWrapper<ZtReleaseDetails>().lambda().eq(ZtReleaseDetails::getReleaseId,ztRelease.getId()));
List<ZtReleaseDetails> saveBatch=new ArrayList<>();
for (ZtStory s:sList) {
if(!sIds.contains(s.getId())){
ZtReleaseDetails e=new ZtReleaseDetails();
e.setObjectId(s.getId());
e.setObjectType("story");
e.setReleaseId(ztRelease.getId());
e.setStatus("wait");
saveBatch.add(e);
}
}
releaseDetailsService.saveBatch(saveBatch);
}
}
}
actionService.addAction(ActionType.FB, ActionStatus.BJ, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(),danger==null?null: danger.equals(dto.getDanger())?"":dto.getDanger(), "");
}
@Override
@ -157,9 +228,12 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
}
ztRelease.setAssignedTo(dto.getAssignedTo());
this.baseMapper.updateById(ztRelease);
actionService.addAction(ActionType.FB, ActionStatus.FP, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
@Transactional
public void userReview(ZtReleaseQo dto) {
ZtRelease ztRelease = this.baseMapper.selectById(dto.getId());
if(ztRelease==null){
@ -187,15 +261,11 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
}
this.baseMapper.updateById(ztRelease);
actionService.addAction(ActionType.FB, ActionStatus.PS, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(), "", ztRelease.getAssignedTo());
}
@Autowired
private IZtNoticeService noticeService;
@Autowired
private IZtProjectstoryService projectstoryService;
@Autowired
private IZtStoryService storyService;
@Override
@Transactional
@ -265,6 +335,8 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
}
this.baseMapper.updateById(ztRelease);
actionService.addAction(ActionType.FB, ActionStatus.FB, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
@ -321,7 +393,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
public PageInfo<ZtStoryDTO> projectStoryPageList(ZtReleaseQo qo) {
ZtRelease ztRelease = this.baseMapper.selectById(qo.getId());
String project = ztRelease.getProject();
Integer project = ztRelease.getProject();
// 项目查找所有迭代
List<ZtExecutionproject> execList = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().eq(ZtExecutionproject::getProject, project));
@ -340,7 +412,8 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
List<ZtRelease> ztReleases = this.baseMapper.selectList(new QueryWrapper<ZtRelease>().lambda().eq(ZtRelease::getProject, project));
List<ZtReleaseDetails> list = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
.in(ZtReleaseDetails::getReleaseId, ztReleases.stream().map(o -> o.getId()).collect(Collectors.toList())).ne(ZtReleaseDetails::getStatus, "closed")
.ne(ZtReleaseDetails::getStatus, "closed")
.in(ZtReleaseDetails::getObjectId,storyIdList)
.eq(ZtReleaseDetails::getObjectType, "story")
);
if(!CollectionUtils.isEmpty(list)){
@ -355,6 +428,9 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
}
}
qo.setStoryList(execStorys.stream().map(o->o.getStory()).collect(Collectors.toList()));
if(CollectionUtils.isEmpty(execStorys)){
return new PageInfo<ZtStoryDTO>();
}
Page<ZtReleaseDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
List<ZtStoryDTO> storyList = this.releaseDetailsService.storyPageList(qo);
@ -385,17 +461,23 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
}
@Override
@Transactional
public void removeStory(ZtReleaseQo qo) {
Integer id = qo.getId();
Integer storyId = qo.getStoryId();
ZtRelease ztRelease = this.baseMapper.selectById(id);
ZtReleaseDetails releaseDetails = this.releaseDetailsService.getOne(new QueryWrapper<ZtReleaseDetails>().lambda().eq(ZtReleaseDetails::getReleaseId, id)
.eq(ZtReleaseDetails::getObjectId, storyId));
releaseDetails.setStatus("closed");
this.releaseDetailsService.updateById(releaseDetails);
List<ZtReleaseDetails> releaseDetails = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
.eq(ZtReleaseDetails::getReleaseId, id)
.in(ZtReleaseDetails::getObjectId, qo.getStoryList()).eq(ZtReleaseDetails::getObjectType,"story"));
for (ZtReleaseDetails d:releaseDetails) {
d.setStatus("closed");
}
this.releaseDetailsService.saveOrUpdateBatch(releaseDetails);
actionService.addAction(ActionType.FB, ActionStatus.BJ, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
@ -403,11 +485,12 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
public void batchSyncStory(ZtReleaseQo qo) {
List<Integer> storyList = qo.getStoryList();
List<ZtReleaseDetails> list = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
.eq(ZtReleaseDetails::getObjectType, "story").ne(ZtReleaseDetails::getStatus, "closed")
.eq(ZtReleaseDetails::getObjectType, "story")
.ne(ZtReleaseDetails::getStatus, "closed")
.in(ZtReleaseDetails::getObjectId, storyList)
);
if(!CollectionUtils.isEmpty(list)){
throw new BusinessException("需求已被关联需求id :"+ list.get(0).getId());
throw new BusinessException("需求已被关联需求id :"+ list.get(0).getObjectId());
}
List<ZtReleaseDetails> saveBatch=new ArrayList<>();
for (Integer story:storyList) {
@ -421,5 +504,41 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
releaseDetailsService.saveBatch(saveBatch);
ZtRelease ztRelease = this.baseMapper.selectById(qo.getId());
actionService.addAction(ActionType.FB, ActionStatus.BJ, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
public ZtReleaseDTO getReleaseById(Integer id) {
ZtRelease ztRelease = this.baseMapper.selectById(id);
ZtReleaseDTO d=new ZtReleaseDTO();
BeanUtils.copyProperties(ztRelease,d);
Map<String, ZtUser> userMap = this.userService.userMapByIds(null);
ZtUser ztUser = userMap.get(d.getAssignedTo());
if(ztUser!=null){
d.setAssignedToName(ztUser.getNickname());
}
Integer productId = d.getProduct();
if(productId!=null&&productId!=0){
ZtProduct p = this.productService.getById(productId);
d.setProductName(p.getName());
}
ZtProject ztProject = this.projectService.getById(d.getProject());
if(ztProject!=null){
d.setProjectName(ztProject.getName());
}
ztUser = userMap.get(d.getCreatedby());
if(ztUser!=null){
d.setCreatedby(ztUser.getNickname());
}
return d;
}
}

View File

@ -134,6 +134,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return new PageInfo<ZtStoryDTO>(list);
}
private Map<Integer, List<ZtStoryreviewDTO>> getReviewMap(List<ZtStoryDTO> list) {
List<ZtStoryreview> list1 = storyreviewService.list(new QueryWrapper<ZtStoryreview>().lambda().in(ZtStoryreview::getStory
, list.stream().map(o -> o.getId()).collect(Collectors.toList())
@ -432,68 +433,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
// 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());
// }
}
@ -503,13 +442,15 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return;
}
List<ZtExecutionproject> execProjectList = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda().eq(ZtExecutionproject::getProject, execList));
List<ZtExecutionproject> execProjectList = this.executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
.in(ZtExecutionproject::getExecution, execList));
for (Integer execId:execList) {
List<ZtExecutionproject> fProjectList = execProjectList.stream().filter(o -> o.getExecution().intValue() == execId.intValue()).collect(Collectors.toList());
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()
@ -647,6 +588,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return BeanCopyUtil.copyListProperties(closed,ZtStoryDTO::new);
}
@Override
public PageInfo<ZtStoryDTO> projectStoryPageList(ZtProjectQo qo) {
Page<ZtStoryDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
@ -757,7 +699,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
.list(new QueryWrapper<ZtProjectstory>().lambda()
.in(ZtProjectstory::getStory,
allList.stream().map(o->o.getStory()).collect(Collectors.toList()))
.ne(ZtProjectstory::getProject,execution)
.eq(ZtProjectstory::getProject,execution)
);
List<Integer> syncIds = syncList.stream().map(o -> o.getStory()).collect(Collectors.toList());
@ -804,9 +746,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new);
}
@Override
@Transactional
public void startStory(Integer id, Integer execution) {
public void startStory(Integer id) {
if(id==null||id==0){
return;
}
@ -829,23 +772,27 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ztStory.setStage("developing");
ztStory.setStartDate(new Date());
this.baseMapper.updateById(ztStory);
if(execution!=null&&execution!=0){
//查 ready
//backlog
ZtKanbancell backlog = this.kanbanlaneService.getZtKanbanlane("story", "backlog", execution);
ZtKanbancell ready = this.kanbanlaneService.getZtKanbanlane("story", "ready", execution);
ZtKanbancell toCell = this.kanbanlaneService.getZtKanbanlane("story", "developing", execution);
Integer fromId = backlog.getCards().contains(id.toString()) ? backlog.getColumn() : ready.getColumn();
KanbanQo qo = new KanbanQo();
qo.setStatusType("developing");
qo.setTabType("story");
qo.setId(ztStory.getId());
qo.setFromId(fromId);
qo.setToId(toCell.getColumn());
kanbanlaneService.changeStatus(qo);
List<Integer> executionId = getExecutionId(ztStory);
for (Integer execution:executionId) {
kanbanlaneService.changeStatus(execution,id,"story","developing");
}
// if(execution!=null&&execution!=0){
// //查 ready
// //backlog
// ZtKanbancell backlog = this.kanbanlaneService.getZtKanbanlane("story", "backlog", execution);
// ZtKanbancell ready = this.kanbanlaneService.getZtKanbanlane("story", "ready", execution);
// ZtKanbancell toCell = this.kanbanlaneService.getZtKanbanlane("story", "developing", execution);
// Integer fromId = backlog.getCards().contains(id.toString()) ? backlog.getColumn() : ready.getColumn();
//
//
// KanbanQo qo = new KanbanQo();
// qo.setStatusType("developing");
// qo.setTabType("story");
// qo.setId(ztStory.getId());
// qo.setFromId(fromId);
// qo.setToId(toCell.getColumn());
// kanbanlaneService.changeStatus(qo);
// }
actionService.addAction(ActionType.XQ, ActionStatus.KS, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
RiskUserThreadLocal.get().getName(), null, "");
@ -853,7 +800,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override
@Transactional
public void finishStory(Integer id, Integer execution) {
public void finishStory(Integer id) {
if(id==null||id==0){
return;
@ -873,7 +820,11 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
}else{
ztStory.setStage("tested");
this.baseMapper.updateById(ztStory);
kanbanlaneService.changeStatus(execution,id,"story","tested");
List<Integer> executionId = this.getExecutionId(ztStory);
for (Integer execution:executionId ) {
kanbanlaneService.changeStatus(execution,id,"story","tested");
}
actionService.addAction(ActionType.XQ, ActionStatus.CSWC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
RiskUserThreadLocal.get().getName(), null, "");
}
@ -884,13 +835,20 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
.in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause"))
.eq(ZtTask::getType,"devel")
);
if(Arrays.asList("wait").contains(ztStory.getStage())){
this.startStory(id);
return ;
}
if (!CollectionUtils.isEmpty(list)) {
return;
}
ztStory.setStage("developed");
this.baseMapper.updateById(ztStory);
kanbanlaneService.changeStatus(execution,id,"story","developed");
List<Integer> executionId = this.getExecutionId(ztStory);
for (Integer execution:executionId ) {
kanbanlaneService.changeStatus(execution,id,"story","developed");
}
actionService.addAction(ActionType.XQ, ActionStatus.WC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
RiskUserThreadLocal.get().getName(), null, "");
}
@ -914,9 +872,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if("closed".equals(ztStory.getStatus())){
throw new BusinessException("当前已关闭");
}
if(!"testing".equals(ztStory.getStage())){
throw new BusinessException("当前无法更改测试状态");
}
// if(!"testing".equals(ztStory.getStage())){
// throw new BusinessException("当前无法更改测试状态");
// }
List<Integer> execIds = getExecutionId(ztStory);
if(CollectionUtils.isEmpty(execIds)){
throw new BusinessException("当前无迭代,不可以更改");
@ -926,6 +884,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
.in(ZtTask::getType,"test","devel")
);
if (!CollectionUtils.isEmpty(list)) {
if("developed".equals(ztStory.getStage())){
this.testingStory(story);
}
return;
}
String oldStatus = ztStory.getStage();
@ -1024,6 +985,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
RiskUserThreadLocal.get().getName(), null, "");
}
@Override
public void testingStory(Integer story) {
if(story==null||story==0){
@ -1356,7 +1318,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
List<ZtProjectstory> list = this.projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda()
.eq(ZtProjectstory::getStory, ztStory.getId())
.ne(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
.eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())
);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
@ -1486,6 +1448,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override
public ZtStoryDTO getStoryById(Integer id,Integer execution) {
ZtStory ztStory = this.baseMapper.selectById(id);
if(ztStory==null){
throw new BusinessException("未查询到数据");
}
ZtStoryDTO d=new ZtStoryDTO();
BeanUtils.copyProperties(ztStory,d);
@ -1545,6 +1510,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return d;
}
@Override
public List<ZtProject> execListByProject(ZtStoryDTO dto) {
@ -1689,7 +1655,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override
public List<ZtStoryDTO> storyListByExecution(ZtProjectQo qo) {
List<ZtProjectstory> list = projectstoryService.list(new QueryWrapper<ZtProjectstory>().lambda().eq(ZtProjectstory::getProject, qo.getId())
@ -1707,6 +1672,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
}
public ProductStoryStatus getProductStatus(String status) {

View File

@ -221,6 +221,11 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
return dto;
}
@Override
public List<ZtTaskDTO> taskListPrd(Integer id) {
return this.baseMapper.taskListPrd(id);
}
@Override
public PageInfo<ZtTaskDTO> myTaskPageList(ZtProjectQo qo) {
@ -467,11 +472,21 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
if("devel".equals(ztTask.getType())){
//处理需求
this.storyService.startStory(ztTask.getStory(),ztTask.getExecution());
if("done".equals(ztTask.getStatus())){
this.storyService.finishStory(ztTask.getStory());
}else if("doing".equals(ztTask.getStatus())){
this.storyService.startStory(ztTask.getStory());
}
}
if("test".equals(ztTask.getType())){
//处理需求
this.storyService.testingStory(ztTask.getStory());
if("done".equals(ztTask.getStatus())){
this.storyService.testedStory(ztTask.getStory());
}else if("doing".equals(ztTask.getStatus())){
this.storyService.testingStory(ztTask.getStory());
}
}
@ -489,7 +504,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}else
if("devel".equals(type)){
//开发
this.storyService.finishStory(ztTask.getStory(),ztTask.getExecution());
this.storyService.finishStory(ztTask.getStory());
}
}
@ -566,7 +581,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}else
if("devel".equals(type)){
//开发
this.storyService.finishStory(ztTask.getStory(),ztTask.getExecution());
this.storyService.finishStory(ztTask.getStory());
}
}

View File

@ -22,12 +22,12 @@ spring:
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://192.168.1.161:3306/zentao?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: devgps
password: dev@2021GPS
# url: jdbc:mysql://192.168.3.200:3306/zentao_dev?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true
# username: root
# password: PX4fTAAsJ#T!1
# url: jdbc:mysql://192.168.1.161:3306/zentao?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true
# username: devgps
# password: dev@2021GPS
url: jdbc:mysql://192.168.3.200:3306/zentao_dev?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: PX4fTAAsJ#T!1
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave:

View File

@ -184,7 +184,7 @@
and ps.project =#{qo.project}
</if>
<if test="qo.execution != null ">
and ps.execution =#{qo.execution}
and ps.project =#{qo.execution}
</if>
<if test="qo.module != null ">
and s.module =#{qo.module}

View File

@ -206,6 +206,11 @@
</select>
<select id="taskListPrd" resultType="com.sa.zentao.dao.ZtTaskDTO">
select * from zt_task where execution = #{id}
</select>
</mapper>