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"; } src/main/java/kr/wisestone/owl/constant/Regular.java
New file @@ -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.?#]+)?"; } 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); } 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); } 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()); 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 { @@ -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,6 +340,7 @@ /** * 도메인이 동일한 업체 찾기 * * @param issueForm IssueForm * @return IssueForm */ @@ -400,20 +400,74 @@ } /** * 입력한 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 issueCompanyFields 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 (ip > IP_DEFAULT) { List<CompanyField> companyFields = this.companyFieldService.findAll(); if(companyFields != null && companyFields.size() > 0) { for (Map<String, Object> companyField : companyFields) { CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); 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) { @@ -432,6 +486,7 @@ } } } return companyFieldVo; } private User convertToUser(String token) { @@ -487,114 +542,56 @@ } /** * 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) { for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { String useValue = issueCustomFieldValueForm.getUseValue(); if (CommonUtil.verifyIp(useValue)) { long ip = ConvertUtil.ipToLong(useValue); if (condition.getIp() <= IP_DEFAULT) { condition.setIp(ip); } else { throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_IP_ERROR)); } } 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)); } } } } } } return condition; } String ConvertToString(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) { String concatUseValue = ""; int useIdx = 0; for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { userValues.add(issueCustomFieldValueForm.getUseValue()); 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)) { long ip = ConvertUtil.ipToLong(useValue); customFieldType = IP_ADDRESS.toString(); if (cntIp == 0){ 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); } if (cntSite == 0) { condition.setUrl(urls); } cntSite ++; }*/ if (useIdx > 0) { concatUseValue = concatUseValue.concat(comma); concatUseValue = concatUseValue.concat(CommonUtil.COMMA); } concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue()); useIdx++; @@ -602,38 +599,44 @@ } } // 추가 할 url or ip에 포함되어있는 파트너 찾기 if ((condition.getIp() > 0) || (condition.getUrl() != null && !condition.getUrl().equals(""))) { this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields); return concatUseValue; } issueForm.setIssueCompanyFields(issueCompanyFields); issueForm.setIssueIspFields(issueIspFields); issueForm.setIssueHostingFields(issueHostingFields); 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"); 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); } @@ -851,6 +854,7 @@ /** * Issue를 IssueVo로 변환(하위이슈의 파트너 정보 상속 시 필요) * * @param issue Issue * @return IssueVo */ @@ -1070,6 +1074,7 @@ /** * 날짜 유효성 체크 * * @param startDate 시작 일자(문자) * @param completeDate 종료 일자(문자) */ @@ -1083,6 +1088,7 @@ /** * 날짜 유효성 체크 * * @param start 시작 일자 * @param end 종료 일자 */ @@ -1512,8 +1518,7 @@ 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()); } @@ -2267,7 +2272,6 @@ UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class); log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(userVo, ElasticSearchConstants.ISSUE_MODIFY)); } private Issue saveIssue(IssueForm issueForm, CheckIssueData checkIssueData) { @@ -3440,6 +3444,7 @@ /** * 엑셀로 입력한 파트너 정보 저장 * * @param issueForm IssueForm */ private void setIssuePartners(IssueForm issueForm, Issue issue) { @@ -3607,6 +3612,7 @@ /** * 엑셀에 업체명을 입력하지 않았을 경우 같은 도메인 업체 찾기 * * @param issueForm IssueForm */ private void findPartnerByDomain(IssueForm issueForm) { @@ -3695,6 +3701,7 @@ /** * cell String으로 변환 함수 * * @param cell Cell * @param isNull boolean * @return String @@ -3714,6 +3721,7 @@ /** * cell NULL 체크 함수 * 빈 값이 아닌 cell 체크 * * @param cell Cell * @return boolean */ @@ -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) { @@ -4390,6 +4399,7 @@ /** * 상위이슈의 파트너 정보 상속받기 * * @param issue Issue * @param parentIssue Issue * @return Issue 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; } } 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; } } 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() { src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
@@ -36,6 +36,8 @@ */ private String issueStatusType; private Long companyFieldId; // IP에 속해있는 업체 찾을 때 사용 public IssueCustomFieldValueCondition(){} public static IssueCustomFieldValueCondition make(Map<String, Object> conditions) { @@ -172,4 +174,11 @@ this.useParentIssueId = useParentIssueId; } public Long getCompanyFieldId() { return companyFieldId; } public void setCompanyFieldId(Long companyFieldId) { this.companyFieldId = companyFieldId; } } 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"> 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"> 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; src/main/webapp/i18n/ko/global.json
@@ -998,6 +998,7 @@ "domain" : "도메인", "url" : "url", "ipRange" : "ip 대역대", "ipRangeFirst" : "ip 대역대(대표)", "tel" : "연락처", "code" : "코드", "email" : "이메일", 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; 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") 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; // 배열이 가득 차 있는지 여부