diff --git a/pom.xml b/pom.xml index 5ddbe29..f997e28 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,69 @@ + + com.itextpdf + itextpdf + 5.5.12 + + + com.itextpdf.tool + xmlworker + 5.5.12 + + + com.itextpdf + itext-asian + 5.2.0 + + + + com.itextpdf + itext7-core + 7.1.16 + pom + + + com.itextpdf + html2pdf + 3.0.4 + + + + + org.apache.pdfbox + pdfbox + 2.0.33 + + + + + + + + + + + + + + + + + + org.apache.poi + poi-ooxml + 5.2.2 + + + + + com.deepoove + poi-tl + 1.5.0 + + + com.sun.mail javax.mail diff --git a/src/main/java/com/sa/zentao/conf/AfterRunner.java b/src/main/java/com/sa/zentao/conf/AfterRunner.java index ed2154d..1598661 100644 --- a/src/main/java/com/sa/zentao/conf/AfterRunner.java +++ b/src/main/java/com/sa/zentao/conf/AfterRunner.java @@ -30,7 +30,8 @@ public class AfterRunner implements ApplicationRunner { @Autowired private com.sa.zentao.task.SpringTaskJob springTaskJob; - + @Autowired + private IZtYwTaskService ywTaskService; @@ -42,6 +43,7 @@ public class AfterRunner implements ApplicationRunner { springTaskJob.dkEveryDay(); new Thread(new DevopsRunner()).start(); +// ywTaskService.remindMail();; } diff --git a/src/main/java/com/sa/zentao/conf/CodeGenerator.java b/src/main/java/com/sa/zentao/conf/CodeGenerator.java index b7960b6..14cbc83 100644 --- a/src/main/java/com/sa/zentao/conf/CodeGenerator.java +++ b/src/main/java/com/sa/zentao/conf/CodeGenerator.java @@ -22,7 +22,7 @@ public class CodeGenerator { //自己的名字 static String Author = "gqb"; - public static String tableName = "zt_notice"; + public static String tableName = "zt_develop_feedback"; /** *

diff --git a/src/main/java/com/sa/zentao/conf/ParamOutAspect.java b/src/main/java/com/sa/zentao/conf/ParamOutAspect.java index 43464cc..c4ac483 100644 --- a/src/main/java/com/sa/zentao/conf/ParamOutAspect.java +++ b/src/main/java/com/sa/zentao/conf/ParamOutAspect.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.sa.zentao.dao.BusinessException; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -54,7 +55,13 @@ public class ParamOutAspect { */ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); - String params = getRequestParams(request, joinPoint); + String params =""; + try { + params=getRequestParams(request, joinPoint); + }catch (Exception e){ + log.error("",e); + } + /** * 入参日志 @@ -69,10 +76,15 @@ public class ParamOutAspect { log.info("token : " + authorization); String str =request.getRequestURI().replaceAll("/+$",""); + Object proceed=null; + try { + proceed = joinPoint.proceed(); + }catch (Exception e){ + log.error("",e); + throw new BusinessException(e.getMessage()); + } - Object proceed = joinPoint.proceed(); - // if(ObjectUtils.isEmpty(result)){ diff --git a/src/main/java/com/sa/zentao/controller/CommonsController.java b/src/main/java/com/sa/zentao/controller/CommonsController.java index a32bb6e..a951b31 100644 --- a/src/main/java/com/sa/zentao/controller/CommonsController.java +++ b/src/main/java/com/sa/zentao/controller/CommonsController.java @@ -10,16 +10,15 @@ import com.sa.zentao.entity.ZtFile; import com.sa.zentao.service.IZtFileService; import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.UploadUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.lang.reflect.Method; import java.net.URL; import java.util.*; @@ -90,7 +89,7 @@ public class CommonsController { // 写入文件到服务器的指定目录 java.nio.file.Files.write(path, bytes); ZtFile f=new ZtFile(); - f.setAddedby(RiskUserThreadLocal.get().getName()); + f.setAddedby(RiskUserThreadLocal.get()==null?null:RiskUserThreadLocal.get().getName()); f.setAddeddate(new Date()); f.setDeleted("0"); f.setExtension(extension); @@ -133,6 +132,49 @@ public class CommonsController { return Result.success(); } + @PostMapping("/downLoad") + public void downLoad(UploadDTO file, HttpServletRequest request, HttpServletResponse response){ + + Integer id = file.getId(); + if(id==null){ + throw new BusinessException("未查询到数据"); + } + ZtFile zfFile = this.fileService.getById(id); + if(zfFile==null){ + throw new BusinessException("未查询到数据"); + } + String pathname = zfFile.getPathname(); + + String substring = pathname.substring(pathname.lastIndexOf("/")+1, pathname.length()); + try { + File f = new File(linuxFilePath+"/"+substring); +// File f = new File("D:\\1.bmp"); + InputStream fis = new BufferedInputStream(new FileInputStream(linuxFilePath+"/"+substring)); +// InputStream fis = new BufferedInputStream(new FileInputStream("D:\\1.bmp")); + byte[] buffer = new byte[fis.available()]; + + fis.read(buffer); + fis.close(); + // 清空response + response.reset(); + // 设置response的Header + response.addHeader("Content-Disposition", "attachment;filename=" + new String(substring.getBytes())); + response.addHeader("Content-Length", "" + f.length()); + OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + toClient.write(buffer); + toClient.flush(); + toClient.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + + + public String downLoad(String u){ String ext = u.substring(u.lastIndexOf(".") + 1).toLowerCase(); diff --git a/src/main/java/com/sa/zentao/controller/ZtBugController.java b/src/main/java/com/sa/zentao/controller/ZtBugController.java index a10f652..2523a0f 100644 --- a/src/main/java/com/sa/zentao/controller/ZtBugController.java +++ b/src/main/java/com/sa/zentao/controller/ZtBugController.java @@ -55,6 +55,13 @@ public class ZtBugController { return Result.success(); } + @RequestMapping(value = "/batchAddBug", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result batchAddBug(@RequestBody ZtBugDTO dto){ + bugService.batchAddBug(dto); + + return Result.success(); + } + @RequestMapping(value = "/editBug", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result editBug(@RequestBody ZtBugDTO dto){ bugService.editBug(dto); diff --git a/src/main/java/com/sa/zentao/controller/ZtCountController.java b/src/main/java/com/sa/zentao/controller/ZtCountController.java index f844d61..990a584 100644 --- a/src/main/java/com/sa/zentao/controller/ZtCountController.java +++ b/src/main/java/com/sa/zentao/controller/ZtCountController.java @@ -108,6 +108,18 @@ public class ZtCountController { ); return Result.success(project) ; } + + @RequestMapping(value = "/projectListAsc", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result projectListAsc(@RequestBody ZtCaseDTO dto){ + + List project = projectService.list(new QueryWrapper().lambda().eq(ZtProject::getType, "program") + .eq(ZtProject::getStatus,"doing") + .eq(ZtProject::getDeleted,"0") + .orderByAsc(ZtProject::getId) + ); + return Result.success(project) ; + } + //项目 任务 需求 等统计 项目统计 24-12-13改为项目集统计 @RequestMapping(value = "/projectInfoById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result projectInfoById(@RequestBody ZtCaseDTO dto){ diff --git a/src/main/java/com/sa/zentao/controller/ZtDevelopFeedbackController.java b/src/main/java/com/sa/zentao/controller/ZtDevelopFeedbackController.java new file mode 100644 index 0000000..a324150 --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/ZtDevelopFeedbackController.java @@ -0,0 +1,65 @@ +package com.sa.zentao.controller; + + +import com.sa.zentao.dao.Result; +import com.sa.zentao.dao.ZtDevelopFeedbackDTO; +import com.sa.zentao.dao.ZtMeetingDTO; +import com.sa.zentao.qo.ZtFeedbackQo; +import com.sa.zentao.qo.ZtMeetingQo; +import com.sa.zentao.service.IZtDevelopFeedbackService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + *

+ * 前端控制器 + *

+ * + * @author gqb + * @since 2025-02-05 + */ +@RestController +@RequestMapping("/zt-develop-feedback") +public class ZtDevelopFeedbackController { + + @Autowired + private IZtDevelopFeedbackService developFeedbackService; + + @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result storyPageList(@RequestBody ZtFeedbackQo qo){ + + return Result.success(developFeedbackService.pageList(qo)); + + } + + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result add(@RequestBody ZtDevelopFeedbackDTO dto){ + developFeedbackService.add(dto); + return Result.success(); + } + + @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result modify(@RequestBody ZtDevelopFeedbackDTO dto){ + developFeedbackService.modify(dto); + return Result.success(); + } + @RequestMapping(value = "/myFeedbackList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result myFeedbackList(@RequestBody ZtFeedbackQo qo){ + List list =developFeedbackService.myFeedbackList(qo); + return Result.success(list); + } + @RequestMapping(value = "/getFeedbackById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result getFeedbackById(@RequestBody ZtFeedbackQo qo){ + ZtDevelopFeedbackDTO d =developFeedbackService.getFeedbackById(qo); + return Result.success(d); + } + + +} diff --git a/src/main/java/com/sa/zentao/controller/ZtEffortController.java b/src/main/java/com/sa/zentao/controller/ZtEffortController.java index a8b1480..40d7b90 100644 --- a/src/main/java/com/sa/zentao/controller/ZtEffortController.java +++ b/src/main/java/com/sa/zentao/controller/ZtEffortController.java @@ -6,8 +6,10 @@ import com.sa.zentao.dao.Result; import com.sa.zentao.dao.ZtBugDTO; import com.sa.zentao.dao.ZtEffortDTO; import com.sa.zentao.entity.ZtEffort; +import com.sa.zentao.entity.ZtUser; import com.sa.zentao.qo.EffortQo; import com.sa.zentao.service.IZtEffortService; +import com.sa.zentao.service.IZtUserService; import com.sa.zentao.utils.BeanCopyUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -35,7 +37,8 @@ public class ZtEffortController { @Autowired private IZtEffortService effortService; - + @Autowired + private IZtUserService userService; @RequestMapping(value = "/batchAdd", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result batchAdd(@RequestBody ZtEffortDTO dto){ @@ -60,7 +63,18 @@ public class ZtEffortController { if(CollectionUtils.isEmpty(list)){ return Result.success(); } - return Result.success(BeanCopyUtil.copyListProperties(list,ZtEffortDTO::new)); + List ztEffortDTOS = BeanCopyUtil.copyListProperties(list, ZtEffortDTO::new); + if(!CollectionUtils.isEmpty(ztEffortDTOS)){ + + Map userMap = this.userService.userMapByIds(null); + for (ZtEffortDTO d:ztEffortDTOS){ + ZtUser ztUser = userMap.get(d.getAccount()); + if(ztUser!=null){ + d.setAccountName(ztUser.getNickname()); + } + } + } + return Result.success(ztEffortDTOS); } } diff --git a/src/main/java/com/sa/zentao/controller/ZtMeetingController.java b/src/main/java/com/sa/zentao/controller/ZtMeetingController.java new file mode 100644 index 0000000..0e9ccce --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/ZtMeetingController.java @@ -0,0 +1,66 @@ +package com.sa.zentao.controller; + + +import com.sa.zentao.dao.Result; +import com.sa.zentao.dao.ZtMeetingDTO; +import com.sa.zentao.qo.ZtMeetingQo; +import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.service.IZtMeetingService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author gqb + * @since 2025-01-24 + */ +@RestController +@RequestMapping("/zt-meeting") +public class ZtMeetingController { + + @Autowired + private IZtMeetingService meetingService; + + @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result storyPageList(@RequestBody ZtMeetingQo qo){ + + return Result.success(meetingService.pageList(qo)); + + } + + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result add(@RequestBody ZtMeetingDTO dto){ + meetingService.add(dto); + return Result.success(); + } + + @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result modify(@RequestBody ZtMeetingDTO dto){ + meetingService.modify(dto); + return Result.success(); + } + + + @RequestMapping(value = "/getMeetingById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result getMeetingById(@RequestBody ZtMeetingDTO dto){ + ZtMeetingDTO d = meetingService.getMeetingById(dto); + return Result.success(d); + } + + @RequestMapping(value = "/downLoadById", method = RequestMethod.POST) + public void downLoadById(@RequestBody ZtMeetingDTO dto, HttpServletResponse res, HttpServletRequest request){ + meetingService.downLoadById(dto,res,request); + } + + +} diff --git a/src/main/java/com/sa/zentao/controller/ZtModuleController.java b/src/main/java/com/sa/zentao/controller/ZtModuleController.java index b2942ed..3cdeb48 100644 --- a/src/main/java/com/sa/zentao/controller/ZtModuleController.java +++ b/src/main/java/com/sa/zentao/controller/ZtModuleController.java @@ -77,6 +77,7 @@ public class ZtModuleController { if("story".equalsIgnoreCase(qo.getType())){ List list = moduleService.list(new QueryWrapper().lambda() .eq(ZtModule::getRoot, qo.getId()).eq(ZtModule::getType, qo.getType()) + .eq(ZtModule::getDeleted,"0") ); return Result.success(list); } diff --git a/src/main/java/com/sa/zentao/controller/ZtProductController.java b/src/main/java/com/sa/zentao/controller/ZtProductController.java index 340c6c9..8e975b9 100644 --- a/src/main/java/com/sa/zentao/controller/ZtProductController.java +++ b/src/main/java/com/sa/zentao/controller/ZtProductController.java @@ -3,12 +3,15 @@ package com.sa.zentao.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.BusinessException; import com.sa.zentao.dao.Result; import com.sa.zentao.dao.ZtProductDTO; import com.sa.zentao.dao.ZtProjectDTO; +import com.sa.zentao.entity.ZtExecutionproject; import com.sa.zentao.entity.ZtProduct; import com.sa.zentao.entity.ZtProjectproduct; import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.service.IZtExecutionprojectService; import com.sa.zentao.service.IZtProductService; import com.sa.zentao.service.IZtProjectproductService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,6 +43,9 @@ public class ZtProductController { @Autowired private IZtProjectproductService projectproductService; + @Autowired + private IZtExecutionprojectService executionprojectService; + //项目集 @@ -110,5 +116,22 @@ public class ZtProductController { } + @RequestMapping(value = "/getProductByExecution", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result getProductByExecution(@RequestBody ZtProductDTO dto){ + + ZtExecutionproject executionproject = this.executionprojectService.getOne(new QueryWrapper().lambda().eq(ZtExecutionproject::getExecution, dto.getId())); + if(executionproject==null){ + throw new BusinessException("未查询到迭代"); + } + + ZtProjectproduct project = projectproductService.getOne(new QueryWrapper().lambda() + .eq(ZtProjectproduct::getProject, executionproject.getProject())); + if(project==null){ + return Result.success(); + } + ZtProduct product = ztProductService.getById(project.getProduct()); + return Result.success(product); + } + } diff --git a/src/main/java/com/sa/zentao/controller/ZtProjectController.java b/src/main/java/com/sa/zentao/controller/ZtProjectController.java index 70f1caa..7599ce0 100644 --- a/src/main/java/com/sa/zentao/controller/ZtProjectController.java +++ b/src/main/java/com/sa/zentao/controller/ZtProjectController.java @@ -211,7 +211,7 @@ public class ZtProjectController { } //项目列表 - @RequestMapping(value = "/typeProductList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + @RequestMapping(value = "/typeProjectList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result> typeProductList(@RequestBody ZtProjectQo qo){ return Result.success(ztProjectService.typeProductList(qo)); @@ -242,7 +242,7 @@ public class ZtProjectController { if(project==null){ return Result.success(new ArrayList()); } - List list = ztProjectService.list(new QueryWrapper().lambda().eq(ZtProject::getProject, project.getProject())); + List list = ztProjectService.list(new QueryWrapper().lambda().ne(ZtProject::getStatus,"closed").eq(ZtProject::getProject, project.getProject())); return Result.success(list); } diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryController.java b/src/main/java/com/sa/zentao/controller/ZtStoryController.java index 22b4564..0ec513d 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryController.java @@ -97,6 +97,13 @@ public class ZtStoryController { ztStoryService.addStory(dto); return Result.success(); } + + @RequestMapping(value = "/batchAddStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result batchAddStory(@RequestBody ZtStoryDTO dto){ + ztStoryService.batchAddStory(dto); + return Result.success(); + } + @RequestMapping(value = "/editStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result editStory(@RequestBody ZtStoryDTO dto){ ztStoryService.editStory(dto); @@ -160,8 +167,8 @@ public class ZtStoryController { //切换执行 @RequestMapping(value = "/changeExecution", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result changeExecution(@RequestBody ZtStoryDTO dto){ -// ztStoryService.changeExecution(dto); - throw new BusinessException("弃用"); + ztStoryService.changeExecution(dto); + return Result.success(); } //切换指派 @RequestMapping(value = "/changeAssignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") @@ -185,6 +192,9 @@ public class ZtStoryController { } dto.setProjects(list.stream().map(o->o.getProject()).collect(Collectors.toList())); } + if(CollectionUtils.isEmpty(dto.getProjects())){ + return Result.success(); + } List list = ztStoryService.execListByProject(dto); diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java b/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java index 246f339..06fd030 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.sa.zentao.dao.Result; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryFeedbackDTO; +import com.sa.zentao.dao.ZtStoryUserDTO; import com.sa.zentao.entity.ZtStoryFeedback; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.IZtStoryFeedbackService; @@ -43,6 +44,14 @@ public class ZtStoryFeedbackController { return Result.success(); } + @RequestMapping(value = "/approval", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result approval(@RequestBody ZtStoryFeedbackDTO dto){ + storyFeedbackService.approval(dto); + return Result.success(); + } + + + @RequestMapping(value = "/editFeedback", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result editFeedback(@RequestBody ZtStoryFeedbackDTO dto){ storyFeedbackService.editFeedback(dto); @@ -54,7 +63,11 @@ public class ZtStoryFeedbackController { storyFeedbackService.changeStatus(dto); return Result.success(); } - + @RequestMapping(value = "/closedStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result closedStory(@RequestBody ZtStoryFeedbackDTO dto){ + storyFeedbackService.closedFeedback(dto); + return Result.success(); + } @RequestMapping(value = "/list", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result list(@RequestBody ZtStoryFeedbackDTO dto){ @@ -67,7 +80,7 @@ public class ZtStoryFeedbackController { //指派 @RequestMapping(value = "/assignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") - public Result assignedTo(@RequestBody ZtStoryDTO dto){ + public Result assignedTo(@RequestBody ZtStoryFeedbackDTO dto){ storyFeedbackService.assignedTo(dto); return Result.success(); } diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java index 45e2ced..3add87b 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java @@ -43,6 +43,12 @@ public class ZtStoryUserController { return Result.success(); } + @RequestMapping(value = "/closedStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result closedStory(@RequestBody ZtStoryUserDTO dto){ + storyUserService.closedStory(dto); + return Result.success(); + } + @RequestMapping(value = "/addStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result addStory(@RequestBody ZtStoryUserDTO dto){ @@ -66,7 +72,9 @@ public class ZtStoryUserController { public Result storyList(@RequestBody StoryQo qo){ List list = storyUserService.list(new QueryWrapper() - .lambda().eq(ZtStoryUser::getProduct,qo.getId()).in(ZtStoryUser::getStatus, "wait","active")); + .lambda().eq(ZtStoryUser::getProduct,qo.getId()).in(ZtStoryUser::getStatus, "wait","active") + .orderByDesc(ZtStoryUser::getId) + ); return Result.success(list); } @@ -83,4 +91,17 @@ public class ZtStoryUserController { return Result.success(); } + + //评审 + @RequestMapping(value = "/getUserStoryById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result getUserStoryById(@RequestBody ZtStoryDTO dto){ + ZtStoryUserDTO storyUserDTO = storyUserService.getUserStoryById(dto); + return Result.success(storyUserDTO); + } + //添加备注 + @RequestMapping(value = "/addRemark", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result addRemark(@RequestBody ZtStoryDTO dto){ + storyUserService.addRemark(dto); + return Result.success(); + } } diff --git a/src/main/java/com/sa/zentao/controller/ZtTaskController.java b/src/main/java/com/sa/zentao/controller/ZtTaskController.java index de71fff..5c3e2b2 100644 --- a/src/main/java/com/sa/zentao/controller/ZtTaskController.java +++ b/src/main/java/com/sa/zentao/controller/ZtTaskController.java @@ -161,6 +161,7 @@ public class ZtTaskController { @RequestMapping(value = "/getTaskById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result getTaskById(@RequestBody ZtTaskDTO dto){ ZtTaskDTO task=ztTaskService.getTaskById(dto.getId()); + return Result.success(task); } @@ -395,6 +396,12 @@ public class ZtTaskController { + List oldPStoryList = this.projectstoryService.prdList(oldStory.getId()); + + if(!CollectionUtils.isEmpty(oldPStoryList)&&oldPStoryList.size()>1){ + System.out.print(1); + } + //创建新的需求 oldStory.setProduct(product); @@ -410,8 +417,24 @@ public class ZtTaskController { }); dto.setProject(project); this.projectService.projectSyncStory(dto); - dto.setExcludeId(id1); - this.projectService.executionSyncStory(dto); + + for (ZtProjectstory st:oldPStoryList) { + ZtProjectDTO pro = this.projectService.selectPrdById(st.getProject()); + if(pro!=null){ + //老的迭代 + List newExec = this.projectService.list(new QueryWrapper().lambda() + .eq(ZtProject::getName, pro.getName()).eq(ZtProject::getType, "sprint")); + if(!CollectionUtils.isEmpty(newExec)){ + ZtProject project1 = newExec.get(0); + dto.setExcludeId(project1.getId()); + this.projectService.executionSyncStory(dto); + } + + } + } + + + diff --git a/src/main/java/com/sa/zentao/controller/ZtUserController.java b/src/main/java/com/sa/zentao/controller/ZtUserController.java index 45b5a69..56be578 100644 --- a/src/main/java/com/sa/zentao/controller/ZtUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtUserController.java @@ -10,12 +10,14 @@ import com.sa.zentao.dao.BusinessException; import com.sa.zentao.dao.Result; import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.dao.ZtUserDTO; +import com.sa.zentao.entity.ZtTeam; import com.sa.zentao.entity.ZtUser; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; import com.sa.zentao.mapper.ZtUserMapper; import com.sa.zentao.qo.ZtUserQo; import com.sa.zentao.service.IZtActionService; +import com.sa.zentao.service.IZtTeamService; import com.sa.zentao.service.IZtUserService; import com.sa.zentao.utils.ChineseUtil; import com.sa.zentao.utils.JwtUtil; @@ -35,7 +37,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** *

@@ -58,6 +62,10 @@ public class ZtUserController { @Autowired private ZtUserMapper userMapper; + @Autowired + private IZtTeamService teamService; + + @RequestMapping(value = "/allList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result allList(@RequestBody ZtUser user){ List ztUserDTOS = userMapper.listAll(null); @@ -78,6 +86,16 @@ public class ZtUserController { .or().like(ZtUser::getPinyin,dto.getName()) ; } + if("execution".equals(dto.getType())){ + //迭代id + Integer id = dto.getId(); + List execution = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getRoot, id).eq(ZtTeam::getType, "execution")); + if(CollectionUtils.isEmpty(execution)){ + return Result.success(new ArrayList<>()); + } + eq.in(ZtUser::getAccount,execution.stream().map(o->o.getAccount()).collect(Collectors.toList())); + } + return Result.success(userService.list(eq )); } @@ -138,6 +156,26 @@ public class ZtUserController { return Result.success(); } + @RequestMapping(value = "/updatePassword", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result updatePassword(@RequestBody ZtUserDTO user){ + + ZtUser ztUser = userService.getOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, RiskUserThreadLocal.get().getName())); + + if(!user.getPassword().equals(ztUser.getPassword())){ + throw new BusinessException("旧密码验证失败"); + } + if(ztUser==null){ + throw new BusinessException("未查询到"); + } + ztUser.setPassword(user.getNewPassword()); + + + this.userService.updateById(ztUser); + this.actionService.addAction(ActionType.USER, ActionStatus.XGMM,ztUser.getId(),null,null,null, RiskUserThreadLocal.get().getName(),null,ztUser.getAccount()); + + return Result.success(); + } + @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result modify(@RequestBody ZtUserDTO user){ @@ -165,16 +203,20 @@ public class ZtUserController { if(!CollectionUtils.isEmpty(user.getProductList())){ ztUser.setProductIds(StringUtils.join(user.getProductList(),",")); } - - this.userService.update(new UpdateWrapper().lambda() - .set(ZtUser::getPassword,user.getPassword()) - .set(ZtUser::getUserType,user.getUserType()) - .set(ZtUser::getEmail,user.getEmail()) - .set(ZtUser::getProductIds,ztUser.getProductIds()) - .set(ZtUser::getColor,user.getColor()) - .set(ZtUser::getPhone,ztUser.getPhone()) - .eq(ZtUser::getId,ztUser.getId()) - ); + ztUser.setNickname(user.getNickname()); + ztUser.setColor(user.getColor()); + ztUser.setDeptName(user.getDeptName()); + this.userService.updateById(ztUser); +// this.userService.update(new UpdateWrapper().lambda() +// .set(ZtUser::getPassword,user.getPassword()) +// .set(ZtUser::getUserType,user.getUserType()) +// .set(ZtUser::getEmail,user.getEmail()) +// .set(ZtUser::getProductIds,ztUser.getProductIds()) +// .set(ZtUser::getColor,user.getColor()) +// .set(ZtUser::getPhone,user.getPhone()) +// .set(ZtUser::getNickname,user.getNickname()) +// .eq(ZtUser::getId,ztUser.getId()) +// ); this.actionService.addAction(ActionType.USER, ActionStatus.BJ,ztUser.getId(),null,null,null,RiskUserThreadLocal.get().getName(),null,user.getAccount()); return Result.success(); diff --git a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java new file mode 100644 index 0000000..2c68b4c --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java @@ -0,0 +1,58 @@ +package com.sa.zentao.dao; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = false) +public class PerformanceDTO implements Serializable { + + @ExcelProperty(value = "姓名",index =0) + private String userName; + //任务总量 + @ExcelProperty(value = "账户",index =1) + private String account; + //需求总工时 + @ExcelProperty(value = "天数",index =2) + private BigDecimal days; + //实际产出工时 + @ExcelProperty(value = "可用工时",index =3) + private BigDecimal totalTime; + //可用工时 6*工作天数 + @ExcelProperty(value = "达标工时 ",index =4) + //达标 考核工时 + private BigDecimal examineTime; + //工作饱和度 + @ExcelProperty(value = "产出工时 ",index =5) + private BigDecimal workTime; + @ExcelProperty(value = "分配工时 ",index =6) + private BigDecimal allocationTime; + @ExcelProperty(value = "工作饱和率 ",index =7) + private BigDecimal saturation; + @ExcelProperty(value = "饱和率得分 ",index =8) + private BigDecimal saturationScore; + + @ExcelProperty(value = "延期任务 ",index =9) + private BigDecimal delayTask; + @ExcelProperty(value = "完成任务 ",index =10) + private BigDecimal finishTask; + @ExcelProperty(value = "完成准时率 ",index =11) + private BigDecimal finishPunctuality; + @ExcelProperty(value = "准时率得分 ",index =12) + private BigDecimal punctualityScore; + @ExcelProperty(value = "线上严重bug ",index =13) + private BigDecimal seriousBug; + //产出线上Bug + @ExcelProperty(value = "线上普通bug ",index =14) + private BigDecimal slightBug; + //线上Bug得分 + @ExcelProperty(value = "线上Bug得分 ",index =15) + private BigDecimal bugScore; + //产出线上Bug + @ExcelProperty(value = "总分 ",index =16) + private BigDecimal score; +} diff --git a/src/main/java/com/sa/zentao/dao/ProjectWorkTaskDTO.java b/src/main/java/com/sa/zentao/dao/ProjectWorkTaskDTO.java index 59463b0..5ce5d02 100644 --- a/src/main/java/com/sa/zentao/dao/ProjectWorkTaskDTO.java +++ b/src/main/java/com/sa/zentao/dao/ProjectWorkTaskDTO.java @@ -49,7 +49,7 @@ public class ProjectWorkTaskDTO implements Serializable { private float planTime; @ExcelProperty(value = "剩余工时",index =11) - private float balanceTime; + private Float balanceTime; //状态 @ExcelProperty(value = "状态",index =12) private String status; diff --git a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java index acfd30d..f47288b 100644 --- a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java @@ -12,6 +12,7 @@ import lombok.EqualsAndHashCode; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; +import java.util.List; /** *

@@ -34,6 +35,8 @@ public class ZtBugDTO implements Serializable { private Integer product; + private String productName; + private Integer injection; private Integer identify; @@ -192,4 +195,6 @@ public class ZtBugDTO implements Serializable { private ZtTask ztTask; private String files; + + private List list; } diff --git a/src/main/java/com/sa/zentao/dao/ZtDevelopFeedbackDTO.java b/src/main/java/com/sa/zentao/dao/ZtDevelopFeedbackDTO.java new file mode 100644 index 0000000..90d42b6 --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/ZtDevelopFeedbackDTO.java @@ -0,0 +1,72 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-02-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtDevelopFeedbackDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 产品 + */ + private Integer productId; + private String productName; + /** + * 等级 + */ + private Integer level; + + /** + * 提出时间 + */ + private Date proposeTime; + + /** + * 责任人 + */ + private String assignedTo; + private String assignedToName; + /** + * 描述 + */ + private String remark; + + /** + * 分析描述 + */ + private String analysisRemark; + + /** + * 处理措施 + */ + private String handleRemark; + + private String createUser; + private String createUserName; + private Date createDate; + + private Date updateDate; + + private String updateUser; + private String updateUserName; + +} diff --git a/src/main/java/com/sa/zentao/dao/ZtEffortDTO.java b/src/main/java/com/sa/zentao/dao/ZtEffortDTO.java index 737e0cc..5c0a3f1 100644 --- a/src/main/java/com/sa/zentao/dao/ZtEffortDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtEffortDTO.java @@ -41,7 +41,7 @@ public class ZtEffortDTO implements Serializable { private Integer execution; private String account; - + private String accountName; private String work; private String vision; diff --git a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java new file mode 100644 index 0000000..97a797e --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java @@ -0,0 +1,71 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.sa.zentao.enums.MeetingTypeEnums; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-01-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtMeetingDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer productId; + private String productName; + + /** + * 会议名称 + */ + private String name; + + /** + * 会议类型 周会议/需求会议/临时会议 + */ + private MeetingTypeEnums type; + + + /** + * 时间 + */ + private Date meetingDate; + + /** + * 用户,隔开 + */ + private String users; + private String usersName; + /** + * 会议内容 + */ + private String remark; + + private String createUser; + + private String createUserName; + private Date createDate; + + private String updateUser; + + private Date updateDate; + + private String files; + + private String address; +} diff --git a/src/main/java/com/sa/zentao/dao/ZtProductDTO.java b/src/main/java/com/sa/zentao/dao/ZtProductDTO.java index 0e28d57..5584f46 100644 --- a/src/main/java/com/sa/zentao/dao/ZtProductDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtProductDTO.java @@ -7,8 +7,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Date; import java.util.List; /** @@ -93,19 +95,23 @@ public class ZtProductDTO implements Serializable { @TableField("totalStories") private Integer totalStories; - + //为解决 @TableField("unresolvedBugs") private Integer unresolvedBugs; - + //关闭 @TableField("closedBugs") private Integer closedBugs; - + //确认 @TableField("fixedBugs") private Integer fixedBugs; @TableField("totalBugs") private Integer totalBugs; + private BigDecimal finishBugRatio; + + private BigDecimal finishTaskRatio; + private Integer plans; private Integer releases; @@ -114,13 +120,13 @@ public class ZtProductDTO implements Serializable { private String createdBy; @TableField("createdDate") - private LocalDateTime createdDate; + private Date createdDate; @TableField("createdVersion") private String createdVersion; @TableField("closedDate") - private LocalDate closedDate; + private Date closedDate; private Integer order; @@ -130,6 +136,8 @@ public class ZtProductDTO implements Serializable { private String poValue; + private Integer yss; + private List approvalList; private List authList; diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryCountDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryCountDTO.java index 97ee221..fd56154 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryCountDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryCountDTO.java @@ -62,4 +62,6 @@ public class ZtStoryCountDTO implements Serializable { private String feedbackClwCount; //延期的 private String feedbackYqCount; + //关闭的 + private String feedbackGbCount; } diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java index 903495b..df58196 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java @@ -33,9 +33,8 @@ public class ZtStoryDTO implements Serializable { private List idList; private String vision; - private Integer parent; - + private String parentName; private Integer product; private Integer productId; @@ -49,7 +48,7 @@ public class ZtStoryDTO implements Serializable { private Integer branch; private Integer module; - + private String moduleName; private String plan; private String source; @@ -132,7 +131,7 @@ public class ZtStoryDTO implements Serializable { @TableField("reviewedBy") private String reviewedby; - + private String reviewedbyName; private String revieweUser; private Integer revieweResult; @@ -243,10 +242,15 @@ public class ZtStoryDTO implements Serializable { private Integer userStory; + private String userStoryName; + private String ysRemark; //验收人 private String ysUser; + //验收人 + private String ysUserName; + private Integer taskCount; private Integer releaseFlag=0; diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java index 9b3274e..371aef4 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java @@ -23,6 +23,8 @@ public class ZtStoryFeedbackDTO implements Serializable { private Integer id; + private String vx; + /** * 名称 */ @@ -75,6 +77,8 @@ public class ZtStoryFeedbackDTO implements Serializable { private String closeRemark; private Integer product; + + private String productName; //预计完成时间 private Date planFinishDate; @@ -84,4 +88,16 @@ public class ZtStoryFeedbackDTO implements Serializable { private Date handDate; //关闭日期 private Date closeDate; + //来源 zentao weixin + private String openSource; + //业务id + private String businessId; + //1.通过 0不通过 + private Integer approval; + + private String approvalRemark; + + private String weixin; + + private String urls; } diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java index 2cc30cc..ce3dca4 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryUserDTO.java @@ -33,14 +33,18 @@ public class ZtStoryUserDTO implements Serializable { private Integer parent; + private String parentName; + private Integer product; + private String productName; + private Integer project; private Integer branch; private Integer module; - + private String moduleName; private String plan; private String source; @@ -90,8 +94,10 @@ public class ZtStoryUserDTO implements Serializable { @TableField("openedBy") private String openedby; + private String openedbyName; + @TableField("openedDate") - private LocalDateTime openeddate; + private Date openeddate; @TableField("assignedTo") private String assignedto; @@ -116,7 +122,7 @@ public class ZtStoryUserDTO implements Serializable { @TableField("reviewedBy") private String reviewedby; - + private String reviewedbyName; @TableField("reviewedDate") private Date revieweddate; @@ -209,4 +215,6 @@ public class ZtStoryUserDTO implements Serializable { private String revieweUser; private String files; + + private String verify; } diff --git a/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java b/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java index f617eae..c8a1513 100644 --- a/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java @@ -189,4 +189,6 @@ public class ZtTaskDTO implements Serializable { private Integer finishedFlag=0; private String implementName; private Integer implementId; + private Integer product; + private String productName; } diff --git a/src/main/java/com/sa/zentao/dao/ZtUserDTO.java b/src/main/java/com/sa/zentao/dao/ZtUserDTO.java index f0e5e9b..751d53d 100644 --- a/src/main/java/com/sa/zentao/dao/ZtUserDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtUserDTO.java @@ -34,11 +34,15 @@ public class ZtUserDTO implements Serializable { private Integer dept; + private String deptName; + private String account; @TableField("`password`") private String password; + + private String newPassword; private String role; private String realname; diff --git a/src/main/java/com/sa/zentao/dao/ZtYwTaskDTO.java b/src/main/java/com/sa/zentao/dao/ZtYwTaskDTO.java index 6c831bc..287510c 100644 --- a/src/main/java/com/sa/zentao/dao/ZtYwTaskDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtYwTaskDTO.java @@ -95,4 +95,6 @@ public class ZtYwTaskDTO implements Serializable { private String copyToUser; private String copyMail; + + private Integer level; } diff --git a/src/main/java/com/sa/zentao/entity/ZtDevelopFeedback.java b/src/main/java/com/sa/zentao/entity/ZtDevelopFeedback.java new file mode 100644 index 0000000..5f63f8c --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/ZtDevelopFeedback.java @@ -0,0 +1,74 @@ +package com.sa.zentao.entity; + +import java.time.LocalDateTime; +import java.sql.Blob; +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-02-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtDevelopFeedback implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 产品 + */ + private Integer productId; + + /** + * 等级 + */ + private Integer level; + + /** + * 提出时间 + */ + private Date proposeTime; + + /** + * 责任人 + */ + private String assignedTo; + + /** + * 描述 + */ + private String remark; + + /** + * 分析描述 + */ + private String analysisRemark; + + /** + * 处理措施 + */ + private String handleRemark; + + private String createUser; + + private Date createDate; + + private Date updateDate; + + private String updateUser; + + +} diff --git a/src/main/java/com/sa/zentao/entity/ZtMeeting.java b/src/main/java/com/sa/zentao/entity/ZtMeeting.java new file mode 100644 index 0000000..928526c --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/ZtMeeting.java @@ -0,0 +1,68 @@ +package com.sa.zentao.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import java.sql.Blob; +import java.io.Serializable; +import java.util.Date; + +import com.sa.zentao.enums.MeetingTypeEnums; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-01-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtMeeting implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer productId; + + /** + * 会议名称 + */ + private String name; + + /** + * 会议类型 周会议/需求会议/临时会议 + */ + private MeetingTypeEnums type; + + /** + * 时间 + */ + private Date meetingDate; + + /** + * 用户,隔开 + */ + private String users; + + /** + * 会议内容 + */ + private String remark; + + private String createUser; + + private Date createDate; + + private String updateUser; + + private Date updateDate; + + private String address; + +} diff --git a/src/main/java/com/sa/zentao/entity/ZtProduct.java b/src/main/java/com/sa/zentao/entity/ZtProduct.java index 1c10e40..315a935 100644 --- a/src/main/java/com/sa/zentao/entity/ZtProduct.java +++ b/src/main/java/com/sa/zentao/entity/ZtProduct.java @@ -129,7 +129,7 @@ public class ZtProduct implements Serializable { private String createdVersion; @TableField("closedDate") - private LocalDate closedDate; + private Date closedDate; @TableField("`order`") private Integer order; @@ -138,5 +138,6 @@ public class ZtProduct implements Serializable { private String deleted; + private Integer yss; } diff --git a/src/main/java/com/sa/zentao/entity/ZtStory.java b/src/main/java/com/sa/zentao/entity/ZtStory.java index 1ad3365..091c0e8 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStory.java +++ b/src/main/java/com/sa/zentao/entity/ZtStory.java @@ -61,7 +61,7 @@ public class ZtStory implements Serializable { private Integer pri; private Float estimate; - //reviewing 评审中 active 激活 draft 草稿 + //reviewing 评审中 active 激活 draft 草稿 //finished 完成 验收完成 private String status; @TableField("subStatus") diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java index 9150243..ae3ee15 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java @@ -64,7 +64,7 @@ public class ZtStoryFeedback implements Serializable { private String assignedTo; private String spec; - // wait doing finished closed + // wait doing finished closed reviewing private String status; @@ -86,4 +86,15 @@ public class ZtStoryFeedback implements Serializable { private Date handDate; //关闭日期 private Date closeDate; + private String closedBy; + +// 来源 zentao weixin + private String openSource; + + + private String approvalRemark; + + private String businessId; + + private String weixin; } diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java index 831caf3..bc53778 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java @@ -196,4 +196,6 @@ public class ZtStoryUser implements Serializable { private String spec; private String fileUrl; + + private String verify; } diff --git a/src/main/java/com/sa/zentao/entity/ZtTask.java b/src/main/java/com/sa/zentao/entity/ZtTask.java index 41bad97..98f53a1 100644 --- a/src/main/java/com/sa/zentao/entity/ZtTask.java +++ b/src/main/java/com/sa/zentao/entity/ZtTask.java @@ -173,4 +173,6 @@ public class ZtTask implements Serializable { private String reviewingUser; private Long deadlineTime; + + private Integer product; } diff --git a/src/main/java/com/sa/zentao/entity/ZtUser.java b/src/main/java/com/sa/zentao/entity/ZtUser.java index 4db5041..417949b 100644 --- a/src/main/java/com/sa/zentao/entity/ZtUser.java +++ b/src/main/java/com/sa/zentao/entity/ZtUser.java @@ -35,6 +35,8 @@ public class ZtUser implements Serializable { private Integer dept; + private String deptName; + private String account; @TableField("`password`") @@ -131,4 +133,5 @@ public class ZtUser implements Serializable { private String color; + private String vx; } diff --git a/src/main/java/com/sa/zentao/entity/ZtYwTask.java b/src/main/java/com/sa/zentao/entity/ZtYwTask.java index e0c9317..8bd0064 100644 --- a/src/main/java/com/sa/zentao/entity/ZtYwTask.java +++ b/src/main/java/com/sa/zentao/entity/ZtYwTask.java @@ -96,4 +96,6 @@ public class ZtYwTask implements Serializable { private String result; private String copyToUser; private String copyMail; + + private Integer level; } diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java index bca4e10..cccfa34 100644 --- a/src/main/java/com/sa/zentao/enums/ActionStatus.java +++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java @@ -17,19 +17,21 @@ public enum ActionStatus { WC(10, "finished","完成"), QX(11, "canceled","取消"), TJBZ(12, "commented","添加备注"), + PSTG(13, "reviewpassed","评审通过"), PSYDMQ(14, "reviewclarified","评审有待明确"), PSBTG(15, "reviewrejected","评审不通过"), YSTG(16, "ystg","验收通过"), YSBTG(17, "ysbtg","验收不通过"), - FB(18, "fb","发布"), - + FBCG(18, "fb","发布通过"), + FBSB(30, "fb","发布不通过"), QR(19, "qr","确认"), KSCE(21, "tested","开始测试"), CSWC(20, "tested","测试完成"), LOGIN(100, "login","登录"), + XGMM(101, "xgmm","修改密码"), ; @EnumValue diff --git a/src/main/java/com/sa/zentao/enums/ActionType.java b/src/main/java/com/sa/zentao/enums/ActionType.java index 7e3f2dc..ef3f0d4 100644 --- a/src/main/java/com/sa/zentao/enums/ActionType.java +++ b/src/main/java/com/sa/zentao/enums/ActionType.java @@ -7,11 +7,14 @@ public enum ActionType { XMJ(1, "program","项目集"), XM(2, "project","项目"), CP(3, "product","产品"), - ZX(3, "execution","执行"), + ZX(13, "execution","执行"), XQ(4, "story","需求"), - FB(4, "release","发布"), + MEET(24, "meeting","会议"), + DEVLOPSFEEDBACK(25, "devopsfeedback","问题记录"), + + FB(34, "release","发布"), USERXQ(14, "user-story","用户需求"), diff --git a/src/main/java/com/sa/zentao/enums/FileTypes.java b/src/main/java/com/sa/zentao/enums/FileTypes.java index a2314b6..23d0b81 100644 --- a/src/main/java/com/sa/zentao/enums/FileTypes.java +++ b/src/main/java/com/sa/zentao/enums/FileTypes.java @@ -10,7 +10,7 @@ public enum FileTypes { userStory("userStory", "用户需求"), feedbackStory("feedbackStory", "问题反馈"), ywTask("ywTask", "运维任务"), - + meeting("meeting", "会议"), ; @EnumValue diff --git a/src/main/java/com/sa/zentao/enums/MeetingTypeEnums.java b/src/main/java/com/sa/zentao/enums/MeetingTypeEnums.java new file mode 100644 index 0000000..6f9ddd7 --- /dev/null +++ b/src/main/java/com/sa/zentao/enums/MeetingTypeEnums.java @@ -0,0 +1,30 @@ +package com.sa.zentao.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; + +public enum MeetingTypeEnums { + + week(1, "周会议"), + story(2, "需求会议"), + temporary(3, "临时会议"), + + ; + + @EnumValue + private int code; + private String value; + + private MeetingTypeEnums(int code, String value) { + this.code = code; + this.value = value; + } + + public int getCode() { + return this.code; + } + + public String getValue() { + return this.value; + } + +} diff --git a/src/main/java/com/sa/zentao/mapper/ZtDevelopFeedbackMapper.java b/src/main/java/com/sa/zentao/mapper/ZtDevelopFeedbackMapper.java new file mode 100644 index 0000000..d79a5a7 --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/ZtDevelopFeedbackMapper.java @@ -0,0 +1,24 @@ +package com.sa.zentao.mapper; + +import com.sa.zentao.dao.ZtDevelopFeedbackDTO; +import com.sa.zentao.entity.ZtDevelopFeedback; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.qo.ZtFeedbackQo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author gqb + * @since 2025-02-05 + */ +public interface ZtDevelopFeedbackMapper extends BaseMapper { + + List pageList(@Param("qo") ZtFeedbackQo qo); + + List myFeedbackList(@Param("qo")ZtFeedbackQo qo); +} diff --git a/src/main/java/com/sa/zentao/mapper/ZtMeetingMapper.java b/src/main/java/com/sa/zentao/mapper/ZtMeetingMapper.java new file mode 100644 index 0000000..aa14be3 --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/ZtMeetingMapper.java @@ -0,0 +1,23 @@ +package com.sa.zentao.mapper; + +import com.sa.zentao.dao.ZtMeetingDTO; +import com.sa.zentao.entity.ZtMeeting; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.qo.ZtMeetingQo; +import com.sa.zentao.qo.ZtProjectQo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author gqb + * @since 2025-01-24 + */ +public interface ZtMeetingMapper extends BaseMapper { + + List pageList(@Param("qo") ZtMeetingQo qo); +} diff --git a/src/main/java/com/sa/zentao/mapper/ZtProjectMapper.java b/src/main/java/com/sa/zentao/mapper/ZtProjectMapper.java index 43e88d1..7424be7 100644 --- a/src/main/java/com/sa/zentao/mapper/ZtProjectMapper.java +++ b/src/main/java/com/sa/zentao/mapper/ZtProjectMapper.java @@ -1,6 +1,7 @@ package com.sa.zentao.mapper; import com.baomidou.dynamic.datasource.annotation.DS; +import com.sa.zentao.dao.PerformanceDTO; import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.entity.ZtProject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -8,6 +9,7 @@ import com.sa.zentao.qo.ZtProjectQo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -33,4 +35,8 @@ public interface ZtProjectMapper extends BaseMapper { @DS("slave") ZtProjectDTO selectPrdByName(@Param("name") String name); + @DS("slave") + ZtProjectDTO selectPrdById(@Param("id") Integer id); + + List performanceCount(@Param("startDate") Date startDate,@Param("endDate") Date endDate); } diff --git a/src/main/java/com/sa/zentao/mapper/ZtProjectstoryMapper.java b/src/main/java/com/sa/zentao/mapper/ZtProjectstoryMapper.java index 8418044..54d2894 100644 --- a/src/main/java/com/sa/zentao/mapper/ZtProjectstoryMapper.java +++ b/src/main/java/com/sa/zentao/mapper/ZtProjectstoryMapper.java @@ -20,4 +20,6 @@ public interface ZtProjectstoryMapper extends BaseMapper { @DS("slave") List storyListPrd(@Param("id") Integer id); + @DS("slave") + List prdList(@Param("id")Integer id); } diff --git a/src/main/java/com/sa/zentao/qo/BaseQo.java b/src/main/java/com/sa/zentao/qo/BaseQo.java index b5f7a9c..e64d0eb 100644 --- a/src/main/java/com/sa/zentao/qo/BaseQo.java +++ b/src/main/java/com/sa/zentao/qo/BaseQo.java @@ -2,6 +2,7 @@ package com.sa.zentao.qo; import com.alibaba.excel.annotation.ExcelIgnore; import lombok.Data; +import org.apache.commons.lang3.StringUtils; import java.util.Date; @@ -15,4 +16,9 @@ public class BaseQo { private Date startDate; @ExcelIgnore private Date endDate; + + @ExcelIgnore + private String productName; + + } diff --git a/src/main/java/com/sa/zentao/qo/StoryQo.java b/src/main/java/com/sa/zentao/qo/StoryQo.java index 8d18aa8..4d81ba6 100644 --- a/src/main/java/com/sa/zentao/qo/StoryQo.java +++ b/src/main/java/com/sa/zentao/qo/StoryQo.java @@ -21,6 +21,8 @@ public class StoryQo extends BaseQo { private Integer productId; + private List productIds; + private String ids; private List storyIds; diff --git a/src/main/java/com/sa/zentao/qo/ZtFeedbackQo.java b/src/main/java/com/sa/zentao/qo/ZtFeedbackQo.java new file mode 100644 index 0000000..ae10bbb --- /dev/null +++ b/src/main/java/com/sa/zentao/qo/ZtFeedbackQo.java @@ -0,0 +1,32 @@ +package com.sa.zentao.qo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.sa.zentao.enums.MeetingTypeEnums; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2024-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtFeedbackQo extends BaseQo { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private MeetingTypeEnums type; + private String title; + + private Integer productId; + + private String userName; +} diff --git a/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java b/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java new file mode 100644 index 0000000..d3e90ee --- /dev/null +++ b/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java @@ -0,0 +1,33 @@ +package com.sa.zentao.qo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.sa.zentao.enums.MeetingTypeEnums; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2024-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtMeetingQo extends BaseQo { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private MeetingTypeEnums type; + private String title; + + private Integer productId; +} diff --git a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java index c92fed9..60b1227 100644 --- a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java @@ -30,6 +30,7 @@ public class ZtProjectQo extends BaseQo { @TableId(value = "id", type = IdType.AUTO) private Integer id; + private String productName; private Integer productId; @@ -69,7 +70,6 @@ public class ZtProjectQo extends BaseQo { private String searchCode; private String searchValue; - private String orderName; private String orderSort; @@ -79,4 +79,6 @@ public class ZtProjectQo extends BaseQo { private String ids; private List objIds; + + private List projectList; } diff --git a/src/main/java/com/sa/zentao/service/IZtBugService.java b/src/main/java/com/sa/zentao/service/IZtBugService.java index 796fa7e..2fc82ce 100644 --- a/src/main/java/com/sa/zentao/service/IZtBugService.java +++ b/src/main/java/com/sa/zentao/service/IZtBugService.java @@ -34,4 +34,7 @@ public interface IZtBugService extends IService { ZtBugDTO bugInfoById(Integer id); void assignedTo(ZtBugQo qo); + + void batchAddBug(ZtBugDTO dto); + } diff --git a/src/main/java/com/sa/zentao/service/IZtDevelopFeedbackService.java b/src/main/java/com/sa/zentao/service/IZtDevelopFeedbackService.java new file mode 100644 index 0000000..2f399cd --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IZtDevelopFeedbackService.java @@ -0,0 +1,33 @@ +package com.sa.zentao.service; + +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.ZtDevelopFeedbackDTO; +import com.sa.zentao.dao.ZtMeetingDTO; +import com.sa.zentao.entity.ZtDevelopFeedback; +import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.qo.ZtFeedbackQo; +import com.sa.zentao.qo.ZtMeetingQo; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author gqb + * @since 2025-02-05 + */ +public interface IZtDevelopFeedbackService extends IService { + + PageInfo pageList(ZtFeedbackQo qo); + + void add(ZtDevelopFeedbackDTO dto); + + void modify(ZtDevelopFeedbackDTO dto); + + List myFeedbackList(ZtFeedbackQo qo); + + ZtDevelopFeedbackDTO getFeedbackById(ZtFeedbackQo qo); + +} diff --git a/src/main/java/com/sa/zentao/service/IZtMeetingService.java b/src/main/java/com/sa/zentao/service/IZtMeetingService.java new file mode 100644 index 0000000..82f62d9 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IZtMeetingService.java @@ -0,0 +1,32 @@ +package com.sa.zentao.service; + +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.ZtMeetingDTO; +import com.sa.zentao.entity.ZtMeeting; +import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.qo.ZtMeetingQo; +import com.sa.zentao.qo.ZtProjectQo; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +/** + *

+ * 服务类 + *

+ * + * @author gqb + * @since 2025-01-24 + */ +public interface IZtMeetingService extends IService { + + PageInfo pageList(ZtMeetingQo qo); + + void add(ZtMeetingDTO dto); + + void modify(ZtMeetingDTO dto); + + ZtMeetingDTO getMeetingById(ZtMeetingDTO dto); + + void downLoadById(ZtMeetingDTO dto, HttpServletResponse res, HttpServletRequest request); +} diff --git a/src/main/java/com/sa/zentao/service/IZtProductService.java b/src/main/java/com/sa/zentao/service/IZtProductService.java index a70e8e1..6755f42 100644 --- a/src/main/java/com/sa/zentao/service/IZtProductService.java +++ b/src/main/java/com/sa/zentao/service/IZtProductService.java @@ -9,6 +9,7 @@ import com.sa.zentao.enums.ProductStoryStatus; import com.sa.zentao.qo.ZtProjectQo; import java.util.List; +import java.util.Map; /** *

@@ -37,4 +38,10 @@ public interface IZtProductService extends IService { void productDeleted(ZtProductDTO dto); void productChangeStatus(Integer pId, ProductStoryStatus oldStatus, ProductStoryStatus newStatus); + + List selectProductByName(String productName); + + Map selectMapProduct(); + + } diff --git a/src/main/java/com/sa/zentao/service/IZtProjectService.java b/src/main/java/com/sa/zentao/service/IZtProjectService.java index 2501bdf..7477916 100644 --- a/src/main/java/com/sa/zentao/service/IZtProjectService.java +++ b/src/main/java/com/sa/zentao/service/IZtProjectService.java @@ -1,6 +1,7 @@ package com.sa.zentao.service; import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.PerformanceDTO; import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.ZtProject; @@ -8,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.sa.zentao.entity.ZtUser; import com.sa.zentao.qo.ZtProjectQo; +import java.util.Date; import java.util.List; import java.util.Map; @@ -70,6 +72,9 @@ public interface IZtProjectService extends IService { void executionSyncStory(ZtProjectDTO dto); + + //产品集权限 + List authProductList(); //产品集权限 List authList(); //项目权限合集 @@ -102,4 +107,8 @@ public interface IZtProjectService extends IService { List execListByProject(Integer project); void removeExecutionStory(Integer id,List execList); + + ZtProjectDTO selectPrdById(Integer project); + + List performanceCount(Date startDate, Date endDate); } diff --git a/src/main/java/com/sa/zentao/service/IZtProjectstoryService.java b/src/main/java/com/sa/zentao/service/IZtProjectstoryService.java index 3b8a124..155058b 100644 --- a/src/main/java/com/sa/zentao/service/IZtProjectstoryService.java +++ b/src/main/java/com/sa/zentao/service/IZtProjectstoryService.java @@ -23,4 +23,6 @@ public interface IZtProjectstoryService extends IService { List projectListByStory(List storyIds, ProjectTypeEnums type); //一个项目只能关联一个story ZtProjectstory getProject(Integer storyId); + + List prdList(Integer id); } diff --git a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java index f868cc0..1d96586 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java @@ -27,7 +27,7 @@ public interface IZtStoryFeedbackService extends IService { void changeStatus(ZtStoryFeedbackDTO dto); - void assignedTo(ZtStoryDTO dto); + void assignedTo(ZtStoryFeedbackDTO dto); void startHand(ZtStoryDTO dto); @@ -35,4 +35,8 @@ public interface IZtStoryFeedbackService extends IService { PageInfo myFeedbackPageList(ZtProjectQo qo); + void closedFeedback(ZtStoryFeedbackDTO dto); + + void approval(ZtStoryFeedbackDTO dto); + } diff --git a/src/main/java/com/sa/zentao/service/IZtStoryService.java b/src/main/java/com/sa/zentao/service/IZtStoryService.java index 4c59daa..a5512e1 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryService.java @@ -81,4 +81,6 @@ public interface IZtStoryService extends IService { List myStoryList(ZtProjectQo qo); Map> getExecutionMapByStory(List list); + + void batchAddStory(ZtStoryDTO dto); } diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserService.java index 7c22dbe..a217314 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryUserService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryUserService.java @@ -3,6 +3,7 @@ package com.sa.zentao.service; import com.github.pagehelper.PageInfo; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryUserDTO; +import com.sa.zentao.entity.ZtProduct; import com.sa.zentao.entity.ZtStoryUser; import com.baomidou.mybatisplus.extension.service.IService; import com.sa.zentao.qo.StoryQo; @@ -30,6 +31,11 @@ public interface IZtStoryUserService extends IService { List storyListByProductId(ZtProjectQo qo); - void userReview(ZtStoryDTO dto); + ZtStoryUserDTO userReview(ZtStoryDTO dto); + ZtStoryUserDTO getUserStoryById(ZtStoryDTO dto); + + void addRemark(ZtStoryDTO dto); + + void closedStory(ZtStoryUserDTO dto); } diff --git a/src/main/java/com/sa/zentao/service/IZtUserService.java b/src/main/java/com/sa/zentao/service/IZtUserService.java index a541f09..a15a730 100644 --- a/src/main/java/com/sa/zentao/service/IZtUserService.java +++ b/src/main/java/com/sa/zentao/service/IZtUserService.java @@ -34,4 +34,6 @@ public interface IZtUserService extends IService { ZtUser login(ZtUser user); ZtUser selectPrdByName(String userName); + + ZtUser getbyVxId(String vx); } diff --git a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java index b433cf0..43b6196 100644 --- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java +++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java @@ -149,22 +149,78 @@ public class IZtCountService { private IZtProjectproductService projectproductService; @Autowired private IZtProductService productService; + @Autowired + private IZtStoryreviewService storyreviewService; public ZtStoryCountDTO storyCount(ZtCaseDTO dto) { LoginRiskUser loginRiskUser = RiskUserThreadLocal.get(); - UserType userType = loginRiskUser.getUserType(); ZtStoryCountDTO result = new ZtStoryCountDTO(); - if (userType == UserType.GSGC||loginRiskUser.getName().equals("admin")) { + if (loginRiskUser.getName().equals("admin")||userType == UserType.GSGC) { + List integers = this.projectService.authProductList(); + List list =null; + + if(!loginRiskUser.getName().equals("admin")){ + if(!CollectionUtils.isEmpty(integers)){ + list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getProduct,integers).in(ZtStoryUser::getStatus, "active", "reviewing")); + }else{ + list=new ArrayList<>(); + } + }else{ + list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); + } + + List ztStory = null; + + + if(!loginRiskUser.getName().equals("admin")){ + if(!CollectionUtils.isEmpty(integers)){ + ztStory = storyService.list(new QueryWrapper() + .lambda().eq(ZtStory::getDeleted, "0") + .in(ZtStory::getProduct,integers) + .ne(ZtStory::getStatus, "closed") + ); + }else{ + ztStory=new ArrayList<>(); + } + }else{ + if(CollectionUtils.isEmpty(list)){ + ztStory=new ArrayList<>(); + }else{ + ztStory = storyService.list(new QueryWrapper() + .lambda().eq(ZtStory::getDeleted, "0") + .ne(ZtStory::getStatus, "closed") + ); + } + + } + + List products = this.productService.list(new QueryWrapper().lambda().eq(ZtProduct::getStatus, "normal")); + if(!CollectionUtils.isEmpty(products)){ + List userStrList = products.stream().filter(o -> !StringUtils.isEmpty(o.getReviewer())).map(o->o.getReviewer()).collect(Collectors.toList()); + List users=new ArrayList<>(); + for (String str:userStrList) { + users.addAll(new ArrayList<>(Arrays.asList(str.split(",")))); + } + if(users.contains(loginRiskUser.getName())){ + List userStoryList = list.stream().filter(o -> "reviewing".equals(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.toList()); + if(CollectionUtils.isEmpty(userStoryList)){ + result.setDpsCount(""); + }else{ + List userStory = this.storyreviewService.list(new QueryWrapper().lambda().eq(ZtStoryreview::getType, "userStory").in(ZtStoryreview::getStory, userStoryList)); + result.setDpsCount(userStory.stream().filter(o ->StringUtils.isEmpty(o.getResult())&&loginRiskUser.getName().equals(o.getReviewer()) ).map(o->o.getStory().toString()).collect(Collectors.joining(","))); + } + + }else{ + result.setDpsCount(list.stream().filter(o -> "reviewing".equals(o.getStatus())).map(o->o.getId()+"").collect(Collectors.joining(","))); + } + }else{ + result.setDpsCount(list.stream().filter(o -> "reviewing".equals(o.getStatus())).map(o->o.getId()+"").collect(Collectors.joining(","))); + } + - List list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); - List ztStory = storyService.list(new QueryWrapper() - .lambda().eq(ZtStory::getDeleted, "0") - .ne(ZtStory::getStatus, "closed") - ); - result.setDpsCount(list.stream().filter(o -> "reviewing".equals(o.getStatus())).map(o->o.getId()+"").collect(Collectors.joining(","))); result.setPstgCount(list.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("wait")).map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -173,18 +229,35 @@ public class IZtCountService { result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("testing")).map(o->o.getId()+"").collect(Collectors.joining(","))); - +// developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕 result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("developing")).map(o->o.getId()+"").collect(Collectors.joining(","))); - result.setYqCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> !o.getStage().equals("verified") && !o.getStage().equals("verified")) - .filter(o -> o.getPlanEndDate() != null && o.getPlanEndDate().getTime() < new Date().getTime()) - .map(o->o.getId()+"").collect(Collectors.joining(","))); + .filter(o -> Arrays.asList("developing","developed","testing","tested").contains(o.getStage()) + ).map(o->o.getId()+"").collect(Collectors.joining(","))); + + + if(CollectionUtils.isEmpty(ztStory)){ + result.setYqCount(null); + }else{ + //延期需求改成延期任务 + List tList = this.taskService.list(new QueryWrapper().lambda() + .in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList())) + .notIn(ZtTask::getStatus,"pause","cancel","closed","done") + .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); + result.setYqCount(tList.stream().map(o->o.getId()+"").collect(Collectors.joining(","))); + } + +// result.setYqCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) +// .filter(o -> !o.getStage().equals("verified") && !o.getStage().equals("verified")) +// .filter(o -> o.getPlanEndDate() != null && o.getPlanEndDate().getTime() < new Date().getTime()) +// .map(o->o.getId()+"").collect(Collectors.joining(","))); + result.setCswbCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("tested")) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setDysCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("released")) + .filter(o -> o.getStage().equals("released") + || (o.getStage().equals("verified")&&o.getYsFlag()==2) + ) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("verified")) @@ -204,33 +277,59 @@ public class IZtCountService { //处理完的 result.setFeedbackClwCount(feedbacks.stream().filter(o->"finished".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); //延期的 - result.setFeedbackYqCount(feedbacks.stream().filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); + result.setFeedbackYqCount(feedbacks.stream().filter(o->!Arrays.asList("finished","closed").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); + result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - } else if (userType == UserType.CP) { + } else if (userType == UserType.CP ) { List integers = this.projectService.authList(); + List list =null; + List storyUsers =null; + if(CollectionUtils.isEmpty(integers)){ + list=new ArrayList<>(); + storyUsers=new ArrayList<>(); + }else{ + list = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, integers)); + storyUsers = this.storyUserService.list(new QueryWrapper().lambda() + .in(ZtStoryUser::getStatus, "active", "reviewing") + .in(ZtStoryUser::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList())) +// .eq(ZtStoryUser::getAssignedto,loginRiskUser.getName()) + .eq(ZtStoryUser::getOpenedby,loginRiskUser.getName()) + ); + } - List list = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, integers)); - - List storyUsers = this.storyUserService.list(new QueryWrapper().lambda() - .in(ZtStoryUser::getStatus, "active", "reviewing") - .in(ZtStoryUser::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList())) - .eq(ZtStoryUser::getAssignedto,loginRiskUser.getName()) - ); //产品看自己的需求 List ztStory =null; if(CollectionUtils.isEmpty(list)){ ztStory=new ArrayList<>(); + result.setYqCount(null); }else{ - ztStory = storyService.list(new QueryWrapper() - .lambda().eq(ZtStory::getDeleted, "0") - .ne(ZtStory::getStatus, "closed") - .eq(ZtStory::getOpenedby,loginRiskUser.getName()) - .in(ZtStory::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList()))); + if(CollectionUtils.isEmpty(storyUsers)){ + ztStory=new ArrayList<>(); + }else{ + ztStory = storyService.list(new QueryWrapper() + .lambda().eq(ZtStory::getDeleted, "0") + .ne(ZtStory::getStatus, "closed") + .in(ZtStory::getUserStory,storyUsers.stream().map(o->o.getId()).collect(Collectors.toList())) + .in(ZtStory::getProduct,list.stream().map(o->o.getId()).collect(Collectors.toList()))); + } + + + if(CollectionUtils.isEmpty(ztStory)){ + result.setYqCount(null); + }else{ + //延期需求改成延期任务 TODO + List tList = this.taskService.list(new QueryWrapper().lambda() + .in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList())) + .notIn(ZtTask::getStatus,"pause","cancel","closed","done") + .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); + result.setYqCount(tList.stream().map(o->o.getId()+"").collect(Collectors.joining(","))); + } } + result.setDpsCount(storyUsers.stream().filter(o -> "reviewing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setPstgCount(storyUsers.stream().filter(o -> "active".equals(o.getStatus())) @@ -242,10 +341,6 @@ public class IZtCountService { result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("developing")) .map(o->o.getId()+"").collect(Collectors.joining(","))); - result.setYqCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> !o.getStage().equals("verified") && !o.getStage().equals("verified")) - .filter(o -> o.getPlanEndDate() != null && o.getPlanEndDate().getTime() < new Date().getTime()) - .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setCswbCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("tested")) .map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -275,8 +370,9 @@ public class IZtCountService { //处理完的 result.setFeedbackClwCount(feedbacks.stream().filter(o->"finished".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); //延期的 - result.setFeedbackYqCount(feedbacks.stream().filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()!Arrays.asList("finished","closed").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); + result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); } else if (userType == UserType.XMGLY) { @@ -339,10 +435,23 @@ public class IZtCountService { result.setDysCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("released")) .map(o->o.getId()+"").collect(Collectors.joining(","))); - result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("verified")) - .filter(o -> o.getYsFlag() == 2) - .map(o->o.getId()+"").collect(Collectors.joining(","))); +// result.setYsNoCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) +// .filter(o -> o.getStage().equals("verified")) +// .filter(o -> o.getYsFlag() == 2) +// .map(o->o.getId()+"").collect(Collectors.joining(","))); + + //延期需求改成延期任务 TODO + + if(CollectionUtils.isEmpty(ztStory)){ + result.setYqCount(null); + }else{ + List tList = this.taskService.list(new QueryWrapper().lambda() + .in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList())) + .notIn(ZtTask::getStatus,"pause","cancel","closed","done") + .last(" and finishedDate > DATE_ADD(DATE_ADD(deadline,INTERVAL 1 day),INTERVAL -1 SECOND)")); + result.setYqCount(tList.stream().map(o->o.getId()+"").collect(Collectors.joining(","))); + } + result.setYsYesCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("verified")) .filter(o -> o.getYsFlag() == 1) @@ -365,7 +474,9 @@ public class IZtCountService { //处理完的 result.setFeedbackClwCount(feedbacks.stream().filter(o->"finished".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); //延期的 - result.setFeedbackYqCount(feedbacks.stream().filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); + result.setFeedbackYqCount(feedbacks.stream().filter(o->!Arrays.asList("finished","closed").contains(o.getStatus())).filter(o->o.getPlanFinishDate()!=null&&o.getPlanFinishDate().getTime()o.getId()+"").collect(Collectors.joining(","))); + + result.setFeedbackGbCount(feedbacks.stream().filter(o->"closed".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); } @@ -419,6 +530,8 @@ public class IZtCountService { List workTasks= workTaskCounts(qo); + + List perList =performanceCount(qo); // excelWriter.write(workDetailsDTOS, 统计, accountInfo); // excelWriter.write(workDetailsDTOS1, 统计, tweetInfo); @@ -435,7 +548,7 @@ public class IZtCountService { ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()) . registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .needHead(Boolean.TRUE).build(); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 4; i++) { if(i==1){ WriteSheet writeSheet = EasyExcel.writerSheet(i, "导出工作量") @@ -450,12 +563,19 @@ public class IZtCountService { .needHead(Boolean.TRUE).build(); excelWriter.write(workTasks, writeSheet); } - else{ + else if(i==0){ WriteSheet writeSheet = EasyExcel.writerSheet(i, "导出统计") .head(WorkDetailsDTO.class) .needHead(Boolean.TRUE).build(); excelWriter.write(workDetailsDTOS1, writeSheet); } + else if(i==3){ + + WriteSheet writeSheet = EasyExcel.writerSheet(i, "绩效") + .head(PerformanceDTO.class) + .needHead(Boolean.TRUE).build(); + excelWriter.write(perList, writeSheet); + } } excelWriter.finish(); @@ -475,6 +595,39 @@ public class IZtCountService { } } + private List performanceCount(ZtCountQo qo) { + + Date d = qo.getDate(); + if(d==null){ + d=new Date(); + } + Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(d); + Date lastDayOfMonth = DateUtils.getLastDayOfMonth(d); + //产品集 + Integer project = qo.getProject(); +// if(qo.){ +// +// } + List productList = this.productService.list(new QueryWrapper().lambda().eq(ZtProduct::getProgram, project)); + if (CollectionUtils.isEmpty(productList)) { + return new ArrayList<>(); + } + List projectproducts = this.projectproductService.list(new QueryWrapper().lambda() + .in(ZtProjectproduct::getProduct, productList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if (CollectionUtils.isEmpty(projectproducts)) { + return new ArrayList<>(); + } + List list = executionprojectService.list(new QueryWrapper().lambda() + .in(ZtExecutionproject::getProject, projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList()))); + if (CollectionUtils.isEmpty(list)) { + return new ArrayList<>(); + } + +// this.teamService.list(new QueryWrapper<>().lambda().eq()); + + return this.projectService.performanceCount(firstDayOfMonth,lastDayOfMonth); + } + private List workTaskCounts(ZtCountQo qo) { Date d = qo.getDate(); @@ -511,12 +664,15 @@ public class IZtCountService { List executionIds = ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()); //所有任务 List taskList = this.taskService.list(new QueryWrapper().lambda().in(ZtTask::getExecution, executionIds)); +// taskList=new ArrayList<>(); +// taskList.add(this.taskService.getById(1178)); if (CollectionUtils.isEmpty(taskList)) { return new ArrayList<>(); } taskList = taskList.stream() .filter(o -> - ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime())) + ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() + && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime())) || (o.getEstStarted()!=null&&o.getDeadline()!=null)&& (( o.getDeadline().getTime()<=lastDayOfMonth.getTime()&& o.getDeadline().getTime()>=firstDayOfMonth.getTime()) @@ -772,13 +928,29 @@ public class IZtCountService { if (CollectionUtils.isEmpty(taskList)) { return new ArrayList<>(); } - taskList = taskList.stream() - .filter(o->o.getFinishedDate()!=null) - .filter(o -> - (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime()) +// taskList = taskList.stream() +// .filter(o->o.getFinishedDate()!=null) +// .filter(o -> +// (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime()) // || (o.getDeadline().getTime() >=firstDayOfMonth.getTime() && o.getDeadline().getTime() <= lastDayOfMonth.getTime()) // || (o.getEstStarted().getTime()<=firstDayOfMonth.getTime() && o.getDeadline().getTime() > firstDayOfMonth.getTime()) - ).collect(Collectors.toList()); +// ).collect(Collectors.toList()); + + taskList = taskList.stream() + .filter(o -> + ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() + && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime())) + || + (o.getEstStarted()!=null&&o.getDeadline()!=null)&& + (( o.getDeadline().getTime()<=lastDayOfMonth.getTime()&& o.getDeadline().getTime()>=firstDayOfMonth.getTime()) + || + ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime())) + +// || (o.getDeadline().getTime() >=firstDayOfMonth.getTime() && o.getDeadline().getTime() <= lastDayOfMonth.getTime()) +// || (o.getEstStarted().getTime()<=firstDayOfMonth.getTime() && o.getDeadline().getTime() > firstDayOfMonth.getTime()) + ).filter(o->o.getStatus().equals("done")) + .collect(Collectors.toList()); + List teamList = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") .in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java index 6e2d5df..7e59ed3 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtActionServiceImpl.java @@ -51,6 +51,8 @@ public class ZtActionServiceImpl extends ServiceImpl i private IZtProductService productService; @Autowired private IZtUserService userService; + @Autowired + private IZtReleaseService releaseService; /** * @@ -145,6 +147,15 @@ public class ZtActionServiceImpl extends ServiceImpl i s.setActionValue("需求:"+story.getTitle()+"-"+s.getActionValue()); } } + + if(ActionType.FB.getValue().equals(t.getObjecttype())){ + ZtRelease release = releaseService.getById(t.getObjectid()); + if(release!=null){ + s.setActionValue("发布:"+release.getName()+"-"+s.getActionValue()); + } + + } + if(ActionType.RW.getValue().equals(t.getObjecttype())){ ZtTask task = taskService.getById(t.getObjectid()); s.setActionValue("任务:"+task.getName()+"-"+s.getActionValue()); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java index c100476..250c8e1 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java @@ -143,7 +143,18 @@ public class ZtBugServiceImpl extends ServiceImpl implements String[] split = qo.getIds().split(","); qo.setObjIds(new ArrayList<>(Arrays.asList(split))); } - + if(!StringUtils.isEmpty(qo.getProductName())){ + List pList = this.productService.selectProductByName(qo.getProductName()); + if(!CollectionUtils.isEmpty(pList)){ + List list = this.projectproductService.list(new QueryWrapper() + .lambda().in(ZtProjectproduct::getProduct, pList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if(CollectionUtils.isEmpty(list)){ + return new PageInfo<>(); + }else{ + qo.setProjectList(list.stream().map(o->o.getProject()).collect(Collectors.toList())); + } + } + } List result = this.baseMapper.myBugPageList(qo); if(!CollectionUtils.isEmpty(result)){ @@ -200,6 +211,13 @@ public class ZtBugServiceImpl extends ServiceImpl implements d.setZtStory(this.storyService.getById(tostory)); } + Map userMap = this.userService.userMapByIds(null); + ZtUser ztUser = userMap.get(d.getAssignedTo()); + if(ztUser!=null){ + d.setAssignedToName(ztUser.getNickname()); + } + + return d; } @@ -219,6 +237,34 @@ public class ZtBugServiceImpl extends ServiceImpl implements ); } + @Override + public void batchAddBug(ZtBugDTO dto) { + + List list = dto.getList(); + if(CollectionUtils.isEmpty(list)){ + throw new BusinessException("请检查数据"); + } + List saveBatch=new ArrayList(); + for (ZtBugDTO d:list) { + ZtBug b=new ZtBug(); + BeanUtils.copyProperties(d,b); + b.setOpeneddate(new Date()); + b.setOpenedby(RiskUserThreadLocal.get().getName()); + b.setStatus("active"); + saveBatch.add(b); + } + this.saveBatch(saveBatch); + + if(dto.getExecution()!=null&&dto.getExecution()!=0){ + kanbanlaneService.addBug(dto.getExecution(), saveBatch); + } + + for (ZtBug ztBug:saveBatch) { + this.actionService.addAction(ActionType.BUG, ActionStatus.XJ,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution() + ,RiskUserThreadLocal.get().getName(),ztBug.getSteps(),"" + ); + } + } @Override @@ -238,8 +284,11 @@ public class ZtBugServiceImpl extends ServiceImpl implements ztBug.setProject(projectstory.getProject()); } } - ZtStory story = storyService.getById(dto.getTostory()); - ztBug.setProduct(story.getProduct()); + if(dto.getTostory()!=null&&dto.getTostory()!=0){ + ZtStory story = storyService.getById(dto.getTostory()); + ztBug.setProduct(story.getProduct()); + } + } @@ -318,7 +367,7 @@ public class ZtBugServiceImpl extends ServiceImpl implements // ztBug.setStatus("closed"); this.actionService.addAction(ActionType.BUG, ActionStatus.GB,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution() - ,RiskUserThreadLocal.get().getName(),qo.getRemark(),"" + ,RiskUserThreadLocal.get().getName(),qo.getDesc(),"" ); } //1.active 2.confire=1 3.解决进行中 不变 4 resolved 完成 5.测试中不变 6.测试完毕不变 diff --git a/src/main/java/com/sa/zentao/service/impl/ZtDevelopFeedbackServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtDevelopFeedbackServiceImpl.java new file mode 100644 index 0000000..65354ed --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/ZtDevelopFeedbackServiceImpl.java @@ -0,0 +1,175 @@ +package com.sa.zentao.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sa.zentao.conf.RiskUserThreadLocal; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.dao.ZtDevelopFeedbackDTO; +import com.sa.zentao.dao.ZtMeetingDTO; +import com.sa.zentao.dao.ZtStoryDTO; +import com.sa.zentao.entity.ZtDevelopFeedback; +import com.sa.zentao.entity.ZtProduct; +import com.sa.zentao.entity.ZtUser; +import com.sa.zentao.enums.ActionStatus; +import com.sa.zentao.enums.ActionType; +import com.sa.zentao.mapper.ZtDevelopFeedbackMapper; +import com.sa.zentao.qo.ZtFeedbackQo; +import com.sa.zentao.service.IZtActionService; +import com.sa.zentao.service.IZtDevelopFeedbackService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sa.zentao.service.IZtProductService; +import com.sa.zentao.service.IZtUserService; +import lombok.Synchronized; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author gqb + * @since 2025-02-05 + */ +@Service +public class ZtDevelopFeedbackServiceImpl extends ServiceImpl implements IZtDevelopFeedbackService { + + + @Autowired + private IZtUserService userService; + @Autowired + private IZtProductService productService; + @Autowired + private IZtActionService actionService; + + + @Override + public PageInfo pageList(ZtFeedbackQo qo) { + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + + List list = this.baseMapper.pageList(qo); + if(!CollectionUtils.isEmpty(list)){ + Map userMap = userService.userMapByIds(null); + for (ZtDevelopFeedbackDTO d:list) { + String assignedTo = d.getAssignedTo(); + String createUser = d.getCreateUser(); + String updateUser = d.getUpdateUser(); + ZtUser ztUser = userMap.get(assignedTo); + if(ztUser!=null){ + d.setAssignedToName(ztUser.getNickname()); + } + ztUser = userMap.get(createUser); + if(ztUser!=null){ + d.setCreateUserName(ztUser.getNickname()); + } + ztUser = userMap.get(updateUser); + if(ztUser!=null){ + d.setUpdateUserName(ztUser.getNickname()); + } + } + + } + + return new PageInfo(list); + } + + @Override + public void add(ZtDevelopFeedbackDTO dto) { + ZtDevelopFeedback ztDevelopFeedback = new ZtDevelopFeedback(); + BeanUtils.copyProperties(dto,ztDevelopFeedback); + ztDevelopFeedback.setCreateDate(new Date()); + ztDevelopFeedback.setCreateUser(RiskUserThreadLocal.get().getName()); + ztDevelopFeedback.setUpdateUser(RiskUserThreadLocal.get().getName()); + ztDevelopFeedback.setUpdateDate(new Date()); + this.baseMapper.insert(ztDevelopFeedback); + //添加action + actionService.addAction(ActionType.DEVLOPSFEEDBACK, ActionStatus.XJ, ztDevelopFeedback.getId(), ztDevelopFeedback.getProductId() + "", null, null, + RiskUserThreadLocal.get().getName(), null, null); + } + + @Override + public void modify(ZtDevelopFeedbackDTO dto) { + ZtDevelopFeedback ztDevelopFeedback = this.baseMapper.selectById(dto.getId()); + if(ztDevelopFeedback==null){ + throw new BusinessException("未查询到数据"); + } + if(ztDevelopFeedback.getCreateDate().getTime()<(System.currentTimeMillis()-1000*60*60*24)){ + throw new BusinessException("当前无法更改"); + } + BeanUtils.copyProperties(dto,ztDevelopFeedback); + this.baseMapper.updateById(ztDevelopFeedback); + + } + + @Override + public List myFeedbackList(ZtFeedbackQo qo) { + + qo.setUserName(RiskUserThreadLocal.get().getName()); + + List list = this.baseMapper.myFeedbackList(qo); + if(!CollectionUtils.isEmpty(list)){ + Map userMap = userService.userMapByIds(null); + for (ZtDevelopFeedbackDTO d:list) { + String assignedTo = d.getAssignedTo(); + String createUser = d.getCreateUser(); + String updateUser = d.getUpdateUser(); + ZtUser ztUser = userMap.get(assignedTo); + if(ztUser!=null){ + d.setAssignedToName(ztUser.getNickname()); + } + ztUser = userMap.get(createUser); + if(ztUser!=null){ + d.setCreateUserName(ztUser.getNickname()); + } + ztUser = userMap.get(updateUser); + if(ztUser!=null){ + d.setUpdateUserName(ztUser.getNickname()); + } + } + + } + return list; + } + + @Override + public ZtDevelopFeedbackDTO getFeedbackById(ZtFeedbackQo qo) { + Integer id = qo.getId(); + if(id==null){ + throw new BusinessException("请检查数据"); + } + ZtDevelopFeedback ztDevelopFeedback = this.baseMapper.selectById(qo.getId()); + if(ztDevelopFeedback==null){ + throw new BusinessException("未查询到数据"); + } + ZtDevelopFeedbackDTO d=new ZtDevelopFeedbackDTO(); + BeanUtils.copyProperties(ztDevelopFeedback,d); + Map userMap = userService.userMapByIds(null); + String assignedTo = d.getAssignedTo(); + String createUser = d.getCreateUser(); + String updateUser = d.getUpdateUser(); + ZtUser ztUser = userMap.get(assignedTo); + if(ztUser!=null){ + d.setAssignedToName(ztUser.getNickname()); + } + ztUser = userMap.get(createUser); + if(ztUser!=null){ + d.setCreateUserName(ztUser.getNickname()); + } + ztUser = userMap.get(updateUser); + if(ztUser!=null){ + d.setUpdateUserName(ztUser.getNickname()); + } + ZtProduct product = productService.getById(ztDevelopFeedback.getProductId()); + if(product!=null){ + d.setProductName(product.getName()); + } + return d; + } +} diff --git a/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java index 96856ae..eb6ac1d 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java @@ -136,8 +136,12 @@ public class ZtEffortServiceImpl extends ServiceImpl i List collect = ztEfforts.stream().filter(o -> DateUtils.formatDate(o.getDate(), "yyyy-MM-dd") .equals(s)).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(collect)){ + map.put(s,"0"); + }else{ + map.put(s,collect.stream().map(o -> o.getConsumed()).reduce( (a, b) -> fAdd(a,b)).get()+""); + } - map.put(s,collect.stream().map(o -> o.getConsumed()).reduce(0F, (a, b) -> fAdd(a,b))+""); } @@ -147,6 +151,6 @@ public class ZtEffortServiceImpl extends ServiceImpl i private Float fAdd(Float a,Float b){ BigDecimal f1 = BigDecimal.valueOf(a); BigDecimal f2 = BigDecimal.valueOf(b); - return f1.add(f1).setScale(2,BigDecimal.ROUND_HALF_UP).floatValue(); + return f1.add(f2).setScale(2,BigDecimal.ROUND_HALF_UP).floatValue(); } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java index 39fa909..81f8929 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java @@ -16,6 +16,7 @@ import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; +import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.KanBanConstant; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -64,6 +65,9 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl lookInfoByExec(ZtProjectQo qo) { @@ -90,7 +94,7 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl ztStoryDTOS = BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new); List storySpecList = storyspecService.list(new QueryWrapper().lambda().in(ZtStoryspec::getStory, ids)); if(!CollectionUtils.isEmpty(ztStories)){ - + ZtProduct product = this.productService.getById(ztStoryDTOS.get(0).getProduct()); for (ZtStoryDTO st:ztStoryDTOS) { ZtUser ztUser = userMap.get(st.getAssignedTo()); @@ -104,6 +108,9 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl + * 服务实现类 + *

+ * + * @author gqb + * @since 2025-01-24 + */ +@Service +public class ZtMeetingServiceImpl extends ServiceImpl implements IZtMeetingService { + + @Autowired + private IZtUserService userService; + + @Autowired + private IZtFileService fileService; + + @Autowired + private IZtProductService productService; + + @Autowired + private IZtActionService actionService; + + @Override + public PageInfo pageList(ZtMeetingQo qo) { + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + + List list= this.baseMapper.pageList(qo); + if(!CollectionUtils.isEmpty(list)){ + Map userMap = userService.userMapByIds(null); + Map map = getProductMap(); + for (ZtMeetingDTO d:list) { + StringBuilder b=new StringBuilder(); + if(!StringUtils.isEmpty(d.getUsers())){ + String[] split = d.getUsers().split(","); + for (String s:split) { + ZtUser ztUser = userMap.get(s); + if(ztUser!=null){ + b.append(ztUser.getNickname()).append(","); + } + } + d.setUsersName(b.toString()); + } + ZtProduct ztProduct = map.get(d.getProductId()); + if(ztProduct!=null){ + d.setProductName(ztProduct.getName()); + } + } + } + return new PageInfo(list); + } + + private Map getProductMap() { + List list = productService.list(); + if(CollectionUtils.isEmpty(list)){ + return new HashMap<>(); + }else{ + return list.stream().collect(Collectors.toMap(ZtProduct::getId,o->o)); + } + } + + @Override + @Transactional + public void add(ZtMeetingDTO dto) { + ZtMeeting ztMeeting = new ZtMeeting(); + + BeanUtils.copyProperties(dto,ztMeeting); + + ztMeeting.setCreateDate(new Date()); + ztMeeting.setCreateUser(RiskUserThreadLocal.get().getName()); + ztMeeting.setUpdateUser(ztMeeting.getCreateUser()); + ztMeeting.setUpdateDate(ztMeeting.getCreateDate()); + + this.baseMapper.insert(ztMeeting); + fileService.updateFile(dto.getFiles(),ztMeeting.getId(), FileTypes.meeting); + + + //添加action + actionService.addAction(ActionType.MEET, ActionStatus.XJ, ztMeeting.getId(), ztMeeting.getProductId() + "", null, null, + RiskUserThreadLocal.get().getName(), dto.getRemark(), null); + + } + + @Override + @Transactional + public void modify(ZtMeetingDTO dto) { + ZtMeeting ztMeeting = this.baseMapper.selectById(dto.getId()); + if(ztMeeting==null){ + throw new BusinessException("未查询到数据"); + } + String remark = dto.getRemark(); + String oldRemark = ztMeeting.getRemark(); + + BeanUtils.copyProperties(dto,ztMeeting); + + ztMeeting.setUpdateUser(ztMeeting.getCreateUser()); + ztMeeting.setUpdateDate(ztMeeting.getCreateDate()); + + this.baseMapper.updateById(ztMeeting); + fileService.updateFile(dto.getFiles(),ztMeeting.getId(), FileTypes.meeting); + + //添加action + actionService.addAction(ActionType.MEET, ActionStatus.BJ, ztMeeting.getId(), ztMeeting.getProductId() + "", null, null, + RiskUserThreadLocal.get().getName(), (!StringUtils.isEmpty(remark)&&!remark.equals(oldRemark))?remark:"", null); + + + } + + @Override + public ZtMeetingDTO getMeetingById(ZtMeetingDTO dto) { + + ZtMeeting ztMeeting = this.baseMapper.selectById(dto.getId()); + if(ztMeeting==null){ + throw new BusinessException("未查询到数据"); + } + ZtMeetingDTO ztMeetingDTO = new ZtMeetingDTO(); + + BeanUtils.copyProperties(ztMeeting,ztMeetingDTO); + + if(ztMeetingDTO.getProductId()!=null){ + ZtProduct product = this.productService.getById(ztMeetingDTO.getProductId()); + + ztMeetingDTO.setProductName(product.getName()); + } + Map userMap = this.userService.userMapByIds(null); + ZtUser ztUser = userMap.get(ztMeetingDTO.getCreateUser()); + if(ztUser!=null){ + ztMeetingDTO.setCreateUserName(ztUser.getNickname()); + } + + if(!StringUtils.isEmpty(ztMeetingDTO.getUsers())){ + StringBuilder b=new StringBuilder(); + String[] split = ztMeetingDTO.getUsers().split(","); + for (String s:split) { + ztUser = userMap.get(s); + if(ztUser!=null){ + b.append(ztUser.getNickname()).append(","); + } + } + ztMeetingDTO.setUsersName(b.toString()); + } + + return ztMeetingDTO; + } + @Value("${file.meeting}") + private String linuxmeeting; + @SneakyThrows + @Override + public void downLoadById(ZtMeetingDTO dto, HttpServletResponse res, HttpServletRequest request) { + + ZtMeeting ztMeeting = this.baseMapper.selectById(dto.getId()); + + + String pfdStr="

{meetType}记录 {titleDate}

\n" + + "\n" + + "
会议时间: {meetingDate}
\n" + + "
会议地点: {address}
\n" + + "
参会人员: {usersName}
\n" + + "

会议内容

\n" + + "
\n"+ + "
{remark}
"; + + // 替换内容集合 + Map textMap = new LinkedHashMap<>(); + textMap.put("titleDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY-MM-DD")); + + + pfdStr=pfdStr.replace("{meetType}",ztMeeting.getType().getValue()); + pfdStr=pfdStr.replace("{titleDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY-MM-DD ")); + + textMap.put("meetingDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY/MM/DD")); + pfdStr= pfdStr.replace("{meetingDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"YYYY/MM/DD HH:mm")); + textMap.put("address",ztMeeting.getAddress()); + pfdStr= pfdStr.replace("{address}",ztMeeting.getAddress()); + StringBuilder b=new StringBuilder(); + if(!StringUtils.isEmpty(ztMeeting.getUsers())){ + Map userMap = this.userService.userMapByIds(null); + + String[] split = ztMeeting.getUsers().split(","); + for (String s:split) { + ZtUser ztUser = userMap.get(s); + if(ztUser!=null){ + b.append(ztUser.getNickname()).append("、"); + } + } + textMap.put("usersName", b.toString()); + } + pfdStr= pfdStr.replace("{usersName}",b.toString()); + textMap.put("remark", ztMeeting.getRemark()); + if(!StringUtils.isEmpty(ztMeeting.getRemark())){ + if(ztMeeting.getRemark().contains("img")){ + throw new BusinessException("当前导出不支持图片"); + } +// int imgIndex = ztMeeting.getRemark().indexOf("img"); +// int imgEnd = ztMeeting.getRemark().indexOf(">", imgIndex); +// StringBuilder buff=new StringBuilder(); +// buff.append(ztMeeting.getRemark().substring(0,imgEnd+1)).append(""); +// buff.append(ztMeeting.getRemark().substring(imgEnd+1,ztMeeting.getRemark().length())); +// +// textMap.put("remark", ztMeeting.getRemark()); + } + pfdStr= pfdStr.replace("{remark}",ztMeeting.getRemark()); + // 调用工具类,registerTemplatePath 模板路径,textMap 文字内容 + // 调用工具类,registerTemplatePath 模板路径,textMap 文字内容 + try { + Document document = new Document(); + PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("example.pdf")); + writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7); // 可以根据需要选择 PDF 版本 + + document.open(); + + BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); + Font fontChinese = new Font(bfChinese, 12); + + // 添加中文内容 + + Paragraph context = new Paragraph(); + + ElementList elementList = MyXMLWorkerHelper.parseToElementList(pfdStr.toString(), null); + for (Element element : elementList) { + context.add(element); + } + document.add(context); + document.close(); + + + FileInputStream stream=new FileInputStream(new File("example.pdf")); + + + + + + byte[] bytes = stream.readAllBytes(); + + + // 清空response + res.reset(); +// 设置response的Header + res.setCharacterEncoding("UTF-8"); +//Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存 +//attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3" +// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称 + res.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("导出.pdf", "UTF-8")); +// 告知浏览器文件的大小 +// response.addHeader("Content-Length", "" + file.length()); + OutputStream outputStream = new BufferedOutputStream(res.getOutputStream()); + res.setContentType("application/octet-stream"); + outputStream.write(bytes); + + outputStream.flush(); + + + res.flushBuffer(); + //
例会记录-2025-02-38
+ //

会议时间: 2025-02-38

会议地点: 11111会议地点:
参会人员: 系统管理员、ceshi、

会议内容

  1. 22
  2. 333
  3. 444

+ + + + + } catch (IOException e) { + e.printStackTrace(); + } + +// String htmlSource = "

"; + + } + + @SneakyThrows + public static void main(String[] args) throws IOException { + + + } +} diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java index 48932b6..44a3d88 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProductServiceImpl.java @@ -8,21 +8,15 @@ import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.dao.BusinessException; import com.sa.zentao.dao.ZtProductDTO; import com.sa.zentao.dao.ZtProjectDTO; -import com.sa.zentao.entity.ZtProduct; -import com.sa.zentao.entity.ZtProject; -import com.sa.zentao.entity.ZtProjectproduct; -import com.sa.zentao.entity.ZtUser; +import com.sa.zentao.entity.*; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; import com.sa.zentao.enums.ProductStoryStatus; import com.sa.zentao.mapper.ZtProductMapper; import com.sa.zentao.mapper.ZtProjectMapper; import com.sa.zentao.qo.ZtProjectQo; -import com.sa.zentao.service.IZtActionService; -import com.sa.zentao.service.IZtProductService; +import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sa.zentao.service.IZtProjectService; -import com.sa.zentao.service.IZtUserService; import com.sa.zentao.utils.BeanCopyUtil; import com.sa.zentao.utils.BeanCopyUtilCallBack; import org.apache.commons.lang3.StringUtils; @@ -32,8 +26,10 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.lang.reflect.Array; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** *

@@ -59,6 +55,15 @@ public class ZtProductServiceImpl extends ServiceImpl pageList(ZtProjectQo qo) { @@ -131,14 +136,53 @@ public class ZtProductServiceImpl extends ServiceImpl userList = ztProjectDTOS.stream().map(o -> o.getPm()).collect(Collectors.toList()); userList.addAll(result.stream().filter(o->!StringUtils.isEmpty(o.getPo())).map(o->o.getPo()).collect(Collectors.toList())); Map userMap = this.userService.userMapByIds(userList); + + List allStoryList = this.storyService.list(new QueryWrapper().lambda().in(ZtStory::getProduct, result.stream().map(o -> o.getId()).collect(Collectors.toList()))); + List allBugList = bugService.list(new QueryWrapper().lambda() + .ne(ZtBug::getStatus,"closed") + .in(ZtBug::getProduct, result.stream().map(o -> o.getId()).collect(Collectors.toList()))); + + List allUserStoryList = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getProduct, result.stream().map(o -> o.getId()).collect(Collectors.toList()))); + for (ZtProductDTO p:result ) { + List storyList = allStoryList.stream().filter(o->o.getProduct().equals(p.getId())).collect(Collectors.toList()); + List bugList =allBugList.stream().filter(o->o.getProduct().equals(p.getId())).collect(Collectors.toList()); + List userStoryList = allUserStoryList.stream().filter(o->o.getProduct().equals(p.getId())).collect(Collectors.toList()); if(!StringUtils.isEmpty(p.getPo())){ ZtUser ztUser = userMap.get(p.getPo()); if(ztUser!=null){ p.setPoValue(ztUser.getNickname()); } } + List fStoryList = storyList.stream().filter(o -> o.getProduct().intValue() == p.getId().intValue()).collect(Collectors.toList()); + p.setDraftStories(Long.valueOf(userStoryList.stream().filter(o->o.getStatus().equals("draft")).count()).intValue() + ); + p.setReviewingStories(Long.valueOf(userStoryList.stream().filter(o->o.getStatus().equals("reviewing")).count()).intValue()); + + p.setReleases(Long.valueOf(fStoryList.stream().filter(o->o.getStatus() + .equals("active")&&o.getStage().equals("released")).count()).intValue()); + p.setActiveStories(Long.valueOf(fStoryList.stream().filter(o->o.getStatus() + .equals("active")&&!o.getStage().equals("verified")).count()).intValue()); + p.setFinishedStories(Long.valueOf(fStoryList.stream().filter(o->o.getStatus().equals("active")) + .filter(o->o.getStage().equals("tested")||o.getStage().equals("released")).count()).intValue()); + p.setFinishTaskRatio(fStoryList.size()==0?BigDecimal.ZERO:BigDecimal.valueOf(p.getFinishedStories()).divide(BigDecimal.valueOf( + fStoryList.stream().filter(o->o.getStatus().equals("active")).filter(o->!o.getStage().equals("verified")) + .collect(Collectors.toList()).size() + ),2,BigDecimal.ROUND_HALF_UP)); + p.setFinishTaskRatio(p.getFinishTaskRatio().multiply(BigDecimal.valueOf(100))); + + p.setYss(Long.valueOf(fStoryList.stream().filter(o->o.getStage().equals("verified")).count()).intValue()); + //激活bug + List fBugList = bugList.stream().filter(o -> o.getProduct().intValue() == p.getId().intValue()).collect(Collectors.toList()); + + p.setFixedBugs(Long.valueOf(fBugList.stream().filter(o->o.getStatus().equals("active")).count()).intValue()); + long resolved = fBugList.stream().filter(o -> o.getStatus().equals("resolved")).count(); + + p.setFinishBugRatio(fBugList.size()==0?BigDecimal.ZERO:BigDecimal.valueOf(resolved).divide(BigDecimal.valueOf( + fBugList.size() + ),2,BigDecimal.ROUND_HALF_UP)); + p.setFinishBugRatio(p.getFinishBugRatio().multiply(BigDecimal.valueOf(100))); } for (ZtProjectDTO d:ztProjectDTOS) { d.setChildren(result.stream().filter(o->o.getProgram().equals(d.getId())).collect(Collectors.toList())); @@ -305,6 +349,23 @@ public class ZtProductServiceImpl extends ServiceImpl selectProductByName(String productName) { + if(StringUtils.isEmpty(productName)){ + return new ArrayList<>(); + } + return this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtProduct::getName,productName)); + } + + @Override + public Map selectMapProduct() { + List list = list(); + if(CollectionUtils.isEmpty(list)){ + return new HashMap<>(); + } + return list.stream().collect(Collectors.toMap(ZtProduct::getId,o->o)); + } + private Map> getChildrenMap(List result) { List ztProjects = this.baseMapper.selectList( diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java index d75eae5..c586ee1 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java @@ -7,6 +7,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.dao.PerformanceDTO; import com.sa.zentao.dao.ZtProjectDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.*; @@ -102,7 +103,7 @@ public class ZtProjectServiceImpl extends ServiceImpl authProductList(){ + List authList = authList(); + if(CollectionUtils.isEmpty(authList)){ + return authList; + } + List list = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, authList)); + if(CollectionUtils.isEmpty(list)){ + return authList; + }else{ + return list.stream().map(o->o.getId()).collect(Collectors.toList()); + } + } @Override public List authList() { @@ -861,7 +878,7 @@ public class ZtProjectServiceImpl extends ServiceImpl projectAuthList() { ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName()); - if(user.getAccount().equals("admin")||user.getUserType()== UserType.XMGLY){ + if(user.getAccount().equals("admin")){ return this.baseMapper.selectList(new QueryWrapper() .lambda().eq(ZtProject::getType,"project")).stream().map(o->o.getId()).collect(Collectors.toList()); } @@ -937,7 +954,9 @@ public class ZtProjectServiceImpl extends ServiceImpl(); } - return this.baseMapper.selectList(new QueryWrapper().lambda().in(ZtProject::getId,list.stream().map(o->o.getExecution()).collect(Collectors.toList()))); + return this.baseMapper.selectList(new QueryWrapper().lambda() + .ne(ZtProject::getStatus,"closed") + .in(ZtProject::getId,list.stream().map(o->o.getExecution()).collect(Collectors.toList()))); } @Override @@ -1072,6 +1091,31 @@ public class ZtProjectServiceImpl extends ServiceImpl userList = this.userService.list(); Map uMap = userList.stream().collect(Collectors.toMap(ZtUser::getAccount, O -> O)); + for (ZtTask t:list ) { + if(t.getDeadline()!=null){ + t.setDeadline(DateUtils.getDayLast(t.getDeadline())); + } + ZtUser ztUser = uMap.get(t.getAssignedTo()); +// if(ztUser!=null){ +// t.setAssignedTo(ztUser.getNickname()); +// } + ztUser = uMap.get(t.getOpenedby()); + if(ztUser!=null){ + t.setOpenedby(ztUser.getNickname()); + } + ztUser = uMap.get(t.getFinishedby()); + if(ztUser!=null){ + t.setFinishedby(ztUser.getNickname()); + } + ztUser = uMap.get(t.getCanceledby()); + if(ztUser!=null){ + t.setCanceledby(ztUser.getNickname()); + } + ztUser = uMap.get(t.getClosedby()); + if(ztUser!=null){ + t.setClosedby(ztUser.getNickname()); + } + } for (int i =0;i(); } - List sprint = this.listByIds(integers); + List sprint = this.list( + new QueryWrapper().lambda().in(ZtProject::getId,integers).ne(ZtProject::getStatus,"closed") + ); if(CollectionUtils.isEmpty(sprint)){ return new ArrayList<>(); @@ -1274,6 +1320,16 @@ public class ZtProjectServiceImpl extends ServiceImpl performanceCount(Date startDate, Date endDate) { + return this.baseMapper.performanceCount(startDate,endDate); + } + //修改项目集 @Override @@ -1696,7 +1752,8 @@ public class ZtProjectServiceImpl extends ServiceImpl!StringUtils.isEmpty(o)).collect(Collectors.toList()).get(0))); } - Map projectMap = getProjectMap(this.baseMapper.selectBatchIds(ids)); + Map projectMap = getProjectMap(this.baseMapper.selectList( + new QueryWrapper().lambda().in(ZtProject::getId,ids).ne(ZtProject::getStatus,"closed"))); List ztProjectDTOS = BeanCopyUtil.copyListProperties(project, ZtProjectDTO::new); for (ZtProjectDTO p:ztProjectDTOS ) { ZtProject ztProject = projectMap.get(Integer.valueOf(Arrays.asList(p.getPath().split(",")).stream().filter(o -> !StringUtils.isEmpty(o)).collect(Collectors.toList()).get(0))); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProjectstoryServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProjectstoryServiceImpl.java index f6210f4..a2cc95e 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProjectstoryServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProjectstoryServiceImpl.java @@ -56,4 +56,9 @@ public class ZtProjectstoryServiceImpl extends ServiceImpl().lambda().eq(ZtProjectstory::getStory,storyId).eq(ZtProjectstory::getType,ProjectTypeEnums.project.getValue())); } + + @Override + public List prdList(Integer id) { + return this.baseMapper.prdList(id); + } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java index b81d29f..08468d8 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java @@ -294,6 +294,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl ztStories = storyService.listByIds(storyList); - for (ZtStory st:ztStories) { - if("active".equals(st.getStatus())&&"wait".equals(st.getStage())){ - continue; + + ZtProduct product = this.productService.getById(ztRelease.getProduct()); + if(dto.getRevieweResult()==1){ + for (ZtStory st:ztStories) { + if("active".equals(st.getStatus())&&"wait".equals(st.getStage())){ + continue; + } + if("closed".equals(st.getStatus())||"closed".equals(st.getStage())){ + continue; + } + if(!"tested".equals(st.getStage())){ + throw new BusinessException(st.getTitle()+" 当前需求无法发布,请检查"); + } + this.storyService.releaseStory(st.getId()); } - if("closed".equals(st.getStatus())||"closed".equals(st.getStage())){ - continue; - } - if(!"tested".equals(st.getStage())){ - throw new BusinessException(st.getTitle()+" 当前需求无法发布,请检查"); - } - this.storyService.releaseStory(st.getId()); + product.setReleases(product.getReleases()+ztStories.size()); + this.productService.updateById(product); + + + }else{ + actionService.addAction(ActionType.FB, ActionStatus.FBSB, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, + RiskUserThreadLocal.get().getName(), "", ""); } - this.baseMapper.updateById(ztRelease); - actionService.addAction(ActionType.FB, ActionStatus.FB, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, - RiskUserThreadLocal.get().getName(), "", ""); + + } @Override @@ -370,7 +381,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl storyList = qo.getStoryList(); List list = this.releaseDetailsService.list(new QueryWrapper().lambda() .eq(ZtReleaseDetails::getObjectType, "story") @@ -504,7 +525,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); - LambdaQueryWrapper query = new QueryWrapper().lambda() - .eq(ZtStoryFeedback::getAssignedTo, RiskUserThreadLocal.get().getName()) - .or().eq(ZtStoryFeedback::getOpenedBy, RiskUserThreadLocal.get().getName()); - if(!org.apache.commons.lang3.StringUtils.isEmpty(qo.getSearchValue())){ - if("ALL".equals(qo.getSearchValue())){ + LambdaQueryWrapper query = new QueryWrapper().lambda(); +// .and(w->{ +// w.eq(ZtStoryFeedback::getAssignedTo, RiskUserThreadLocal.get().getName()) +// .or() +// .eq(ZtStoryFeedback::getOpenedBy, RiskUserThreadLocal.get().getName()) ;}) ; + + if(!org.apache.commons.lang3.StringUtils.isEmpty(qo.getSearchVal())){ + if("ALL".equals(qo.getSearchVal())){ + } + if("ZGW".equals(qo.getSearchVal())){ query.eq(ZtStoryFeedback::getAssignedTo,RiskUserThreadLocal.get().getName()); } - if("ZGW".equals(qo.getSearchValue())){ - query.eq(ZtStoryFeedback::getAssignedTo,RiskUserThreadLocal.get().getName()); - } - if("WCJ".equals(qo.getSearchValue())){ + if("WCJ".equals(qo.getSearchVal())){ query.eq(ZtStoryFeedback::getOpenedBy,RiskUserThreadLocal.get().getName()); } - if("YJJ".equals(qo.getSearchValue())){ + if("YJJ".equals(qo.getSearchVal())){ query.eq(ZtStoryFeedback::getStatus,"finished"); } - if("YGB".equals(qo.getSearchValue())){ + if("YGB".equals(qo.getSearchVal())){ query.eq(ZtStoryFeedback::getStatus, "closed"); } - + if("WGB".equals(qo.getSearchVal())){ + query.ne(ZtStoryFeedback::getStatus, "closed"); + } }else{ query.ne(ZtStoryFeedback::getStatus, "closed"); } - if(UserType.GSGC==RiskUserThreadLocal.get().getUserType()||"admin".equals(RiskUserThreadLocal.get().getName())){ +// UserType.GSGC==RiskUserThreadLocal.get().getUserType()|| + if("admin".equals(RiskUserThreadLocal.get().getName())){ }else { query.in(ZtStoryFeedback::getProduct, list.stream().map(o -> o.getId()).collect(Collectors.toList())); @@ -297,12 +320,81 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl(Arrays.asList(split))); } + List products = this.productService.selectProductByName(qo.getProductName()); + if(!CollectionUtils.isEmpty(products)){ + query.in(ZtStoryFeedback::getProduct,products.stream().map(o->o.getId()).collect(Collectors.toList())); + } + if(qo.getStartDate()!=null){ + query.gt(ZtStoryFeedback::getOpenedDate,qo.getStartDate()); + } + if(qo.getEndDate()!=null){ + query.lt(ZtStoryFeedback::getOpenedDate,qo.getEndDate()); + } query.orderByDesc(ZtStoryFeedback::getId); + List listFeedback= this.baseMapper.selectList( query ); - return new PageInfo(BeanCopyUtil.copyListProperties(listFeedback,ZtStoryFeedbackDTO::new)); + + + List ztStoryFeedbackDTOS = BeanCopyUtil.copyListProperties(listFeedback, ZtStoryFeedbackDTO::new); + if(!CollectionUtils.isEmpty(ztStoryFeedbackDTOS)){ + Map userMap = this.userService.userMapByIds(null); + Map pMap=this.productService.selectMapProduct(); + for (ZtStoryFeedbackDTO f:ztStoryFeedbackDTOS ) { + ZtProduct ztProduct = pMap.get(f.getProduct()); + if(ztProduct!=null){ + f.setProductName(ztProduct.getName()); + } + + ZtUser ztUser = userMap.get(f.getOpenedBy()); + if(ztUser!=null){ + f.setOpenedByName(ztUser.getNickname()); + } + ztUser = userMap.get(f.getAssignedTo()); + if(ztUser!=null){ + f.setAssignedToName(ztUser.getNickname()); + } + + } + } + return new PageInfo<>(ztStoryFeedbackDTOS); + + } + + @Override + public void closedFeedback(ZtStoryFeedbackDTO dto) { +// ZtStoryFeedback ztStoryFeedback = this.baseMapper.selectById(dto.getId()); +// if(ztStoryFeedback==null){ +// throw new BusinessException("未查询到数据"); +// } +// ztStoryFeedback.setStatus("closed"); +// ztStoryFeedback.setCloseRemark(dto.getCloseRemark()); +// ztStoryFeedback.setCloseDate(new Date()); +// ztStoryFeedback.setClosedBy(RiskUserThreadLocal.get().getName()); +// this.baseMapper.updateById(ztStoryFeedback); + + } + + @Override + public void approval(ZtStoryFeedbackDTO dto) { + Integer approval = dto.getApproval(); + + + ZtStoryFeedback ztStoryFeedback = this.baseMapper.selectOne(new QueryWrapper().lambda() + .eq(ZtStoryFeedback::getBusinessId,dto.getBusinessId())); + if(ztStoryFeedback!=null){ + if(approval==1){ + ztStoryFeedback.setStatus("wait"); + }else{ + ztStoryFeedback.setStatus("closed"); + ztStoryFeedback.setApprovalRemark(dto.getApprovalRemark()); + } + this.baseMapper.updateById(ztStoryFeedback); + } + + } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java index 55288f6..9a6eb5b 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java @@ -69,6 +69,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl private IZtBugService bugService; + @Autowired + private IZtModuleService moduleService; + @Autowired private IZtProjectproductService projectproductService; @@ -104,16 +107,15 @@ public class ZtStoryServiceImpl extends ServiceImpl impl userIds.addAll(list.stream().map(o -> o.getOpenedby()).collect(Collectors.toList())); - Map userMap = this.userService.userMapByIds(userIds); + Map userMap = this.userService.userMapByIds(null); Map> rMap = getReviewMap(list); Map> executionMapByStory = getExecutionMapByStory(list); - for (ZtStoryDTO d : list) { - d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); + d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); d.setViews(rMap.get(d.getId())); ZtUser ztUser = userMap.get(d.getAssignedTo()); if(ztUser!=null){ @@ -124,10 +126,27 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(ztUser!=null){ d.setOpenedbyName(ztUser.getNickname()); } + ztUser = userMap.get(d.getYsUser()); + if(ztUser!=null){ + d.setYsUserName(ztUser.getNickname()); + } List ztProjectList = executionMapByStory.get(d.getId()); if(!CollectionUtils.isEmpty(ztProjectList)){ // d.setExecution(ztProject.getId()); d.setExecutionName(ztProjectList.stream().map(o->o.getName()).collect(Collectors.joining(","))); + d.setExecutions(ztProjectList.stream().map(o->o.getId()).collect(Collectors.toList())); + } + if(!StringUtils.isEmpty(d.getReviewedby())){ + String[] split = d.getReviewedby().split(","); + StringBuilder b=new StringBuilder(); + for (String s:split) { + ZtUser u = userMap.get(s); + if(u!=null){ + b.append(u.getNickname()+","); + } + + } + d.setReviewedbyName(b.toString()); } } } @@ -168,34 +187,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl public void addStory(ZtStoryDTO dto) { - - - ZtStory s = new ZtStory(); - BeanUtils.copyProperties(dto, s); - s.setVersion(1); - s.setOpenedby(RiskUserThreadLocal.get().getName()); - s.setOpenedDate(new Date()); - if(!"draft".equals(dto.getStatus())){ - if(dto.getPsFlag()!=null&&dto.getPsFlag()){ - s.setStatus("active"); - }else{ - s.setStatus("reviewing"); - } - - } - - s.setStage("wait"); + ZtStory s = buildStory(dto); this.baseMapper.insert(s); - - - - ZtStoryspec spec = new ZtStoryspec(); - spec.setStory(s.getId()); - spec.setVersion(1); - spec.setTitle(s.getTitle()); - spec.setSpec(dto.getSpec()); - spec.setVerify(dto.getVerify()); - spec.setFiles(dto.getFileUrl()); + ZtStoryspec spec = buildSpec(dto,s); storyspecService.save(spec); fileService.updateFile(dto.getFiles(),s.getId(), FileTypes.story); @@ -238,6 +232,106 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } + if (s.getProduct() != null&&s.getProduct()!=0) { + ZtProduct product = productService.getById(s.getProduct()); + if("draft".equals(dto.getStatus())){ + product.setDraftStories(product.getDraftStories()+1); + }else{ + product.setReviewingStories(product.getReviewingStories() + 1); + } + + product.setTotalStories(product.getTotalStories() + 1); + this.productService.updateById(product); + } + + List executions = dto.getExecutions(); + if(!CollectionUtils.isEmpty(executions)){ + this.executionBindStory(s,executions); + } + + + + + } + + private ZtStoryspec buildSpec(ZtStoryDTO dto, ZtStory s) { + + ZtStoryspec spec = new ZtStoryspec(); + spec.setStory(s.getId()); + spec.setVersion(1); + spec.setTitle(s.getTitle()); + spec.setSpec(dto.getSpec()); + spec.setVerify(dto.getVerify()); + spec.setFiles(dto.getFileUrl()); + + return spec; + } + + private ZtStory buildStory(ZtStoryDTO dto) { + ZtStory s = new ZtStory(); + BeanUtils.copyProperties(dto, s); + s.setVersion(1); + s.setOpenedby(RiskUserThreadLocal.get().getName()); + s.setOpenedDate(new Date()); + if(!"draft".equals(dto.getStatus())){ + if(dto.getPsFlag()!=null&&dto.getPsFlag()){ + s.setStatus("active"); + }else{ + s.setStatus("reviewing"); + } + + } + + s.setStage("wait"); + return s; + } + + @Override + public void batchAddStory(ZtStoryDTO dto) { + ZtStory s = buildStory(dto); + this.baseMapper.insert(s); + ZtStoryspec spec = buildSpec(dto,s); + storyspecService.save(spec); + + fileService.updateFile(dto.getFiles(),s.getId(), FileTypes.story); + + if(dto.getFeedbackId()!=null&&dto.getFeedbackId()!=0){ + ZtStoryFeedback storyFeedback = this.storyFeedbackService.getById(dto.getFeedbackId()); + if(!storyFeedback.getStatus().equals("wait")){ + throw new BusinessException("问题反馈已被处理"); + } + storyFeedback.setStatus("doing"); + storyFeedback.setStoryId(s.getId()); + storyFeedback.setUpdateDate(new Date()); + storyFeedback.setUpdateUser(RiskUserThreadLocal.get().getName()); + this.storyFeedbackService.updateById(storyFeedback); + } + if(dto.getUserStory()!=null&&dto.getUserStory()!=0){ + ZtStoryUser storyUser = storyUserService.getById(dto.getUserStory()); + if(storyUser!=null&&"wait".equals(storyUser.getStatus())){ + storyUser.setStatus("active"); + storyUserService.updateById(storyUser); + } + + } + + actionService.addAction(ActionType.XQ, ActionStatus.XJ, s.getId(), "", dto.getProduct(), null, + RiskUserThreadLocal.get().getName(), dto.getClosedreason(), ""); + + if (!CollectionUtils.isEmpty(dto.getUserViewId())) { + for (String str : dto.getUserViewId()) { + ZtStoryreview v = new ZtStoryreview(); + v.setStory(s.getId()); + v.setVersion(s.getVersion()); + v.setReviewer(str); + v.setType("story"); + this.storyreviewService.save(v); + actionService.addAction(ActionType.XQ, ActionStatus.PS, s.getId(), s.getProduct() + "", s.getProject(), null, + RiskUserThreadLocal.get().getName(), dto.getClosedreason(), str); + } + + } + if (s.getProduct() != null&&s.getProduct()!=0) { ZtProduct product = productService.getById(s.getProduct()); @@ -251,75 +345,14 @@ public class ZtStoryServiceImpl extends ServiceImpl impl this.productService.updateById(product); } - if (s.getProduct() == null) { - List list = this.projectstoryService.list(new QueryWrapper().lambda() - .eq(ZtProjectstory::getProject, s.getProject()) - ); - int order = 0; - if (!CollectionUtils.isEmpty(list)) { - ZtProjectstory ztProjectstory = list.get(list.size() - 1); - order = ztProjectstory.getOrder() + 5; - } - ZtProjectstory ztProjectstory = new ZtProjectstory(); - ztProjectstory.setOrder(order); - ztProjectstory.setStory(s.getId()); - ztProjectstory.setProject(s.getProject()); - this.projectstoryService.save(ztProjectstory); - } - List executions = dto.getExecutions(); if(!CollectionUtils.isEmpty(executions)){ -// this.projectproductService.getOne(new QueryWrapper<>().lambda().eq()); - //拿执行的项目id -// this.executionprojectService.getOne(new QueryWrapper().lambda().eq()) this.executionBindStory(s,executions); } - // 1.如果是产品 那么关联 项目 执行 2.如果是项目 关联执行 -// if(dto.getExecution()!=null&&dto.getExecution()!=0){ -// List syncList = this.projectstoryService.list(new QueryWrapper().lambda().eq(ZtProjectstory::getStory, s.getId()) -// .eq(ZtProjectstory::getExecution, dto.getExecution())); -// if(CollectionUtils.isEmpty(syncList)){ -// if (s.getProduct() != null&&s.getProduct()!=0) { -// -// List execlist = this.executionprojectService.list(new QueryWrapper().lambda() -// .eq(ZtExecutionproject::getExecution, dto.getExecution())); -// if(CollectionUtils.isEmpty(execlist)){ -// List list = this.projectproductService.list(new QueryWrapper() -// .lambda().eq(ZtProjectproduct::getProduct, s.getProduct())); -// ZtProjectproduct ztProjectproduct = list.get(0); -// -// -// ZtProjectstory ztProjectstory = new ZtProjectstory(); -// ztProjectstory.setOrder(1); -// ztProjectstory.setStory(s.getId()); -// ztProjectstory.setProject(ztProjectproduct.getProject()); -// this.projectstoryService.save(ztProjectstory); -// //添加执行 -// }else{ -// -// ZtProjectstory ztProjectstory = new ZtProjectstory(); -// ztProjectstory.setOrder(1); -// ztProjectstory.setStory(s.getId()); -// ztProjectstory.setProject(execlist.get(0).getProject()); -// this.projectstoryService.save(ztProjectstory); -// } -// -// -// -// } -// } -// -// ZtProjectDTO d=new ZtProjectDTO(); -// d.setExcludeId(dto.getExecution()); -// d.setStoryIds(new ArrayList<>(){{add(s.getId());}}); -// projectService.executionSyncStory(d); -// } - - - } + @Override @Transactional public void editStory(ZtStoryDTO dto) { @@ -357,7 +390,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } } //取消关联 - executionUnBindStory(ztStory.getId(),execList); +// executionUnBindStory(ztStory.getId(),execList); } @@ -585,7 +618,21 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(CollectionUtils.isEmpty(closed)){ return new ArrayList<>(); } - return BeanCopyUtil.copyListProperties(closed,ZtStoryDTO::new); + List storyDTOList = BeanCopyUtil.copyListProperties(closed, ZtStoryDTO::new); + if(!CollectionUtils.isEmpty(storyDTOList)){ + Map> executionMapByStory = getExecutionMapByStory(storyDTOList); + for (ZtStoryDTO d:storyDTOList ) { + List ztProjectList = executionMapByStory.get(d.getId()); + if(!CollectionUtils.isEmpty(ztProjectList)){ +// d.setExecution(ztProject.getId()); + d.setExecutionName(ztProjectList.stream().map(o->o.getName()).collect(Collectors.joining(","))); + d.setExecutions(ztProjectList.stream().map(o->o.getId()).collect(Collectors.toList())); + } + } + + } + + return storyDTOList; } @@ -612,7 +659,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl for (ZtStoryDTO d : list) { - d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); + d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); d.setViews(rMap.get(d.getId())); List ztProjectList = execMap.get(d.getId()); @@ -631,6 +678,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(ztUser!=null){ d.setOpenedbyName(ztUser.getNickname()); } + ztUser = userMap.get(d.getYsUser()); + if(ztUser!=null){ + d.setYsUserName(ztUser.getNickname()); + } } } @@ -673,11 +724,13 @@ public class ZtStoryServiceImpl extends ServiceImpl impl + @Override public List execNoSyncProject(ZtProjectQo qo) { String execution = qo.getExecution(); - List execList = this.executionprojectService.list(new QueryWrapper().lambda().eq(ZtExecutionproject::getExecution, execution)); + List execList = this.executionprojectService.list(new QueryWrapper().lambda() + .eq(ZtExecutionproject::getExecution, execution)); if(CollectionUtils.isEmpty(execList)){ @@ -805,11 +858,26 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(id==null||id==0){ return; } + + + ZtStory ztStory = this.baseMapper.selectById(id); if(ztStory==null){ throw new BusinessException("未查询到需求"); } - if(!Arrays.asList("wait","projected","developing").contains(ztStory.getStage())){ + + List taskList = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) + .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause")) + .eq(ZtTask::getType,"devel") + ); + //任务没有做完 + if(!CollectionUtils.isEmpty(taskList)){ + return; + } + //developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified已验收 closed + if( Arrays.asList("developed","tested","released","verified","closed").contains(ztStory.getStage())){ + return; + } if("testing".equals(ztStory.getStage())){ List list = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause")) @@ -828,20 +896,14 @@ public class ZtStoryServiceImpl extends ServiceImpl impl actionService.addAction(ActionType.XQ, ActionStatus.CSWC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, RiskUserThreadLocal.get().getName(), null, ""); } + return; } - return; - } - List list = taskService.list(new QueryWrapper().lambda().eq(ZtTask::getStory, id) - .in(ZtTask::getStatus, Arrays.asList("wait", "doing", "pause")) - .eq(ZtTask::getType,"devel") - ); - if(Arrays.asList("wait").contains(ztStory.getStage())){ + + if(Arrays.asList("wait").contains(ztStory.getStage())&&!CollectionUtils.isEmpty(taskList)){ this.startStory(id); return ; } - if (!CollectionUtils.isEmpty(list)) { - return; - } + ztStory.setStage("developed"); this.baseMapper.updateById(ztStory); List executionId = this.getExecutionId(ztStory); @@ -884,7 +946,8 @@ public class ZtStoryServiceImpl extends ServiceImpl impl .in(ZtTask::getType,"test","devel") ); if (!CollectionUtils.isEmpty(list)) { - if("developed".equals(ztStory.getStage())){ + + if(Arrays.asList("wait","projected","developing","developed").contains(ztStory.getStage())){ this.testingStory(story); } return; @@ -981,7 +1044,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } } - actionService.addAction(ActionType.XQ, ActionStatus.FB, 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, ""); } @@ -1060,6 +1123,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if("closed".equals(ztStory.getStatus())){ throw new BusinessException("当前已关闭"); } + ztStory.setStatus("active"); List execIds = getExecutionId(ztStory); if(CollectionUtils.isEmpty(execIds)&&!"closed".equalsIgnoreCase(dto.getStage())){ throw new BusinessException("当前无迭代,不可以更改"); @@ -1087,7 +1151,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } if("released".equals(newStatus)&&ztStory.getEndDate()==null){ ztStory.setEndDate(new Date()); - actionService.addAction(ActionType.XQ, ActionStatus.FB, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, + actionService.addAction(ActionType.XQ, ActionStatus.FBCG, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, RiskUserThreadLocal.get().getName(), null, ""); } if("developing".equals(newStatus)&&ztStory.getStartDate()==null){ @@ -1095,6 +1159,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl actionService.addAction(ActionType.XQ, ActionStatus.KS, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, RiskUserThreadLocal.get().getName(), null, ""); } + if("verified".equals(newStatus)){ + ztStory.setStatus("finished"); + } + this.baseMapper.updateById(ztStory); for (Integer execId : execIds) { @@ -1137,7 +1205,28 @@ public class ZtStoryServiceImpl extends ServiceImpl impl @Override @Transactional public void changeExecution(ZtStoryDTO dto) { -// List idList = dto.getIdList(); + + + + + List idList = dto.getIdList(); + if(CollectionUtils.isEmpty(idList)){ + throw new BusinessException("请选择"); + } + List storyList = this.listByIds(idList); + + + List list = this.projectstoryService.list(new QueryWrapper().lambda() + .eq(ZtProjectstory::getProject, dto.getExecution()).in(ZtProjectstory::getStory, idList).eq(ZtProjectstory::getType,"execution")); + if(!CollectionUtils.isEmpty(list)){ + throw new BusinessException("需求 "+list.get(0).getStory()+" 已关联"); + } + + for (ZtStory s:storyList) { + executionBindStory(s,new ArrayList<>(Arrays.asList(dto.getExecution()))); + } + + // for (Integer i : idList) { // ZtStory ztStory = this.baseMapper.selectById(i); // if("closed".equals(ztStory.getStatus())){ @@ -1212,41 +1301,38 @@ public class ZtStoryServiceImpl extends ServiceImpl impl //首页根据id查询的 if(!StringUtils.isEmpty(qo.getIds())){ +// page= PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); String[] split = qo.getIds().split(","); List ids =new ArrayList<>(Arrays.asList(split)); - list=this.baseMapper.storyPageListByIds(ids); - }else{ + qo.setObjIds(ids); +// list=this.baseMapper.storyPageListByIds(ids); + } +// else{ if(UserType.KFZ==loginRiskUser.getUserType()||UserType.CS==loginRiskUser.getUserType()){ page= PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); qo.setKfz(1); list=this.baseMapper.projectStoryPageList(qo); - }else if(UserType.GSGC==loginRiskUser.getUserType()){ - //全部 - page= PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); - list=this.baseMapper.allStoryPageList(qo); - }else{ + } +// else if(UserType.GSGC==loginRiskUser.getUserType()){ +// //全部 +// page= PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); +// list=this.baseMapper.allStoryPageList(qo); +// } + else{ //自己有权限的 产品集 - List integers = this.projectService.authList(); + List integers = this.projectService.authProductList(); if(!CollectionUtils.isEmpty(integers)){ - List pList = this.productService.list(new QueryWrapper().lambda().in(ZtProduct::getProgram, integers)); - //所有的产品 - if(!CollectionUtils.isEmpty(pList)){ - qo.setProductIds(pList.stream().map(o->o.getId()).collect(Collectors.toList())); + qo.setProductIds(integers); page= PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); list=this.baseMapper.myStoryPageList(qo); - }else{ - list=new ArrayList<>(); - } - }else{ list=new ArrayList<>(); } } - } @@ -1265,7 +1351,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl for (ZtStoryDTO d : list) { - d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); + d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); d.setViews(rMap.get(d.getId())); List ztProjectList = execMap.get(d.getId()); if(!CollectionUtils.isEmpty(ztProjectList)){ @@ -1280,6 +1366,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(ztUser!=null){ d.setOpenedbyName(ztUser.getNickname()); } + ztUser = userMap.get(d.getYsUser()); + if(ztUser!=null){ + d.setYsUserName(ztUser.getNickname()); + } } } @@ -1350,6 +1440,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl ProductStoryStatus oldPStatus = getProductStatus(status); this.productService.productChangeStatus(ztStory.getProduct(), oldPStatus, ProductStoryStatus.GB); } + this.closeTaskBug(ztStory.getId()); } @@ -1421,24 +1512,48 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } //验收 @Override + @Transactional public void storyYs(ZtStoryDTO dto) { ZtStory ztStory = this.baseMapper.selectById(dto.getId()); if("closed".equals(ztStory.getStatus())){ throw new BusinessException("当前已关闭"); } + + String stage = ztStory.getStage(); + if(!"verified".equals(stage)){ + ZtProduct product = this.productService.getById(ztStory.getProduct()); + + product.setYss(product.getYss()+1); + product.setReleases(product.getReleases()-1); + this.productService.updateById(product); + } + //已发布 Integer revieweResult = dto.getRevieweResult(); ztStory.setStage("verified"); ztStory.setYsFlag(revieweResult); ztStory.setYsRemark(dto.getDesc()); - this.baseMapper.updateById(ztStory); + ActionStatus status; if(revieweResult==1){ status=ActionStatus.YSTG; + //如果研发需求验收完毕 那么用户需求也需要变更 + if(ztStory.getUserStory()!=null&&ztStory.getUserStory()!=0){ + List storyList = this.baseMapper.selectList(new QueryWrapper().lambda() + .ne(ZtStory::getId,ztStory.getId()) + .in(ZtStory::getStage,"wait","projected","developing","developed","testing","tested","released") + .eq(ZtStory::getUserStory, ztStory.getUserStory())); + if(CollectionUtils.isEmpty(storyList)){ + ZtStoryUser ztStoryUser = this.storyUserService.getById(ztStory.getUserStory()); + ztStoryUser.setStatus("finished"); + this.storyUserService.updateById(ztStoryUser); + } + } + ztStory.setStatus("finished"); }else{ status=ActionStatus.YSBTG; } - + this.baseMapper.updateById(ztStory); //添加action actionService.addAction(ActionType.XQ, status, ztStory.getId(), ztStory.getProduct() + "", null, null, RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo()); @@ -1481,13 +1596,28 @@ public class ZtStoryServiceImpl extends ServiceImpl impl userIds.add(ztStory.getAssignedTo()); userIds.add(ztStory.getOpenedby()); - Map userMap = this.userService.userMapByIds(userIds); + Map userMap = this.userService.userMapByIds(null); Map> rMap = getReviewMap(Arrays.asList(d)); - d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); +// d.setRevieweUser(d.getReviewedby().replaceAll(",", " ")); + + + if(!StringUtils.isEmpty(d.getReviewedby())){ + String[] split = d.getReviewedby().split(","); + StringBuilder b=new StringBuilder(); + for (String s:split) { + ZtUser u = userMap.get(s); + if(u!=null){ + b.append(u.getNickname()+","); + } + + } + d.setReviewedbyName(b.toString()); + } + d.setViews(rMap.get(d.getId())); ZtUser ztUser = userMap.get(d.getAssignedTo()); if(ztUser!=null){ @@ -1498,7 +1628,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if(ztUser!=null){ d.setOpenedbyName(ztUser.getNickname()); } - + ztUser = userMap.get(d.getYsUser()); + if(ztUser!=null){ + d.setYsUserName(ztUser.getNickname()); + } ZtStoryspec storyspec = this.storyspecService.getOne(new QueryWrapper().lambda().eq(ZtStoryspec::getStory, d.getId())); if(storyspec!=null){ @@ -1507,6 +1640,31 @@ public class ZtStoryServiceImpl extends ServiceImpl impl d.setSpec(storyspec.getSpec()); d.setVerify(storyspec.getVerify()); } + List list = this.projectstoryService.list(new QueryWrapper().lambda().eq(ZtProjectstory::getStory, d.getId()).eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue())); + if(!CollectionUtils.isEmpty(list)){ + d.setExecutions(list.stream().map(o->o.getProject()).collect(Collectors.toList())); + } + Integer userStory = d.getUserStory(); + if(userStory!=null&&userStory!=0){ + ZtStoryUser storyUser = this.storyUserService.getById(userStory); + if(storyUser!=null){ + d.setUserStoryName(storyUser.getTitle()); + } + } + if(d.getParent()!=null&&d.getParent()!=0){ + ZtStory pStory = this.getById(d.getParent()); + if(pStory!=null){ + d.setParentName(pStory.getTitle()); + } + + } + if(d.getModule()!=null&&d.getModule()!=0){ + ZtModule ztModule = this.moduleService.getById(d.getModule()); + if(ztModule!=null){ + d.setModuleName(ztModule.getName()); + } + } + return d; } @@ -1522,7 +1680,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl return new ArrayList<>(); } - return this.projectService.listByIds(list.stream().map(o->o.getExecution()).collect(Collectors.toList())); + + return this.projectService.list(new QueryWrapper().lambda().in(ZtProject::getId,list.stream().map(o->o.getExecution()).collect(Collectors.toList())) + .ne(ZtProject::getStatus,"closed").orderByDesc(ZtProject::getId) + ); } @@ -1664,7 +1825,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } - List ztStories = IZtStoryService.listByIds(list.stream().map(o -> o.getStory()).collect(Collectors.toList())); + List ztStories = IZtStoryService.list( + new QueryWrapper().lambda().in(ZtStory::getId,list.stream().map(o -> o.getStory()).collect(Collectors.toList())) + .ne(ZtStory::getStatus,"closed")); List storyList = BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new); 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 9cdc57b..dbb54ba 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java @@ -19,10 +19,7 @@ import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; -import com.sa.zentao.utils.Constant; -import com.sa.zentao.utils.DateUtils; import org.apache.commons.lang3.StringUtils; -import org.quartz.CronExpression; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -61,6 +58,9 @@ public class ZtStoryUserServiceImpl extends ServiceImpl pageList(StoryQo qo) { - Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + qo.setUserName(RiskUserThreadLocal.get().getName()); @@ -139,7 +154,9 @@ public class ZtStoryUserServiceImpl extends ServiceImpl(Arrays.asList(split))); } - + List integers = this.projectService.authProductList(); + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + qo.setProductIds(integers); List list = this.baseMapper.pageList(qo); if (!CollectionUtils.isEmpty(list)) { @@ -148,7 +165,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl o.getLasteditedby()).collect(Collectors.toList())); - Map userMap = this.userService.userMapByIds(userIds); + Map userMap = this.userService.userMapByIds(null); Map> storyUserMap = getStoryUserMap(list); @@ -156,18 +173,35 @@ public class ZtStoryUserServiceImpl extends ServiceImpl ztStories = storyUserMap.get(d.getId()); if(!CollectionUtils.isEmpty(ztStories)){ d.setStoryList(ztStories.stream().map(o->o.getTitle()).collect(Collectors.joining(","))); @@ -183,9 +217,12 @@ public class ZtStoryUserServiceImpl extends ServiceImpl rejectList = list.stream().filter(o -> "reject".equalsIgnoreCase(o.getResult())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(rejectList)) { - ztStory.setStatus("closed"); + } else { ztStory.setStatus("active"); ztStory.setStage("wait"); @@ -262,9 +300,12 @@ public class ZtStoryUserServiceImpl extends ServiceImpl userMap = userService.userMapByIds(null); + String openedby = dto.getOpenedby(); + ZtUser ztUser = userMap.get(openedby); + if(ztUser!=null){ + dto.setOpenedbyName(ztUser.getNickname()); + } + Map> storyUserMap = getStoryUserMap(Arrays.asList(dto)); + List ztStories = storyUserMap.get(d.getId()); + if(!CollectionUtils.isEmpty(ztStories)){ + dto.setStoryList(ztStories.stream().map(o->o.getTitle()).collect(Collectors.joining(","))); + } + if(!StringUtils.isEmpty(dto.getReviewedby())){ + String[] split = dto.getReviewedby().split(","); + StringBuilder b=new StringBuilder(); + for (String s:split) { + + ZtUser u = userMap.get(s); + if(u!=null){ + b.append(u.getNickname()+","); + } + } + } + if(dto.getParent()!=null&&dto.getParent()!=0){ + ZtStoryUser pStory = this.getById(dto.getParent()); + if(pStory!=null){ + dto.setParentName(pStory.getTitle()); + } + + } + if(dto.getModule()!=null&&dto.getModule()!=0){ + ZtModule ztModule = this.moduleService.getById(dto.getModule()); + if(ztModule!=null){ + dto.setModuleName(ztModule.getName()); + } + } + Map> rMap = getReviewMap(Arrays.asList(dto)); + + if(!StringUtils.isEmpty(d.getReviewedby())){ + String[] split = d.getReviewedby().split(","); + StringBuilder b=new StringBuilder(); + for (String s:split) { + ZtUser u = userMap.get(s); + if(u!=null){ + b.append(u.getNickname()+","); + } + + } + dto.setReviewedbyName(b.toString()); + } + dto.setViews(rMap.get(d.getId())); + + return dto; + } + + @Override + public void addRemark(ZtStoryDTO dto) { + ZtStoryUser ztStory = this.baseMapper.selectById(dto.getId()); + if(ztStory==null){ + throw new BusinessException("未查询到"); + } + actionService.addAction(ActionType.USERXQ, ActionStatus.TJBZ, dto.getId(), ztStory.getProduct() + "", null, null, + RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); + } + + @Override + public void closedStory(ZtStoryUserDTO dto) { + String closedreason = dto.getClosedreason(); + ZtStoryUser ztStoryUser = this.baseMapper.selectById(dto.getId()); + if(ztStoryUser==null||ztStoryUser.getStatus().equals("closed")){ + throw new BusinessException("当前未查询到或已关闭"); + } + ztStoryUser.setClosedreason(closedreason); + ztStoryUser.setClosedby(RiskUserThreadLocal.get().getName()); + ztStoryUser.setCloseddate(new Date()); + ztStoryUser.setStatus("closed"); + this.baseMapper.updateById(ztStoryUser); + + actionService.addAction(ActionType.XQ, ActionStatus.GB, dto.getId(), ztStoryUser.getProduct() + "", null, null, + RiskUserThreadLocal.get().getName(),"关闭原因:"+closedreason+"\r\n 关闭备注: " +dto.getRemark(), ""); + } private Map> getStoryUserMap(List 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 a781c71..2199489 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java @@ -9,16 +9,14 @@ import com.sa.zentao.conf.LoginRiskUser; import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.dao.*; import com.sa.zentao.entity.*; -import com.sa.zentao.enums.ActionStatus; -import com.sa.zentao.enums.ActionType; -import com.sa.zentao.enums.FileTypes; -import com.sa.zentao.enums.UserType; +import com.sa.zentao.enums.*; import com.sa.zentao.mapper.ZtTaskMapper; import com.sa.zentao.qo.KanbanQo; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; +import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.KanBanConstant; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -92,7 +90,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme task.setAssignedToName(ztUser.getNickname()); } - + if(task.getDeadline()!=null){ + task.setDeadline(DateUtils.getDayLast(task.getDeadline())); + } } } @@ -117,7 +117,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme actionService.addAction(ActionType.RW, ActionStatus.FP,ztTask.getId() ,projectproduct==null?null:projectproduct.getProduct().toString(),projectproduct==null?null:projectproduct.getProject(),ztTask.getExecution(), - RiskUserThreadLocal.get().getName(),null,null); + RiskUserThreadLocal.get().getName(),null,dto.getAssignedTo()); } @Override @@ -209,13 +209,21 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if(ztTask==null){ throw new BusinessException("未查询到数据"); } + Map userMap = this.userService.userMapByIds(null); + ZtTaskDTO dto=new ZtTaskDTO(); BeanUtils.copyProperties(ztTask,dto); if(ztTask.getExecution()!=null&&ztTask.getExecution()!=0){ ZtProject project = this.ztProjectService.getById(ztTask.getExecution()); dto.setImplementId(project.getId()); dto.setImplementName(project.getName()); - + } + if(dto.getDeadline()!=null){ + dto.setDeadline(DateUtils.getDayLast(ztTask.getDeadline())); + } + ZtUser ztUser = userMap.get(ztTask.getAssignedTo()); + if(ztUser!=null){ + dto.setAssignedToName(ztUser.getNickname()); } return dto; @@ -264,6 +272,19 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme String[] split = qo.getIds().split(","); qo.setObjIds(new ArrayList<>(Arrays.asList(split))); } + if(!StringUtils.isEmpty(qo.getProductName())){ + List pList = this.productService.selectProductByName(qo.getProductName()); + if(!CollectionUtils.isEmpty(pList)){ + List list = this.projectproductService.list(new QueryWrapper() + .lambda().in(ZtProjectproduct::getProduct, pList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if(CollectionUtils.isEmpty(list)){ + return new PageInfo<>(); + }else{ + qo.setProjectList(list.stream().map(o->o.getProject()).collect(Collectors.toList())); + } + } + } + List list = this.baseMapper.taskPageList(qo); if(!CollectionUtils.isEmpty(list)){ @@ -280,7 +301,9 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if(ztUser!=null){ task.setAssignedToName(ztUser.getNickname()); } - + if(task.getDeadline()!=null){ + task.setDeadline(DateUtils.getDayLast(task.getDeadline())); + } } @@ -304,6 +327,15 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setOpenedby(RiskUserThreadLocal.get().getName()); ztTask.setOpeneddate(new Date()); ztTask.setEstimate(dto.getLeft()); + Integer project = ztTask.getProject(); + ZtProjectproduct ztProjectproduct = this.projectproductService.getOne(new QueryWrapper().lambda() + .eq(ZtProjectproduct::getProject, project)); + if(ztProjectproduct!=null){ + ztTask.setProduct(ztProjectproduct.getProduct()); + } + + + //getExecution()执行 //项目 Integer story = ztTask.getStory(); @@ -520,7 +552,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme throw new BusinessException("未查询到数据"); } ztTask.setConsumed(dto.getConsumed()+ztTask.getConsumed()); - ztTask.setLeft(0f); + ztTask.setLeft(ztTask.getEstimate()-ztTask.getConsumed()); ztTask.setStatus("done"); ztTask.setRealstarted(dto.getRealstarted()); ztTask.setFinishedby(RiskUserThreadLocal.get().getName()); @@ -694,47 +726,72 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme @Override @Transactional public void batchAddTask(ZtTaskDTO dto) { - throw new BusinessException("已弃用"); -// if(CollectionUtils.isEmpty(dto.getList())){ -// throw new BusinessException("请检查数据"); -// } -// long count = dto.getList().stream().filter(o -> StringUtils.isEmpty(o.getName())).count(); -// if(count>0){ -// throw new BusinessException("请检查数据"); -// } -// -// Integer storyId = dto.getList().get(0).getStory(); -// ZtProjectstory projectstory = projectstoryService.getOne(new QueryWrapper().lambda().eq(ZtProjectstory::getStory, storyId) -// .ne(ZtProjectstory::getProject, 0) -// ); -// -// -// List list = dto.getList(); -// List saveList =new ArrayList(); -// for (ZtTaskDTO d:list) { -// ZtTask ztTask = new ZtTask(); -// -// BeanUtils.copyProperties(d,ztTask); -// ztTask.setProject(projectstory.getProject()); -// ztTask.setOpenedby(RiskUserThreadLocal.get().getName()); -// ztTask.setOpeneddate(new Date()); -// ztTask.setStatus("reviewing"); -// if(ztTask.getDeadline()!=null){ -// ztTask.setDeadlineTime(ztTask.getDeadline().getTime()/1000); -// } -// saveList.add(ztTask); -// } -// this.saveBatch(saveList); -// -// kanbanlaneService.addTask( list.get(0).getExecution(),saveList); -// ZtStory story = storyService.getById(list.get(0).getStory()); -// for (ZtTask t:saveList) { -// -// ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, story.getProject())); -// -// actionService.addAction(ActionType.RW, ActionStatus.XJ,t.getId(),projectproduct==null?null:projectproduct.getProduct().toString(),projectproduct==null?null:projectproduct.getProject(),t.getExecution(), -// RiskUserThreadLocal.get().getName(),dto.getDesc(),null); -// } + if(CollectionUtils.isEmpty(dto.getList())){ + throw new BusinessException("请检查数据"); + } + long count = dto.getList().stream().filter(o -> StringUtils.isEmpty(o.getName())).count(); + if(count>0){ + throw new BusinessException("请检查数据"); + } + + + Integer storyId = dto.getList().get(0).getStory(); + ZtProjectstory projectstory = projectstoryService.getOne(new QueryWrapper().lambda().eq(ZtProjectstory::getStory, storyId) + .eq(ZtProjectstory::getType,ProjectTypeEnums.project.getValue()) + ); + +// //如果是开发人员 需要评审 + UserType userType = RiskUserThreadLocal.get().getUserType(); + + List list = dto.getList(); + List saveList =new ArrayList(); + for (ZtTaskDTO d:list) { + if(d.getEstimate()==null){ + throw new BusinessException("请检查工时"); + } + ZtTask ztTask = new ZtTask(); + + BeanUtils.copyProperties(d,ztTask); + ztTask.setProject(projectstory.getProject()); + ztTask.setOpenedby(RiskUserThreadLocal.get().getName()); + ztTask.setOpeneddate(new Date()); + if(userType==UserType.KFZ){ + ZtProject ztProject = this.ztProjectService.getById(ztTask.getExecution()); + ztTask.setStatus("reviewing"); + ztTask.setReviewingUser(ztProject.getPm()); + }else{ + ztTask.setStatus("wait"); + ztTask.setReviewingUser(null); + } + ztTask.setLeft(ztTask.getEstimate()); + ztTask.setConsumed(0f); + if(ztTask.getDeadline()!=null){ + ztTask.setDeadlineTime(ztTask.getDeadline().getTime()/1000); + } + Integer project = ztTask.getProject(); + ZtProjectproduct ztProjectproduct = this.projectproductService.getOne(new QueryWrapper().lambda() + .eq(ZtProjectproduct::getProject, project)); + if(ztProjectproduct!=null){ + ztTask.setProduct(ztProjectproduct.getProduct()); + } + saveList.add(ztTask); + } + + + + this.saveBatch(saveList); + + kanbanlaneService.addTask( list.get(0).getExecution(),saveList); + ZtStory story = storyService.getById(list.get(0).getStory()); + ZtProjectstory projectStory = this.projectstoryService.getOne(new QueryWrapper().lambda().eq(ZtProjectstory::getStory, story.getId()).eq(ZtProjectstory::getType, ProjectTypeEnums.project.getValue())); + + for (ZtTask t:saveList) { + + ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, projectStory.getProject())); + + actionService.addAction(ActionType.RW, ActionStatus.XJ,t.getId(),projectproduct==null?null:projectproduct.getProduct().toString(),projectproduct==null?null:projectproduct.getProject(),t.getExecution(), + RiskUserThreadLocal.get().getName(),dto.getDesc(),null); + } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java index f0ebb8a..157a4e1 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java @@ -205,6 +205,18 @@ public class ZtUserServiceImpl extends ServiceImpl impleme return this.baseMapper.selectPrdByName(userName); } + @Override + public ZtUser getbyVxId(String vx) { + if(StringUtils.isEmpty(vx)){ + return null; + } + List ztUsers = this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtUser::getVx, vx)); + if(CollectionUtils.isEmpty(ztUsers)){ + return null; + } + return ztUsers.get(0); + } + public boolean sendSms(String phoneNumber, String verificationCode) { try { // 初始化腾讯云短信服务客户端 diff --git a/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java index 6b67c47..87a7049 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java @@ -141,17 +141,20 @@ public class ZtYwTaskServiceImpl extends ServiceImpl i String mail = t.getMail(); if(t.getTaskRemindDate().getTime()<(System.currentTimeMillis()+1000)){ try { - String content ="

${userName}:

        任务描述:${remark}。

        任务开始时间:${date1}。
        任务截止时间:${date2}。

      请及时开启和完成该项工作,并登录IT工作台提交交付物。

       Best Regards.
 
"; + String content="
${userName}:

        任务名称:${name}。
        任务等级:${level}。
        任务描述:${remark}。

        任务开始时间:${date1}。
        任务截止时间:${date2}。

      请及时开启和完成该项工作,并登录IT工作台提交交付物。

       Best Regards.
 
\n"; +// String content ="
${userName}:

        任务描述:${remark}。

        任务开始时间:${date1}。
        任务截止时间:${date2}。

      请及时开启和完成该项工作,并登录IT工作台提交交付物。

       Best Regards.
 
"; content=content.replace("${userName}",t.getBelongToUser()); content= content.replace("${remark}",t.getRemark()); content= content.replace("${date1}", DateUtils.formatDate(t.getTaskStartDate(),"yy-MM-dd")); content=content.replace("${date2}",DateUtils.formatDate(t.getTaskEndDate(),"yy-MM-dd")); + content=content.replace("${level}",getLevelRemark(t.getLevel())); + content=content.replace("${name}",t.getName()); SendEmail.sendMessage("任务提醒:"+t.getName(),Arrays.asList(mail), StringUtils.isEmpty(t.getCopyMail())?null:Arrays.asList(t.getCopyMail()), content); }catch (Exception e){ - + log.error("",e); } } t.setTaskStatus(2); @@ -160,6 +163,16 @@ public class ZtYwTaskServiceImpl extends ServiceImpl i } } + public String getLevelRemark(Integer level){ + if(level==1){ + return "高"; + }else if(level==2){ + return "中"; + }else if(level==3){ + return "低"; + } + return ""; + } @Override public List ywTaskService(ZtProjectQo qo) { diff --git a/src/main/java/com/sa/zentao/utils/BeanCopyUtil.java b/src/main/java/com/sa/zentao/utils/BeanCopyUtil.java index 640179e..d322233 100644 --- a/src/main/java/com/sa/zentao/utils/BeanCopyUtil.java +++ b/src/main/java/com/sa/zentao/utils/BeanCopyUtil.java @@ -1,7 +1,23 @@ package com.sa.zentao.utils; +import com.itextpdf.html2pdf.HtmlConverter; +import com.itextpdf.io.IOException; +import com.itextpdf.io.font.constants.StandardFonts; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.styledxmlparser.jsoup.Jsoup; +import lombok.SneakyThrows; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.BeanUtils; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; @@ -27,4 +43,88 @@ public class BeanCopyUtil extends BeanUtils { } return list; } + + @SneakyThrows + public static void main(String[] args) { + +// String htmlContent = "

Hello, World!

This is a paragraph.

"; +// String dest = "output.pdf"; // Destination PDF file +// +// try (PdfWriter writer = new PdfWriter(new FileOutputStream(dest)); +// PdfDocument pdf = new PdfDocument(writer)) { +// +// HtmlConverter.convertToPdf(htmlContent.getBytes(), pdf); +// System.out.println("HTML content has been converted to PDF successfully."); +// } catch (IOException e) { +// e.printStackTrace(); +// } + +// PDDocument document = new PDDocument(); +// PDPage page = new PDPage(); +// document.addPage(page); +// +// PDPageContentStream contentStream = new PDPageContentStream(document, page); +// contentStream.setFont(PDType1Font.HELVETICA, 12); +// contentStream.beginText(); +// contentStream.newLineAtOffset(50, 700); +// +// String htmlContent = "

Hello, World!

"; +// PDHtmlTextStripper stripper = new PDHtmlTextStripper(); +// stripper.setStartPage(1); +// stripper.setEndPage(2); +// stripper.writeText(document, contentStream, htmlContent); +// +// contentStream.endText(); +// contentStream.close(); + + // 1、创建一个 PdfWriter ,参数为创建的路径 +// String dest = "F:\\禅道\\zentao\\zentao\\"+"output.pdf"; +// PdfWriter writer = new PdfWriter(dest); +// +// // 2、创建一个 PdfDocument,参数为PdfWriter +// PdfDocument pdfDoc = new PdfDocument(writer); +// +// // 3、用PdfDocument创建一个空白 page +// pdfDoc.addNewPage(); +// +// // 4、创建一个 Document,参数为PdfDocument +// Document document = new Document(pdfDoc); +// +// +// String para1 = "段落1的内容"; +// +// String para2 = "段落2的内容"; +// +// // 创建段落 Paragraphs +// Paragraph paragraph1 = new Paragraph(para1); +// Paragraph paragraph2 = new Paragraph(para2); +// Paragraph paragraph3 = new Paragraph("

111111

"); +// // 把段落添加到 document +// document.add(paragraph1); +// document.add(paragraph2); +// document.add(paragraph3); +// // 5、关闭 document,PdfDocument +// document.close(); +// pdfDoc.close(); +// String html = "标题

这是一段示例文本。

"; +// com.itextpdf.styledxmlparser.jsoup.nodes.Document doc = Jsoup.parse(html); +// +// String titleText = doc.select("h1").text(); +// String paragraphText = doc.select("p").text(); +// +// String dest = "output.pdf"; +// try { +// PdfWriter writer = new PdfWriter(dest); +// PdfDocument pdf = new PdfDocument(writer); +// Document document = new Document(pdf); +// +// document.add(new Paragraph("标题: " + titleText).setFont(StandardFonts.HELVETICA_BOLD)); +// document.add(new Paragraph("段落: " + paragraphText)); +// +// document.close(); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } + + } } \ No newline at end of file diff --git a/src/main/java/com/sa/zentao/utils/MyXMLWorkerHelper.java b/src/main/java/com/sa/zentao/utils/MyXMLWorkerHelper.java new file mode 100644 index 0000000..3576816 --- /dev/null +++ b/src/main/java/com/sa/zentao/utils/MyXMLWorkerHelper.java @@ -0,0 +1,72 @@ +package com.sa.zentao.utils; + +import com.itextpdf.text.Font; +import com.itextpdf.tool.xml.ElementList; +import com.itextpdf.tool.xml.XMLWorker; +import com.itextpdf.tool.xml.XMLWorkerFontProvider; +import com.itextpdf.tool.xml.XMLWorkerHelper; +import com.itextpdf.tool.xml.css.CssFile; +import com.itextpdf.tool.xml.css.StyleAttrCSSResolver; +import com.itextpdf.tool.xml.html.CssAppliers; +import com.itextpdf.tool.xml.html.CssAppliersImpl; +import com.itextpdf.tool.xml.html.Tags; +import com.itextpdf.tool.xml.parser.XMLParser; +import com.itextpdf.tool.xml.pipeline.css.CSSResolver; +import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline; +import com.itextpdf.tool.xml.pipeline.end.ElementHandlerPipeline; +import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline; +import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class MyXMLWorkerHelper { + public static class MyFontsProvider extends XMLWorkerFontProvider { + public MyFontsProvider() { + super(null, null); + } + + @Override + public Font getFont(final String fontname, String encoding, float size, final int style) { + + String fntname = fontname; + if (fntname == null) { + fntname = "宋体"; + } + return super.getFont(fntname, encoding, size, style); + } + } + + public static ElementList parseToElementList(String html, String css) throws IOException { + // CSS + CSSResolver cssResolver = new StyleAttrCSSResolver(); + if (css != null) { + CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes())); + cssResolver.addCss(cssFile); + } + + // HTML + MyFontsProvider fontProvider = new MyFontsProvider(); + CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); + HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers); + htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); + htmlContext.autoBookmark(false); + + // Pipelines + ElementList elements = new ElementList(); + ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null); + HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end); + CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline); + + // XML Worker + XMLWorker worker = new XMLWorker(cssPipeline, true); + XMLParser p = new XMLParser(worker); +// + html = html.replace("
", "").replace("", "").replace("
", "").replace("", "") + .replace("", ""); + p.parse(new ByteArrayInputStream(html.getBytes())); + + return elements; + } + +} \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index a67f48b..184c1dd 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -31,4 +31,5 @@ spring: file: - baseUrl: http://192.168.3.200:8013 \ No newline at end of file + baseUrl: http://192.168.3.200:8013 + meeting: /data/buildzentao/meeting.docx \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 9c511d7..1ca1c2f 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -22,12 +22,12 @@ spring: strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: -# url: jdbc:mysql://192.168.1.161:3306/zentao?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true -# username: devgps -# password: dev@2021GPS - url: jdbc:mysql://192.168.3.200:3306/zentao_dev?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true - username: root - password: PX4fTAAsJ#T!1 + url: jdbc:mysql://192.168.1.161:3306/zentao?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true + username: devgps + password: dev@2021GPS +# url: jdbc:mysql://192.168.3.200:3306/zentao_dev?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&allowPublicKeyRetrieval=true +# username: root +# password: PX4fTAAsJ#T!1 driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 slave: @@ -39,8 +39,8 @@ spring: file: - baseUrl: http://127.0.0.1:8085 - + baseUrl: http://192.168.1.161:8085 + meeting: /data/buildzentao/meeting.docx #spring: # datasource: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a7392ab..4430ad5 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -29,7 +29,7 @@ logging: mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - + typeEnumsPackage: com.sa.zentao.enums diff --git a/src/main/resources/mapper/ZtBugMapper.xml b/src/main/resources/mapper/ZtBugMapper.xml index 4a54883..98b10c2 100644 --- a/src/main/resources/mapper/ZtBugMapper.xml +++ b/src/main/resources/mapper/ZtBugMapper.xml @@ -139,9 +139,20 @@ + + diff --git a/src/main/resources/mapper/ZtProjectstoryMapper.xml b/src/main/resources/mapper/ZtProjectstoryMapper.xml index 28335a0..69c1956 100644 --- a/src/main/resources/mapper/ZtProjectstoryMapper.xml +++ b/src/main/resources/mapper/ZtProjectstoryMapper.xml @@ -14,5 +14,9 @@ SELECT * from zt_projectstory WHERE project = #{id} + diff --git a/src/main/resources/mapper/ZtStoryMapper.xml b/src/main/resources/mapper/ZtStoryMapper.xml index 89525bd..3114b27 100644 --- a/src/main/resources/mapper/ZtStoryMapper.xml +++ b/src/main/resources/mapper/ZtStoryMapper.xml @@ -98,8 +98,7 @@ - and s.stage = 'verified' - and s.ys_flag =1 + and s.stage = 'verified' and s.ys_flag =1 and s.status = '11' @@ -119,8 +118,9 @@ - and s.stage = 'verified' - and s.ys_flag =0 + and ( s.stage = 'released' + and s.ys_flag =0) + or (s.stage = 'verified' and s.ys_flag =2) @@ -174,12 +174,28 @@ - select s.*,sp.spec ,sp.verify,sp.files from (zt_story s,zt_projectstory ps ) left join zt_storyspec sp on s.id = sp.story + select s.*,sp.spec ,sp.verify,sp.files,pt.name productName from (zt_story s,zt_projectstory ps ) left join zt_storyspec sp on s.id = sp.story + left join zt_storyreview v on s.id = v.story and s.version = v.version left join zt_projectstory pstory on s.id = pstory.story and pstory.execution =0 left join zt_project pj on pstory.project = pj.id - + left join zt_product pt on s.product = pt.id WHERE s.id = ps.story + + + + and s.openedDate =]]> #{qo.startDate} + + + and s.openedDate #{qo.endDate} + + + + + + and pt.name like concat('%', #{qo.productName}, '%') + + and ps.project =#{qo.project} @@ -227,8 +243,7 @@ - and s.stage = 'verified' - and s.ys_flag =1 + and s.stage = 'verified' and s.ys_flag =1 and s.status = '11' @@ -248,8 +263,10 @@ - and s.stage = 'verified' - and s.ys_flag =0 + + and ( s.stage = 'released' + and s.ys_flag =0) + or (s.stage = 'verified' and s.ys_flag =2) and s.status ='closed' @@ -310,6 +327,16 @@ + + and s.id in + + #{id} + + + + + group by s.id @@ -408,8 +435,9 @@ - and s.stage = 'verified' - and s.ys_flag =0 + and ( s.stage = 'released' + and s.ys_flag =0) + or (s.stage = 'verified' and s.ys_flag =2) and s.status ='closed' @@ -436,7 +464,8 @@ - SELECT * from zt_story_user s WHERE 1=1 + SELECT s.*,pt.name productName from zt_story_user s LEFT JOIN zt_product pt on s.product = pt.id WHERE 1=1 + + + and s.product in + + #{id} + + + + + + and s.openedDate =]]> #{qo.startDate} + + + and s.openedDate #{qo.endDate} + + + + + + and pt.name like concat('%', #{qo.productName}, '%') + + + + diff --git a/src/main/resources/mapper/ZtTaskMapper.xml b/src/main/resources/mapper/ZtTaskMapper.xml index 160322b..767ae1c 100644 --- a/src/main/resources/mapper/ZtTaskMapper.xml +++ b/src/main/resources/mapper/ZtTaskMapper.xml @@ -59,9 +59,28 @@