diff --git a/src/main/java/com/sa/zentao/conf/DevopsRunner.java b/src/main/java/com/sa/zentao/conf/DevopsRunner.java index edaa5e5..a6fc5ae 100644 --- a/src/main/java/com/sa/zentao/conf/DevopsRunner.java +++ b/src/main/java/com/sa/zentao/conf/DevopsRunner.java @@ -46,7 +46,7 @@ public class DevopsRunner implements Runnable{ List list = cronDevopsUserService.list(new QueryWrapper().lambda().eq(ZtCronDevopsUser::getDevopsId, d.getId())); if(!CollectionUtils.isEmpty(list)){ for (ZtCronDevopsUser u:list) { - SendEmail.sendMail(u.getMail(),"尊敬的"+u.getUsername()+d.getContent()); + SendEmail.sendMail(u.getMail(),"尊敬的"+u.getUsername()+d.getContent(),null); } } diff --git a/src/main/java/com/sa/zentao/conf/ParamOutAspect.java b/src/main/java/com/sa/zentao/conf/ParamOutAspect.java index c4ac483..dc6dc6d 100644 --- a/src/main/java/com/sa/zentao/conf/ParamOutAspect.java +++ b/src/main/java/com/sa/zentao/conf/ParamOutAspect.java @@ -79,6 +79,7 @@ public class ParamOutAspect { Object proceed=null; try { proceed = joinPoint.proceed(); + }catch (Exception e){ log.error("",e); throw new BusinessException(e.getMessage()); @@ -94,8 +95,9 @@ public class ParamOutAspect { // } // } + //17462126 - log.info("[AOP-LOG-END-返回]\n\t{}", proceed); + log.info("[AOP-LOG-END-返回 ]\n\t{} {} size=", proceed,proceed==null?null:proceed.toString().length()); return proceed; } diff --git a/src/main/java/com/sa/zentao/controller/ZtReleaseController.java b/src/main/java/com/sa/zentao/controller/ZtReleaseController.java index f8cea92..1dfef7e 100644 --- a/src/main/java/com/sa/zentao/controller/ZtReleaseController.java +++ b/src/main/java/com/sa/zentao/controller/ZtReleaseController.java @@ -94,7 +94,7 @@ public class ZtReleaseController { return Result.success(); } - + //发布 @RequestMapping(value = "/release", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result release(@RequestBody ZtReleaseQo dto){ releaseService.release(dto); diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java index 2becf8b..4131a7c 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java @@ -1,15 +1,18 @@ package com.sa.zentao.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageInfo; import com.sa.zentao.dao.Result; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryUserDTO; import com.sa.zentao.entity.ZtStoryUser; +import com.sa.zentao.enums.UserStoryEnums; import com.sa.zentao.qo.StoryQo; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.IZtStoryUserService; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; @@ -71,10 +74,15 @@ public class ZtStoryUserController { @RequestMapping(value = "/storyList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result storyList(@RequestBody StoryQo qo){ - - List list = storyUserService.list(new QueryWrapper() - .lambda().eq(ZtStoryUser::getProduct,qo.getId()).in(ZtStoryUser::getStatus, "wait","active") - .orderByDesc(ZtStoryUser::getId) + LambdaQueryWrapper eq = new QueryWrapper() + .lambda().eq(ZtStoryUser::getProduct, qo.getId()) + .orderByDesc(ZtStoryUser::getId); + if(CollectionUtils.isEmpty( qo.getStatusList())){ + eq.notIn(ZtStoryUser::getStatus,UserStoryEnums.CLOSED.getCode()); + }else { + eq.in(ZtStoryUser::getStatus, UserStoryEnums.CFM.getCode(),UserStoryEnums.KFZ.getCode()); + } + List list = storyUserService.list(eq ); return Result.success(list); } diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java index fa40e2f..2ad3dc2 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserTaskController.java @@ -62,6 +62,12 @@ public class ZtStoryUserTaskController { return Result.success(); } + @RequestMapping(value = "/addRemark", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result addRemark(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.addRemark(dto); + return Result.success(); + } + @RequestMapping(value = "/getUserStoryTaskById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result getUserStoryTaskById(@RequestBody ZtProjectQo qo){ return Result.success(storyUserTaskService.getUserStoryTaskById(qo)); @@ -73,6 +79,10 @@ public class ZtStoryUserTaskController { return Result.success(); } - + @RequestMapping(value = "/assignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result assignedTo(@RequestBody ZtStoryUserTaskDTO dto){ + storyUserTaskService.assignedTo(dto); + return Result.success(); + } } diff --git a/src/main/java/com/sa/zentao/controller/ZtTaskController.java b/src/main/java/com/sa/zentao/controller/ZtTaskController.java index ba5e4c3..1f05b07 100644 --- a/src/main/java/com/sa/zentao/controller/ZtTaskController.java +++ b/src/main/java/com/sa/zentao/controller/ZtTaskController.java @@ -309,15 +309,15 @@ public class ZtTaskController { } List listSpec = storyspecService.getPrdById(oldStory.getId()); - ZtStory newStory = storyService.getById(oldStory.getId()); - if(newStory!=null){ - continue; - } - if(!CollectionUtils.isEmpty(listSpec)){ - ZtStoryspec ztStoryspec = listSpec.get(0); - ztStoryspec.setFiles(null); - storyspecService.save(ztStoryspec); - } +// ZtStory newStory = storyService.getById(oldStory.getId()); +// if(newStory!=null){ +// continue; +// } +// if(!CollectionUtils.isEmpty(listSpec)){ +// ZtStoryspec ztStoryspec = listSpec.get(0); +// ztStoryspec.setFiles(null); +// storyspecService.save(ztStoryspec); +// } List userList=new ArrayList(); @@ -409,10 +409,10 @@ public class ZtTaskController { //创建新的需求 - oldStory.setProduct(product); - oldStory.setStage("wait"); - oldStory.setStatus("active"); - storyService.save(oldStory); +// oldStory.setProduct(product); +// oldStory.setStage("wait"); +// oldStory.setStatus("active"); +// storyService.save(oldStory); //项目关联需求 ZtProjectDTO dto=new ZtProjectDTO(); dto.setStoryIds(new ArrayList<>(){ @@ -421,7 +421,12 @@ public class ZtTaskController { } }); dto.setProject(project); - this.projectService.projectSyncStory(dto); + try { + this.projectService.projectSyncStory(dto); + }catch (Exception e){ + log.error("",e); + } + for (ZtProjectstory st:oldPStoryList) { ZtProjectDTO pro = this.projectService.selectPrdById(st.getProject()); @@ -432,7 +437,12 @@ public class ZtTaskController { if(!CollectionUtils.isEmpty(newExec)){ ZtProject project1 = newExec.get(0); dto.setExcludeId(project1.getId()); - this.projectService.executionSyncStory(dto); + try { + this.projectService.executionSyncStory(dto); + }catch (Exception e){ + + } + } } diff --git a/src/main/java/com/sa/zentao/controller/ZtUserController.java b/src/main/java/com/sa/zentao/controller/ZtUserController.java index e908b4d..e8ef3f7 100644 --- a/src/main/java/com/sa/zentao/controller/ZtUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtUserController.java @@ -103,6 +103,8 @@ public class ZtUserController { return Result.success(new ArrayList<>()); } eq.in(ZtUser::getAccount,execution.stream().map(o->o.getAccount()).collect(Collectors.toList())); + }else{ + this.userMapper.selectOne(new QueryWrapper().lambda().eq(ZtUser::getAccount,RiskUserThreadLocal.get().getName())); } return Result.success(userService.list(eq diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java index 4cac45b..c5672aa 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryUserTaskDTO.java @@ -119,4 +119,5 @@ public class ZtStoryUserTaskDTO implements Serializable { private String status; + private String desc; } diff --git a/src/main/java/com/sa/zentao/entity/ZtRelease.java b/src/main/java/com/sa/zentao/entity/ZtRelease.java index dea08ff..5a74375 100644 --- a/src/main/java/com/sa/zentao/entity/ZtRelease.java +++ b/src/main/java/com/sa/zentao/entity/ZtRelease.java @@ -56,6 +56,7 @@ public class ZtRelease implements Serializable { private String mailto; private String notify; + //active 激活 //reviewing待评审 //waitRelease 待发布 //released 发不成功 diff --git a/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java b/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java index 118965d..e739410 100644 --- a/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java +++ b/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java @@ -27,7 +27,7 @@ public class ZtReleaseDetails implements Serializable { private Integer releaseId; private Integer objectId; - //story + //story bug private String objectType; // released已发布 closed 关闭 private String status; diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java index f414d2b..ddcf8db 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java @@ -202,4 +202,6 @@ public class ZtStoryUser implements Serializable { private Date psDate; private String deliverRemark; + + private String oldStatus; } diff --git a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java index b657c7a..9f08f06 100644 --- a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java +++ b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java @@ -4,30 +4,32 @@ import com.baomidou.mybatisplus.annotation.EnumValue; public enum UserStoryEnums { - DPS("reviewing", "待评审"), - CG("draft", "草稿"), - JH("active", "激活"), - UNCFM("unconfirmed", "产品确认中"), - DGT("waitcommunicate", "待沟通"), + DPS("reviewing", "待评审",0), + CG("draft", "草稿",1), + JH("active", "激活",2), + UNCFM("unconfirmed", "产品确认中",3), + DGT("waitcommunicate", "待沟通",4), - DSJ("waitdesign","需求待设计"), - XXSJZ("designdoing","详细设计中"), - CPYSJ("designdone","产品已设计"), + DSJ("waitdesign","需求待设计",5), + XXSJZ("designdoing","详细设计中",6), + CPYSJ("designdone","产品已设计",7), //待确认 - DQR("storyunconfirmed","需求待确认"), - CFM("confirmed","需求已确认"), - KFZ("developing","研发中"), - YWC("finished","已完成"), - CLOSED("closed","已关闭"), + DQR("storyunconfirmed","需求待确认",8), + CFM("confirmed","需求已确认",9), + KFZ("developing","研发中",10), + YWC("finished","已完成",11), + CLOSED("closed","已关闭",12), ; @EnumValue private String code; private String value; + private Integer index; - private UserStoryEnums(String code, String value) { + private UserStoryEnums(String code, String value,Integer index) { this.code = code; this.value = value; + this.index = index; } public static UserStoryEnums transfer(String code){ @@ -48,4 +50,8 @@ public enum UserStoryEnums { return this.value; } + public Integer getIndex(){ + return index; + } + } diff --git a/src/main/java/com/sa/zentao/qo/StoryQo.java b/src/main/java/com/sa/zentao/qo/StoryQo.java index 5619b20..8d52570 100644 --- a/src/main/java/com/sa/zentao/qo/StoryQo.java +++ b/src/main/java/com/sa/zentao/qo/StoryQo.java @@ -23,6 +23,8 @@ public class StoryQo extends BaseQo { private String status; private List productIds; + private List statusList; + private String ids; private List storyIds; diff --git a/src/main/java/com/sa/zentao/service/IZtStoryService.java b/src/main/java/com/sa/zentao/service/IZtStoryService.java index 7195c3f..b632c14 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryService.java @@ -6,6 +6,7 @@ import com.sa.zentao.dao.ZtStoryUserDTO; import com.sa.zentao.entity.ZtProject; import com.sa.zentao.entity.ZtStory; import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.enums.TaskType; import com.sa.zentao.qo.ZtProjectQo; import org.apache.ibatis.annotations.Param; @@ -46,7 +47,8 @@ public interface IZtStoryService extends IService { PageInfo projectStoryPageList(ZtProjectQo qo); List storyNoSyncProject(ZtProjectQo qo); - + //未开始 + void waitStory(Integer story); void startStory(Integer story); //开发完成 void finishStory(Integer story,String finishBy); @@ -57,7 +59,7 @@ public interface IZtStoryService extends IService { //发布 void releaseStory(Integer story); - void taskFinishChangeStatus(Integer story,String finishBy); + void taskFinishChangeStatus(Integer story, String finishBy, TaskType type,Boolean cancelFlag); void changeStatus(ZtStoryDTO dto); diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserService.java index f10785c..d871962 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryUserService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryUserService.java @@ -44,6 +44,8 @@ public interface IZtStoryUserService extends IService { void changeStatus(Integer id, UserStoryEnums status); + void storyFinishedChangeStatus(Integer id, UserStoryEnums status); + void improveStory(ZtStoryUserDTO dto); void confirmStory(ZtStoryUserDTO dto); diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java index ca88f0b..0d41c74 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryUserTaskService.java @@ -31,4 +31,10 @@ public interface IZtStoryUserTaskService extends IService { void finishedTask(ZtStoryUserTaskDTO dto); ZtStoryUserTaskDTO getUserStoryTaskById(ZtProjectQo qo); + + void addRemark(ZtStoryUserTaskDTO dto); + + void assignedTo(ZtStoryUserTaskDTO dto); + + void closedAll(Integer id); } diff --git a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java index a0be1af..f18c1c3 100644 --- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java +++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java @@ -17,10 +17,7 @@ import com.sa.zentao.conf.LoginRiskUser; import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.dao.*; import com.sa.zentao.entity.*; -import com.sa.zentao.enums.ProjectTypeEnums; -import com.sa.zentao.enums.TaskStatus; -import com.sa.zentao.enums.TaskType; -import com.sa.zentao.enums.UserType; +import com.sa.zentao.enums.*; import com.sa.zentao.qo.ZtCountQo; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtUserQo; @@ -210,7 +207,7 @@ public class IZtCountService { ztStory=new ArrayList<>(); } }else{ - list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); + list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); if(CollectionUtils.isEmpty(list)){ ztStory=new ArrayList<>(); @@ -310,7 +307,8 @@ public class IZtCountService { }else{ list = this.productService.listByIds(pIds); storyUsers =CollectionUtils.isEmpty(list)?new ArrayList<>(): this.storyUserService.list(new QueryWrapper().lambda() - .in(ZtStoryUser::getStatus, "active", "reviewing") + .notIn(ZtStoryUser::getStatus, + UserStoryEnums.CLOSED.getCode(),UserStoryEnums.YWC.getCode()) .in(ZtStoryUser::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList())) // .eq(ZtStoryUser::getAssignedto,loginRiskUser.getName()) .eq(ZtStoryUser::getOpenedby,loginRiskUser.getName()) @@ -391,7 +389,7 @@ public class IZtCountService { - List pList = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, pIds)); + List pList = this.productService.listByIds(pIds); List storyUsers = this.storyUserService.list(new QueryWrapper().lambda() .in(ZtStoryUser::getStatus, "active", "reviewing") diff --git a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java index e616e86..0854802 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java @@ -108,7 +108,7 @@ public class ZtBugServiceImpl extends ServiceImpl implements result = this.baseMapper.bugPageList(qo); }else if("execution".equals(qo.getSource())){ - qo.setExecution(qo.getProject().toString()); + qo.setExecution(qo.getExecution().toString()); qo.setProject(null); result = this.baseMapper.bugPageList(qo); }else if("project".equals(qo.getSource())){ diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java index f489fa7..83d4e24 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java @@ -1206,10 +1206,15 @@ public class ZtProjectServiceImpl extends ServiceImpl ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())); ztProjects = ztProjects.stream().filter(o -> - (firstDayOfMonth.getTime() >= o.getBegin().getTime() && lastDayOfMonth.getTime() > o.getEnd().getTime()) || - (firstDayOfMonth.getTime() <= o.getBegin().getTime() && lastDayOfMonth.getTime() >= o.getEnd().getTime()) || - (firstDayOfMonth.getTime() <= o.getBegin().getTime() && lastDayOfMonth.getTime() <= o.getEnd().getTime()) + (o.getBegin().getTime() >= firstDayOfMonth.getTime() + && o.getEnd().getTime() <= lastDayOfMonth.getTime()) || ( + o.getEnd().getTime() >= firstDayOfMonth.getTime() + && o.getEnd().getTime() <= lastDayOfMonth.getTime() + ) + ).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(ztProjects)) { return map; } @@ -1725,9 +1730,19 @@ public class ZtProjectServiceImpl extends ServiceImpl(); } + List execFilterList = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime() + && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || ( + o.getEnd().getTime() >= firstDayOfMonth.getTime() + && o.getEnd().getTime() <= lastDayOfMonth.getTime() + ) + ) + .map(o -> o.getId()).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(execFilterList)){ + return new PageInfo<>(); + } List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") - .in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); + .in(ZtTeam::getRoot, execFilterList)); List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); if (CollectionUtils.isEmpty(accountIds)) { diff --git a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java index df63382..243d57c 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java @@ -103,6 +103,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl releaseStoryList = this.releaseDetailsService.list(new QueryWrapper().lambda() .ne(ZtReleaseDetails::getStatus,"closed") + .eq(ZtReleaseDetails::getObjectType,"story") .in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList()))); List sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList()); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java index e1eace0..927398a 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java @@ -60,6 +60,17 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl pageList(ZtProjectQo qo) { @@ -105,8 +116,6 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl o)); } - @Autowired - private CommonsController commonsController; @Override @Transactional @@ -177,8 +186,7 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl ztStoryFeedbackDTO(ZtProjectQo qo) { @@ -437,7 +441,9 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl impl if (!storyFeedback.getStatus().equals("wait")) { throw new BusinessException("问题反馈已被处理"); } -// storyFeedback.setStatus("doing"); -// storyFeedback.setStoryId(s.getId()); -// storyFeedback.setUpdateDate(new Date()); -// storyFeedback.setUpdateUser(RiskUserThreadLocal.get().getName()); -// this.storyFeedbackService.updateById(storyFeedback); } if (dto.getUserStory() != null && dto.getUserStory() != 0) { ZtStoryUser storyUser = storyUserService.getById(dto.getUserStory()); - if (storyUser != null && "wait".equals(storyUser.getStatus())) { - storyUser.setStatus("active"); - } else if (storyUser != null && "active".equals(storyUser.getStatus())) { - if (storyUser.getStatus().equals("active") && storyUser.getStage().equals("wait")) { - storyUser.setStage("projected"); - } + if(storyUser.getStatus().equals(UserStoryEnums.CFM.getCode())){ + storyUserService.storyFinishedChangeStatus(storyUser.getId(),UserStoryEnums.KFZ); } - storyUserService.updateById(storyUser); } actionService.addAction(ActionType.XQ, ActionStatus.XJ, s.getId(), "", dto.getProduct(), null, @@ -286,8 +278,8 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(ztStoryUser==null){ throw new BusinessException("未查询到用户需求"); } - if(UserStoryEnums.transfer(ztStoryUser.getStatus())!=UserStoryEnums.CFM ){ - throw new BusinessException("无法关联未确认的需求"); + if(!Arrays.asList(UserStoryEnums.CFM.getCode(),UserStoryEnums.KFZ.getCode()).contains(ztStoryUser.getStatus())){ + throw new BusinessException("用户需求无法关联请检查"); } } ZtStory s = new ZtStory(); @@ -494,7 +486,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl executionUnBindStory(storyId, execList.stream().map(o -> o.getProject()).collect(Collectors.toList())); } } - + //old userStory + Integer userStory = ztStory.getUserStory(); + //new + Integer newUserStory = dto.getUserStory(); BeanUtils.copyProperties(dto, ztStory, "stage"); if ("draft".equalsIgnoreCase(ztStory.getStatus())) { @@ -539,6 +534,15 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } this.baseMapper.updateById(ztStory); + if(ObjectUtils.notEqual(userStory,newUserStory)){ + if(userStory!=null&&userStory!=0){ + this.storyUserService.storyFinishedChangeStatus(userStory,UserStoryEnums.YWC); + } + if(newUserStory!=null&&newUserStory!=0){ + this.storyUserService.storyFinishedChangeStatus(newUserStory,UserStoryEnums.KFZ); + } + } + fileService.updateFile(dto.getFiles(), ztStory.getId(), FileTypes.story); List userViewId = dto.getUserViewId(); @@ -935,6 +939,31 @@ public class ZtStoryServiceImpl extends ServiceImpl impl return BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new); } + @Override + @Transactional + public void waitStory(Integer id){ + if (id == null || id == 0) { + return; + } + ZtStory ztStory = this.baseMapper.selectById(id); + + if ("closed".equals(ztStory.getStatus())) { + throw new BusinessException("需求当前已关闭"); + } + + + ztStory.setStage("wait"); + ztStory.setStartDate(new Date()); + this.baseMapper.updateById(ztStory); + List executionId = getExecutionId(ztStory); + for (Integer execution : executionId) { + kanbanlaneService.changeStatus(execution, id, "story", "ready"); + } + +// +// actionService.addAction(ActionType.XQ, ActionStatus.KS, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, +// RiskUserThreadLocal.get().getName(), null, ""); + } @Override @Transactional @@ -948,15 +977,15 @@ public class ZtStoryServiceImpl extends ServiceImpl impl throw new BusinessException("需求当前已关闭"); } - List stateList = Arrays.asList("wait", "projected"); - - - if ("active".equalsIgnoreCase(ztStory.getStatus())) { - if (!stateList.contains(ztStory.getStage())) { - //已经开始 - return; - } - } +// List stateList = Arrays.asList("wait", "projected"); +// +// +// if ("active".equalsIgnoreCase(ztStory.getStatus())) { +// if (!stateList.contains(ztStory.getStage())) { +// //已经开始 +// return; +// } +// } ztStory.setStage("developing"); ztStory.setStartDate(new Date()); @@ -985,55 +1014,56 @@ public class ZtStoryServiceImpl extends ServiceImpl impl ZtStory ztStory = this.baseMapper.selectById(id); - if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { - this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); - } - if (ztStory == null) { throw new BusinessException("未查询到需求"); } - List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) - .in(ZtTask::getStatus, Arrays.asList("reviewing", "wait", "doing", "pause")) - .eq(ZtTask::getType, "devel") - ); - //任务没有做完 如果任务还没开始 - if (!CollectionUtils.isEmpty(taskList)) { - if (Arrays.asList("wait", "projected").contains(ztStory.getStage())) { - - this.taskFinishChangeStatus(id,null); - } - return; - } - //developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified已验收 closed - if (Arrays.asList("developed", "tested", "released", "verified", "closed").contains(ztStory.getStage())) { - return; - } - if ("testing".equals(ztStory.getStage())) { - List list = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) - .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause")) - .in(ZtTask::getType, "devel", "test") - ); - if (!CollectionUtils.isEmpty(list)) { - return; - } else { - ztStory.setStage("tested"); - this.baseMapper.updateById(ztStory); - List 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, ""); - } - return; + if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { + this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); } - if (Arrays.asList("wait").contains(ztStory.getStage()) && !CollectionUtils.isEmpty(taskList)) { - this.taskFinishChangeStatus(id,null); - return; - } + +// List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) +// .in(ZtTask::getStatus, Arrays.asList("reviewing", "wait", "doing", "pause")) +// .eq(ZtTask::getType, "devel") +// ); +// //任务没有做完 如果任务还没开始 +// if (!CollectionUtils.isEmpty(taskList)) { +// if (Arrays.asList("wait", "projected").contains(ztStory.getStage())) { +// +// this.taskFinishChangeStatus(id,null); +// } +// return; +// } +// //developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified已验收 closed +// if (Arrays.asList("developed", "tested", "released", "verified", "closed").contains(ztStory.getStage())) { +// return; +// } +// if ("testing".equals(ztStory.getStage())) { +// List list = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) +// .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause")) +// .in(ZtTask::getType, "devel", "test") +// ); +// if (!CollectionUtils.isEmpty(list)) { +// return; +// } else { +// ztStory.setStage("tested"); +// this.baseMapper.updateById(ztStory); +// List 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, ""); +// } +// return; +// } +// +// if (Arrays.asList("wait").contains(ztStory.getStage()) && !CollectionUtils.isEmpty(taskList)) { +// this.taskFinishChangeStatus(id,null); +// return; +// } ztStory.setStage("developed"); if (ztStory.getStartDate() == null) { @@ -1175,6 +1205,25 @@ public class ZtStoryServiceImpl extends ServiceImpl impl ztStory.setEndDate(new Date()); } this.baseMapper.updateById(ztStory); + String ysUser = ztStory.getYsUser(); + if(!StringUtils.isEmpty(ysUser)){ + ZtUser ztUser = this.userService.selectByName(ysUser); + if(ztUser!=null&&!StringUtils.isEmpty(ztUser.getEmail())){ + try { + StringBuilder b=new StringBuilder(); + b.append("
尊敬的{userName}:
"); + b.append("
您的需求 \"{id} {name}\"、\"{id} {name}\" 已发布,请及时登录系统验收。
"); + String str = b.toString(); + str= str.replace("{userName}",ztUser.getNickname()); + str=str.replace("{id}",ztStory.getId().toString()); + str=str.replace("{name}",ztStory.getTitle()); + SendEmail.sendMail(ztUser.getEmail(),str,"需求发布提醒"); + }catch (Exception e){ + log.error("",e); + } + } + } + for (Integer execId : execIds) { if (execId != null) { @@ -1202,77 +1251,209 @@ public class ZtStoryServiceImpl extends ServiceImpl impl actionService.addAction(ActionType.XQ, ActionStatus.FBCG, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execIds.get(0), RiskUserThreadLocal.get().getName(), null, ""); } - @Override - public void taskFinishChangeStatus(Integer story, String finishBy) { + public void taskFinishChangeStatus(Integer story, String finishBy,TaskType type,Boolean cancelFlag) { + if(type!=TaskType.test&&type!=TaskType.devel){ + return; + } if(story==null||story==0){ return; } - ZtStory ztStory = this.baseMapper.selectById(story); - - List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) - .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) - .eq(ZtTask::getType, "devel")); - //如果开发有任务 并且状态需要变为开发中 - if(!CollectionUtils.isEmpty(taskList)&&Arrays.asList( "wait", "projected", "developing").contains(ztStory.getStage())){ - //如果测试已经开始 那么测试进行中 - List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) - .in(ZtTask::getStatus, Arrays.asList( "doing", "done")) - .eq(ZtTask::getType, "test")); - if(!CollectionUtils.isEmpty(testList)){ - //测试任务已经开始 - this.testingStory(story); - }else{ + if(cancelFlag&&type==TaskType.devel){ + List develList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, type.getCode())); + if(!CollectionUtils.isEmpty(develList)){ this.startStory(story); - } - } - - //如果开发中任务没有了 - if(CollectionUtils.isEmpty(taskList)){ - - List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) - .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause","done")) - .eq(ZtTask::getType, "test")); - //如果测试中有任务 - Long waitCount = testList.stream().filter(o -> Arrays.asList("wait").contains(o.getStatus())).count(); - - if(!CollectionUtils.isEmpty(testList)&&waitCount.intValue()!=testList.size()){ - Long doneCount = testList.stream().filter(o -> Arrays.asList("done").contains(o.getStatus())).count(); - if(doneCount.intValue()==testList.size()){ - testedStory(story,finishBy); - }else{ - this.testingStory(story); - } }else{ - //如果开发任务没有了 并且测试还没开始 - this.finishStory(story,finishBy); - } - } + List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, TaskType.test.getCode())); + if(!CollectionUtils.isEmpty(testList)){ + testingStory(story); + }else{ + List doneList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "done"))); + if(CollectionUtils.isEmpty(doneList)){ + this.waitStory(story); + return; + } -// 如果有多个开发任务: -// 1、其中有一个开发进行中,并且所有测试任务未开始,则【开发进行中】 -// 2、所有开发任务已完成,并且所有测试任务未开始,则【开发完成】 -// 如果有多个测试任务: -// 1、其中有一个测试进行中,则【测试进行中】 -// 2、所有测试任务已完成,但还有一些开发任务没有结束,则【测试进行中】 -// 3、所有测试任务已完成,并且所有开发任务已完成,则【测试完成】 -// ZtStory ztStory = this.baseMapper.selectById(story); -// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested -// if(Arrays.asList("wait","projected","developing","developed").contains(ztStory.getStage())){ -// }else if(Arrays.asList("testing").contains(ztStory.getStage())){ -// this.testedStory(story,finishBy); + + List testedList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "done")) + .eq(ZtTask::getType, TaskType.test.getCode())); + if(!CollectionUtils.isEmpty(testedList)){ + testedStory(story,finishBy); + }else{ + this.finishStory(story,finishBy); + } + } + + } + return; + } + //测试任务取消 + if(cancelFlag&&type==TaskType.test){ + List develing = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, TaskType.devel.getCode())); + if(!CollectionUtils.isEmpty(develing)){ + startStory(story); + return; + } + + List testling = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, TaskType.test.getCode())); + if(!CollectionUtils.isEmpty(testling)){ + testingStory(story); + return; + } + List doneList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "done"))); + if(CollectionUtils.isEmpty(doneList)){ + this.waitStory(story); + return; + } + List testedList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .eq(ZtTask::getType,TaskType.test.getCode()) + .in(ZtTask::getStatus, Arrays.asList( "done"))); + if(!CollectionUtils.isEmpty(testedList)){ + this.testedStory(story,finishBy); + return; + } + List develedList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .eq(ZtTask::getType,TaskType.devel.getCode()) + .in(ZtTask::getStatus, Arrays.asList( "done"))); + if(!CollectionUtils.isEmpty(develedList)){ + this.finishStory(story,finishBy); + return; + } + return; + + } +// if(cancelFlag&&type==TaskType.test){ +// List develList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) +// .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) +// .eq(ZtTask::getType, type.getCode())); +// if(!CollectionUtils.isEmpty(develList)){ +// this.startStory(story); +// }else{ +// List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) +// .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) +// .eq(ZtTask::getType, TaskType.test.getCode())); +// if(!CollectionUtils.isEmpty(testList)){ +// testingStory(story); +// }else{ +// List testedList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) +// .in(ZtTask::getStatus, Arrays.asList( "done")) +// .eq(ZtTask::getType, TaskType.test.getCode())); +// if(!CollectionUtils.isEmpty(testedList)){ +// testedStory(story,finishBy); +// }else{ +// this.finishStory(story,finishBy); +// } +// } +// +// } +// return; // } + if(type==TaskType.test){ + // 测试 + List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, type.getCode())); + List develList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, TaskType.devel.getCode())); -// //开发完成 -// void finishStory(Integer story,String finishBy); -// //测试完毕 -// void testedStory(Integer story,String finishBy); -// //测试中 -// void testingStory(Integer story); -// //发布 -// void releaseStory(Integer story); + + + + if(CollectionUtils.isEmpty(develList)&&CollectionUtils.isEmpty(testList)){ + long done = taskService.count(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .eq(ZtTask::getType,type.getCode()) + .in(ZtTask::getStatus, Arrays.asList("done"))); + if(done<1){ + return; + } + this.testedStory(story,finishBy); + }else{ + if(CollectionUtils.isEmpty(develList)){ + this.testingStory(story); + }else if(!CollectionUtils.isEmpty(develList)){ + this.startStory(story); + }else if(!CollectionUtils.isEmpty(testList)){ + this.testingStory(story); + } + } + + }else if(type==TaskType.devel){ + // 开发 + List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) + .eq(ZtTask::getType, type.getCode())); + if(!CollectionUtils.isEmpty(taskList)){ + this.startStory(story); + }else{ + long done = taskService.count(new QueryWrapper().lambda().eq(ZtTask::getStory, story) + .in(ZtTask::getStatus, Arrays.asList("done"))); + if(done<1){ + + }else{ + this.finishStory(story,finishBy); + } + } + } } +// @Override +// public void taskFinishChangeStatus(Integer story, String finishBy,TaskType type) { +// if(story==null||story==0){ +// return; +// } +// ZtStory ztStory = this.baseMapper.selectById(story); +// +// List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) +// .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) +// .eq(ZtTask::getType, "devel")); +// //如果开发有任务 并且状态需要变为开发中 +// if(!CollectionUtils.isEmpty(taskList)&&Arrays.asList( "wait", "projected", "developing").contains(ztStory.getStage())){ +// //如果测试已经开始 那么测试进行中 +// List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) +// .in(ZtTask::getStatus, Arrays.asList( "doing", "done")) +// .eq(ZtTask::getType, "test")); +// if(!CollectionUtils.isEmpty(testList)){ +// //测试任务已经开始 +// this.testingStory(story); +// }else{ +// this.startStory(story); +// } +// } +// +// //如果开发中任务没有了 +// if(CollectionUtils.isEmpty(taskList)){ +// +// List testList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, story) +// .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause","done")) +// .eq(ZtTask::getType, "test")); +// //如果测试中有任务 +// Long waitCount = testList.stream().filter(o -> Arrays.asList("wait").contains(o.getStatus())).count(); +// +// if(!CollectionUtils.isEmpty(testList)&&waitCount.intValue()!=testList.size()){ +// Long doneCount = testList.stream().filter(o -> Arrays.asList("done").contains(o.getStatus())).count(); +// if(doneCount.intValue()==testList.size()){ +// testedStory(story,finishBy); +// }else{ +// this.testingStory(story); +// } +// }else{ +// //如果开发任务没有了 并且测试还没开始 +// this.finishStory(story,finishBy); +// } +// } +// } @Override @@ -1288,9 +1469,6 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); } - if (!Arrays.asList("wait", "projected", "developing", "developed").contains(ztStory.getStage())) { - return; - } if ("closed".equals(ztStory.getStatus())) { throw new BusinessException("当前已关闭"); } @@ -1667,7 +1845,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } this.closeTaskBug(ztStory.getId()); - + if(ztStory.getUserStory()!=null&&ztStory.getUserStory()!=0){ + storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.YWC); +// storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.CFM); + } } //指派 @@ -1773,17 +1954,18 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (revieweResult == 1) { status = ActionStatus.YSTG; //如果研发需求验收完毕 那么用户需求也需要变更 - if (ztStory.getUserStory() != null && ztStory.getUserStory() != 0) { - List storyList = this.baseMapper.selectList(new QueryWrapper().lambda() - .ne(ZtStory::getId, ztStory.getId()) - .in(ZtStory::getStage, "wait", "projected", "developing", "developed", "testing", "tested", "released") - .eq(ZtStory::getUserStory, ztStory.getUserStory())); - if (CollectionUtils.isEmpty(storyList)) { - ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStory.getUserStory()); - ztStoryUser.setStatus("finished"); - this.storyUserService.updateById(ztStoryUser); - } - } +// if (ztStory.getUserStory() != null && ztStory.getUserStory() != 0) { +// List storyList = this.baseMapper.selectList(new QueryWrapper().lambda() +// .ne(ZtStory::getId, ztStory.getId()) +// .in(ZtStory::getStage, "wait", "projected", "developing", "developed", "testing", "tested", "released") +// .eq(ZtStory::getUserStory, ztStory.getUserStory())); +// if (CollectionUtils.isEmpty(storyList)) { +// ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStory.getUserStory()); +// +// ztStoryUser.setStatus(UserStoryEnums.YWC.getCode()); +// this.storyUserService.updateById(ztStoryUser); +// } +// } ztStory.setStatus("finished"); } else { status = ActionStatus.YSBTG; @@ -1794,9 +1976,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (revieweResult == 1 && ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { this.storyFeedbackService.ysFeedback(ztStory.getFeedback()); } + if(ztStory.getStatus().equals("finished")){ + storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.YWC); - - + } //添加action actionService.addAction(ActionType.XQ, status, ztStory.getId(), ztStory.getProduct() + "", null, null, RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo()); @@ -2184,5 +2367,4 @@ public class ZtStoryServiceImpl extends ServiceImpl impl return oldPStatus; } - } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java index 2f39407..3ce5352 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java @@ -86,7 +86,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl> storyUserMap = getStoryUserMap(Arrays.asList(dto)); List ztStories = storyUserMap.get(d.getId()); if(!CollectionUtils.isEmpty(ztStories)){ @@ -389,13 +391,18 @@ public class ZtStoryUserServiceImpl extends ServiceImpl> rMap = getReviewMap(Arrays.asList(dto)); - if(!StringUtils.isEmpty(d.getReviewedby())){ - String[] split = d.getReviewedby().split(","); + if(!StringUtils.isEmpty(dto.getReviewedby())){ + String[] split = dto.getReviewedby().split(","); StringBuilder b=new StringBuilder(); - for (String s:split) { - ZtUser u = userMap.get(s); + for ( int i =0 ;istatus.getIndex()){ + return; + } if(status==UserStoryEnums.UNCFM){ List list = storyUserTaskService.list(new QueryWrapper().lambda().eq(ZtStoryUserTask::getUserStoryId, id)); if(list.size()>1){ @@ -506,18 +520,83 @@ public class ZtStoryUserServiceImpl extends ServiceImpl activeList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) + .in(ZtStory::getStatus, "active") + ); + if(CollectionUtils.isEmpty(activeList)||storyUser.getStatus().equals(UserStoryEnums.KFZ.getCode())){ + return; + } + + }else if(status==UserStoryEnums.CFM){ +// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified + List activeList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) + .eq(ZtStory::getStatus, "active") + .in(ZtStory::getStage,"wait","projected","developing","developed","testing","tested","released","verified") + ); + if(!CollectionUtils.isEmpty(activeList)){ + return; + } + }else if(status==UserStoryEnums.YWC){ +// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified + List activeList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) + .eq(ZtStory::getStatus, "active") + .in(ZtStory::getStage,"wait","projected","developing","developed","testing","tested","verified","released") + ); + //如果完成先查看相关需求是否以全部完成 + if(!CollectionUtils.isEmpty(activeList)){ + return; + }else{ + List finishList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) + .eq(ZtStory::getStatus, "finished") + ); + //如果没有进行中 那么查询是否有完成的研发需求 + if(CollectionUtils.isEmpty(finishList)){ + return; + } + } + }else{ + return; + } + String oldStatus = storyUser.getStatus(); + storyUser.setOldStatus(oldStatus); + UserStoryEnums userStoryEnums = UserStoryEnums.transfer(oldStatus); + + + storyUser.setStatus(status.getCode()); + storyUser.setLasteditedby(RiskUserThreadLocal.get().getName()); + storyUser.setLastediteddate(new Date()); + + this.baseMapper.updateById(storyUser); + actionService.addAction(ActionType.USERXQ, ActionStatus.ZTBG, id, storyUser.getProduct() + "", null, null, + RiskUserThreadLocal.get().getName(), userStoryEnums==null?"":userStoryEnums.getValue() +" 变更 "+status.getValue(), ""); + } + //明确需求 需要有交付物 @Override @Transactional @@ -559,7 +638,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl @@ -80,6 +80,8 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl userMap = userService.userMapByIds(null); + List storyUsers = this.storyUserService.listByIds(list.stream().map(o -> o.getUserStoryId()).collect(Collectors.toList())); + for (ZtStoryUserTaskDTO d:list) { ZtUser ztUser = userMap.get(d.getOpenedby()); if(ztUser!=null){ @@ -105,6 +107,13 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl sList = storyUsers.stream().filter(o -> o.getId().intValue() == d.getUserStoryId().intValue()).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(sList)){ + d.setUserStoryName(sList.get(0).getTitle()); + ZtStoryUserDTO dto=new ZtStoryUserDTO(); + BeanUtils.copyProperties(sList.get(0),dto); + d.setStoryUserInfo(dto); + } } } @@ -120,20 +129,32 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl hisList = this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtStoryUserTask::getType, type) + List hisList = this.baseMapper.selectList(new QueryWrapper().lambda() .eq(ZtStoryUserTask::getUserStoryId, dto.getUserStoryId()) - .in(ZtStoryUserTask::getStatus,"wait","doing","finished") + .in(ZtStoryUserTask::getStatus,"wait","doing") ); - if(!CollectionUtils.isEmpty(hisList)&&hisList.size()>1){ - throw new BusinessException("无法添加"); + if(!CollectionUtils.isEmpty(hisList)&&hisList.size()>0){ + throw new BusinessException("同时只允许建一个任务"); } if(type.equals("design")){ + if(UserStoryEnums.transfer(story.getStatus()).getIndex()> UserStoryEnums.XXSJZ.getIndex()){ + throw new BusinessException("当前状态无法添加"); + } //设计 this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.XXSJZ); + }else if(type.equals("improve")){ + + if(UserStoryEnums.transfer(story.getStatus()).getIndex()> UserStoryEnums.UNCFM.getIndex() + ){ + throw new BusinessException("当前状态无法添加"); + } //明确 this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.UNCFM); } @@ -143,13 +164,14 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl tasks = this.baseMapper.selectList(new QueryWrapper().lambda() + .eq(ZtStoryUserTask::getUserStoryId, id)); + if(!CollectionUtils.isEmpty(tasks)){ + for (ZtStoryUserTask t:tasks) { + //wait 未开始 doing 进行中 finished 完成 cancel取消 closed + if(Arrays.asList("wait","doing").contains(t.getStatus())){ + t.setStatus("cancel"); + t.setLastEditedDate(new Date()); + t.setLastEditedBy(RiskUserThreadLocal.get().getName()); + t.setCanceledby(RiskUserThreadLocal.get().getName()); + t.setCanceleddate(new Date()); + t.setClosedRemark("需求关闭"); + this.updateById(t); + + actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.GB, t.getId() + , t.getProduct().toString(), null, null, + RiskUserThreadLocal.get().getName(),"", null); + } + } + } + } + } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java index 2f54894..b5b0d47 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java @@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.KanBanConstant; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -149,29 +150,6 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTaskDTO.setApprovalRemark(dto.getApprovalRemark()); BeanUtils.copyProperties(t,ztTaskDTO); this.approval(ztTaskDTO); -// -// if (dto.getApprovalStatus() == 1) { -// t.setStatus("wait"); -// } else { -// t.setStatus("closed"); -// } -// -// t.setApprovalRemark(dto.getApprovalRemark()); -// t.setLastediteddate(new Date()); -// t.setLasteditedby(RiskUserThreadLocal.get().getName()); -// this.baseMapper.updateById(t); -// -// -// ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, t.getProject())); -// -// -// if (dto.getApprovalStatus() == 1) { -// actionService.addAction(ActionType.RW, ActionStatus.PSTG, t.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), t.getExecution(), -// RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null); -// } else if (dto.getApprovalStatus() == 2) { -// actionService.addAction(ActionType.RW, ActionStatus.PSBTG, t.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), t.getExecution(), -// RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null); -// } } } @@ -427,7 +405,6 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setOpeneddate(new Date()); ztTask.setEstimate(dto.getLeft()); - //getExecution()执行 //项目 Integer story = ztTask.getStory(); @@ -472,6 +449,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } else { ztTask.setStatus("wait"); ztTask.setReviewingUser(null); + } } @@ -497,6 +475,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } this.baseMapper.insert(ztTask); + if("wait".equals(ztTask.getStatus())){ + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false); + } fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task); if (ztTask.getExecution() != null && ztTask.getExecution() != 0) { @@ -530,6 +511,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if (ztTask == null) { throw new BusinessException("未查询到数据"); } + Integer s1 = ztTask.getStory(); + Integer s2 = dto.getStory(); + + //cancel取消 closed 关闭 done if(Arrays.asList("cancel","closed","done").contains(ztTask.getStatus())){ throw new BusinessException("当前无法编辑"); @@ -589,6 +574,16 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } this.baseMapper.updateById(ztTask); + if(ObjectUtils.notEqual(s1,s2)){ + if(s1!=null&&s1.intValue()!=0){ + this.storyService.taskFinishChangeStatus(s1,null,TaskType.transferType(ztTask.getType()),true); + } + if(s2!=null&&s2.intValue()!=0){ + this.storyService.taskFinishChangeStatus(s2,null,TaskType.transferType(ztTask.getType()),false); + } + + } + fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task); @@ -704,24 +699,24 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme kanbanlaneService.changeStatus(qo); } } - if ("devel".equals(ztTask.getType())) { +// if ("devel".equals(ztTask.getType())) { //处理需求 - - if ("done".equals(ztTask.getStatus())) { - this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); - } else if ("doing".equals(ztTask.getStatus())) { - this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); - } - } - if ("test".equals(ztTask.getType())) { - //处理需求 - if ("done".equals(ztTask.getStatus())) { - this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); - } else if ("doing".equals(ztTask.getStatus())) { - this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); - } - - } + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false); +// if ("done".equals(ztTask.getStatus())) { +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.devel,false); +// } else if ("doing".equals(ztTask.getStatus())) { +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.devel,false); +// } +// } +// if ("test".equals(ztTask.getType())) { +// //处理需求 +// if ("done".equals(ztTask.getStatus())) { +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test); +// } else if ("doing".equals(ztTask.getStatus())) { +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test); +// } +// +// } Integer execution = ztTask.getExecution(); @@ -733,13 +728,13 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if (dto.getFinishedFlag() == 1) { String type = ztTask.getType(); if (ztTask.getStory() != null && ztTask.getStory() != 0) { - if ("test".equals(type)) { - this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); - } else if ("devel".equals(type)) { - //开发 - this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); - } - +// if ("test".equals(type)) { +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test); +// } else if ("devel".equals(type)) { +// //开发 +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test); +// } + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(type),false); } } @@ -816,12 +811,13 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme // devel 开发 request 需求 test String type = ztTask.getType(); if (ztTask.getStory() != null && ztTask.getStory() != 0) { - if ("test".equals(type)) { - this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy); - } else if ("devel".equals(type)) { - //开发 - this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy); - } + this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.transferType(type),false); +// if ("test".equals(type)) { +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.test); +// } else if ("devel".equals(type)) { +// //开发 +// this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.devel); +// } } if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){ this.storyFeedbackService.feedbackFinished(ztTask.getFeedback()); @@ -860,6 +856,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme kanbanlaneService.changeStatus(qo); } } + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),true); } @@ -904,10 +901,11 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } } if(ztTask.getStory()!=null&&ztTask.getStory()!=0){ - this.storyService.finishStory(ztTask.getStory(),null); + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),true); } + } @@ -978,6 +976,14 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme this.saveBatch(saveList); + for (ZtTask ztTask:saveList) { + if(!ztTask.getStatus().equals("reviewing")){ + this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false); + } + } + + + List develList = list.stream().filter(o -> o.getType().equals(TaskType.devel.getCode())).collect(Collectors.toList()); kanbanlaneService.addTask(list.get(0).getExecution(), saveList); ZtStory story = storyService.getById(list.get(0).getStory()); @@ -1031,15 +1037,18 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme t.setLasteditedby(RiskUserThreadLocal.get().getName()); ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, t.getProject())); - + this.baseMapper.updateById(t); if (dto.getApprovalStatus() == 1) { + this.storyService.taskFinishChangeStatus(t.getStory(),t.getAssignedTo(),TaskType.transferType(t.getType()),false); actionService.addAction(ActionType.RW, ActionStatus.PSTG, t.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), t.getExecution(), RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null); + } else { actionService.addAction(ActionType.RW, ActionStatus.PSBTG, t.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), t.getExecution(), RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null); } - this.baseMapper.updateById(t); + + if (dto.getApprovalStatus() == 1) { if(t.getFinishedFlag()!=null&&t.getFinishedFlag()==1){ dto.setConsumed(t.getEstimate()); diff --git a/src/main/java/com/sa/zentao/utils/SendEmail.java b/src/main/java/com/sa/zentao/utils/SendEmail.java index afe498c..4f8e77a 100644 --- a/src/main/java/com/sa/zentao/utils/SendEmail.java +++ b/src/main/java/com/sa/zentao/utils/SendEmail.java @@ -23,7 +23,10 @@ import java.util.Properties; public class SendEmail { - public static void sendMail(String mail, String content) { + public static void sendMail(String mail, String content,String title) { + if(StringUtils.isEmpty(title)){ + title="运维提醒"; + } String host = "smtp.qiye.163.com"; String port = "587"; String username = "sino-employee@sino-assistance.com"; @@ -44,7 +47,7 @@ public class SendEmail { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(username)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(mail)); - message.setSubject("运维提醒", "GBK"); + message.setSubject(title, "GBK"); Multipart multipart = new MimeMultipart(); @@ -229,6 +232,6 @@ public class SendEmail { // String str="4468058@qq.com;294438420@qq.com;"; // sendMessage(Arrays.asList(str.split(";")),Arrays.asList(""),"22"); - sendMail("4468058@qq.com","123"); +// sendMail("4468058@qq.com","123"); } } \ No newline at end of file diff --git a/src/main/resources/mapper/ZtBugMapper.xml b/src/main/resources/mapper/ZtBugMapper.xml index b87f0f7..13915e0 100644 --- a/src/main/resources/mapper/ZtBugMapper.xml +++ b/src/main/resources/mapper/ZtBugMapper.xml @@ -85,6 +85,10 @@ and severity = #{qo.severity} + + and status = #{qo.status} + + and pri = #{qo.pri} diff --git a/src/main/resources/mapper/ZtProjectMapper.xml b/src/main/resources/mapper/ZtProjectMapper.xml index b7ec87b..e175d7f 100644 --- a/src/main/resources/mapper/ZtProjectMapper.xml +++ b/src/main/resources/mapper/ZtProjectMapper.xml @@ -224,11 +224,11 @@