의견제출 심의결과(답변) 처리 수정.

main
jjh 1 year ago
parent 198fe42b5e
commit 20bde725ee

@ -137,4 +137,24 @@ public interface Excl02Mapper extends AbstractMapper {
return excl02 != null && updateOpnnSbmsnYn(params().set("excl02", excl02)) == 1;
}
/** .
* @param params
* <ul><li>"opnnSbmsn" - </li>
* <li>"currentUser" - </li>
* </ul>
* @return
*/
int updateAnsSttsCd(Map<String, Object> params);
/** .
* @param opnnSbmsn
* @return
* <ul><li> true</li>
* <li> false</li>
* </ul>
*/
default boolean updateOpnnSbmsnAnswer(Excl02 excl02) {
return excl02 != null && updateAnsSttsCd(params().set("excl02", excl02)) == 1;
}
}

@ -2,8 +2,7 @@ package cokr.xit.fims.excl.service;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import cokr.xit.base.file.FileInfo;
import cokr.xit.fims.excl.Excl02;
import cokr.xit.fims.excl.Excl02Query;
import cokr.xit.foundation.data.DataObject;
@ -45,7 +44,7 @@ public interface Excl02Service {
* <li> false</li>
* </ul>
*/
boolean createOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFileList);
boolean createOpnnSbmsn(Excl02 excl02, List<FileInfo> fileInfoList);
/** .
* @param opnnSbmsn
@ -54,7 +53,7 @@ public interface Excl02Service {
* <li> false</li>
* </ul>
*/
boolean updateOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFileList);
boolean updateOpnnSbmsn(Excl02 excl02, List<FileInfo> fileInfoList);
/** .
* @param opnnSbmsn
@ -74,4 +73,13 @@ public interface Excl02Service {
*/
boolean removeOpnnSbmsnList(Excl02Query req);
/** () .
* @param opnnSbmsn
* @return
* <ul><li> true</li>
* <li> false</li>
* </ul>
*/
boolean updateOpnnSbmsnAnswer(Excl02 excl02);
}

@ -117,4 +117,15 @@ public class Excl02Bean extends AbstractComponent {
return excl02Mapper.updateCrdn(excl02);
}
/** () .
* @param excl02
* @return
* <ul><li> true</li>
* <li> false</li>
* </ul>
*/
public boolean updateOpnnSbmsnAnswer(Excl02 excl02) {
return excl02Mapper.updateOpnnSbmsnAnswer(excl02);
}
}

@ -5,13 +5,13 @@ import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import cokr.xit.base.file.FileInfo;
import cokr.xit.base.file.service.FileQuery;
import cokr.xit.base.file.service.bean.FileBean;
import cokr.xit.base.file.web.FileInfoFactory;
import cokr.xit.fims.cmmn.CrdnSttsHstry;
import cokr.xit.fims.cmmn.service.bean.CrdnSttsHstryBean;
import cokr.xit.fims.excl.Excl01Query;
import cokr.xit.fims.excl.Excl02;
import cokr.xit.fims.excl.Excl02Query;
import cokr.xit.fims.excl.service.Excl02Service;
@ -57,19 +57,11 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
public DataObject getOpnnSbmsnInfo(Excl02Query req) {
DataObject opnnSbmsn = excl02Bean.getOpnnSbmsnInfo(req);
// 등록으로 실행했는데 의견제출 ID가 존재한다면 이미 등록되었으므로 오류로 처리..
if (req.getOpnnId() == null) {
if (!opnnSbmsn.string("OPNN_ID").equals("")) {
// 예외를 발생시켜서 오류메세지를 보낸다..
throw new RuntimeException("등록된 의견제출 정보가 있습니다.");
}
}
return opnnSbmsn;
}
@Override
public boolean createOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFileList) {
public boolean createOpnnSbmsn(Excl02 excl02, List<FileInfo> fileInfoList) {
// 변수 선언
boolean retSuccess = false; // DB 처리 결과
@ -83,8 +75,8 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
}
// 파일 갯수 입력
if (uploadFileList != null) {
excl02.setAtchFileCnt(uploadFileList.length);
if (fileInfoList != null && !fileInfoList.isEmpty()) {
excl02.setAtchFileCnt(fileInfoList.size());
} else {
excl02.setAtchFileCnt(0);
}
@ -99,9 +91,7 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
}
// 의견제출 파일 첨부하기
if (uploadFileList != null) {
List<FileInfo> fileInfoList = new FileInfoFactory().makeFileInfos(null, uploadFileList);
if (fileInfoList != null && !fileInfoList.isEmpty()) {
fileInfoList.forEach(fileInfo -> fileInfo.setInfoType(Excl02.INF_TYPE).setInfoKey(excl02.getOpnnId()));
fileBean.create(fileInfoList);
@ -143,7 +133,7 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
}
@Override
public boolean updateOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFileList) {
public boolean updateOpnnSbmsn(Excl02 excl02, List<FileInfo> fileInfoList) {
// 변수 선언
boolean retSuccess = false; // DB 처리 결과
@ -154,8 +144,48 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
throw new RuntimeException("의견제출 대장 수정에 실패하였습니다.");
}
// 첨부 파일 수정하는 부분 필요 ///////////////////////////////////////////////////
// 의견제출 첨부 파일 수정 하기
boolean isRemoveFiles = false; // 파일을 삭제해야 하는지 확인
boolean isCreateFiles = false; // 파일을 등록홰야 하는지 확인
// 단속 ID로 파일(TB_FILE) 정보 조회
List<DataObject> infoOpnnSbmsnFileList = fileBean.getFileList(new FileQuery().setInfoType(Excl02.INF_TYPE)
.setInfoKeys(excl02.getOpnnId()));
if (fileInfoList != null && !fileInfoList.isEmpty()) { // 의견제출 첨부파일을 등록한다면..
if (infoOpnnSbmsnFileList == null || infoOpnnSbmsnFileList.size() == 0) {
isRemoveFiles = false;
isCreateFiles = true;
} else {
for (int iLoop = 0; iLoop < fileInfoList.size(); iLoop++) {
// 파일명 확인
if (fileInfoList.get(iLoop).getName() != infoOpnnSbmsnFileList.get(iLoop).string("FILE_NM")) {
isRemoveFiles = true;
isCreateFiles = true;
break;
}
}
}
} else { // 의견제출 첨부파일이 없다면..
if (infoOpnnSbmsnFileList != null && infoOpnnSbmsnFileList.size() > 0) {
isRemoveFiles = true;
isCreateFiles = false;
}
}
// 기존 파일 삭제
if (isRemoveFiles) {
String[] deleteList = {excl02.getOpnnId()};
fileBean.remove(Excl02.INF_TYPE, deleteList);
}
// 신규 파일 등록
if (isCreateFiles) {
fileInfoList.forEach(fileInfo -> fileInfo.setInfoType(Excl02.INF_TYPE).setInfoKey(excl02.getOpnnId()));
fileBean.create(fileInfoList);
}
return true;
}
@ -227,4 +257,59 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
return true;
}
@Override
public boolean updateOpnnSbmsnAnswer(Excl02 excl02) {
// 변수 선언
boolean retSuccess = false; // DB 처리 결과
String newCrdnSttsCd = ""; // 신규 단속 상태 코드(CRDN_STTS_CD)
String newOpnnSbmsnSttsCd = ""; // 신규 의견 제출 상태 코드(OPNN_SBMSN_STTS_CD)
// 의견제출(TB_OPNN_SBMSN) + 단속(TB_CRDN) 자료 조회
DataObject infoCrdnOpnnSbmsn = excl02Bean.getOpnnSbmsnInfo(new Excl02Query().setOpnnId(excl02.getOpnnId()));
// 수납 또는 취소된 자료를 의견진술 수용할 수 없다
if (infoCrdnOpnnSbmsn.number("CRDN_STTS_CD").intValue() >= 71) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException(infoCrdnOpnnSbmsn.string("CRDN_STTS_NM") + " 자료는 의견진술 수용으로 처리할 수 없습니다.");
}
// 의견제출 답변을 수정 한다.
retSuccess = excl02Bean.updateOpnnSbmsnAnswer(excl02);
if (!retSuccess) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException("의견제출 대장의 답변 수정에 실패하였습니다.");
}
// 의견제출 처리 결과가 과태료감경(04) 이라면.. 감경 등록이 필요하다.. 2023.08.16 JoJH
// 조회된 의견제출상태 코드와 수정 할 의견제출상태 코드가 다르다면..
if (!excl02.getOpnnSbmsnSttsCd().equals(infoCrdnOpnnSbmsn.string("OPNN_SBMSN_STTS_CD"))) {
if (excl02.getOpnnSbmsnSttsCd().equals("02")) { // 수용
newCrdnSttsCd = "82"; // 의견진술 수용으로 변경
} else if (excl02.getOpnnSbmsnSttsCd().equals("01") || excl02.getOpnnSbmsnSttsCd().equals("03")) { // 미수용, 자진취하
newCrdnSttsCd = infoCrdnOpnnSbmsn.string("CRDN_STTS_CD"); // 이전 단속상태코드 유지
}
// 단속상태이력(TB_CRDN_STTS_HSTRY)
CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
crdnSttsHstry.setCrdnId(infoCrdnOpnnSbmsn.string("CRDN_ID"));
crdnSttsHstry.setBfrSttsCd(infoCrdnOpnnSbmsn.string("CRDN_STTS_CD"));
crdnSttsHstry.setBfrSttsChgDt(infoCrdnOpnnSbmsn.string("CRDN_STTS_CHG_DT"));
crdnSttsHstry.setCrdnSttsCd(newCrdnSttsCd);
crdnSttsHstry.setTaskDtlId(excl02.getOpnnId());
crdnSttsHstry.setEtcCn("의견제출 답변 수정");
// 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장에 등록 한다.
retSuccess = crdnSttsHstryBean.createHstryUpdateCrdnSttsCd(crdnSttsHstry);
if (!retSuccess) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException("의견제출 답변 수정 중 단속상태코드 변경에 실패하였습니다.");
}
}
return true;
}
}

@ -63,7 +63,7 @@ public class Excl03ServiceBean extends AbstractServiceBean implements Excl03Serv
// 단속 ID로 단속(TB_CRDN) 정보 조회
DataObject infoCrdn = excl03Bean.getCrackdown(excl03.getBfrCrdnId());
// 단속 ID로 파일(TB_FILE) 정보 조회
List<DataObject> infoCrdnFileList = fileBean.getFileList(new FileQuery().setInfoType(excl03.INF_TYPE)
List<DataObject> infoCrdnFileList = fileBean.getFileList(new FileQuery().setInfoType(Excl03.INF_TYPE)
.setInfoKeys(excl03.getBfrCrdnId()));
// 재등록 단속 정보(TB_CRDN)
@ -124,24 +124,24 @@ public class Excl03ServiceBean extends AbstractServiceBean implements Excl03Serv
newCrdn.setVltnNmtm(infoCrdn.string("VLTN_NMTM")); // 위반 횟수
newCrdn.setOvtimeYn(infoCrdn.string("OVTIME_YN")); // 시간외 여부
// 재등록 단속 파일 정보(TB_FILE)
List<FileInfo> newFileInfoList = new ArrayList<FileInfo>();
List<FileInfo> fileInfoList = new ArrayList<FileInfo>();
if (!infoCrdnFileList.isEmpty() && infoCrdnFileList.size() > 0) {
// 현재 경로를 구한다.
String curWorkingDir = System.getProperty("user.dir");
if (!infoCrdnFileList.isEmpty() && infoCrdnFileList.size() > 0) {
List<File> files = new ArrayList<>();
for (int iLoop = 0; iLoop < infoCrdnFileList.size(); iLoop++) {
files.add(new File(curWorkingDir + File.separator + infoCrdnFileList.get(iLoop).string("FILE_PATH")));
}
newFileInfoList = new FileInfoFactory().createFileInfos(null, files);
fileInfoList = new FileInfoFactory().createFileInfos(null, files);
}
// 단속 대장 입력
retSuccess = crdnService.create(null, newCrdn, newFileInfoList);
retSuccess = crdnService.create(null, newCrdn, fileInfoList);
if (!retSuccess) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException("재부과 등록 중 단속대장 등록에 실패하였습니다.");

@ -1,5 +1,6 @@
package cokr.xit.fims.excl.web;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -11,6 +12,9 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import cokr.xit.base.code.CommonCode;
import cokr.xit.base.file.FileInfo;
import cokr.xit.base.file.service.FileService;
import cokr.xit.base.file.web.FileInfoFactory;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.excl.Excl02;
import cokr.xit.fims.excl.Excl02Query;
@ -33,6 +37,11 @@ public class Excl02Controller extends ApplicationController {
@Resource(name = "excl02Service")
protected Excl02Service excl02Service;
/** 파일 정보 서비스 서비스 */
@Resource(name="fileService")
private FileService fileService;
/** (excl/excl02/010-main) .
* {@link #getOpnnSbmsnList(ExclQuery01) } .
* @return /excl/excl02/010-main
@ -82,6 +91,14 @@ public class Excl02Controller extends ApplicationController {
public ModelAndView getOpnnSbmsnInfo(Excl02Query req) {
DataObject opnnSbmsnInfo = excl02Service.getOpnnSbmsnInfo(req);
// 등록으로 실행했는데 의견제출 ID가 존재한다면 이미 등록되었으므로 오류로 처리..
if (req.getOpnnId() == null && !opnnSbmsnInfo.string("OPNN_ID").equals("")) {
ModelAndView mav = new ModelAndView("jsonView");
mav.addObject("message", "등록된 의견제출 정보가 있습니다.");
return mav;
} else {
boolean json = jsonResponse();
ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/excl/excl02020-info");
@ -96,9 +113,10 @@ public class Excl02Controller extends ApplicationController {
.addObject("FIM032List", commonCodes.get("FIM032")) // 소유주 관계 구분 코드(OWNR_REL_CD)
.addObject("FIM033List", commonCodes.get("FIM033")) // 의견 제출 구분 코드(OPNN_SBMSN_SE_CD)
.addObject("FIM054List", commonCodes.get("FIM054")) // 업무 구분 코드(TASK_SE_CD)
.addObject("opnnSbmsnInfo", json ? opnnSbmsnInfo : toJson(opnnSbmsnInfo))
.addObject("opnnSbmsnInfo", json ? opnnSbmsnInfo : toJson(opnnSbmsnInfo)) // 의견제출 정보
;
}
}
/** .
* @param opnnSbmsn
@ -108,8 +126,15 @@ public class Excl02Controller extends ApplicationController {
* }</code></pre>
*/
@PostMapping(name="의견제출 대장 등록", value="/020/create.do")
public ModelAndView createOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFileList) {
boolean saved = excl02Service.createOpnnSbmsn(excl02, uploadFileList);
public ModelAndView createOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFiles) {
// 파일
List<FileInfo> fileInfoList = new ArrayList<FileInfo>();
if (uploadFiles != null && uploadFiles.length > 0) {
fileInfoList = new FileInfoFactory().makeFileInfos(null, uploadFiles);
}
boolean saved = excl02Service.createOpnnSbmsn(excl02, fileInfoList);
return new ModelAndView("jsonView")
.addObject("saved", saved);
@ -123,8 +148,15 @@ public class Excl02Controller extends ApplicationController {
* }</code></pre>
*/
@PostMapping(name="의견제출 대장 수정", value="/020/update.do")
public ModelAndView updateOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFileList) {
boolean saved = excl02Service.updateOpnnSbmsn(excl02, uploadFileList);
public ModelAndView updateOpnnSbmsn(Excl02 excl02, MultipartFile[] uploadFiles) {
// 파일
List<FileInfo> fileInfoList = new ArrayList<FileInfo>();
if (uploadFiles != null && uploadFiles.length > 0) {
fileInfoList = new FileInfoFactory().makeFileInfos(null, uploadFiles);
}
boolean saved = excl02Service.updateOpnnSbmsn(excl02, fileInfoList);
return new ModelAndView("jsonView")
.addObject("saved", saved);
@ -189,4 +221,20 @@ public class Excl02Controller extends ApplicationController {
.addObject("opnnSbmsnInfo", json ? opnnSbmsnInfo : toJson(opnnSbmsnInfo))
;
}
/** () .
* @param opnnSbmsn
* @return jsonView
* <pre><code> {
* "saved": true, false
* }</code></pre>
*/
@PostMapping(name="의견제출 대장 답변 수정", value="/030/updateAnswer.do")
public ModelAndView updateOpnnSbmsnAnswer(Excl02 excl02) {
boolean saved = excl02Service.updateOpnnSbmsnAnswer(excl02);
return new ModelAndView("jsonView")
.addObject("saved", saved);
}
}

@ -421,10 +421,6 @@
, DOC_NO = #{excl02.docNo} /* 문서 번호 */
, NTFCTN_SE_CD = #{excl02.ntfctnSeCd} /* 통보 구분 코드 */
, PIC_RVW_OPNN = #{excl02.picRvwOpnn} /* 담당자 검토 의견 */
, ANS_CN = #{excl02.ansCn} /* 답변 내용 */
, ANS_YMD = #{excl02.ansYmd} /* 답변 일자 */
, ANS_TM = #{excl02.ansTm} /* 답변 시각 */
, OPNN_SBMSN_STTS_CD = #{excl02.opnnSbmsnSttsCd} /* 의견 제출 상태 코드 */
, MDFCN_DT = #{excl02.lastModified} /* 수정 일시 */
, MDFR = #{excl02.modifiedBy} /* 수정자 */
WHERE OPNN_ID = #{excl02.opnnId} /* 의견 ID */
@ -448,4 +444,18 @@
WHERE CRDN_ID = #{excl02.crdnId} /* 단속 ID */
</update>
<update id="updateAnsSttsCd" parameterType="map">/* 의견제출 대장 답변 수정(excl02Mapper.updateAnsSttsCd) */
UPDATE TB_OPNN_SBMSN
SET OPNN_SBMSN_GIST = #{excl02.opnnSbmsnGist} /* 의견 제출 요지 */
, PIC_RVW_OPNN = #{excl02.picRvwOpnn} /* 담당자 검토 의견 */
, NTFCTN_SE_CD = #{excl02.ntfctnSeCd} /* 통보 구분 코드 */
, OPNN_SBMSN_STTS_CD = #{excl02.opnnSbmsnSttsCd} /* 의견 제출 상태 코드 */
, ANS_YMD = #{excl02.ansYmd} /* 답변 일자 */
, ANS_TM = #{excl02.ansTm} /* 답변 시각 */
, ANS_CN = #{excl02.ansCn} /* 답변 내용 */
, MDFCN_DT = #{excl02.lastModified} /* 수정 일시 */
, MDFR = #{excl02.modifiedBy} /* 수정자 */
WHERE OPNN_ID = #{excl02.opnnId} /* 의견 ID */
</update>
</mapper>

@ -186,7 +186,7 @@
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive" style="overflow-x:scroll; height:400px; overflow-y:scroll;" >
<table class="datatables-ajax table table-bordered dataTable no-footer"
<table class="dataTable datatables-ajax table table-bordered table-striped no-footer"
id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead>
<tr id="theadTr--${pageName}"

@ -193,7 +193,7 @@
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive" style="overflow-x:scroll; height:400px; overflow-y:scroll;" >
<table class="datatables-ajax table table-bordered dataTable no-footer"
<table class="dataTable datatables-ajax table table-bordered table-striped no-footer"
id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead>
<tr id="theadTr--${pageName}"
@ -366,7 +366,7 @@
.replace(/prefixName/g, this.prefixName)
dialog.open({
id : ${pageName}Control.prefixed("dialog")
, title : "의견제출 결과 처리"
, title : "의견제출 답변 처리"
, content : resp
, size : "lg"
});

@ -1,6 +1,8 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<link rel="stylesheet" href="<c:url value='/resources/3rd-party/sneat/libs/dropzone/dropzone.css'/>"/>
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
@ -13,29 +15,34 @@
<div class="row g-1">
<!-- 차량번호 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" class="form-control w-25" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" readonly />
<input type="text" class="form-control w-30" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" readonly />
</div>
<!-- 위반일시 -->
<div class="col-md-4">
<label for="crdnYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">위반일시</label>
<input type="text" class="form-control w-30" id="crdnYmd--${pageName}" name="crdnYmd" data-map="CRDN_YMD" readonly />
</div>
<!-- 납부자 명 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="rtpyrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납부자</label>
<input type="text" class="form-control w-45" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM" readonly />
<input type="text" class="form-control w-60" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM" readonly />
</div>
<!-- 접수 번호 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="rcptNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수 번호</label>
<input type="text" class="form-control w-25" id="rcptNo--${pageName}" name="rcptNo" data-map="RCPT_NO" required />
<input type="text" class="form-control w-30" id="rcptNo--${pageName}" name="rcptNo" data-map="RCPT_NO" required />
</div>
<!-- 접수 일자 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="rcptYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수 일자</label>
<input type="text" class="form-control form-date" id="rcptYmd--${pageName}" name="rcptYmd" data-map="RCPT_YMD"
data-fmt-type="day" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-sm bx-calendar bg-white"></button>
</div>
<!-- 접수 구분 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="rcptSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수 구분</label>
<select class="form-select" id="rcptSeCd--${pageName}" name="rcptSeCd" data-map="RCPT_SE_CD" required>
<option value="">선택하세요</option>
@ -44,18 +51,8 @@
</c:forEach>
</select>
</div>
<!-- 통보 구분 코드 -->
<div class="col-md-6">
<label for="ntfctnSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">통보 구분</label>
<select class="form-select" id="ntfctnSeCd--${pageName}" name="ntfctnSeCd" data-map="NTFCTN_SE_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM030List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 소유주 관계 구분 코드 -->
<div class="col-md-12">
<div class="col-md-4">
<label for="ownrRelCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">소유주 관계 구분</label>
<select class="form-select" id="ownrRelCd--${pageName}" name="ownrRelCd" data-map="OWNR_REL_CD">
<option value="">선택하세요</option>
@ -65,15 +62,15 @@
</select>
</div>
<!-- 진술자 이름 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="sttrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">성명</label>
<input type="text" class="form-control w-25" id="sttrNm--${pageName}" name="sttrNm" data-map="STTR_NM" required />
<input type="text" class="form-control w-40" id="sttrNm--${pageName}" name="sttrNm" data-map="STTR_NM" required />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnPayer--${pageName}" title="납부자 정보 적용" onclick="fnBtnPayer${pageName}();">
납부자
</button>
</div>
<!-- 진술자 생년월일 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="sttrBrdt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">생년월일</label>
<input type="text" class="form-control w-25" id="sttrBrdt--${pageName}" name="sttrBrdt" data-map="STTR_BRDT" placeholder="YY-MM-DD" />
</div>
@ -89,26 +86,26 @@
<!-- 진술자 상세주소 -->
<div class="col-md-12">
<label for="sttrDaddr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">상세 주소</label>
<input type="text" class="form-control w-85" id="sttrDaddr--${pageName}" name="sttrDaddr" data-map="STTR_DADDR" />
<input type="text" class="form-control w-87" id="sttrDaddr--${pageName}" name="sttrDaddr" data-map="STTR_DADDR" />
</div>
<!-- 진술자 연락처 -->
<div class="col-md-6">
<div class="col-md-4">
<label for="sttrCttpc--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">연락처</label>
<input type="text" class="form-control w-25" id="sttrCttpc--${pageName}" name="sttrCttpc" data-map="STTR_CTTPC" />
<input type="text" class="form-control w-35" id="sttrCttpc--${pageName}" name="sttrCttpc" data-map="STTR_CTTPC" />
</div>
<!-- 진술자 이메일 -->
<div class="col-md-6">
<div class="col-md-8">
<label for="sttrEml--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">이메일</label>
<input type="text" class="form-control w-45" id="sttrEml--${pageName}" name="sttrEml" data-map="STTR_EML" />
<input type="text" class="form-control w-35" id="sttrEml--${pageName}" name="sttrEml" data-map="STTR_EML" />
</div>
<!-- 의견 제출 내용 -->
<div class="col-md-12">
<label for="opnnSbmsnCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출 내용</label>
<textarea class="form-control w-85" id="opnnSbmsnCn--${pageName}" name="opnnSbmsnCn" data-map="OPNN_SBMSN_CN" rows="5" data-maxlengthb="4000">
<textarea class="form-control w-87" id="opnnSbmsnCn--${pageName}" name="opnnSbmsnCn" data-map="OPNN_SBMSN_CN" rows="5" data-maxlengthb="4000">
</textarea>
</div>
<!-- 의견 제출 구분 코드 -->
<div class="col-md-12">
<div class="col-md-4">
<label for="opnnSbmsnSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">의견제출 구분</label>
<select class="form-select" id="opnnSbmsnSeCd--${pageName}" name="opnnSbmsnSeCd" data-map="OPNN_SBMSN_SE_CD" required>
<option value="">선택하세요</option>
@ -118,32 +115,50 @@
</select>
</div>
<!-- 의견 제출 요지 -->
<div class="col-md-12">
<div class="col-md-8">
<label for="opnnSbmsnGist--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출 요지</label>
<textarea class="form-control w-85" id="opnnSbmsnGist--${pageName}" name="opnnSbmsnGist" data-map="OPNN_SBMSN_GIST" rows="2" data-maxlengthb="300">
</textarea>
<input type="text" class="form-control w-80" id="opnnSbmsnGist--${pageName}" name="opnnSbmsnGist" data-map="OPNN_SBMSN_GIST" data-maxlengthb="300" />
</div>
<!-- 담당자 검토 의견 -->
<div class="col-md-12">
<label for="picRvwOpnn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">검토 의견</label>
<textarea class="form-control w-85" id="picRvwOpnn--${pageName}" name="picRvwOpnn" data-map="PIC_RVW_OPNN" rows="3" data-maxlengthb="1000">
<textarea class="form-control w-87" id="picRvwOpnn--${pageName}" name="picRvwOpnn" data-map="PIC_RVW_OPNN" rows="3" data-maxlengthb="1000">
</textarea>
</div>
</div>
</form>
<!-- /입력 영역 -->
<!-- 첨부 파일 등록 -->
<!-- 첨부 파일 -->
<div class="card">
<form id="frmFile--${pageName}" class="dpv eca" method="post" enctype="multipart/form-data">
<input type="file" id="uploadFileList--${pageName}" name="uploadFileList" multiple="multiple" hidden />
<form id="frmFile--${pageName}" method="post" enctype="multipart/form-data">
<input type="file" id="uploadFiles--${pageName}" name="uploadFiles" multiple="multiple" />
</form>
<div class="row g-1">
<div class="col-md-12">
<button class="btn btn-blue" id="btnAddFile--${pageName}" title="첨부파일 추가">파일 추가</button>
<button class="btn btn-blue" id="btnDelFile--${pageName}" title="첨부파일 삭제">파일 삭제</button>
<button class="btn btn-blue" id="btnFileDownload--${pageName}" title="첨부파일 다운로드" onclick="fnBtnFileDownload${pageName}()">다운로드</button>
</div>
</div>
<!-- 첨부 파일 테이블 -->
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped" id="fileList--${pageName}">
<thead>
<th class="text-center" style="width: 24px">NO.</th>
<th class="text-center" style="width: 200px">파일 번호</th>
<th class="text-center">파일 이름</th>
<th class="text-center" style="width: 200px">파일 크기</th>
<th class="text-center" style="width: 120px">파일 삭제</th>
</thead>
<tbody></tbody>
</table>
</div>
<!-- /첨부 파일 테이블 -->
</div>
<!-- /첨부 파일 등록 -->
</div>
<!-- <div class="card"> -->
@ -167,7 +182,7 @@
//
var ${pageName}Fields = new FormFields("#frmEdit--${pageName}");
// 파일 업로드
var ${pageName}UploadFile = uploadSupport("#uploadFileList--${pageName}");
var ${pageName}UploadFiles = uploadSupport("#uploadFiles--${pageName}");
/**************************************************************************
* DatasetControl
@ -182,12 +197,17 @@
, update : wctx.url(prefixUrl + "/020/update.do") // 수정
}
, formats : {
RCPT_YMD : dateFormat
CRDN_YMD : dateFormat
, RCPT_YMD : dateFormat
}
});
${pageName}Control.onCurrentChange = item => {
// Dataset 셋팅
${pageName}Fields.set(item);
// 첨부파일 조회
fnSearchFileList${pageName}(item.data.OPNN_ID);
}
/**************************************************************************
@ -196,6 +216,9 @@
// 저장 callback
${pageName}Control.onSave = (resp) => {
if (resp.saved) {
// 폼을 리셋해서 uploadFiles에 출력된 선택 파일을 초기화시킨다.
document.getElementById("frmFile--${pageName}").reset();
dialog.alert("저장됐습니다.");
dialog.close(${pageName}Control.prefix + "dialog");
}
@ -216,8 +239,8 @@
formData.append(key, value);
}
if (formData.get("uploadFileList").size == 0) {
formData.delete("uploadFileList");
if (formData.get("uploadFiles").size == 0) {
formData.delete("uploadFiles");
}
ajax.post({
@ -252,7 +275,7 @@
});
});
$("#btnAddFile--${pageName}").on('click', () => { $("#uploadFileList--${pageName}").trigger("click"); });
$("#btnAddFile--${pageName}").on('click', () => { $("#uploadFiles--${pageName}").trigger("click"); });
}
/**************************************************************************
@ -301,6 +324,44 @@
});
}
// 첨부파일 조회
function fnSearchFileList${pageName}(opnnId) {
// 첨부파일 리스트
ajax.get({
url : "file/list.do"
, data : {
infoType : "110"
, infoKeys : opnnId
, fetchSize : 0
}
, success : resp => {
let fileList = resp.fileList;
fileList.forEach(function (item, index, array) {
let itemNo = index + 1;
$("#fileList--${pageName} > tbody:last").append("<tr>");
$("#fileList--${pageName} > tbody:last").append("<td class='text-center'>" + itemNo + "</td>");
$("#fileList--${pageName} > tbody:last").append("<td class='text-center'>" + item.FILE_ID + "</td>");
$("#fileList--${pageName} > tbody:last").append("<td class='text-center'>" + item.FILE_NM + "</td>");
$("#fileList--${pageName} > tbody:last").append("<td class='text-center'>" + item.FILE_SIZE + " byte</td>");
$("#fileList--${pageName} > tbody:last").append("<td class='text-center'>" + "<button class='btn' onclick='fnBtnFileRemove${pageName}(" + item.FILE_ID + ");'><i class='bx bx-trash me-1'></i>삭제</button>" + "</td>");
$("#fileList--${pageName} > tbody:last").append("</tr>");
});
}
});
}
// 첨부파일 다운로드
function fnBtnFileDownload${pageName}() {
}
// 첨부파일 삭제
function fnBtnFileRemove${pageName}(fileId) {
}
/**************************************************************************
* script 진입
**************************************************************************/

@ -86,10 +86,6 @@
</div>
</form>
<!-- /입력 영역 -->
<!-- 첨부 파일 -->
<!-- /첨부 파일 -->
</div>
<!-- <div class="card"> -->
@ -118,16 +114,16 @@
**************************************************************************/
var ${pageName}Control = new DatasetControl({
prefix : "opnn"
, prefixName : "의견제출"
, prefixName : "의견제출 답변"
, keymapper : info => info ? info.OPNN_ID : ""
, dataGetter : obj => obj.opnnSbmsnInfo
, urls : {
update : wctx.url(prefixUrl + "/030/update.do") // 수정
update : wctx.url(prefixUrl + "/030/updateAnswer.do") // 답변 처리
}
, formats : {
RCPT_YMD : dateFormat // 접수 일자
, ANS_YMD : dateFormat // 답변 일자
, ANS_TM : dateFormat // 답변 일자
, ANS_TM : timeFormat // 답변 시각
}
});
@ -151,23 +147,10 @@
if (!info) return;
let item = ${pageName}Control.getCurrent("item");
let create = isEmpty(info.opnnId);
// 첨부파일
let formData = new FormData(document.getElementById("frmFile--${pageName}"));
for(let key in info) {
let value = info[key];
formData.append(key, value);
}
if (formData.get("uploadFileList").size == 0) {
formData.delete("uploadFileList");
}
ajax.post({
url : !create ? ${pageName}Control.urls.update : ${pageName}Control.urls.create
, data: formData, contentType : false, processData : false
url : ${pageName}Control.urls.update
, data : info
, success : resp => ${pageName}Control.onSave(resp)
});
}
@ -227,9 +210,9 @@
let data = formFields.get();
dialog.alert({
content : "현재 prefixName 정보를 저장하시겠습니까?"
content : "현재 의견제출 답변 정보를 저장하시겠습니까?"
, onOK : () => {
${pageName}Control.save(formFields.get());
${pageName}Control.save(data);
}
});
}

@ -155,7 +155,7 @@
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive" style="overflow-x:scroll; height:400px; overflow-y:scroll;" >
<table class="datatables-ajax table table-bordered dataTable no-footer"
<table class="dataTable datatables-ajax table table-bordered table-striped no-footer"
id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead>
<tr id="theadTr--${pageName}"

Loading…
Cancel
Save