parent
b1a2ff92ee
commit
3b4a3134cf
@ -0,0 +1,49 @@
|
||||
package go.kr.project.biz.minwon.init.model;
|
||||
|
||||
import go.kr.project.system.common.model.DefaultVO;
|
||||
import go.kr.project.system.common.model.PagingVO;
|
||||
import lombok.*;
|
||||
|
||||
public class MinwonInitDto {
|
||||
|
||||
|
||||
public static class Request {
|
||||
@Getter
|
||||
@Setter
|
||||
public static class SearchMinwonInitList extends PagingVO {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static class Response {
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public static class InitAnswers {
|
||||
|
||||
private String mmIngb; //등록구분
|
||||
private String asBbsNo; //목록번호
|
||||
private String mmSgnm; //신고자
|
||||
private String mmSgtel; //담당자
|
||||
private String asTel; //전화번호
|
||||
private String asJsdate; //접수일자
|
||||
private String asLimitDt; //처리기한
|
||||
private String mmDate; //위반일자
|
||||
private String mmImagegb; //첨부
|
||||
private int mmImagecnt; //사진
|
||||
private String mmSgcont; //위반내용
|
||||
private String asJsno; //접수번호
|
||||
private String mmCarno; //차량번호
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
package go.kr.project.biz.minwon.init.repository;
|
||||
|
||||
import com.querydsl.core.types.Projections;
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||
import go.kr.project.biz.minwon.init.model.MinwonInitDto;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static go.kr.project.domain.entity.QCpAnswer.cpAnswer;
|
||||
import static go.kr.project.domain.entity.QCpMain.cpMain;
|
||||
|
||||
@Repository
|
||||
@RequiredArgsConstructor
|
||||
public class MinwonInitQueryDslRepository {
|
||||
|
||||
private final JPAQueryFactory queryFactory;
|
||||
|
||||
public List<MinwonInitDto.Response.InitAnswers> findInitAnswers(MinwonInitDto.Request.SearchMinwonInitList dto) {
|
||||
|
||||
List<MinwonInitDto.Response.InitAnswers> result = queryFactory
|
||||
.select(
|
||||
Projections.fields(
|
||||
MinwonInitDto.Response.InitAnswers.class,
|
||||
cpMain.mmDlgb,
|
||||
cpAnswer.asBbsNo,
|
||||
cpAnswer.asUser,
|
||||
cpMain.mmSgtel,
|
||||
cpAnswer.asTel,
|
||||
cpAnswer.asJsdate,
|
||||
cpAnswer.asLimitDt,
|
||||
cpMain.mmDate,
|
||||
cpMain.mmImagegb,
|
||||
cpMain.mmImagecnt,
|
||||
cpMain.mmSgcont,
|
||||
cpAnswer.asJsno,
|
||||
cpMain.mmCarno
|
||||
)
|
||||
)
|
||||
.from(cpMain)
|
||||
.innerJoin(cpAnswer).on(cpMain.mmCode.eq(cpAnswer.asMmcode))
|
||||
.where(
|
||||
cpMain.mmState.eq("01"),
|
||||
cpMain.mmDlgb.eq("2")
|
||||
)
|
||||
.fetch();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
package go.kr.project.biz.minwon.init.service;
|
||||
|
||||
import go.kr.project.biz.minwon.init.model.MinwonInitDto;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface MinwonInitService {
|
||||
|
||||
|
||||
List<MinwonInitDto.Response.InitAnswers> findInitAnswers(MinwonInitDto.Request.SearchMinwonInitList dto);
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package go.kr.project.biz.minwon.init.service.impl;
|
||||
|
||||
import go.kr.project.biz.minwon.init.model.MinwonInitDto;
|
||||
import go.kr.project.biz.minwon.init.repository.MinwonInitQueryDslRepository;
|
||||
import go.kr.project.biz.minwon.init.service.MinwonInitService;
|
||||
import go.kr.project.domain.repo.cp.CpAnswerRepository;
|
||||
import go.kr.project.domain.repo.cp.CpMainRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class MinwonInitServiceImpl implements MinwonInitService {
|
||||
|
||||
private final CpMainRepository cpMainRepository;
|
||||
private final CpAnswerRepository cpAnswerRepository;
|
||||
private final MinwonInitQueryDslRepository minwonInitQueryDslRepository;
|
||||
|
||||
@Override
|
||||
public List<MinwonInitDto.Response.InitAnswers> findInitAnswers(MinwonInitDto.Request.SearchMinwonInitList dto) {
|
||||
|
||||
return minwonInitQueryDslRepository.findInitAnswers(dto);
|
||||
}
|
||||
}
|
||||
@ -1,16 +1,372 @@
|
||||
<%--
|
||||
Created by IntelliJ IDEA.
|
||||
User: kurt
|
||||
Date: 2025. 7. 30.
|
||||
Time: 오후 2:44
|
||||
To change this template use File | Settings | File Templates.
|
||||
--%>
|
||||
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||
<html>
|
||||
<head>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
init test
|
||||
</body>
|
||||
</html>
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<!-- Main body -->
|
||||
<div class="main_body">
|
||||
<section id="section8" class="main_bars">
|
||||
<div class="bgs-main">
|
||||
<section id="section5">
|
||||
<div class="sub_title"></div>
|
||||
<button type="button" onclick="location.href='<c:url value='/template/noticeSample/register.do'/>'" class="newbtn bg1">등록</button>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
<div class="contants_body">
|
||||
<div class="gs_b_top">
|
||||
<ul class="lef">
|
||||
<li class="th">검색구분</li>
|
||||
<li>
|
||||
<select id="searchCondition" name="searchCondition" class="input">
|
||||
<option value="">검색구분</option>
|
||||
<option value="title" <c:if test="${paramVO.searchCondition eq 'title'}">selected</c:if>>제목</option>
|
||||
<option value="contents" <c:if test="${paramVO.searchCondition eq 'contents'}">selected</c:if>>내용</option>
|
||||
<option value="writer" <c:if test="${paramVO.searchCondition eq 'writer'}">selected</c:if>>수정자명</option>
|
||||
</select>
|
||||
</li>
|
||||
<li class="th">검색어</li>
|
||||
<li><input type="text" id="searchKeyword" name="searchKeyword" class="input" value="${param.searchKeyword}"/></li>
|
||||
<li class="th">담당자지정</li>
|
||||
<li><input type="text" id="worker" name="worker" class="input" value=""/></li>
|
||||
<li class="th">사용여부</li>
|
||||
<li>
|
||||
<select id="searchUseYn" name="searchUseYn" class="input">
|
||||
<option value="">전체</option>
|
||||
<option value="Y" <c:if test="${param.searchUseYn eq 'Y'}">selected</c:if>>사용</option>
|
||||
<option value="N" <c:if test="${param.searchUseYn eq 'N'}">selected</c:if>>미사용</option>
|
||||
</select>
|
||||
</li>
|
||||
<li class="th">접수일자 지정</li>
|
||||
<li>
|
||||
<input type="text" id="searchStartDt" name="searchStartDt" class="input calender datepicker" value="${param.searchStartDt}" /> ~
|
||||
<input type="text" id="searchEndDt" name="searchEndDt" class="input calender datepicker" value="${param.searchEndDt}" />
|
||||
</li>
|
||||
<li>
|
||||
<button type="button" id="search_btn" class="newbtnss bg1">검색</button>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="rig2">
|
||||
<li>
|
||||
<select id="perPageSelect" class="input">
|
||||
<option value="10" <c:if test="${param.perPage eq '10'}">selected</c:if>>페이지당 10</option>
|
||||
<option value="20" <c:if test="${param.perPage eq '20'}">selected</c:if>>페이지당 20</option>
|
||||
<option value="30" <c:if test="${param.perPage eq '30'}">selected</c:if>>페이지당 30</option>
|
||||
</select>
|
||||
<span class="page_number"><span id="currentPage"></span><span class="bar">/</span><sapn id="totalPages"></sapn> Pages</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="gs_booking">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="box_column">
|
||||
<div class="containers">
|
||||
<div id="grid"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /Main body -->
|
||||
|
||||
<script type="text/javascript">
|
||||
/**
|
||||
* 게시판 목록 관리 모듈
|
||||
* 게시판 목록을 조회하고 관리하는 기능을 제공합니다.
|
||||
*/
|
||||
(function(window, $) {
|
||||
'use strict';
|
||||
|
||||
var SEARCH_COND = {};
|
||||
|
||||
// 검색정보 셋팅
|
||||
var setSearchCond = function() {
|
||||
var searchCondition = $.trim(nvl($("#searchCondition").val(), ""));
|
||||
var searchKeyword = $.trim(nvl($("#searchKeyword").val(), ""));
|
||||
var searchUseYn = $.trim(nvl($("#searchUseYn").val(), ""));
|
||||
var searchStartDt = $.trim(nvl($("#searchStartDt").val(), ""));
|
||||
var searchEndDt = $.trim(nvl($("#searchEndDt").val(), ""));
|
||||
|
||||
SEARCH_COND.searchCondition = searchCondition;
|
||||
SEARCH_COND.searchKeyword = searchKeyword;
|
||||
SEARCH_COND.searchUseYn = searchUseYn;
|
||||
SEARCH_COND.searchStartDt = searchStartDt;
|
||||
SEARCH_COND.searchEndDt = searchEndDt;
|
||||
};
|
||||
|
||||
/**
|
||||
* 게시판 목록 관리 네임스페이스
|
||||
*/
|
||||
var NoticeList = {
|
||||
/**
|
||||
* 그리드 관련 객체
|
||||
*/
|
||||
grid: {
|
||||
/**
|
||||
* 그리드 인스턴스
|
||||
*/
|
||||
instance: null,
|
||||
|
||||
/**
|
||||
* 그리드 설정 초기화
|
||||
* @returns {Object} 그리드 설정 객체
|
||||
*/
|
||||
initConfig: function() {
|
||||
// 데이터 소스 설정
|
||||
var dataSource = this.createDataSource();
|
||||
|
||||
// 현재 선택된 perPage 값 가져오기
|
||||
var perPage = parseInt($('#perPageSelect').val() || 10, 10);
|
||||
|
||||
// 그리드 설정 객체 생성
|
||||
var gridConfig = new XitTuiGridConfig();
|
||||
|
||||
// 기본 설정
|
||||
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
|
||||
gridConfig.setOptGridId('grid'); // 그리드를 출력할 Element ID
|
||||
gridConfig.setOptGridHeight(390); // 그리드 높이(단위: px)
|
||||
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
|
||||
gridConfig.setOptRowHeaderType('checkbox'); // 행 첫번째 셀 타입(rowNum: 순번, checkbox: 체크박스, '': 출력 안함)
|
||||
|
||||
// 페이징 옵션 설정
|
||||
gridConfig.setOptPageOptions({
|
||||
useClient: false, // 클라이언트 페이징 여부(false: 서버 페이징)
|
||||
perPage: perPage // 페이지당 표시 건수
|
||||
});
|
||||
gridConfig.setOptUseClientSort(false); // 서버사이드 정렬 false
|
||||
|
||||
// 컬럼 정보 설정
|
||||
gridConfig.setOptColumns([
|
||||
{
|
||||
header: '등록구분',
|
||||
name: 'mmIngb',
|
||||
width: 50,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '목록번호',
|
||||
name: 'asBbsNo',
|
||||
width: 70,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '신고자',
|
||||
name: 'mmSgnm',
|
||||
width: 100,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '담당자',
|
||||
name: 'mmSgtel',
|
||||
width: 100,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '전화번호',
|
||||
name: 'asTel',
|
||||
width: 150,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '접수일자',
|
||||
name: 'asJsdate',
|
||||
width: 70,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '처리기한',
|
||||
name: 'asLimitDt',
|
||||
width: 70,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '위반일자',
|
||||
name: 'mmDate',
|
||||
width: 150,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '첨부',
|
||||
name: 'mmImagegb',
|
||||
width: 150,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '사진갯수',
|
||||
name: 'mmImagecnt',
|
||||
width: 50,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '위반내용',
|
||||
name: 'mmSgcont',
|
||||
width: 250,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '접수번호',
|
||||
name: 'asJsno',
|
||||
width: 150,
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
header: '차량번호',
|
||||
name: 'mmCarno',
|
||||
width: 150,
|
||||
align: 'center'
|
||||
}
|
||||
|
||||
]);
|
||||
|
||||
return gridConfig;
|
||||
},
|
||||
|
||||
/**
|
||||
* 데이터 소스 생성
|
||||
* @returns {Object} 데이터 소스 객체
|
||||
*/
|
||||
createDataSource: function() {
|
||||
return {
|
||||
api: {
|
||||
readData: {
|
||||
url: '<c:url value="/minwon/init/list.ajax"/>',
|
||||
method: 'POST',
|
||||
contentType: 'application/x-www-form-urlencoded',
|
||||
processData: true
|
||||
}
|
||||
},
|
||||
initialRequest: false,
|
||||
serializer: function (params) {
|
||||
setSearchCond();
|
||||
SEARCH_COND.perPage = params.perPage;
|
||||
SEARCH_COND.page = params.page;
|
||||
return $.param(SEARCH_COND);
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* 그리드 인스턴스 생성
|
||||
*/
|
||||
create: function() {
|
||||
var gridConfig = this.initConfig();
|
||||
var Grid = tui.Grid;
|
||||
this.instance = gridConfig.instance(Grid);
|
||||
|
||||
// 그리드 테마 설정
|
||||
Grid.applyTheme('striped');
|
||||
|
||||
// 그리드 이벤트 설정
|
||||
this.gridBindEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* 그리드 이벤트 바인딩
|
||||
*/
|
||||
gridBindEvents: function() {
|
||||
var self = this;
|
||||
|
||||
// 요청 성공 시 총 건수 표시
|
||||
this.instance.on('successResponse', function(ev) {
|
||||
var responseObj = JSON.parse(ev.xhr.response);
|
||||
//$('.totCnt').text(responseObj.data.pagination.totalCount);
|
||||
$("#currentPage").text(responseObj.data.pagination.page);
|
||||
$("#totalPages").text(responseObj.data.pagination.totalPages);
|
||||
});
|
||||
|
||||
// 행 클릭 이벤트 - 게시물 상세 페이지로 이동
|
||||
this.instance.on('dblclick', function(ev) {
|
||||
if (ev.rowKey !== undefined && ev.columnName !== '_number') {
|
||||
var rowData = self.instance.getRow(ev.rowKey);
|
||||
if (rowData && rowData.noticeId) {
|
||||
// 새로운 함수를 사용하여 URL 생성 및 페이지 이동
|
||||
window.location.href = buildUrlWithParamCondAndId(SEARCH_COND, "noticeId", rowData.noticeId, "<c:url value="/template/noticeSample/view.do"/>");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 이벤트 핸들러 설정
|
||||
*/
|
||||
eventBindEvents: function() {
|
||||
var self = this;
|
||||
|
||||
// 검색 버튼 클릭 이벤트
|
||||
$('#search_btn').on('click', function() {
|
||||
// 등록일 from~to 유효성 검사
|
||||
var startDate = $("#searchStartDt").val();
|
||||
var endDate = $("#searchEndDt").val();
|
||||
|
||||
// 시작일과 종료일 중 하나만 입력된 경우 체크
|
||||
if ((startDate && !endDate) || (!startDate && endDate)) {
|
||||
alert("등록일 검색 시 시작일과 종료일을 모두 입력해주세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 시작일과 종료일이 모두 입력된 경우 유효성 검사
|
||||
if (startDate && endDate) {
|
||||
if (!isDate(startDate) || !isDate(endDate)) {
|
||||
alert("유효한 날짜 형식이 아닙니다. (YYYY-MM-DD)");
|
||||
return;
|
||||
}
|
||||
|
||||
// 시작일이 종료일보다 늦은 경우 체크
|
||||
var startDateObj = new Date(startDate);
|
||||
var endDateObj = new Date(endDate);
|
||||
|
||||
if (startDateObj > endDateObj) {
|
||||
alert("시작일은 종료일보다 이후일 수 없습니다.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 페이지를 1로 리셋
|
||||
$("#page").val(1);
|
||||
// 그리드 데이터 리로드
|
||||
self.grid.instance.readData(1);
|
||||
});
|
||||
|
||||
// 검색어 입력 필드에서 엔터키 이벤트 처리
|
||||
$('#searchKeyword').on('keypress', function(e) {
|
||||
if (e.which === 13) { // 엔터키 코드는 13
|
||||
e.preventDefault(); // 기본 이벤트 방지
|
||||
$('#search_btn').trigger('click'); // 검색 버튼 클릭 이벤트 트리거
|
||||
}
|
||||
});
|
||||
|
||||
// perPage 변경 이벤트 추가
|
||||
$('#perPageSelect').on('change', function() {
|
||||
var perPage = parseInt($(this).val(), 10);
|
||||
// Grid의 perPage 설정 변경 및 데이터 리로드
|
||||
self.grid.instance.setPerPage(perPage);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 모듈 초기화
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
// 그리드 생성
|
||||
this.grid.create();
|
||||
|
||||
// 이벤트 핸들러 설정
|
||||
this.eventBindEvents();
|
||||
|
||||
this.grid.instance.readData(${param.page eq null or param.page eq 0 ? 1 : param.page});
|
||||
}
|
||||
};
|
||||
|
||||
// 페이지 로드 시 초기화
|
||||
$(function() {
|
||||
NoticeList.init();
|
||||
});
|
||||
|
||||
// 전역 네임스페이스에 모듈 노출
|
||||
window.NoticeList = NoticeList;
|
||||
|
||||
})(window, jQuery);
|
||||
</script>
|
||||
|
||||
Loading…
Reference in New Issue