feat: 현장투수시험 중복 체크 강화
parent
757150db37
commit
c26a7d60fd
|
|
@ -1138,7 +1138,7 @@ public class LoginController {
|
|||
url = "home/main_sitemap.jsp";
|
||||
else
|
||||
url = "index.do?cntyn=0";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ public interface LoginMapper {
|
|||
|
||||
EgovMap selectSearchIniUserId(Map<String, Object> params);
|
||||
|
||||
public int checkWebMemberIn(Map<String, Object> map) throws Exception;
|
||||
public int checkWebMemberIn(Map<String, Object> map) throws Exception;
|
||||
|
||||
String findProjectMasterCompanyNameByUserid(String userId);
|
||||
String findProjectMasterCompanyCodeByUserid(String userId);
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ public interface LoginService {
|
|||
Map<String, Object> selectWebMemberInLoginCount(Map<String, Object> map) throws Exception;
|
||||
void insertWebRequestLog(Map<String, Object> map) throws Exception;
|
||||
void updateWebMemberIn(Map<String, Object> map) throws Exception;
|
||||
int insertSearchPassLog(Map<String, Object> map)throws Exception;
|
||||
int insertSearchPassLog(Map<String, Object> map)throws Exception;
|
||||
void pswdResetWebMemberIn(Map<String,Object> map) throws Exception;
|
||||
Map<String, Object> selectSearchId(Map<String, Object> map) throws Exception;
|
||||
Map<String, Object> selectSearchIdByNameAndPhoneAndDupinfoIsNullAndCertificationYnFalse(Map<String, Object> map) throws Exception;
|
||||
|
|
|
|||
|
|
@ -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 끝 -->
|
||||
|
||||
<c:import url="/com/includeFooterInput.do"/>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue