의견제출 첨부파일 추가, 수정, 삭제 기능 수정.

main
jjh 1 year ago
parent 8598d35c79
commit 1edbf350a5

@ -11,7 +11,6 @@ import cokr.xit.base.file.service.FileQuery;
import cokr.xit.base.file.service.bean.FileBean;
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;
@ -55,9 +54,15 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
@Override
public DataObject getOpnnSbmsnInfo(Excl02Query req) {
DataObject opnnSbmsn = excl02Bean.getOpnnSbmsnInfo(req);
DataObject opnnSbmsnInfo = excl02Bean.getOpnnSbmsnInfo(req);
return opnnSbmsn;
// 등록으로 실행했는데 의견제출 ID가 존재한다면 이미 등록되었으므로 오류로 처리..
if (req.getOpnnId() == null && !opnnSbmsnInfo.string("OPNN_ID").equals("")) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException("의견제출 대장에 정보가 이미 존재합니다.");
}
return opnnSbmsnInfo;
}
@Override
@ -74,14 +79,7 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
throw new RuntimeException("의견제출 대장에 정보가 이미 존재합니다.");
}
// 파일 갯수 입력
if (fileInfoList != null && !fileInfoList.isEmpty()) {
excl02.setAtchFileCnt(fileInfoList.size());
} else {
excl02.setAtchFileCnt(0);
}
excl02.setOpnnSbmsnSttsCd("00"); // 의견 제출 상태 코드
excl02.setOpnnSbmsnSttsCd("00"); // 의견 제출 상태 코드 00:접수
// 의견제출 대장을 등록 한다.
retSuccess = excl02Bean.createOpnnSbmsn(excl02);
@ -137,54 +135,31 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
// 변수 선언
boolean retSuccess = false; // DB 처리 결과
// 의견제출 대장을 수정 한다.
retSuccess = excl02Bean.updateOpnnSbmsn(excl02);
if (!retSuccess) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException("의견제출 대장 수정에 실패하였습니다.");
}
// 의견제출 첨부파일 등록
if (fileInfoList != null && !fileInfoList.isEmpty()) {
fileInfoList.forEach(fileInfo -> fileInfo.setInfoType(Excl02.INF_TYPE).setInfoKey(excl02.getOpnnId()));
// 의견제출 첨부 파일 수정 하기
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;
}
}
fileBean.create(fileInfoList); // 파일 등록
// 의견제출 ID로 파일(TB_FILE) 정보 조회
List<DataObject> infoFileList = fileBean.getFileList(new FileQuery().setInfoType(Excl02.INF_TYPE).setInfoKeys(excl02.getOpnnId()).setOrderBy("FILE_ID"));
// 기존 파일 삭제
if (isRemoveFiles) {
String[] deleteList = {excl02.getOpnnId()};
if (infoFileList != null && infoFileList.size() > 0) {
String[] fileIDs = new String[infoFileList.size()];
fileBean.remove(Excl02.INF_TYPE, deleteList);
for (int iLoop = 0; iLoop < infoFileList.size(); iLoop++) {
fileIDs[iLoop] = infoFileList.get(iLoop).string("FILE_ID");
}
// 신규 파일 등록
if (isCreateFiles) {
fileInfoList.forEach(fileInfo -> fileInfo.setInfoType(Excl02.INF_TYPE).setInfoKey(excl02.getOpnnId()));
fileBean.create(fileInfoList);
fileBean.reorder(fileIDs); // 첨부파일 재 정렬
}
}
// 의견제출 대장을 수정 한다.
retSuccess = excl02Bean.updateOpnnSbmsn(excl02);
if (!retSuccess) {
// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
throw new RuntimeException("의견제출 대장 수정에 실패하였습니다.");
}
return true;
@ -208,6 +183,11 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
}
}
// 첨부파일 삭제
String[] deleteFiles = {excl02.getOpnnId()};
fileBean.remove(Excl02.INF_TYPE, deleteFiles);
// 의견제출(TB_OPNN_SBMSN) 대장을 삭제 한다.
retSuccess = excl02Bean.removeOpnnSbmsn(excl02);
if (!retSuccess) {
@ -262,7 +242,6 @@ public class Excl02ServiceBean extends AbstractServiceBean implements Excl02Serv
// 변수 선언
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()));

@ -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="dataTable datatables-ajax table table-bordered table-striped no-footer"
<table class="dataTable datatables-ajax table table-bordered no-footer"
id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead>
<tr id="theadTr--${pageName}"
@ -320,7 +320,6 @@
// onCurrentChange 이벤트
${pageName}Control.onCurrentChange = item => {
//
if (!item) return;
// 계고는 수정하지 않는다..

@ -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="dataTable datatables-ajax table table-bordered table-striped no-footer"
<table class="dataTable datatables-ajax table table-bordered no-footer"
id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead>
<tr id="theadTr--${pageName}"

@ -29,18 +29,6 @@
<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-60" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM" readonly />
</div>
<!-- 접수 번호 -->
<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-30" id="rcptNo--${pageName}" name="rcptNo" data-map="RCPT_NO" required />
</div>
<!-- 접수 일자 -->
<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-4">
<label for="rcptSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수 구분</label>
@ -51,15 +39,17 @@
</c:forEach>
</select>
</div>
<!-- 소유주 관계 구분 코드 -->
<!-- 접수 번호 -->
<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>
<c:forEach items="${FIM032List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
<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-30" id="rcptNo--${pageName}" name="rcptNo" data-map="RCPT_NO" required />
</div>
<!-- 접수 일자 -->
<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-4">
@ -74,6 +64,16 @@
<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>
<!-- 소유주 관계 구분 코드 -->
<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>
<c:forEach items="${FIM032List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 진술자 주소 --><!-- 진술자 우편번호 -->
<div class="col-md-12">
<label for="sttrAddr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">주소</label>
@ -106,8 +106,8 @@
</div>
<!-- 의견 제출 구분 코드 -->
<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>
<label for="opnnSbmsnSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출 구분</label>
<select class="form-select" id="opnnSbmsnSeCd--${pageName}" name="opnnSbmsnSeCd" data-map="OPNN_SBMSN_SE_CD">
<option value="">선택하세요</option>
<c:forEach items="${FIM033List}" var="item">
<option value="${item.code}">${item.value}</option>
@ -131,14 +131,12 @@
<!-- 첨부 파일 -->
<div class="card">
<form id="frmFile--${pageName}" method="post" enctype="multipart/form-data">
<input type="file" id="uploadFiles--${pageName}" name="uploadFiles" multiple="multiple" />
<form id="frmFile--${pageName}" method="post" enctype="multipart/form-data" >
<input type="file" id="uploadFiles--${pageName}" name="uploadFiles" multiple="multiple" onchange="fnAddFiles(this);" hidden />
</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>
@ -150,7 +148,8 @@
<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>
<th class="text-center" style="width: 120px">다운로드</th>
<th class="text-center" style="width: 120px">삭제</th>
</thead>
<tbody></tbody>
</table>
@ -179,10 +178,10 @@
**************************************************************************/
// URL
var prefixUrl = "/excl/excl02";
//
// FormFields
var ${pageName}Fields = new FormFields("#frmEdit--${pageName}");
// 파일 업로드
var ${pageName}UploadFiles = uploadSupport("#uploadFiles--${pageName}");
// 파일 리스트
var $fileListArr = new Array();
/**************************************************************************
* DatasetControl
@ -232,20 +231,24 @@
let create = isEmpty(info.opnnId);
// 첨부파일
let formData = new FormData(document.getElementById("frmFile--${pageName}"));
// let formData = new FormData(document.getElementById("frmFile--${pageName}"));
let formData = new FormData();
debugger;
for (let iLoop = 0; iLoop < $fileListArr.length; iLoop++) {
formData.append("uploadFiles" , $fileListArr[iLoop]);
}
for(let key in info) {
let value = info[key];
formData.append(key, value);
}
if (formData.get("uploadFiles").size == 0) {
formData.delete("uploadFiles");
}
ajax.post({
url : !create ? ${pageName}Control.urls.update : ${pageName}Control.urls.create
, data : formData, contentType : false, processData : false
, data : formData
, contentType : false
, processData : false
, success : resp => ${pageName}Control.onSave(resp)
});
}
@ -326,6 +329,11 @@
// 첨부파일 조회
function fnSearchFileList${pageName}(opnnId) {
// 의견제출 등록일 경우에는 첨부파일을 조회하지 안는다..
if (opnnId == null || opnnId == "") {
return;
}
// 첨부파일 리스트
ajax.get({
url : "file/list.do"
@ -338,28 +346,103 @@
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>");
fileNo = index + 1;
let innerHtml = "";
innerHtml += "<tr>";
innerHtml += "<td class='text-center'>" + fileNo + "</td>";
innerHtml += "<td class='text-center'>" + item.FILE_ID + "</td>";
innerHtml += "<td class='text-center'>" + item.FILE_NM + "</td>";
innerHtml += "<td class='text-center'>" + item.FILE_SIZE + " byte</td>";
innerHtml += "<td class='text-center'>" + "<button class='btn' onclick='fnBtnFileDownload${pageName}(" + item.FILE_ID + ");'><i class='bx bx-download me-1'></i></button>" + "</td>";
innerHtml += "<td class='text-center'>" + "<button class='btn' onclick='fnBtnFileRemove${pageName}(this);'><i class='bx bx-trash me-1'></i></button>" + "</td>";
innerHtml += "</tr>";
$("#fileList--${pageName} > tbody:last").append(innerHtml);
});
}
});
}
// 첨부파일 다운로드
function fnBtnFileDownload${pageName}() {
// 첨부파일 등록
function fnAddFiles(obj) {
let fileNo = $("#fileList--${pageName} > tbody tr").length; // table의 tr 개수
let maxFileCnt = 3; // 첨부파일 최대 개수
let attFileCnt = obj.files.length; // 선택한 파일 개수 + 기존 파일 개수
let fileArr = new Array(); // 파일 배열
fileArr = $fileListArr;
// 등록할 파일 개수 확인
if (attFileCnt + fileNo > maxFileCnt) {
dialog.alert({
content : "첨부파일은 최대 " + maxFileCnt + "개 까지 첨부 가능합니다."
});
return;
}
// 첨부파일을 table에 추가.
for (let iLoop = 0; iLoop < attFileCnt; iLoop++) {
let selectedFile = obj.files[iLoop];
let innerHtml = "";
fileNo += 1;
innerHtml += "<tr>";
innerHtml += "<td class='text-center'>" + fileNo + "</td>";
innerHtml += "<td class='text-center'>" + "</td>";
innerHtml += "<td class='text-center'>" + selectedFile.name + "</td>";
innerHtml += "<td class='text-center'>" + selectedFile.size + " byte</td>";
innerHtml += "<td class='text-center'>" + "</td>";
innerHtml += "<td class='text-center'>" + "<button class='btn' onclick='fnBtnFileRemove${pageName}(this);'><i class='bx bx-trash me-1'></i></button>" + "</td>";
innerHtml += "</tr>";
$("#fileList--${pageName} > tbody:last").append(innerHtml);
fileArr.push(obj.files[iLoop]);
}
}
// 파일 삭제
function fnFileRemove${pageName}(obj) {
let tr = $(obj).parent().parent(); // 클릭한 버튼이 속한 tr 요소
let td = tr.children();
let fileNo = td.eq(0).text(); // 삭제할 파일 번호
let fileId = td.eq(1).text();
if (fileId != null && fileId != "") {
ajax.post({
url : "file/remove.do"
, data : { fileIDs : fileId }
, success : resp => {
// 성공
}
});
} else {
// 배열에서 삭제한다. 배열은 0부터 시작하기 때문에 -1 해준다.
$fileListArr.splice(fileNo - 1);
}
// 첨부파일 삭제
function fnBtnFileRemove${pageName}(fileId) {
$(obj).closest("tr").remove(); // table 에서 제거
}
// 첨부파일 삭제 버튼 클릭
function fnBtnFileRemove${pageName}(obj) {
dialog.alert({
content : "선택한 파일을 삭제하시겠습니까?"
, onOK : () => {
fnFileRemove${pageName}(obj);
}
});
}
// 첨부파일 다운로드
function fnBtnFileDownload${pageName}(fileId) {
top.location.href = "/file/download.do?fileID=" + fileId;
}
/**************************************************************************

@ -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="dataTable datatables-ajax table table-bordered table-striped no-footer"
<table class="dataTable datatables-ajax table table-bordered no-footer"
id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead>
<tr id="theadTr--${pageName}"

Loading…
Cancel
Save