This commit is contained in:
subsub 2024-12-04 09:59:40 +09:00
commit 261cac3a20
7 changed files with 473 additions and 31 deletions

View File

@ -0,0 +1,7 @@
package kcc.com.srch.service;
import org.springframework.ui.ModelMap;
public interface SearchService {
public void searchListSet(SearchVO searchVO, ModelMap model);
}

View File

@ -12,11 +12,20 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
public class SearchVO extends ComDefaultVO implements Serializable { public class SearchVO implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/*
* 기본 검색자
*/
private String searchType;
private String searchKeyword;
private String pagingSize;
private String page;
/* /*
* application 시작 * application 시작
*/ */
@ -54,7 +63,7 @@ public class SearchVO extends ComDefaultVO implements Serializable {
private String contactHp; private String contactHp;
@JsonProperty("P_CONTACT_HP") @JsonProperty("P_CONTACT_HP")
private String pContactHp; private String pcontactHp;
@JsonProperty("APPLICATION_OBJ") @JsonProperty("APPLICATION_OBJ")
private String applicationObj; private String applicationObj;
@ -69,6 +78,158 @@ public class SearchVO extends ComDefaultVO implements Serializable {
* application * application
*/ */
/*
* board 시작
*/
@JsonProperty("TEAM_NO")
private String teamNo; // 번호
@JsonProperty("TEAM_TITLE")
private String teamTitle; // 제목
@JsonProperty("TEAM_CONTENT")
private String teamContent; // 내용
@JsonProperty("TEAM_REGNM")
private String teamRegnm; // 작성자
@JsonProperty("TEAM_REGDATE")
private String teamRegdate; // 작성일
@JsonProperty("TEAM_GUBUN")
private String teamGubun; // 구분
/*
* board
*/
/*
* completed 시작
*/
@JsonProperty("CASE_NO")
private String caseNo; // 사건번호
@JsonProperty("SDATE")
private String sdate; // 등록일자
@JsonProperty("CASE_GUBUN_NM")
private String caseGubunNm; // 사건구분명
@JsonProperty("CASE_EXAMINER_NM")
private String caseExaminerNm; // 담당자이름
@JsonProperty("MEDIATION_BIG")
private String mediationBig; // 대분류
@JsonProperty("MEDIATION_SMALL")
private String mediationSmall; // 소분류
@JsonProperty("CASE_DATE")
private String caseDate; // 접수일자
@JsonProperty("ROAD_ADDR1")
private String roadAddr1; // 신청인소재지
@JsonProperty("KPI_ASSETS1")
private String kpiAssets1; // 피신청인자산총액
@JsonProperty("CONFERENCE_NAMES")
private String conferenceNames; // 종료회차
@JsonProperty("FILE_NAME")
private String fileName; // 첨부파일내용
@JsonProperty("FIX_DAY")
private String fixDay; // 종료일자
/*
* completed
*/
/*
* conference 시작
*/
@JsonProperty("STATE_PRO")
private String statePro; // 진행 상태
@JsonProperty("DLBRTMTR_CNT")
private int dlbrtmtrCnt; // 보고 안건
@JsonProperty("ENDMTR_CNT")
private int endmtrCnt; // 심의 안건
@JsonProperty("CONFERENCE_PLACE")
private String conferencePlace; // 장소
@JsonProperty("CONFERENCE_GUBUN_NM")
private String conferenceGubunNm; // 회의 구분
/*
* counsel
*/
@JsonProperty("COUNSEL_SEQ")
private String counselSeq; // 상담번호
@JsonProperty("APPLCNT_NM")
private String applcntNm; // 신청인
@JsonProperty("MEDIATION_TYPE_NAME")
private String mediationTypeName; // 조정유형
@JsonProperty("COUNSEL_TITLE")
private String counselTitle; // 상담제목
@JsonProperty("COUNSEL_REGDATE")
private String counselRegdate; // 등록일
@JsonProperty("MANAGER_NM")
private String managerNm; // 담당자
@JsonProperty("NOTICE_DATE")
private String noticeDate; // 처리일자
@JsonProperty("COUNSEL_STATE_NAME")
private String counselStateName; // 상태
@JsonProperty("CIVIL_TYPE")
private String civilType; // 민원 유형
@JsonProperty("NOTICE_TYPE")
private String noticeType; // 공지 유형
/*
* counsel 시작
*/
/*
* process시작
*/
@JsonProperty("DOC_ID")
private String docId; // 사건번호
@JsonProperty("STATE_PRO_NM")
private String stateProNm; // 현재 단계
@JsonProperty("STATE_PRO_NEXT")
private String stateProNext; // 다음 단계
@JsonProperty("PRO_DATE")
private int proDate; // 진행일수
@JsonProperty("TERM_CHECK")
private String termCheck; // 기간 경과 여부
@JsonProperty("TIMHDER_ASSIGN")
private String timhderAssign; // 팀장 배정
/*
* process 시작
*/
} }

View File

@ -0,0 +1,57 @@
package kcc.com.srch.service.impl;
import java.math.BigDecimal;
import java.util.Map;
import org.springframework.stereotype.Service;
import org.springframework.ui.ModelMap;
import com.fasterxml.jackson.databind.node.TextNode;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import kcc.com.srch.service.SearchService;
import kcc.com.srch.service.SearchVO;
import seed.utils.FairnetUtils;
@Service("SearchService")
public class SearchServiceImpl extends EgovAbstractServiceImpl implements SearchService {
@Override
public void searchListSet(
SearchVO searchVO,
ModelMap model
){
// Map<String, Object> application = FairnetUtils.searchApplication("application", "테스트", "3", "1");
Map<String, Object> board = FairnetUtils.searchApplication("board", searchVO.getSearchKeyword(), searchVO.getPagingSize(), "1");
Map<String, Object> completed = FairnetUtils.searchApplication("completed", searchVO.getSearchKeyword(), searchVO.getPagingSize(), "1");
Map<String, Object> conference = FairnetUtils.searchApplication("conference", searchVO.getSearchKeyword(), searchVO.getPagingSize(), "1");
Map<String, Object> counsel = FairnetUtils.searchApplication("counsel", searchVO.getSearchKeyword(), searchVO.getPagingSize(), "1");
Map<String, Object> process = FairnetUtils.searchApplication("process", searchVO.getSearchKeyword(), searchVO.getPagingSize(), "1");
BigDecimal totCnt = new BigDecimal(0);
totCnt = totCnt.add(getTotCnt(board));
totCnt = totCnt.add(getTotCnt(completed));
totCnt = totCnt.add(getTotCnt(conference));
totCnt = totCnt.add(getTotCnt(counsel));
totCnt = totCnt.add(getTotCnt(process));
model.addAttribute("totCnt", totCnt);
model.addAttribute("board", board);
model.addAttribute("completed", completed);
model.addAttribute("conference", conference);
model.addAttribute("counsel", counsel);
model.addAttribute("process", process);
}
private BigDecimal getTotCnt(Map<String, Object> map) {
if (map != null) {
String totcntStr = map.get("totcnt").toString();
return new BigDecimal(totcntStr);
}
return new BigDecimal(0);
}
}

View File

@ -1,26 +1,35 @@
package kcc.com.srch.web; package kcc.com.srch.web;
import java.util.Map;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import seed.utils.FairnetUtils; import kcc.com.srch.service.SearchService;
import kcc.com.srch.service.SearchVO;
@Controller @Controller
public class SearchController { public class SearchController {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchController.class); private static final Logger LOGGER = LoggerFactory.getLogger(SearchController.class);
@Autowired
private SearchService searchService;
@RequestMapping(value = "/cmm/srch/Search.do") @RequestMapping(value = "/com/srch/Search.do")
public String totalSearch( public String totalSearch(
ModelMap model
, @ModelAttribute("searchVO") SearchVO searchVO
) throws Exception { ) throws Exception {
Map<String, Object> application = FairnetUtils.searchApplication("application", "테스트", "-1", "1"); searchVO.setPagingSize("3");
return ""; searchService.searchListSet(searchVO, model);
return "com/srch/searchList";
} }
} }

View File

@ -24,6 +24,7 @@ import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.TextNode;
import com.ibm.icu.text.SimpleDateFormat; import com.ibm.icu.text.SimpleDateFormat;
import kcc.com.srch.service.SearchVO; import kcc.com.srch.service.SearchVO;
@ -324,12 +325,12 @@ public class FairnetUtils {
* @date : 2024.12.02 * @date : 2024.12.02
* @description : * @description :
* @param searchType : * @param searchType :
* application - 조정신청 * application - 조정신청 (미사용)
* , board - teamboard * , board - 게시판
* , completed - 종료건 * , completed - 사건종료관리
* , conference - 협의회 * , conference - 협의회관리
* , counsel - 상담 * , counsel - 상담관리
* , process - 조정 진행중 * , process - 사건처리관리
* @param searchKeyword : 검색어 * @param searchKeyword : 검색어
* @param pagingSize : 페이징 크기 (무한: -1) * @param pagingSize : 페이징 크기 (무한: -1)
* @param page : 페이지 * @param page : 페이지
@ -342,41 +343,32 @@ public class FairnetUtils {
, String page , String page
) { ) {
SearchGlobalSet searchGlobalSet = new SearchGlobalSet(); String url = new SearchGlobalSet().getHost()
Map<String, Object> result = new HashMap<String, Object>();
RestTemplate restTemplate = new RestTemplate();
ObjectMapper objectMapper = new ObjectMapper();
String url = searchGlobalSet.getHost()
+ "/srch_resultjson?" + "/srch_resultjson?"
// + "w=application"
+ "w=" + searchType + "w=" + searchType
// + "&q=테스트"
+ "&q=" + searchKeyword + "&q=" + searchKeyword
// + "&outmax=-1"
+ "&outmax=" + pagingSize + "&outmax=" + pagingSize
+ "&section=" + "&section="
// + "&pg=1"
+ "&pg=" + page; + "&pg=" + page;
try { try {
String response = restTemplate.getForObject(url, String.class); String response = new RestTemplate().getForObject(url, String.class);
JsonNode root = objectMapper.readTree(response); JsonNode root = new ObjectMapper().readTree(response);
JsonNode listNode = root.path("section_list") JsonNode listNode = root.path("section_list")
.path(0) .path(0)
.path("section") .path("section")
.path(0); .path(0);
// .path("att_list");
if (listNode.path("att_list").isArray()) { if (listNode.path("att_list").isArray()) {
List<SearchVO> searchList = objectMapper.convertValue( List<SearchVO> searchList = new ObjectMapper().convertValue(
listNode.path("att_list"), new TypeReference<List<SearchVO>>() {} listNode.path("att_list"), new TypeReference<List<SearchVO>>() {}
); );
result.put("totcnt", listNode.get("totcnt")); Map<String, Object> result = new HashMap<String, Object>();
result.put("totcnt", ((TextNode) listNode.get("totcnt")).asText());
result.put("list", searchList); result.put("list", searchList);
return result; return result;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); System.out.println(e.getMessage());
} }
return null; return null;

View File

@ -104,6 +104,7 @@
<pattern>/gtm/*</pattern><!-- AS-IS 분쟁조정--> <pattern>/gtm/*</pattern><!-- AS-IS 분쟁조정-->
<pattern>/xxx/*</pattern><!-- 테스트 페이지 --> <pattern>/xxx/*</pattern><!-- 테스트 페이지 -->
<pattern>/common/gtm/multiFileList.do</pattern><!-- AS-IS 분쟁조정--> <pattern>/common/gtm/multiFileList.do</pattern><!-- AS-IS 분쟁조정-->
<pattern>/com/srch/*</pattern>
</decorator> </decorator>
<decorator name="seedNolayout" page="/WEB-INF/jsp/layout/seedNoLayout.jsp"> <decorator name="seedNolayout" page="/WEB-INF/jsp/layout/seedNoLayout.jsp">

View File

@ -0,0 +1,215 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<link rel="stylesheet" type="text/css" href="/css/jquery-ui.css" >
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="/js/beta.fix.js"></script>
<script type="text/javascript" src="/js/datepicker.js"></script>
<!-- <script type="text/javascript" src="/js/search.js"></script> 검색관련 js -->
<script type="text/javascript">
function goSearch(obj){
document.search.submit();
}
</script>
<style>
.page-content{padding-left:0;padding-right:0;}
.cs-search-wrapper {margin-top:40px;font-family:'Malgun Gothic';}
.cs-search{position: relative;}
.cs-search .blue_window{display:inline-block;width:561px;height:40px;border: 1px solid #676fb2;border-right:0;}
.cs-search label{background:url(/img/search-fofair.png) no-repeat 15px 50%;width:147px;height:40px;margin-bottom:0;
text-indent:-999em;}
.cs-search .query{width:100%;height:100%;padding:4px 10px;border:0;font-size:15px;}
.cs-search .query::-webkit-input-placeholder {font-family:'Malgun Gothic';color: #757575;font-size:15px;letter-spacing: -1px;}
.cs-search .query::-moz-placeholder {font-family:'Malgun Gothic';color: #757575;font-size:15px;letter-spacing: -1px;}
.cs-search .query:-ms-input-placeholder {font-family:'Malgun Gothic';color: #757575;font-size:15px;letter-spacing: -1px;}
.cs-search .query:-moz-placeholder {font-family:'Malgun Gothic';color: #757575;font-size:15px;letter-spacing: -1px;}
.cs-search .cs-search-btn{width:57px;height:40px;white-space: nowrap;background: #818ce3;color: #fff;-moz-box-shadow: inset 0 0 10px #5f6cd4;-webkit-box-shadow: inset 0 0 10px #5f6cd4;box-shadow:inset 0 0 10px #5f6cd4;}
.cs-search-lnb{overflow:hidden;list-style:none;border-bottom:1px solid #e8e8e8}
.cs-search-lnb li{float:left;}
.cs-search-lnb li:first-child{margin-left:139px;}
.cs-search-lnb li a{position:relative;display:block;height:54px;margin: 2px 8px 0;padding: 0 8px;line-height:54px;}
.cs-search-lnb li a.on{color: #5f6cd4;font-weight:700}
.cs-search-lnb li a.on:after{content:'';display:block;position:absolute;left:0;bottom:0;width:100%;height:3px;background:#5f6cd4}
.cs-content-search{padding:16px 0 0 163px;}
.cs-result-stats{font-size:13px;color:#808080;margin-bottom:38px;}
.result-box{max-width:618px;padding:16px 0;border-top:1px solid #e8e8e8}
.result-box h2{margin-bottom: 10px;font-size:15px;}
.result-link{font-size:18px;color:#1a0dab;}
.result-link.more{font-size:16px;}
.result-link:hover{text-decoration:underline;}
.result-list{position: relative;margin-bottom:23px;}
.result-list:last-child{margin-bottom:0;}
.result-date{color:#545454;line-height: 1.4;}
.result-content{padding:4px 0;text-overflow: ellipsis;white-space: nowrap;overflow: hidden;}
</style>
<div class="cs-search-wrapper">
<div class="search-form-wrap">
<form:form name="search" id="search" action="/com/srch/Search.do" class="search-form" method="post">
<fieldset>
<div class="cs-search">
<label for="query">kofire</label>
<span class="blue_window">
<input name="searchKeyword" id="searchKeyword" type="text" value="${searchVO.searchKeyword}" class="query" title="검색어 입력" placeholder="한국공정거래조정원 통합검색" >
</span>
<a style="display: unset;"><input type="button" value="검색" class="cs-search-btn" onClick="javascript:goSearch(this);" />&nbsp;
<!-- <input class="" name="reChk" id="reChk" onclick="checkReSearch();" type="checkbox"/>결과내재검색</a> -->
</a>
</div>
</fieldset>
</form:form>
</div>
<c:if test="${not empty searchVO.searchKeyword}">
<ul class="cs-search-lnb">
<li><a href="#none" onClick="javascript:doCollection('ALL');" class="on">통합검색</a></li>
<li>
<a href="#none" onClick="process">
사건처리 관리 [${empty board.totcnt ? "0":board.totcnt}]
</a>
</li>
<li>
<a href="#none" onClick="conference">
협의회 관리 [${empty completed.totcnt ? "0":completed.totcnt}]
</a>
</li>
<li>
<a href="#none" onClick="completed">
사건종료 관리 [${empty conference.totcnt ? "0":conference.totcnt}]
</a>
</li>
<li>
<a href="#none" onClick="board">
게시판 [${empty counsel.totcnt ? "0":counsel.totcnt}]
</a>
</li>
<li>
<a href="#none" onClick="counsel">
상담 관리 [${empty process.totcnt ? "0":process.totcnt}]
</a>
</li>
</ul>
<div class="cs-content-search">
<div class="cs-result-stats">검색어 '검색어'에 대해 총 ${totCnt}건이 검색되었습니다.</div>
<div class="result-box cass">
<h2>사건처리관리</h2>
<c:forEach var="list" items="${process.list}" varStatus="sts1">
<div class="result-list">
<a href="${list.url}" class="result-link" target="_blank">${list.docId}</a>
<div class="result-content">사건구분: ${list.caseGubunNm} </div>
<div class="result-content">신청인: ${list.companyCeo}, 신청인 상호명: ${list.applcntCompany}, 신청인소재지: ${list.roadAddr1}, 신청경로: ${list.docCheck} </div>
<div class="result-content">신청인 담당자 연락처: ${list.contactHp}</div>
<div class="result-content">피신청인: ${list.respondentCeo}, 피신청인 상호명: ${list.respondentCompany}, 자산총액: ${list.kpiAssets1} </div>
<div class="result-content">피신청인 담당자 연락처: ${list.pcontactHp}</div>
<div class="result-content">신청취지: ${list.applicationObj}</div>
<div class="result-content">현재단계: ${list.stateProNm}, 다음단계: ${list.stateProNext}, 기간경과여부: ${list.termCheck}</div>
<div class="result-content">조정결과: ${list.mediationBig} [${list.mediationSmall}]</div>
<div class="result-content">담당자: ${list.caseExaminerNm}, 진행일수: <span class="prodate_put">${list.proDate}</span> </div>
<div class="org_prodate" style="display:none;">${list.proDate} </div>
<span class="result-date">접수일 : ${list.caseDate} </span>
</div>
</c:forEach>
<a href="#none" class="result-link.more" onClick="javascript:doCollection('');">더보기</a>
</div>
<div class="result-box">
<h2>협의회관리</h2>
<c:forEach var="list" items="${conference.list}" varStatus="sts1">
<div class="result-list">
<a href="${list.url}" class="result-link" target="_blank">${list.conferenceNames}</a>
<div class="result-content">사건번호: ${list.caseNo} </div>
<div class="result-content">신청인: ${list.companyCeo}, 신청인상호명: ${list.applcntCompany}, 신청인 소재지: ${list.roadAddr1} </div>
<div class="result-content">신청인 담당자 전화번호: ${list.contactHp} </div>
<div class="result-content">피신청인: ${list.respondentCeo}, 피신청인상호명: ${list.respondentCompany} </div>
<div class="result-content">피신청인 담당자 전화번호: ${list.pcontactHp} </div>
<div class="result-content">신청취지: ${list.applicationObj}</div>
<div class="result-content">조정결과: ${list.mediationBig} [${list.mediationSmall}]</div>
<div class="result-content">회의구분: ${list.conferenceGubunNm} [${list.stateProNm}]</div>
<div class="result-content">보고안건: ${list.dlbrtmtrCnt}, 심의안건: ${list.endmtrCnt} </div>
<div class="result-content">참석의원: ${list.memberName} </div>
<div class="result-content">회의장소: ${list.conferencePlace} </div>
<span class="result-date">개최일시 : ${list.fixDay} </span>
</div>
</c:forEach>
<a href="#none" class="result-link.more" onClick="javascript:doCollection('');">더보기</a>
</div>
<div class="result-box">
<h2>사건종료관리</h2>
<c:forEach var="list" items="${completed.list}" varStatus="sts1">
<div class="result-list">
<a href="${list.url}" class="result-link" target="_blank">${list.docId}</a>
<div class="result-content">신청인: ${list.companyCeo}, 피신청인: ${list.applcntCompany}, 신청인소재지: ${list.roadAddr1} </div>
<div class="result-content">신청인 담당자 연락처: ${list.contactHp} </div>
<div class="result-content">피신청인: ${list.respondentCeo}, 피신청인: ${list.respondentCompany} </div>
<div class="result-content">피신청인 담당자 연락처: ${list.pcontactHp} </div>
<div class="result-content">신청취지: ${list.applicationObj}</div>
<div class="result-content">조정결과: ${list.mediationBig} [${list.mediationSmall}]</div>
<div class="result-content">접수일: ${list.caseDate}, 종료회차: ${list.conferenceNames} </div>
<div class="result-content">담당자: ${list.caseExaminerNm} </div>
<span class="result-date">종료일자 : ${list.fixDay} </span>
</div>
</c:forEach>
<a href="#none" class="result-link.more" onClick="javascript:doCollection('');">더보기</a>
</div>
<div class="result-box">
<h2>게시판</h2>
<c:forEach var="list" items="${board.list}" varStatus="sts1">
<div class="result-list">
<a href="${list.url}" class="result-link" target="_blank">${list.teamTitle}</a>
<div class="result-content">내용: ${list.teamContent} </div>
<div class="result-content">작성자: ${list.teamRegnm} </div>
<span class="result-date">작성일: ${list.teamRegdate} </span>
</div>
</c:forEach>
<a href="#none" class="result-link.more" onClick="javascript:doCollection('');">더보기</a>
</div>
<div class="result-box">
<h2>상담관리</h2>
<c:forEach var="list" items="${counsel.list}" varStatus="sts1">
<div class="result-list">
<a href="${list.url}" class="result-link" target="_blank">${list.counselTitle}</a>
<div class="result-content">상담번호: ${list.counselSeq} </div>
<div class="result-content">신청인: ${list.applcntNm}, 조정유형: ${list.mediationTypeName} </div>
<div class="result-content">상담방식: ${list.civilType}, 상담경로: ${list.noticeType} </div>
<div class="result-content">진행상태: ${list.counselStateName}, 처리일자: ${list.noticeDate}, 담당자: ${list.managerNm} </div>
<span class="result-date">등록일: ${list.counselRegdate} </span>
</div>
</c:forEach>
<a href="#none" class="result-link.more" onClick="javascript:doCollection('');">더보기</a>
</div>
<%-- <div class="result-box h2">
<p>'<%=query %>'에 대한 검색결과가 없습니다.</p>
<ul>
<li>단어의 철자가 정확한지 확인해 보세요.</li>
<li>한글을 영어로 혹은 영어를 한글로 입력했는지 확인해 보세요.</li>
<li>검색어의 단어 수를 줄이거나, 보다 일반적인 검색어로 다시 검색해 보세요.</li>
<li>두 단어 이상의 검색어인 경우, 띄어쓰기를 확인해 보세요.</li>
</ul>
</div> --%>
</div>
</c:if>
</div>