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