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              |  120 +++++++++++------------------
 src/main/webapp/views/api/apiSettingSpec.html                                  |   13 ++-
 src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java               |    5 +
 src/main/java/kr/wisestone/owl/common/IssueCustomFieldValueFormComparator.java |   20 +++++
 src/main/resources/mybatis/query-template/issue-template.xml                   |   37 ++++----
 src/main/webapp/i18n/ko/global.json                                            |    5 
 src/main/java/kr/wisestone/owl/mapper/IssueMapper.java                         |    2 
 src/main/webapp/views/api/apiSetting.html                                      |    7 -
 8 files changed, 103 insertions(+), 106 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/common/IssueCustomFieldValueFormComparator.java b/src/main/java/kr/wisestone/owl/common/IssueCustomFieldValueFormComparator.java
new file mode 100644
index 0000000..1003fe0
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/common/IssueCustomFieldValueFormComparator.java
@@ -0,0 +1,20 @@
+package kr.wisestone.owl.common;
+
+import kr.wisestone.owl.web.form.IssueApiForm;
+import kr.wisestone.owl.web.form.IssueCustomFieldValueForm;
+
+import java.util.Comparator;
+
+public class IssueCustomFieldValueFormComparator implements Comparator<IssueCustomFieldValueForm> {
+
+    @Override
+    public int compare(IssueCustomFieldValueForm o1, IssueCustomFieldValueForm o2) {
+        if (o1.getCustomFieldId() > o2.getCustomFieldId()) {
+            return 1;
+        } else if (o1.getCustomFieldId() < o2.getCustomFieldId()) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+}
diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
index 90bbfc6..ece925a 100644
--- a/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
+++ b/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
@@ -51,6 +51,6 @@
 
     Long countByDepartment(IssueCondition issueCondition);
 
-    List<Map<String, Object>> findNotCompleteByParentIssueId(Long parentIssueId);
+    List<Map<String, Object>> findNotCompleteByParentIssueId(IssueCondition issueCondition);
 }
 
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 8e77478..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;
@@ -263,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);
@@ -328,39 +326,36 @@
     }
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    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 (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);
+            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));
                 }
             }
         }
@@ -1483,42 +1478,25 @@
     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();
-        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);
+            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));
                 }
             }
         }
@@ -1534,15 +1512,6 @@
             }
         }
         return null;
-    }
-
-
-    // �븯�쐞 �씠�뒋媛� 紐⑤몢 醫낅즺 泥섎━ �릺�뿀�쓣 寃쎌슦 �긽�쐞�씠�뒋�룄 �셿猷� 泥섎━
-    private void setParentIssueComplete(Issue parentIssue) {
-        if (parentIssue != null) {
-            this.issueMapper.findNotCompleteByParentIssueId(parentIssue.getId());
-
-        }
     }
 
 
@@ -1570,10 +1539,12 @@
                 }
 
                 if (parentIssue != null) {
-                    List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(parentIssue.getId());
+                    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);
                     }
                 }
 
@@ -1660,6 +1631,7 @@
             this.issueHistoryService.detectIssueStatus(issue, issueForm, detectIssueChange, oldIssueStatus, issueStatus);
         }
 
+        // db�뿉 ���옣
         issue = this.saveIssue(issueForm, checkIssueData);
 
         //  �씠�뒋 �씠�젰 �벑濡�
diff --git a/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java b/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
index 911ce7d..4437f90 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
@@ -54,6 +54,11 @@
     private List<Long> myDepartmentIds; // �궡媛� �냽�빐�엳�뒗 遺��꽌 ID
 
     public IssueCondition(){}
+
+    public IssueCondition(Long issueId, Long parentIssueId){
+        this.id = issueId;
+        this.parentIssueId = parentIssueId;
+    }
     //  ���떆蹂대뱶 �쐞湲곌�由� �쐞�젽�뿉�꽌 �궗�슜
     public IssueCondition(List<String> issueIds){
         this.issueIds = issueIds;
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index de85a12..1ac0cbb 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -953,8 +953,6 @@
                     AND is_api = #{isApi};
     </select>
 
-
-
     <!--    �씠�뒋 �긽�깭瑜� �궗�슜�븯�뒗 �씠�뒋 媛��닔瑜� 議고쉶�븳�떎. -->
     <select id="countByIssueStatusId" resultType="java.lang.Long" parameterType="java.lang.Long">
         SELECT COUNT(DISTINCT id) FROM
@@ -965,29 +963,32 @@
     <!--    �듅�젙 �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 媛숈� �씠�뒋瑜� 議고쉶 -->
     <select id="findByCustomFieldValue" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition">
         SELECT
-        issue_custom.issue_id as id,
-        iss.parent_issue_id as parentIssueId
-        FROM issue_custom_field_value issue_custom
-        INNER JOIN issue iss ON iss.id = issue_custom.issue_id
-        WHERE 1=1
-        AND issue_custom.use_value = #{useValue}
-        <choose>
-          <when test="useParentIssueId.equals(true)">
-              AND iss.parent_issue_id IS NULL
-          </when>
-          <otherwise>
-              AND iss.parent_issue_id IS NOT NULL
-          </otherwise>
-        </choose>
+            issue.id as id,
+            issue.title as title,
+            customFieldValue.customFieldType AS customFieldType,
+            GROUP_CONCAT(customFieldValue.useValue) AS concatUseValue
+        FROM issue issue FORCE INDEX(reverseIndex)
+        INNER JOIN issue_status as issStatus ON issue.issue_status_id = issStatus.id
+        LEFT OUTER JOIN (
+            SELECT cf.id AS customFieldId, cf.custom_field_type AS customFieldType, issue_custom.use_value AS useValue, issue_custom.issue_id AS issueId
+            FROM issue_custom_field_value issue_custom
+            INNER JOIN custom_field cf ON cf.id = issue_custom.custom_field_id
+            ORDER BY issue_custom.id ASC) customFieldValue ON customFieldValue.issueId = issue.id
+        WHERE issStatus.issue_status_type != 'CLOSE'
+        GROUP BY issue.id
+        HAVING concatUseValue LIKE CONCAT('%', #{useValue}, '%')
     </select>
 
+
     <!--  醫낅즺 �븞�맂 �븯�쐞 �씠�뒋 媛��졇�삤湲� -->
-    <select id="findNotCompleteByParentIssueId" resultType="java.util.HashMap" parameterType="java.lang.Long">
+    <select id="findNotCompleteByParentIssueId" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
         SELECT
-        iss.id as id
+        iss.id as id,
+        iss.title as title
         FROM issue iss
         INNER JOIN issue_status issueStatus on iss.issue_status_id = issueStatus.id
         WHERE iss.parent_issue_id = #{parentIssueId}
+        AND iss.id != #{id}
         AND issueStatus.issue_status_type != 'CLOSE'
     </select>
 </mapper>
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index 5c27969..ca941f2 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -885,12 +885,13 @@
         "failedToApiMonitor": "API 湲곕줉 議고쉶 �떎�뙣",
         "requestSample": "API �슂泥� �깦�뵆",
         "requestSampleAdd": "�씠�뒋 異붽�",
-        "requestSampleModify": "�씠�뒋 �닔�젙",
+        "requestSampleModify": "�씠�뒋 �긽�깭 �닔�젙",
         "downIssueOverlapSetting" : "�븯�쐞 �씠�뒋 泥섎━ 湲곗� �빆紐�",
         "upIssueCompleteIssueStatus" : "�긽�쐞 �씠�뒋 �옄�룞醫낅즺 �씠�뒋 �긽�깭 �꽕�젙",
         "autoCompleteIssueStatus" : "�옄�룞 醫낅즺 �꽕�젙�븷 �씠�뒋 �긽�깭",
         "successToApiAutoCompleteIssueStatus" : "�옄�룞 醫낅즺 �씠�뒋 �긽�깭 �꽕�젙 �셿猷�",
-        "failedToApiAutoCompleteIssueStatus" : "�옄�룞 醫낅즺 �씠�뒋 �긽�깭 �꽕�젙 �떎�뙣"
+        "failedToApiAutoCompleteIssueStatus" : "�옄�룞 醫낅즺 �씠�뒋 �긽�깭 �꽕�젙 �떎�뙣",
+        "requestSampleModifyDesc" : "(�닔�젙�떆 customField �빆紐⑹� 寃��깋 �슜�룄濡� �궗�슜�맖)"
     },
     "companyField" : {
         "info": "�뾽泥댁젙蹂�",
diff --git a/src/main/webapp/views/api/apiSetting.html b/src/main/webapp/views/api/apiSetting.html
index 1be9f02..37a70fc 100644
--- a/src/main/webapp/views/api/apiSetting.html
+++ b/src/main/webapp/views/api/apiSetting.html
@@ -1,13 +1,6 @@
 <div class="row">
     <div class="col-sm-12">
         <div class="element-wrapper">
-            <div class="element-actions">
-                <button ng-click="fn.add()"
-                        class="btn btn-xlg btn-danger"><i class="os-icon os-icon-plus"></i> <span translate="api.addOverlapField">�븘�뱶 留뚮뱾湲�</span>
-                </button>
-            </div>
-
-
             <div class="element-actions" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_ISSUE_STATUS')">
             </div>
             <h6 class="element-header" translate="api.setting">
diff --git a/src/main/webapp/views/api/apiSettingSpec.html b/src/main/webapp/views/api/apiSettingSpec.html
index 2d05b54..8ff0bb2 100644
--- a/src/main/webapp/views/api/apiSettingSpec.html
+++ b/src/main/webapp/views/api/apiSettingSpec.html
@@ -99,7 +99,7 @@
 <div class="element-box">
     <div class="row">
         <div class="col-md-1">
-            <label for="issue-detectingInfo" class="issue-label">
+            <label class="issue-label">
                 <span translate="api.requestSampleAdd">�씠�뒋 異붽�</span>
             </label>
         </div>
@@ -108,12 +108,17 @@
         </div>
         <div class="col-md-1"></div>
         <div class="col-md-1">
-            <label for="issue-detectingInfo" class="issue-label">
+            <label class="issue-label">
                 <span translate="api.requestSampleModify">�씠�뒋 �닔�젙</span>
             </label>
+            <label class="text-info">
+                <span translate="api.requestSampleModifyDesc">�닔�젙�떆</span>
+            </label>
         </div>
-        <div>
-            <pre>{{vm.sampleJsonModify}}</pre>
+        <div class="col-md-2">
+            <div>
+                <pre>{{vm.sampleJsonModify}}</pre>
+            </div>
         </div>
     </div>
 </div>
\ No newline at end of file

--
Gitblit v1.8.0