From da08346c769258b6102cb4fe5348dc164ea2f3f7 Mon Sep 17 00:00:00 2001
From: jhjang <jhjang@maprex.co.kr>
Date: 일, 12 12월 2021 17:40:31 +0900
Subject: [PATCH] - 연관 이슈 추가 안되는 오류 수정 - 연관 이슈 추가 후 목록 안뜨는 문제 수정 - 이슈 목록 트리 구조 보기 기능 추가

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  452 ++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 295 insertions(+), 157 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 cc34278..7f68b4e 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -1,13 +1,10 @@
 package kr.wisestone.owl.service.impl;
 
 import com.google.common.collect.Lists;
-import com.sun.org.apache.bcel.internal.generic.NEW;
 import kr.wisestone.owl.common.ExcelConditionCheck;
+import kr.wisestone.owl.common.IssueCustomFieldValueFormComparator;
 import kr.wisestone.owl.config.CommonConfiguration;
-import kr.wisestone.owl.constant.Constants;
-import kr.wisestone.owl.constant.ElasticSearchConstants;
-import kr.wisestone.owl.constant.MsgConstants;
-import kr.wisestone.owl.constant.UsePartner;
+import kr.wisestone.owl.constant.*;
 import kr.wisestone.owl.data.CheckIssueData;
 import kr.wisestone.owl.domain.*;
 import kr.wisestone.owl.domain.enumType.CustomFieldType;
@@ -58,6 +55,9 @@
 
     @Autowired
     private ProjectService projectService;
+
+    @Autowired
+    private IssueTableConfigService issueTableConfigService;
 
     @Autowired
     private IssueStatusService issueStatusService;
@@ -150,6 +150,9 @@
     private UserWorkspaceService userWorkspaceService;
 
     @Autowired
+    private UserLevelService userLevelService;
+
+    @Autowired
     private WorkflowDepartmentService workflowDepartmentService;
 
     @Autowired
@@ -207,23 +210,16 @@
 
         Workflow workflow = issueType.getWorkflow();
 
-        // �씠�뒋 �긽�깭媛� 吏��젙�릺�뼱 �엳吏� �븡�쓣 寃쎌슦 珥덇린媛믪쑝濡� 吏��젙
-        if (issueApiForm.getIssueStatusId() == null) {
-            List<IssueStatusVo> issueStatusVos = issueStatusService.findByWorkflowId(workflow.getId());
-            IssueStatusVo issueStatusVo = issueStatusVos.get(0);
-            issueApiForm.setIssueStatusId(issueStatusVo.getId());
-        }
-
-        // �썙�겕�뵆濡쒖슦 �긽�깭�뿉 �뵲瑜� �떞�떦遺��꽌 媛��졇�삤湲�
-        if (issueApiForm.getIssueStatusId() != null) {
-            WorkflowDepartmentCondition workflowDepartmentCondition = new WorkflowDepartmentCondition();
-            workflowDepartmentCondition.setIssueStatusId(issueApiForm.getIssueStatusId());
-            workflowDepartmentCondition.setWorkflowId(workflow.getId());
-            List<WorkflowDepartmentVo> workflowDepartmentVos = this.workflowDepartmentService.find(workflowDepartmentCondition);
-
-            for (WorkflowDepartmentVo workflowDepartmentVo : workflowDepartmentVos) {
-                issueForm.addDepartmentId(workflowDepartmentVo.getDepartmentVo().getId());
+        if (issueApiForm.getApiType().equals(IssueApiForm.ApiType.add)) {
+            // �씠�뒋 �긽�깭媛� 吏��젙�릺�뼱 �엳吏� �븡�쓣 寃쎌슦 �썙�겕�뵆濡쒖슦 ��湲� �긽�깭 媛믪쑝濡� 吏��젙
+            List<Long> departmentIds = this.workflowDepartmentService.findFirstDepartmentIds(workflow);
+            if (departmentIds != null && departmentIds.size() > 0) {
+                for (Long departmentId : departmentIds) {
+                    issueForm.addDepartmentId(departmentId);
+                }
             }
+        } else if (issueApiForm.getIssueStatusId() == null){
+            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_ISSUE_STATUS_NOT_EXIST));
         }
 
         // �봽濡쒖젥�듃 �엯�젰
@@ -253,18 +249,24 @@
 
             // �긽�쐞�씪媛먯뿉 �궗�슜�븷 以묐났媛� �꽕�젙
             List<CustomFieldApiOverlap> customFieldApiOverlaps = this.customFieldApiOverlapService.find(user.getId(), issueApiForm.getIssueTypeId());
+            if (customFieldApiOverlaps == null || customFieldApiOverlaps.size() == 0){
+                throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_OVERLAP_SETTING_NOT_EXIST));
+            }
             for(int i=0; i < customFieldApiOverlaps.size() ; i++ ){
                 CustomFieldApiOverlap customFieldApiOverlap = customFieldApiOverlaps.get(i);
                 issueApiForm.addUseIssueCustomFieldId(customFieldApiOverlap.getCustomField().getId());
             }
 
-            List<IssueVo> issueVos = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
-            int size = issueVos.size();
-            if (size == 1) {
-                issueForm.setParentIssueId(issueVos.get(0).getId());
-            } else if (size > 1) {
-                throw new OwlRuntimeException(
-                        this.messageAccessor.getMessage(MsgConstants.API_OVERLAP_ERROR));
+            // 以묐났�맂 �씠�뒋寃��깋
+            List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
+            int size = issues.size();
+            if (size > 0) {
+                Issue targetIssue = issues.get(0);
+                if (targetIssue.getParentIssue() != null) {
+                    issueForm.setParentIssueId(targetIssue.getParentIssue().getId());
+                } else {
+                    issueForm.setParentIssueId(targetIssue.getId());
+                }
             }
 
             issueForm.setIsApi(Issue.IS_API_YES);
@@ -325,39 +327,37 @@
     }
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private List<IssueVo> findIssue(IssueApiForm issueApiForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+    private List<Issue> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
+        List<Issue> resultIssueVos = Lists.newArrayList();
+        String comma = ",";
 
-        List<IssueVo> resultIssueVos = new ArrayList<>();
+        if (issueCustomFieldValueForms.size() > 0) {
+            String concatUseValue = "";
+            int useIdx = 0;
 
-        if (customFieldApiOverlaps != null && customFieldApiOverlaps.size() > 0) {
-            for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
-                for (IssueCustomFieldValueForm issueCustomFieldValue : issueApiForm.getIssueCustomFieldValues()) {
-                    IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
-                    issueCustomFieldValueCondition.setUseParentIssueId(true);
-                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValue.getCustomFieldId())) {
-                        issueCustomFieldValueCondition.setUseValue(issueCustomFieldValue.getUseValue());
+            IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
+            Collections.sort(issueCustomFieldValueForms, comp);
 
-                        List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
-                        if (results != null && results.size() > 0) {
-                            List<IssueVo> findIssueVos = new ArrayList<>();
-                            Collections.copy(resultIssueVos, findIssueVos);
-                            resultIssueVos.clear();
-                            for (Map<String, Object> result : results) {
-                                IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
-                                if (findIssueVos.size() == 0) {
-                                    resultIssueVos.add(issueVo);
-                                } else {
-                                    IssueVo findIssueVo = findIssueVo(findIssueVos, issueVo.getId());
-                                    if (findIssueVo != null) {
-                                        resultIssueVos.add(findIssueVo);
-                                    }
-                                }
-                            }
-                        } else {
-                            resultIssueVos.clear();
-                            return resultIssueVos;
+            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
+                for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
+                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
+                        if (useIdx > 0) {
+                            concatUseValue = concatUseValue.concat(comma);
                         }
+                        concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
+                        useIdx++;
                     }
+                }
+            }
+
+            IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
+            issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
+            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
+            if (results != null && results.size() > 0) {
+                for (Map<String, Object> result : results) {
+                    resultIssueVos.add(this.getIssue(MapUtil.getLong(result, "id")));
                 }
             }
         }
@@ -747,10 +747,13 @@
         issueCondition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());
         User user = this.webAppUtil.getLoginUserObject();
 
+
         List<Map<String, Object>> results = Lists.newArrayList();
         Long totalCount = 0L;
+        UserLevel userLevel = this.userLevelService.getUserLevel(user.getUserLevel().getId());
 
-        if (this.userWorkspaceService.checkWorkspaceManager(user)) {
+        if (this.userWorkspaceService.checkWorkspaceManager(user)
+                || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE_PROJECT_ALL)) {
             results = this.issueMapper.find(issueCondition);
             totalCount = this.issueMapper.count(issueCondition);
         } else{
@@ -770,11 +773,19 @@
 
         int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1;
         //  �씠�뒋 �븘�씠�뵒 珥덇린�솕
+
+        issueCondition.setIsApi(issueCondition.getIsApi());
+
         issueCondition.setIssueIds(Lists.newArrayList());
         //  Map �뿉 �엳�뒗 �뜲�씠�꽣瑜� IssueVo �뜲�씠�꽣濡� 蹂��솚�븳�떎.
         this.setMapToIssueVo(results, issueVos, issueCondition, user);
 
-        this.setCountDownIssues(results, issueVos);
+        if (issueCondition.getTree()) {
+            this.setDownIssues(user, issueVos);
+            this.setRelationIssues(issueVos);
+        }
+        this.setCountDownIssues(issueVos);
+
         this.SetWorkflowDepartment(issueVos); //�썙�겕�뵆濡쒖슦�뿉 �꽕�젙�븳 �떞�떦遺��꽌 媛��졇�삤湲�
 
         resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
@@ -786,11 +797,54 @@
         return issueVos;
     }
 
+
+    // �븯�쐞 �씠�뒋 �꽭�똿(�옱洹�)
+    private void setDownIssues(User user, List<IssueVo> issueVos) {
+        for(IssueVo issueVo : issueVos) {
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueVo.getId());
+            List<IssueVo> downIssueVos = Lists.newArrayList();
+            IssueCondition issueCondition = new IssueCondition();
+            issueCondition.addIssueIds(String.valueOf(issueVo.getId()));
+
+            for(Issue downIssue : downIssues){
+                IssueVo addIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
+                addIssueVo.setIssueTypeId(downIssue.getIssueType().getId());
+                downIssueVos.add(addIssueVo);
+
+            }
+            issueVo.setIssueDownVos(downIssueVos);
+            if (downIssueVos.size() > 0) {
+                this.setDownIssues(user, downIssueVos);
+            }
+
+            //  �씠�뒋 �궗�슜�옄 �젙蹂� 異붽�
+            //this.setIssueUserList(issueVos, issueCondition);
+            this.setIssueDepartmentList(issueVos, issueCondition, user);
+            //  �벑濡앹옄 �젙蹂� 異붽�
+            this.setRegister(issueVos);  //  �떞�떦�옄 �젙蹂� �뀑�똿
+
+            //  �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂� 異붽�
+            this.setIssueCustomFieldValue(issueVos, issueCondition);
+
+            this.SetWorkflowDepartment(issueVos); //�썙�겕�뵆濡쒖슦�뿉 �꽕�젙�븳 �떞�떦遺��꽌 媛��졇�삤湲�
+        }
+    }
+
+    // �뿰愿� �씠�뒋 �꽭�똿
+    private void setRelationIssues(List<IssueVo> issueVos) {
+        for(IssueVo issueVo : issueVos) {
+            List<IssueVo> relationIssues = this.issueRelationService.findRelationIssue(issueVo.getId());
+            for(IssueVo relationIssue : relationIssues){
+                issueVo.addRelationIssueVo(ConvertUtil.copyProperties(relationIssue, IssueVo.class));
+            }
+        }
+    }
+
     @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")); //�븯�쐞�씠�뒋 媛��졇�삤湲�
+    public void setCountDownIssues(List<IssueVo> issueVos) {
+        for (IssueVo issueVo : issueVos){
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueVo.getId()); //�븯�쐞�씠�뒋 媛��졇�삤湲�
             if(downIssues != null && downIssues.size() > 0){ //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫�
                 int downIssueAllCount = 0;// �븯�쐞�씠�뒋 �쟾泥� 移댁슫�듃
                 int downIssueCount = 0;// �븯�쐞�씠�뒋 誘몄셿猷� 移댁슫�듃
@@ -809,12 +863,8 @@
                         downIssueCount ++;
                     }
 
-                    for(IssueVo issueVo : issueVos){
-                        if(issueVo.getId().equals(parentIssueVo.getId())){
-                            issueVo.setDownIssueCount(downIssueCount);
-                            issueVo.setDownIssueAllCount(parentIssueVo.getDownIssueAllCount());
-                        }
-                    }
+                    issueVo.setDownIssueCount(downIssueCount);
+                    issueVo.setDownIssueAllCount(parentIssueVo.getDownIssueAllCount());
                 }
             }
         }
@@ -1226,6 +1276,7 @@
 
                 case "02": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎.
                     this.setIssueDetail(issueVo, issue);    //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
+                    this.setIssueTableConfigs(issue, issueVo);
                     issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class));
                     break;
             }
@@ -1237,29 +1288,49 @@
         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) {
         List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
-            if(downIssues != null && downIssues.size()>0){
-                List<IssueVo> resultList = new ArrayList<>();
-                for(Issue downIssue : downIssues){
-                    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);
+        if(downIssues != null && downIssues.size()>0){
+            List<IssueVo> resultList = new ArrayList<>();
+            for(Issue downIssue : downIssues){
+                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);
 
-                    this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
-                    this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
-                    this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
+                this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
+                this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
+                this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
 
-                    resultList.add(downIssueVo);
-                }
-                issueVo.setIssueDownVos(resultList);
+                resultList.add(downIssueVo);
             }
+            issueVo.setIssueDownVos(resultList);
+        }
     }
 
     //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
@@ -1456,45 +1527,29 @@
     // �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 媛숈� �씠�뒋 李얘린
     @Override
     @Transactional
-    public List<IssueVo> findIssue(IssueApiForm issueApiform) {
+    public List<Issue> findIssue(IssueApiForm issueApiform) {
 
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
-        List<IssueVo> resultIssueVos = new ArrayList<>();
+        List<Issue> resultIssueVos = Lists.newArrayList();
+        String comma = ",";
 
-        IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
-        issueCustomFieldValueCondition.setUseParentIssueId(false);
         if (issueCustomFieldValueForms.size() > 0) {
-            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
-
-                CustomField customField = this.customFieldService.getCustomField(issueCustomFieldValueForm.getCustomFieldId());
-                CustomFieldType customFieldType = CustomFieldType.DATETIME;
-                if (customFieldType.equals(customField.getCustomFieldType())) {
-                    continue;
+            String concatUseValue = "";
+            for (int i = 0; i < issueCustomFieldValueForms.size(); i++) {
+                IssueCustomFieldValueForm issueCustomFieldValueForm = issueCustomFieldValueForms.get(i);
+                if (i > 0) {
+                    concatUseValue = concatUseValue.concat(comma);
                 }
-//                issueCustomFieldValueCondition.addUseValue(issueCustomFieldValueForm.getUseValue());
-                issueCustomFieldValueCondition.setUseValue(issueCustomFieldValueForm.getUseValue());
-                List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
-                if (results != null && results.size() > 0) {
-                    List<IssueVo> findIssueVos = new ArrayList<>();
-                    Collections.copy(resultIssueVos, findIssueVos);
-                    resultIssueVos.clear();
-                    for (Map<String, Object> result : results) {
-                        IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
+                concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
+            }
 
-                        issueVo.setParentIssueVo(this.getParentIssueVo(MapUtil.getLong(result, "parentIssueId")));
-
-                        if (findIssueVos.size() == 0) {
-                            resultIssueVos.add(issueVo);
-                        } else {
-                            IssueVo findIssueVo = findIssueVo(findIssueVos, issueVo.getId());
-                            if (findIssueVo != null) {
-                                resultIssueVos.add(findIssueVo);
-                            }
-                        }
-                    }
-                } else {
-                    resultIssueVos.clear();
-                    return resultIssueVos;
+            IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
+            issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
+            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
+            if (results != null && results.size() > 0) {
+                for (Map<String, Object> result : results) {
+                    resultIssueVos.add(this.getIssue(MapUtil.getLong(result, "id")));
                 }
             }
         }
@@ -1520,20 +1575,34 @@
         User user = this.convertToUser(issueApiForm.getToken());
         IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
 
+        List<Issue> issue = this.findIssue(issueApiForm);
+        if (issue != null && issue.size() > 0) {
+            List<Issue> issues = Lists.newArrayList();
+            for (Issue issueVo : issue) {
+                issueForm.setId(issueVo.getId());
 
-        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());
+                // �옄�룞 醫낅즺 �긽�깭 �꽕�젙�씠 �릺�뼱 �엳吏� �븡�쑝硫� �삤瑜섎컻�깮
+                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) {
+                    IssueCondition issueCondition = new IssueCondition(issueVo.getId(), parentIssue.getId());
+                    List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(issueCondition);
+                    // �븯�쐞 �씪媛먯씠 紐⑤몢 醫낅즺 �긽�깭�씪�븣 �긽�쐞 �씪媛먮룄 醫낅즺 泥섎━
+                    if (results == null || results.size() == 0) {
+                        parentIssue.setIssueStatus(issueType.getIssueStatus());
+                        this.issueRepository.saveAndFlush(parentIssue);
+                    }
+                }
+
+                issues.add(modifyIssue);
             }
-            return issue;
+            return issues;
         } else {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.API_ISSUE_NOT_EXIST));
@@ -1614,6 +1683,7 @@
             this.issueHistoryService.detectIssueStatus(issue, issueForm, detectIssueChange, oldIssueStatus, issueStatus);
         }
 
+        // db�뿉 ���옣
         issue = this.saveIssue(issueForm, checkIssueData);
 
         //  �씠�뒋 �씠�젰 �벑濡�
@@ -1854,6 +1924,9 @@
         //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ASSIGNEE, issueVo, issueUserVos);
         //  �떞�떦�옄媛� �뾾�쑝硫� 紐⑤뱺 �궗�슜�옄媛� �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎.
 
+        //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_ISSUE_MANAGER, issueVo, null, null, user);
+        //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_PROJECT_MANAGER, issueVo, null, null, user);
+
         return hasPermission;
     }
 
@@ -2050,20 +2123,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);
 
@@ -3124,45 +3272,36 @@
     //  �씠�뒋瑜� �뀥�뵆由우뿉 �뵲�씪 �뙆�듃�꼫 �떞�떦�옄�뿉寃� 硫붿씪濡� 諛쒖넚�븳�떎.
     @Override
     @Transactional(readOnly = true)
-    public void sendIssueEmailPartners(IssueForm issueForm) {
-        if (issueForm.getSendEmails().size() < 1) {
+    public void sendIssueEmailPartners(EmailTemplateForm emailTemplateForm) {
+        if (emailTemplateForm.getSendEmails().size() < 1) {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER));
-        }else if (issueForm.getTemplate() == null){
+        }else if (emailTemplateForm.getTemplate() == null){
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SELECT_TEMPLATE));
+        } else if (emailTemplateForm.getIssueId() == null) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_EXIST));
         }
 
-        Issue issue = this.getIssue(issueForm.getId());
+        Issue issue = this.getIssue(emailTemplateForm.getIssueId());
 
-        Map<String, Object> issueMap = new HashMap<>();
-        //  �씠�뒋 �젙蹂대�� �씠硫붿씪 �쟾�넚�뿉 �궗�슜�븯湲� �쐞�빐 Map �삎�깭濡� 蹂��솚�븳�떎.
-        this.makeIssueMapToIssue(issue, issueMap);
         //  諛쒖떊�옄 �몴�떆
+        User user = this.webAppUtil.getLoginUserObject();
         UserVo toUser = this.webAppUtil.getLoginUser();
-        issueMap.put("toUser", toUser.getName() + "(" + CommonUtil.decryptAES128(toUser.getAccount()) + ")");
-
-        // �씠�뒋 留곹겕
-        String projectKey = issue.getProject().getProjectKey();
-        Long IssueNumber = issue.getIssueNumber();
-        String link = this.configuration.getEmailSendUrl() + "/#/issues/issueList?projectKey=" + projectKey + "&issueNumber=" + IssueNumber.toString();
-
-        issueMap.put("issueLink", link);
-        issueMap.put("projectLink", link);
 
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_ANOTHER_USER_SEND_EMAIL));
         StringBuilder sb = new StringBuilder();
 
-        if(issueForm.getTemplate().equals(EmailType.ISSUE_SEND_1.toString())){
-            this.systemEmailService.directEmail(ConvertUtil.ToArray(issueForm.getSendEmails()), EmailType.ISSUE_SEND_1, issueMap, null);
-        }else if(issueForm.getTemplate().equals(EmailType.ISSUE_SEND_2.toString())){
-            this.systemEmailService.directEmail(ConvertUtil.ToArray(issueForm.getSendEmails()), EmailType.ISSUE_SEND_2, issueMap, null);
-        }else if(issueForm.getTemplate().equals(EmailType.ISSUE_SEND_3.toString())){
-            this.systemEmailService.directEmail(ConvertUtil.ToArray(issueForm.getSendEmails()), EmailType.ISSUE_SEND_3, issueMap, null);
+        Locale locale = CommonUtil.getUserLanguage(user.getLanguage());
+        String[] sendMails = ConvertUtil.ToArray(emailTemplateForm.getSendEmails());
+        for(int i=0; i < sendMails.length; i++) {
+            sendMails[i] = CommonUtil.decryptAES128(sendMails[i]);
         }
-        //硫붿씪 �쟾�넚 �씠�젰 �궓湲곌린
-        this.issueHistoryService.detectSendIssueMail(IssueHistoryType.SEND, issueForm, sb);
+        this.systemEmailService.sendEmail(emailTemplateForm.getTitle(), emailTemplateForm.getTemplate(), sendMails, null);
+
+        this.issueHistoryService.detectSendIssueMail(IssueHistoryType.SEND, emailTemplateForm.getSendEmails(), sb);
         this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.SEND, sb.toString());
     }
 
@@ -3356,7 +3495,6 @@
         }
         this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(湲곕줉�� �쁽�옱 �긽�꽭�럹�씠吏��뿉 �빐�빞�븯�땲源�)
         this.issueRepository.saveAndFlush(issue);
-
     }
 
     @Override

--
Gitblit v1.8.0