From 3cd02cd7733aa51aef7c954a65b6a3664202c2f1 Mon Sep 17 00:00:00 2001 From: guoqibing Date: Tue, 2 Dec 2025 16:55:34 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=9C=80=E6=B1=82=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sa/zentao/qo/ZtProjectQo.java | 2 + .../service/impl/ZtStoryUserServiceImpl.java | 5 + .../service/impl/ZtTaskServiceImpl.java | 143 +++++++++----- src/main/resources/mapper/ZtStoryMapper.xml | 186 +++++++++--------- .../resources/mapper/ZtStoryUserMapper.xml | 10 + 5 files changed, 204 insertions(+), 142 deletions(-) diff --git a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java index aefe172..daa873f 100644 --- a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java @@ -64,6 +64,8 @@ public class ZtProjectQo extends BaseQo { private String status; + private List stageList; + private String title; private Integer module; 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 35e05eb..69f04ca 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java @@ -305,6 +305,11 @@ public class ZtStoryUserServiceImpl extends ServiceImpl page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); List list = this.baseMapper.pageList(qo); if (!CollectionUtils.isEmpty(list)) { 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 924bf65..a722d3c 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java @@ -179,8 +179,8 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if (CollectionUtils.isEmpty(taskList)) { return new ArrayList<>(); } - taskList=taskList.stream().peek(e->{ - if(e.getDeadline()!=null){ + taskList = taskList.stream().peek(e -> { + if (e.getDeadline() != null) { e.setDeadline(DateUtils.getDayLast(e.getDeadline())); } }).collect(Collectors.toList()); @@ -341,7 +341,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme // .and(e->e.or().) // ); - return this.baseMapper.taskListByPIdsAndDate(pids,firstDayOfMonth,lastDayOfMonth); + return this.baseMapper.taskListByPIdsAndDate(pids, firstDayOfMonth, lastDayOfMonth); // return taskList; } @@ -386,8 +386,8 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } List taskList = this.list(new QueryWrapper().lambda() .select(SFunctionColums.taskColumes()) - .in(ZtTask::getProduct,pids) - .in(ZtTask::getAssignedTo,uids) + .in(ZtTask::getProduct, pids) + .in(ZtTask::getAssignedTo, uids) .ge(ZtTask::getFinishedDate, firstDayOfMonth).le(ZtTask::getFinishedDate, lastDayOfMonth)); return taskList; @@ -518,7 +518,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme List userIds = list.stream().map(o -> o.getFinishedby()).collect(Collectors.toList()); userIds.addAll(list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList())); Map userMap = this.userService.userMapByIds(null); - Date d=new Date(); + Date d = new Date(); for (ZtTaskDTO task : list) { ZtUser ztUser = userMap.get(task.getFinishedby()); if (ztUser != null) { @@ -531,16 +531,16 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if (task.getDeadline() != null) { task.setDeadline(DateUtils.getDayLast(task.getDeadline())); } - if(task.getFinishedDate()!=null){ - if(task.getFinishedDate().getTime()>DateUtils.getDayLast(task.getDeadline()).getTime()){ + if (task.getFinishedDate() != null) { + if (task.getFinishedDate().getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) { task.setDelayFlag(1); - }else{ + } else { task.setDelayFlag(2); } - }else{ - if(d.getTime()>DateUtils.getDayLast(task.getDeadline()).getTime()){ + } else { + if (d.getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) { task.setDelayFlag(1); - }else{ + } else { task.setDelayFlag(2); } } @@ -644,16 +644,16 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setEstimate(ztTask.getUseTime().floatValue()); ztTask.setLeft(ztTask.getUseTime().floatValue()); } - if(ztTask.getDeadline()==null){ + if (ztTask.getDeadline() == null) { throw new BusinessException("当前环境异常请联系管理员"); } this.baseMapper.insert(ztTask); - if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){ + if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) { ZtStory ztStory = this.storyService.getById(ztTask.getStory()); - if(ztTask.getType().equals("devel")&&(ztStory.getDevelPlanEndTime()==null||ztTask.getDeadline().after(ztStory.getDevelPlanEndTime()))){ + if (ztTask.getType().equals("devel") && (ztStory.getDevelPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getDevelPlanEndTime()))) { ztStory.setDevelPlanEndTime(ztTask.getDeadline()); } - if(ztTask.getType().equals("test")&&(ztStory.getTestPlanEndTime()==null||ztTask.getDeadline().after(ztStory.getTestPlanEndTime()))){ + if (ztTask.getType().equals("test") && (ztStory.getTestPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getTestPlanEndTime()))) { ztStory.setTestPlanEndTime(ztTask.getDeadline()); } this.storyService.updateById(ztStory); @@ -703,7 +703,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme @Override @Transactional public void modifyTask(ZtTaskDTO dto) { - if(dto.getDeadline()==null||dto.getEstStarted()==null){ + if (dto.getDeadline() == null || dto.getEstStarted() == null) { throw new BusinessException("请录入开始结束日期"); } ZtTask ztTask = this.baseMapper.selectById(dto.getId()); @@ -786,6 +786,44 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } } + if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) { + ZtStory ztStory = this.storyService.getById(ztTask.getStory()); + ztStory.setDevelPlanEndTime(null); + if (ztTask.getType().equals("devel") && (ztStory.getDevelPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getDevelPlanEndTime()))) { + ztStory.setDevelPlanEndTime(ztTask.getDeadline()); + } else { + //查找最大时间那个 + List ztTasks = this.baseMapper.selectList(new QueryWrapper().lambda() + .select(ZtTask::getDeadline) + .isNotNull(ZtTask::getDeadline) + .eq(ZtTask::getType, "devel") + .ne(ZtTask::getId, ztTask.getId()) + .in(ZtTask::getStatus, "pause", "done", "wait", "reviewing", "doing", "draft") + .eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline)); + this.storyService.update(new UpdateWrapper().lambda() + .eq(ZtStory::getId, ztTask.getStory()) + .set(ZtStory::getDevelPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); + } + if (ztTask.getType().equals("test") && (ztStory.getTestPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getTestPlanEndTime()))) { + ztStory.setTestPlanEndTime(ztTask.getDeadline()); + } else { + if (ztTask.getType().equals("test") && ztStory.getTestPlanEndTime() != null) { + //查找最大时间那个 + ztStory.setDevelPlanEndTime(ztTask.getDeadline()); + List ztTasks = this.baseMapper.selectList(new QueryWrapper().lambda() + .select(ZtTask::getDeadline) + .isNotNull(ZtTask::getDeadline) + .eq(ZtTask::getType, "test") + .ne(ZtTask::getId, ztTask.getId()) + .in(ZtTask::getStatus, "pause", "done", "wait", "reviewing", "doing", "draft") + .eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline)); + this.storyService.update(new UpdateWrapper().lambda() + .eq(ZtStory::getId, ztTask.getStory()) + .set(ZtStory::getTestPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); + } + } + this.storyService.updateById(ztStory); + } fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task); @@ -812,11 +850,11 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false); } - if(ObjectUtils.notEqual(oldExecution,newExecution)){ + if (ObjectUtils.notEqual(oldExecution, newExecution)) { //迭代切换了 - this.kanbanlaneService.removeKanbanCell(oldExecution,ztTask.getId(),KanbanCellType.TASK); + this.kanbanlaneService.removeKanbanCell(oldExecution, ztTask.getId(), KanbanCellType.TASK); //添加新的看板迭代 - this.kanbanlaneService.addKanbanCell(newExecution,ztTask.getId(),KanbanCellType.TASK,ztTask); + this.kanbanlaneService.addKanbanCell(newExecution, ztTask.getId(), KanbanCellType.TASK, ztTask); } taskSendZpMessage(ztTask.getId(), oldAssignedTo, ztTask.getAssignedTo()); @@ -872,7 +910,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if ("doing".equals(ztTask.getStatus())) { this.storyFeedbackService.feedbackStart(ztTask.getFeedback()); } else { - this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark()); + this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(), ztTask.getFeedbackRemark()); } } if (dto.getConsumed() > 0) { @@ -889,26 +927,26 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme actionService.addAction(ActionType.RW, ActionStatus.KS, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), RiskUserThreadLocal.get().getName(), "", null); - if("done".equals(ztTask.getStatus())){ - String finishBy = StringUtils.isEmpty(ztTask.getFinishedby())?RiskUserThreadLocal.get().getName():ztTask.getFinishedby(); + if ("done".equals(ztTask.getStatus())) { + String finishBy = StringUtils.isEmpty(ztTask.getFinishedby()) ? RiskUserThreadLocal.get().getName() : ztTask.getFinishedby(); //如果是测试任务 提交交付物 - if("test".equals(ztTask.getType())&&!StringUtils.isEmpty(ztTask.getDeliverContent())){ - actionService.addAction(ActionType.RW, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), + if ("test".equals(ztTask.getType()) && !StringUtils.isEmpty(ztTask.getDeliverContent())) { + actionService.addAction(ActionType.RW, ActionStatus.TJJFW, ztTask.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null); - if(ztTask.getStory()!=null&&ztTask.getStory()!=0){ - actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), + if (ztTask.getStory() != null && ztTask.getStory() != 0) { + actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, ztTask.getStory(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null); } - if(ztTask.getStory()!=null&&ztTask.getStory()!=0){ + if (ztTask.getStory() != null && ztTask.getStory() != 0) { //更新需求交付物 ZtStory ztStory = this.storyService.getById(ztTask.getStory()); - if(ztStory!=null){ + if (ztStory != null) { ztStory.setDeliverContent(ztTask.getDeliverContent()); this.storyService.updateById(ztStory); } } } - if(!StringUtils.isEmpty(dto.getRemark())){ + if (!StringUtils.isEmpty(dto.getRemark())) { actionService.addAction(ActionType.RW, ActionStatus.TJBZ, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getRemark(), null); } @@ -992,15 +1030,15 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme //添加action ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject())); //如果是测试任务 提交交付物 - if("test".equals(ztTask.getType())&&!StringUtils.isEmpty(ztTask.getDeliverContent())){ + if ("test".equals(ztTask.getType()) && !StringUtils.isEmpty(ztTask.getDeliverContent())) { actionService.addAction(ActionType.RW, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null); - if(ztTask.getStory()!=null&&ztTask.getStory()!=0){ - actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), + if (ztTask.getStory() != null && ztTask.getStory() != 0) { + actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, ztTask.getStory(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null); } } - if(!StringUtils.isEmpty(dto.getRemark())){ + if (!StringUtils.isEmpty(dto.getRemark())) { actionService.addAction(ActionType.RW, ActionStatus.TJBZ, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(), StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getRemark(), null); } @@ -1033,7 +1071,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme this.storyService.taskFinishChangeStatus(ztTask.getStory(), finishBy, TaskType.transferType(type), false); } if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) { - this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark()); + this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(), ztTask.getFeedbackRemark()); } } @@ -1052,9 +1090,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setLastediteddate(new Date()); this.baseMapper.updateById(ztTask); - if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){ + if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) { ZtStory ztStory = this.storyService.getById(ztTask.getStory()); - if(ztTask.getType().equals("devel")&&ztStory.getDevelPlanEndTime()!=null){ + if (ztTask.getType().equals("devel") && ztStory.getDevelPlanEndTime() != null) { //查找最大时间那个 ztStory.setDevelPlanEndTime(ztTask.getDeadline()); List ztTasks = this.baseMapper.selectList(new QueryWrapper().lambda() @@ -1065,10 +1103,10 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme .in(ZtTask::getStatus, "pause", "done", "wait", "reviewing", "doing", "draft") .eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline)); this.storyService.update(new UpdateWrapper().lambda() - .eq(ZtStory::getId, ztTask.getStory()) - .set(ZtStory::getDevelPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); + .eq(ZtStory::getId, ztTask.getStory()) + .set(ZtStory::getDevelPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); } - if(ztTask.getType().equals("test")&&ztStory.getTestPlanEndTime()!=null){ + if (ztTask.getType().equals("test") && ztStory.getTestPlanEndTime() != null) { //查找最大时间那个 ztStory.setDevelPlanEndTime(ztTask.getDeadline()); List ztTasks = this.baseMapper.selectList(new QueryWrapper().lambda() @@ -1080,12 +1118,11 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme .eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline)); this.storyService.update(new UpdateWrapper().lambda() .eq(ZtStory::getId, ztTask.getStory()) - .set(ZtStory::getTestPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); + .set(ZtStory::getTestPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); } } - ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject())); //添加action @@ -1131,9 +1168,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme //添加action actionService.addAction(ActionType.RW, ActionStatus.QX, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), ztTask.getProject(), ztTask.getExecution(), RiskUserThreadLocal.get().getName(), dto.getDesc(), null); - if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){ + if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) { ZtStory ztStory = this.storyService.getById(ztTask.getStory()); - if(ztTask.getType().equals("devel")&&ztStory.getDevelPlanEndTime()!=null){ + if (ztTask.getType().equals("devel") && ztStory.getDevelPlanEndTime() != null) { //查找最大时间那个 ztStory.setDevelPlanEndTime(ztTask.getDeadline()); List ztTasks = this.baseMapper.selectList(new QueryWrapper().lambda() @@ -1145,9 +1182,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme .eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline)); this.storyService.update(new UpdateWrapper().lambda() .eq(ZtStory::getId, ztTask.getStory()) - .set(ZtStory::getDevelPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); + .set(ZtStory::getDevelPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); } - if(ztTask.getType().equals("test")&&ztStory.getTestPlanEndTime()!=null){ + if (ztTask.getType().equals("test") && ztStory.getTestPlanEndTime() != null) { //查找最大时间那个 ztStory.setDevelPlanEndTime(ztTask.getDeadline()); List ztTasks = this.baseMapper.selectList(new QueryWrapper().lambda() @@ -1159,7 +1196,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme .eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline)); this.storyService.update(new UpdateWrapper().lambda() .eq(ZtStory::getId, ztTask.getStory()) - .set(ZtStory::getTestPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); + .set(ZtStory::getTestPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline()))); } } if (ztTask.getExecution() != null && ztTask.getExecution() != 0) { @@ -1207,7 +1244,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme List list = dto.getList(); long nullDeadlineCount = list.stream().filter(o -> o.getDeadline() == null || o.getEstStarted() == null).count(); - if(nullDeadlineCount>0){ + if (nullDeadlineCount > 0) { throw new BusinessException("请录入开始结束日期"); } @@ -1254,13 +1291,13 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } saveList.add(ztTask); - if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){ + if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) { ZtStory ztStory = this.storyService.getById(ztTask.getStory()); - if(ztTask.getType().equals("devel")&&(ztStory.getDevelPlanEndTime()==null||ztTask.getDeadline().getTime()>=ztStory.getDevelPlanEndTime().getTime() - )){ + if (ztTask.getType().equals("devel") && (ztStory.getDevelPlanEndTime() == null || ztTask.getDeadline().getTime() >= ztStory.getDevelPlanEndTime().getTime() + )) { ztStory.setDevelPlanEndTime(ztTask.getDeadline()); } - if(ztTask.getType().equals("test")&&(ztStory.getTestPlanEndTime()==null||ztTask.getDeadline().getTime()>=ztStory.getTestPlanEndTime().getTime())){ + if (ztTask.getType().equals("test") && (ztStory.getTestPlanEndTime() == null || ztTask.getDeadline().getTime() >= ztStory.getTestPlanEndTime().getTime())) { ztStory.setTestPlanEndTime(ztTask.getDeadline()); } this.storyService.updateById(ztStory); @@ -1275,7 +1312,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false); taskSendZpMessage(ztTask.getId(), null, ztTask.getAssignedTo()); } else { - taskSendPsMessage(ztTask.getId(), ztProject.getPm(),ztTask.getOpenedby()); + taskSendPsMessage(ztTask.getId(), ztProject.getPm(), ztTask.getOpenedby()); } } diff --git a/src/main/resources/mapper/ZtStoryMapper.xml b/src/main/resources/mapper/ZtStoryMapper.xml index 0954318..75480d1 100644 --- a/src/main/resources/mapper/ZtStoryMapper.xml +++ b/src/main/resources/mapper/ZtStoryMapper.xml @@ -257,11 +257,16 @@ and closedBy =#{qo.userName} + + and s.stage in + + #{id} + + group by s.id - - @@ -277,21 +282,10 @@ order by s.id desc - - - - -- order by id desc - - + + + diff --git a/src/main/resources/mapper/ZtStoryUserMapper.xml b/src/main/resources/mapper/ZtStoryUserMapper.xml index de8f051..4e0e5b4 100644 --- a/src/main/resources/mapper/ZtStoryUserMapper.xml +++ b/src/main/resources/mapper/ZtStoryUserMapper.xml @@ -140,7 +140,7 @@ s.deliver_remark, s.old_status, s.ys_user, - + s.product_user, pt.name productName from zt_story_user s LEFT JOIN zt_product pt on s.product = pt.id WHERE 1=1 @@ -188,9 +188,9 @@ and pt.name like concat('%', #{qo.productName}, '%') - - - + + and s.product_user like concat('%', #{qo.productUser}, '%') + @@ -199,10 +199,12 @@ and s.status != 'closed' + + and s.product_user = #{qo.userName} + and s.openedby= #{qo.userName} - and s.id = #{qo.id} diff --git a/src/main/resources/templates/scope/产品经理考核.xlsx b/src/main/resources/templates/scope/产品经理考核.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..815aeb41eb2710eeb09d848bfbc3264d284a08f8 GIT binary patch literal 12632 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