From f90e288fdd0e4d4a58b72a445fcbac135351d458 Mon Sep 17 00:00:00 2001
From: jhjang <jhjang@maprex.co.kr>
Date: 월, 06 12월 2021 08:45:27 +0900
Subject: [PATCH] - API 중복 처리 오류 수정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java                |  154 ++++++++++++++++++++++++--------------
 src/main/java/kr/wisestone/owl/vo/IssueVo.java                                   |    4 +
 src/main/java/kr/wisestone/owl/data/CheckIssueData.java                          |   41 ++++++++++
 src/main/resources/mybatis/query-template/issue-template.xml                     |   16 +---
 src/main/webapp/scripts/app/issue/issueList.controller.js                        |    2 
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java                        |    4 +
 src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java |    4 
 7 files changed, 154 insertions(+), 71 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index 1a53df4..25d5230 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -177,6 +177,8 @@
     public static final String EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY = "EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY"; //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 �엯�젰�븳 �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 �쑀�슚�븯吏� �븡�뒿�땲�떎.
     public static final String EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST = "EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST";   //  �벑濡앺븯�젮�뒗 �궗�슜�옄 �젙�쓽 �븘�뱶瑜� 李얠쓣 �닔 �뾾�뒿�땲�떎. �빐�떦 �궗�슜�옄 �젙�쓽�븘�뱶�쓽 �씠由꾩씠 蹂�寃쎈릺�뿀嫄곕굹 �궘�젣�릺�뿀�뒿�땲�떎.
 
+    public static final String DOWN_ISSUE_NOT_EXIST = "DOWN_ISSUE_NOT_EXIST";   //  �븯�쐞 �씠�뒋 李얠쓣�닔 �뾾�쓬
+
     public static final String NOTICE_NOT_EXIST = "NOTICE_NOT_EXIST";   //  怨듭��궗�빆�씠 議댁옱�븯吏� �븡�뒿�땲�떎.
     public static final String NOTICE_EMPTY_CONTENT = "NOTICE_EMPTY_CONTENT";   //  怨듭��궗�빆 �젣紐� 諛� �궡�슜 以� �엯�젰 媛믪씠 �뾾�뒗 �븘�뱶媛� �엳�뒿�땲�떎.
 
@@ -235,4 +237,6 @@
     public static final String API_PARAMETER_PROJECT_ERROR = "API_PARAMETER_PROJECT_ERROR";     // api �뙆�씪誘명꽣 �삤瑜�(�봽濡쒖젥�듃)
     public static final String API_PARAMETER_ERROR = "API_PARAMETER_ERROR";     // api �뙆�씪誘명꽣 �삤瑜�
     public static final String API_USER_ERROR = "API_USER_ERROR";     // api �궗�슜�옄 �삤瑜�
+    public static final String API_OVERLAP_ERROR = "API_OVERLAP_ERROR";     // API 以묐났�맂 �긽�쐞 �씠�뒋媛� �뿬�윭媛쒖씪 寃쎌슦
+    public static final String API_ISSUE_NOT_EXIST = "API_ISSUE_NOT_EXIST";     // �닔�젙�븷 �씠�뒋瑜� 李얠쓣�닔 �뾾�뒿�땲�떎.
 }
diff --git a/src/main/java/kr/wisestone/owl/data/CheckIssueData.java b/src/main/java/kr/wisestone/owl/data/CheckIssueData.java
index 8933cf0..d4d60b5 100644
--- a/src/main/java/kr/wisestone/owl/data/CheckIssueData.java
+++ b/src/main/java/kr/wisestone/owl/data/CheckIssueData.java
@@ -18,8 +18,49 @@
     Priority priority;
     Severity severity;
 
+    @Autowired
+    private IssueService issueService;
+
+    @Autowired
+    private WorkspaceService workspaceService;
+
+    @Autowired
+    private ProjectService projectService;
+
+    @Autowired
+    private IssueStatusService issueStatusService;
+
+    @Autowired
+    private IssueTypeService issueTypeService;
+
+    @Autowired
+    private PriorityService priorityService;
+
+    @Autowired
+    private SeverityService severityService;
+
     public CheckIssueData() {}
 
+    public boolean CheckData(User user, IssueForm issueForm) {
+        //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
+        this.workspaceService.checkUseWorkspace(user, user.getLastWorkspaceId());
+
+        Issue issue = this.issueService.getIssue(issueForm.getId());
+        IssueStatus oldIssueStatus = issue.getIssueStatus();
+        //  �봽濡쒖젥�듃 �쑀�슚�꽦 泥댄겕
+        Project project = this.projectService.getProject(issueForm.getProjectId());
+        //  �씠�뒋 �긽�깭 �쑀�슚�꽦 泥댄겕
+        IssueStatus issueStatus = this.issueStatusService.getIssueStatus(issueForm.getIssueStatusId());
+        //  �씠�뒋 �쑀�삎 �쑀�슚�꽦 泥댄겕
+        IssueType issueType = this.issueTypeService.getIssueType(issueForm.getIssueTypeId());
+        //  �슦�꽑�닚�쐞 �쑀�슚�꽦 泥댄겕
+        Priority priority = this.priorityService.getPriority(issueForm.getPriorityId());
+        //  以묒슂�룄 �쑀�슚�꽦 泥댄겕
+        Severity severity = this.severityService.getSeverity(issueForm.getSeverityId());
+
+        return true;
+    }
+
     public Issue getIssue() {
         return issue;
     }
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 eb5524e..8383256 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -1,6 +1,7 @@
 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.config.CommonConfiguration;
 import kr.wisestone.owl.constant.Constants;
@@ -239,9 +240,13 @@
             customFieldApiOverlapForm.setUserId(user.getId());
             customFieldApiOverlapForm.setIssueTypeId(issueForm.getIssueTypeId());
 
-            IssueVo issueVo = this.findIssue(issueApiForm, user.getId());
-            if (issueVo != null) {
-                issueForm.setParentIssueId(issueVo.getId());
+            List<IssueVo> issueVos = this.findIssue(issueApiForm, 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));
             }
 
             issueForm.setIsApi(Issue.IS_API_YES);
@@ -281,26 +286,43 @@
 
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private IssueVo findIssue(IssueApiForm issueApiForm, Long userId) {
-        IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
+    private List<IssueVo> findIssue(IssueApiForm issueApiForm, Long userId) {
 
         List<CustomFieldApiOverlap> customFieldApiOverlaps = this.customFieldApiOverlapService.find(userId, issueApiForm.getIssueTypeId());
+
+        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.addUseValues(issueCustomFieldValue.getUseValue());
+                        issueCustomFieldValueCondition.setUseValue(issueCustomFieldValue.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);
+                                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;
+                        }
                     }
                 }
             }
-            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
-            if (results != null && results.size() > 0) {
-                IssueVo issueVo = new IssueVo();
-                ConvertUtil.convertMapToObject(results.get(0), issueVo);
-                return issueVo;
-            }
         }
-        return null;
+        return resultIssueVos;
     }
 
     //  �씠�뒋瑜� �깮�꽦�븳�떎.
@@ -1038,38 +1060,21 @@
     // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎
     private void setDownIssues(Issue issue, IssueVo issueVo) {
         List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
-        /*if(issueVo != null && downIssues.size()>0){
-            for(Issue downIssue : downIssues){
-                IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
-                IssueDownVo issueDownVo = ConvertUtil.copyProperties(downIssueVo, IssueDownVo.class);
-                issueDownVo.setIssueDown(downIssueVo);
-                issueDownVo.setTitle(downIssue.getTitle());
-                issueDownVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
-                issueDownVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
-                issueDownVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
-                this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
-                this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
-                this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
-                issueVo.addIssueDownVo(issueDownVo);
-            }
-        }*/
-
-        List<IssueVo> downIssueVos = ConvertUtil.convertObjectsToClasses(downIssues, IssueVo.class);
-        List<IssueVo> resultList = new ArrayList<>();
-        if(downIssueVos != null && downIssueVos.size()>0){
-            for(IssueVo downIssueVo : downIssueVos){
+            if(downIssues != null && downIssues.size()>0){
+                List<IssueVo> resultList = new ArrayList<>();
                 for(Issue downIssue : downIssues){
-                    downIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
-                    downIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
-                    downIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
-                    this.setRegister(downIssue, downIssueVo); // �벑濡앹옄
-                    this.setIssueDepartment(downIssue, downIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
-                    this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
+                    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);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
+
+                    resultList.add(newIssueVo);
                 }
-                resultList.add(downIssueVo);
+                issueVo.setIssueDownVos(resultList);
             }
-            issueVo.setIssueDownVos(resultList);
-        }
     }
 
     //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
@@ -1232,7 +1237,7 @@
     }
 
     //  �씠�뒋(�씠�뒋 �쑀�삎)�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� �뀑�똿�븳�떎.
-    private void setIssueCustomFields(Issue issue, IssueVo issueVo) {
+    private IssueVo setIssueCustomFields(Issue issue, IssueVo issueVo) {
 
         //  �빐�떦 �봽濡쒖젥�듃�쓽 �씠�뒋 �쑀�삎�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� 媛��졇�삩�떎.
         IssueTypeCustomFieldCondition issueTypeCustomFieldCondition = new IssueTypeCustomFieldCondition();
@@ -1244,6 +1249,8 @@
         //  �씠�뒋�뿉�꽌 �궗�슜�맂 �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪쓣 媛��졇�삩�떎.
         List<IssueCustomFieldValueVo> issueCustomFieldValueVos = this.issueCustomFieldValueService.findByIssueId(issue.getId());
         issueVo.setIssueCustomFieldValueVos(issueCustomFieldValueVos);
+
+        return issueVo;
     }
 
     //  �씠�뒋�뿉 �벑濡앸맂 �뙎湲� �젙蹂대�� �뀑�똿�븳�떎.
@@ -1261,19 +1268,48 @@
     @Transactional
     public List<IssueVo> findIssue(IssueApiForm issueApiform) {
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
+        List<IssueVo> resultIssueVos = new ArrayList<>();
+
         IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
-        if (issueCustomFieldValueForms != null && issueCustomFieldValueForms.size() > 0) {
+        if (issueCustomFieldValueForms.size() > 0) {
             for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
-                issueCustomFieldValueCondition.addUseValues(issueCustomFieldValueForm.getUseValue());
+//                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);
+
+                        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;
+                }
             }
         }
-        List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
-        List<IssueVo> issueVos = Lists.newArrayList();
-        if (results != null && results.size() > 0) {
-            issueVos.add(ConvertUtil.convertMapToClass(results.get(0), IssueVo.class));
-        }
 
-        return issueVos;
+        return resultIssueVos;
+    }
+
+    // 由ъ뒪�듃�뿉�꽌 �빐�떦 �븘�씠�뵒瑜� 媛�吏�怨� �엳�뒗 �씠�뒋 寃��깋
+    private IssueVo findIssueVo(List<IssueVo> list, Long id) {
+        for (IssueVo issueVo : list) {
+            if (id.equals(issueVo.getId())) {
+                return issueVo;
+            }
+        }
+        return null;
     }
 
 
@@ -1285,13 +1321,17 @@
         IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
 
         List<IssueVo> issueVos = this.findIssue(issueApiForm);
-        List<Issue> issue = Lists.newArrayList();
-        for (IssueVo issueVo : issueVos) {
-            issueForm.setId(issueVo.getId());
-            issue.add(this.modifyIssueForApi(user, issueForm, files));
+        if (issueVos != null && issueVos.size() > 0) {
+            List<Issue> issue = Lists.newArrayList();
+            for (IssueVo issueVo : issueVos) {
+                issueForm.setId(issueVo.getId());
+                issue.add(this.modifyIssueForApi(user, issueForm, files));
+            }
+            return issue;
+        } else {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.API_ISSUE_NOT_EXIST));
         }
-
-        return issue;
     }
 
     //  �씠�뒋瑜� �닔�젙�븳�떎.
diff --git a/src/main/java/kr/wisestone/owl/vo/IssueVo.java b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
index 83daa76..9a7d55c 100644
--- a/src/main/java/kr/wisestone/owl/vo/IssueVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -319,6 +319,10 @@
         this.issueCustomFieldValueVos.add(issueCustomFieldValueVo);
     }
 
+    public void addIssueCustomFieldValueVos(List<IssueCustomFieldValueVo> issueCustomFieldValueVos) {
+        this.issueCustomFieldValueVos = issueCustomFieldValueVos;
+    }
+
     public List<IssueCompanyVo> getIssueCompanyVos() {
         return issueCompanyVos;
     }
diff --git a/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java b/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
index a639a7d..478b78d 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
@@ -50,7 +50,7 @@
                     //  怨듬갚�씠 �븘�땶 臾몄옄媛� �뱾�뼱�엳�쓣 �븣留� useValues 媛� �쑝濡� �뀑�똿�븳�떎.
                     for (String useValue : MapUtil.getStrings(conditions, "useValues")) {
                         if (!StringUtils.isEmpty(useValue)) {
-                            condition.addUseValues(useValue);
+                            condition.addUseValue(useValue);
                         }
                     }
                 }
@@ -84,7 +84,7 @@
         this.useValues = useValues;
     }
 
-    public void addUseValues(String useValue) {
+    public void addUseValue(String useValue) {
         this.useValues.add(useValue);
     }
 
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index 8ef4acd..f5d76f5 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -511,20 +511,12 @@
     <!--    �듅�젙 �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 媛숈� �씠�뒋瑜� 議고쉶 -->
     <select id="findByCustomFieldValue" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition">
         SELECT
-        iss.id as id,
-        iss.title as title
-        FROM issue iss
-        LEFT OUTER JOIN issue_custom_field_value issue_custom FORCE INDEX(issueIdIndex) ON iss.id = issue_custom.issue_id
+        issue_custom.issue_id as id
+        FROM issue_custom_field_value issue_custom
+        INNER JOIN issue iss ON iss.id = issue_custom.issue_id
         WHERE 1=1
         AND iss.parent_issue_id IS NULL
-        <choose>
-            <when test="useValues.size != 0">
-                AND issue_custom.use_value IN
-                <foreach collection="useValues" item="item" index="index" separator="," open="(" close=")">
-                    #{item}
-                </foreach>
-            </when>
-        </choose>
+        AND issue_custom.use_value = #{useValue}
     </select>
 
 </mapper>
diff --git a/src/main/webapp/scripts/app/issue/issueList.controller.js b/src/main/webapp/scripts/app/issue/issueList.controller.js
index 07504f4..d681782 100644
--- a/src/main/webapp/scripts/app/issue/issueList.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -523,6 +523,8 @@
                                 if (detail) {
                                     changeDetailView(result.data.data[0].id);
                                 }
+                            } else {
+                                $scope.vm.responseData = null;
                             }
                         }
                         else {

--
Gitblit v1.8.0