이지우 - 청소년교육 서류요청 기능 작업 중

This commit is contained in:
jiwoo 2023-11-03 18:19:16 +09:00
parent 98cb08f48d
commit a83b39a6ce
12 changed files with 495 additions and 36 deletions

View File

@ -59,6 +59,10 @@ public class AdrInnorixFileVO extends ComDefaultVO implements Serializable {
// 전체 교육인원 - 저작권 체험교실 결과보고서 항목
public String trgtPrsnlReal = "";
//서류요청 기능
public String docReqNm = ""; //요청 서류명
public String sbmtId = ""; //제출 강사 ID
public String getFileType() {
return fileType;
@ -140,6 +144,22 @@ public class AdrInnorixFileVO extends ComDefaultVO implements Serializable {
this.prcsAplctPrdOrd = prcsAplctPrdOrd;
}
public String getDocReqNm() {
return docReqNm;
}
public void setDocReqNm(String docReqNm) {
this.docReqNm = docReqNm;
}
public String getSbmtId() {
return sbmtId;
}
public void setSbmtId(String sbmtId) {
this.sbmtId = sbmtId;
}

View File

@ -34,4 +34,6 @@ public interface InnorixFileService {
//기반강화 강의계획서 저장
RestResponse insertInnorixLctrPlanFile(AdrInnorixFileVO adrInnorixFileVO);
RestResponse insertInnorixReqFile(AdrInnorixFileVO adrInnorixFileVO);
}

View File

@ -78,6 +78,10 @@ public class InnorixFileServiceImpl extends EgovAbstractServiceImpl implements I
//과정차시 관리
@Resource(name = "vEAPrcsAplctPrdInstrAsgnmService")
private VEAPrcsAplctPrdInstrAsgnmService vEAPrcsAplctPrdInstrAsgnmService;
//서류요청 순번
@Resource(name="docReqOrdGnrService")
private EgovIdGnrService docReqOrdGnrService;
/**
* @methodName : fileDataUpload
* @author : 이호영
@ -401,4 +405,38 @@ public class InnorixFileServiceImpl extends EgovAbstractServiceImpl implements I
return new RestResponse(HttpStatus.OK, adrInnorixFileVO.getSuccessMsg(), LocalDateTime.now());
}
@Override
public RestResponse insertInnorixReqFile(AdrInnorixFileVO adrInnorixFileVO) {
List<FileVO> result = null;
try {
// 파일 저장 저장할 file 정보를 받아옴
result = this.insertFileData(adrInnorixFileVO);
// 파일 정보 insert
String atchFileId = fileManageDAO.insertFileInfs(result);
//VE_EDU_DOC_REQ 서류요청테이블 insert
VEEduAplctVO vEEduAplctVO = new VEEduAplctVO();
vEEduAplctVO.setEduAplctOrd(adrInnorixFileVO.getEduAplctOrd());
vEEduAplctVO.setDocReqNm(adrInnorixFileVO.getDocReqNm());
vEEduAplctVO.setDocFormAtchFileId(atchFileId);
vEEduAplctVO.setFrstRegisterId(adrInnorixFileVO.getUniqId());
String[] sbmtIdArray = adrInnorixFileVO.getSbmtId().split(",");
for(String sbmtId : sbmtIdArray) {
vEEduAplctVO.setSbmtId(sbmtId);
vEEduAplctVO.setEduDocReqOrd(docReqOrdGnrService.getNextStringId());
vEEduAplctService.insertDocReq(vEEduAplctVO);
}
} catch (Exception e) {
e.printStackTrace();
return new RestResponse(HttpStatus.BAD_REQUEST, "등록에 실패하였습니다.", LocalDateTime.now());
}
return new RestResponse(HttpStatus.OK, adrInnorixFileVO.getSuccessMsg(), LocalDateTime.now());
}
}

View File

@ -159,4 +159,29 @@ public class InnorixFileController {
return ResponseEntity.ok(innorixService.insertInnorixLctrPlanFile(adrInnorixFileVO));
}
/**
* @methodName : insertInnorixReqFile
* @author : 이지우
* @date : 2023.11.03
* @description : 파일 insert 전용
* @param adrInnorixFileVO
* @return
* @throws Exception
* 청소년교육 서류요청 양식 업로드
*/
@RequestMapping(value = {"/web/common/insertInnorixReqFileAjax.do"}, method = RequestMethod.POST)
public ResponseEntity<RestResponse> insertInnorixReqFileAjax(@RequestBody AdrInnorixFileVO adrInnorixFileVO) throws Exception {
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getUniqId());
if(userId.equals("")) {
return ResponseEntity.ok(new RestResponse(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.", LocalDateTime.now()));
}
adrInnorixFileVO.setUniqId(userId);
return ResponseEntity.ok(innorixService.insertInnorixReqFile(adrInnorixFileVO));
}
}

View File

@ -1,6 +1,9 @@
package kcc.ve.aplct.tngrVisitEdu.eduAplct.web;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@ -446,6 +449,18 @@ public class EduAplctTngrController {
vEEduChasiVOList = egovCryptoUtil.decryptVEEduChasiVOList(vEEduChasiVOList);
model.addAttribute("chasiList", vEEduChasiVOList);
//강사 목록
HashSet<String> userIds = new HashSet<>();
List<VEEduChasiVO> instrList = vEEduChasiVOList.stream().filter(e -> userIds.add(e.getUserId())).collect(Collectors.toList());
model.addAttribute("instrList", instrList);
//서류 요청 목록
VEEduAplctVO veEduDocReqVO = new VEEduAplctVO();
veEduDocReqVO.setEduAplctOrd(vEEduAplctVO.getEduAplctOrd());
List<VEEduAplctVO> vEEduDocReqList = vEEduAplctService.selectDocReqList(veEduDocReqVO);
//복호화
vEEduDocReqList = egovCryptoUtil.decryptVEEduAplctVOList(vEEduDocReqList);
model.addAttribute("docReqList", vEEduDocReqList);
return "/web/ve/aplct/tngrVisitEdu/eduAplct/eduAplctDetail";

View File

@ -48,4 +48,10 @@ public interface VEEduAplctService {
//사용자 진행중인 체험교실 조회하기
String selectProceedingOrd(String userId) throws Exception;
//서류요청 insert
void insertDocReq(VEEduAplctVO paramVO) throws Exception;
//서류요청 목록 조회
List<VEEduAplctVO> selectDocReqList(VEEduAplctVO paramVO) throws Exception;
}

View File

@ -375,6 +375,16 @@ public class VEEduAplctVO extends ComDefaultVO implements Serializable {
//전체 교육인원(결과보고 제출 )
private String trgtPrsnlReal;
//VE_EDU_DOC_REQ 서류요청
private String eduDocReqOrd; //서류요청순번
private String docReqNm; //요청 서류명
private String docFormAtchFileId; //요청 서류 양식 파일 아이디
private String sbmtAtchFileId; //제출 서류 파일 아이디
private String sbmtId; //제출자
public String getSpecialWorkAllow() {
return specialWorkAllow;
}
@ -1609,6 +1619,37 @@ public class VEEduAplctVO extends ComDefaultVO implements Serializable {
public void setStngYr(String stngYr) {
this.stngYr = stngYr;
}
public String getEduDocReqOrd() {
return eduDocReqOrd;
}
public void setEduDocReqOrd(String eduDocReqOrd) {
this.eduDocReqOrd = eduDocReqOrd;
}
public String getDocReqNm() {
return docReqNm;
}
public void setDocReqNm(String docReqNm) {
this.docReqNm = docReqNm;
}
public String getDocFormAtchFileId() {
return docFormAtchFileId;
}
public void setDocFormAtchFileId(String docFormAtchFileId) {
this.docFormAtchFileId = docFormAtchFileId;
}
public String getSbmtAtchFileId() {
return sbmtAtchFileId;
}
public void setSbmtAtchFileId(String sbmtAtchFileId) {
this.sbmtAtchFileId = sbmtAtchFileId;
}
public String getSbmtId() {
return sbmtId;
}
public void setSbmtId(String sbmtId) {
this.sbmtId = sbmtId;
}
}

View File

@ -139,4 +139,12 @@ public class VEEduAplctDAO extends EgovAbstractDAO {
return (String) select("VEEduAplctDAO.selectProceedingOrd", userId);
}
public void insertDocReq(VEEduAplctVO paramVO) throws Exception {
insert("VEEduAplctDAO.insertDocReq", paramVO);
}
//L
public List<VEEduAplctVO> selectDocReqList(VEEduAplctVO paramVO) throws Exception {
return (List<VEEduAplctVO>) list("VEEduAplctDAO.selectDocReqList", paramVO);
}
}

View File

@ -163,4 +163,12 @@ public class VEEduAplctServiceImpl implements VEEduAplctService {
public String selectProceedingOrd(String userId) throws Exception {
return vEEduAplctDAO.selectProceedingOrd(userId);
}
public void insertDocReq(VEEduAplctVO paramVO) throws Exception {
vEEduAplctDAO.insertDocReq(paramVO);
}
public List<VEEduAplctVO> selectDocReqList(VEEduAplctVO paramVO) throws Exception{
return vEEduAplctDAO.selectDocReqList(paramVO);
}
}

View File

@ -2952,5 +2952,20 @@
<property name="cipers" value="11" /><!-- 일련번호(순번) 전체 길이(prefix길이 미포함) -->
<property name="fillChar" value="0" />
</bean>
<!-- 22.서류요청순번 ve_edu_doc_req -->
<bean name="docReqOrdGnrService" class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl" destroy-method="destroy">
<property name="dataSource" ref="dataSource" />
<property name="strategy" ref="docReqOrdStrategy" /><!-- strategy 값 수정 -->
<property name="blockSize" value="10"/>
<property name="table" value="IDS"/>
<property name="tableName" value="DOCREQ_ORD"/><!-- tableName 값 수정 -->
</bean>
<!-- 서류요청순번 ID Generation Strategy Config -->
<bean name="docReqOrdStrategy" class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl"><!-- bean name 값에 strategy 값 입력 -->
<property name="prefix" value="docReqOrd_" /><!-- prefix 값 수정 -->
<property name="cipers" value="10" /><!-- 일련번호(순번) 전체 길이(prefix길이 미포함) -->
<property name="fillChar" value="0" />
</bean>
</beans>

View File

@ -1217,4 +1217,53 @@
AND LCTR_DIV_CD = '30'
AND APRVL_CD = '60'
</select>
<insert id="VEEduAplctDAO.insertDocReq" parameterClass="VEEduAplctVO">
/* VEEduAplctDAO.insertDocReq */
INSERT INTO VE_EDU_DOC_REQ
(
EDU_APLCT_ORD,
EDU_DOC_REQ_ORD,
DOC_REQ_NM,
DOC_FORM_ATCH_FILE_ID,
FRST_REGIST_PNTTM,
FRST_REGISTER_ID,
SBMT_ID
)VALUES(
#eduAplctOrd#,
#eduDocReqOrd#,
#docReqNm#,
#docFormAtchFileId#,
SYSDATE,
#frstRegisterId#,
#sbmtId#
)
</insert>
<select id="VEEduAplctDAO.selectDocReqList" parameterClass="VEEduAplctVO" resultClass="VEEduAplctVO">
/* VEEduAplctDAO.selectDocReqList */
SELECT
A.EDU_APLCT_ORD AS eduAplctOrd,
A.EDU_DOC_REQ_ORD AS eduDocReqOrd,
A.DOC_REQ_NM AS docReqNm,
A.DOC_FORM_ATCH_FILE_ID AS docFormAtchFileId,
A.FRST_REGIST_PNTTM AS frstRegistPnttm,
A.FRST_REGISTER_ID AS frstRegisterId,
A.SBMT_ATCH_FILE_ID AS sbmtAtchFileId,
A.SBMT_PNTTM AS sbmtPnttm,
A.SBMT_ID AS sbmtId,
B.INSTR_NM AS instrNm
FROM
VE_EDU_DOC_REQ A
LEFT JOIN VE_INSTR_DETAIL B
ON B.USER_ID = A.SBMT_ID
AND B.USE_YN = 'Y'
WHERE
1=1
<isNotEmpty property="eduAplctOrd">
AND EDU_APLCT_ORD = #eduAplctOrd#
</isNotEmpty>
</select>
</sqlMap>

View File

@ -16,6 +16,7 @@
<spring:eval expression="@property['Globals.Innorix.License']" var="license"/>
<script src="<c:url value='/innorix/innorix_${license}.js' />"></script>
<script src="<c:url value='/js/kccadr/innorixCommon.js' />"></script>
<link rel="stylesheet" href="<c:url value='/innorix/innorix.css'/>" type="text/css">
<style>
input:disabled {
background-color: #f9f9f9 !important;
@ -23,9 +24,44 @@
input:read-only {
background-color: #f9f9f9 !important;
}
#fileControl{margin: 8px 0 0 0; border: 1px solid #d5d5d5; border-radius: 5px; height: 150px !important; background-color: #fafafa;}
.innorix_basic div.irx_filetree.empty-uploader{background: url(/offedu/visitEdu/usr/publish/images/content/dropzone_file_before.png) no-repeat center; height: 150px !important;}
.irx_filetree,.innorix_basic div.irx_infoBox{height: 150px !important;}
</style>
<script type="text/javaScript" language="javascript">
$( document ).ready(function(){
$(".btn_add_file").on('click', function(){
$("#file_temp").click();
});
//대용량 업로드 세팅
/*
* ==================================================================
* INNORIX
* 파일전송 컨트롤 생성
* ==================================================================
*/
control = innorix.create({
el: '#fileControl' // 컨트롤 출력 HTML 객체 ID
, transferMode: 'both' // 업로드, 다운로드 혼합사용
, installUrl: '<c:url value="/innorix/install/install.html" />' // Agent 설치 페이지
, uploadUrl: '<c:url value="/innorix/exam/upload.jsp" />' // 업로드 URL
, height:80
, width: 650
, maxFileCount : 1 // 첨부파일 최대 갯수
, allowExtension : ["txt","xls","xlsx","png","jpg","jpeg","doc","ppt","hwp","pdf","zip"]
// 가능한 확장자 txt|xls|xlsx|png|jpg|jpeg|doc|ppt|hwp|pdf|zip
});
// 업로드 완료 후 이벤트
control.on('uploadComplete', function (p) {
console.log('uploadComplete : ', p);
fn_callBackInnorix(p.files); // 파일 정보 DB isnert function
});
});
function noInstr(){
alert("배정된 강사가 없습니다.")
return false;
@ -182,15 +218,59 @@
});
}
function filePopupLayer(type){
commonPopLayeropen(
"${pageContext.request.contextPath}/web/ve/comm/popup/fileUploadPop.do"
, 650
, 464
, {'eduAplctOrd' : '<c:out value='${info.eduAplctOrd}'/>','fileType' : type}
, "Y"
, "fileUploadPop"
);
//서류 요청
function insetDocReq(){
//강사 선택 체크
var chkLen = $("input[name=chk]:checked").length;
if(chkLen == 0){
alert("강사를 선택해주세요.");
return false;
}
//서류명 체크
if($("input[name=docReqNm]").val() == ''){
alert("서류명을 입력해주세요.");
return false;
}
//첨부파일 체크 및 요청
if(confirm("서류 요청을 등록하시겠습니까?")){
if(control.getUploadFiles().length > 0){
var postObj = new Object();
postObj.innoDirPath = $('#innoDirPath').val();
control.setPostData(postObj); // 업로드시 함께 전달될 POST Param 추가
control.upload(); // 업로드 시작
}else{
alert("등록된 첨부파일이 없습니다.");
return false;
}
}
}
//서류 요청 양식 업로드 후 콜백
function fn_callBackInnorix(data){
var url = "<c:url value='/web/common/insertInnorixReqFileAjax.do' />";
//선택된 강사 ID
var sbmtIds = "";
$('input[name="chk"]:checked').each(function() {
sbmtIds += $(this).val()+ ",";
});
sbmtIds = sbmtIds.slice(0, -1);
var sendData = {
"fileType": "docForm"
, "eduAplctOrd": $('#eduAplctOrd').val()
, "innorixFileListVO": data
, "docReqNm" : $('#docReqNm').val()
, "sbmtId" : sbmtIds
, "successMsg" : "등록이 완료되었습니다."
}
/*
* 공통 : innorixCommon.js
* fn_innorixCmmAjax() 호출 후 status가 성공(OK)이면 실행
*/
if(fn_innorixCmmAjax(sendData, url) == "OK")
{
location.reload(true);
}
}
</script>
@ -205,6 +285,11 @@
<input type="hidden" name="eduAplctOrd" id="eduAplctOrd" value="${info.eduAplctOrd}" />
</form:form>
<form:form id="docReqForm" name="docReqForm" commandName="vEEduAplctVO" onsubmit="return false;" method="post">
<input type="hidden" name="eduAplctOrd" id="eduAplctOrd" value="${info.eduAplctOrd}" />
<input type="hidden" id="innoDirPath" value="<spring:eval expression="@globalSettings['Globals.Innorix.FilePath']"/>" />
</form:form>
<!-- 팝업을 위한 mask -->
<div class="mask"></div>
@ -277,7 +362,7 @@
</tr>
</thead>
<tbody>
<c:forEach var="list" items="${chasiList}" varStatus="status">
<c:forEach var="list" items="${instrList}" varStatus="status">
<tr>
<td>
${empty list.instrNm ? '-' : list.instrNm}
@ -312,7 +397,145 @@
</div>
</div>
</div>
<!--// 설문조사 팝업-->
<!-- 서류요청 팝업 -->
<div class="tooltip-wrap">
<div class="popup_wrap popType05" tabindex="0" data-tooltip-con="sub37_pop02" data-focus="sub37_pop02" data-focus-prev="sub37_pop02_close">
<div class="popup_tit">
<p>강사 연락처</p>
<button class="btn_popup_close tooltip-close" data-focus="sub37_pop02_close" title="팝업 닫기"><i></i></button>
</div>
<div class="popup_cont">
<div class="cont_body">
<div class="pop_tb_type02">
<table>
<caption>강사 간략 정보 : 이름, 이메일, 연락처 </caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th scope="col">강사명</th>
<th scope="col">핸드폰</th>
<th scope="col">이메일</th>
</tr>
</thead>
<tbody>
<c:forEach var="list" items="${instrList}" varStatus="status">
<tr>
<td>
<c:if test="${not empty list.instrNm}">
<input name="chk" id="<c:out value="${list.userId}"/>" type="checkbox" value="<c:out value="${list.userId}"/>"/> <label for="<c:out value="${list.userId}"/>"></label>
</c:if>
${empty list.instrNm ? '-' : list.instrNm}
</td>
<td>
${list.phone}
</td>
<td>
${list.email}
</td>
</tr>
</c:forEach>
<tr>
<td>서류명</td>
<td colspan="2"><input name="docReqNm" id="docReqNm" size="50px;" style="height:30px;" maxlength="40" /></td>
</tr>
<%-- <tr>
<td>
<button type="button" class="btnType01 btn_add_file">파일찾기</button>
<input type="file" id="file_temp" name="file_temp" class="uploadFile" style="display:none"/>
</td>
</tr>
<tr>
<td colspan="3" class="upload_area">
<div class="file_wrap no_img_box file_upload_box" style="">
<table>
<caption>첨부파일 파일명, 종류, 크기 정보 제공</caption>
<colgroup>
<col style="width: auto;">
<col style="width: 15%;">
<col style="width: 15%;">
</colgroup>
<thead>
<tr><th scope="col">파일 명</th>
<th scope="col">종류</th>
<th scope="col">크기</th>
</tr></thead>
<tbody class="tb_file_before">
<tr>
<td colspan="3">
<p>첨부하실 파일을 <span>마우스끌어서</span> 넣어주세요.</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="file_wrap file_list_div fileAfter" style="display: none;">
<table>
<caption>첨부파일 파일명, 종류, 크기, 삭제 정보 제공</caption>
<colgroup>
<col style="width: auto;">
<col style="width: 15%;">
<col style="width: 15%;">
<col style="width: 100px;">
</colgroup>
<thead>
<tr><th scope="col">파일 명</th>
<th scope="col">종류</th>
<th scope="col">크기</th>
<th scope="col">삭제</th>
</tr></thead>
<tbody id="tbody_fiielist" class="tb_file_after">
</tbody>
</table>
</div>
</td>
</tr> --%>
</tbody>
</table>
</div>
<div class="popup_cont upload_area">
<div>
<div class="pop_search_wrap">
<label for="fileNm" class="label">첨부파일 선택</label>
<button type="button" onclick="control.openFileDialogSingle();" class="btnType01 btn_add_file">파일찾기</button>
</div>
<div id="fileControl"></div><br/>
<div class="pop_btn_wrap btn_layout01">
<div class="btn_left">
</div>
<div class="btn_center">
</div>
<div class="btn_right">
</div>
</div>
</div>
</div>
<div class="pop_btn_wrap btn_layout01">
<div class="btn_left">
</div>
<div class="btn_center">
<button type="button" class="btnType05" id="popupSubmin" onclick="insetDocReq();">요청</button>
<button type="button" class="btnType02 tooltip-close" data-focus="sub37_pop02_close" data-focus-next="sub37_pop02">닫기</button>
</div>
<div class="btn_right">
</div>
</div>
</div>
</div>
</div>
</div>
<!--// 서류요청 팝업-->
@ -711,6 +934,7 @@
</c:forEach>
<c:choose>
<c:when test="${instrYn eq 'Y'}">
<button type="button" class="btnType05" data-tooltip="sub37_pop02" title="팝업 열림">서류요청</button>
<button type="button" class="btnType05" data-tooltip="sub37_pop01" title="팝업 열림">강사정보</button>
</c:when>
<c:otherwise>
@ -788,57 +1012,65 @@
</table>
</div>
<c:set var="instrYn" value="N"/>
<c:forEach items="${chasiList}" var="list">
<c:if test="${not empty list.instrNm}">
<c:set var="instrYn" value="Y" />
</c:if>
</c:forEach>
<c:if test="${instrYn eq 'Y'}">
<c:if test="${not empty docReqList}">
<div class="tb_tit01">
<div class="tb_tit01_left">
<p>필요양식</p>
<p>요청서류 목록</p>
</div>
</div>
<div class="btn_wrap"><input type="text" /> <button type="button" class="btnType05 data-tooltip="sub35_pop01" id="OATH" onclick="filePopupLayer('OATH')" title="팝업 열림">필요양식 업로드</button></div>
<div class="tb_type02">
<table>
<%-- <caption>교육차시 정보 교육희망일, 시간, 구분, 대상, 배정강사, 인원 을/를 제공하는 표</caption> --%>
<colgroup>
<col style="width: 18%;">
<col style="width: 18%;">
<col style="width: 18%;">
<col style="width: auto;">
<col style="width: 11%;">
<col style="width: 12%;">
</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>
</tr>
</thead>
<tbody>
<c:forEach var="docReqList" items="${docReqList}">
<tr>
<th>
범죄경력조회 동의서
<c:out value="${docReqList.docReqNm}" />
</th>
<td>
청소년강사1
<c:out value="${docReqList.instrNm}" />
</td>
<td>
동의서.zip
</td>
</tr>
<tr>
<th>
범죄경력조회 동의서
</th>
<td>
청소년강사2
</td>
<td>
미제출
<c:import url="/cmm/fms/selectBBSFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${docReqList.docFormAtchFileId}" />
</c:import>
</td>
<td>
<c:if test="${not empty docReqList.sbmtAtchFileId}">
<c:import url="/cmm/fms/selectBBSFileInfs.do" charEncoding="utf-8">
<c:param name="param_atchFileId" value="${docReqList.sbmtAtchFileId}" />
</c:import>
</c:if>
<c:if test="${empty docReqList.sbmtAtchFileId}">
미제출
</c:if>
</td>
<td>
<c:if test="${not empty docReqList.sbmtAtchFileId}">
<c:out value="${docReqList.sbmtPnttm}" />
</c:if>
<c:if test="${empty docReqList.sbmtAtchFileId}">
-
</c:if>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<p style="color:gray;font-size:14px;padding-top:30px;">* 확정된 교육에 대한 변경은 위원회를 통해 진행 부탁드립니다.</p>