2025-11-10 16:16 설문내용 수정

This commit is contained in:
myname 2025-11-10 16:17:04 +09:00
parent 986b400838
commit ac7be2aeaa
15 changed files with 323 additions and 107 deletions

View File

@ -128,6 +128,30 @@ public class QustnrCommonUtil {
return p_model;
}
public ModelMap _chasiSrvyItemList(
ModelMap p_model
, String p_siteId
, String p_siteIdCd
, String p_eduAplctOrd
, String p_eduChasiOrd
, VEALettnQestnrMIXService p_vEALettnQestnrMIXService
)throws Exception{
VEAQestnrVO vEAQestnrVO = new VEAQestnrVO();
vEAQestnrVO.setSiteId(p_siteId); //청소년
vEAQestnrVO.setSiteIdCd(p_siteIdCd); //10-기본설문, 20-신청자설문, 30-강사설문
vEAQestnrVO.setEduAplctOrd(p_eduAplctOrd);
vEAQestnrVO.setEduChasiOrd(p_eduChasiOrd);
vEAQestnrVO = p_vEALettnQestnrMIXService.selectDetail_MIX_LQI_02(vEAQestnrVO);
List<VEAQestnrVO> chasiSrvyList = p_vEALettnQestnrMIXService.selectDetail_MIX_LQI_05(vEAQestnrVO);
if(chasiSrvyList.size() > 0) {
p_model.addAttribute("chasiSrvyItemList",chasiSrvyList);
}
return p_model;
}
public ModelMap _chasiSrvyList_TA(
ModelMap p_model
, String p_siteId

View File

@ -132,6 +132,9 @@ public class QustnrRespondInfoVO implements Serializable {
private String prcsAplctPrdOrd = "";
private String qestnTyCode = "";
// 20231124 이호영
// 강화 기반은 라디오 버튼이라 변수 추가함
@ -674,6 +677,18 @@ public class QustnrRespondInfoVO implements Serializable {
public void setUserId(String userId) {
this.userId = userId;
}
public String getQestnTyCode() {
return qestnTyCode;
}
public void setQestnTyCode(String qestnTyCode) {
this.qestnTyCode = qestnTyCode;
}
}

View File

@ -1387,6 +1387,22 @@ public class CndtnPrcsInfoMngController {
ex.printStackTrace();
}
// 설문조사 문항항목
try{
model = qustnrCommonUtil._chasiSrvyItemList(
model
, LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012
, "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012
, vEPrcsDetailVO.getPrcsAplctPrdOrd()
, ""
//, vEEduAplctVO.getEduAplctOrd()
//, vEEduAplctVO.getEduChasiOrd()
, vEALettnQestnrMIXService
);
}catch(Exception ex) {
ex.printStackTrace();
}
//개인별 만족도 관리 - chasiSrvyEAList
try{

View File

@ -18,4 +18,7 @@ public interface VEALettnQestnrMIXService {
//관리자 청소년,성인 - 개별 만족도 리스트
List<VEAQestnrVO> selectDetail_MIX_LQI_04(VEAQestnrVO paramVO) throws Exception; // R
//관리자 청소년,성인 - 설문항목
List<VEAQestnrVO> selectDetail_MIX_LQI_05(VEAQestnrVO paramVO) throws Exception; // R
}

View File

@ -95,6 +95,42 @@ public class VEAQestnrVO extends ComDefaultVO implements Serializable {
private String qustnrBirth; //개별설문등록자생년월일
private String qustnrScore; //개별설문등록자점수
private String sn1;
private String sn2;
private String sn3;
public String getSn1() {
return sn1;
}
public void setSn1(String sn1) {
this.sn1 = sn1;
}
public String getSn2() {
return sn2;
}
public void setSn2(String sn2) {
this.sn2 = sn2;
}
public String getSn3() {
return sn3;
}
public void setSn3(String sn3) {
this.sn3 = sn3;
}
public String getSn4() {
return sn4;
}
public void setSn4(String sn4) {
this.sn4 = sn4;
}
public String getSn5() {
return sn5;
}
public void setSn5(String sn5) {
this.sn5 = sn5;
}
private String sn4;
private String sn5;
public String getQestnrQesitmId() {
return qestnrQesitmId;

View File

@ -32,4 +32,9 @@ public class VEALettnQestnrMIXDAO extends EgovAbstractDAO {
List<VEAQestnrVO> tlist = (List<VEAQestnrVO>) list("VEALettnQestnrMIXDAO.selectDetail_MIX_LQI_04", paramVO);
return tlist;
}
public List<VEAQestnrVO> selectDetail_MIX_LQI_05(VEAQestnrVO paramVO) throws Exception {
List<VEAQestnrVO> tlist = (List<VEAQestnrVO>) list("VEALettnQestnrMIXDAO.selectDetail_MIX_LQI_05", paramVO);
return tlist;
}
}

View File

@ -40,4 +40,9 @@ public class VEALettnQestnrMIXServiceImpl implements VEALettnQestnrMIXService {
public List<VEAQestnrVO> selectDetail_MIX_LQI_04(VEAQestnrVO paramVO) throws Exception{
return vEALettnQestnrMIXDAO.selectDetail_MIX_LQI_04(paramVO);
}
//관리자 설문 문항
public List<VEAQestnrVO> selectDetail_MIX_LQI_05(VEAQestnrVO paramVO) throws Exception{
return vEALettnQestnrMIXDAO.selectDetail_MIX_LQI_05(paramVO);
}
}

View File

@ -127,7 +127,7 @@
A.LAST_UPDT_PNTTM,
A.LAST_UPDUSR_ID,
A.QESTN_SN,
A.QESTN_TY_CODE,
A.QESTN_TY_CODE "qestnTyCode",
A.QESTN_CN,
A.MXMM_CHOISE_CO,
A.QUSTNR_TMPLAT_ID "qestnrTmplatId"
@ -805,9 +805,9 @@
, d.answer1
, e.prcs_ord AS prcsAplctPrdOrd
, f.qestn_ty_code AS qestnTyCode
FROM lettnqustnrqesitm a
LEFT OUTER JOIN LETTNQESTNRRSLTDETAIL b
on(1=1
@ -862,6 +862,9 @@
AND a.qustnr_qesitm_id=d.qustnr_qesitm_id
)
LEFT OUTER JOIN lettnqustnrqesitm f
ON a.QUSTNR_QESITM_ID = f.QUSTNR_QESITM_ID
,(

View File

@ -832,12 +832,12 @@
END AS qestRsltExists,
/* 설문지 정보 */
I.qustnr_tmplat_id AS qustnrTmplatId ,
COALESCE(qustnr01.QESTNR_ID_10,
i.qestnr_id_10) AS qestnrId10 ,
COALESCE(qustnr01.QESTNR_ID_20,
i.qestnr_id_20) AS qestnrId20 ,
COALESCE(qustnr01.QESTNR_ID_30,
i.qestnr_id_30) AS qestnrId30 ,
COALESCE(i.qestnr_id_10, qustnr01.QESTNR_ID_10
) AS qestnrId10 ,
COALESCE(i.qestnr_id_20, qustnr01.QESTNR_ID_20
) AS qestnrId20 ,
COALESCE(i.qestnr_id_30, qustnr01.QESTNR_ID_30
) AS qestnrId30 ,
/* 답변 정보 */
qustnr01.QESTNR_ID_10_CNT AS qestnrId10Cnt ,
qustnr01.QESTNR_ID_20_CNT AS qestnrId20Cnt ,
@ -955,7 +955,7 @@
*/
) I ON
(vpap.edu_strt_pnttm between coalesce(I.qustnr_bgnde, '20000101') and coalesce(I.qustnr_endde,'99991231'))
(replace(vpap.edu_strt_pnttm,'.','') between coalesce(I.qustnr_bgnde, '20000101') and coalesce(I.qustnr_endde,'99991231'))

View File

@ -1789,9 +1789,9 @@
I10.qustnr_tmplat_id AS qustnrTmplatId ,
*/
COALESCE(qustnr01.QESTNR_ID_10, I10.qestnr_id_10) AS qestnrId10 ,
COALESCE(qustnr01.QESTNR_ID_20, I20.qestnr_id_20) AS qestnrId20 ,
COALESCE(qustnr01.QESTNR_ID_30, I30.qestnr_id_30) AS qestnrId30 ,
COALESCE(I10.qestnr_id_10, qustnr01.QESTNR_ID_10) AS qestnrId10 ,
COALESCE(I20.qestnr_id_20, qustnr01.QESTNR_ID_20) AS qestnrId20 ,
COALESCE(I30.qestnr_id_30, qustnr01.QESTNR_ID_30) AS qestnrId30 ,
/* 답변 정보 */
@ -1885,9 +1885,13 @@
*/
/*
SELECT site_id, min(qestnr_id_10) as qestnr_id_10
*/
SELECT a0.prcs_ord, a0.site_id, a0.qestnr_id_10
FROM (
select
b0.prcs_ord,
a.QUSTNR_TMPLAT_ID ,
a.SITE_ID ,
/* (CASE WHEN a.STTUS = '1' THEN a.QESTNR_ID END) AS QESTNR_ID_10 */
@ -1900,6 +1904,7 @@
, (
select
a.prcs_ord ,
b.edu_strt_pnttm
, b.lctr_div_cd
from
@ -1919,7 +1924,7 @@
/*
AND a.STTUS IN ('1') */
and b0.edu_strt_pnttm between coalesce(a.qustnr_bgnde,
and replace(b0.edu_strt_pnttm,'.','') between coalesce(a.qustnr_bgnde,
'2000.01.01')
and coalesce(a.qustnr_endde,
'9999.12.31')
@ -1928,11 +1933,16 @@
coalesce(a.qustnr_bgnde,
'9999.12.31')
)a0
/*
group by a0.site_id
*/
GROUP BY a0.prcs_ord, a0.site_id, a0.qestnr_id_10
) I10 ON
(1 = 1 and a.lctr_div_cd = I10.site_id)
(1 = 1 and a.lctr_div_cd = I10.site_id
and a.prcs_ord = I10.prcs_ord
)
LEFT OUTER JOIN (
/* 현재 진행가능한 설문 정보(기본, 선생님, 강사) 여러개가 있는 경우는 최근 등록된 설문 정보를 가져온다.*/

View File

@ -170,7 +170,7 @@
AND COALESCE(A.site_id_cd, '10')=#siteIdCd#
AND c.prcs_aplct_prd_ord=#eduAplctOrd#
AND c.edu_strt_pnttm between coalesce(a.qustnr_bgnde, '20000101') and coalesce(a.qustnr_endde, '99991231')
AND REPLACE(c.edu_strt_pnttm,'.','') between coalesce(a.qustnr_bgnde, '20000101') and coalesce(a.qustnr_endde, '99991231')
/*
AND to_char(NOW(), 'YYYY.MM.DD') BETWEEN
@ -398,5 +398,36 @@
, a.qustnr_nm
, a.qustnr_birth
</select>
</select>
<!-- //관리자 청소년/성인 만족도 평가 R -->
<select id="VEALettnQestnrMIXDAO.selectDetail_MIX_LQI_05" parameterClass="VEAQestnrVO" resultClass="VEAQestnrVO">
/* VEALettnQestnrMIXDAO.selectDetail_MIX_LQI_05 */
SELECT
a.qestnr_id as qestnrId,
qustnr_qesitm_id as qustnrQesitmId
, max(case
when a.iem_sn = 1 then a.iem_cn
end) as sn1
, max(case
when a.iem_sn = 2 then a.iem_cn
end) as sn2
, max(case
when a.iem_sn = 3 then a.iem_cn
end) as sn3
, max(case
when a.iem_sn = 4 then a.iem_cn
end) as sn4
, max(case
when a.iem_sn = 5 then a.iem_cn
end) as sn5
FROM lettnqustnriem a
WHERE 1=1
and A.QESTNR_ID = #qestnrId#
GROUP BY a.qestnr_id, qustnr_qesitm_id
</select>
</sqlMap>

View File

@ -211,8 +211,9 @@
// form.action = "<c:url value='/kccadr/oprtn/cmdTrgt/popup/fndthInstrAsgnmPopup.do'/>";
form.action = "<c:url value='/kccadr/oprtn/cmdTrgt/popup/cndtnInstrAsgnmPopup.do'/>";
window.open("#", "_securityPop", "scrollbars = no, top=100px, left=100px, height=750px, width=950px");
form.action = "<c:url value='/kccadr/oprtn/cndtnSspnIdtmt/popup/cndtnInstrAsgnmPopup.do'/>";
window.open("#", "_securityPop", "scrollbars = no, top=100px, left=100px, height=750px, width=950px");
form.target = "_securityPop";
form.submit();
}
@ -535,8 +536,20 @@
<div class="cont_wrap">
<div class="box">
<!-- cont_tit -->
<!-- 메뉴에 등록된 URL을 넣으면 해당 메뉴명까지 자동 노출 해줌 -->
<!-- 메뉴에 등록되지 않은 메뉴를 마지막에 넣을떄 1 -->
<!-- 메뉴에 등록되지 않은 메뉴를 마지막에 넣을떄 2 -->
<!-- 메뉴에 등록되지 않은 메뉴를 마지막에 넣을떄 3 -->
<c:import url="/cmm/navi/adminContNav.do">
<c:param name="url" value="/kccadr/oprtn/cmdTrgt/cndtnEduPrcsMngList.do"/>
<c:param name="name1" value="확정과정관리"/>
<c:param name="name2" value="확정과정 상세"/>
<c:param name="name3" value=""/>
</c:import>
<!-- cont_tit -->
<!--
<div class="cont_tit">
<h2>교육확정상세</h2>
<ul class="cont_nav">
@ -547,7 +560,8 @@
<li><span class="cur_nav">교육확정상세</span></li>
</ul>
</div>
<!-- //cont_tit -->
-->
<!-- //cont_tit -->
<div class="cont">
<!-- list_상세 -->
@ -820,8 +834,10 @@
<input type="text" id="email_${status.count}" name="email_${status.count}"
placeholder="이메일을 입력하세요." class="search_input"
value="<c:out value='${list.email}'/>">
<button type="button" class="btn_type04"
<!--
<button type="button" class="btn_type04"
onclick="fn_emailChg('<c:out value="${list.eduAplctOrd }" />', 'email_${status.count}')">저장</button>
-->
</td>
<td>
<c:out value="${list.phone}"/>

View File

@ -1167,18 +1167,46 @@
</colgroup>
<thead>
<tr>
<th scope="col">평가문항</th>
<th scope="col">매우만족</th>
<th scope="col">만족</th>
<th scope="col">보통</th>
<th scope="col">불만족</th>
<th scope="col">매우불만족</th>
<th scope="col">-</th>
<th scope="col">-</th>
<th scope="col">-</th>
<th scope="col">-</th>
<th scope="col">-</th>
<th scope="col">-</th>
</tr>
</thead>
<tbody>
<c:forEach items="${Comtnqustnrqesitm}" var="QestmInfo" varStatus="status1">
<c:forEach items="${chasiSrvyList}" var="chasiSrvyInfo" varStatus="">
<c:if test="${QestmInfo.qestnrQesitmId eq chasiSrvyInfo.qestnrQesitmId}">
<c:forEach items="${chasiSrvyItemList}" var="chasiSrvyItemInfo" varStatus="">
<c:if test="${chasiSrvyItemInfo.qustnrQesitmId eq chasiSrvyInfo.qestnrQesitmId}">
<c:if test="${QestmInfo.qestnTyCode eq '1'}">
<tr>
<td>객관식질문</td>
<td>${chasiSrvyItemInfo.sn1}</td>
<td>${chasiSrvyItemInfo.sn2}</td>
<td>${chasiSrvyItemInfo.sn3}</td>
<td>${chasiSrvyItemInfo.sn4}</td>
<td>${chasiSrvyItemInfo.sn5}</td>
</tr>
</c:if>
<c:if test="${QestmInfo.qestnTyCode eq '2'}">
<tr>
<td>주관식질문</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</c:if>
</c:if>
</c:forEach>
<tr>
<th scope="row" class="t_left">
${status1.count}) <c:out value="${QestmInfo.qestnCn}" escapeXml="true" />

View File

@ -484,20 +484,7 @@
// listForm.searchCondition.value = $("#searchCondition").val() ;
vForm.action = "<c:url value='/kccadr/oprtn/prevent/trgtEduAplctCnfrmExcel.do'/>";
vForm.submit();
}
// 이수증
function fncPrintCert(prcsAplctPrdOrd) {
var form = document.popForm;
form.prcsAplctPrdOrd.value = prcsAplctPrdOrd;
form.action = "<c:url value='/kccadr/oprtn/cndtnSspnIdtmt/popup/printCertPopup.do'/>";
window.open("#", "_printCertPop", "scrollbars = no, top=10px, left=10px, height=1500px, width=1200px");
form.target = "_printCertPop";
form.submit();
}
}
</script>
</head>
@ -942,8 +929,8 @@
<c:choose>
<c:when test="${list.qestRsltExists and list.aprvlCd eq '60' and list.aplctStateCd eq '20' and list.qestnrId10Cnt gt 0}">
<!-- 교육 기간 종료 & 교육신청은 확정(60) & 교육상태는 이슈(20) & 수료증 출력 가능 -->
<button type="button" class="btn_type04"
onclick="fncPrintCert('<c:out value="${info.prcsAplctPrdOrd }" />')"/>출력</button>
<button type="button" class="btn_type04"
onclick="fncPrintCert('${list.eduAplctOrd}','${list.eduChasiOrd}','10','insert','${list.qustnrTmplatId}','${list.qestnrId10}','')"/>출력</button>
</c:when>
<c:otherwise>
-

View File

@ -114,6 +114,27 @@
function popupSrvySendSubmit(){
const $inputs = $('.check-input'); // 동일한 class의 text input들
const totalCount = $inputs.length; // 전체 개수
let filledCount = 0; // 값이 입력된 개수
$inputs.each(function() {
if ($(this).val().trim() !== '') {
filledCount++;
}
});
if (filledCount === totalCount) {
alert("✅ 모든 ${totalCount}개의 입력란이 채워졌습니다.");
//$('#result').text(`✅ 모든 ${totalCount}개의 입력란이 채워졌습니다.`);
} else {
alert("⚠️ 전체 ${totalCount}개 중 ${filledCount}개만 입력되었습니다.");
//$('#result').text(`⚠️ 전체 ${totalCount}개 중 ${filledCount}개만 입력되었습니다.`);
}
//return;
var v_qestmSize = parseInt('${chasiSrvyListCnt}'); //평가문항 수량
var v_sum = 0;
@ -197,7 +218,7 @@
if(v_qestmSize != v_sum ){
if(v_qestmSize != v_sum + filledCount ){
alert("문항의 합계가 응답수량과 맞지 않습니다.");
$("#verySatisfied_"+i).focus();
return
@ -454,84 +475,100 @@ $(document).ready(function(){
</th>
<td style="text-align:left;">
<div class="radio_wrap">
<c:if test="${QestmInfo.qestnTyCode eq '1'}">
<c:if test="${not empty QestmInfo.answer5}">
<span>
<div class="radio_wrap">
<c:if test="${not empty QestmInfo.answer5}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="매우만족" id="verySatisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="5"
<c:if test="${QestmInfo.verySatisfied eq 1}">
checked
</c:if>
>
<label for="verySatisfied_${status1.index}"><span class="label">매우만족</span>${QestmInfo.answer5}</label>
</span>
</c:if>
<c:if test="${not empty QestmInfo.answer4}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="매우만족" id="verySatisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="5"
title="만족" id="satisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="4"
<c:if test="${QestmInfo.verySatisfied eq 1}">
<c:if test="${QestmInfo.satisfied eq 1}">
checked
</c:if>
</c:if>
>
<label for="verySatisfied_${status1.index}"><span class="label">매우만족</span>${QestmInfo.answer5}</label>
</span>
</c:if>
<c:if test="${not empty QestmInfo.answer4}">
<label for="satisfied_${status1.index}"><span class="label">만족</span>${QestmInfo.answer4}</label>
</span>
</c:if>
<c:if test="${not empty QestmInfo.answer3}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="만족" id="satisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="4"
title="보통" id="neither_${status1.index}" name="resultList[${status1.index}].responseRadio" value="3"
<c:if test="${QestmInfo.satisfied eq 1}">
<c:if test="${QestmInfo.neither eq 1}">
checked
</c:if>
</c:if>
>
<label for="satisfied_${status1.index}"><span class="label">만족</span>${QestmInfo.answer4}</label>
<label for="neither_${status1.index}"><span class="label">보통</span>${QestmInfo.answer3}</label>
</span>
</c:if>
<c:if test="${not empty QestmInfo.answer2}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="불만족" id="dissatisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="2"
<c:if test="${QestmInfo.dissatisfied eq 1}">
checked
</c:if>
>
<label for="dissatisfied_${status1.index}"><span class="label">불만족</span>${QestmInfo.answer2}</label>
</span>
</c:if>
<c:if test="${not empty QestmInfo.answer3}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="보통" id="neither_${status1.index}" name="resultList[${status1.index}].responseRadio" value="3"
<c:if test="${QestmInfo.neither eq 1}">
checked
</c:if>
>
<label for="neither_${status1.index}"><span class="label">보통</span>${QestmInfo.answer3}</label>
</span>
</c:if>
<c:if test="${not empty QestmInfo.answer2}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="불만족" id="dissatisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="2"
<c:if test="${QestmInfo.dissatisfied eq 1}">
checked
</c:if>
>
<label for="dissatisfied_${status1.index}"><span class="label">불만족</span>${QestmInfo.answer2}</label>
</span>
<c:if test="${not empty QestmInfo.answer1}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="매우불만족" id="veryDissatisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="1"
<c:if test="${QestmInfo.veryDissatisfied eq 1}">
checked
</c:if>
>
<label for="veryDissatisfied_${status1.index}"><span class="label">매우불만족</span>${QestmInfo.answer1}</label>
</span>
</c:if>
</div>
</c:if>
<c:if test="${not empty QestmInfo.answer1}">
<span>
<input type="radio" numberOnly class="popupInput" style="width: 20px;padding:0 5px;text-align:center;"
title="매우불만족" id="veryDissatisfied_${status1.index}" name="resultList[${status1.index}].responseRadio" value="1"
<c:if test="${QestmInfo.veryDissatisfied eq 1}">
checked
</c:if>
>
<label for="veryDissatisfied_${status1.index}"><span class="label">매우불만족</span>${QestmInfo.answer1}</label>
</span>
</c:if>
</div>
<c:if test="${QestmInfo.qestnTyCode eq '2'}">
<div class="radio_wrap">
<span>
<label>
<input type="text" numberOnly class="popupInput check-input" style="width: 50%;"
id="answer" name="answer" value="<c:out value="${QestmInfo.answer}" />">
</label>
</span>
</div>
</c:if>
</td>
</tr>
</c:forEach>