diff --git a/src/main/java/cokr/xit/fims/excl/ExclQuery.java b/src/main/java/cokr/xit/fims/excl/ExclQuery.java index 9a7ebc44..bbe4c3e5 100644 --- a/src/main/java/cokr/xit/fims/excl/ExclQuery.java +++ b/src/main/java/cokr/xit/fims/excl/ExclQuery.java @@ -46,7 +46,7 @@ public class ExclQuery extends CmmnQuery { private String vhrno; // 단속(TB_CRDN)_차량번호 private String rtpyrNm; // 납부자(TB_PAYER)_납부자 명 // ETC - private String callPurpose; // 호출용도 필요시 사용(select, create, update) + private String callPurpose; // 호출용도 필요시 사용(view, select, create, update) private String delYn; // 삭제 여부 private String delRsn; // 삭제 사유 private String ansRsnCd; // 민원 답변 문구(TB_CVLCPT_ANS_WORDS) - 답변 사유 코드 diff --git a/src/main/java/cokr/xit/fims/excl/service/bean/Excl02Bean.java b/src/main/java/cokr/xit/fims/excl/service/bean/Excl02Bean.java index b1a2b24d..82767ae9 100644 --- a/src/main/java/cokr/xit/fims/excl/service/bean/Excl02Bean.java +++ b/src/main/java/cokr/xit/fims/excl/service/bean/Excl02Bean.java @@ -197,7 +197,8 @@ public class Excl02Bean extends AbstractComponent { // 의견제출 ID로 파일(TB_FILE) 정보 조회 List infoFileList = fileBean.getFileList(new FileQuery().setInfoType(OpnnSbmsn.INF_TYPE) - .setInfoKeys(opnnSbmsn.getOpnnId()).setOrderBy("FILE_ID")); + .setInfoKeys(opnnSbmsn.getOpnnId()) + .setOrderBy("FILE_ID")); if (infoFileList != null && infoFileList.size() > 0) { String[] fileIDs = new String[infoFileList.size()]; diff --git a/src/main/java/cokr/xit/fims/sprt/service/Sprt02Service.java b/src/main/java/cokr/xit/fims/sprt/service/Sprt02Service.java index 4575d313..e02a078e 100644 --- a/src/main/java/cokr/xit/fims/sprt/service/Sprt02Service.java +++ b/src/main/java/cokr/xit/fims/sprt/service/Sprt02Service.java @@ -39,9 +39,15 @@ public interface Sprt02Service { List getCrdnFileList(SprtQuery req); /** 단속 사진에 대한 정보를 수정한다. - * @param nonQueryRequest 처리 요청, crdn 단속정보, newFileInfoList 업로드 파일 목록 - * @return 저장여부 + * @param crdn 단속 대장, newFileInfoList 업로드 파일 목록 + * @return 저장 메시지 */ - String updateCrdnImageFile(Map nonQueryRequest, Crdn crdn, List newFileInfoList); + String updateCrdnImageFile(Crdn crdn, List newFileInfoList); + + /** 단속 사진에 대한 정보를 삭제한다. + * @param crdnId 단속 Id, atchFileCnt 첨부 파일 갯수, fileIDs 파일 IDs + * @return 저장 메시지 + */ + String removeCrdnImageFile(String crdnId, Integer atchFileCnt, String... fileIDs); } diff --git a/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02Bean.java b/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02Bean.java index 44ee6afd..00207e70 100644 --- a/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02Bean.java +++ b/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02Bean.java @@ -1,9 +1,15 @@ package cokr.xit.fims.sprt.service.bean; +import java.util.List; +import java.util.Map; + import javax.annotation.Resource; import org.springframework.stereotype.Component; +import cokr.xit.base.file.FileInfo; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.base.file.service.bean.FileBean; import cokr.xit.fims.crdn.Crdn; import cokr.xit.fims.sprt.SprtQuery; import cokr.xit.fims.sprt.dao.TotalInfoMapper; @@ -27,6 +33,10 @@ public class Sprt02Bean extends AbstractComponent { @Resource(name = "totalInfoMapper") private TotalInfoMapper totalInfoMapper; + /** 파일 Bean */ + @Resource(name="fileBean") + private FileBean fileBean; + /**지정한 조건에 따라 개별총정보의 main(단속) 정보를 반환한다. * @param req 개별 총정보 조회 조건 * @return main(단속) 정보 @@ -43,12 +53,80 @@ public class Sprt02Bean extends AbstractComponent { return totalInfoMapper.selectCrdnPayerInfo(req); } - public String updateCrdnAtchFileCnt(Crdn crdn) { + /** 단속 사진에 대한 정보를 수정한다. + * @param crdn 단속 대장, newFileInfoList 업로드 파일 목록 + * @return 저장 메시지 + */ + public String updateCrdnImageFile(Crdn crdn, List newFileInfoList) { + // 변수 선언 + boolean retSuccess = false; // DB 처리 결과 + String retMessage = ""; // 처리 결과 메시지 + + // 파일 등록 + int fileInsertEffected = fileBean.create(newFileInfoList); + + // 단속 ID로 파일(TB_FILE) 정보 조회 + List infoFileList = fileBean.getFileList(new FileQuery().setInfoType(Crdn.INF_TYPE) + .setInfoKeys(crdn.getCrdnId()) + .setOrderBy("FILE_ID")); + + if (infoFileList != null && infoFileList.size() > 0) { + String[] fileIDs = new String[infoFileList.size()]; + + for (int iLoop = 0; iLoop < infoFileList.size(); iLoop++) { + fileIDs[iLoop] = infoFileList.get(iLoop).string("FILE_ID"); + } + + fileBean.reorder(fileIDs); // 첨부파일 재 정렬 + } + + crdn.setAtchFileCnt(crdn.getAtchFileCnt() + fileInsertEffected); + + // 단속 대장을 수정 한다. + retSuccess = totalInfoMapper.updateCrdnAtchFileCnt(crdn); + if (!retSuccess) { + // 예외를 발생시켜서 오류메세지를 보내고 DB Rollback + throw new RuntimeException("단속 첨부 파일 갯수 수정에 실패하였습니다."); + } + + retMessage = "[S] 작업이 정상 처리 되었습니다."; + + return retMessage; + } + + /** 단속 사진에 대한 정보를 삭제한다. + * @param crdnId 단속 Id, atchFileCnt 첨부 파일 갯수, fileIDs 파일 IDs + * @return 저장 메시지 + */ + public String removeCrdnImageFile(String crdnId, Integer atchFileCnt, String... fileIDs) { // 변수 선언 boolean retSuccess = false; // DB 처리 결과 String retMessage = ""; // 처리 결과 메시지 - // 의견제출 대장을 수정 한다. + // 파일 삭제 + int fileInsertEffected = fileBean.remove(fileIDs); + + // 단속 ID로 파일(TB_FILE) 정보 조회 + List infoFileList = fileBean.getFileList(new FileQuery().setInfoType(Crdn.INF_TYPE) + .setInfoKeys(crdnId) + .setOrderBy("FILE_ID")); + + if (infoFileList != null && infoFileList.size() > 0) { + String[] reorderFileIDs = new String[infoFileList.size()]; + + for (int iLoop = 0; iLoop < infoFileList.size(); iLoop++) { + reorderFileIDs[iLoop] = infoFileList.get(iLoop).string("FILE_ID"); + } + + fileBean.reorder(reorderFileIDs); // 첨부파일 재 정렬 + } + + Crdn crdn = new Crdn(); + + crdn.setCrdnId(crdnId); + crdn.setAtchFileCnt(atchFileCnt - fileInsertEffected); + + // 단속 대장을 수정 한다. retSuccess = totalInfoMapper.updateCrdnAtchFileCnt(crdn); if (!retSuccess) { // 예외를 발생시켜서 오류메세지를 보내고 DB Rollback diff --git a/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02ServiceBean.java b/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02ServiceBean.java index bf8b4f1a..32de83a5 100644 --- a/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02ServiceBean.java +++ b/src/main/java/cokr/xit/fims/sprt/service/bean/Sprt02ServiceBean.java @@ -1,6 +1,5 @@ package cokr.xit.fims.sprt.service.bean; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -12,7 +11,6 @@ import cokr.xit.base.file.FileInfo; import cokr.xit.base.file.service.FileQuery; import cokr.xit.base.file.service.bean.FileBean; import cokr.xit.fims.crdn.Crdn; -import cokr.xit.fims.excl.OpnnSbmsn; import cokr.xit.fims.sprt.SprtQuery; import cokr.xit.fims.sprt.service.Sprt02Service; import cokr.xit.foundation.component.AbstractServiceBean; @@ -67,68 +65,17 @@ public class Sprt02ServiceBean extends AbstractServiceBean implements Sprt02Serv fileQuery.setInfoType(Crdn.INF_TYPE); fileQuery.setInfoKeys(req.getCrdnId()); - List fileList = fileBean.getFileList(fileQuery); - - // 동영상 존재 여부 확인 -// dataObject.set("videoExist", "N"); -// String linkTblNm = dataObject.string("LINK_TBL_NM"); -// -// if (!linkTblNm.equals("")) { -// if (linkTblNm.equals("TB_ESB_INTERFACE")) { -// fileQuery.setInfoType("010"); -// } else if(linkTblNm.equals("TB_SAEOL")) { -// fileQuery.setInfoType("020"); -// } else { -// throw new RuntimeException("파일 조회 중 오류가 발생하였습니다."); -// } -// -// fileQuery.setInfoKeys(dataObject.string("LINK_ID")); -// -// List linkFileList = fileBean.getFileList(fileQuery); -// -// if (linkFileList != null && !linkFileList.isEmpty()) { -// for (int iLoop = 0; iLoop < linkFileList.size(); iLoop++) { -// String mimeType = linkFileList.get(iLoop).string("MIME_TYPE"); -// if (Arrays.asList(Sprt.VIDEO_MIME_TYPE).contains(mimeType)) { -// dataObject.set("videoExist", "Y"); -// } -// } -// } -// } - - return fileList; + return fileBean.getFileList(fileQuery); } @Override - public String updateCrdnImageFile(Map nonQueryRequest, Crdn crdn, List newFileInfoList) { - // 변수 선언 - String retMessage = ""; // 처리 결과 메시지 - - // 첨부파일 등록 - if (newFileInfoList != null && !newFileInfoList.isEmpty()) { - // 파일 등록 - int fileInsertEffected = fileBean.create(newFileInfoList); - - // 단속 ID로 파일(TB_FILE) 정보 조회 - List infoFileList = fileBean.getFileList(new FileQuery().setInfoType(Crdn.INF_TYPE) - .setInfoKeys(crdn.getCrdnId()).setOrderBy("FILE_ID")); - - if (infoFileList != null && infoFileList.size() > 0) { - String[] fileIDs = new String[infoFileList.size()]; - - for (int iLoop = 0; iLoop < infoFileList.size(); iLoop++) { - fileIDs[iLoop] = infoFileList.get(iLoop).string("FILE_ID"); - } - - fileBean.reorder(fileIDs); // 첨부파일 재 정렬 - } - - crdn.setAtchFileCnt(crdn.getAtchFileCnt() + fileInsertEffected); - - retMessage = sprt02Bean.updateCrdnAtchFileCnt(crdn); - } + public String updateCrdnImageFile(Crdn crdn, List newFileInfoList) { + return sprt02Bean.updateCrdnImageFile(crdn, newFileInfoList); + } - return retMessage; + @Override + public String removeCrdnImageFile(String crdnId, Integer atchFileCnt, String... fileIDs) { + return sprt02Bean.removeCrdnImageFile(crdnId, atchFileCnt, fileIDs); } } diff --git a/src/main/java/cokr/xit/fims/sprt/web/Sprt02Controller.java b/src/main/java/cokr/xit/fims/sprt/web/Sprt02Controller.java index 0f89e6bf..501f61bd 100644 --- a/src/main/java/cokr/xit/fims/sprt/web/Sprt02Controller.java +++ b/src/main/java/cokr/xit/fims/sprt/web/Sprt02Controller.java @@ -22,7 +22,6 @@ import cokr.xit.fims.cmmn.CrdnSttsHstryQuery; import cokr.xit.fims.cmmn.service.CrdnPayerHstryService; import cokr.xit.fims.cmmn.service.CrdnSttsHstryService; import cokr.xit.fims.crdn.Crdn; -import cokr.xit.fims.cvlc.CrdnCvlcpt; import cokr.xit.fims.excl.ExclQuery; import cokr.xit.fims.excl.service.Excl01Service; import cokr.xit.fims.excl.service.Excl02Service; @@ -141,8 +140,6 @@ public class Sprt02Controller extends ApplicationController { public ModelAndView getCrdnFileList(SprtQuery req) { List fileList = sprt02Service.getCrdnFileList(req); - boolean json = jsonResponse(); - ModelAndView mav = new ModelAndView("jsonView"); return mav @@ -160,42 +157,50 @@ public class Sprt02Controller extends ApplicationController { * "saved": 저장되었으면 true, 그렇지 않으면 false * } */ - @RequestMapping(name="단속 이미지 파일 저장", value="/020/update.do") - public ModelAndView updateCrdnImageFile(HttpServletRequest hReq, Crdn crdn, MultipartFile[] newFileList, MultipartFile[] modifyFileList) { + @RequestMapping(name="단속 이미지 파일 저장", value="/020/updateFile.do") + public ModelAndView updateCrdnImageFile(Crdn crdn, MultipartFile[] newFileList) { boolean saved = false; String retMessage = "[F] "; - String[] deleteFileKeyList = hReq.getParameterValues("deleteFileKeyList"); - String[] modifyFileKeyList = hReq.getParameterValues("modifyFileKeyList"); - List newFileInfoList = new ArrayList(); - if (newFileList != null || modifyFileList != null) { + if (newFileList != null) { Relation relation = new Relation(); + relation.setInfoType(Crdn.INF_TYPE); relation.setInfoKey(crdn.getCrdnId()); if (newFileList != null) { newFileInfoList = new FileInfoFactory().makeFileInfos(relation, newFileList); } - if (modifyFileList != null) { - newFileInfoList.addAll(new FileInfoFactory().makeFileInfos(relation, modifyFileList)); - - if (deleteFileKeyList == null) { - deleteFileKeyList = modifyFileKeyList; - } else { - String[] arr1 = deleteFileKeyList; - String[] arr2 = modifyFileKeyList; - String[] sumArr = Stream.of(arr1, arr2).flatMap(Stream::of).toArray(String[]::new); - deleteFileKeyList = (sumArr); - } - } } - Map nonQueryRequest = new HashMap(); + retMessage = sprt02Service.updateCrdnImageFile(crdn, newFileInfoList); + if (retMessage.contains("[S]")) { + saved = true; + } else { + saved = false; + } - nonQueryRequest.put("deleteFileKeyList", deleteFileKeyList); + return new ModelAndView("jsonView") + .addObject("saved", saved) + .addObject("retMessage", retMessage); + } + + /**단속 이미지 파일 정보를 삭제한다. + * @param crdnId 단속 Id, atchFileCnt 첨부 파일 갯수, fileIDs 파일 IDs + * @return jsonView + *
 {
+	 *     "affected": 저장된 정보수
+	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @RequestMapping(name="단속 이미지 파일 저장", value="/020/removeFile.do") + public ModelAndView removeCrdnImageFile(String crdnId, String atchFileCnt, String... fileIDs) { + boolean saved = false; + String retMessage = "[F] "; + Integer fileCnt = Integer.parseInt(atchFileCnt); - retMessage = sprt02Service.updateCrdnImageFile(nonQueryRequest, crdn, newFileInfoList); + retMessage = sprt02Service.removeCrdnImageFile(crdnId, fileCnt, fileIDs); if (retMessage.contains("[S]")) { saved = true; } else { diff --git a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02010-main.jsp b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02010-main.jsp index 13988994..587d082c 100644 --- a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02010-main.jsp +++ b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02010-main.jsp @@ -38,7 +38,9 @@ -

+ +

+ -

+ +

+
diff --git a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02050-info.jsp b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02050-info.jsp index 6a8b2a2a..b3d28048 100644 --- a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02050-info.jsp +++ b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02050-info.jsp @@ -135,7 +135,7 @@
-

+

@@ -350,7 +350,7 @@ , content : resp , size : "lg" , init : () => { } - , onClose : () => { fnDataRefreshInfo(); } // callback 자료 재조회 + , onClose : () => { refreshDataInfo{pageName}(); } // callback 자료 재조회 }); } }); @@ -364,7 +364,7 @@ dialog.alert(showMessage); if (resp.saved) { - fnDataRefreshInfo(); // 자료 재조회 + refreshDataInfo{pageName}(); // 자료 재조회 } } @@ -421,7 +421,7 @@ , content : resp , size : "lg" , init : () => { } - , onClose : () => { fnDataRefreshInfo(); } // callback 자료 재조회 + , onClose : () => { refreshDataInfo{pageName}(); } // callback 자료 재조회 }); } }); @@ -435,7 +435,7 @@ dialog.alert(showMessage); if (resp.saved) { - fnDataRefreshInfo(); // 자료 재조회 + refreshDataInfo{pageName}(); // 자료 재조회 } } @@ -449,10 +449,42 @@ } /************************************************************************** - * + * function **************************************************************************/ + // 단속 상태 이력 DataTables에 click 이벤트 + renderList${pageName}${pageDataName3} = () => { + let ${infoPrefix}List = ${pageName}${pageDataName3}Dataset; + let empty = ${infoPrefix}List.empty; + + let trs = empty ? + [document.getElementById("${infoPrefix}NotFound--${pageName}${pageDataName3}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%> + ${infoPrefix}List.inStrings( + document.getElementById("${infoPrefix}Row--${pageName}${pageDataName3}").innerHTML, <%-- from template#${infoPrefix}Row --%> + (str, dataItem) => str + .replace(/{onclick}/gi, "${pageName}${pageDataName3}Dataset.setCurrent('" + dataItem.getValue("STTS_HSTRY_ID") + "');") + ); + + $("#tbody--${pageName}${pageDataName3}").html(trs.join()); + } + + // 단속 납부자 이력 DataTables에 click 이벤트 + renderList${pageName}${pageDataName4} = () => { + let ${infoPrefix}List = ${pageName}${pageDataName4}Dataset; + let empty = ${infoPrefix}List.empty; + + let trs = empty ? + [document.getElementById("${infoPrefix}NotFound--${pageName}${pageDataName4}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%> + ${infoPrefix}List.inStrings( + document.getElementById("${infoPrefix}Row--${pageName}${pageDataName4}").innerHTML, <%-- from template#${infoPrefix}Row --%> + (str, dataItem) => str + .replace(/{onclick}/gi, "${pageName}${pageDataName4}Dataset.setCurrent('" + dataItem.getValue("CHG_HSTRY_ID") + "');") + ); + + $("#tbody--${pageName}${pageDataName4}").html(trs.join()); + } + // 자료 재조회 - fnDataRefreshInfo = () => { + refreshDataInfo{pageName} = () => { let crdnId = $("#crdnId--${pageNameMain}").val(); // 단속 ID 가 없다면.. return @@ -502,38 +534,6 @@ }); } - // 단속 상태 이력 DataTables에 click 이벤트 - renderList${pageName}${pageDataName3} = () => { - let ${infoPrefix}List = ${pageName}${pageDataName3}Dataset; - let empty = ${infoPrefix}List.empty; - - let trs = empty ? - [document.getElementById("${infoPrefix}NotFound--${pageName}${pageDataName3}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%> - ${infoPrefix}List.inStrings( - document.getElementById("${infoPrefix}Row--${pageName}${pageDataName3}").innerHTML, <%-- from template#${infoPrefix}Row --%> - (str, dataItem) => str - .replace(/{onclick}/gi, "${pageName}${pageDataName3}Dataset.setCurrent('" + dataItem.getValue("STTS_HSTRY_ID") + "');") - ); - - $("#tbody--${pageName}${pageDataName3}").html(trs.join()); - } - - // 단속 납부자 이력 DataTables에 click 이벤트 - renderList${pageName}${pageDataName4} = () => { - let ${infoPrefix}List = ${pageName}${pageDataName4}Dataset; - let empty = ${infoPrefix}List.empty; - - let trs = empty ? - [document.getElementById("${infoPrefix}NotFound--${pageName}${pageDataName4}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%> - ${infoPrefix}List.inStrings( - document.getElementById("${infoPrefix}Row--${pageName}${pageDataName4}").innerHTML, <%-- from template#${infoPrefix}Row --%> - (str, dataItem) => str - .replace(/{onclick}/gi, "${pageName}${pageDataName4}Dataset.setCurrent('" + dataItem.getValue("CHG_HSTRY_ID") + "');") - ); - - $("#tbody--${pageName}${pageDataName4}").html(trs.join()); - } - /************************************************************************** * 초기 셋팅 **************************************************************************/ @@ -548,7 +548,7 @@ } /************************************************************************** - * function + * 버튼 clickEvent **************************************************************************/ // 감경 등록 fnCreate${pageName}${pageDataName1} = () => { diff --git a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02060-info.jsp b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02060-info.jsp index 38024565..d98f68a3 100644 --- a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02060-info.jsp +++ b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02060-info.jsp @@ -194,7 +194,7 @@
-

+

diff --git a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02070-info.jsp b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02070-info.jsp index 7dc843bd..9ee05787 100644 --- a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02070-info.jsp +++ b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02070-info.jsp @@ -112,7 +112,9 @@
-

+ +

+
diff --git a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02080-info.jsp b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02080-info.jsp index c4c0d78f..ce15fdbd 100644 --- a/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02080-info.jsp +++ b/src/main/webapp/WEB-INF/jsp/fims/sprt/sprt02080-info.jsp @@ -146,7 +146,7 @@ , content : resp , size : "lg" , init : () => { } - , onClose : () => { fnDataRefreshInfo(); } // callback 자료 재조회 + , onClose : () => { refreshDataInfo{pageName}(); } // callback 자료 재조회 }); } }); @@ -160,7 +160,7 @@ dialog.alert(showMessage); if (resp.saved) { - fnDataRefreshInfo(); // 자료 재조회 + refreshDataInfo{pageName}(); // 자료 재조회 } } @@ -174,7 +174,7 @@ } /************************************************************************** - * + * function **************************************************************************/ // DataTables에 click 이벤트 renderList${pageName} = () => { @@ -193,7 +193,7 @@ } // 자료 재조회 - fnDataRefreshInfo = () => { + refreshDataInfo{pageName} = () => { let crdnId = $("#crdnId--${pageNameMain}").val(); let vhrno = $("#vhrno--${pageNameMain}").val(); @@ -235,7 +235,7 @@ } /************************************************************************** - * function + * 버튼 clickEvent **************************************************************************/ // 민원 상담 내용 등록 fnCreate${pageName} = () => {