用户需求相关

This commit is contained in:
2025-04-02 09:03:34 +08:00
parent c00e5776e8
commit 1e46e7bea0
30 changed files with 770 additions and 305 deletions

View File

@ -46,7 +46,7 @@ public class DevopsRunner implements Runnable{
List<ZtCronDevopsUser> list = cronDevopsUserService.list(new QueryWrapper<ZtCronDevopsUser>().lambda().eq(ZtCronDevopsUser::getDevopsId, d.getId())); List<ZtCronDevopsUser> list = cronDevopsUserService.list(new QueryWrapper<ZtCronDevopsUser>().lambda().eq(ZtCronDevopsUser::getDevopsId, d.getId()));
if(!CollectionUtils.isEmpty(list)){ if(!CollectionUtils.isEmpty(list)){
for (ZtCronDevopsUser u:list) { for (ZtCronDevopsUser u:list) {
SendEmail.sendMail(u.getMail(),"尊敬的"+u.getUsername()+d.getContent()); SendEmail.sendMail(u.getMail(),"尊敬的"+u.getUsername()+d.getContent(),null);
} }
} }

View File

@ -79,6 +79,7 @@ public class ParamOutAspect {
Object proceed=null; Object proceed=null;
try { try {
proceed = joinPoint.proceed(); proceed = joinPoint.proceed();
}catch (Exception e){ }catch (Exception e){
log.error("",e); log.error("",e);
throw new BusinessException(e.getMessage()); 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; return proceed;
} }

View File

@ -94,7 +94,7 @@ public class ZtReleaseController {
return Result.success(); return Result.success();
} }
//发布
@RequestMapping(value = "/release", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @RequestMapping(value = "/release", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result release(@RequestBody ZtReleaseQo dto){ public Result release(@RequestBody ZtReleaseQo dto){
releaseService.release(dto); releaseService.release(dto);

View File

@ -1,15 +1,18 @@
package com.sa.zentao.controller; package com.sa.zentao.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.Result; import com.sa.zentao.dao.Result;
import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.dao.ZtStoryUserDTO; import com.sa.zentao.dao.ZtStoryUserDTO;
import com.sa.zentao.entity.ZtStoryUser; import com.sa.zentao.entity.ZtStoryUser;
import com.sa.zentao.enums.UserStoryEnums;
import com.sa.zentao.qo.StoryQo; import com.sa.zentao.qo.StoryQo;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.IZtStoryUserService; import com.sa.zentao.service.IZtStoryUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@ -71,10 +74,15 @@ public class ZtStoryUserController {
@RequestMapping(value = "/storyList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @RequestMapping(value = "/storyList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result storyList(@RequestBody StoryQo qo){ public Result storyList(@RequestBody StoryQo qo){
LambdaQueryWrapper<ZtStoryUser> eq = new QueryWrapper<ZtStoryUser>()
List<ZtStoryUser> list = storyUserService.list(new QueryWrapper<ZtStoryUser>() .lambda().eq(ZtStoryUser::getProduct, qo.getId())
.lambda().eq(ZtStoryUser::getProduct,qo.getId()).in(ZtStoryUser::getStatus, "wait","active") .orderByDesc(ZtStoryUser::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<ZtStoryUser> list = storyUserService.list(eq
); );
return Result.success(list); return Result.success(list);
} }

View File

@ -62,6 +62,12 @@ public class ZtStoryUserTaskController {
return Result.success(); 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") @RequestMapping(value = "/getUserStoryTaskById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getUserStoryTaskById(@RequestBody ZtProjectQo qo){ public Result getUserStoryTaskById(@RequestBody ZtProjectQo qo){
return Result.success(storyUserTaskService.getUserStoryTaskById(qo)); return Result.success(storyUserTaskService.getUserStoryTaskById(qo));
@ -73,6 +79,10 @@ public class ZtStoryUserTaskController {
return Result.success(); 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();
}
} }

View File

@ -309,15 +309,15 @@ public class ZtTaskController {
} }
List<ZtStoryspec> listSpec = storyspecService.getPrdById(oldStory.getId()); List<ZtStoryspec> listSpec = storyspecService.getPrdById(oldStory.getId());
ZtStory newStory = storyService.getById(oldStory.getId()); // ZtStory newStory = storyService.getById(oldStory.getId());
if(newStory!=null){ // if(newStory!=null){
continue; // continue;
} // }
if(!CollectionUtils.isEmpty(listSpec)){ // if(!CollectionUtils.isEmpty(listSpec)){
ZtStoryspec ztStoryspec = listSpec.get(0); // ZtStoryspec ztStoryspec = listSpec.get(0);
ztStoryspec.setFiles(null); // ztStoryspec.setFiles(null);
storyspecService.save(ztStoryspec); // storyspecService.save(ztStoryspec);
} // }
List<String> userList=new ArrayList(); List<String> userList=new ArrayList();
@ -409,10 +409,10 @@ public class ZtTaskController {
//创建新的需求 //创建新的需求
oldStory.setProduct(product); // oldStory.setProduct(product);
oldStory.setStage("wait"); // oldStory.setStage("wait");
oldStory.setStatus("active"); // oldStory.setStatus("active");
storyService.save(oldStory); // storyService.save(oldStory);
//项目关联需求 //项目关联需求
ZtProjectDTO dto=new ZtProjectDTO(); ZtProjectDTO dto=new ZtProjectDTO();
dto.setStoryIds(new ArrayList<>(){ dto.setStoryIds(new ArrayList<>(){
@ -421,7 +421,12 @@ public class ZtTaskController {
} }
}); });
dto.setProject(project); dto.setProject(project);
try {
this.projectService.projectSyncStory(dto); this.projectService.projectSyncStory(dto);
}catch (Exception e){
log.error("",e);
}
for (ZtProjectstory st:oldPStoryList) { for (ZtProjectstory st:oldPStoryList) {
ZtProjectDTO pro = this.projectService.selectPrdById(st.getProject()); ZtProjectDTO pro = this.projectService.selectPrdById(st.getProject());
@ -432,7 +437,12 @@ public class ZtTaskController {
if(!CollectionUtils.isEmpty(newExec)){ if(!CollectionUtils.isEmpty(newExec)){
ZtProject project1 = newExec.get(0); ZtProject project1 = newExec.get(0);
dto.setExcludeId(project1.getId()); dto.setExcludeId(project1.getId());
try {
this.projectService.executionSyncStory(dto); this.projectService.executionSyncStory(dto);
}catch (Exception e){
}
} }
} }

View File

@ -103,6 +103,8 @@ public class ZtUserController {
return Result.success(new ArrayList<>()); return Result.success(new ArrayList<>());
} }
eq.in(ZtUser::getAccount,execution.stream().map(o->o.getAccount()).collect(Collectors.toList())); eq.in(ZtUser::getAccount,execution.stream().map(o->o.getAccount()).collect(Collectors.toList()));
}else{
this.userMapper.selectOne(new QueryWrapper<ZtUser>().lambda().eq(ZtUser::getAccount,RiskUserThreadLocal.get().getName()));
} }
return Result.success(userService.list(eq return Result.success(userService.list(eq

View File

@ -119,4 +119,5 @@ public class ZtStoryUserTaskDTO implements Serializable {
private String status; private String status;
private String desc;
} }

View File

@ -56,6 +56,7 @@ public class ZtRelease implements Serializable {
private String mailto; private String mailto;
private String notify; private String notify;
//active 激活
//reviewing待评审 //reviewing待评审
//waitRelease 待发布 //waitRelease 待发布
//released 发不成功 //released 发不成功

View File

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

View File

@ -202,4 +202,6 @@ public class ZtStoryUser implements Serializable {
private Date psDate; private Date psDate;
private String deliverRemark; private String deliverRemark;
private String oldStatus;
} }

View File

@ -4,30 +4,32 @@ import com.baomidou.mybatisplus.annotation.EnumValue;
public enum UserStoryEnums { public enum UserStoryEnums {
DPS("reviewing", "待评审"), DPS("reviewing", "待评审",0),
CG("draft", "草稿"), CG("draft", "草稿",1),
JH("active", "激活"), JH("active", "激活",2),
UNCFM("unconfirmed", "产品确认中"), UNCFM("unconfirmed", "产品确认中",3),
DGT("waitcommunicate", "待沟通"), DGT("waitcommunicate", "待沟通",4),
DSJ("waitdesign","需求待设计"), DSJ("waitdesign","需求待设计",5),
XXSJZ("designdoing","详细设计中"), XXSJZ("designdoing","详细设计中",6),
CPYSJ("designdone","产品已设计"), CPYSJ("designdone","产品已设计",7),
//待确认 //待确认
DQR("storyunconfirmed","需求待确认"), DQR("storyunconfirmed","需求待确认",8),
CFM("confirmed","需求已确认"), CFM("confirmed","需求已确认",9),
KFZ("developing","研发中"), KFZ("developing","研发中",10),
YWC("finished","已完成"), YWC("finished","已完成",11),
CLOSED("closed","已关闭"), CLOSED("closed","已关闭",12),
; ;
@EnumValue @EnumValue
private String code; private String code;
private String value; private String value;
private Integer index;
private UserStoryEnums(String code, String value) { private UserStoryEnums(String code, String value,Integer index) {
this.code = code; this.code = code;
this.value = value; this.value = value;
this.index = index;
} }
public static UserStoryEnums transfer(String code){ public static UserStoryEnums transfer(String code){
@ -48,4 +50,8 @@ public enum UserStoryEnums {
return this.value; return this.value;
} }
public Integer getIndex(){
return index;
}
} }

View File

@ -23,6 +23,8 @@ public class StoryQo extends BaseQo {
private String status; private String status;
private List<Integer> productIds; private List<Integer> productIds;
private List<String> statusList;
private String ids; private String ids;
private List<String> storyIds; private List<String> storyIds;

View File

@ -6,6 +6,7 @@ import com.sa.zentao.dao.ZtStoryUserDTO;
import com.sa.zentao.entity.ZtProject; import com.sa.zentao.entity.ZtProject;
import com.sa.zentao.entity.ZtStory; import com.sa.zentao.entity.ZtStory;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.enums.TaskType;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -46,7 +47,8 @@ public interface IZtStoryService extends IService<ZtStory> {
PageInfo<ZtStoryDTO> projectStoryPageList(ZtProjectQo qo); PageInfo<ZtStoryDTO> projectStoryPageList(ZtProjectQo qo);
List<ZtStoryDTO> storyNoSyncProject(ZtProjectQo qo); List<ZtStoryDTO> storyNoSyncProject(ZtProjectQo qo);
//未开始
void waitStory(Integer story);
void startStory(Integer story); void startStory(Integer story);
//开发完成 //开发完成
void finishStory(Integer story,String finishBy); void finishStory(Integer story,String finishBy);
@ -57,7 +59,7 @@ public interface IZtStoryService extends IService<ZtStory> {
//发布 //发布
void releaseStory(Integer story); void releaseStory(Integer story);
void taskFinishChangeStatus(Integer story,String finishBy); void taskFinishChangeStatus(Integer story, String finishBy, TaskType type,Boolean cancelFlag);
void changeStatus(ZtStoryDTO dto); void changeStatus(ZtStoryDTO dto);

View File

@ -44,6 +44,8 @@ public interface IZtStoryUserService extends IService<ZtStoryUser> {
void changeStatus(Integer id, UserStoryEnums status); void changeStatus(Integer id, UserStoryEnums status);
void storyFinishedChangeStatus(Integer id, UserStoryEnums status);
void improveStory(ZtStoryUserDTO dto); void improveStory(ZtStoryUserDTO dto);
void confirmStory(ZtStoryUserDTO dto); void confirmStory(ZtStoryUserDTO dto);

View File

@ -31,4 +31,10 @@ public interface IZtStoryUserTaskService extends IService<ZtStoryUserTask> {
void finishedTask(ZtStoryUserTaskDTO dto); void finishedTask(ZtStoryUserTaskDTO dto);
ZtStoryUserTaskDTO getUserStoryTaskById(ZtProjectQo qo); ZtStoryUserTaskDTO getUserStoryTaskById(ZtProjectQo qo);
void addRemark(ZtStoryUserTaskDTO dto);
void assignedTo(ZtStoryUserTaskDTO dto);
void closedAll(Integer id);
} }

View File

@ -17,10 +17,7 @@ import com.sa.zentao.conf.LoginRiskUser;
import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*; import com.sa.zentao.dao.*;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ProjectTypeEnums; import com.sa.zentao.enums.*;
import com.sa.zentao.enums.TaskStatus;
import com.sa.zentao.enums.TaskType;
import com.sa.zentao.enums.UserType;
import com.sa.zentao.qo.ZtCountQo; import com.sa.zentao.qo.ZtCountQo;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.qo.ZtUserQo; import com.sa.zentao.qo.ZtUserQo;
@ -310,7 +307,8 @@ public class IZtCountService {
}else{ }else{
list = this.productService.listByIds(pIds); list = this.productService.listByIds(pIds);
storyUsers =CollectionUtils.isEmpty(list)?new ArrayList<>(): this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda() storyUsers =CollectionUtils.isEmpty(list)?new ArrayList<>(): this.storyUserService.list(new QueryWrapper<ZtStoryUser>().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())) .in(ZtStoryUser::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList()))
// .eq(ZtStoryUser::getAssignedto,loginRiskUser.getName()) // .eq(ZtStoryUser::getAssignedto,loginRiskUser.getName())
.eq(ZtStoryUser::getOpenedby,loginRiskUser.getName()) .eq(ZtStoryUser::getOpenedby,loginRiskUser.getName())
@ -391,7 +389,7 @@ public class IZtCountService {
List<ZtProduct> pList = this.productService.list(new QueryWrapper<ZtProduct>().lambda().in(ZtProduct::getProgram, pIds)); List<ZtProduct> pList = this.productService.listByIds(pIds);
List<ZtStoryUser> storyUsers = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda() List<ZtStoryUser> storyUsers = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda()
.in(ZtStoryUser::getStatus, "active", "reviewing") .in(ZtStoryUser::getStatus, "active", "reviewing")

View File

@ -108,7 +108,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
result = this.baseMapper.bugPageList(qo); result = this.baseMapper.bugPageList(qo);
}else if("execution".equals(qo.getSource())){ }else if("execution".equals(qo.getSource())){
qo.setExecution(qo.getProject().toString()); qo.setExecution(qo.getExecution().toString());
qo.setProject(null); qo.setProject(null);
result = this.baseMapper.bugPageList(qo); result = this.baseMapper.bugPageList(qo);
}else if("project".equals(qo.getSource())){ }else if("project".equals(qo.getSource())){

View File

@ -1206,10 +1206,15 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
// 任务 T3 T4 // 任务 T3 T4
List<ZtProject> ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())); List<ZtProject> ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()));
ztProjects = ztProjects.stream().filter(o -> ztProjects = ztProjects.stream().filter(o ->
(firstDayOfMonth.getTime() >= o.getBegin().getTime() && lastDayOfMonth.getTime() > o.getEnd().getTime()) || (o.getBegin().getTime() >= firstDayOfMonth.getTime()
(firstDayOfMonth.getTime() <= o.getBegin().getTime() && lastDayOfMonth.getTime() >= o.getEnd().getTime()) || && o.getEnd().getTime() <= lastDayOfMonth.getTime()) || (
(firstDayOfMonth.getTime() <= o.getBegin().getTime() && lastDayOfMonth.getTime() <= o.getEnd().getTime()) o.getEnd().getTime() >= firstDayOfMonth.getTime()
&& o.getEnd().getTime() <= lastDayOfMonth.getTime()
)
).collect(Collectors.toList()); ).collect(Collectors.toList());
if (CollectionUtils.isEmpty(ztProjects)) { if (CollectionUtils.isEmpty(ztProjects)) {
return map; return map;
} }
@ -1725,9 +1730,19 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
if (CollectionUtils.isEmpty(ztProjects)) { if (CollectionUtils.isEmpty(ztProjects)) {
return new PageInfo<>(); return new PageInfo<>();
} }
List<Integer> 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<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution") List<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution")
.in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); .in(ZtTeam::getRoot, execFilterList));
List<String> accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); List<String> accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(accountIds)) { if (CollectionUtils.isEmpty(accountIds)) {

View File

@ -103,6 +103,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
if(!CollectionUtils.isEmpty(sList)){ if(!CollectionUtils.isEmpty(sList)){
List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda() List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
.ne(ZtReleaseDetails::getStatus,"closed") .ne(ZtReleaseDetails::getStatus,"closed")
.eq(ZtReleaseDetails::getObjectType,"story")
.in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList()))); .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()); List<Integer> sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList());

View File

@ -60,6 +60,17 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
@Autowired @Autowired
private IZtFileService fileService; private IZtFileService fileService;
@Autowired
private CommonsController commonsController;
@Autowired
private VxService vxService;
@Autowired
private IZtProjectService projectService;
@Autowired
private IZtProductService productService;
@Override @Override
public PageInfo<ZtStoryFeedbackDTO> pageList(ZtProjectQo qo) { public PageInfo<ZtStoryFeedbackDTO> pageList(ZtProjectQo qo) {
@ -105,8 +116,6 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
return ztStories.stream().collect(Collectors.toMap(ZtStory::getId, o -> o)); return ztStories.stream().collect(Collectors.toMap(ZtStory::getId, o -> o));
} }
@Autowired
private CommonsController commonsController;
@Override @Override
@Transactional @Transactional
@ -177,8 +186,7 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
RiskUserThreadLocal.get().getName(), null, ""); RiskUserThreadLocal.get().getName(), null, "");
} }
@Autowired
private VxService vxService;
@Override @Override
public void changeStatus(ZtStoryFeedbackDTO dto) { public void changeStatus(ZtStoryFeedbackDTO dto) {
@ -248,10 +256,6 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStoryFeedback.getAssignedTo()); RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStoryFeedback.getAssignedTo());
} }
@Autowired
private IZtProjectService projectService;
@Autowired
private IZtProductService productService;
@Override @Override
public List<ZtStoryFeedbackDTO> ztStoryFeedbackDTO(ZtProjectQo qo) { public List<ZtStoryFeedbackDTO> ztStoryFeedbackDTO(ZtProjectQo qo) {
@ -437,7 +441,9 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
ztStoryFeedback.setCloseDate(new Date()); ztStoryFeedback.setCloseDate(new Date());
ztStoryFeedback.setClosedBy(RiskUserThreadLocal.get().getName()); ztStoryFeedback.setClosedBy(RiskUserThreadLocal.get().getName());
this.baseMapper.updateById(ztStoryFeedback); this.baseMapper.updateById(ztStoryFeedback);
//添加action
actionService.addAction(ActionType.WTFK, ActionStatus.GB, ztStoryFeedback.getId(), ztStoryFeedback.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getCloseRemark(), null);
} }
@Override @Override
@ -549,6 +555,13 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
} }
ztStoryFeedback.setStatus("submitVerified"); ztStoryFeedback.setStatus("submitVerified");
this.baseMapper.updateById(ztStoryFeedback); this.baseMapper.updateById(ztStoryFeedback);
if (!org.apache.commons.lang3.StringUtils.isEmpty(ztStoryFeedback.getOpenSource()) && ztStoryFeedback.getOpenSource().equals("weixin")) {
StringBuilder b = new StringBuilder();
b.append("您反馈的").append(ztStoryFeedback.getName()).append(" 的问题已提交验收,请及时登陆系统验收。");
vxService.sendMessageToVx(ztStoryFeedback.getWeixin(), b.toString(), new Date());
}
actionService.addAction(ActionType.WTFK, ActionStatus.TJYS, ztStoryFeedback.getId(), ztStoryFeedback.getProduct() + "", null, null, actionService.addAction(ActionType.WTFK, ActionStatus.TJYS, ztStoryFeedback.getId(), ztStoryFeedback.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStoryFeedback.getAssignedTo()); RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStoryFeedback.getAssignedTo());
} }

View File

@ -21,6 +21,8 @@ import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil; import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.BeanCopyUtilCallBack; import com.sa.zentao.utils.BeanCopyUtilCallBack;
import com.sa.zentao.utils.SendEmail;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -198,23 +200,13 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (!storyFeedback.getStatus().equals("wait")) { if (!storyFeedback.getStatus().equals("wait")) {
throw new BusinessException("问题反馈已被处理"); 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) { if (dto.getUserStory() != null && dto.getUserStory() != 0) {
ZtStoryUser storyUser = storyUserService.getById(dto.getUserStory()); ZtStoryUser storyUser = storyUserService.getById(dto.getUserStory());
if (storyUser != null && "wait".equals(storyUser.getStatus())) { if(storyUser.getStatus().equals(UserStoryEnums.CFM.getCode())){
storyUser.setStatus("active"); storyUserService.storyFinishedChangeStatus(storyUser.getId(),UserStoryEnums.KFZ);
} else if (storyUser != null && "active".equals(storyUser.getStatus())) {
if (storyUser.getStatus().equals("active") && storyUser.getStage().equals("wait")) {
storyUser.setStage("projected");
} }
} }
storyUserService.updateById(storyUser);
}
actionService.addAction(ActionType.XQ, ActionStatus.XJ, s.getId(), "", dto.getProduct(), null, actionService.addAction(ActionType.XQ, ActionStatus.XJ, s.getId(), "", dto.getProduct(), null,
RiskUserThreadLocal.get().getName(), "", ""); RiskUserThreadLocal.get().getName(), "", "");
@ -286,8 +278,8 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if(ztStoryUser==null){ if(ztStoryUser==null){
throw new BusinessException("未查询到用户需求"); throw new BusinessException("未查询到用户需求");
} }
if(UserStoryEnums.transfer(ztStoryUser.getStatus())!=UserStoryEnums.CFM ){ if(!Arrays.asList(UserStoryEnums.CFM.getCode(),UserStoryEnums.KFZ.getCode()).contains(ztStoryUser.getStatus())){
throw new BusinessException("无法关联未确认的需求"); throw new BusinessException("用户需求无法关联请检查");
} }
} }
ZtStory s = new ZtStory(); ZtStory s = new ZtStory();
@ -494,7 +486,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
executionUnBindStory(storyId, execList.stream().map(o -> o.getProject()).collect(Collectors.toList())); 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"); BeanUtils.copyProperties(dto, ztStory, "stage");
if ("draft".equalsIgnoreCase(ztStory.getStatus())) { if ("draft".equalsIgnoreCase(ztStory.getStatus())) {
@ -539,6 +534,15 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
this.baseMapper.updateById(ztStory); 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); fileService.updateFile(dto.getFiles(), ztStory.getId(), FileTypes.story);
List<String> userViewId = dto.getUserViewId(); List<String> userViewId = dto.getUserViewId();
@ -935,6 +939,31 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new); 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<Integer> 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 @Override
@Transactional @Transactional
@ -948,15 +977,15 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
throw new BusinessException("需求当前已关闭"); throw new BusinessException("需求当前已关闭");
} }
List<String> stateList = Arrays.asList("wait", "projected"); // List<String> stateList = Arrays.asList("wait", "projected");
//
//
if ("active".equalsIgnoreCase(ztStory.getStatus())) { // if ("active".equalsIgnoreCase(ztStory.getStatus())) {
if (!stateList.contains(ztStory.getStage())) { // if (!stateList.contains(ztStory.getStage())) {
//已经开始 // //已经开始
return; // return;
} // }
} // }
ztStory.setStage("developing"); ztStory.setStage("developing");
ztStory.setStartDate(new Date()); ztStory.setStartDate(new Date());
@ -985,55 +1014,56 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ZtStory ztStory = this.baseMapper.selectById(id); ZtStory ztStory = this.baseMapper.selectById(id);
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.feedbackStart(ztStory.getFeedback());
}
if (ztStory == null) { if (ztStory == null) {
throw new BusinessException("未查询到需求"); throw new BusinessException("未查询到需求");
} }
List<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, id) if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
.in(ZtTask::getStatus, Arrays.asList("reviewing", "wait", "doing", "pause")) this.storyFeedbackService.feedbackStart(ztStory.getFeedback());
.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<ZtTask> list = taskService.list(new QueryWrapper<ZtTask>().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<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, "");
}
return;
}
if (Arrays.asList("wait").contains(ztStory.getStage()) && !CollectionUtils.isEmpty(taskList)) { // List<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, id)
this.taskFinishChangeStatus(id,null); // .in(ZtTask::getStatus, Arrays.asList("reviewing", "wait", "doing", "pause"))
return; // .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<ZtTask> list = taskService.list(new QueryWrapper<ZtTask>().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<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, "");
// }
// return;
// }
//
// if (Arrays.asList("wait").contains(ztStory.getStage()) && !CollectionUtils.isEmpty(taskList)) {
// this.taskFinishChangeStatus(id,null);
// return;
// }
ztStory.setStage("developed"); ztStory.setStage("developed");
if (ztStory.getStartDate() == null) { if (ztStory.getStartDate() == null) {
@ -1175,6 +1205,25 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ztStory.setEndDate(new Date()); ztStory.setEndDate(new Date());
} }
this.baseMapper.updateById(ztStory); 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("<div>尊敬的{userName}</div>");
b.append("<div>您的需求 \"{id} {name}\"\"{id} {name}\"&nbsp;已发布,请及时登录系统验收。</div>");
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) { for (Integer execId : execIds) {
if (execId != null) { if (execId != null) {
@ -1202,77 +1251,209 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
actionService.addAction(ActionType.XQ, ActionStatus.FBCG, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execIds.get(0), actionService.addAction(ActionType.XQ, ActionStatus.FBCG, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), execIds.get(0),
RiskUserThreadLocal.get().getName(), null, ""); RiskUserThreadLocal.get().getName(), null, "");
} }
@Override @Override
public void taskFinishChangeStatus(Integer story, String finishBy) { public void taskFinishChangeStatus(Integer story, String finishBy,TaskType type,Boolean cancelFlag) {
if(type!=TaskType.test&&type!=TaskType.devel){
return;
}
if(story==null||story==0){ if(story==null||story==0){
return; return;
} }
ZtStory ztStory = this.baseMapper.selectById(story); if(cancelFlag&&type==TaskType.devel){
List<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
List<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause")) .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause"))
.eq(ZtTask::getType, "devel")); .eq(ZtTask::getType, type.getCode()));
//如果开发有任务 并且状态需要变为开发中 if(!CollectionUtils.isEmpty(develList)){
if(!CollectionUtils.isEmpty(taskList)&&Arrays.asList( "wait", "projected", "developing").contains(ztStory.getStage())){
//如果测试已经开始 那么测试进行中
List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().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); this.startStory(story);
} }else{
}
//如果开发中任务没有了
if(CollectionUtils.isEmpty(taskList)){
List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story) List<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause","done")) .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause"))
.eq(ZtTask::getType, "test")); .eq(ZtTask::getType, TaskType.test.getCode()));
//如果测试中有任务 if(!CollectionUtils.isEmpty(testList)){
Long waitCount = testList.stream().filter(o -> Arrays.asList("wait").contains(o.getStatus())).count(); testingStory(story);
}else{
List<ZtTask> doneList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "done")));
if(CollectionUtils.isEmpty(doneList)){
this.waitStory(story);
return;
}
if(!CollectionUtils.isEmpty(testList)&&waitCount.intValue()!=testList.size()){
Long doneCount = testList.stream().filter(o -> Arrays.asList("done").contains(o.getStatus())).count(); List<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
if(doneCount.intValue()==testList.size()){ .in(ZtTask::getStatus, Arrays.asList( "done"))
.eq(ZtTask::getType, TaskType.test.getCode()));
if(!CollectionUtils.isEmpty(testedList)){
testedStory(story,finishBy); testedStory(story,finishBy);
}else{ }else{
this.testingStory(story);
}
}else{
//如果开发任务没有了 并且测试还没开始
this.finishStory(story,finishBy); this.finishStory(story,finishBy);
} }
} }
// 如果有多个开发任务: }
// 1、其中有一个开发进行中并且所有测试任务未开始则【开发进行中】 return;
// 2、所有开发任务已完成并且所有测试任务未开始则【开发完成】 }
// 如果有多个测试任务 //测试任务取消
// 1、其中有一个测试进行中则【测试进行中】 if(cancelFlag&&type==TaskType.test){
// 2、所有测试任务已完成但还有一些开发任务没有结束则【测试进行中】 List<ZtTask> develing = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
// 3、所有测试任务已完成并且所有开发任务已完成则【测试完成】 .in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause"))
// ZtStory ztStory = this.baseMapper.selectById(story); .eq(ZtTask::getType, TaskType.devel.getCode()));
// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested if(!CollectionUtils.isEmpty(develing)){
// if(Arrays.asList("wait","projected","developing","developed").contains(ztStory.getStage())){ startStory(story);
// }else if(Arrays.asList("testing").contains(ztStory.getStage())){ return;
// this.testedStory(story,finishBy); }
List<ZtTask> testling = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> doneList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "done")));
if(CollectionUtils.isEmpty(doneList)){
this.waitStory(story);
return;
}
List<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> develedList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> testedList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
.in(ZtTask::getStatus, Arrays.asList( "wait", "doing", "pause"))
.eq(ZtTask::getType, type.getCode()));
List<ZtTask> develList = taskService.list(new QueryWrapper<ZtTask>().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); if(CollectionUtils.isEmpty(develList)&&CollectionUtils.isEmpty(testList)){
// //测试中 long done = taskService.count(new QueryWrapper<ZtTask>().lambda().eq(ZtTask::getStory, story)
// void testingStory(Integer story); .eq(ZtTask::getType,type.getCode())
// //发布 .in(ZtTask::getStatus, Arrays.asList("done")));
// void releaseStory(Integer story); 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<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask>().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<ZtTask> taskList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().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<ZtTask> testList = taskService.list(new QueryWrapper<ZtTask>().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 @Override
@ -1288,9 +1469,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); this.storyFeedbackService.feedbackStart(ztStory.getFeedback());
} }
if (!Arrays.asList("wait", "projected", "developing", "developed").contains(ztStory.getStage())) {
return;
}
if ("closed".equals(ztStory.getStatus())) { if ("closed".equals(ztStory.getStatus())) {
throw new BusinessException("当前已关闭"); throw new BusinessException("当前已关闭");
} }
@ -1667,7 +1845,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
} }
this.closeTaskBug(ztStory.getId()); 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<ZtStoryMapper, ZtStory> impl
if (revieweResult == 1) { if (revieweResult == 1) {
status = ActionStatus.YSTG; status = ActionStatus.YSTG;
//如果研发需求验收完毕 那么用户需求也需要变更 //如果研发需求验收完毕 那么用户需求也需要变更
if (ztStory.getUserStory() != null && ztStory.getUserStory() != 0) { // if (ztStory.getUserStory() != null && ztStory.getUserStory() != 0) {
List<ZtStory> storyList = this.baseMapper.selectList(new QueryWrapper<ZtStory>().lambda() // List<ZtStory> storyList = this.baseMapper.selectList(new QueryWrapper<ZtStory>().lambda()
.ne(ZtStory::getId, ztStory.getId()) // .ne(ZtStory::getId, ztStory.getId())
.in(ZtStory::getStage, "wait", "projected", "developing", "developed", "testing", "tested", "released") // .in(ZtStory::getStage, "wait", "projected", "developing", "developed", "testing", "tested", "released")
.eq(ZtStory::getUserStory, ztStory.getUserStory())); // .eq(ZtStory::getUserStory, ztStory.getUserStory()));
if (CollectionUtils.isEmpty(storyList)) { // if (CollectionUtils.isEmpty(storyList)) {
ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStory.getUserStory()); // ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStory.getUserStory());
ztStoryUser.setStatus("finished"); //
this.storyUserService.updateById(ztStoryUser); // ztStoryUser.setStatus(UserStoryEnums.YWC.getCode());
} // this.storyUserService.updateById(ztStoryUser);
} // }
// }
ztStory.setStatus("finished"); ztStory.setStatus("finished");
} else { } else {
status = ActionStatus.YSBTG; status = ActionStatus.YSBTG;
@ -1794,9 +1976,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (revieweResult == 1 && ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { if (revieweResult == 1 && ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.ysFeedback(ztStory.getFeedback()); this.storyFeedbackService.ysFeedback(ztStory.getFeedback());
} }
if(ztStory.getStatus().equals("finished")){
storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.YWC);
}
//添加action //添加action
actionService.addAction(ActionType.XQ, status, ztStory.getId(), ztStory.getProduct() + "", null, null, actionService.addAction(ActionType.XQ, status, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo()); RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo());
@ -2184,5 +2367,4 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return oldPStatus; return oldPStatus;
} }
} }

View File

@ -86,7 +86,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
s.setStage("wait"); s.setStage("wait");
this.baseMapper.insert(s); this.baseMapper.insert(s);
fileService.updateFile(dto.getFiles(),s.getId(), FileTypes.userStoryTask); fileService.updateFile(dto.getFiles(),s.getId(), FileTypes.userStory);
actionService.addAction(ActionType.USERXQ, ActionStatus.XJ, s.getId(), dto.getProduct()+"", null, null, actionService.addAction(ActionType.USERXQ, ActionStatus.XJ, s.getId(), dto.getProduct()+"", null, null,
RiskUserThreadLocal.get().getName(), "", ""); RiskUserThreadLocal.get().getName(), "", "");
@ -127,10 +127,10 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
String status = ztStory.getStatus(); String status = ztStory.getStatus();
BeanUtils.copyProperties(dto, ztStory); BeanUtils.copyProperties(dto, ztStory,"status");
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName()); ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
ztStory.setLastediteddate(new Date()); ztStory.setLastediteddate(new Date());
if(!"active".equals(storyStatus)){ if(Arrays.asList("reviewing","draft").contains(storyStatus)){
if("draft".equals(dto.getStatus())){ if("draft".equals(dto.getStatus())){
ztStory.setStatus("draft"); ztStory.setStatus("draft");
}else{ }else{
@ -138,13 +138,11 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
ztStory.setStatus("reviewing"); ztStory.setStatus("reviewing");
} }
} }
}else{
ztStory.setStatus("active");
} }
this.baseMapper.updateById(ztStory); this.baseMapper.updateById(ztStory);
fileService.updateFile(dto.getFiles(),ztStory.getId(), FileTypes.userStoryTask); fileService.updateFile(dto.getFiles(),ztStory.getId(), FileTypes.userStory);
actionService.addAction(ActionType.USERXQ, ActionStatus.BJ, dto.getId(), dto.getProduct() + "", dto.getProject(), null, actionService.addAction(ActionType.USERXQ, ActionStatus.BJ, dto.getId(), dto.getProduct() + "", dto.getProject(), null,
RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
@ -357,6 +355,10 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
if(ztUser!=null){ if(ztUser!=null){
dto.setOpenedbyName(ztUser.getNickname()); dto.setOpenedbyName(ztUser.getNickname());
} }
ztUser = userMap.get(dto.getClosedby());
if(ztUser!=null){
dto.setClosedbyName(ztUser.getNickname());
}
Map<Integer, List<ZtStory>> storyUserMap = getStoryUserMap(Arrays.asList(dto)); Map<Integer, List<ZtStory>> storyUserMap = getStoryUserMap(Arrays.asList(dto));
List<ZtStory> ztStories = storyUserMap.get(d.getId()); List<ZtStory> ztStories = storyUserMap.get(d.getId());
if(!CollectionUtils.isEmpty(ztStories)){ if(!CollectionUtils.isEmpty(ztStories)){
@ -389,16 +391,21 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
} }
Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(Arrays.asList(dto)); Map<Integer, List<ZtStoryreviewDTO>> rMap = getReviewMap(Arrays.asList(dto));
if(!StringUtils.isEmpty(d.getReviewedby())){ if(!StringUtils.isEmpty(dto.getReviewedby())){
String[] split = d.getReviewedby().split(","); String[] split = dto.getReviewedby().split(",");
StringBuilder b=new StringBuilder(); StringBuilder b=new StringBuilder();
for (String s:split) { for ( int i =0 ;i<split.length;i++) {
ZtUser u = userMap.get(s); ZtUser u = userMap.get(split[i]);
if(u!=null){ if(u!=null){
if(i==split.length-1){
b.append(u.getNickname());
}else{
b.append(u.getNickname()+","); b.append(u.getNickname()+",");
} }
} }
}
dto.setReviewedbyName(b.toString()); dto.setReviewedbyName(b.toString());
} }
dto.setViews(rMap.get(d.getId())); dto.setViews(rMap.get(d.getId()));
@ -455,6 +462,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
} }
@Override @Override
@Transactional
public void closedStory(ZtStoryUserDTO dto) { public void closedStory(ZtStoryUserDTO dto) {
String closedreason = dto.getClosedreason(); String closedreason = dto.getClosedreason();
ZtStoryUser ztStoryUser = this.baseMapper.selectById(dto.getId()); ZtStoryUser ztStoryUser = this.baseMapper.selectById(dto.getId());
@ -466,7 +474,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
ztStoryUser.setCloseddate(new Date()); ztStoryUser.setCloseddate(new Date());
ztStoryUser.setStatus("closed"); ztStoryUser.setStatus("closed");
this.baseMapper.updateById(ztStoryUser); this.baseMapper.updateById(ztStoryUser);
this.storyUserTaskService.closedAll(dto.getId());
actionService.addAction(ActionType.USERXQ, ActionStatus.GB, dto.getId(), ztStoryUser.getProduct() + "", null, null, actionService.addAction(ActionType.USERXQ, ActionStatus.GB, dto.getId(), ztStoryUser.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(),"关闭原因:"+closedreason+"\r\n 关闭备注: " +dto.getRemark(), ""); RiskUserThreadLocal.get().getName(),"关闭原因:"+closedreason+"\r\n 关闭备注: " +dto.getRemark(), "");
@ -497,6 +505,12 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
if(storyUser==null){ if(storyUser==null){
throw new BusinessException("请检查"); throw new BusinessException("请检查");
} }
String oldStatus = storyUser.getStatus();
storyUser.setOldStatus(oldStatus);
UserStoryEnums userStoryEnums = UserStoryEnums.transfer(oldStatus);
if(userStoryEnums.getIndex()>status.getIndex()){
return;
}
if(status==UserStoryEnums.UNCFM){ if(status==UserStoryEnums.UNCFM){
List<ZtStoryUserTask> list = storyUserTaskService.list(new QueryWrapper<ZtStoryUserTask>().lambda().eq(ZtStoryUserTask::getUserStoryId, id)); List<ZtStoryUserTask> list = storyUserTaskService.list(new QueryWrapper<ZtStoryUserTask>().lambda().eq(ZtStoryUserTask::getUserStoryId, id));
if(list.size()>1){ if(list.size()>1){
@ -506,18 +520,83 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
if(UserStoryEnums.CFM==status){ if(UserStoryEnums.CFM==status){
//需求已确认 //需求已确认
} }
String oldStatus = storyUser.getStatus();
storyUser.setStatus(status.getCode()); storyUser.setStatus(status.getCode());
storyUser.setLasteditedby(RiskUserThreadLocal.get().getName()); storyUser.setLasteditedby(RiskUserThreadLocal.get().getName());
storyUser.setLastediteddate(new Date()); storyUser.setLastediteddate(new Date());
UserStoryEnums userStoryEnums = UserStoryEnums.transfer(oldStatus);
this.baseMapper.updateById(storyUser);
actionService.addAction(ActionType.USERXQ, ActionStatus.ZTBG, id, storyUser.getProduct() + "", null, null, actionService.addAction(ActionType.USERXQ, ActionStatus.ZTBG, id, storyUser.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), userStoryEnums==null?"":userStoryEnums.getValue() +" 变更 "+status.getValue(), ""); RiskUserThreadLocal.get().getName(), userStoryEnums==null?"":userStoryEnums.getValue() +" 变更 "+status.getValue(), "");
} }
public void storyFinishedChangeStatus(Integer id, UserStoryEnums status){
if(id==null||id==0){
return;
}
ZtStoryUser storyUser = this.baseMapper.selectById(id);
if(storyUser==null){
throw new BusinessException("请检查");
}
if(UserStoryEnums.transfer(storyUser.getStatus()).getIndex()<UserStoryEnums.CFM.getIndex()){
throw new BusinessException("用户需求无法关联");
}
if(storyUser.getStatus().equals(UserStoryEnums.YWC.getCode())||storyUser.getStatus().equals(UserStoryEnums.CLOSED.getCode())){
return;
}
if(status==UserStoryEnums.KFZ){
List<ZtStory> activeList = this.storyService.list(new QueryWrapper<ZtStory>().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<ZtStory> activeList = this.storyService.list(new QueryWrapper<ZtStory>().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<ZtStory> activeList = this.storyService.list(new QueryWrapper<ZtStory>().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<ZtStory> finishList = this.storyService.list(new QueryWrapper<ZtStory>().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 @Override
@Transactional @Transactional
@ -559,7 +638,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
//需要会议 //需要会议
if(needImprove!=null&&needImprove!=0){ if(needImprove!=null&&needImprove!=0){
if(needImprove==1){ if(needImprove==1){
this.changeStatus(dto.getId(),UserStoryEnums.DSJ); this.changeStatus(dto.getId(),UserStoryEnums.DGT);
}else{ }else{
this.changeStatus(dto.getId(),UserStoryEnums.CFM); this.changeStatus(dto.getId(),UserStoryEnums.CFM);
} }

View File

@ -10,16 +10,14 @@ import com.sa.zentao.dao.ZtStoryUserDTO;
import com.sa.zentao.dao.ZtStoryUserTaskDTO; import com.sa.zentao.dao.ZtStoryUserTaskDTO;
import com.sa.zentao.dao.ZtTaskDTO; import com.sa.zentao.dao.ZtTaskDTO;
import com.sa.zentao.entity.*; import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.*;
import com.sa.zentao.enums.ActionType;
import com.sa.zentao.enums.FileTypes;
import com.sa.zentao.enums.UserStoryEnums;
import com.sa.zentao.mapper.ZtStoryUserTaskMapper; import com.sa.zentao.mapper.ZtStoryUserTaskMapper;
import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.*; import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.DateUtils;
import com.sa.zentao.utils.FloatUtils; import com.sa.zentao.utils.FloatUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -30,6 +28,8 @@ import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* <p> * <p>
@ -80,6 +80,8 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
if(!CollectionUtils.isEmpty(list)){ if(!CollectionUtils.isEmpty(list)){
Map<String, ZtUser> userMap = userService.userMapByIds(null); Map<String, ZtUser> userMap = userService.userMapByIds(null);
List<ZtStoryUser> storyUsers = this.storyUserService.listByIds(list.stream().map(o -> o.getUserStoryId()).collect(Collectors.toList()));
for (ZtStoryUserTaskDTO d:list) { for (ZtStoryUserTaskDTO d:list) {
ZtUser ztUser = userMap.get(d.getOpenedby()); ZtUser ztUser = userMap.get(d.getOpenedby());
if(ztUser!=null){ if(ztUser!=null){
@ -105,6 +107,13 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
if(ztUser!=null){ if(ztUser!=null){
d.setLastEditedByName(ztUser.getNickname()); d.setLastEditedByName(ztUser.getNickname());
} }
List<ZtStoryUser> 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<ZtStoryUserTaskMapp
if(story==null){ if(story==null){
throw new BusinessException("未查询到用户需求"); throw new BusinessException("未查询到用户需求");
} }
if(dto.getEststarted()==null||dto.getDeadline()==null){
throw new BusinessException("日期必选");
}
String type = dto.getType(); String type = dto.getType();
//wait 未开始 doing 进行中 finished //wait 未开始 doing 进行中 finished
List<ZtStoryUserTask> hisList = this.baseMapper.selectList(new QueryWrapper<ZtStoryUserTask>().lambda().eq(ZtStoryUserTask::getType, type) List<ZtStoryUserTask> hisList = this.baseMapper.selectList(new QueryWrapper<ZtStoryUserTask>().lambda()
.eq(ZtStoryUserTask::getUserStoryId, dto.getUserStoryId()) .eq(ZtStoryUserTask::getUserStoryId, dto.getUserStoryId())
.in(ZtStoryUserTask::getStatus,"wait","doing","finished") .in(ZtStoryUserTask::getStatus,"wait","doing")
); );
if(!CollectionUtils.isEmpty(hisList)&&hisList.size()>1){ if(!CollectionUtils.isEmpty(hisList)&&hisList.size()>0){
throw new BusinessException("无法添加"); throw new BusinessException("同时只允许建一个任务");
} }
if(type.equals("design")){ if(type.equals("design")){
if(UserStoryEnums.transfer(story.getStatus()).getIndex()> UserStoryEnums.XXSJZ.getIndex()){
throw new BusinessException("当前状态无法添加");
}
//设计 //设计
this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.XXSJZ); this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.XXSJZ);
}else if(type.equals("improve")){ }else if(type.equals("improve")){
if(UserStoryEnums.transfer(story.getStatus()).getIndex()> UserStoryEnums.UNCFM.getIndex()
){
throw new BusinessException("当前状态无法添加");
}
//明确 //明确
this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.UNCFM); this.storyUserService.changeStatus(dto.getUserStoryId(),UserStoryEnums.UNCFM);
} }
@ -143,13 +164,14 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
task.setStatus("wait"); task.setStatus("wait");
task.setOpenedby(RiskUserThreadLocal.get().getName()); task.setOpenedby(RiskUserThreadLocal.get().getName());
task.setOpeneddate(new Date()); task.setOpeneddate(new Date());
task.setLeft(task.getConsumed()); task.setLeft(0F);
task.setConsumed(0F); task.setConsumed(0F);
this.baseMapper.insert(task); this.baseMapper.insert(task);
//产品确认中 //产品确认中
fileService.updateFile(dto.getFiles(),task.getId(), FileTypes.userStory); fileService.updateFile(dto.getFiles(),task.getId(), FileTypes.userStoryTask);
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.XJ, task.getId() actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.XJ, task.getId()
, task.getProduct().toString(), null, null, , task.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),"", null); RiskUserThreadLocal.get().getName(),"", null);
@ -181,10 +203,14 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
ztStoryUserTask.setLastEditedDate(new Date()); ztStoryUserTask.setLastEditedDate(new Date());
this.baseMapper.updateById(ztStoryUserTask); this.baseMapper.updateById(ztStoryUserTask);
fileService.updateFile(dto.getFiles(),ztStoryUserTask.getId(), FileTypes.userStoryTask); fileService.updateFile(dto.getFiles(),ztStoryUserTask.getId(), FileTypes.userStoryTask);
if(!StringUtils.isEmpty(dto.getDesc())){
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.TJBZ, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),dto.getDesc(), null);
}
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.BJ, ztStoryUserTask.getId() actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.BJ, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(), null, null, , ztStoryUserTask.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),"", null); RiskUserThreadLocal.get().getName(),null, null);
} }
@Override @Override
@ -216,6 +242,15 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
ztStoryUserTask.setCanceledby(RiskUserThreadLocal.get().getName()); ztStoryUserTask.setCanceledby(RiskUserThreadLocal.get().getName());
ztStoryUserTask.setCanceleddate(new Date()); ztStoryUserTask.setCanceleddate(new Date());
this.baseMapper.updateById(ztStoryUserTask); this.baseMapper.updateById(ztStoryUserTask);
ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStoryUserTask.getUserStoryId());
String oldStatus = ztStoryUser.getOldStatus();
String status = ztStoryUser.getStatus();
ztStoryUser.setStatus(ztStoryUser.getOldStatus());
storyUserService.updateById(ztStoryUser);
actionService.addAction(ActionType.USERXQ, ActionStatus.ZTBG, ztStoryUser.getId(), ztStoryUser.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(),UserStoryEnums.transfer(status).getValue() +" 变更 "+UserStoryEnums.transfer(oldStatus).getValue(), "");
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.QX, ztStoryUserTask.getId() actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.QX, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(), null, null, , ztStoryUserTask.getProduct().toString(), null, null,
@ -226,8 +261,8 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
@Transactional @Transactional
public void finishedTask(ZtStoryUserTaskDTO dto) { public void finishedTask(ZtStoryUserTaskDTO dto) {
ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId()); ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId());
if(ztStoryUserTask==null||ztStoryUserTask.getStatus().equals("closed")||ztStoryUserTask.getStatus().equals("cancel")){ if(ztStoryUserTask==null||Arrays.asList("closed","cancel","finished").contains(ztStoryUserTask.getStatus())){
throw new BusinessException("当前无法取消"); throw new BusinessException("当前无法完成");
} }
ztStoryUserTask.setStatus("finished"); ztStoryUserTask.setStatus("finished");
// 设计 design 明确improve // 设计 design 明确improve
@ -242,7 +277,6 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
}else if ((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==2)&&(dto.getNeedDesign()!=null&&dto.getNeedDesign()==1)){ }else if ((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==2)&&(dto.getNeedDesign()!=null&&dto.getNeedDesign()==1)){
//用户状态待沟通 需要详细设计 //用户状态待沟通 需要详细设计
this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.DSJ); this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.DSJ);
this.add(dto.getInfo());
} }
}else if("design".equals(ztStoryUserTask.getType())){ }else if("design".equals(ztStoryUserTask.getType())){
this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.CPYSJ); this.storyUserService.changeStatus(ztStoryUserTask.getUserStoryId(), UserStoryEnums.CPYSJ);
@ -251,9 +285,9 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
float v = FloatUtils.floatSub(ztStoryUserTask.getEstimate(), FloatUtils.floatSub(ztStoryUserTask.getEstimate(), ztStoryUserTask.getConsumed())); float v = FloatUtils.floatSub(ztStoryUserTask.getEstimate(), dto.getConsumed());
ztStoryUserTask.setLeft(v<0?0:v); ztStoryUserTask.setLeft(v<0?0:v);
ztStoryUserTask.setConsumed(FloatUtils.floatAdd(ztStoryUserTask.getConsumed(),dto.getConsumed())); ztStoryUserTask.setConsumed(dto.getConsumed());
ztStoryUserTask.setLastEditedBy(RiskUserThreadLocal.get().getName()); ztStoryUserTask.setLastEditedBy(RiskUserThreadLocal.get().getName());
ztStoryUserTask.setLastEditedDate(new Date()); ztStoryUserTask.setLastEditedDate(new Date());
ztStoryUserTask.setFinishedby(RiskUserThreadLocal.get().getName()); ztStoryUserTask.setFinishedby(RiskUserThreadLocal.get().getName());
@ -261,10 +295,18 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
this.baseMapper.updateById(ztStoryUserTask); this.baseMapper.updateById(ztStoryUserTask);
// if("improve".equals(ztStoryUserTask.getType())){
// //需要会议
// if ((dto.getNeedMeeting()!=null&&dto.getNeedMeeting()==2)&&(dto.getNeedDesign()!=null&&dto.getNeedDesign()==1)){
// //用户状态待沟通 需要详细设计
// this.add(dto.getInfo());
// }
// }
ZtEffort e=new ZtEffort(); ZtEffort e=new ZtEffort();
e.setObjectid(ztStoryUserTask.getId()); e.setObjectid(ztStoryUserTask.getId());
e.setObjecttype("userStoryTask"); e.setObjecttype("userStoryTask");
e.setConsumed(ztStoryUserTask.getConsumed()); e.setConsumed(dto.getConsumed());
e.setLeft(ztStoryUserTask.getLeft()); e.setLeft(ztStoryUserTask.getLeft());
e.setAccount(RiskUserThreadLocal.get().getName()); e.setAccount(RiskUserThreadLocal.get().getName());
e.setDate(new Date()); e.setDate(new Date());
@ -273,7 +315,7 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.WC, ztStoryUserTask.getId() actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.WC, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(), null, null, , ztStoryUserTask.getProduct().toString(), null, null,
RiskUserThreadLocal.get().getName(),"", null); RiskUserThreadLocal.get().getName(),dto.getDesc(), null);
} }
@Override @Override
@ -325,4 +367,57 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl<ZtStoryUserTaskMapp
return ztStoryUserTaskDTO; return ztStoryUserTaskDTO;
} }
@Override
public void addRemark(ZtStoryUserTaskDTO dto) {
ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId());
if(ztStoryUserTask==null){
throw new BusinessException("未查询到");
}
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.TJBZ, dto.getId(), ztStoryUserTask.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
}
@Override
public void assignedTo(ZtStoryUserTaskDTO dto) {
ZtStoryUserTask ztStoryUserTask = this.baseMapper.selectById(dto.getId());
if (ztStoryUserTask == null) {
throw new BusinessException("未查询到数据");
}
ztStoryUserTask.setAssignedTo(dto.getAssignedTo());
ztStoryUserTask.setLastEditedBy(RiskUserThreadLocal.get().getName());
ztStoryUserTask.setLastEditedDate(new Date());
this.baseMapper.updateById(ztStoryUserTask);
actionService.addAction(ActionType.STORYUSERTASK, ActionStatus.FP, ztStoryUserTask.getId()
, ztStoryUserTask.getProduct().toString(),null, null,
RiskUserThreadLocal.get().getName(), null, dto.getAssignedTo());
}
@Override
public void closedAll(Integer id) {
List<ZtStoryUserTask> tasks = this.baseMapper.selectList(new QueryWrapper<ZtStoryUserTask>().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);
}
}
}
}
} }

View File

@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil; import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.DateUtils;
import com.sa.zentao.utils.KanBanConstant; import com.sa.zentao.utils.KanBanConstant;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -149,29 +150,6 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ztTaskDTO.setApprovalRemark(dto.getApprovalRemark()); ztTaskDTO.setApprovalRemark(dto.getApprovalRemark());
BeanUtils.copyProperties(t,ztTaskDTO); BeanUtils.copyProperties(t,ztTaskDTO);
this.approval(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<ZtProjectproduct>().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<ZtTaskMapper, ZtTask> impleme
ztTask.setOpeneddate(new Date()); ztTask.setOpeneddate(new Date());
ztTask.setEstimate(dto.getLeft()); ztTask.setEstimate(dto.getLeft());
//getExecution()执行 //getExecution()执行
//项目 //项目
Integer story = ztTask.getStory(); Integer story = ztTask.getStory();
@ -472,6 +449,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
} else { } else {
ztTask.setStatus("wait"); ztTask.setStatus("wait");
ztTask.setReviewingUser(null); ztTask.setReviewingUser(null);
} }
} }
@ -497,6 +475,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
} }
this.baseMapper.insert(ztTask); 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); fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task);
if (ztTask.getExecution() != null && ztTask.getExecution() != 0) { if (ztTask.getExecution() != null && ztTask.getExecution() != 0) {
@ -530,6 +511,10 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (ztTask == null) { if (ztTask == null) {
throw new BusinessException("未查询到数据"); throw new BusinessException("未查询到数据");
} }
Integer s1 = ztTask.getStory();
Integer s2 = dto.getStory();
//cancel取消 closed 关闭 done //cancel取消 closed 关闭 done
if(Arrays.asList("cancel","closed","done").contains(ztTask.getStatus())){ if(Arrays.asList("cancel","closed","done").contains(ztTask.getStatus())){
throw new BusinessException("当前无法编辑"); throw new BusinessException("当前无法编辑");
@ -589,6 +574,16 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
} }
this.baseMapper.updateById(ztTask); 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); fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task);
@ -704,24 +699,24 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
kanbanlaneService.changeStatus(qo); kanbanlaneService.changeStatus(qo);
} }
} }
if ("devel".equals(ztTask.getType())) { // if ("devel".equals(ztTask.getType())) {
//处理需求 //处理需求
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false);
if ("done".equals(ztTask.getStatus())) { // if ("done".equals(ztTask.getStatus())) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); // this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.devel,false);
} else if ("doing".equals(ztTask.getStatus())) { // } else if ("doing".equals(ztTask.getStatus())) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); // this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.devel,false);
} // }
} // }
if ("test".equals(ztTask.getType())) { // if ("test".equals(ztTask.getType())) {
//处理需求 // //处理需求
if ("done".equals(ztTask.getStatus())) { // if ("done".equals(ztTask.getStatus())) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); // this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
} else if ("doing".equals(ztTask.getStatus())) { // } else if ("doing".equals(ztTask.getStatus())) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); // this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
} // }
//
} // }
Integer execution = ztTask.getExecution(); Integer execution = ztTask.getExecution();
@ -733,13 +728,13 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (dto.getFinishedFlag() == 1) { if (dto.getFinishedFlag() == 1) {
String type = ztTask.getType(); String type = ztTask.getType();
if (ztTask.getStory() != null && ztTask.getStory() != 0) { if (ztTask.getStory() != null && ztTask.getStory() != 0) {
if ("test".equals(type)) { // if ("test".equals(type)) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); // this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
} else if ("devel".equals(type)) { // } else if ("devel".equals(type)) {
//开发 // //开发
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null); // 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<ZtTaskMapper, ZtTask> impleme
// devel 开发 request 需求 test // devel 开发 request 需求 test
String type = ztTask.getType(); String type = ztTask.getType();
if (ztTask.getStory() != null && ztTask.getStory() != 0) { if (ztTask.getStory() != null && ztTask.getStory() != 0) {
if ("test".equals(type)) { this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.transferType(type),false);
this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy); // if ("test".equals(type)) {
} else if ("devel".equals(type)) { // this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.test);
//开发 // } else if ("devel".equals(type)) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy); // //开发
} // this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.devel);
// }
} }
if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){ if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){
this.storyFeedbackService.feedbackFinished(ztTask.getFeedback()); this.storyFeedbackService.feedbackFinished(ztTask.getFeedback());
@ -860,6 +856,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
kanbanlaneService.changeStatus(qo); kanbanlaneService.changeStatus(qo);
} }
} }
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),true);
} }
@ -904,10 +901,11 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
} }
} }
if(ztTask.getStory()!=null&&ztTask.getStory()!=0){ 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<ZtTaskMapper, ZtTask> impleme
this.saveBatch(saveList); this.saveBatch(saveList);
for (ZtTask ztTask:saveList) {
if(!ztTask.getStatus().equals("reviewing")){
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false);
}
}
List<ZtTaskDTO> develList = list.stream().filter(o -> o.getType().equals(TaskType.devel.getCode())).collect(Collectors.toList());
kanbanlaneService.addTask(list.get(0).getExecution(), saveList); kanbanlaneService.addTask(list.get(0).getExecution(), saveList);
ZtStory story = storyService.getById(list.get(0).getStory()); ZtStory story = storyService.getById(list.get(0).getStory());
@ -1031,15 +1037,18 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
t.setLasteditedby(RiskUserThreadLocal.get().getName()); t.setLasteditedby(RiskUserThreadLocal.get().getName());
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, t.getProject())); ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, t.getProject()));
this.baseMapper.updateById(t);
if (dto.getApprovalStatus() == 1) { 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(), 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); RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null);
} else { } else {
actionService.addAction(ActionType.RW, ActionStatus.PSBTG, t.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), t.getExecution(), 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); RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null);
} }
this.baseMapper.updateById(t);
if (dto.getApprovalStatus() == 1) { if (dto.getApprovalStatus() == 1) {
if(t.getFinishedFlag()!=null&&t.getFinishedFlag()==1){ if(t.getFinishedFlag()!=null&&t.getFinishedFlag()==1){
dto.setConsumed(t.getEstimate()); dto.setConsumed(t.getEstimate());

View File

@ -23,7 +23,10 @@ import java.util.Properties;
public class SendEmail { 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 host = "smtp.qiye.163.com";
String port = "587"; String port = "587";
String username = "sino-employee@sino-assistance.com"; String username = "sino-employee@sino-assistance.com";
@ -44,7 +47,7 @@ public class SendEmail {
MimeMessage message = new MimeMessage(session); MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(username)); message.setFrom(new InternetAddress(username));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(mail)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(mail));
message.setSubject("运维提醒", "GBK"); message.setSubject(title, "GBK");
Multipart multipart = new MimeMultipart(); Multipart multipart = new MimeMultipart();
@ -229,6 +232,6 @@ public class SendEmail {
// String str="4468058@qq.com;294438420@qq.com;"; // String str="4468058@qq.com;294438420@qq.com;";
// sendMessage(Arrays.asList(str.split(";")),Arrays.asList(""),"22"); // sendMessage(Arrays.asList(str.split(";")),Arrays.asList(""),"22");
sendMail("4468058@qq.com","123"); // sendMail("4468058@qq.com","123");
} }
} }

View File

@ -85,6 +85,10 @@
and severity = #{qo.severity} and severity = #{qo.severity}
</if> </if>
<if test="qo.status != null and qo.status != ''">
and status = #{qo.status}
</if>
<if test="qo.pri != null and qo.pri != ''"> <if test="qo.pri != null and qo.pri != ''">
and pri = #{qo.pri} and pri = #{qo.pri}
</if> </if>

View File

@ -224,11 +224,11 @@
</select> </select>
<select id="selectPrdByName" resultType="com.sa.zentao.dao.ZtProjectDTO"> <select id="selectPrdByName" resultType="com.sa.zentao.dao.ZtProjectDTO">
SELECT * from zt_project WHERE `name` = #{name} and type = 'sprint' SELECT p.id,p.project from zt_project p WHERE p.`name` = #{name} and p.type = 'sprint'
</select> </select>
<select id="selectPrdById" resultType="com.sa.zentao.dao.ZtProjectDTO"> <select id="selectPrdById" resultType="com.sa.zentao.dao.ZtProjectDTO">
SELECT * from zt_project WHERE id = #{id} and type = 'sprint' SELECT id,`name` from zt_project WHERE id = #{id} and type = 'sprint'
</select> </select>
<select id="performanceCount" resultType="com.sa.zentao.dao.PerformanceDTO"> <select id="performanceCount" resultType="com.sa.zentao.dao.PerformanceDTO">
SELECT SELECT

View File

@ -109,6 +109,10 @@
and s.status = '11' and s.status = '11'
</if> </if>
<if test="qo.searchVal != null and qo.searchVal == 'WYS' ">
and s.ys_user = #{qo.userName}
</if>
<if test="qo.searchVal != null and qo.searchVal == 'WPS' "> <if test="qo.searchVal != null and qo.searchVal == 'WPS' ">
and s.reviewedBy like concat('%', #{qo.userName}, '%') and s.reviewedBy like concat('%', #{qo.userName}, '%')
</if> </if>
@ -234,6 +238,10 @@
and s.title like concat('%', #{qo.title}, '%') and s.title like concat('%', #{qo.title}, '%')
</if> </if>
<if test="qo.searchVal != null and qo.searchVal == 'WYS' ">
and s.ys_user = #{qo.userName}
</if>
<if test="qo.stage != null and qo.stage != '' "> <if test="qo.stage != null and qo.stage != '' ">
and s.stage = #{qo.stage} and s.stage = #{qo.stage}
</if> </if>
@ -671,7 +679,9 @@
and s.status ='reviewing' and s.status ='reviewing'
and v.result = '' and v.result = ''
</if> </if>
<if test="qo.searchVal != null and qo.searchVal == 'WYS' ">
and s.ys_user = #{qo.userName}
</if>
<if test="qo.searchVal == 'JH' "> <if test="qo.searchVal == 'JH' ">
and s.status = 'active' and s.status = 'active'
</if> </if>

View File

@ -55,10 +55,10 @@
</if> </if>
<if test="qo.startDate !=null"> <if test="qo.startDate !=null">
and s.openedDate <![CDATA[>=]]> #{qo.startDate} and s.opened_date <![CDATA[>=]]> #{qo.startDate}
</if> </if>
<if test="qo.endDate !=null"> <if test="qo.endDate !=null">
and s.openedDate <![CDATA[<=]]> #{qo.endDate} and s.opened_date <![CDATA[<=]]> #{qo.endDate}
</if> </if>
<if test="qo.searchVal == 'ALL' "> <if test="qo.searchVal == 'ALL' ">
@ -84,6 +84,8 @@
</foreach> </foreach>
</if> </if>
order by s.id desc
</select> </select>
</mapper> </mapper>