feat: 현장투수시험 중복 체크 강화

main
thkim 2025-11-14 11:59:31 +09:00
parent 757150db37
commit c26a7d60fd
5 changed files with 97 additions and 40 deletions

View File

@ -12,6 +12,43 @@ var extFile = "<%=fileCmmn.getFileList("IMG")%>";
var extFileList = extFile.split(",");
var selectedSeq = "";
//kendoGrid에서 중복된 행을 빨간색으로 흔드는 함수
function highlightDuplicateRows(grid, indices) {
var trs = grid.tbody.find("tr");
for (var i = 0; i < indices.length; i++) {
var rowIndex = indices[i];
var rowElement = trs[rowIndex];
// CSS 클래스 추가
kendoJQuery(rowElement).addClass("k-row-duplicate-shake");
}
// 2초 후 클래스 제거
setTimeout(function() {
kendoJQuery(".k-row-duplicate-shake").removeClass("k-row-duplicate-shake");
}, 2000);
}
//중복 강조를 위한 CSS 추가
function fn_addHighlightStyles() {
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = `
@keyframes shake {
10%, 90% { transform: translate3d(-1px, 0, 0); }
20%, 80% { transform: translate3d(2px, 0, 0); }
30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
40%, 60% { transform: translate3d(4px, 0, 0); }
}
.k-row-duplicate-shake {
background-color: #ffcccc !important;
animation: shake 0.5s;
animation-iteration-count: infinite;
}
`;
document.head.appendChild(style);
}
// Grid1 데이터 조회
function selectGrid1() {
@ -298,6 +335,54 @@ function fn_save(rUrl) {
return false;
}
// ----------------------- [수정됨] kictGrid2 시간(sec) 중복 체크 시작 -----------------------
var grid2 = kendoJQuery("#kictGrid2").data("kendoGrid");
var data2 = grid2.dataSource._data; // data2 변수 재사용
var seenTimes = {};
var duplicateIndices = [];
for(var i=0; i<data2.length; i++){
var row = data2[i];
var timeValue = row.fieldperSubTime; // 시간(sec) 컬럼
// 빈 값은 중복 체크에서 제외
if (timeValue === "" || timeValue === null || timeValue === undefined) {
continue;
}
var key = timeValue.toString(); // 키 값으로 사용
if (seenTimes[key]) {
// 중복된 값을 발견하면 인덱스 저장
if (seenTimes[key].first) {
duplicateIndices.push(seenTimes[key].index);
seenTimes[key].first = false;
}
duplicateIndices.push(i);
}
seenTimes[key] = { index: i, first: true };
}
if (duplicateIndices.length > 0) {
// 중복된 값을 포함하여 알림 메시지 생성
var duplicatedValues = "";
var uniqueDuplicates = new Set();
for (var i = 0; i < duplicateIndices.length; i++) {
var row = data2[duplicateIndices[i]];
var value = row.fieldperSubTime;
uniqueDuplicates.add(value);
}
duplicatedValues = Array.from(uniqueDuplicates).join(", ");
alert("시간(sec) 데이터에 중복이 있습니다: " + duplicatedValues + ". 중복을 확인 후 다시 저장해 주십시오.");
// 중복된 행을 시각적으로 강조
highlightDuplicateRows(grid2, duplicateIndices);
return false; // 저장 중단
}
// ----------------------- [수정됨] kictGrid2 시간(sec) 중복 체크 끝 -----------------------
// ----------------------- kendoGrid XML 구조저장 시작 -----------------------
var grid1 = kendoJQuery("#kictGrid1").data("kendoGrid");
@ -331,9 +416,9 @@ function fn_save(rUrl) {
];
if(fn_saveNumberCheckKendo("ROW", dataSource1, grid1, "gridCheck1", 0, rowInfo1, rowInfoItem1) == false)return false;
var grid2 = kendoJQuery("#kictGrid2").data("kendoGrid");
// var grid2 = kendoJQuery("#kictGrid2").data("kendoGrid"); // 위에서 이미 선언됨
var dataSource2 = grid2.dataSource;
var data2 = dataSource2._data;
// var data2 = dataSource2._data; // 위에서 이미 선언됨
var kendoRowCount2 = dataSource2._view.length; // 가로(행) 갯수
var kendoColCount2 = grid2.columns.length; // 세로(열) 갯수
@ -386,12 +471,12 @@ function fn_save(rUrl) {
document.getElementById("colCount").value = kendoColCount1;
document.frmPm.rowDelFileArr.value = rowDelFileArr;
document.frmPm.topGridRowDelete.value = topGridRowDelete;
document.frmPm.SEQ.value = selectedSeq; //현재 상위 그리드에서 선택되어있는 SEQ
document.frmPm.SEQ.value = selectedSeq; //현재 상위 그리드에서 선택되어있는 SEQ
var _seq = selectedSeq;
$('#beforeSEQ').val("");
// 2019.10.10 이미지 업로드 필수 수정
// 2019.10.10 이미지 업로드 필수 수정
var fileImg = $("#GRAPH_IMAGE_"+_seq).val();
var fileImg_bk = $("#OLD_GRAPH_IMAGE_"+_seq).val();
if(fileImg_bk === "null" ){
@ -758,25 +843,16 @@ function fn_grid_refresh(){
</script>
<!-- 헤더 시작 -->
<c:import url="/manage/includeTopInput.do" />
<!-- 헤더 끝 -->
<!-- 페이지 컨테이너 시작 -->
<section class="page-container">
<div class="page-content-wrapper">
<!-- 서브메뉴 시작 -->
<c:import url="/include_left_tree_input.do" />
<!-- 서브메뉴 끝 -->
<!-- 컨텐츠 시작 -->
<div class="page-content">
<div class="page-content-inner">
<!-- 카테고리 시작 -->
<div class="category-wrapper">
<ul class="page-category">
<li class="category-item" id="category_1dep"></li>
@ -786,23 +862,16 @@ function fn_grid_refresh(){
<a href="javascript:;" class="btn btn-help start-tour" onClick="fn_help_tour_confirm();">도움말</a>
</div>
<!-- 카테고리 끝 -->
<h1 class="page-title-1depth"><span>기본현장시험 정보</span></h1>
<!-- 내용 시작 -->
<div class="content-wrapper">
<!-- search start -->
<div class="contents">
<!-- 프로젝트 정보 출력 -->
<c:import url="/com/includeProjectInfo.do" />
<!-- Tab 출력 -->
<c:import url="/com/includeTopLabInfo.do" />
<!-- Tab 컨텐츠 출력 -->
<div class="tab-content">
<div class="table-top-control">
@ -826,6 +895,7 @@ function fn_grid_refresh(){
kendoJQuery(document).ready(function () {
selectGrid1();
fn_kendoGrid2(null); // 20201005 ROW 셀렉트시 탭,엔터키 에러 수정
fn_addHighlightStyles(); // [수정됨] 중복 강조 CSS 함수 호출
});
function onDataBound1(e) {
@ -1177,22 +1247,11 @@ function fn_grid_refresh(){
</div>
</div>
<!-- search end -->
</div>
</div>
<!-- 내용 끝 -->
</div>
</div>
<!-- 컨텐츠 끝 -->
</div>
</div>
</section>
<!-- 페이지 컨테이너 끝 -->
<!-- footer 시작 -->
<c:import url="/com/includeFooterInput.do"/>
<!-- footer 끝 -->

View File

@ -652,8 +652,6 @@ function initApp(param){
"WEB_STEEP_SLOPE",
O2MAP_URL,
{
isBaseLayer: false,
visibility: false,
layers : T_WEB_STEEP_SLOPE,
transparent : true,
format : "image/png",
@ -661,7 +659,7 @@ function initApp(param){
}, {
singleTile : false,
isBaseLayer : false,
visibility: getQueryString("masterCompanyCode") === null ? true : true,
visibility: false,
transitionEffect: "resize",
buffer : 0,
removeBackBufferDelay : 0