From 264359a48d95948ea1b67bf1660521a4d8c1d598 Mon Sep 17 00:00:00 2001 From: 이민희 <mhlee@maprex.co.kr> Date: 목, 09 12월 2021 14:22:13 +0900 Subject: [PATCH] 삭제할 이슈의 하위이슈가 존재할 경우 모두 삭제 & 이슈만 삭제 --- src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | 189 +++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 174 insertions(+), 15 deletions(-) diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java index 4bc411d..2a11e37 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java @@ -17,8 +17,10 @@ import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.mapper.IssueMapper; import kr.wisestone.owl.mapper.ProjectMapper; +import kr.wisestone.owl.repository.IssueRelationRepository; import kr.wisestone.owl.repository.IssueRepository; import kr.wisestone.owl.repository.UserDepartmentRepository; +import kr.wisestone.owl.repository.WorkflowDepartmentRepository; import kr.wisestone.owl.service.*; import kr.wisestone.owl.util.*; import kr.wisestone.owl.util.DateUtil; @@ -56,6 +58,9 @@ @Autowired private ProjectService projectService; + + @Autowired + private IssueTableConfigService issueTableConfigService; @Autowired private IssueStatusService issueStatusService; @@ -154,6 +159,9 @@ private IssueRelationService issueRelationService; @Autowired + private IssueRelationRepository issueRelationRepository; + + @Autowired private ExcelView excelView; @Autowired @@ -167,6 +175,9 @@ @Autowired private UserDepartmentRepository userDepartmentRepository; + + @Autowired + private WorkflowDepartmentRepository workflowDepartmentRepository; @Override protected JpaRepository<Issue, Long> getRepository() { @@ -384,7 +395,7 @@ // �궇吏� �쑀�슚�꽦 泥댄겕 this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate()); // �떞�떦 遺��꽌 �쑀�슚�꽦 泥댄겕 - this.verifyIssueDepartment(project, issueForm); + //this.verifyIssueDepartment(project, issueForm); // �씠�뒋 �긽�깭 �쑀�삎�씠 '��湲�' �씤 �씠�뒋 �긽�깭 媛��졇�삤湲� IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(issueType.getWorkflow()); @@ -470,7 +481,7 @@ // �궇吏� �쑀�슚�꽦 泥댄겕 this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate()); // �떞�떦 遺��꽌 �쑀�슚�꽦 泥댄겕 - this.verifyIssueDepartment(project, issueForm); + //this.verifyIssueDepartment(project, issueForm); // �씠�뒋 �긽�깭 �쑀�삎�씠 '��湲�' �씤 �씠�뒋 �긽�깭 媛��졇�삤湲� IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(issueType.getWorkflow()); @@ -688,11 +699,28 @@ issueCondition.setMyDepartmentIds(myDepartmentIds); } + void SetWorkflowDepartment(List<IssueVo> issueVos){ + for(IssueVo issueVo : issueVos){ + Long issueTypeId = issueVo.getIssueTypeId(); + IssueType issueType = this.issueTypeService.getIssueType(issueTypeId); + Long workflowId = issueType.getWorkflow().getId(); + List<WorkflowDepartment> workflowDepartmentList = this.workflowDepartmentRepository.findByWorkflowId(workflowId); + List<Long> workflowDepartmentIds = Lists.newArrayList(); + if(workflowDepartmentList != null && workflowDepartmentList.size()>0){ + for(WorkflowDepartment workflowDepartment : workflowDepartmentList){ + workflowDepartmentIds.add(workflowDepartment.getDepartment().getId()); + } + } + if(issueVo.getIssueTypeId().equals(issueTypeId)){ + issueVo.setWorkflowDepartmentIds(workflowDepartmentIds); + } + } + } + // �씠�뒋 紐⑸줉�쓣 議고쉶�븳�떎. @Override @Transactional(readOnly = true) - public List<IssueVo> findIssue(Map<String, Object> resJsonData, - IssueCondition issueCondition, Pageable pageable) { + public List<IssueVo> findIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable pageable) { // 寃��깋 議곌굔�쓣 留뚮뱺�떎 if (!this.makeIssueSearchCondition(issueCondition, Lists.newArrayList("01", "02", "03"), pageable)) { @@ -734,6 +762,7 @@ totalCount = this.issueMapper.countByDepartment(issueCondition); } + // �뒠�떇 �쟾 - 0.8, 0.9, 0.9, 0.9, 0.9 /*StopWatch serviceStart = new StopWatch(); serviceStart.start();*/ @@ -749,6 +778,7 @@ this.setMapToIssueVo(results, issueVos, issueCondition, user); this.setCountDownIssues(results, issueVos); + this.SetWorkflowDepartment(issueVos); //�썙�겕�뵆濡쒖슦�뿉 �꽕�젙�븳 �떞�떦遺��꽌 媛��졇�삤湲� resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos); resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(), @@ -1199,6 +1229,7 @@ case "02": // �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎. this.setIssueDetail(issueVo, issue); // �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎. + this.setIssueTableConfigs(issue, issueVo); issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class)); break; } @@ -1209,6 +1240,26 @@ resJsonData.put(Constants.RES_KEY_CONTENTS, issueVo); } + + // �뀒�씠釉� �꽕�젙 �뀑�똿 + private void setIssueTableConfigs(Issue issue, IssueVo issueVo) { + Long IssueTypeId = issue.getIssueType().getId(); + + for (int tableConfigType : IssueTableConfig.IssueTableTypes) { + if (tableConfigType != IssueTableConfig.ISSUE_TABLE_TYPE_MAIN) { + issueVo.addIssueTableConfigVo(createIssueTableConfigVo(IssueTypeId, tableConfigType)); + } + } + } + + private IssueTableConfigVo createIssueTableConfigVo(Long issueTypeId, int tableConfigType) { + IssueTableConfig issueTableConfig = this.issueTableConfigService.findByUserIdAndWorkspaceIdAndIssueTypeIdAndIssueTableType(issueTypeId, tableConfigType); + if (issueTableConfig != null) { + return ConvertUtil.copyProperties(issueTableConfig, IssueTableConfigVo.class); + } + return new IssueTableConfigVo(); + } + // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎 private void setDownIssues(Issue issue, IssueVo issueVo) { @@ -1486,6 +1537,15 @@ } + // �븯�쐞 �씠�뒋媛� 紐⑤몢 醫낅즺 泥섎━ �릺�뿀�쓣 寃쎌슦 �긽�쐞�씠�뒋�룄 �셿猷� 泥섎━ + private void setParentIssueComplete(Issue parentIssue) { + if (parentIssue != null) { + this.issueMapper.findNotCompleteByParentIssueId(parentIssue.getId()); + + } + } + + // �씠�뒋瑜� �닔�젙�븳�떎(api�슜) @Override @Transactional @@ -1493,18 +1553,31 @@ User user = this.convertToUser(issueApiForm.getToken()); IssueForm issueForm = this.convertToIssueForm(issueApiForm, user); - List<IssueVo> issueVos = this.findIssue(issueApiForm); if (issueVos != null && issueVos.size() > 0) { List<Issue> issue = Lists.newArrayList(); for (IssueVo issueVo : issueVos) { IssueVo parentIssueVo = issueVo.getParentIssueVo(); - if (parentIssueVo != null) { - issueForm.setId(parentIssueVo.getId()); - } else { - issueForm.setId(issueVo.getId()); + issueForm.setId(issueVo.getId()); + + // �옄�룞 醫낅즺 �긽�깭 �꽕�젙�씠 �릺�뼱 �엳吏� �븡�쑝硫� �삤瑜섎컻�깮 + Issue modifyIssue = this.modifyIssueForApi(user, issueForm, files); + Issue parentIssue = modifyIssue.getParentIssue(); + IssueType issueType = modifyIssue.getIssueType(); + IssueStatus issueStatus = issueType.getIssueStatus(); + if (issueStatus == null) { + throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_COMPLETE_ISSUE_STATUS_NOT_EXIST)); } - issue.add(this.modifyIssueForApi(user, issueForm, files)); + + if (parentIssue != null) { + List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(parentIssue.getId()); + // �븯�쐞 �씪媛먯씠 紐⑤몢 醫낅즺 �긽�깭�씪�븣 �긽�쐞 �씪媛먮룄 醫낅즺 泥섎━ + if (results == null || results.size() == 0) { + parentIssue.setIssueStatus(issueType.getIssueStatus()); + } + } + + issue.add(modifyIssue); } return issue; } else { @@ -1549,7 +1622,7 @@ // �떞�떦�옄 �쑀�슚�꽦 泥댄겕 //this.verifyIssueAssignee(project, issueForm); // �떞�떦遺��꽌 �쑀�슚�꽦 泥댄겕 - this.verifyIssueDepartment(project, issueForm); + //this.verifyIssueDepartment(project, issueForm); CheckIssueData checkIssueData = new CheckIssueData(); checkIssueData.setIssue(issue); @@ -2023,20 +2096,95 @@ List<Issue> removeIssues = Lists.newArrayList(); for (Long issueId : issueForm.getRemoveIds()) { + //�븯�쐞�씠�뒋 泥댄겕 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); + if(downIssues != null && downIssues.size() > 0){ + for(Issue downIssue : downIssues){ + if(downIssue.getParentIssue() != null){ + downIssue.setParentIssue(null); + } + } + } + Issue issue = this.issueRemoves(issueId, user); removeIssues.add(issue); } - if (removeIssues.size() > 0) { - //this.issueRepository.deleteAll(removeIssues); - } + /*if (removeIssues.size() > 0) { + this.issueRepository.deleteAll(removeIssues); + }*/ // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); } + // �씠�뒋瑜� �궘�젣�븳�떎. + @Override + @Transactional + public void removeAllIssues(IssueForm issueForm) { + // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. + User user = this.webAppUtil.getLoginUserObject(); + this.workspaceService.checkUseWorkspace(); + + if (issueForm.getRemoveIds().size() < 1) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT)); + } + + List<Issue> removeIssues = Lists.newArrayList(); + + for (Long issueId : issueForm.getRemoveIds()) { + //�븯�쐞�씠�뒋 泥댄겕 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); + if(downIssues != null && downIssues.size() > 0){ + for(Issue downIssue : downIssues){ + Long downIssueId = downIssue.getId(); + downIssue = this.issueRemoves(downIssueId, user); + removeIssues.add(downIssue); + } + } + Issue issue = this.issueRemoves(issueId, user); + removeIssues.add(issue); + } + // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� + log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); + } + + // �븯�쐞�씠�뒋瑜� �궘�젣�븳�떎. + @Override + @Transactional + public void removeDownIssues(IssueForm issueForm) { + // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. + User user = this.webAppUtil.getLoginUserObject(); + this.workspaceService.checkUseWorkspace(); + + if (issueForm.getRemoveIds().size() < 1) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT)); + } + + List<Issue> removeIssues = Lists.newArrayList(); + Long downIssueId = 0L; + for (Long issueId : issueForm.getRemoveIds()) { + //�궘�젣 �븷 �씠�뒋�쓽 �븯�쐞�씠�뒋 泥댄겕 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); + if(downIssues != null && downIssues.size() > 0){ + for(Issue downIssue : downIssues){ + downIssueId = downIssue.getId(); + } + } + Issue issue = this.issueRemoves(downIssueId, user); + removeIssues.add(issue); + } + // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� + log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); + } + private Issue issueRemoves(Long issueId, User user) { - Issue issue = this.getIssue(issueId); + Issue issue = null; + if(issueId != null){ + issue = this.getIssue(issueId); + } // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 this.verifyIssueModifyPermission(issue, user); @@ -2051,6 +2199,17 @@ this.attachedFileService.removeAttachedFiles(attachedFileIds); } + // 吏��슱 �씠�뒋媛� �뿰愿��씠�뒋�씤吏� 泥댄겕 �썑 �뿰愿��씠�뒋 �뀒�씠釉붿뿉�꽌�룄 �궘�젣�븳�떎. + List<IssueRelation> issueRelationList = this.issueRelationRepository.findByRelationIssueId(issueId); + if (issueRelationList != null && issueRelationList.size() > 0) { + for(IssueRelation issueRelation : issueRelationList){ + StringBuilder sb = new StringBuilder(); + issueHistoryService.detectRelationIssue(IssueHistoryType.DELETE, issueRelation, sb); + issueHistoryService.addIssueHistory(issueRelation.getIssue(), IssueHistoryType.MODIFY, sb.toString()); + this.issueRelationRepository.delete(issueRelation); + } + } + // �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎. this.reservationIssueEmail(issue, EmailType.ISSUE_REMOVE); // �씠�뒋 �궘�젣 -- Gitblit v1.8.0