From c317ab1a948b95337bfbc730fdef9d7edde67eec Mon Sep 17 00:00:00 2001
From: jhjang <jhjang@maprex.co.kr>
Date: 목, 09 12월 2021 14:23:05 +0900
Subject: [PATCH] - API 입력 및 수정시 오류 수정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  180 ++++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 120 insertions(+), 60 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 7c58174..f0022e5 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -3,6 +3,7 @@
 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;
@@ -17,6 +18,7 @@
 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;
@@ -57,6 +59,9 @@
 
     @Autowired
     private ProjectService projectService;
+
+    @Autowired
+    private IssueTableConfigService issueTableConfigService;
 
     @Autowired
     private IssueStatusService issueStatusService;
@@ -155,6 +160,9 @@
     private IssueRelationService issueRelationService;
 
     @Autowired
+    private IssueRelationRepository issueRelationRepository;
+
+    @Autowired
     private ExcelView excelView;
 
     @Autowired
@@ -242,7 +250,7 @@
                 issueForm.setSeverityId(issueApiDefault.getSeverity().getId());
             }
 
-            // 以묐났 媛� �븯�쐞 �씠�뒋濡� 泥섎━�븯湲�
+            // 以묐났 媛� �긽�쐞 �씠�뒋�쓽 �븯�쐞 �씠�뒋濡� 泥섎━�븯湲�
             CustomFieldApiOverlapForm customFieldApiOverlapForm = new CustomFieldApiOverlapForm();
             customFieldApiOverlapForm.setUserId(user.getId());
             customFieldApiOverlapForm.setIssueTypeId(issueForm.getIssueTypeId());
@@ -256,11 +264,8 @@
 
             List<IssueVo> issueVos = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
             int size = issueVos.size();
-            if (size == 1) {
+            if (size > 0) {
                 issueForm.setParentIssueId(issueVos.get(0).getId());
-            } else if (size > 1) {
-                throw new OwlRuntimeException(
-                        this.messageAccessor.getMessage(MsgConstants.API_OVERLAP_ERROR));
             }
 
             issueForm.setIsApi(Issue.IS_API_YES);
@@ -311,38 +316,46 @@
         return issues;
     }
 
+    // �긽�쐞 �씠�뒋 媛��졇�삤湲�
+    private IssueVo getParentIssueVo(Long parentIssueId) {
+        if (parentIssueId != null) {
+            Issue parentIssue = this.getIssue(parentIssueId);
+            return ConvertUtil.copyProperties(parentIssue, IssueVo.class);
+        }
+        return null;
+    }
+
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private List<IssueVo> findIssue(IssueApiForm issueApiForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+    private List<IssueVo> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
+        List<IssueVo> resultIssueVos = Lists.newArrayList();
+        String comma = ",";
 
-        List<IssueVo> resultIssueVos = new ArrayList<>();
-        if (customFieldApiOverlaps != null && customFieldApiOverlaps.size() > 0) {
-            for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
-                for (IssueCustomFieldValueForm issueCustomFieldValue : issueApiForm.getIssueCustomFieldValues()) {
-                    IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
-                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValue.getCustomFieldId())) {
-                        issueCustomFieldValueCondition.setUseValue(issueCustomFieldValue.getUseValue());
+        if (issueCustomFieldValueForms.size() > 0) {
+            String concatUseValue = "";
+            int useIdx = 0;
 
-                        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;
+            IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
+            Collections.sort(issueCustomFieldValueForms, comp);
+
+            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);
+            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
+            if (results != null && results.size() > 0) {
+                for (Map<String, Object> result : results) {
+                    resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class));
                 }
             }
         }
@@ -377,7 +390,7 @@
         //  �궇吏� �쑀�슚�꽦 泥댄겕
         this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate());
         //  �떞�떦 遺��꽌 �쑀�슚�꽦 泥댄겕
-        this.verifyIssueDepartment(project, issueForm);
+        //this.verifyIssueDepartment(project, issueForm);
 
         //  �씠�뒋 �긽�깭 �쑀�삎�씠 '��湲�' �씤 �씠�뒋 �긽�깭 媛��졇�삤湲�
         IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(issueType.getWorkflow());
@@ -463,7 +476,7 @@
         //  �궇吏� �쑀�슚�꽦 泥댄겕
         this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate());
         //  �떞�떦 遺��꽌 �쑀�슚�꽦 泥댄겕
-        this.verifyIssueDepartment(project, issueForm);
+        //this.verifyIssueDepartment(project, issueForm);
 
         //  �씠�뒋 �긽�깭 �쑀�삎�씠 '��湲�' �씤 �씠�뒋 �긽�깭 媛��졇�삤湲�
         IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(issueType.getWorkflow());
@@ -1211,6 +1224,7 @@
 
                 case "02": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎.
                     this.setIssueDetail(issueVo, issue);    //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
+                    this.setIssueTableConfigs(issue, issueVo);
                     issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class));
                     break;
             }
@@ -1221,6 +1235,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) {
@@ -1442,34 +1476,27 @@
     @Override
     @Transactional
     public List<IssueVo> findIssue(IssueApiForm issueApiform) {
+
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
-        List<IssueVo> resultIssueVos = new ArrayList<>();
+        List<IssueVo> resultIssueVos = Lists.newArrayList();
+        String comma = ",";
 
-        IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
         if (issueCustomFieldValueForms.size() > 0) {
-            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
-//                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);
+            String concatUseValue = "";
+            for (int i = 0; i < issueCustomFieldValueForms.size(); i++) {
+                IssueCustomFieldValueForm issueCustomFieldValueForm = issueCustomFieldValueForms.get(i);
+                if (i > 0) {
+                    concatUseValue = concatUseValue.concat(comma);
+                }
+                concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
+            }
 
-                        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);
+            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
+            if (results != null && results.size() > 0) {
+                for (Map<String, Object> result : results) {
+                    resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class));
                 }
             }
         }
@@ -1499,8 +1526,29 @@
         if (issueVos != null && issueVos.size() > 0) {
             List<Issue> issue = Lists.newArrayList();
             for (IssueVo issueVo : issueVos) {
+                IssueVo parentIssueVo = issueVo.getParentIssueVo();
                 issueForm.setId(issueVo.getId());
-                issue.add(this.modifyIssueForApi(user, issueForm, files));
+
+                // �옄�룞 醫낅즺 �긽�깭 �꽕�젙�씠 �릺�뼱 �엳吏� �븡�쑝硫� �삤瑜섎컻�깮
+                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));
+                }
+
+                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);
+                    }
+                }
+
+                issue.add(modifyIssue);
             }
             return issue;
         } else {
@@ -1545,7 +1593,7 @@
         //  �떞�떦�옄 �쑀�슚�꽦 泥댄겕
         //this.verifyIssueAssignee(project, issueForm);
         //  �떞�떦遺��꽌 �쑀�슚�꽦 泥댄겕
-        this.verifyIssueDepartment(project, issueForm);
+        //this.verifyIssueDepartment(project, issueForm);
 
         CheckIssueData checkIssueData = new CheckIssueData();
         checkIssueData.setIssue(issue);
@@ -1583,6 +1631,7 @@
             this.issueHistoryService.detectIssueStatus(issue, issueForm, detectIssueChange, oldIssueStatus, issueStatus);
         }
 
+        // db�뿉 ���옣
         issue = this.saveIssue(issueForm, checkIssueData);
 
         //  �씠�뒋 �씠�젰 �벑濡�
@@ -2047,6 +2096,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