cctv 파일연계 수정
parent
42fdad168d
commit
36ec109757
@ -0,0 +1,57 @@
|
||||
{
|
||||
"apis": [
|
||||
{"id": "AC1_FD11_01", "uri": "/piss/api/molit/SignguCarBassMatterInqireService"}, /* 자동차 기본사항 조회 */
|
||||
{"id": "AC1_FD11_02", "uri": "/piss/api/molit/SignguCarLedgerFrmbkService"}, /* 자동차 등록원부(갑) */
|
||||
{"id": "AC1_FI59_02", "uri": "/piss/api/molit/SignguCarLedgerScldgrService"}, /* 자동차 등록원부(을) */
|
||||
{"id": "AC1_FI59_03", "uri": "/piss/api/molit/SignguSeizrDtlsInqireService"}, /* 압류내역조회 */
|
||||
{"id": "AC1_FI59_04", "uri": "/piss/api/molit/SignguAltrtvSeizrVhcleInfoService"}, /* 대체압류차량 */
|
||||
{"id": "FI59_AC1_01", "uri": "/piss/api/molit/SignguCarSeizrRelisEttffService"} /* 압류연계등록 */
|
||||
],
|
||||
|
||||
"clients": [
|
||||
{
|
||||
"name": "default", /* 설정 이름 */
|
||||
"sigunguCode": "11110", /* 시군구코드(필수) */
|
||||
"deptCode": "testDept", /* 부서코드 */
|
||||
"cntcInfoCode": "AC1_AW0_76", /* 연계정보 코드 */
|
||||
|
||||
"infoSysId": "41-358", /* 정보시스템 ID(필수) */
|
||||
"infoSysIp": "101.0.115.13", /* 정보시스템 IP(필수) */
|
||||
|
||||
"chargerId": "", /* 담당자 id */
|
||||
"chargerIp": "", /* 담당자 ip 주소 */
|
||||
"chargerName": "이광진", /* 담당자명 */
|
||||
"cvmisApiKey": "1234AAAA-A1324567-A1234567-A1234567", /* 교통안전공단 발급 키 */
|
||||
|
||||
"publicInfo": "lvis", /* 행정정보 공동이용 서비스 접속 설정(public-info.conf) 이름 */
|
||||
|
||||
"apiSettings": [
|
||||
{ "api": "AC1_FD11_01", /* 자동차 기본사항 조회 */
|
||||
"api_key": "339de72be931582c91f56043b8c6c8ff24089694462404e9824b0b5cb2bf4948",
|
||||
"cvmis_apikey": "BDBDABE8-9E11D064-9F1ECC61-6E50AA75",
|
||||
"local": true /* , "log": true */
|
||||
},
|
||||
{ "api": "AC1_FD11_02", /* 자동차 등록원부(갑) */
|
||||
"api_key": "682667ee23054d2a563ed0763c0c24afdd61f618e8abf22dfc05c8a54876bde5",
|
||||
"cvmis_apikey": "E85673F3-EA17E59C-F3061D40-765D2815"
|
||||
},
|
||||
{ "api": "AC1_FI59_02", /* 자동차 등록원부(을) */
|
||||
"api_key": "682667ee23054d2a563ed0763c0c24afdd61f618e8abf22dfc05c8a54876bde5",
|
||||
"cvmis_apikey": "E85673F3-EA17E59C-F3061D40-765D2815"
|
||||
},
|
||||
{ "api": "AC1_FI59_03", /* 압류내역조회 */
|
||||
"api_key": "682667ee23054d2a563ed0763c0c24afdd61f618e8abf22dfc05c8a54876bde5",
|
||||
"cvmis_apikey": "E85673F3-EA17E59C-F3061D40-765D2815"
|
||||
},
|
||||
{ "api": "AC1_FI59_04", /* 대체압류차량 */
|
||||
"api_key": "d74516cea98d783e477dc04ea95f43c8a38dde7476381f2ca58cc263f5f9b61a",
|
||||
"cvmis_apikey": "F650B54B-D5E2E39D-10729C3F-5BDB71B8"
|
||||
},
|
||||
{ "api": "FI59_AC1_01", /* 압류연계등록 */
|
||||
"api_key": "2d597663e775f5015dc07ab73d71fd9b9b532bf94c91915b1c187bbb410c15ff",
|
||||
"cvmis_apikey": "BAECA68E-BD853F11-90BC213C-86D1119D"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,4 +1,21 @@
|
||||
{
|
||||
"nxrpImposition": "", /* 세외수입 부과 wsdl url */
|
||||
"nxrpSeizure": "" /* 세외수입 압류 wsdl url */
|
||||
"host": "http://98.33.4.167:8082",
|
||||
/* 운영: http://98.33.4.164
|
||||
개발: http://98.33.4.167:8082
|
||||
*/
|
||||
|
||||
"apis": [
|
||||
{ /* 부과 */
|
||||
"name": "imposition",
|
||||
"uri": "/BugaWebService/BugaWebService"
|
||||
},
|
||||
{ /* 사전통보 */
|
||||
"name": "prenotice",
|
||||
"uri": "/SntrPreNoticeWebService/SntrPreNoticeWebService"
|
||||
},
|
||||
{ /* 사전통보(파일연계) */
|
||||
"name": "fileoffer",
|
||||
"uri": "/SntrFileOfferWebService/SntrFileOfferWebService"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,192 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
||||
<div class="d-flex flex-column" data-doctx="${pageName}-cctv">
|
||||
<div class="d-flex justify-content-evenly">
|
||||
<div class="card w-95" style="padding: .8rem;">
|
||||
<form name="frmFirst" class="d-flex flex-row justify-content-end">
|
||||
<div>
|
||||
<label is="name-label" for="doExempt" style="margin-right: .5rem;">
|
||||
<input type="checkbox" name="doExempt" checked class="form-check-input" />면제차량 부과제외
|
||||
</label>
|
||||
<button type="button" name="btnInsertCrdn" class="btn btn-primary my-2 enableon-found" style="margin-left: .5rem;">단속등록</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-row justify-content-evenly">
|
||||
<div class="card my-4 px-4 h-px-600 w-px-700">
|
||||
<form>
|
||||
<div>
|
||||
<span class="container-page-btn">
|
||||
<div class="d-flex flex-row justify-content-between">
|
||||
<span is="paging-info" name="parsedInfoPagingInfo" class="dataTables_info"></span>
|
||||
<ul name="parsedInfoPaging" class="pagination pagination-primary"></ul>
|
||||
</div>
|
||||
<span class="container-window-btn-right">
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-datatable text-nowrap">
|
||||
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
|
||||
<div name="dir-list" class="table-responsive h-px-550">
|
||||
<table name="dirList" class="datatables-ajax table table-bordered dataTable no-footer">
|
||||
<thead class="sticky-thead">
|
||||
<tr><th style="width: 3rem;">NO.</th>
|
||||
<th href="#">디렉토리</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
<template is="curly-brackets" class="found">
|
||||
<tr data-index="{data-index}">
|
||||
<td onclick class="text-center">data-no</td>
|
||||
<td onclick title="{name}" class="text-start text-truncate max-w-th">name</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template class="notFound"><tr><td valign="top" colspan="2" class="dataTables_empty text-center">디렉토리정보를 찾지 못했습니다</td></tr></template>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="card my-4 px-4 h-px-600 w-px-700">
|
||||
<form>
|
||||
<div>
|
||||
<span class="container-page-btn">
|
||||
<div class="d-flex flex-row justify-content-between">
|
||||
<span is="paging-info" name="filePagingInfo" class="dataTables_info"></span>
|
||||
</div>
|
||||
<span class="container-window-btn-right">
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-datatable text-nowrap">
|
||||
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
|
||||
<div name="file-list" class="table-responsive h-px-550">
|
||||
<table name="table" class="datatables-ajax table table-bordered dataTable no-footer">
|
||||
<thead class="sticky-thead">
|
||||
<tr><th style="width: 3rem;">NO.</th>
|
||||
<th href="#">파일이름</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
<template is="curly-brackets" class="found">
|
||||
<tr data-index="{data-index}">
|
||||
<td onclick class="text-center">data-no</td>
|
||||
<td onclick title="{name}" class="text-start text-truncate max-w-th">name</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template class="notFound"><tr><td valign="top" colspan="2" class="dataTables_empty text-center">파일정보를 찾지 못했습니다.</td></tr></template>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<c:set var="scriptCctv" scope="request">
|
||||
pageName = "${pageName}-cctv";
|
||||
var $C = pageObject[pageName] = newDoctxFinder(pageName);
|
||||
dirSet.onDatasetChange = () => {
|
||||
var t = $C.getGridTemplate("dir-list");
|
||||
var trs = Apply.fromDataset.getTbody(dirSet, t.found, t.notFound, t.replacer);
|
||||
$C.renderDirList("dir-list", dirSet.length, dirSet.length, trs);
|
||||
};
|
||||
dirSet.onCurrentChange = (dataItem) => {
|
||||
let dir = dataItem ? dataItem.data : null,
|
||||
empty = !dir || Object.keys(dir).length < 1;
|
||||
|
||||
$C.getFiles(!empty ? dir.name : null);
|
||||
if (empty) return;
|
||||
|
||||
var dataIndex = dataItem.index;
|
||||
$C.$findn("dir-list").find("tbody").setCurrentRow(dataIndex);
|
||||
|
||||
};
|
||||
fileSet.onDatasetChange = () => {
|
||||
var t = $C.getGridTemplate("file-list"),
|
||||
trs = Apply.fromDataset.getTbody(fileSet, t.found, t.notFound, t.replacer),
|
||||
length = fileSet.length;
|
||||
$C.renderDirList("file-list", length, length, trs);
|
||||
$C.findn("btnInsertCrdn").disabled = length < 1;
|
||||
$C.findn("filePagingInfo").innerHTML = "찾은 파일: " + length;
|
||||
};
|
||||
fileSet.onCurrentChange = (dataItem) => {
|
||||
let dir = dataItem ? dataItem.data : null;
|
||||
if (!dir || Object.keys(dir).length < 1) return;
|
||||
|
||||
var dataIndex = dataItem.index;
|
||||
$C.$findn("file-list").find("tbody").setCurrentRow(dataIndex);
|
||||
};
|
||||
|
||||
$C.getFiles = dir => {
|
||||
if (dir)
|
||||
ajax.get({
|
||||
url: wctx.url("/crdn/crdn05/020/files.do"),
|
||||
data: {dir: dir},
|
||||
success: resp => fileSet.setData(resp.fileList, {pagination: {}})
|
||||
});
|
||||
else
|
||||
fileSet.setData([]);
|
||||
};
|
||||
|
||||
$C.createCrdn = () => {
|
||||
let current = dirSet.getCurrent("item"),
|
||||
dir = current.data.name;
|
||||
dialog.alert({
|
||||
content: current.getValue("name") + " 디렉토리의 파일로 단속을 등록하시겠습니까?",
|
||||
onOK: () => {
|
||||
ajax.post({
|
||||
url : wctx.url("/crdn/crdn05/020/upload.do"),
|
||||
data : {
|
||||
taskSeCd: "${taskSeCd}",
|
||||
doExempt: $C.findn('doExempt').checked,
|
||||
dirs: dir
|
||||
},
|
||||
success : (resp) => {
|
||||
if (resp.saved) {
|
||||
$C.getFiles(dir);
|
||||
if(resp.alertMessage)
|
||||
dialog.alert(resp.alertMessage);
|
||||
else
|
||||
dialog.alert("등록이 완료됐습니다.");
|
||||
} else {
|
||||
dialog.alert(resp.failReason);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$C.getGridTemplate = (name) => {
|
||||
var notFound = [$C.$findn(name).find("template.notFound")[0].innerHTML];
|
||||
var found = $C.$findn(name).find("template.found")[0].innerHTML;
|
||||
var replacer = (str, dataItem) => str
|
||||
.replace(/{onclick}/gi, "pageObject['" + pageName + "'].clickDirList('{data-index}');");
|
||||
|
||||
return {
|
||||
found : found,
|
||||
notFound : notFound,
|
||||
replacer : replacer
|
||||
};
|
||||
}
|
||||
$C.clickDirList = (dataIndex) => {
|
||||
if (!dataIndex) return;
|
||||
|
||||
dirSet.setCurrent(dataIndex);
|
||||
};
|
||||
$C.renderDirList = (name, total, listLength, trs) => {
|
||||
$C.$findn(name).find("tbody").html(trs);
|
||||
let empty = listLength < 1;
|
||||
if (!empty)
|
||||
FimsSupport.fnDownsizeCheck($C.$findn(name).find("table")[0]);
|
||||
}
|
||||
|
||||
$C.$findn("btnInsertCrdn").on("click", function(){
|
||||
$C.createCrdn();
|
||||
});
|
||||
|
||||
dirSet.setData(${dirList});
|
||||
</c:set>
|
||||
@ -0,0 +1,221 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
||||
<div class="d-flex flex-column" data-doctx="${pageName}-local">
|
||||
<div class="d-flex justify-content-evenly">
|
||||
<div class="card w-95" style="padding: .8rem;">
|
||||
<form name="frmFirst" method="post" enctype="multipart/form-data" class="d-flex flex-row justify-content-between">
|
||||
<div>
|
||||
<input type="file" is="id-input" name="uploadFiles" multiple="multiple" class="form-control"/>
|
||||
<label is="name-label" for="doExempt" style="margin-left: .5rem;">
|
||||
<input type="checkbox" name="doExempt" checked class="form-check-input" />면제차량 부과제외
|
||||
</label>
|
||||
</div>
|
||||
<button type="button" name="btnInsertCrdn" class="btn btn-primary my-2 enableon-found" style="margin-left: .5rem;">단속등록</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-row justify-content-evenly">
|
||||
<div class="card my-4 px-4 h-px-600 w-px-700">
|
||||
<form>
|
||||
<div>
|
||||
<span class="container-page-btn">
|
||||
<div class="d-flex flex-row justify-content-between">
|
||||
<span is="paging-info" name="parsedInfoPagingInfo" class="dataTables_info"></span>
|
||||
<ul name="parsedInfoPaging" class="pagination pagination-primary"></ul>
|
||||
</div>
|
||||
<span class="container-window-btn-right">
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-datatable text-nowrap">
|
||||
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
|
||||
<div name="table-responsive" class="table-responsive h-px-550">
|
||||
<table name="table" class="datatables-ajax table table-bordered dataTable no-footer">
|
||||
<thead class="sticky-thead">
|
||||
<tr><th style="width: 3rem;">NO.</th>
|
||||
<th href="#">파일이름</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
<template is="curly-brackets" class="found">
|
||||
<tr data-index="{id}">
|
||||
<td onclick class="text-center">data-no</td>
|
||||
<td onclick title="{name}" class="text-start text-truncate max-w-th">name</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template class="notFound"><tr><td valign="top" colspan="2" class="dataTables_empty text-center">등록할 파일을 추가하십시오.</td></tr></template>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div name="imageArea" class="card my-4 px-4 w-px-600 h-px-600 justify-content-center">
|
||||
</div>
|
||||
|
||||
<div class="card my-4 px-2 w-px-120 h-px-600">
|
||||
<div class="d-flex my-2 flex-column">
|
||||
<button type="button" name="btnDelete" class="btn btn-primary my-2 enableon-found">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form name="frmMultipart" method="post" enctype="multipart/form-data"></form>
|
||||
</div>
|
||||
<c:set var="scriptLocal" scope="request">
|
||||
pageName = "${pageName}-local";
|
||||
var $L = pageObject[pageName] = newDoctxFinder(pageName);
|
||||
|
||||
uploadSet.onDatasetChange = uploadSet.onRemove = obj => {
|
||||
var t = $L.getGridTemplate();
|
||||
var trs = Apply.fromDataset.getTbody(uploadSet, t.found, t.notFound, t.replacer);
|
||||
$L.renderParsedInfoList(uploadSet.length, uploadSet.length, trs);
|
||||
$L.findn("btnInsertCrdn").disabled = $L.findn("btnDelete").disabled = uploadSet.length < 1;
|
||||
};
|
||||
uploadSet.onCurrentChange = (dataItem) => {
|
||||
$L.$findn("imageArea").html("");
|
||||
let file = dataItem ? dataItem.data : null;
|
||||
if (!file || Object.keys(file).length < 1) return;
|
||||
|
||||
var dataIndex = file.id;
|
||||
$L.$findn("table-responsive").find("tbody").setCurrentRow(dataIndex);
|
||||
|
||||
if(dataItem.data.FILE_GROUP_TYPE == "BIN"){
|
||||
var srcArr = [];
|
||||
|
||||
for(var i=1; i <= dataItem.data.PHOTO_CNT; i++){
|
||||
srcArr.push("data:image/jpg;base64," + dataItem.data["B64IMAGE"+i])
|
||||
}
|
||||
|
||||
$L.renderImage(srcArr);
|
||||
} else {
|
||||
var dataKey = file.name;
|
||||
if(!dataKey.endsWith(".txt") && !dataKey.endsWith(".TXT")){
|
||||
var src = file.url;
|
||||
$L.renderImage(src);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$L.tempGroup = {};
|
||||
var ctrl = newCrdn05020Control($L);
|
||||
|
||||
$L.getGridTemplate = () => {
|
||||
var notFound = [$L.$findn("table-responsive").find("template.notFound")[0].innerHTML];
|
||||
var found = $L.$findn("table-responsive").find("template.found")[0].innerHTML;
|
||||
var replacer = (str, dataItem) => str
|
||||
.replace(/{onclick}/gi, "pageObject['" + pageName + "'].clickParsedInfoList('{id}');");
|
||||
|
||||
return {
|
||||
found : found,
|
||||
notFound : notFound,
|
||||
replacer : replacer
|
||||
};
|
||||
}
|
||||
|
||||
//테이블 렌더링
|
||||
$L.renderParsedInfoList = (total, listLength, trs) => {
|
||||
$L.$findn("table-responsive").find("tbody").html(trs);
|
||||
let empty = listLength < 1;
|
||||
if (!empty)
|
||||
FimsSupport.fnDownsizeCheck($L.$findn("table-responsive").find("table")[0]);
|
||||
}
|
||||
|
||||
//사진 표시
|
||||
$L.renderImage = (src) => {
|
||||
if(Array.isArray(src)){
|
||||
var div = document.createElement("div");
|
||||
div.style["margin-top"] = div.style["margin-bottom"] = "20px";
|
||||
div.style["overflow-y"] = "scroll";
|
||||
for(var i=0; i < src.length; i++){
|
||||
var span = document.createElement("span");
|
||||
span.style["max-width"] = span.style["max-height"] = "260px";
|
||||
var img = document.createElement("img");
|
||||
img.style["object-fit"] = "contain";
|
||||
img.style["max-width"] = img.style["max-height"] = "inherit";
|
||||
img.src = src[i];
|
||||
span.appendChild(img);
|
||||
div.appendChild(span);
|
||||
}
|
||||
$L.$findn("imageArea").append(div);
|
||||
} else {
|
||||
var img = document.createElement("img");
|
||||
img.style["object-fit"] = "contain";
|
||||
img.src = src;
|
||||
$L.$findn("imageArea").append(img);
|
||||
}
|
||||
}
|
||||
|
||||
$L.clickParsedInfoList = (dataIndex) => {
|
||||
if (!dataIndex) return;
|
||||
|
||||
uploadSet.setCurrent(dataIndex);
|
||||
};
|
||||
|
||||
$L.createCrdn = () =>
|
||||
upload({
|
||||
url : wctx.url("/crdn/crdn05/020/upload.do"),
|
||||
data : {
|
||||
taskSeCd: "${taskSeCd}",
|
||||
doExempt: document.querySelector('div[data-doctx="' + pageName + '"] input[name="doExempt"]').checked,
|
||||
uploadFiles: uploadSet.getDataset()
|
||||
},
|
||||
success : (resp) => {
|
||||
if (resp.saved) {
|
||||
uploadSet.setData([]);
|
||||
if(resp.alertMessage)
|
||||
dialog.alert(resp.alertMessage);
|
||||
else
|
||||
dialog.alert("등록이 완료됐습니다.");
|
||||
} else {
|
||||
dialog.alert(resp.failReason);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$L.deleteFile = () => {
|
||||
var current = uploadSet.getCurrent();
|
||||
if (!current) return;
|
||||
|
||||
uploadSet.erase(current.id);
|
||||
}
|
||||
|
||||
$L.removeCallback = (removedFileNameArr) => {
|
||||
let removedDataIndexArr = [];
|
||||
for(var i = 0; i < removedFileNameArr.length; i++){
|
||||
let dii = ctrl.dataset.getDataset("item").filter(item=>item.data.FILE_NAME == removedFileNameArr[i])[0].index;
|
||||
removedDataIndexArr.push(dii);
|
||||
}
|
||||
|
||||
ctrl.dataset.remove(removedDataIndexArr);
|
||||
$L.removeTableRow(removedDataIndexArr);
|
||||
}
|
||||
|
||||
$L.removeTableRow = (removedDataIndexArr) => {
|
||||
var fileListTable = $L.$findn("table-responsive").find("table")[0];
|
||||
|
||||
for(var i = 0; i < removedDataIndexArr.length; i++){
|
||||
var target = removedDataIndexArr[i];
|
||||
var tr = $(fileListTable).find("tbody").find("tr[data-index='"+target+"']");
|
||||
var trIndex = $(fileListTable).find("tbody tr").index(tr);
|
||||
fileListTable.deleteRow(trIndex+1);
|
||||
}
|
||||
}
|
||||
|
||||
$L.$findn("btnInsertCrdn").on("click", function(){
|
||||
$L.createCrdn();
|
||||
});
|
||||
|
||||
$L.$findn("btnDelete").on("click", function(){ $L.deleteFile(); });
|
||||
|
||||
$L.$findn("direct").on("click", function(){
|
||||
if($(this).is(":checked")){
|
||||
$("#uploadFilesArea").removeAttr("hidden");
|
||||
} else {
|
||||
$("#uploadFilesArea").attr("hidden","hidden");
|
||||
$L.$findn("uploadFiles").val("");
|
||||
}
|
||||
});
|
||||
|
||||
uploadSet.setData([]);
|
||||
</c:set>
|
||||
@ -0,0 +1,497 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
||||
<c:set var="pageKorName" scope="request">단속 파일 등록</c:set>
|
||||
<div class="d-flex flex-column" data-doctx="${pageName}">
|
||||
<div class="d-flex flex-row justify-content-evenly">
|
||||
<div class="card h-px-80 w-px-1400">
|
||||
<form name="frmFirst" method="post" enctype="multipart/form-data">
|
||||
<div class="row g-1">
|
||||
<div class="col-md-12">
|
||||
<div class="form-check form-switch">
|
||||
<input type="checkbox" is="id-input" name="direct" class="form-check-input" />
|
||||
<label is="name-label" for="direct" class="form-check-label">로컬파일업로드</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-1">
|
||||
<div class="col-md-12 d-flex align-items-center flex-nowrap">
|
||||
<label is="name-label" for="taskSeCd"
|
||||
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">과태료업무</label>
|
||||
<select is="id-select" name="taskSeCd" class="form-select" disabled>
|
||||
<c:forEach items="${TaskListForSgg}" var="item">
|
||||
<option value="${item.code}"
|
||||
<c:if test="${item.code eq taskSeCd}"> selected="selected" </c:if>
|
||||
>${item.value}</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
<span id="uploadFilesArea" hidden>
|
||||
<label is="name-label" for="uploadFiles"
|
||||
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">파일</label>
|
||||
<input type="file" is="id-input" name="uploadFiles"
|
||||
multiple="multiple" class="form-control"/>
|
||||
</span>
|
||||
<span class="d-flex justify-content-end float-start ms-4">
|
||||
<button type="button" name="btnSearch"
|
||||
class="btn btn-primary">조회</button>
|
||||
<button type="button" name="btnFileUpload"
|
||||
class="btn btn-primary" hidden>업로드</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-row justify-content-evenly">
|
||||
<div class="card my-4 px-4 h-px-600 w-px-700">
|
||||
<form name="frmGrid">
|
||||
<div>
|
||||
<span class="container-page-btn">
|
||||
<div class="d-flex flex-row justify-content-between">
|
||||
<span is="paging-info" name="parsedInfoPagingInfo" class="dataTables_info"></span>
|
||||
<ul name="parsedInfoPaging" class="pagination pagination-primary"></ul>
|
||||
</div>
|
||||
<span class="container-window-btn-right">
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-datatable text-nowrap">
|
||||
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
|
||||
<div name="table-responsive" class="table-responsive ox-scroll oy-scroll h-px-550">
|
||||
<table name="table" class="datatables-ajax table table-bordered dataTable no-footer">
|
||||
<thead class="sticky-thead">
|
||||
<tr>
|
||||
<th style="min-width: 80px;">단속자료</th>
|
||||
<th style="min-width: 80px;" title="더블클릭시 축소/확대 됩니다."
|
||||
class="downsize" ondblclick="FimsSupport.fnDownsizeToggle(this);" href="#">
|
||||
파일명 <i class='bx bx-expand'></i>
|
||||
</th>
|
||||
<th style="min-width: 80px;">타임스탬프</th>
|
||||
<th style="min-width: 80px;">파일사이즈</th>
|
||||
<th style="min-width: 80px;">파일확장자</th>
|
||||
<th style="min-width: 80px;">파일상태</th>
|
||||
<th style="min-width: 80px;">총사진갯수</th>
|
||||
<th style="min-width: 80px;">파일순번</th>
|
||||
<th style="min-width: 80px;">장비코드</th>
|
||||
<th style="min-width: 80px;">차량번호</th>
|
||||
<th style="min-width: 80px;">사진구분명</th>
|
||||
<th style="min-width: 80px;">업체코드</th>
|
||||
<th style="min-width: 80px;">위반내용</th>
|
||||
<th style="min-width: 80px;">차량속도</th>
|
||||
<th style="min-width: 80px;">번호판위치x</th>
|
||||
<th style="min-width: 80px;">번호판위치y</th>
|
||||
<th style="min-width: 80px;">번호판width</th>
|
||||
<th style="min-width: 80px;">번호판height</th>
|
||||
<th style="min-width: 80px;">위치좌표x</th>
|
||||
<th style="min-width: 80px;">위치좌표y</th>
|
||||
<th style="min-width: 80px;">날짜</th>
|
||||
<th style="min-width: 80px;">시간</th>
|
||||
<th style="min-width: 80px;">단속시작시간</th>
|
||||
<th style="min-width: 80px;">단속종료시간</th>
|
||||
<th style="min-width: 80px;">어린이보호구역</th>
|
||||
<th style="min-width: 80px;">단속장소명</th>
|
||||
<th style="min-width: 80px;">단속법정동</th>
|
||||
<th style="min-width: 80px;">단속장소(주소)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
<template is="curly-brackets" class="found">
|
||||
<tr data-index="DATA-INDEX">
|
||||
<td onclick ondblclick class="text-center">TEMP_GROUP_ID</td>
|
||||
<td onclick ondblclick title="{FILE_NAME}"
|
||||
class="text-start text-truncate max-w-th">FILE_NAME</td>
|
||||
<td onclick ondblclick class="text-center">FILE_LAST_MODIFIED</td>
|
||||
<td onclick ondblclick class="text-center">FILE_SIZE</td>
|
||||
<td onclick ondblclick class="text-start">FILE_EXTENSION</td>
|
||||
<td onclick ondblclick class="text-start">FILE_STATUS_NM</td>
|
||||
<td onclick ondblclick class="text-end">PHOTO_CNT</td>
|
||||
<td onclick ondblclick class="text-center">FILE_SEQ</td>
|
||||
<td onclick ondblclick class="text-center">EQPMNT_CD</td>
|
||||
<td onclick ondblclick class="text-start">VHRNO</td>
|
||||
<td onclick ondblclick class="text-start">PHOTO_TYPE_NM</td>
|
||||
<td onclick ondblclick class="text-center">BZENTY_CD</td>
|
||||
<td onclick ondblclick class="text-start">VLTN_NM</td>
|
||||
<td onclick ondblclick class="text-center">CAR_VELOCITY</td>
|
||||
<td onclick ondblclick class="text-end">MOSC_X</td>
|
||||
<td onclick ondblclick class="text-end">MOSC_Y</td>
|
||||
<td onclick ondblclick class="text-end">PLATE_WIDTH</td>
|
||||
<td onclick ondblclick class="text-end">PLATE_HEIGHT</td>
|
||||
<td onclick ondblclick class="text-end">GPS_X</td>
|
||||
<td onclick ondblclick class="text-end">GPS_Y</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_YMD</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_TM</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_BGNG_TM</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_END_TM</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_SPAREA_NM</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_PLC</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_STDG_NM</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_ROAD_NM</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template class="notFound">
|
||||
<tr>
|
||||
<td valign="top" colspan="28" class="dataTables_empty text-center">
|
||||
정보를 찾지 못했습니다.
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div name="imageArea" class="card my-4 px-4 w-px-600 h-px-600 justify-content-center">
|
||||
</div>
|
||||
|
||||
<div class="card my-4 px-2 w-px-120 h-px-600">
|
||||
<div class="d-flex my-2 flex-column">
|
||||
<button type="button" name="btnInsertCrdn" class="btn btn-primary my-2">단속등록</button>
|
||||
<button type="button" name="btnDelete" class="btn btn-primary my-2">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form name="frmMultipart" method="post" enctype="multipart/form-data"></form>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
LoadScript("crdn05020Script",wctx.url("/resources/js/fims/crdn/crdn05020.js?ver=${ver}"));
|
||||
|
||||
pageObject["${pageName}"] = newDoctxFinder("${pageName}");
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
var $P = pageObject["${pageName}"];
|
||||
|
||||
$P.tempGroup = {};
|
||||
|
||||
/**************************************************************************
|
||||
* DatasetControl, DatasetSupport, FormFields
|
||||
**************************************************************************/
|
||||
var ctrl = newCrdn05020Control($P);
|
||||
|
||||
ctrl.dataset.onDatasetChange = (obj, option) => {
|
||||
|
||||
var t = $P.getGridTemplate();
|
||||
var trs = Apply.fromDataset.getTbody(ctrl.dataset, t.found, t.notFound, t.replacer);
|
||||
$P.renderParsedInfoList(obj?.Paging?.totalSize, ctrl.dataset.length, trs);
|
||||
|
||||
$P.pagingSupport.setPagingInfo(obj);
|
||||
};
|
||||
|
||||
ctrl.dataset.onCurrentChange = (dataItem) => {
|
||||
$P.$findn("imageArea").html("");
|
||||
|
||||
if(dataItem && dataItem.data){
|
||||
var dataIndex = dataItem.index;
|
||||
|
||||
$P.$findn("table-responsive").find("tbody").setCurrentRow(dataIndex);
|
||||
|
||||
if(dataItem.data.FILE_GROUP_TYPE == "BIN"){
|
||||
var srcArr = [];
|
||||
|
||||
for(var i=1; i <= dataItem.data.PHOTO_CNT; i++){
|
||||
srcArr.push("data:image/jpg;base64," + dataItem.data["B64IMAGE"+i])
|
||||
}
|
||||
|
||||
$P.renderImage(srcArr);
|
||||
} else {
|
||||
var dataKey = dataItem.data.FILE_NAME;
|
||||
if(!dataKey.endsWith(".txt") && !dataKey.endsWith(".TXT")){
|
||||
var src = dataItem.data.FILE_PATH;
|
||||
$P.renderImage(src);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
$P.pagingSupport = new FimsPagingSupport({
|
||||
doq: $P,
|
||||
linkContainer: "[name='parsedInfoPaging']"
|
||||
});
|
||||
|
||||
/**************************************************************************
|
||||
* pageObject.function
|
||||
**************************************************************************/
|
||||
|
||||
//ftp체크
|
||||
$P.checkFTP = () => {
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/importFileFromServer.do"),
|
||||
data : {
|
||||
taskSeCd : $P.$findn("taskSeCd").val()
|
||||
},
|
||||
success : (resp) => {
|
||||
if(resp.saved){
|
||||
$P.searchFileList();
|
||||
} else {
|
||||
dialog.alert({
|
||||
content : "파일 조회에 실패하였습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//로컬파일업로드
|
||||
$P.uploadLocalFile = () => {
|
||||
|
||||
if($P.$findn("uploadFiles").val() == ""){
|
||||
dialog.alert({
|
||||
content : "파일이 없습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var formData = new FormData($P.findn("frmFirst"));
|
||||
formData.append("taskSeCd", "${taskSeCd}");
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/importFileFromClient.do"),
|
||||
contentType : false, processData : false,
|
||||
data : formData,
|
||||
success : (resp) => {
|
||||
if(resp.saved){
|
||||
$P.$findn("uploadFiles").val("");
|
||||
$P.searchFileList();
|
||||
} else {
|
||||
dialog.alert({
|
||||
content : "파일 업로드에 실패하였습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//서버에 등록된 파일 조회
|
||||
$P.searchFileList = () => {
|
||||
|
||||
ctrl.dataset.setData([]);
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/list.do"),
|
||||
data : {
|
||||
taskSeCd : $P.$findn("taskSeCd").val()
|
||||
},
|
||||
success : (resp) => {
|
||||
ctrl.dataset.setData(resp);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$P.getGridTemplate = () => {
|
||||
var notFound = [$P.$findn("table-responsive").find("template.notFound")[0].innerHTML];
|
||||
var found = $P.$findn("table-responsive").find("template.found")[0].innerHTML;
|
||||
var replacer = (str, dataItem) => str
|
||||
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickParsedInfoList('{DATA-INDEX}');");
|
||||
|
||||
return {
|
||||
found : found,
|
||||
notFound : notFound,
|
||||
replacer : replacer
|
||||
};
|
||||
}
|
||||
|
||||
//테이블 렌더링
|
||||
$P.renderParsedInfoList = (total, listLength, trs) => {
|
||||
|
||||
$P.$findn("table-responsive").find("tbody").html(trs);
|
||||
|
||||
if(listLength != 0){
|
||||
FimsSupport.fnDownsizeCheck($P.$findn("table-responsive").find("table")[0]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//사진 표시
|
||||
$P.renderImage = (src) => {
|
||||
|
||||
if(Array.isArray(src)){
|
||||
var div = document.createElement("div");
|
||||
div.style["margin-top"] = "20px";
|
||||
div.style["margin-bottom"] = "20px";
|
||||
div.style["overflow-y"] = "scroll";
|
||||
for(var i=0; i < src.length; i++){
|
||||
var span = document.createElement("span");
|
||||
span.style["max-width"] = "260px";
|
||||
span.style["max-height"] = "260px";
|
||||
var img = document.createElement("img");
|
||||
img.style["object-fit"] = "contain";
|
||||
img.style["max-width"] = "inherit";
|
||||
img.style["max-height"] = "inherit";
|
||||
img.src = src[i];
|
||||
span.appendChild(img);
|
||||
div.appendChild(span);
|
||||
}
|
||||
$P.$findn("imageArea").append(div);
|
||||
} else {
|
||||
|
||||
var img = document.createElement("img");
|
||||
img.style["object-fit"] = "contain";
|
||||
img.src = src;
|
||||
$P.$findn("imageArea").append(img);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$P.clickParsedInfoList = (dataIndex) => {
|
||||
if(dataIndex == ""){
|
||||
return;
|
||||
}
|
||||
|
||||
ctrl.dataset.setCurrent(dataIndex);
|
||||
};
|
||||
|
||||
$P.createCrdn = () => {
|
||||
|
||||
if($.isEmptyObject($P.tempGroup)){
|
||||
dialog.alert({
|
||||
content : "모든 자료가 처리 완료되었습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var firstGroupKey = Object.keys($P.tempGroup)[0];
|
||||
var formData = new FormData($P.findn("frmMultipart"));
|
||||
formData.append("taskSeCd", "${taskSeCd}");
|
||||
formData.append("fileGroupType", $P.tempGroup[firstGroupKey][0].FILE_GROUP_TYPE);
|
||||
formData.append("fileLayoutId", $P.tempGroup[firstGroupKey][0].FILE_LAYOUT_ID);
|
||||
if($P.tempGroup[firstGroupKey].length == 1){
|
||||
formData.append("linkFileInfos", JSON.stringify({}));
|
||||
}
|
||||
for(var i=0; i<$P.tempGroup[firstGroupKey].length; i++){
|
||||
formData.append("linkFileInfos", JSON.stringify($P.tempGroup[firstGroupKey][i]));
|
||||
}
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/create.do"),
|
||||
contentType : false, processData : false,
|
||||
data : formData,
|
||||
success : (resp) => {
|
||||
|
||||
let removedFileNameArr = $P.tempGroup[firstGroupKey].map(item => item.FILE_NAME);
|
||||
|
||||
delete $P.tempGroup[firstGroupKey];
|
||||
|
||||
if(resp.saved){
|
||||
|
||||
$P.removeCallback(removedFileNameArr);
|
||||
|
||||
if(resp.alertMessage){
|
||||
alert(resp.alertMessage);
|
||||
}
|
||||
} else {
|
||||
alert(resp.failReason);
|
||||
}
|
||||
|
||||
//다음자료 진행
|
||||
$P.createCrdn();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$P.deleteFile = () => {
|
||||
var current = ctrl.dataset.getCurrent();
|
||||
if(current == null) return;
|
||||
|
||||
var fileName = current.FILE_NAME;
|
||||
var fileLayoutId = current.FILE_LAYOUT_ID;
|
||||
|
||||
ajax.get({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/remove.do"),
|
||||
data : {
|
||||
taskSeCd : $P.$findn("taskSeCd").val(),
|
||||
fileLayoutId : fileLayoutId,
|
||||
fileName : fileName
|
||||
},
|
||||
success : (resp) => {
|
||||
if(resp.saved){
|
||||
$P.removeCallback([fileName]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$P.removeCallback = (removedFileNameArr) => {
|
||||
let removedDataIndexArr = [];
|
||||
for(var i = 0; i < removedFileNameArr.length; i++){
|
||||
let dii = ctrl.dataset.getDataset("item").filter(item=>item.data.FILE_NAME == removedFileNameArr[i])[0].index;
|
||||
removedDataIndexArr.push(dii);
|
||||
}
|
||||
|
||||
ctrl.dataset.remove(removedDataIndexArr);
|
||||
$P.removeTableRow(removedDataIndexArr);
|
||||
}
|
||||
|
||||
$P.removeTableRow = (removedDataIndexArr) => {
|
||||
|
||||
var fileListTable = $P.$findn("table-responsive").find("table")[0];
|
||||
|
||||
for(var i = 0; i < removedDataIndexArr.length; i++){
|
||||
var target = removedDataIndexArr[i];
|
||||
var tr = $(fileListTable).find("tbody").find("tr[data-index='"+target+"']");
|
||||
var trIndex = $(fileListTable).find("tbody tr").index(tr);
|
||||
fileListTable.deleteRow(trIndex+1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* element.on
|
||||
**************************************************************************/
|
||||
$P.$findn("btnSearch").on("click", function(){ $P.checkFTP(); });
|
||||
|
||||
$P.$findn("btnFileUpload").on("click", function(){ $P.uploadLocalFile(); });
|
||||
|
||||
$P.$findn("btnInsertCrdn").on("click", function(){
|
||||
$P.tempGroup = Object.groupBy(ctrl.dataset.getDataset(), ({ TEMP_GROUP_ID }) => "temp"+TEMP_GROUP_ID);
|
||||
|
||||
if($.isEmptyObject($P.tempGroup)){
|
||||
alert("처리할 자료가 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
$P.createCrdn();
|
||||
});
|
||||
|
||||
$P.$findn("btnDelete").on("click", function(){ $P.deleteFile(); });
|
||||
|
||||
$P.$findn("direct").on("click", function(){
|
||||
if($(this).is(":checked")){
|
||||
$("#uploadFilesArea").removeAttr("hidden");
|
||||
$P.$findn("btnFileUpload").removeAttr("hidden");
|
||||
$P.$findn("btnSearch").attr("hidden","hidden");
|
||||
} else {
|
||||
$("#uploadFilesArea").attr("hidden","hidden");
|
||||
$P.$findn("btnFileUpload").attr("hidden","hidden");
|
||||
$P.$findn("btnSearch").removeAttr("hidden");
|
||||
$P.$findn("uploadFiles").val("");
|
||||
}
|
||||
});
|
||||
|
||||
ctrl.dataset.setData([]);
|
||||
});
|
||||
|
||||
</script>
|
||||
@ -1,497 +1,36 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
||||
<c:set var="pageKorName" scope="request">단속 파일 등록</c:set>
|
||||
<div class="d-flex flex-column" data-doctx="${pageName}">
|
||||
<div class="d-flex flex-row justify-content-evenly">
|
||||
<div class="card h-px-80 w-px-1400">
|
||||
<form name="frmFirst" method="post" enctype="multipart/form-data">
|
||||
<div class="row g-1">
|
||||
<div class="col-md-12">
|
||||
<div class="form-check form-switch">
|
||||
<input type="checkbox" is="id-input" name="direct" class="form-check-input" />
|
||||
<label is="name-label" for="direct" class="form-check-label">로컬파일업로드</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-1">
|
||||
<div class="col-md-12 d-flex align-items-center flex-nowrap">
|
||||
<label is="name-label" for="taskSeCd"
|
||||
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">과태료업무</label>
|
||||
<select is="id-select" name="taskSeCd" class="form-select" disabled>
|
||||
<c:forEach items="${TaskListForSgg}" var="item">
|
||||
<option value="${item.code}"
|
||||
<c:if test="${item.code eq taskSeCd}"> selected="selected" </c:if>
|
||||
>${item.value}</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
<span id="uploadFilesArea" hidden>
|
||||
<label is="name-label" for="uploadFiles"
|
||||
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">파일</label>
|
||||
<input type="file" is="id-input" name="uploadFiles"
|
||||
multiple="multiple" class="form-control"/>
|
||||
</span>
|
||||
<span class="d-flex justify-content-end float-start ms-4">
|
||||
<button type="button" name="btnSearch"
|
||||
class="btn btn-primary">조회</button>
|
||||
<button type="button" name="btnFileUpload"
|
||||
class="btn btn-primary" hidden>업로드</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-row justify-content-evenly">
|
||||
<div class="card my-4 px-4 h-px-600 w-px-700">
|
||||
<form name="frmGrid">
|
||||
<div>
|
||||
<span class="container-page-btn">
|
||||
<div class="d-flex flex-row justify-content-between">
|
||||
<span is="paging-info" name="parsedInfoPagingInfo" class="dataTables_info"></span>
|
||||
<ul name="parsedInfoPaging" class="pagination pagination-primary"></ul>
|
||||
</div>
|
||||
<span class="container-window-btn-right">
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-datatable text-nowrap">
|
||||
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
|
||||
<div name="table-responsive" class="table-responsive ox-scroll oy-scroll h-px-550">
|
||||
<table name="table" class="datatables-ajax table table-bordered dataTable no-footer">
|
||||
<thead class="sticky-thead">
|
||||
<tr>
|
||||
<th style="min-width: 80px;">단속자료</th>
|
||||
<th style="min-width: 80px;" title="더블클릭시 축소/확대 됩니다."
|
||||
class="downsize" ondblclick="FimsSupport.fnDownsizeToggle(this);" href="#">
|
||||
파일명 <i class='bx bx-expand'></i>
|
||||
</th>
|
||||
<th style="min-width: 80px;">타임스탬프</th>
|
||||
<th style="min-width: 80px;">파일사이즈</th>
|
||||
<th style="min-width: 80px;">파일확장자</th>
|
||||
<th style="min-width: 80px;">파일상태</th>
|
||||
<th style="min-width: 80px;">총사진갯수</th>
|
||||
<th style="min-width: 80px;">파일순번</th>
|
||||
<th style="min-width: 80px;">장비코드</th>
|
||||
<th style="min-width: 80px;">차량번호</th>
|
||||
<th style="min-width: 80px;">사진구분명</th>
|
||||
<th style="min-width: 80px;">업체코드</th>
|
||||
<th style="min-width: 80px;">위반내용</th>
|
||||
<th style="min-width: 80px;">차량속도</th>
|
||||
<th style="min-width: 80px;">번호판위치x</th>
|
||||
<th style="min-width: 80px;">번호판위치y</th>
|
||||
<th style="min-width: 80px;">번호판width</th>
|
||||
<th style="min-width: 80px;">번호판height</th>
|
||||
<th style="min-width: 80px;">위치좌표x</th>
|
||||
<th style="min-width: 80px;">위치좌표y</th>
|
||||
<th style="min-width: 80px;">날짜</th>
|
||||
<th style="min-width: 80px;">시간</th>
|
||||
<th style="min-width: 80px;">단속시작시간</th>
|
||||
<th style="min-width: 80px;">단속종료시간</th>
|
||||
<th style="min-width: 80px;">어린이보호구역</th>
|
||||
<th style="min-width: 80px;">단속장소명</th>
|
||||
<th style="min-width: 80px;">단속법정동</th>
|
||||
<th style="min-width: 80px;">단속장소(주소)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
<template is="curly-brackets" class="found">
|
||||
<tr data-index="DATA-INDEX">
|
||||
<td onclick ondblclick class="text-center">TEMP_GROUP_ID</td>
|
||||
<td onclick ondblclick title="{FILE_NAME}"
|
||||
class="text-start text-truncate max-w-th">FILE_NAME</td>
|
||||
<td onclick ondblclick class="text-center">FILE_LAST_MODIFIED</td>
|
||||
<td onclick ondblclick class="text-center">FILE_SIZE</td>
|
||||
<td onclick ondblclick class="text-start">FILE_EXTENSION</td>
|
||||
<td onclick ondblclick class="text-start">FILE_STATUS_NM</td>
|
||||
<td onclick ondblclick class="text-end">PHOTO_CNT</td>
|
||||
<td onclick ondblclick class="text-center">FILE_SEQ</td>
|
||||
<td onclick ondblclick class="text-center">EQPMNT_CD</td>
|
||||
<td onclick ondblclick class="text-start">VHRNO</td>
|
||||
<td onclick ondblclick class="text-start">PHOTO_TYPE_NM</td>
|
||||
<td onclick ondblclick class="text-center">BZENTY_CD</td>
|
||||
<td onclick ondblclick class="text-start">VLTN_NM</td>
|
||||
<td onclick ondblclick class="text-center">CAR_VELOCITY</td>
|
||||
<td onclick ondblclick class="text-end">MOSC_X</td>
|
||||
<td onclick ondblclick class="text-end">MOSC_Y</td>
|
||||
<td onclick ondblclick class="text-end">PLATE_WIDTH</td>
|
||||
<td onclick ondblclick class="text-end">PLATE_HEIGHT</td>
|
||||
<td onclick ondblclick class="text-end">GPS_X</td>
|
||||
<td onclick ondblclick class="text-end">GPS_Y</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_YMD</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_TM</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_BGNG_TM</td>
|
||||
<td onclick ondblclick class="text-center">CRDN_END_TM</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_SPAREA_NM</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_PLC</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_STDG_NM</td>
|
||||
<td onclick ondblclick class="text-start">CRDN_ROAD_NM</td>
|
||||
</tr>
|
||||
</template>
|
||||
<template class="notFound">
|
||||
<tr>
|
||||
<td valign="top" colspan="28" class="dataTables_empty text-center">
|
||||
정보를 찾지 못했습니다.
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div name="imageArea" class="card my-4 px-4 w-px-600 h-px-600 justify-content-center">
|
||||
</div>
|
||||
|
||||
<div class="card my-4 px-2 w-px-120 h-px-600">
|
||||
<div class="d-flex my-2 flex-column">
|
||||
<button type="button" name="btnInsertCrdn" class="btn btn-primary my-2">단속등록</button>
|
||||
<button type="button" name="btnDelete" class="btn btn-primary my-2">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form name="frmMultipart" method="post" enctype="multipart/form-data"></form>
|
||||
<div class="nav-align-top">
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li class="nav-item">
|
||||
<button type="button" class="nav-link active" role="tab" data-bs-toggle="tab" data-bs-target="#navs-top-cctv" aria-controls="navs-top-cctv" aria-selected="true">단속파일</button>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<button type="button" class="nav-link" role="tab" data-bs-toggle="tab" data-bs-target="#navs-top-local" aria-controls="navs-top-local" aria-selected="false">내 PC</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content" style="padding:.6em 0;" id="${infoPrefix}RightInclude">
|
||||
<div class="tab-pane fade show active" id="navs-top-cctv" role="tabpanel">
|
||||
<jsp:include page="crdn-cctv.jsp" />
|
||||
</div>
|
||||
<div class="tab-pane fade" id="navs-top-local" role="tabpanel">
|
||||
<jsp:include page="crdn-local.jsp" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
LoadScript("crdn05020Script",wctx.url("/resources/js/fims/crdn/crdn05020.js?ver=${ver}"));
|
||||
|
||||
pageObject["${pageName}"] = newDoctxFinder("${pageName}");
|
||||
|
||||
var pageName = null,
|
||||
dirSet = new Dataset({
|
||||
formats: {name: dateFormat}
|
||||
}),
|
||||
fileSet = new Dataset(),
|
||||
uploadSet = uploadSupport("input[name='uploadFiles']");
|
||||
$(document).ready(function(){
|
||||
|
||||
var $P = pageObject["${pageName}"];
|
||||
|
||||
$P.tempGroup = {};
|
||||
|
||||
/**************************************************************************
|
||||
* DatasetControl, DatasetSupport, FormFields
|
||||
**************************************************************************/
|
||||
var ctrl = newCrdn05020Control($P);
|
||||
|
||||
ctrl.dataset.onDatasetChange = (obj, option) => {
|
||||
|
||||
var t = $P.getGridTemplate();
|
||||
var trs = Apply.fromDataset.getTbody(ctrl.dataset, t.found, t.notFound, t.replacer);
|
||||
$P.renderParsedInfoList(obj?.Paging?.totalSize, ctrl.dataset.length, trs);
|
||||
|
||||
$P.pagingSupport.setPagingInfo(obj);
|
||||
};
|
||||
|
||||
ctrl.dataset.onCurrentChange = (dataItem) => {
|
||||
$P.$findn("imageArea").html("");
|
||||
|
||||
if(dataItem && dataItem.data){
|
||||
var dataIndex = dataItem.index;
|
||||
|
||||
$P.$findn("table-responsive").find("tbody").setCurrentRow(dataIndex);
|
||||
|
||||
if(dataItem.data.FILE_GROUP_TYPE == "BIN"){
|
||||
var srcArr = [];
|
||||
|
||||
for(var i=1; i <= dataItem.data.PHOTO_CNT; i++){
|
||||
srcArr.push("data:image/jpg;base64," + dataItem.data["B64IMAGE"+i])
|
||||
}
|
||||
|
||||
$P.renderImage(srcArr);
|
||||
} else {
|
||||
var dataKey = dataItem.data.FILE_NAME;
|
||||
if(!dataKey.endsWith(".txt") && !dataKey.endsWith(".TXT")){
|
||||
var src = dataItem.data.FILE_PATH;
|
||||
$P.renderImage(src);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
$P.pagingSupport = new FimsPagingSupport({
|
||||
doq: $P,
|
||||
linkContainer: "[name='parsedInfoPaging']"
|
||||
});
|
||||
|
||||
/**************************************************************************
|
||||
* pageObject.function
|
||||
**************************************************************************/
|
||||
|
||||
//ftp체크
|
||||
$P.checkFTP = () => {
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/importFileFromServer.do"),
|
||||
data : {
|
||||
taskSeCd : $P.$findn("taskSeCd").val()
|
||||
},
|
||||
success : (resp) => {
|
||||
if(resp.saved){
|
||||
$P.searchFileList();
|
||||
} else {
|
||||
dialog.alert({
|
||||
content : "파일 조회에 실패하였습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//로컬파일업로드
|
||||
$P.uploadLocalFile = () => {
|
||||
|
||||
if($P.$findn("uploadFiles").val() == ""){
|
||||
dialog.alert({
|
||||
content : "파일이 없습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var formData = new FormData($P.findn("frmFirst"));
|
||||
formData.append("taskSeCd", "${taskSeCd}");
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/importFileFromClient.do"),
|
||||
contentType : false, processData : false,
|
||||
data : formData,
|
||||
success : (resp) => {
|
||||
if(resp.saved){
|
||||
$P.$findn("uploadFiles").val("");
|
||||
$P.searchFileList();
|
||||
} else {
|
||||
dialog.alert({
|
||||
content : "파일 업로드에 실패하였습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//서버에 등록된 파일 조회
|
||||
$P.searchFileList = () => {
|
||||
|
||||
ctrl.dataset.setData([]);
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/list.do"),
|
||||
data : {
|
||||
taskSeCd : $P.$findn("taskSeCd").val()
|
||||
},
|
||||
success : (resp) => {
|
||||
ctrl.dataset.setData(resp);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$P.getGridTemplate = () => {
|
||||
var notFound = [$P.$findn("table-responsive").find("template.notFound")[0].innerHTML];
|
||||
var found = $P.$findn("table-responsive").find("template.found")[0].innerHTML;
|
||||
var replacer = (str, dataItem) => str
|
||||
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickParsedInfoList('{DATA-INDEX}');");
|
||||
|
||||
return {
|
||||
found : found,
|
||||
notFound : notFound,
|
||||
replacer : replacer
|
||||
};
|
||||
}
|
||||
|
||||
//테이블 렌더링
|
||||
$P.renderParsedInfoList = (total, listLength, trs) => {
|
||||
|
||||
$P.$findn("table-responsive").find("tbody").html(trs);
|
||||
|
||||
if(listLength != 0){
|
||||
FimsSupport.fnDownsizeCheck($P.$findn("table-responsive").find("table")[0]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//사진 표시
|
||||
$P.renderImage = (src) => {
|
||||
|
||||
if(Array.isArray(src)){
|
||||
var div = document.createElement("div");
|
||||
div.style["margin-top"] = "20px";
|
||||
div.style["margin-bottom"] = "20px";
|
||||
div.style["overflow-y"] = "scroll";
|
||||
for(var i=0; i < src.length; i++){
|
||||
var span = document.createElement("span");
|
||||
span.style["max-width"] = "260px";
|
||||
span.style["max-height"] = "260px";
|
||||
var img = document.createElement("img");
|
||||
img.style["object-fit"] = "contain";
|
||||
img.style["max-width"] = "inherit";
|
||||
img.style["max-height"] = "inherit";
|
||||
img.src = src[i];
|
||||
span.appendChild(img);
|
||||
div.appendChild(span);
|
||||
}
|
||||
$P.$findn("imageArea").append(div);
|
||||
} else {
|
||||
|
||||
var img = document.createElement("img");
|
||||
img.style["object-fit"] = "contain";
|
||||
img.src = src;
|
||||
$P.$findn("imageArea").append(img);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$P.clickParsedInfoList = (dataIndex) => {
|
||||
if(dataIndex == ""){
|
||||
return;
|
||||
}
|
||||
|
||||
ctrl.dataset.setCurrent(dataIndex);
|
||||
};
|
||||
|
||||
$P.createCrdn = () => {
|
||||
|
||||
if($.isEmptyObject($P.tempGroup)){
|
||||
dialog.alert({
|
||||
content : "모든 자료가 처리 완료되었습니다.",
|
||||
init : function(){
|
||||
AppSupport.setDialogZindex();
|
||||
AppSupport.focusClose();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var firstGroupKey = Object.keys($P.tempGroup)[0];
|
||||
var formData = new FormData($P.findn("frmMultipart"));
|
||||
formData.append("taskSeCd", "${taskSeCd}");
|
||||
formData.append("fileGroupType", $P.tempGroup[firstGroupKey][0].FILE_GROUP_TYPE);
|
||||
formData.append("fileLayoutId", $P.tempGroup[firstGroupKey][0].FILE_LAYOUT_ID);
|
||||
if($P.tempGroup[firstGroupKey].length == 1){
|
||||
formData.append("linkFileInfos", JSON.stringify({}));
|
||||
}
|
||||
for(var i=0; i<$P.tempGroup[firstGroupKey].length; i++){
|
||||
formData.append("linkFileInfos", JSON.stringify($P.tempGroup[firstGroupKey][i]));
|
||||
}
|
||||
|
||||
ajax.post({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/create.do"),
|
||||
contentType : false, processData : false,
|
||||
data : formData,
|
||||
success : (resp) => {
|
||||
|
||||
let removedFileNameArr = $P.tempGroup[firstGroupKey].map(item => item.FILE_NAME);
|
||||
|
||||
delete $P.tempGroup[firstGroupKey];
|
||||
|
||||
if(resp.saved){
|
||||
|
||||
$P.removeCallback(removedFileNameArr);
|
||||
|
||||
if(resp.alertMessage){
|
||||
alert(resp.alertMessage);
|
||||
}
|
||||
} else {
|
||||
alert(resp.failReason);
|
||||
}
|
||||
|
||||
//다음자료 진행
|
||||
$P.createCrdn();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$P.deleteFile = () => {
|
||||
var current = ctrl.dataset.getCurrent();
|
||||
if(current == null) return;
|
||||
|
||||
var fileName = current.FILE_NAME;
|
||||
var fileLayoutId = current.FILE_LAYOUT_ID;
|
||||
|
||||
ajax.get({
|
||||
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/remove.do"),
|
||||
data : {
|
||||
taskSeCd : $P.$findn("taskSeCd").val(),
|
||||
fileLayoutId : fileLayoutId,
|
||||
fileName : fileName
|
||||
},
|
||||
success : (resp) => {
|
||||
if(resp.saved){
|
||||
$P.removeCallback([fileName]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$P.removeCallback = (removedFileNameArr) => {
|
||||
let removedDataIndexArr = [];
|
||||
for(var i = 0; i < removedFileNameArr.length; i++){
|
||||
let dii = ctrl.dataset.getDataset("item").filter(item=>item.data.FILE_NAME == removedFileNameArr[i])[0].index;
|
||||
removedDataIndexArr.push(dii);
|
||||
}
|
||||
|
||||
ctrl.dataset.remove(removedDataIndexArr);
|
||||
$P.removeTableRow(removedDataIndexArr);
|
||||
}
|
||||
|
||||
$P.removeTableRow = (removedDataIndexArr) => {
|
||||
|
||||
var fileListTable = $P.$findn("table-responsive").find("table")[0];
|
||||
|
||||
for(var i = 0; i < removedDataIndexArr.length; i++){
|
||||
var target = removedDataIndexArr[i];
|
||||
var tr = $(fileListTable).find("tbody").find("tr[data-index='"+target+"']");
|
||||
var trIndex = $(fileListTable).find("tbody tr").index(tr);
|
||||
fileListTable.deleteRow(trIndex+1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* element.on
|
||||
**************************************************************************/
|
||||
$P.$findn("btnSearch").on("click", function(){ $P.checkFTP(); });
|
||||
|
||||
$P.$findn("btnFileUpload").on("click", function(){ $P.uploadLocalFile(); });
|
||||
|
||||
$P.$findn("btnInsertCrdn").on("click", function(){
|
||||
$P.tempGroup = Object.groupBy(ctrl.dataset.getDataset(), ({ TEMP_GROUP_ID }) => "temp"+TEMP_GROUP_ID);
|
||||
|
||||
if($.isEmptyObject($P.tempGroup)){
|
||||
alert("처리할 자료가 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
$P.createCrdn();
|
||||
});
|
||||
|
||||
$P.$findn("btnDelete").on("click", function(){ $P.deleteFile(); });
|
||||
|
||||
$P.$findn("direct").on("click", function(){
|
||||
if($(this).is(":checked")){
|
||||
$("#uploadFilesArea").removeAttr("hidden");
|
||||
$P.$findn("btnFileUpload").removeAttr("hidden");
|
||||
$P.$findn("btnSearch").attr("hidden","hidden");
|
||||
} else {
|
||||
$("#uploadFilesArea").attr("hidden","hidden");
|
||||
$P.$findn("btnFileUpload").attr("hidden","hidden");
|
||||
$P.$findn("btnSearch").removeAttr("hidden");
|
||||
$P.$findn("uploadFiles").val("");
|
||||
}
|
||||
});
|
||||
|
||||
ctrl.dataset.setData([]);
|
||||
${scriptCctv}
|
||||
${scriptLocal}
|
||||
});
|
||||
|
||||
//# sourceURL=crdn05020-info.jsp
|
||||
</script>
|
||||
Loading…
Reference in New Issue