From 916a3cbabe4e50062fce61ff6f2f5d46c05dfbd1 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 목, 17 3월 2022 17:47:45 +0900
Subject: [PATCH] - api로 이슈 추가 시 url/ip로 업체 찾는 코드 수정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java                |  444 ++++++++++++++++++------------------
 src/main/java/kr/wisestone/owl/util/ConvertUtil.java                             |   28 +
 src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java                    |    3 
 src/main/resources/mybatis/query-template/companyField-template.xml              |   43 ---
 src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js        |   58 ++++
 src/main/webapp/scripts/app/companyField/companyFieldList.controller.js          |    2 
 src/main/resources/mybatis/query-template/issue-template.xml                     |   11 
 src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js           |    4 
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java                        |   10 
 src/main/java/kr/wisestone/owl/mapper/IssueMapper.java                           |    3 
 src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java |    9 
 src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java          |   30 -
 src/main/java/kr/wisestone/owl/constant/Regular.java                             |   12 +
 src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java         |    2 
 src/main/java/kr/wisestone/owl/util/CommonUtil.java                              |   38 +++
 src/main/webapp/i18n/ko/global.json                                              |    1 
 src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js     |   20 +
 17 files changed, 415 insertions(+), 303 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index eab6b8c..88196f2 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -361,4 +361,14 @@
      * api �씠�뒋 �깮�꽦 �셿猷�
      */
     public static final String API_ADD_ISSUE_OK = "API_ADD_ISSUE_OK";
+
+    /**
+     * api �뙆�씪誘명꽣 �삤瑜�(以묐났 泥섎━ IP媛� �몢媛� �씠�긽�씪 寃쎌슦)
+     */
+    public static final String API_PARAMETER_IP_ERROR = "API_PARAMETER_IP_ERROR";
+
+    /**
+     * api �뙆�씪誘명꽣 �삤瑜�(以묐났 泥섎━ URL�씠 �몢媛� �씠�긽�씪 寃쎌슦)
+     */
+    public static final String API_PARAMETER_URL_ERROR = "API_PARAMETER_URL_ERROR";
 }
diff --git a/src/main/java/kr/wisestone/owl/constant/Regular.java b/src/main/java/kr/wisestone/owl/constant/Regular.java
new file mode 100644
index 0000000..3b9b5ac
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/constant/Regular.java
@@ -0,0 +1,12 @@
+package kr.wisestone.owl.constant;
+
+public class Regular {
+    /**
+     * IP �젙洹쒖떇
+     */
+    public static final String IP = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
+    /**
+     * URL �젙洹쒖떇
+     */
+    public static final String URL = "^((http|https)://)?(www.)?([a-zA-Z0-9]+)\\.[a-z]+([a-zA-z0-9.?#]+)?";
+}
diff --git a/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java b/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
index 63d8ab2..4632105 100644
--- a/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
+++ b/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
@@ -24,7 +24,4 @@
 
     List<CompanyField> findByUrlsAndIdNot(CompanyFieldCondition companyFieldCondition);
 
-    List<CompanyField> findByIps(CompanyFieldCondition companyFieldCondition);
-
-    List<CompanyField> findByIpsAndIdNot(CompanyFieldCondition companyFieldCondition);
 }
diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
index ff44b6f..546acc3 100644
--- a/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
+++ b/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
@@ -53,6 +53,7 @@
 
     List<Map<String, Object>> findNotCompleteByParentIssueId(IssueCondition issueCondition);
 
-    List<Map<String, Object>> findByCustomFieldValueByCompany(IssueCustomFieldValueCondition issueCustomFieldValueCondition);
+    List<Map<String, Object>> findByCustomFieldValueBySite(IssueCustomFieldValueCondition issueCustomFieldValueCondition);
+
 }
 
diff --git a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
index 0b9734d..b5365d7 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -168,8 +168,6 @@
 
             List<CompanyField> companyFields = Lists.newArrayList();
             CompanyFieldCondition condition = new CompanyFieldCondition();
-            condition.setIpStart(String.valueOf(ipStart));
-            condition.setIpEnd(String.valueOf(ipEnd));
             if (id != null) {
                 condition.setId(id);
                 companyFields = this.companyFieldRepository.findByIdNot(condition.getId());
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 0c6dee8..fc676ec 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -7,7 +7,6 @@
 import kr.wisestone.owl.constant.*;
 import kr.wisestone.owl.data.CheckIssueData;
 import kr.wisestone.owl.domain.*;
-import kr.wisestone.owl.domain.enumType.CustomFieldType;
 import kr.wisestone.owl.domain.enumType.EmailType;
 import kr.wisestone.owl.domain.enumType.IssueHistoryType;
 import kr.wisestone.owl.domain.enumType.IssueStatusType;
@@ -48,9 +47,9 @@
 import java.io.IOException;
 import java.text.ParseException;
 import java.util.*;
-import java.util.regex.Pattern;
 
 import static kr.wisestone.owl.domain.enumType.CustomFieldType.*;
+import static kr.wisestone.owl.web.condition.CompanyFieldCondition.IP_DEFAULT;
 
 @Service
 public class IssueServiceImpl extends AbstractServiceImpl<Issue, Long, JpaRepository<Issue, Long>> implements IssueService {
@@ -253,7 +252,7 @@
         IssueForm issueForm = ConvertUtil.copyProperties(issueApiForm, IssueForm.class);
 //        issueForm.setFiles(issueApiForm.getFiles());
         IssueType issueType = this.issueTypeService.getIssueType(issueApiForm.getIssueTypeId());
-        if (issueType == null){
+        if (issueType == null) {
             throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR));
         }
 
@@ -267,7 +266,7 @@
                     issueForm.addDepartmentId(departmentId);
                 }
             }
-        } else if (issueApiForm.getIssueStatusId() == null){
+        } else if (issueApiForm.getIssueStatusId() == null) {
             throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_ISSUE_STATUS_NOT_EXIST));
         } else if (!this.workflowTransitionService.contains(issueApiForm.getIssueStatusId(), workflow.getId())) {
             //�씠�뒋 �긽�깭 �쑀�슚�꽦 �솗�씤
@@ -276,7 +275,7 @@
 
         // �봽濡쒖젥�듃 �엯�젰
         Project project = issueType.getProject();
-        if (project == null){
+        if (project == null) {
             throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_PROJECT_ERROR));
         }
         issueForm.setProjectId(project.getId());
@@ -311,7 +310,7 @@
                 }
 
                 // 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
-                List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps, user.getId());
+                List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps);
                 int size = issues.size();
                 if (size > 0) {
                     Issue targetIssue = issues.get(0);
@@ -341,11 +340,12 @@
 
     /**
      * �룄硫붿씤�씠 �룞�씪�븳 �뾽泥� 李얘린
+     *
      * @param issueForm IssueForm
      * @return IssueForm
      */
     private IssueForm findCompanyField(IssueForm issueForm) {
-        if(issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) {
+        if (issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) {
             CompanyFieldCondition condition = new CompanyFieldCondition();
             List<Map<String, Object>> companyFields = Lists.newArrayList();
             List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
@@ -355,7 +355,7 @@
             for (Map<String, Object> issueCustomField : issueForm.getIssueCustomFields()) {
                 Long customFieldId = MapUtil.getLong(issueCustomField, "customFieldId");
                 CustomField customField = this.customFieldService.getCustomField(customFieldId);
-                if(customField != null && customField.getCustomFieldType().equals(SITE) && customField.getName().equals("�룄硫붿씤")) {
+                if (customField != null && customField.getCustomFieldType().equals(SITE) && customField.getName().equals("�룄硫붿씤")) {
                     String useValue = issueCustomField.get("useValue").toString();
                     String[] urlArr = null;
                     List<String> urls = Lists.newArrayList();
@@ -368,19 +368,19 @@
                     condition.setUrls(urls);
                     companyFields = this.companyFieldService.find(condition);
 
-                    if(companyFields != null && companyFields.size() > 0) {
+                    if (companyFields != null && companyFields.size() > 0) {
                         for (Map<String, Object> companyField : companyFields) {
                             CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
                             companyField.put("companyId", companyField.get("id"));
                             issueCompanyFields.add(companyField);
-                            if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
+                            if (companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
                                 Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId());
                                 if (ispField != null) {
                                     ispField.put("ispId", ispField.get("id"));
                                     issueIspFields.add(ispField);
                                 }
                             }
-                            if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
+                            if (companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
                                 Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId());
                                 if (hostingField != null) {
                                     hostingField.put("hostingId", hostingField.get("id"));
@@ -400,30 +400,84 @@
     }
 
     /**
+     * �엯�젰�븳 ip媛� 湲곗〈 �뾽泥� 以묒뿉 �냽�빐�엳�뒗吏� 泥댄겕
+     *
+     * @param ip IP
+     * @param startIps �뾽泥� �뀒�씠釉붿뿉 議댁옱�븯�뒗 start_ip(�젙�닔濡� 蹂��솚�븳 媛�)
+     * @param endIps �뾽泥� �뀒�씠釉붿뿉 議댁옱�븯�뒗 end_ip(�젙�닔濡� 蹂��솚�븳 媛�)
+     * @return IP媛� �냽�빐 �엳�뒗吏� 寃곌낵 媛�
+     */
+    boolean containsIP(Long ip, List<Long> startIps, List<Long> endIps) {
+        if (startIps != null && startIps.size() > 0 && endIps != null && endIps.size() > 0) {
+            for (int i = 0; i < startIps.size(); i++) {
+                if (startIps.get(i) <= ip && endIps.get(i) >= ip) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+    /**
      * 議곌굔�뿉 留욌뒗 �뙆�듃�꼫 �젙蹂� 李얘린
-     * @param condition CompanyFieldCondition
+     *
+     * @param condition          CompanyFieldCondition
      * @param issueCompanyFields List<Map<String, Object>>
-     * @param issueIspFields List<Map<String, Object>>
+     * @param issueIspFields     List<Map<String, Object>>
      * @param issueHostingFields List<Map<String, Object>>
      */
-    private void findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields
+    private CompanyFieldVo findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields
             , List<Map<String, Object>> issueIspFields, List<Map<String, Object>> issueHostingFields) {
 
-        List<Map<String, Object>> companyFields = this.companyFieldService.find(condition);
+        Long ip = condition.getIp();
+        List<Map<String, Object>> companyFieldList = Lists.newArrayList();
 
-        if(companyFields != null && companyFields.size() > 0) {
-            for (Map<String, Object> companyField : companyFields) {
-                CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
+        if (ip > IP_DEFAULT) {
+            List<CompanyField> companyFields = this.companyFieldService.findAll();
+            if (companyFields != null && companyFields.size() > 0) {
+                for (CompanyField companyField : companyFields) {
+                    if (companyField.getIpStart() != null && companyField.getIpEnd() != null) {
+                        List<Long> startIps = ConvertUtil.ipToLongs(companyField.getIpStart());
+                        List<Long> endIps = ConvertUtil.ipToLongs(companyField.getIpEnd());
+
+                        if (containsIP(ip, startIps, endIps)) {
+                            companyFieldList.add(ConvertUtil.convertObjectToMap(companyField));
+                            break;
+                        }
+                    }
+                }
+                //  api �궗�슜�옄�젙�쓽�븘�뱶 媛믪뿉 IP,URL �몮 �떎 �엯�젰 �뻽�쓣 寃쎌슦
+                if (!StringUtils.isEmpty(condition.getUrl()) && companyFieldList.size() > 0) {
+                    for (Map<String, Object> companyFieldMap : companyFieldList) {
+                        CompanyField companyField = ConvertUtil.convertMapToClass(companyFieldMap, CompanyField.class);
+                        if (companyField != null && !StringUtils.isEmpty(companyField.getUrl())) {
+                            if (!companyField.getUrl().contains(condition.getUrl())) {
+                                companyFieldList.clear();
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+        } else {
+            companyFieldList = this.companyFieldService.find(condition);
+        }
+
+        CompanyFieldVo companyFieldVo = null;
+        if (companyFieldList != null && companyFieldList.size() > 0) {
+            for (Map<String, Object> companyField : companyFieldList) {
+                companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
                 companyField.put("companyId", companyField.get("id"));
                 issueCompanyFields.add(companyField);
-                if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
+                if (companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
                     Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId());
                     if (ispField != null) {
                         ispField.put("ispId", ispField.get("id"));
                         issueIspFields.add(ispField);
                     }
                 }
-                if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
+                if (companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
                     Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId());
                     if (hostingField != null) {
                         hostingField.put("hostingId", hostingField.get("id"));
@@ -432,6 +486,7 @@
                 }
             }
         }
+        return companyFieldVo;
     }
 
     private User convertToUser(String token) {
@@ -487,153 +542,101 @@
     }
 
     /**
-     * url �젙洹쒖떇 �몴�쁽
-     * @param url String
+     * �궗�슜�옄�젙�쓽 �븘�뱶 寃��궗
+     * �룄硫붿씤 or IP �씪 寃쎌슦留� 泥섎━�븯湲� �쐞�븿
+     *
+     * @param issueCustomFieldValueForms �궗�슜�옄 �젙�쓽 �븘�뱶 媛� 諛곗뿴
+     * @return �뾽泥� 寃��깋 議곌굔
      */
-    private boolean verifyUrl(String url) {
-        boolean urlChk = false;
-        if (!StringUtils.isEmpty(url)) {
-            String reg = "^((http|https)://)?(www.)?([a-zA-Z0-9]+)\\.[a-z]+([a-zA-z0-9.?#]+)?";
-            if(Pattern.matches(reg, url)) {
-                urlChk = true;
-            }
-        }
-        return urlChk;
-    }
-
-    /**
-     * ip �젙洹쒖떇 �몴�쁽
-     * @param ip String
-     * @return boolean
-     */
-    private boolean verifyIp(String ip) {
-        boolean ipChk = false;
-        if (!StringUtils.isEmpty(ip)) {
-            if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" +
-                    ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)) {
-                ipChk = true;
-            }
-        }
-
-        return ipChk;
-    }
-
-    // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
-        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
-        List<Issue> resultIssueVos = Lists.newArrayList();
-        String comma = ",";
+    private CompanyFieldCondition validIssueCustomFieldValue(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) {
+        CompanyFieldCondition condition = new CompanyFieldCondition();
 
         if (issueCustomFieldValueForms.size() > 0) {
-            String concatUseValue = "";
-            String customFieldType = "";
-            int useIdx = 0;
-            int cntIp = 0;
-            int cntSite = 0;
-
             IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
             Collections.sort(issueCustomFieldValueForms, comp);
 
-            List<String> userValues = Lists.newArrayList();
-            CompanyFieldCondition condition = new CompanyFieldCondition();
-            List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
-            List<Map<String, Object>> issueIspFields = Lists.newArrayList();
-            List<Map<String, Object>> issueHostingFields = Lists.newArrayList();
-
             for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
-                userValues.add(issueCustomFieldValueForm.getUseValue());
 
-                for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
+                for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
                     if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
-
                         String useValue = issueCustomFieldValueForm.getUseValue();
-                        if (useValue.contains(" ")) {
-                            useValue = useValue.replace(" ","");
-                        }
-
-                        if (this.verifyIp(useValue)) {
+                        if (CommonUtil.verifyIp(useValue)) {
                             long ip = ConvertUtil.ipToLong(useValue);
-                            customFieldType = IP_ADDRESS.toString();
-                            if (cntIp == 0){
+                            if (condition.getIp() <= IP_DEFAULT) {
                                 condition.setIp(ip);
-                            }
-                            cntIp ++;
-                        }
-
-                        if (this.verifyUrl(useValue)) {
-                            customFieldType = SITE.toString();
-                            if (cntSite == 0) {
-                                condition.setUrl(useValue);
-                            }
-                            cntSite ++;
-                        }
-
-                        /*if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) {
-                            long ip = ConvertUtil.ipToLong(useValue);
-                            customFieldType = IP_ADDRESS.toString();
-                            if (cntIp == 0){
-                                condition.setIp(ip);
-                            }
-                            cntIp ++;
-                        }*/
-
-                        /*if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) {
-                            customFieldType = SITE.toString();
-                            String[] urlArr = null;
-                            List<String> urls = Lists.newArrayList();
-                            if (useValue.contains(",")) {
-                                urlArr = useValue.split(",");
-                                urls.addAll(Arrays.asList(urlArr));
                             } else {
-                                urls.add(useValue);
+                                throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_IP_ERROR));
                             }
-                            if (cntSite == 0) {
-                                condition.setUrl(urls);
+                        } else if (CommonUtil.verifyUrl(useValue)) {
+                            if (StringUtils.isEmpty(condition.getUrl())) {
+                                condition.setUrl(useValue);
+                            } else {
+                                throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_URL_ERROR));
                             }
-                            cntSite ++;
-                        }*/
-
-                        if (useIdx > 0) {
-                            concatUseValue = concatUseValue.concat(comma);
                         }
-                        concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
-                        useIdx++;
                     }
                 }
             }
+        }
+        return condition;
+    }
 
-            // 異붽� �븷 url or ip�뿉 �룷�븿�릺�뼱�엳�뒗 �뙆�듃�꼫 李얘린
-            if ((condition.getIp() > 0) || (condition.getUrl() != null && !condition.getUrl().equals(""))) {
-                this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields);
+    String ConvertToString(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) {
+        String concatUseValue = "";
+        int useIdx = 0;
+
+        for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
+
+            for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
+                if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
+
+                    if (useIdx > 0) {
+                        concatUseValue = concatUseValue.concat(CommonUtil.COMMA);
+                    }
+                    concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
+                    useIdx++;
+                }
             }
+        }
 
-            issueForm.setIssueCompanyFields(issueCompanyFields);
-            issueForm.setIssueIspFields(issueIspFields);
-            issueForm.setIssueHostingFields(issueHostingFields);
+        return  concatUseValue;
+    }
+
+    List<String> GetOverlapUseValues(List<IssueCustomFieldValueForm> issueCustomFieldValueForms) {
+        List<String> resultValues = Lists.newArrayList();
+        for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
+            resultValues.add(issueCustomFieldValueForm.getUseValue());
+        }
+        return resultValues;
+    }
+
+    // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
+    private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps) {
+        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
+        List<Issue> resultIssueVos = Lists.newArrayList();
+        CompanyFieldVo companyFieldVo = null;
+
+        CompanyFieldCondition condition = validIssueCustomFieldValue(issueCustomFieldValueForms, customFieldApiOverlaps);
+        if (condition.getIp() != null || !StringUtils.isEmpty(condition.getUrl())) {
+            // 異붽� �븷 url or ip�뿉 �룷�븿�릺�뼱�엳�뒗 �뙆�듃�꼫 李얘린
+            companyFieldVo = this.findPartner(condition, issueForm.getIssueCompanyFields(), issueForm.getIssueIspFields(), issueForm.getIssueHostingFields());
+        }
+
+        if (issueCustomFieldValueForms.size() > 0) {
+            String concatUseValue = ConvertToString(issueCustomFieldValueForms, customFieldApiOverlaps);
+            List<String> useValues = GetOverlapUseValues(issueCustomFieldValueForms);
 
             IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
-            issueCustomFieldValueCondition.setUseValues(userValues);
+            issueCustomFieldValueCondition.setUseValues(useValues);
             issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
-            issueCustomFieldValueCondition.setCustomFieldType(customFieldType);
-//            issueCustomFieldValueCondition.setIssueStatusType("CLOSE");
+//          issueCustomFieldValueCondition.setIssueStatusType("CLOSE");
             List<Map<String, Object>> results = Lists.newArrayList();
-            if (customFieldType.equals(IP_ADDRESS.toString()) && issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) {
-                long ipValue = 0;
-                if (concatUseValue.contains(",")) {
-                    String[] arr = concatUseValue.split(",");
-                    for (String str : arr) {
-                        ipValue = ConvertUtil.ipToLong(str);
-                    }
-                } else {
-                    ipValue = ConvertUtil.ipToLong(concatUseValue);
-                }
-                issueCustomFieldValueCondition.setUseValue(String.valueOf(ipValue));
-            }
 
-            if (issueCustomFieldValueCondition.getCustomFieldType() != null && !issueCustomFieldValueCondition.getCustomFieldType().equals("")) {
-                //  �궗�슜�옄�젙�쓽�븘�뱶 ���엯�씠 IP_ADDRESS �삉�뒗 SITE �씪 寃쎌슦 
-                results = this.issueMapper.findByCustomFieldValueByCompany(issueCustomFieldValueCondition);
+            if (companyFieldVo != null) {
+                //  url or ip瑜� �넻�빐 �뾽泥대�� 李얠븯�쓣 寃쎌슦
+                issueCustomFieldValueCondition.setUseValue(companyFieldVo.getUrl());
+                results = this.issueMapper.findByCustomFieldValueBySite(issueCustomFieldValueCondition);
             } else {
                 results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
             }
@@ -688,7 +691,7 @@
         issue.setIssueType(issueType);
         issue.setPriority(priority);
         issue.setSeverity(severity);
-        if (issueForm.getParentIssueId() != null){
+        if (issueForm.getParentIssueId() != null) {
             Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
             issue.setParentIssue(parentIssue);
 
@@ -705,7 +708,7 @@
 
         issue.setReverseIndex(issue.getId() * -1);  //  荑쇰━ �냽�룄 媛쒖꽑�쓣 �쐞�빐 由щ쾭�뒪 �씤�뜳�뒪 �깮�꽦
 
-        if (issueForm.getParentIssueId() != null){
+        if (issueForm.getParentIssueId() != null) {
             Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
             if (issueForm.getIsApi().equals(Issue.IS_API_YES)
                     || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) {
@@ -799,7 +802,7 @@
         issue.setIssueType(issueType);
         issue.setPriority(priority);
         issue.setSeverity(severity);
-        if (issueForm.getParentIssueId() != null){
+        if (issueForm.getParentIssueId() != null) {
             Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
             issue.setParentIssue(parentIssue);
         }
@@ -851,6 +854,7 @@
 
     /**
      * Issue瑜� IssueVo濡� 蹂��솚(�븯�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽 �떆 �븘�슂)
+     *
      * @param issue Issue
      * @return IssueVo
      */
@@ -893,7 +897,7 @@
         issue.setIssueType(issueType);
         issue.setPriority(priority);
         issue.setSeverity(severity);
-        if (issueForm.getParentIssueId() != null){
+        if (issueForm.getParentIssueId() != null) {
             Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
             issue.setParentIssue(parentIssue);
         }
@@ -1070,7 +1074,8 @@
 
     /**
      * �궇吏� �쑀�슚�꽦 泥댄겕
-     * @param startDate �떆�옉 �씪�옄(臾몄옄)
+     *
+     * @param startDate    �떆�옉 �씪�옄(臾몄옄)
      * @param completeDate 醫낅즺 �씪�옄(臾몄옄)
      */
     private void checkStartCompleteDate(String startDate, String completeDate) {
@@ -1083,8 +1088,9 @@
 
     /**
      * �궇吏� �쑀�슚�꽦 泥댄겕
+     *
      * @param start �떆�옉 �씪�옄
-     * @param end 醫낅즺 �씪�옄
+     * @param end   醫낅즺 �씪�옄
      */
     private void checkStartCompleteDate(Date start, Date end) {
         if (start.getTime() > end.getTime()) {
@@ -1100,13 +1106,13 @@
         }
     }
 
-    void SetMyDepartmentId(IssueCondition issueCondition){
+    void SetMyDepartmentId(IssueCondition issueCondition) {
         Long loginId = issueCondition.getLoginUserId();
         List<Long> myDepartmentIds = Lists.newArrayList();
         List<UserDepartment> myDepartments = this.userDepartmentRepository.findByUserId(loginId);
 
-        if(myDepartments != null && myDepartments.size() > 0){
-            for(UserDepartment myDepartment : myDepartments){
+        if (myDepartments != null && myDepartments.size() > 0) {
+            for (UserDepartment myDepartment : myDepartments) {
                 myDepartmentIds.add(myDepartment.getDepartmentId());
             }
         } else {
@@ -1115,31 +1121,31 @@
         issueCondition.setMyDepartmentIds(myDepartmentIds);
     }
 
-    void SetAllDepartmentId(IssueCondition issueCondition){
+    void SetAllDepartmentId(IssueCondition issueCondition) {
         List<Long> departmentIds = Lists.newArrayList();
         List<Map<String, Object>> departmentList = this.departmentMapper.find(null);
 
-        if(departmentList != null && departmentList.size() > 0){
-            for(Map<String, Object> department : departmentList){
+        if (departmentList != null && departmentList.size() > 0) {
+            for (Map<String, Object> department : departmentList) {
                 departmentIds.add((Long) department.get("id"));
             }
         }
         issueCondition.setMyDepartmentIds(departmentIds);
     }
 
-    void SetWorkflowDepartment(List<IssueVo> issueVos){
-        for(IssueVo issueVo : issueVos){
+    void SetWorkflowDepartment(List<IssueVo> issueVos) {
+        for (IssueVo issueVo : issueVos) {
             Long issueTypeId = issueVo.getIssueTypeId();
             IssueType issueType = this.issueTypeService.getIssueType(issueTypeId);
             Long workflowId = issueType.getWorkflow().getId();
             List<WorkflowDepartment> workflowDepartmentList = this.workflowDepartmentRepository.findByWorkflowId(workflowId);
             List<Long> workflowDepartmentIds = Lists.newArrayList();
-            if(workflowDepartmentList != null && workflowDepartmentList.size()>0){
-                for(WorkflowDepartment workflowDepartment : workflowDepartmentList){
+            if (workflowDepartmentList != null && workflowDepartmentList.size() > 0) {
+                for (WorkflowDepartment workflowDepartment : workflowDepartmentList) {
                     workflowDepartmentIds.add(workflowDepartment.getDepartment().getId());
                 }
             }
-            if(issueVo.getIssueTypeId().equals(issueTypeId)){
+            if (issueVo.getIssueTypeId().equals(issueTypeId)) {
                 issueVo.setWorkflowDepartmentIds(workflowDepartmentIds);
             }
         }
@@ -1230,13 +1236,13 @@
 
     // �븯�쐞 �씠�뒋 �꽭�똿(�옱洹�)
     private void setDownIssues(User user, List<IssueVo> issueVos) {
-        for(IssueVo 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){
+            for (Issue downIssue : downIssues) {
                 IssueVo addIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
                 addIssueVo.setIssueTypeId(downIssue.getIssueType().getId());
                 downIssueVos.add(addIssueVo);
@@ -1261,9 +1267,9 @@
 
     // �뿰愿� �씠�뒋 �꽭�똿
     private void setRelationIssues(List<IssueVo> issueVos) {
-        for(IssueVo issueVo : issueVos) {
+        for (IssueVo issueVo : issueVos) {
             List<IssueVo> relationIssues = this.issueRelationService.findRelationIssue(issueVo.getId());
-            for(IssueVo relationIssue : relationIssues){
+            for (IssueVo relationIssue : relationIssues) {
                 issueVo.addRelationIssueVo(ConvertUtil.copyProperties(relationIssue, IssueVo.class));
             }
         }
@@ -1271,11 +1277,11 @@
 
     // �긽�쐞 �씠�뒋 泥댄겕
     private void setParentIssue(List<IssueVo> issueVos) {
-        for(IssueVo issueVo : issueVos) {
-            if(issueVo.getParentIssueId() != null) {
+        for (IssueVo issueVo : issueVos) {
+            if (issueVo.getParentIssueId() != null) {
                 Issue parentIssue = this.getIssue(issueVo.getParentIssueId());
                 //issueVo.setParentIssueVo(ConvertUtil.copyProperties(parentIssue, IssueVo.class));
-                if(parentIssue.getIssueCustomFieldValues() == null || parentIssue.getIssueCustomFieldValues().size() == 0){
+                if (parentIssue.getIssueCustomFieldValues() == null || parentIssue.getIssueCustomFieldValues().size() == 0) {
                     issueVo.setIssueCustomFieldValueVos(null);
                 }
                 ConvertUtil.copyProperties(parentIssue, issueVo);
@@ -1286,13 +1292,13 @@
     @Override
     @Transactional(readOnly = true)
     public void setCountDownIssues(List<IssueVo> issueVos) {
-        for (IssueVo issueVo : issueVos){
+        for (IssueVo issueVo : issueVos) {
             List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueVo.getId()); //�븯�쐞�씠�뒋 媛��졇�삤湲�
-            if(downIssues != null && downIssues.size() > 0){ //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫�
+            if (downIssues != null && downIssues.size() > 0) { //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫�
                 int downIssueAllCount = 0;// �븯�쐞�씠�뒋 �쟾泥� 移댁슫�듃
                 int downIssueCount = 0;// �븯�쐞�씠�뒋 誘몄셿猷� 移댁슫�듃
-                for(Issue downIssue : downIssues){
-                    downIssueAllCount ++;
+                for (Issue downIssue : downIssues) {
+                    downIssueAllCount++;
                     Long parentIssueId = downIssue.getParentIssue().getId();
                     Issue parentIssue = this.getIssue(parentIssueId);
                     IssueVo parentIssueVo = ConvertUtil.copyProperties(parentIssue, IssueVo.class);
@@ -1302,8 +1308,8 @@
                     IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
                     downIssueVo.setIssueStatusType(downIssueStatus.getIssueStatusType().toString());
 
-                    if(!downIssueVo.getIssueStatusType().equals("CLOSE")){ //誘몄셿猷� �븯�쐞�씠�뒋 泥댄겕
-                        downIssueCount ++;
+                    if (!downIssueVo.getIssueStatusType().equals("CLOSE")) { //誘몄셿猷� �븯�쐞�씠�뒋 泥댄겕
+                        downIssueCount++;
                     }
 
                     issueVo.setDownIssueCount(downIssueCount);
@@ -1373,7 +1379,7 @@
                                         IssueCondition issueCondition, Pageable pageable) {
 
         //  寃��깋 議곌굔�쓣 留뚮뱺�떎
-        if (!this.makeIssueSearchCondition(issueCondition,Lists.newArrayList("01", "02", "03"), pageable)) {
+        if (!this.makeIssueSearchCondition(issueCondition, Lists.newArrayList("01", "02", "03"), pageable)) {
             //  �씠�뒋 紐⑸줉�쓣 李얠� 紐삵븷 寃쎌슦 湲곕낯 �젙蹂대줈 由ы꽩�븳�떎.
             this.notFoundIssueList(resJsonData, pageable);
             return Lists.newArrayList();
@@ -1508,12 +1514,11 @@
         //  �봽濡쒖젥�듃瑜� �꽑�깮�븯吏� �븡�븯�쑝硫� �빐�떦 �뾽臾� 怨듦컙�뿉�꽌 李몄뿬�븯怨� �엳�뒗 �봽濡쒖젥�듃瑜� 李얜뒗�떎.
         if (condition.getProjectIds().size() < 1) {
             List<Map<String, Object>> projects = Lists.newArrayList();
-            if (this.userWorkspaceService.checkWorkspaceManager(user) || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_PROJECT)){
+            if (this.userWorkspaceService.checkWorkspaceManager(user) || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_PROJECT)) {
                 return true;
             }/*else if (MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE)){
                 projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectStatues, condition.getProjectType());
-            }*/
-            else {
+            }*/ else {
                 projects = this.projectService.findByWorkspaceIdAndIncludeProject(projectStatues, condition.getProjectType());
             }
 
@@ -1560,7 +1565,7 @@
                     || (MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_PROJECT) &&
                     MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE))) {
                 projects = this.projectMapper.findByWorkspaceManagerAll(projectCondition);
-            } else  {
+            } else {
                 projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectCondition);
             }
             List<Long> projectIds = Lists.newArrayList();
@@ -1793,26 +1798,26 @@
         Page<Issue> downIssues = null;
 
         List<Issue> downIssueList = this.issueRepository.findByParentIssueId(issue.getId());
-        if(downIssueList != null && downIssueList.size() > 0) {
+        if (downIssueList != null && downIssueList.size() > 0) {
             int startPage = 0;
             if (issueVo.getDownPage() != 0) {
-                startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize());
+                startPage = (int) Math.floor(issueVo.getDownPage() / issueVo.getDownPageSize());
             }
             Pageable pageable = PageRequest.of(startPage, issueVo.getDownPageSize());
 
-            if(hideCompleteIssue){
+            if (hideCompleteIssue) {
                 downIssues = this.issueRepository.findByParentIssueId(issue.getId(), IssueStatusType.CLOSE, pageable);
-            }else {
+            } else {
                 downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable);
             }
 
         }
-        if(downIssues != null){
+        if (downIssues != null) {
             issueVo.setDownTotalPage(downIssues.getTotalPages());
             issueVo.setDownTotalCount(downIssues.getTotalElements());
 
             List<IssueVo> resultList = new ArrayList<>();
-            for(Issue downIssue : downIssues){
+            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));
@@ -1888,12 +1893,12 @@
         this.setIssueCompanyField(issue, issueVo);  //�뾽泥� �젙蹂� �꽭�똿
         this.setIssueIspField(issue, issueVo);  //ISP �젙蹂� �꽭�똿
         this.setIssueHostingField(issue, issueVo);  //HOSTING �젙蹂� �꽭�똿
-        this.setParentIssue(issue,issueVo); //�긽�쐞 �씠�뒋 �젙蹂� �꽭�똿
+        this.setParentIssue(issue, issueVo); //�긽�쐞 �씠�뒋 �젙蹂� �꽭�똿
     }
 
     //  �긽�쐞�씪媛� �젙蹂� 異붽�
     private void setParentIssue(Issue issue, IssueVo issueVo) {
-        if(issue.getParentIssue() != null){
+        if (issue.getParentIssue() != null) {
             issueVo.setParentIssueVo(ConvertUtil.copyProperties(issue.getParentIssue(), IssueVo.class));
         }
     }
@@ -2026,7 +2031,7 @@
             List<UserDepartment> userDepartments = this.userDepartmentRepository.findByDepartmentId(departmentVo.getId());
             if (userDepartments != null && userDepartments.size() > 0) {
                 for (UserDepartment userDepartment : userDepartments) {
-                    if (userDepartment.getUserId().equals(this.webAppUtil.getLoginId())){
+                    if (userDepartment.getUserId().equals(this.webAppUtil.getLoginId())) {
                         issueVo.setModifyPermissionCheck(Boolean.TRUE);
                     }
                 }
@@ -2220,7 +2225,7 @@
         checkIssueData.setPriority(priority);
         checkIssueData.setSeverity(severity);
 
-        return  checkIssueData;
+        return checkIssueData;
     }
 
     // �씠�뒋 �닔�젙(API�슜)
@@ -2269,7 +2274,6 @@
     }
 
 
-
     private Issue saveIssue(IssueForm issueForm, CheckIssueData checkIssueData) {
         Issue issue = checkIssueData.getIssue();
         ConvertUtil.copyProperties(issueForm, issue, "id");
@@ -2313,7 +2317,7 @@
         issue = this.saveIssue(issueForm, checkIssueData);
         //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds());
         //  �떞�떦遺��꽌 吏��젙
-        if(issueForm.getDepartmentIds().size()>0){
+        if (issueForm.getDepartmentIds().size() > 0) {
             this.issueDepartmentService.modifyIssueDepartment(issue, user, project.getWorkspace(), issueForm.getDepartmentIds());
         }
 
@@ -2584,9 +2588,9 @@
                     //   �씠�뒋 �떞�떦遺��꽌 �뿬遺� �솗�씤
                     for (DepartmentVo departmentVo : departmentVos) {
                         List<UserDepartment> userDepartments = this.userDepartmentService.findByDepartmentId(departmentVo.getId());
-                        if(userDepartments != null && userDepartments.size() > 0) {
+                        if (userDepartments != null && userDepartments.size() > 0) {
                             for (UserDepartment userDepartment : userDepartments) {
-                                if (userDepartment.getUserId().equals(user.getId())){
+                                if (userDepartment.getUserId().equals(user.getId())) {
                                     hasPermission = true;
                                     break;
                                 }
@@ -2754,9 +2758,9 @@
         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){
+            if (downIssues != null && downIssues.size() > 0) {
+                for (Issue downIssue : downIssues) {
+                    if (downIssue.getParentIssue() != null) {
                         downIssue.setParentIssue(null);
                     }
                 }
@@ -2793,8 +2797,8 @@
             removeIds.add(issueId);
             //�븯�쐞�씠�뒋 泥댄겕
             List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
-            if(downIssues != null && downIssues.size() > 0){
-                for(Issue downIssue : downIssues){
+            if (downIssues != null && downIssues.size() > 0) {
+                for (Issue downIssue : downIssues) {
                     Long downIssueId = downIssue.getId();
                     removeIds.add(downIssueId);
                 }
@@ -2827,8 +2831,8 @@
         for (Long issueId : issueForm.getRemoveIds()) {
             //�궘�젣 �븷 �씠�뒋�쓽 �븯�쐞�씠�뒋 泥댄겕
             List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
-            if(downIssues != null && downIssues.size() > 0){
-                for(Issue downIssue : downIssues){
+            if (downIssues != null && downIssues.size() > 0) {
+                for (Issue downIssue : downIssues) {
                     downIssueId = downIssue.getId();
                 }
             }
@@ -2841,7 +2845,7 @@
 
     private Issue issueRemoves(Long issueId, User user) {
         Issue issue = null;
-        if(issueId != null){
+        if (issueId != null) {
             issue = this.getIssue(issueId);
         }
         //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
@@ -2861,7 +2865,7 @@
         // 吏��슱 �씠�뒋媛� �뿰愿��씠�뒋�씤吏� 泥댄겕 �썑 �뿰愿��씠�뒋 �뀒�씠釉붿뿉�꽌�룄 �궘�젣�븳�떎.
         List<IssueRelation> issueRelationList = this.issueRelationRepository.findByRelationIssueId(issueId);
         if (issueRelationList != null && issueRelationList.size() > 0) {
-            for(IssueRelation issueRelation : issueRelationList){
+            for (IssueRelation issueRelation : issueRelationList) {
                 StringBuilder sb = new StringBuilder();
                 issueHistoryService.detectRelationIssue(IssueHistoryType.DELETE, issueRelation, sb);
                 issueHistoryService.addIssueHistory(issueRelation.getIssue(), IssueHistoryType.MODIFY, sb.toString());
@@ -3068,7 +3072,7 @@
                 if (issueVo.getId().equals(MapUtil.getLong(issueCustomFieldValue, "issueId"))) {
                     IssueCustomFieldValueVo issueCustomFieldValueVo = new IssueCustomFieldValueVo();
 
-                    useValues.put("useValue"+count, MapUtil.getString(issueCustomFieldValue, "useValue"));
+                    useValues.put("useValue" + count, MapUtil.getString(issueCustomFieldValue, "useValue"));
                     useValues.put("customFieldId", MapUtil.getLong(issueCustomFieldValue, "customFieldId"));
                     issueCustomFieldValueVo.setUseValues(useValues);
 
@@ -3087,7 +3091,7 @@
     private void setIssueCompanyField(Issue issue, IssueVo issueVo) {
         List<IssueCompanyVo> issueCompanyVos = Lists.newArrayList();
 
-        for(IssueCompany issueCompany : issue.getIssueCompanies()){
+        for (IssueCompany issueCompany : issue.getIssueCompanies()) {
             IssueCompanyVo issueCompanyVo = ConvertUtil.copyProperties(issueCompany, IssueCompanyVo.class);
             issueCompanyVo.setId(issueCompany.getId());
             CompanyField companyField = issueCompany.getCompanyField();
@@ -3127,7 +3131,7 @@
     private void setIssueIspField(Issue issue, IssueVo issueVo) {
         List<IssueIspVo> issueIspVos = Lists.newArrayList();
 
-        for(IssueIsp issueIsp : issue.getIssueIspFields()){
+        for (IssueIsp issueIsp : issue.getIssueIspFields()) {
             IssueIspVo issueIspVo = ConvertUtil.copyProperties(issueIsp, IssueIspVo.class);
             issueIspVo.setId(issueIsp.getId());
             IspField ispField = issueIsp.getIspField();
@@ -3143,7 +3147,7 @@
     private void setIssueHostingField(Issue issue, IssueVo issueVo) {
         List<IssueHostingVo> issueHostingVos = Lists.newArrayList();
 
-        for(IssueHosting issueHosting : issue.getIssueHostingFields()){
+        for (IssueHosting issueHosting : issue.getIssueHostingFields()) {
             IssueHostingVo issueHostingVo = ConvertUtil.copyProperties(issueHosting, IssueHostingVo.class);
             issueHostingVo.setId(issueHosting.getId());
             HostingField hostingField = issueHosting.getHostingField();
@@ -3440,13 +3444,14 @@
 
     /**
      * �뿊��濡� �엯�젰�븳 �뙆�듃�꼫 �젙蹂� ���옣
+     *
      * @param issueForm IssueForm
      */
     private void setIssuePartners(IssueForm issueForm, Issue issue) {
         //issueCompany �벑濡�
         if (issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) {
             for (Map<String, Object> issueCompanyMap : issueForm.getIssueCompanyFields()) {
-                CompanyField companyField =  ConvertUtil.convertMapToClass(issueCompanyMap, CompanyField.class);
+                CompanyField companyField = ConvertUtil.convertMapToClass(issueCompanyMap, CompanyField.class);
                 IssueCompany issueCompany = ConvertUtil.convertMapToClass(issueCompanyMap, IssueCompany.class, "id", "registerDate", "modifyDate");
                 issueCompany.setCompanyField(companyField);
                 issueCompany.setIssue(issue);
@@ -3607,6 +3612,7 @@
 
     /**
      * �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린
+     *
      * @param issueForm IssueForm
      */
     private void findPartnerByDomain(IssueForm issueForm) {
@@ -3647,7 +3653,7 @@
 
     //  �씠�뒋�쓽 二쇱슂 �냽�꽦�쓣 map �뿉 ���옣�븯�뿬 �뿊�� import �뿉�꽌 吏��젙�븳 ���긽(�씠�뒋 �냽�꽦)�쓣 鍮좊Ⅴ寃� 李얠쓣 �닔 �엳寃� �븳�떎.
     private void IssueAttributeMapToList(IssueForm issueForm, Map<String, Priority> priorityMaps, Map<String, Severity> severityMaps,
-                                         Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps,Map<String, Long> issueTypeCustomFieldMaps,
+                                         Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps, Map<String, Long> issueTypeCustomFieldMaps,
                                          Map<String, CompanyField> companyFieldMaps, Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps) {
 
         Project project = this.projectService.getProject(issueForm.getProjectId());
@@ -3695,11 +3701,12 @@
 
     /**
      * cell String�쑝濡� 蹂��솚 �븿�닔
-     * @param cell Cell
+     *
+     * @param cell   Cell
      * @param isNull boolean
      * @return String
      */
-    private String stringToCell (Cell cell, boolean isNull) {
+    private String stringToCell(Cell cell, boolean isNull) {
         String cellStr = "";
         if (!isNull) {
             cellStr = CommonUtil.convertExcelStringToCell(cell);
@@ -3714,10 +3721,11 @@
     /**
      * cell NULL 泥댄겕 �븿�닔
      * 鍮� 媛믪씠 �븘�땶 cell 泥댄겕
+     *
      * @param cell Cell
      * @return boolean
      */
-    private Boolean cellNullCheck (Cell cell) {
+    private Boolean cellNullCheck(Cell cell) {
         int cellType = cell.getCellType();
         if (cellType < Cell.CELL_TYPE_BLANK) {
             if (cellType == Cell.CELL_TYPE_STRING) {
@@ -3934,6 +3942,7 @@
             issueForm.setUserIds(userIds);
         }
     }
+
     //  �떆�옉�씪, 醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
     private void setIssueFormPeriod(String periodDate, IssueForm issueForm, Boolean checkStartDate, int rowIndex, boolean isNull) throws ParseException {
         if (!isNull) {
@@ -4091,7 +4100,7 @@
         if (issueForm.getSendEmails().size() < 1) {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER));
-        }else if (issueForm.getTemplate() != null){
+        } else if (issueForm.getTemplate() != null) {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SELECT_TEMPLATE));
         }
@@ -4125,7 +4134,7 @@
         if (emailTemplateForm.getSendEmails().size() < 1) {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER));
-        }else if (emailTemplateForm.getTemplate() == null){
+        } else if (emailTemplateForm.getTemplate() == null) {
             throw new OwlRuntimeException(
                     this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SELECT_TEMPLATE));
         } else if (emailTemplateForm.getIssueId() == null) {
@@ -4145,7 +4154,7 @@
 
         Locale locale = CommonUtil.getUserLanguage(user.getLanguage());
         String[] sendMails = ConvertUtil.ToArray(emailTemplateForm.getSendEmails());
-        for(int i=0; i < sendMails.length; i++) {
+        for (int i = 0; i < sendMails.length; i++) {
             sendMails[i] = CommonUtil.decryptAES128(sendMails[i]);
         }
         this.systemEmailService.sendEmail(emailTemplateForm.getTitle(), emailTemplateForm.getTemplate(), sendMails, null, multipartFiles);
@@ -4162,7 +4171,7 @@
         }
 
         Issue issue = null;
-        if(emailCommonForm.getIssueId() != null) {
+        if (emailCommonForm.getIssueId() != null) {
             issue = this.getIssue(emailCommonForm.getIssueId());
         }
 
@@ -4176,7 +4185,7 @@
 
         Locale locale = CommonUtil.getUserLanguage(user.getLanguage());
         String[] sendMails = ConvertUtil.ToArray(emailCommonForm.getSendEmails());
-        for(int i=0; i < sendMails.length; i++) {
+        for (int i = 0; i < sendMails.length; i++) {
             sendMails[i] = CommonUtil.decryptAES128(sendMails[i]);
         }
         this.systemEmailService.sendEmail(emailCommonForm.getTitle(), emailCommonForm.getDescription(), sendMails, null, multipartFiles);
@@ -4308,7 +4317,7 @@
 
         for (Map<String, Object> taskDepartment : taskDepartments) {
             Long taskId = MapUtil.getLong(taskDepartment, "taskId");
-            List<DepartmentVo> departmentVos = (List<DepartmentVo>)taskUserSave.get(taskId.toString());
+            List<DepartmentVo> departmentVos = (List<DepartmentVo>) taskUserSave.get(taskId.toString());
             departmentVos.add(ConvertUtil.convertMapToClass(taskDepartment, DepartmentVo.class));
         }
 
@@ -4338,10 +4347,10 @@
             //taskVo.setUserVos(userVos);
 
             //  �떞�떦遺��꽌 �꽭�똿
-            List<DepartmentVo> departmentVos = (List<DepartmentVo>)taskUserSave.get(taskVo.getId().toString());
+            List<DepartmentVo> departmentVos = (List<DepartmentVo>) taskUserSave.get(taskVo.getId().toString());
             taskVo.setDepartmentVos(departmentVos);
 
-            List<IssueVo> taskVos = (List<IssueVo>)tasks.get(MapUtil.getString(result, "workflowStatusId"));
+            List<IssueVo> taskVos = (List<IssueVo>) tasks.get(MapUtil.getString(result, "workflowStatusId"));
             taskVos.add(taskVo);
             tasks.put(MapUtil.getString(result, "workflowStatusId"), taskVos);
         }
@@ -4363,7 +4372,7 @@
             Issue issue = this.getIssue(downId);
 
             Issue parentIssue = issue.getParentIssue(); //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋
-            if(parentIssue != null && parentIssue.getId().equals(newParentIssueId)){ //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋媛� 議댁옱 �븷 寃쎌슦
+            if (parentIssue != null && parentIssue.getId().equals(newParentIssueId)) { //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋媛� 議댁옱 �븷 寃쎌슦
                 this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
                 this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString());
             }
@@ -4372,7 +4381,7 @@
                 parentIssue = this.getIssue(newParentIssueId); //�긽�쐞�씠�뒋(myIssue)
                 issue.setParentIssue(parentIssue); //myIssue瑜� �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋濡� set
                 this.issueHistoryService.detectDownIssues(IssueHistoryType.ADD, issue, sb); //issue = �븯�쐞�씠�뒋
-            } else{
+            } else {
                 // �궘�젣 �븷 寃쎌슦
                 this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
                 issue.setParentIssue(null);
@@ -4390,7 +4399,8 @@
 
     /**
      * �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽諛쏄린
-     * @param issue Issue
+     *
+     * @param issue       Issue
      * @param parentIssue Issue
      * @return Issue
      */
diff --git a/src/main/java/kr/wisestone/owl/util/CommonUtil.java b/src/main/java/kr/wisestone/owl/util/CommonUtil.java
index 4901e3b..6ee3905 100644
--- a/src/main/java/kr/wisestone/owl/util/CommonUtil.java
+++ b/src/main/java/kr/wisestone/owl/util/CommonUtil.java
@@ -3,7 +3,7 @@
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
-import com.google.gson.Gson;
+import kr.wisestone.owl.constant.Regular;
 import kr.wisestone.owl.domain.enumType.FileType;
 import kr.wisestone.owl.type.LikeType;
 import kr.wisestone.owl.vo.DepartmentVo;
@@ -56,7 +56,9 @@
     private static final String PASS_PHRASE = "1024";   //  AES128 �븫�샇�솕�뿉 �궗�슜
     private static final int ITERATION_COUNT = 10000;   //  AES128 �븫�샇�솕�뿉 �궗�슜
     private static final int KEY_SIZE = 128;    //  AES128 �븫�샇�솕�뿉 �궗�슜
-    private static final String TMP_UPLOAD_FOLDER = "/tmpUploadFolder/";    //  �씠�뒋 �깮�꽦, �닔�젙�뿉�꽌 �뙆�씪 �뾽濡쒕뱶�븷 �븣 �엫�떆 �뤃�뜑濡� �궗�슜
+    private static final String TMP_UPLOAD_FOLDER = "/tmpUploadFolder/";    //  �씠�뒋 �깮�꽦, �닔�젙�뿉�꽌 �뙆�씪 �뾽濡쒕뱶�븷 �븣 �엫�떆 �뤃�뜑濡� �궗�슜'
+    public static final String COMMA = ","; // 援щ텇�옄
+
 
     public static String getClinetIp() {
         try {
@@ -1042,4 +1044,36 @@
         }
         return "";
     }
+
+
+    /**
+     * �젙洹쒖떇 寃��궗(URL)
+     * @param url ���긽 臾몄옄�뿴(URL)
+     * @return  寃��궗 寃곌낵
+     */
+    public static boolean verifyUrl(String url) {
+        return verifyRegular(url, Regular.URL);
+    }
+
+    /**
+     * �젙洹쒖떇 寃��궗(IP)
+     * @param ip ���긽 臾몄옄�뿴(IP)
+     * @return 寃��궗 寃곌낵
+     */
+    public static boolean verifyIp(String ip) {
+        return  verifyRegular(ip, Regular.IP);
+    }
+
+    /**
+     * �젙洹쒖떇 寃��궗
+     * @param value ���긽 臾몄옄�뿴
+     * @param regular �젙洹쒖떇 寃��궗瑜� �븷 �젙洹쒖떇 援щЦ
+     * @return 寃��궗 寃곌낵
+     */
+    public static boolean verifyRegular(String value, String regular) {
+        if (!StringUtils.isEmpty(value)) {
+            return Pattern.matches(regular, value);
+        }
+        return false;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/util/ConvertUtil.java b/src/main/java/kr/wisestone/owl/util/ConvertUtil.java
index bf303f0..976e02b 100644
--- a/src/main/java/kr/wisestone/owl/util/ConvertUtil.java
+++ b/src/main/java/kr/wisestone/owl/util/ConvertUtil.java
@@ -3,10 +3,10 @@
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
 import kr.wisestone.owl.constant.MsgConstants;
+import kr.wisestone.owl.constant.Regular;
 import kr.wisestone.owl.exception.OwlRuntimeException;
-import kr.wisestone.owl.vo.CompanyFieldVo;
-import kr.wisestone.owl.vo.IspFieldVo;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -567,9 +567,8 @@
      */
     public static long ipToLong(String ipAddress) {
         long result = 0;
-        String reg = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" +
-                        ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
-        if (!StringUtils.isEmpty(ipAddress) && !Pattern.matches(reg, ipAddress)) {
+
+        if (!StringUtils.isEmpty(ipAddress) && !Pattern.matches(Regular.IP, ipAddress)) {
             return result;
         } else {
             String[] ipAddressArr = ipAddress.split("\\.");
@@ -582,4 +581,23 @@
         return result;
     }
 
+
+    /**
+     * 肄ㅻ쭏濡� 援щ텇�맂 臾몄옄�뿴�쓣 IP 諛곗뿴濡� 蹂��솚
+     * @param ipAddressList 肄ㅻ쭏濡� 援щ텇�맂 IP 臾몄옄�뿴
+     * @return �젙�닔濡� 蹂��솚�븳 諛곗뿴
+     */
+    public static List<Long> ipToLongs(String ipAddressList) {
+        if (!StringUtils.isEmpty(ipAddressList)) {
+            String[] split = ipAddressList.split(CommonUtil.COMMA);
+            List<Long> longs = Lists.newArrayList();
+            for (String str : split) {
+                longs.add(ipToLong(str));
+            }
+            return longs;
+        }
+
+        return null;
+    }
+
 }
diff --git a/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java b/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
index e97f840..b6b6e74 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
@@ -14,9 +14,7 @@
     private String email;
     private String url;
     private List<String> urls;
-    private long ip;
-    private String ipStart;
-    private String ipEnd;
+    private Long ip;
     private List<String> ipStarts = new ArrayList<>();
     private List<String> ipEnds = new ArrayList<>();
     private String memo;
@@ -25,6 +23,12 @@
 
     private Integer Page;
     private Integer PageSize;
+
+    public static final Long IP_DEFAULT = -1L;
+
+    public CompanyFieldCondition() {
+        this.ip = IP_DEFAULT;
+    }
 
     public static CompanyFieldCondition make(Map<String, Object> companyFieldCondition) {
         return ConvertUtil.convertMapToClass(companyFieldCondition, CompanyFieldCondition.class);
@@ -110,28 +114,12 @@
         this.urls = urls;
     }
 
-    public long getIp() {
+    public Long getIp() {
         return ip;
     }
 
-    public void setIp(long ip) {
+    public void setIp(Long ip) {
         this.ip = ip;
-    }
-
-    public String getIpStart() {
-        return ipStart;
-    }
-
-    public void setIpStart(String ipStart) {
-        this.ipStart = ipStart;
-    }
-
-    public String getIpEnd() {
-        return ipEnd;
-    }
-
-    public void setIpEnd(String ipEnd) {
-        this.ipEnd = ipEnd;
     }
 
     public List<String> getIpStarts() {
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 15d419f..2c84958 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
@@ -35,6 +35,8 @@
      * �씠�뒋 �긽�깭 �쑀�삎(READY / OPEN / CLOSE)
      */
     private String issueStatusType;
+    
+    private Long companyFieldId; // IP�뿉 �냽�빐�엳�뒗 �뾽泥� 李얠쓣 �븣 �궗�슜
 
     public IssueCustomFieldValueCondition(){}
 
@@ -172,4 +174,11 @@
         this.useParentIssueId = useParentIssueId;
     }
 
+    public Long getCompanyFieldId() {
+        return companyFieldId;
+    }
+
+    public void setCompanyFieldId(Long companyFieldId) {
+        this.companyFieldId = companyFieldId;
+    }
 }
diff --git a/src/main/resources/mybatis/query-template/companyField-template.xml b/src/main/resources/mybatis/query-template/companyField-template.xml
index 6e3eab6..9e13a19 100644
--- a/src/main/resources/mybatis/query-template/companyField-template.xml
+++ b/src/main/resources/mybatis/query-template/companyField-template.xml
@@ -47,7 +47,7 @@
                 </foreach>
             </when>
         </choose>
-        <if test="ip != null and ip != ''">
+        <if test="ip != null and ip != '' and ip > -1">
             AND INET_ATON(cf.ip_start) <![CDATA[ <= ]]> #{ip} AND INET_ATON(cf.ip_end) >= #{ip}
         </if>
         ORDER BY cf.register_date DESC
@@ -112,47 +112,6 @@
                 <foreach collection="urls" item="item" index="index" separator="or" open="(" close=")">
                     cf.url LIKE CONCAT('%',#{item},'%')
                 </foreach>
-            </when>
-        </choose>
-        <if test="id != '' and id != null">
-            AND cf.id not like CONCAT('%',#{id},'%')
-        </if>
-    </select>
-
-    <select id="findByIps" resultType="kr.wisestone.owl.domain.CompanyField" parameterType="kr.wisestone.owl.web.condition.CompanyFieldCondition">
-        SELECT
-        cf.id as id,
-        cf.name as name,
-        cf.email as email,
-        cf.url as url,
-        cf.ip_start AS ipStart,
-        cf.ip_end AS ipEnd
-        FROM
-        company_field cf
-        WHERE 1=1
-        <choose>
-            <when test="ipStart != null and ipStart != '' and ipEnd != null and ipEnd != ''">
-                AND (INET_ATON(cf.ip_start) BETWEEN #{ipStart} AND #{ipEnd} OR INET_ATON(cf.ip_end) BETWEEN #{ipStart} AND #{ipEnd}
-                OR #{ipStart} BETWEEN INET_ATON(cf.ip_start) AND INET_ATON(cf.ip_end) OR #{ipEnd} BETWEEN INET_ATON(cf.ip_start) AND INET_ATON(cf.ip_end))
-            </when>
-        </choose>
-    </select>
-
-    <select id="findByIpsAndIdNot" resultType="kr.wisestone.owl.domain.CompanyField" parameterType="kr.wisestone.owl.web.condition.CompanyFieldCondition">
-        SELECT
-        cf.id as id,
-        cf.name as name,
-        cf.email as email,
-        cf.url as url,
-        cf.ip_start AS ipStart,
-        cf.ip_end AS ipEnd
-        FROM
-        company_field cf
-        WHERE 1=1
-        <choose>
-            <when test="ipStart != null and ipStart != '' and ipEnd != null and ipEnd != ''">
-                AND (INET_ATON(cf.ip_start) BETWEEN #{ipStart} AND #{ipEnd} OR INET_ATON(cf.ip_end) BETWEEN #{ipStart} AND #{ipEnd}
-                OR #{ipStart} BETWEEN INET_ATON(cf.ip_start) AND INET_ATON(cf.ip_end) OR #{ipEnd} BETWEEN INET_ATON(cf.ip_start) AND INET_ATON(cf.ip_end))
             </when>
         </choose>
         <if test="id != '' and id != null">
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index b48ea17..a30841c 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -817,11 +817,13 @@
         HAVING concatUseValue LIKE CONCAT('%', #{useValue}, '%')
     </select>
 
-    <!--    IP/SITE �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 �뾽泥댁� �룞�씪�븳 �씠�뒋瑜� 議고쉶 -->
-    <select id="findByCustomFieldValueByCompany" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition">
+    <!-- �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠(SITE,IP) �뾽泥댁� �룞�씪�븳 �씠�뒋瑜� 議고쉶 -->
+    <select id="findByCustomFieldValueBySite" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition">
         SELECT
         issue.id as id,
         issue.title as title,
+        issc.ip_start AS ipStart,
+        issc.ip_end AS ipEnd,
         customFieldValue.customFieldType AS customFieldType,
         GROUP_CONCAT(customFieldValue.useValue ORDER BY customFieldValue.customFieldId ASC) AS concatUseValue
         FROM issue issue FORCE INDEX(reverseIndex)
@@ -833,11 +835,8 @@
         ) customFieldValue ON customFieldValue.issueId = issue.id
         LEFT OUTER JOIN issue_company issc ON issc.issue_id = issue.id
         WHERE issue.issue_type_id = #{issueTypeId}
-        <if test="customFieldType != null and customFieldType.equals('SITE')">
+        <if test="useValue != null and useValue != ''">
             AND issc.url LIKE CONCAT('%',#{useValue},'%')
-        </if>
-        <if test="customFieldType != null and customFieldType.equals('IP_ADDRESS')">
-            AND INET_ATON(issc.ip_start) <![CDATA[ <= ]]> #{useValue} AND INET_ATON(issc.ip_end) >= #{useValue}
         </if>
         <choose>
             <when test="issueStatusType != null">
diff --git a/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js b/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
index e33066e..2fdf2dd 100644
--- a/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
+++ b/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -693,7 +693,25 @@
 
                                         case "COMPANYFIELD_IP" :
                                             if ($rootScope.isDefined(scope.data.ipStart) && $rootScope.isDefined(scope.data.ipEnd)) {
-                                                makeTag += "<span>" + scope.data.ipStart + "<br>~<br>" + scope.data.ipEnd + "</span>";
+                                                let ipStartArr = [];
+                                                let ipEndArr = [];
+
+                                                if (scope.data.ipStart.indexOf(",") !== -1) {
+                                                    scope.data.ipStart = scope.data.ipStart.split(",");
+                                                    ipStartArr = angular.copy(scope.data.ipStart);
+                                                }
+                                                if (scope.data.ipEnd.indexOf(",") !== -1) {
+                                                    scope.data.ipEnd = scope.data.ipEnd.split(",");
+                                                    ipEndArr = angular.copy(scope.data.ipEnd);
+                                                }
+
+                                                if ($rootScope.isDefined(ipStartArr) && ipStartArr.toString() ===  scope.data.ipStart.toString()
+                                                        && $rootScope.isDefined(ipEndArr) && ipEndArr.toString() ===  scope.data.ipEnd.toString()) {
+                                                    scope.data.ipStart = scope.data.ipStart[0];
+                                                    scope.data.ipEnd = scope.data.ipEnd[0];
+                                                }
+                                                makeTag += "<span>" + scope.data.ipStart + "<br>~</br>" + scope.data.ipEnd + "</span>";
+
                                             }
                                             break;
 
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index dfb1129..92f5b8d 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -998,6 +998,7 @@
         "domain" : "�룄硫붿씤",
         "url"   : "url",
         "ipRange" : "ip ���뿭��",
+        "ipRangeFirst" : "ip ���뿭��(���몴)",
         "tel" : "�뿰�씫泥�",
         "code" : "肄붾뱶",
         "email" : "�씠硫붿씪",
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
index 5465d18..63fb5dd 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
@@ -382,8 +382,8 @@
 
                         for (let i=0; i<ipStartArr.length; i++) {
                             if ($rootScope.isDefined(ipStartArr[i+1])) {
-                                if((ipStartArr[i] >= ipStartArr[i+1] && ipStartArr[i] <= ipEndArr[i+1])
-                                    || (ipEndArr[i] >= ipStartArr[i+1] && ipEndArr[i] <= ipEndArr[i+1])) {
+                                if(((ipStartArr[i] >= ipStartArr[i+1] && ipStartArr[i] <= ipEndArr[i+1]) || (ipEndArr[i] >= ipStartArr[i+1] && ipEndArr[i] <= ipEndArr[i+1]))
+                                    || (ipStartArr[i+1] >= ipStartArr[i] && ipStartArr[i+1] <= ipEndArr[i]) || (ipEndArr[i+1] >= ipStartArr[i] && ipEndArr[i+1] <= ipEndArr[i])) {
                                     SweetAlert.warning($filter("translate")("companyField.ipRangeError"), $filter("translate")("companyField.ipRangeNotOverlap"));
                                     result = false;
                                     return;
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
index f3534dd..098a332 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
@@ -109,7 +109,7 @@
                         .setDName("url")
                         .setDAlign("text-center"));
                     $scope.vm.tableConfigs.push($tableProvider.config()
-                        .setHName("companyField.ipRange")
+                        .setHName("companyField.ipRangeFirst")
                         .setHWidth("width-120-p bold")
                         .setDName("ipRange")
                         .setDType("renderer")
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
index 0a71bb4..cd3fd03 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
@@ -349,6 +349,13 @@
                         statusName : $scope.vm.form.status
                     };
 
+                    //  ip ���뿭�� �쑀�슚�꽦 泥댄겕
+                    let result = ipRangeChk(content.ipStarts, content.ipEnds);
+                    if (!result) {
+                        $rootScope.spinner = false;
+                        return;
+                    }
+
                     CompanyField.modify($resourceProvider.getContent(
                         content,
                         $resourceProvider.getPageContent(0, 0))).then(function (result) {
@@ -367,6 +374,57 @@
 
                 }
 
+                //  ip ���뿭�� �쑀�슚�꽦 寃��궗
+                function ipRangeChk(ipStarts, ipEnds) {
+                    let result = true;
+
+                    if ($rootScope.isDefined(ipStarts) && $rootScope.isDefined(ipEnds)) {
+                        if (ipStarts.length !== ipEnds.length) {
+                            SweetAlert.warning($filter("translate")("companyField.ipRangeError"), $filter("translate")("companyField.ipRangeNotEnter"));
+                            result = false;
+                            return;
+                        }
+
+                        let ipStartArr = [];
+                        let ipEndArr = [];
+
+                        for (let i=0; i<ipStarts.length; i++) {
+                            let ipStart = ipToLong(ipStarts[i]);
+                            let ipEnd = ipToLong(ipEnds[i]);
+                            if (ipEnd < ipStart) {
+                                SweetAlert.warning($filter("translate")("companyField.ipRangeError"), $filter("translate")("companyField.ipStartNotLargerThanEnd"));
+                                result = false;
+                                return;
+                            }
+                            ipStartArr.push(ipStart);
+                            ipEndArr.push(ipEnd);
+                        }
+
+                        for (let i=0; i<ipStartArr.length; i++) {
+                            if ($rootScope.isDefined(ipStartArr[i+1])) {
+                                if(((ipStartArr[i] >= ipStartArr[i+1] && ipStartArr[i] <= ipEndArr[i+1]) || (ipEndArr[i] >= ipStartArr[i+1] && ipEndArr[i] <= ipEndArr[i+1]))
+                                    || (ipStartArr[i+1] >= ipStartArr[i] && ipStartArr[i+1] <= ipEndArr[i]) || (ipEndArr[i+1] >= ipStartArr[i] && ipEndArr[i+1] <= ipEndArr[i])) {
+                                    SweetAlert.warning($filter("translate")("companyField.ipRangeError"), $filter("translate")("companyField.ipRangeNotOverlap"));
+                                    result = false;
+                                    return;
+                                }
+                            }
+                        }
+                    }
+                    return result;
+                }
+
+                //  ip 二쇱냼 �닽�옄濡� 蹂��솚
+                function ipToLong(ip) {
+                    let result = 0;
+                    let ipArr = ip.split(".");
+
+                    for (let i=0; i<ipArr.length; i++) {
+                        result += parseInt(ipArr[i]) * Math.pow(256, 3-i);
+                    }
+                    return result;
+                }
+
                 // 硫붿씪 二쇱냼 input 李� 異붽� 踰꾪듉
                 function addTel() {
                     var arrayFull = true;      // 諛곗뿴�씠 媛��뱷 李� �엳�뒗吏� �뿬遺�

--
Gitblit v1.8.0