first commit

This commit is contained in:
revlis44
2025-12-03 10:41:27 +09:00
commit a6b37aa445
2430 changed files with 175919 additions and 0 deletions

View File

@@ -0,0 +1,265 @@
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"
%><%@ include file="/common/taglib.jsp"
%><%@ page import="egovframework.main.MainGlobals"
%><%
/**
* @Class Name : DmsHdbDetail.jsp
* @Description : DmsHdb Detail 화면
* @Modification Information
*
* @author 한돈희
* @since 2017-06-16
* @version 1.0
* @see
*
* Copyright (C) All right reserved.
*/
%><script type="text/javascript" src="/js/dms/dmsHdb.js"></script>
<script type="text/javascript" src="/js/common/calendar/jquery-ui.js"></script>
<script type="text/javascript" src="/js/common/calendar/jquery.ui.datepicker-ko.js"></script>
<link type="text/css" href="/css/common/calendar/smoothness/jquery-ui.css" rel="stylesheet" />
<form:form commandName="searchVO" id="detailForm" action="${searchVO.parentUrl}">
<form:hidden path="bmode" />
<form:hidden path="pageIndex" />
<form:hidden path="hdbSeq" />
<form:hidden path="searchCondition" />
<form:hidden path="searchKeyword" />
</form:form>
<div class="location_box">
<div class="loc_h3"><h3>${prjNm} <%=MainGlobals.MENU_HDB%></h3><span></span></div>
<span class="loccation"><img src="/images/admin/loccation_home.png" alt="홈" /> > <strong><%=MainGlobals.MENU_HDB%></strong></span>
</div>
<div class="contents">
<table class="tbl_basic_view">
<caption>상세</caption>
<colgroup>
<col style="width:15%">
<col style="width:35%">
<col style="width:15%">
<col style="width:*">
</colgroup>
<tbody>
<tr>
<th scope="row">제목</th>
<td class="left">${dmsHdbVO.title}</td>
<th scope="row">등록일</th>
<td class="left">${dmsHdbVO.createDate}</td>
</tr>
<tr>
<th scope="row">작성자</th>
<td class="left">${dmsHdbVO.userNm}</td>
<th scope="row">진행상태</th>
<td class="left">
<c:if test="${dmsHdbVO.hdbSts == 'A'}">
접수
</c:if>
<c:if test="${dmsHdbVO.hdbSts == 'B'}">
처리중(완료예정일 : ${dmsHdbVO.compScdDate })
</c:if>
<c:if test="${dmsHdbVO.hdbSts == 'C'}">
완료(완료일 : ${dmsHdbVO.compDate })
</c:if>
</td>
</tr>
<tr>
<th scope="row">연락처</th>
<td class="left">${dmsHdbVO.tel}</td>
<th scope="row">이메일</th>
<td class="left">${dmsHdbVO.email}</td>
</tr>
<tr>
<th scope="row">첨부파일</th>
<td colspan="3" class="left">
<c:import url="/common/fms/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${dmsHdbVO.atchFileId}" />
</c:import>
</td>
</tr>
<tr>
<th scope="row">내용</th>
<td colspan="3" class="left"><edosiFmt:formatHtml value="${dmsHdbVO.contents}"/></td>
</tr>
</tbody>
</table>
<div class="mt10 tR">
<%-- <c:if test="${ROLE_EMP }"> --%>
<span class="btn_type_blue"><a href="#modify" onclick="return fn_egov_replyView();">답변</a></span>
<%-- </c:if> --%>
<c:if test="${checkWriteAuth && empty dmsHdbReplyList}">
<span class="btn_type_blue"><a href="#modify" onclick="return fn_egov_updateView();">수정</a></span>
<span class="btn_type_blue"><a href="#delete" onclick="return fn_egov_delete('${searchVO.parentUrl}');">삭제</a></span>
</c:if>
<span class="btn_type_gray"><a href="#list" onclick="return fn_egov_selectList();">목록</a></span>
</div>
<h1>답변</h1>
<c:if test="${ROLE_EMP }">
<form:form commandName="statusVO" id="statusForm" action="${searchVO.parentUrl}" class="form-horizontal">
<form:hidden path="bmode" />
<form:hidden path="pageIndex" />
<form:hidden path="hdbSeq" value="${dmsHdbVO.hdbSeq }"/>
<form:hidden path="searchCondition" />
<form:hidden path="searchKeyword" />
<div>
진행상태 :
<script>
$(function (){
var radioChk = "${dmsHdbVO.hdbSts}";
if(radioChk == ''){
$("input:radio[id='statusA']").attr("checked", true);
}else{
$("#status"+radioChk).attr("checked", true);
}
if($(".hdbSts:checked").val() == 'B'){
$("#statusBdate").show();
}
$(".hdbSts").change(function(){
if($(".hdbSts:checked").val() == 'B'){
$("#statusBdate").show();
}else{
$("#statusBdate").hide();
}
});
});
</script>
<form:radiobutton path="hdbSts" class="hdbSts" id="statusA" value="A" label="접수"/>
<form:radiobutton path="hdbSts" class="hdbSts" id="statusB" value="B" label="처리중"/>
<form:radiobutton path="hdbSts" class="hdbSts" id="statusC" value="C" label="완료"/>
<span id="statusBdate" style="display: none;">
완료예정일 :
<form:input type="text" path="compScdDate" id="compScdDate" style="width:100px;" title="완료예정일" value="${dmsHdbVO.compScdDate }" />
</span>
<span class="btn_type_blue"><a href="#modify" onclick="return fn_hdb_status_update('${searchVO.parentUrl}');">상태변경</a></span>
</div>
</form:form>
</c:if>
<c:if test="${empty dmsHdbReplyList }">
<div>
답변 없음.
</div>
</c:if>
<c:if test="${!empty dmsHdbReplyList }">
<c:forEach items="${dmsHdbReplyList }" var="list">
<table class="tbl_basic_view">
<caption>상세</caption>
<colgroup>
<col style="width:15%">
<col style="width:35%">
<col style="width:15%">
<col style="width:*">
</colgroup>
<tbody>
<tr>
<th scope="row">제목</th>
<td colspan="3" class="left">${list.title}</td>
</tr>
<tr>
<th scope="row">작성자</th>
<td class="left">${list.userNm}</td>
<th scope="row">연락처</th>
<td class="left">${list.tel}</td>
</tr>
<tr>
<th scope="row">내용</th>
<td colspan="3" class="left"><edosiFmt:formatHtml value="${list.contents}"/></td>
</tr>
<tr>
<th scope="row">첨부파일</th>
<td colspan="3" class="left">
<c:import url="/common/fms/selectFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${list.atchFileId}" />
</c:import>
</td>
</tr>
</tbody>
</table>
<div class="mt10 tR">
<c:if test="${loginVO.id == list.userId}">
<span class="btn_type_blue"><a href="#modify" onclick="return fn_egov_delete_reply('${searchVO.parentUrl}', '${list.hdbReplySeq }');">삭제</a></span>
</c:if>
</div>
</c:forEach>
</c:if>
<div id="replyView" style="display: none;">
<form:form commandName="dmsHdbReplyVO" id="replyForm" action="${searchVO.parentUrl}" enctype="multipart/form-data" class="form-horizontal">
<form:hidden path="bmode" />
<form:hidden path="pageIndex" />
<form:hidden path="hdbReplySeq" />
<form:hidden path="hdbSeq" value="${dmsHdbVO.hdbSeq }"/>
<form:hidden path="searchCondition" />
<form:hidden path="searchKeyword" />
<table class="tbl_basic_view">
<caption>답변작성</caption>
<colgroup>
<col style="width:15%">
<col style="width:35%">
<col style="width:15%">
<col style="width:*">
</colgroup>
<tbody>
<tr>
<th scope="row"><span class="fCred">*</span> <label for="title">제목</label></th>
<td colspan="3" class="left"><form:input path="title" cssStyle="width:99%;"/></td>
</tr>
<tr>
<th scope="row"><label for="userNm">내용</label></th>
<td colspan="3" class="left">
<form:textarea path="contents" cssStyle="width:99%" rows="10" />
</td>
</tr>
<tr>
<th scope="row"><span class="fCred">*</span> <label for="userNm">첨부파일</label></th>
<td colspan="3" class="left">
<c:import url="/common/fms/selectFileInfsForUpdate.do" charEncoding="utf-8">
<c:param name="param_atchFileId"/>
</c:import>
<div><input name="file_" id="egovComFileUploaderReply" type="file" /></div>
<div id="egovComFileListReply"></div>
</td>
</tr>
</tbody>
</table>
<div class="mt10 tR">
<span class="btn_type_blue"><a href="#modify" onclick="return fn_egov_add_reply('${searchVO.parentUrl}');">등록</a></span>
</div>
</form:form>
</div>
</div>
<script type="text/javascript">
function fn_egov_replyView(){
if($("#replyView").css("display") == 'none'){
$("#replyView").show();
}else{
$("#replyView").hide();
}
}
//팝업달력
$("#compScdDate").datepicker({
showOn: "button",
buttonImage: "/images/dms/btn_calendar.gif",
buttonImageOnly: true,
changeMonth: true,
changeYear: true,
showOtherMonths: true,
pageDirectLink: true,
selectOtherMonths: true
});
var defaultEndDate = $.datepicker.formatDate('yy-mm-dd', new Date());
if($('#compScdDate').val() == ''){
$('#compScdDate').val(defaultEndDate);
}
</script>

View File

@@ -0,0 +1,310 @@
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"
%><%@ include file="/common/taglib.jsp"
%><%@ page import="egovframework.main.MainGlobals"
%><%
/**
* @Class Name : DmsHdbList.jsp
* @Description : DmsHdb List 화면
* @Modification Information
*
* @author 한돈희
* @since 2017-06-16
* @version 1.0
* @see
*
* Copyright (C) All right reserved.
*/
%><script type="text/javascript" src="/js/dms/dmsHdb.js"></script>
<%@ page import="java.util.List" %>
<%@ page import="egovframework.dms.hdb.vo.DmsHdbGraphVO" %>
<!-- Chart.js CDN -->
<script src="/js/common/chart.umd.min.js"></script>
<script src="/js/common/charts-plugin-datalabels.js"></script>
<c:set var="now" value="<%= new java.util.Date() %>" />
<div class="location_box">
<div class="loc_h3"><h3>${prjNm} <%=MainGlobals.MENU_HDB%>
(<span class="year-text"><fmt:formatDate value="${now}" pattern="yyyy" /> 년 - </span><span class="sts-a">접수: ${hdbStsA}</span>,
<span class="sts-b">처리중: ${hdbStsB}</span>,
<span class="sts-c">완료: ${hdbStsC}</span> )
</h3><span></span></div>
<span class="loccation"><img src="/images/admin/loccation_home.png" alt="홈" /> > <strong><%=MainGlobals.MENU_HDB%></strong></span>
</div>
<div class="contents">
<div class="boardHead">
<form:form commandName="searchVO" id="searchForm" action="${searchVO.parentUrl}" cssClass="form-inline" onsubmit="return fn_egov_searchSelectList('search', true);">
<form:hidden path="bmode" />
<form:hidden path="pageIndex" />
<form:hidden path="hdbSeq" />
<label for="searchCondition" class="labHide">검색항목 선택</label>
<form:select path="searchCondition" title="검색분류">
<form:option value="1">제목</form:option>
</form:select>
<form:input path="searchKeyword" title="검색" placeholder="검색어를 입력하세요" />
<a href="#search" class="btn_search_gray" onclick="return fn_egov_searchSelectList('search', false);">검색</a>
<div class="border_right">
<span class="right_mar_10">Total ${paginationInfo.totalRecordCount} <strong class="fCorange">${paginationInfo.currentPageNo}</strong> / ${paginationInfo.totalPageCount}</span>
</div>
</form:form>
</div>
<table class="tbl_basic" summary="">
<caption></caption>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>첨부</th>
<th>작성일</th>
<th>조회수</th>
<!-- <th>완료예정일</th> -->
</tr>
</thead>
<tbody>
<c:if test="${empty resultList && empty searchVO.searchKeyword}">
<tr>
<td colspan="6" class="text-center">조회된 내용이 없습니다.</td>
</tr>
</c:if>
<c:if test="${empty resultList && !empty searchVO.searchKeyword}">
<tr>
<td colspan="6" class="text-center"><mark>'${searchVO.searchKeyword }'</mark>으로 조회된 내용이 없습니다.</td>
</tr>
</c:if>
<c:set var="number" value="${paginationInfo.totalRecordCount - ((paginationInfo.currentPageNo-1) * paginationInfo.recordCountPerPage)}" />
<c:forEach var="list" items="${resultList}" varStatus="status">
<tr>
<td>${number - status.index}</td>
<td>
<c:if test="${list.hdbSts == 'A' }">
<span style="color:green;">(접수)</span>
</c:if>
<c:if test="${list.hdbSts == 'B' }">
<span style="color:red;">(처리중)</span>
</c:if>
<c:if test="${list.hdbSts == 'C' }">
<span style="color:blue;">(완료)</span>
</c:if>
<a href="#view" onclick="return fn_egov_select('${list.hdbSeq}')">
<c:choose>
<c:when test="${empty list.title}">
제목없음
</c:when>
<c:otherwise>
${list.title}
</c:otherwise>
</c:choose>
</a>
</td>
<td>${list.userNm }</td>
<td>
<c:if test="${empty list.atchFileId }">
</c:if>
<c:if test="${!empty list.atchFileId }">
<img src="/images/admin/cf_tit_ic.png">
</c:if>
</td>
<td>${list.createDate}</td>
<td>${list.rdCnt }</td>
<%-- <td>${list.compScdDate}</td> --%>
</tr>
</c:forEach>
</tbody>
</table>
<div class="pagination"><ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fn_egov_link_page" /></div>
<div class="tR">
<c:if test="${ROLE_CUS}">
<span class="btn_type_blue"><a href="#add" onclick="return fn_egov_addView();">등록</a></span>
</c:if>
<c:if test="${!empty searchVO.searchKeyword}">
<span class="btn_type_blue"><a href="#list" onclick="return fn_egov_searchSelectList('init', false);">목록</a></span>
</c:if>
</div>
</div>
<%
// 연간 월별 집계
List<DmsHdbGraphVO> annualList =
(List<DmsHdbGraphVO>) request.getAttribute("annualList");
StringBuilder sbLabels = new StringBuilder("[");
StringBuilder sbData = new StringBuilder("[");
for (int i = 0; i < annualList.size(); i++) {
DmsHdbGraphVO row = annualList.get(i);
sbLabels.append("\"").append(row.getMonth()).append("\"");
sbData.append(row.getCnt());
if (i < annualList.size() - 1) {
sbLabels.append(",");
sbData.append(",");
}
}
sbLabels.append("]");
sbData.append("]");
// 한달 현황 (도넛)
DmsHdbGraphVO monthlyList = (DmsHdbGraphVO) request.getAttribute("monthlyList");
int cntA = monthlyList.getHdbStsA(); // 접수
int cntB = monthlyList.getHdbStsB(); // 처리중
int cntC = monthlyList.getHdbStsC(); // 완료
%>
<div class="chart-container">
<!-- 막대 그래프 -->
<div class="chart-box" style="flex:2;">
<canvas id="yearChart"></canvas>
</div>
<!-- 도넛 그래프 -->
<div class="chart-box" style="flex:1; position:relative;">
<canvas id="monthChart"></canvas>
<!-- 한달간 요청 0건 문구 -->
<div id="noDataMsg"
style="display:none; position:absolute; top:50%; left:50%;
transform: translate(-50%, -50%);
font-size:18px; color:#555; text-align:center;">
한달간 요청이 0건입니다.
</div>
</div>
</div>
<script>
/****************************************
* 1) 연간 월별 바 차트
****************************************/
Chart.register(ChartDataLabels);
const annualLabels = <%= sbLabels.toString() %>;
const annualData = <%= sbData.toString() %>;
new Chart(
document.getElementById('yearChart'),
{
type: 'bar',
data: {
labels: annualLabels,
datasets: [{
label: '월별 요청수',
data: annualData,
backgroundColor: 'rgba(255, 206, 86, 0.6)', // 노란색
borderColor: 'rgba(255, 206, 86, 1)',
borderWidth: 1,
borderRadius: 4
}]
},
options: {
responsive: true,
plugins: {
title: {
display: true,
text: '2025년 월별 요청 통계',
font: { size: 20, weight: 'bold' },
padding: { top: 10, bottom: 20 }
},
tooltip: {
callbacks: {
title: function(tooltipItems) {
const label = tooltipItems[0].label;
return label + '월';
},
label: function(context) {
return '요청건수: ' + context.parsed.y;
}
}
},
datalabels: {
anchor: 'end',
align: 'end',
color: '#333',
font: { size: 12, weight: 'bold' },
formatter: function(value) {
return value + '건';
}
}
},
scales: {
x: {
title: {
display: true,
text: '월',
color: '#333',
font: { size: 14 }
}
},
y: {
title: { display: true,
text: '요청건수',
color: '#333',
font: { size: 14 }
}
}
}
}
}
);
/****************************************
* 2) 한달 현황 도넛 차트
****************************************/
const cntA = <%= cntA %>; // 접수
const cntB = <%= cntB %>; // 처리중
const cntC = <%= cntC %>; // 완료
const monthChartCanvas = document.getElementById('monthChart');
const noDataMsg = document.getElementById('noDataMsg');
// 0건 여부 체크
if (cntA === 0 && cntB === 0 && cntC === 0) {
// 차트 숨기고 문구 표시
monthChartCanvas.style.display = "none";
noDataMsg.style.display = "block";
} else {
// 차트 표시
monthChartCanvas.style.display = "block";
noDataMsg.style.display = "none";
new Chart(monthChartCanvas, {
type: 'doughnut',
data: {
labels: ['접수', '처리중', '완료'],
datasets: [{
data: [cntA, cntB, cntC],
backgroundColor: [
'rgba(75,192,192,0.7)', // 접수 - 초록
'rgba(255,99,132,0.7)', // 처리중 - 빨강
'rgba(54,162,235,0.7)' // 완료 - 파랑
],
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: { position: 'bottom' },
title: {
display: true,
text: '최근 한달간 요청현황',
font: { size: 20, weight: 'bold' },
padding: { top: 10, bottom: 20 }
}
}
}
});
}
</script>

View File

@@ -0,0 +1,163 @@
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"
%><%@ include file="/common/taglib.jsp"
%><%@ page import="egovframework.main.MainGlobals"
%><%
/**
* @Class Name : DmsHdbRegist.jsp
* @Description : DmsHdb Regist 화면
* @Modification Information
*
* @author 한돈희
* @since 2017-06-16
* @version 1.0
* @see
*
* Copyright (C) All right reserved.
*/
%><script type="text/javascript" src="/js/dms/dmsHdb.js"></script>
<script type="text/javascript" src="/js/common/EgovMultiFile.js"></script>
<script type="text/javascript">
function validateLocal() {
var title = document.getElementsByName("title")[0].value.trim();
var contents = document.getElementsByName("contents")[0].value.trim();
if (title === "") {
alert("제목을 입력해 주십시오.");
return false;
}
if (contents === "") {
alert("내용을 입력해 주십시오.");
return false;
}
return true;
}
</script>
<form:form commandName="dmsHdbVO" id="detailForm" action="${searchVO.parentUrl}" enctype="multipart/form-data" class="form-horizontal">
<input type="hidden" name="bmode" value="${searchVO.bmode}" />
<input type="hidden" name="searchCondition" value="${searchVO.searchCondition}" />
<input type="hidden" name="searchKeyword" value="${searchVO.searchKeyword}" />
<input type="hidden" name="pageIndex" value="${searchVO.pageIndex}" />
<form:hidden path="prjSeq" value="${prjSeq }" />
<div class="location_box">
<div class="loc_h3"><h3>${prjNm} <%=MainGlobals.MENU_HDB%></h3><span></span></div>
<span class="loccation"><img src="/images/admin/loccation_home.png" alt="홈" /> > <strong><%=MainGlobals.MENU_HDB%></strong></span>
</div>
<div class="contents">
<table class="tbl_basic_view">
<caption>글작성</caption>
<colgroup>
<col style="width:15%">
<col style="width:35%">
<col style="width:15%">
<col style="width:*">
</colgroup>
<tbody>
<tr>
<th scope="row"><span class="fCred">*</span> <label for="title">제목</label></th>
<td colspan="3" class="left"><form:input path="title" cssStyle="width:99%;"/></td>
</tr>
<tr>
<th scope="row"><span class="fCred">*</span> <label for="userNm">작성자</label></th>
<td class="left">
<input type="text" name="userNm" value="${loginVO.name }" readonly>
<input type="hidden" name="userId" value="${loginVO.id }">
</td>
<th scope="row"><span class="fCred">*</span> <label for="tel">SMS수신여부</label></th>
<td class="left">
<form:select path="smsYn">
<form:option value="Y">Y</form:option>
<form:option value="N">N</form:option>
</form:select>
</td>
</tr>
<tr>
<th scope="row"><span class="fCred">*</span> <label for="tel">연락처</label></th>
<td class="left">
<input type="text" name="tel" value="${loginVO.tel }">
</td>
<th scope="row"><span class="fCred">*</span> <label for="email">이메일</label></th>
<td class="left">
<input type="text" name="email" value="${loginVO.email }">
</td>
</tr>
<tr>
<th scope="row"><label for="userNm">내용</label></th>
<td colspan="3" class="left">
<form:textarea path="contents" cssStyle="width:99%" rows="10" />
</td>
</tr>
<tr>
<th scope="row"><span class="fCred">*</span> <label for="userNm">첨부파일</label></th>
<td colspan="3" class="left">
<div><input name="file_" id="egovComFileUploader" type="file" /></div>
<c:import url="/common/fms/selectFileInfsForUpdate.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${dmsHdbVO.atchFileId }"/>
</c:import>
<div id="egovComFileList"></div>
</td>
</tr>
</tbody>
</table>
<div class="mt10 tR">
<c:if test="${empty dmsHdbVO.hdbSeq}">
<span class="btn_type_blue">
<a href="#add" onclick="return validateLocal() && fn_egov_add('${searchVO.parentUrl}');">저장</a>
</span>
</c:if>
<c:if test="${!empty dmsHdbVO.hdbSeq}">
<span class="btn_type_blue">
<a href="#modify" onclick="return validateLocal() && fn_egov_update('${searchVO.parentUrl}');">저장</a>
</span>
</c:if>
<span class="btn_type_gray"><a href="#list" onclick="return fn_egov_selectList();">목록</a></span>
</div>
</div>
</form:form>
<script type="text/javascript">
$(function(){
//첨부파일
var maxFileNum = 100;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
});
</script>
<%--
// 첨부파일
<script type="text/javascript" src="/js/common/EgovMultiFile.js"></script>
<c:import url="/common/fms/selectFileInfsForUpdate.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${dmsHdbVO.attachFileId }"/>
</c:import>
<div><input name="file_" id="egovComFileUploader" type="file" /></div>
<div id="egovComFileList"></div>
<script type="text/javascript">
var maxFileNum = 100;
var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );
multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );
</script>
// 팝업달력
<script type="text/javascript" src="/js/common/calendar/jquery-ui.js"></script>
<script type="text/javascript" src="/js/common/calendar/jquery.ui.datepicker-ko.js"></script>
<link type="text/css" href="/css/common/calendar/smoothness/jquery-ui.css" rel="stylesheet" />
<script type="text/javascript">
//<![CDATA[
// 팝업달력 설정
$("#createDate").datepicker({
showOn: "button",
buttonImage: "/images/contents/btn_calendar.gif",
buttonImageOnly: true,
changeMonth: true,
changeYear: true,
showOtherMonths: true,
pageDirectLink: true,
selectOtherMonths: true
});
</script>
--%>