From 123374115c47cf25489e1ab3e1faa7ae79b7f493 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 화, 07 12월 2021 11:02:04 +0900
Subject: [PATCH] 미완료 하위이슈 / 전체 하위이슈 수정 완료

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  168 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 152 insertions(+), 16 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 8383256..72e5bc6 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -18,6 +18,7 @@
 import kr.wisestone.owl.mapper.IssueMapper;
 import kr.wisestone.owl.mapper.ProjectMapper;
 import kr.wisestone.owl.repository.IssueRepository;
+import kr.wisestone.owl.repository.UserDepartmentRepository;
 import kr.wisestone.owl.service.*;
 import kr.wisestone.owl.util.*;
 import kr.wisestone.owl.util.DateUtil;
@@ -163,6 +164,9 @@
 
     @Autowired
     private SimpMessagingTemplate simpMessagingTemplate;
+
+    @Autowired
+    private UserDepartmentRepository userDepartmentRepository;
 
     @Override
     protected JpaRepository<Issue, Long> getRepository() {
@@ -411,6 +415,91 @@
         return issue;
     }
 
+    //  �뿰愿��씠�뒋瑜� �깮�꽦�븳�떎.
+    @Override
+    @Transactional
+    public Issue addRelIssue(IssueForm issueForm, List<MultipartFile> multipartFiles) {
+        User user = this.webAppUtil.getLoginUserObject();
+        return addRelIssue(user, issueForm, multipartFiles);
+    }
+
+    //  �뿰愿��씠�뒋瑜� �깮�꽦�븳�떎.
+    @Override
+    @Transactional
+    public Issue addRelIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
+        //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
+        Workspace workspace = this.workspaceService.checkUseWorkspace(user, user.getLastWorkspaceId());
+        //  �봽濡쒖젥�듃 �쑀�슚�꽦 泥댄겕
+        Project project = this.projectService.getProject(issueForm.getProjectId());
+        //  �씠�뒋 �쑀�삎 �쑀�슚�꽦 泥댄겕
+        IssueType issueType = this.issueTypeService.getIssueType(issueForm.getIssueTypeId());
+        //  �슦�꽑�닚�쐞 �쑀�슚�꽦 泥댄겕
+        Priority priority = this.priorityService.getPriority(issueForm.getPriorityId());
+        //  以묒슂�룄 �쑀�슚�꽦 泥댄겕
+        Severity severity = this.severityService.getSeverity(issueForm.getSeverityId());
+
+        //  �젣紐� �쑀�슚�꽦 泥댄겕
+        this.verifyTitle(issueForm.getTitle());
+        //  �궇吏� �쑀�슚�꽦 泥댄겕
+        this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate());
+        //  �떞�떦 遺��꽌 �쑀�슚�꽦 泥댄겕
+        this.verifyIssueDepartment(project, issueForm);
+
+        //  �씠�뒋 �긽�깭 �쑀�삎�씠 '��湲�' �씤 �씠�뒋 �긽�깭 媛��졇�삤湲�
+        IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(issueType.getWorkflow());
+
+        Issue issue = ConvertUtil.copyProperties(issueForm, Issue.class);
+        issue.setProject(project);
+        issue.setIssueStatus(issueStatus);
+        issue.setIssueType(issueType);
+        issue.setPriority(priority);
+        issue.setSeverity(severity);
+        if (issueForm.getParentIssueId() != null){
+            Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
+            issue.setParentIssue(parentIssue);
+        }
+
+        issue.setIssueNumber(this.issueNumberGeneratorService.generateIssueNumber(project));    //  媛� �봽濡쒖젥�듃�쓽 怨좎쑀 �씠�뒋 踰덊샇 �깮�꽦
+
+        issue = this.issueRepository.saveAndFlush(issue);
+
+        issue.setReverseIndex(issue.getId() * -1);  //  荑쇰━ �냽�룄 媛쒖꽑�쓣 �쐞�빐 由щ쾭�뒪 �씤�뜳�뒪 �깮�꽦
+        //  �떞�떦�옄 吏��젙
+        //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds());
+        //  �떞�떦遺��꽌 吏��젙
+        this.issueDepartmentService.modifyIssueDepartment(issue, user, project.getWorkspace(), issueForm.getDepartmentIds());
+        //  �뾽泥� �젙蹂� ���옣
+        this.issueCompanyService.modifyIssueCompanyField(issue, issueForm.getIssueCompanyFields());
+        //  ISP �젙蹂� ���옣
+        this.issueIspService.modifyIssueIspField(issue, issueForm.getIssueIspFields());
+        //  HOSTING �젙蹂� ���옣
+        this.issueHostingService.modifyIssueHostingField(issue, issueForm.getIssueHostingFields());
+
+        //  泥⑤� �뙆�씪 ���옣
+        //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
+        List<Map<String, Object>> convertFileMaps = this.convertMultipartFileToFile(multipartFiles);
+        this.attachedFileService.addAttachedFile(convertFileMaps, issue, user.getAccount());
+
+        //  �뀓�뒪�듃 �뿉�뵒�꽣�뿉 泥⑤��븳 �뙆�씪�쓣 �씠�뒋�� �뿰寃�
+        this.checkNotHaveIssueIdAttachedFile(issue, issueForm);
+        //  �궗�슜�옄 �젙�쓽 �븘�뱶 ���옣
+        this.issueCustomFieldValueService.modifyIssueCustomFieldValue(issue, issueForm.getIssueCustomFields());
+        //  �씠�뒋 �씠�젰 �깮�꽦
+        this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.ADD, null);
+        //  �씠�뒋 �쐞�뿕 愿�由� �깮�꽦
+        this.issueRiskService.addIssueRisk(issue, project.getWorkspace());
+        //  �쁺�냽�꽦 而⑦뀓�뒪�듃 鍮꾩슦湲�
+        this.clear();
+        //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
+        this.reservationIssueEmail(issue, EmailType.ISSUE_ADD);
+        //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
+
+        UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class);
+        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(userVo, ElasticSearchConstants.ISSUE_ADD));
+
+        return issue;
+    }
+
     //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
     private void reservationIssueEmail(Issue issue, EmailType emailType) {
         Map<String, Object> issueMap = new HashMap<>();
@@ -559,6 +648,19 @@
         }
     }
 
+    void SetMyDepartmentId(IssueCondition issueCondition){
+        Long loginId = issueCondition.getLoginUserId();
+        List<Long> myDepartmentIds = Lists.newArrayList();
+        List<UserDepartment> myDepartments = this.userDepartmentRepository.findByUserId(loginId);
+
+        if(myDepartments != null && myDepartments.size() > 0){
+            for(UserDepartment myDepartment : myDepartments){
+                myDepartmentIds.add(myDepartment.getDepartmentId());
+            }
+        }
+        issueCondition.setMyDepartmentIds(myDepartmentIds);
+    }
+
     //  �씠�뒋 紐⑸줉�쓣 議고쉶�븳�떎.
     @Override
     @Transactional(readOnly = true)
@@ -589,12 +691,25 @@
         List<String> issueKeys = Lists.newArrayList(issueIds);
         issueCondition.setIssueIds(issueKeys);
 
-        List<Map<String, Object>> results = this.issueMapper.find(issueCondition);
+        issueCondition.setLoginUserId(this.webAppUtil.getLoginId());
+        issueCondition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());
+        User user = this.webAppUtil.getLoginUserObject();
+
+        List<Map<String, Object>> results = Lists.newArrayList();
+        Long totalCount = 0L;
+
+        if (this.userWorkspaceService.checkWorkspaceManager(user)) {
+            results = this.issueMapper.find(issueCondition);
+            totalCount = this.issueMapper.count(issueCondition);
+        } else{
+            this.SetMyDepartmentId(issueCondition);
+            results = this.issueMapper.findByDepartment(issueCondition);
+            totalCount = this.issueMapper.countByDepartment(issueCondition);
+        }
 
         //  �뒠�떇 �쟾 - 0.8, 0.9, 0.9, 0.9, 0.9
         /*StopWatch serviceStart = new StopWatch();
         serviceStart.start();*/
-        Long totalCount = this.issueMapper.count(issueCondition);
         //  �뒠�떇 �쟾 - 1.1, 1.1, 1.3, 1.2
 
         /*serviceStart.stop();
@@ -604,7 +719,6 @@
         //  �씠�뒋 �븘�씠�뵒 珥덇린�솕
         issueCondition.setIssueIds(Lists.newArrayList());
         //  Map �뿉 �엳�뒗 �뜲�씠�꽣瑜� IssueVo �뜲�씠�꽣濡� 蹂��솚�븳�떎.
-        User user = this.webAppUtil.getLoginUserObject();
         this.setMapToIssueVo(results, issueVos, issueCondition, user);
 
         this.setCountDownIssues(results, issueVos);
@@ -618,21 +732,33 @@
         return issueVos;
     }
 
-    private void setCountDownIssues(List<Map<String, Object>> results, List<IssueVo> issueVos) {
+    @Override
+    @Transactional(readOnly = true)
+    public void setCountDownIssues(List<Map<String, Object>> results, List<IssueVo> issueVos) {
         for (Map<String, Object> result : results){
             List<Issue> downIssues = this.issueRepository.findByParentIssueId((Long) result.get("id")); //�븯�쐞�씠�뒋 媛��졇�삤湲�
             if(downIssues != null && downIssues.size() > 0){ //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫�
-                int downIssueCount = 0;
+                int downIssueAllCount = 0;// �븯�쐞�씠�뒋 �쟾泥� 移댁슫�듃
+                int downIssueCount = 0;// �븯�쐞�씠�뒋 誘몄셿猷� 移댁슫�듃
                 for(Issue downIssue : downIssues){
-                    downIssueCount ++;
+                    downIssueAllCount ++;
                     Long parentIssueId = downIssue.getParentIssue().getId();
                     Issue parentIssue = this.getIssue(parentIssueId);
                     IssueVo parentIssueVo = ConvertUtil.copyProperties(parentIssue, IssueVo.class);
-                    parentIssueVo.setDownIssueCount(downIssueCount);
+                    parentIssueVo.setDownIssueAllCount(downIssueAllCount);
+
+                    IssueStatus downIssueStatus = this.issueStatusService.getIssueStatus(downIssue.getIssueStatus().getId());
+                    IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
+                    downIssueVo.setIssueStatusType(downIssueStatus.getIssueStatusType().toString());
+
+                    if(!downIssueVo.getIssueStatusType().equals("CLOSE")){ //誘몄셿猷� �븯�쐞�씠�뒋 泥댄겕
+                        downIssueCount ++;
+                    }
 
                     for(IssueVo issueVo : issueVos){
                         if(issueVo.getId().equals(parentIssueVo.getId())){
-                            issueVo.setDownIssueCount(parentIssueVo.getDownIssueCount());
+                            issueVo.setDownIssueCount(downIssueCount);
+                            issueVo.setDownIssueAllCount(parentIssueVo.getDownIssueAllCount());
                         }
                     }
                 }
@@ -1063,15 +1189,20 @@
             if(downIssues != null && downIssues.size()>0){
                 List<IssueVo> resultList = new ArrayList<>();
                 for(Issue downIssue : downIssues){
-                    IssueVo newIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
-                    newIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
-                    newIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
-                    newIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
-                    this.setRegister(downIssue, newIssueVo); // �벑濡앹옄
-                    this.setIssueDepartment(downIssue, newIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
-                    this.setIssueCustomFields(downIssue, newIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
+                    IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
+                    downIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
+                    downIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
+                    downIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
+                    //�씠�뒋 �긽�깭 異붽�
+                    IssueStatusVo issueStatusVo = ConvertUtil.copyProperties(downIssue.getIssueStatus(), IssueStatusVo.class, "issueStatusType");
+                    issueStatusVo.setIssueStatusType(downIssue.getIssueStatus().getIssueStatusType().toString());
+                    downIssueVo.setIssueStatusVo(issueStatusVo);
 
-                    resultList.add(newIssueVo);
+                    this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
+                    this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
+                    this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
+
+                    resultList.add(downIssueVo);
                 }
                 issueVo.setIssueDownVos(resultList);
             }
@@ -1165,6 +1296,11 @@
                 issueRelationVo.setIssueTypeVo(ConvertUtil.copyProperties(relationIssue.getIssueType(), IssueTypeVo.class));
                 issueRelationVo.setPriorityVo(ConvertUtil.copyProperties(relationIssue.getPriority(), PriorityVo.class));
                 issueRelationVo.setSeverityVo(ConvertUtil.copyProperties(relationIssue.getSeverity(), SeverityVo.class));
+                //�씠�뒋 �긽�깭 異붽�
+                IssueStatusVo issueStatusVo = ConvertUtil.copyProperties(relationIssue.getIssueStatus(), IssueStatusVo.class, "issueStatusType");
+                issueStatusVo.setIssueStatusType(relationIssue.getIssueStatus().getIssueStatusType().toString());
+                issueRelationVo.setIssueStatusVo(issueStatusVo);
+
                 this.setRegister(relationIssue, relIssueVo); // �벑濡앹옄
                 this.setIssueDepartment(relationIssue, relIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
                 this.setIssueCustomFields(relationIssue, relIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿

--
Gitblit v1.8.0