Compare commits

..

No commits in common. "main" and "jiyoo" have entirely different histories.
main ... jiyoo

8 changed files with 730 additions and 649 deletions

View File

@ -69,7 +69,6 @@ import geoinfo.regi.status.service.RegiPageService;
import geoinfo.regi.surface.service.SurfaceService; import geoinfo.regi.surface.service.SurfaceService;
import geoinfo.util.DateUtil; import geoinfo.util.DateUtil;
import geoinfo.util.ExcelUtil; import geoinfo.util.ExcelUtil;
import geoinfo.util.MyUtil;
import geoinfo.util.RsWrapper; import geoinfo.util.RsWrapper;
import geoinfo.util.StringUtil; import geoinfo.util.StringUtil;
import ictway.comm.util.strUtil; import ictway.comm.util.strUtil;
@ -677,69 +676,14 @@ public class ManageExcelUploadProc03Controller {
sandService.insertTempCbrCompac(map); sandService.insertTempCbrCompac(map);
} }
} }
listMap = ("".equals(saveMap.get("co5List")))?null:(List<HashMap<String, Object>>) saveMap.get("co5List");
Object co5Obj = saveMap.get("co5List");
listMap = null;
if (co5Obj != null) {
if (co5Obj instanceof List) {
// 1. 이미 List 타입인 경우 안전하게 형변환
listMap = (List<HashMap<String, Object>>) co5Obj;
} else if (co5Obj instanceof String) {
// 2. String 타입인 경우 양옆 공백 제거
String strCo5 = ((String) co5Obj).trim();
// 3. 에러 원인 원천 차단: 빈 문자열이 아니고, 반드시 '['로 시작할 때만 파싱
if (!strCo5.isEmpty() && strCo5.startsWith("[")) {
JSONArray jsonArray = JSONArray.fromObject(strCo5);
// 필요에 따라 JSONArray를 List<HashMap>으로 변환
listMap = (List<HashMap<String, Object>>) JSONArray.toCollection(jsonArray, HashMap.class);
} else {
// '['로 시작하지 않거나 빈 문자열인 경우의 예외 처리 (로그 출력 등)
// listMap은 초기값인 null을 유지합니다.
System.out.println("Invalid or empty JSON Array string: " + strCo5);
}
}
}
if(null != listMap){ if(null != listMap){
for(HashMap<String, Object> map : listMap){ for(HashMap<String, Object> map : listMap){
logger.debug("=====>co5List:" + map.toString()); logger.debug("=====>co5List:" + map.toString());
sandService.insertTempConsolidationUsual(map); sandService.insertTempConsolidationUsual(map);
} }
} }
listMap = ("".equals(saveMap.get("co5List")))?null:(List<HashMap<String, Object>>) saveMap.get("co5sList");
// "co5sList"를 기준으로 데이터를 안전하게 가져오고 파싱합니다.
Object co5sObj = saveMap.get("co5sList");
listMap = null;
if (co5sObj != null) {
if (co5sObj instanceof List) {
// 1. 이미 List 형태인 경우 바로 캐스팅
listMap = (List<HashMap<String, Object>>) co5sObj;
} else if (co5sObj instanceof String) {
// 2. String 형태인 경우 JSON 배열 형식인지 검사 후 파싱
String strCo5s = ((String) co5sObj).trim();
if (!strCo5s.isEmpty() && strCo5s.startsWith("[")) {
JSONArray jsonArray = JSONArray.fromObject(strCo5s);
listMap = (List<HashMap<String, Object>>) JSONArray.toCollection(jsonArray, HashMap.class);
} else {
// 올바른 JSON 배열 형태가 아닐 경우의 예외 처리
System.out.println("Invalid or empty JSON Array string for co5sList: " + strCo5s);
resultMsg = "토사시험정보 > 압밀시험 부정보가 없습니다.";
params.put("resultMsg",resultMsg);
resultMsg = URLEncoder.encode(resultMsg, "utf-8");
JSONObject jsonData = getJsonFromMap(resultMap);
logger.debug("jsonData==>"+ jsonData.toString());
JSONObject jsonObj = new JSONObject();
jsonObj.put("resultData", jsonData.toString());
return new ObjectMapper().writeValueAsString(jsonObj);
}
}
}
if(null != listMap){ if(null != listMap){
for(HashMap<String, Object> map : listMap){ for(HashMap<String, Object> map : listMap){
logger.debug("=====>co5sList:" + map.toString()); logger.debug("=====>co5sList:" + map.toString());
@ -3720,14 +3664,7 @@ public class ManageExcelUploadProc03Controller {
if(!StringUtil.containsCharOnly(excelWp.get("col1",i).trim(),"0123456789.")){ if(!StringUtil.containsCharOnly(excelWp.get("col1",i).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, "시험횟수는 실수만 입력이 가능합니다."); resultMsg += String.format(fmtMsg, "시험횟수는 실수만 입력이 가능합니다.");
} }
String strTestNo2 = excelWp.get("col0",i).trim(); testNo2 = Integer.valueOf(excelWp.get("col0",i).trim());
if( MyUtil.isNumeric(strTestNo2) ) {
testNo2 = Integer.valueOf(strTestNo2);
} else {
String errMessage = "시험횟수는 실수만 입력이 가능합니다.";
resultMsg += String.format(fmtMsg, errMessage);
throw new Exception(errMessage);
}
testNo = testNo2 > testNo ? testNo2 : testNo; testNo = testNo2 > testNo ? testNo2 : testNo;
testNoCheck[i] = (String)(excelWp.get("col0",i).trim())+(String)(excelWp.get("col1",i).trim()); testNoCheck[i] = (String)(excelWp.get("col0",i).trim())+(String)(excelWp.get("col1",i).trim());
@ -4805,26 +4742,11 @@ public class ManageExcelUploadProc03Controller {
WebUtil wUtil = new WebUtil(); WebUtil wUtil = new WebUtil();
strUtil sUtil = new strUtil(); strUtil sUtil = new strUtil();
String resultMsg = ""; String resultMsg = "";
String fmtMsg = "[토사시험정보 - 압밀시험정보] %s|"; String fmtMsg = "[토사시험정보 - 압밀시험정보] %s|";
final int consolidationTestCount = excelWp.getLength(); String testNoCheck[] = new String[excelWp.getLength()];
final int sampleInfoCount = _sampleInfoList.size(); if(excelWp.getLength() != _sampleInfoList.size()){
String testNoCheck[] = new String[consolidationTestCount]; params.put("resultMsg", String.format(fmtMsg, "기본물성시험정보의 시료 갯수"+excelWp.getLength() != _sampleInfoList.size()+"개와 같지 않습니다."));
/*
if( consolidationTestCount != sampleInfoCount){
params.put("resultMsg", String.format(fmtMsg, "기본물성시험정보의 시료 갯수"+consolidationTestCount != sampleInfoCount+"개와 같지 않습니다."));
return params;
};
*/
if( consolidationTestCount == 0 ){
params.put("resultMsg", String.format(fmtMsg, "[토사시험정보 - 압밀시험정보] 개수가 0개입니다. 1개 이상 입력하십시오."));
return params;
};
if( sampleInfoCount < consolidationTestCount ){
params.put("resultMsg", String.format(fmtMsg, "[토사시험정보 - 압밀시험정보] 개수가 " + consolidationTestCount + "개입니다. 기본물성시험 개수인 " + sampleInfoCount+"개를 초과하여 입력할 수 없습니다."));
return params; return params;
}; };
@ -4832,8 +4754,8 @@ public class ManageExcelUploadProc03Controller {
int testNo = 1; int testNo = 1;
try{ try{
List<HashMap<String, Object>> list = new ArrayList<HashMap<String,Object>>(); List<HashMap<String, Object>> list = new ArrayList<HashMap<String,Object>>();
resultMsg = imageUpload(params,"압밀시험정보 그래프", savePath, strFile, resultMsg, "[토사시험정보 - 압밀시험 그래프] %s|", "압밀시험결과 그래프",consolidationTestCount); resultMsg = imageUpload(params,"압밀시험정보 그래프", savePath, strFile, resultMsg, "[토사시험정보 - 압밀시험 그래프] %s|", "압밀시험결과 그래프",excelWp.getLength());
for(int i=0; i < consolidationTestCount; i++){ for(int i=0; i < excelWp.getLength(); i++){
testNo2 = Integer.valueOf(excelWp.get("col0",i).trim()); testNo2 = Integer.valueOf(excelWp.get("col0",i).trim());
testNo = testNo2 > testNo ? testNo2 : testNo; testNo = testNo2 > testNo ? testNo2 : testNo;
@ -4883,8 +4805,8 @@ public class ManageExcelUploadProc03Controller {
} }
} }
if( sampleInfoCount < testNo ) { if(testNo != _sampleInfoList.size()) {
params.put("resultMsg", String.format(fmtMsg, "최대 테스트 번호가 기본물성시험정보의 시료 갯수"+consolidationTestCount != sampleInfoCount+"와 같지 않습니다.")); params.put("resultMsg", String.format(fmtMsg, "최대 테스트 번호가 기본물성시험정보의 시료 갯수"+excelWp.getLength() != _sampleInfoList.size()+"와 같지 않습니다."));
return params; return params;
} }
@ -4900,28 +4822,11 @@ public class ManageExcelUploadProc03Controller {
} }
for(int i=0; i < consolidationTestCount; i++){ for(int i=0; i < excelWp.getLength(); i++){
int testSampleNo = Integer.valueOf(excelWp.get("col0",i).trim()); // 사용자가 입력한 순번(물성시험 샘플을 순번으로 찾을때 사용)
String targetSampleCode = null;
for (Map<String, Object> sample : _sampleInfoList) {
String sampleCode = (String) sample.get("SAMPLE_CODE");
// SAMPLE_CODE 끝 숫자 추출
String numberPart = sampleCode.replaceAll(".*?(\\d+)$", "$1");
int number = Integer.parseInt(numberPart);
if (number == testSampleNo) {
targetSampleCode = sampleCode;
break;
}
}
if (targetSampleCode == null) { // 테스트번호에 매핑되는 물성시험 sample코드가 존재하지 않음
throw new IllegalArgumentException(
String.format("물성시험 시료번호를 확인 하세요. (테스트 번호:%s)",testNo));
}
HashMap<String,Object> map = new HashMap<>(); HashMap<String,Object> map = new HashMap<>();
map.put("PROJECT_CODE", _projectCode); map.put("PROJECT_CODE", _projectCode);
map.put("HOLE_CODE", _holeCode); map.put("HOLE_CODE", _holeCode);
map.put("SAMPLE_CODE", targetSampleCode); map.put("SAMPLE_CODE", (String) _sampleInfoList.get(i).get("SAMPLE_CODE"));
map.put("CONSOL_SAMPLE_DIA", excelWp.get("col1", i).trim()); // 직경(cm) map.put("CONSOL_SAMPLE_DIA", excelWp.get("col1", i).trim()); // 직경(cm)
map.put("CONSOL_SAMPLE_HEIGHT", excelWp.get("col2", i).trim()); // 길이(cm) map.put("CONSOL_SAMPLE_HEIGHT", excelWp.get("col2", i).trim()); // 길이(cm)
map.put("CONSOL_W0", excelWp.get("col3", i).trim()); // 초기 함수비(%) map.put("CONSOL_W0", excelWp.get("col3", i).trim()); // 초기 함수비(%)
@ -5654,7 +5559,6 @@ public class ManageExcelUploadProc03Controller {
} }
params.put("list", (list.size() < 1)?"":list); params.put("list", (list.size() < 1)?"":list);
params.put("resultMsg", resultMsg);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요."); params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요.");
logger.debug(e.getMessage()); logger.debug(e.getMessage());
@ -5695,21 +5599,24 @@ public class ManageExcelUploadProc03Controller {
resultMsg = String.format(fmtMsg, k+"번째 테스트 번호는 반드시 입력해야 합니다."); resultMsg = String.format(fmtMsg, k+"번째 테스트 번호는 반드시 입력해야 합니다.");
} }
if(!StringUtil.containsCharOnly(excelWp.get("col1",k).trim(),"0123456789.")){ if(!StringUtil.containsCharOnly(excelWp.get("col1",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 시간간격은 실수만 입력이 가능합니다.");
}
if(!StringUtil.containsCharOnly(excelWp.get("col2",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 시간간격(sec)은 실수만 입력이 가능합니다."); resultMsg += String.format(fmtMsg, k+"번째 시간간격(sec)은 실수만 입력이 가능합니다.");
} }
if(!StringUtil.containsCharOnly(excelWp.get("col2",k).trim(),"0123456789.-")){ if(!StringUtil.containsCharOnly(excelWp.get("col3",k).trim(),"0123456789.-")){
resultMsg += String.format(fmtMsg, k+"번째 총수두(cm)는 실수와 -(하이픈) 입력이 가능합니다."); resultMsg += String.format(fmtMsg, k+"번째 총수두(cm)는 실수만 입력이 가능합니다.");
}
if(!StringUtil.containsCharOnly(excelWp.get("col3",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 수두차(cm)는 실수만 입력이 가능합니다.");
} }
if(!StringUtil.containsCharOnly(excelWp.get("col4",k).trim(),"0123456789.")){ if(!StringUtil.containsCharOnly(excelWp.get("col4",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 유출수량(c㎥)은 실수만 입력이 가능합니다."); resultMsg += String.format(fmtMsg, k+"번째 수두차(cm)는 실수만 입력이 가능합니다.");
} }
if(!StringUtil.containsCharOnly(excelWp.get("col5",k).trim(),"0123456789.")){ if(!StringUtil.containsCharOnly(excelWp.get("col5",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 수량(c㎥)은 실수만 입력이 가능합니다."); resultMsg += String.format(fmtMsg, k+"번째 유출수량(c㎥)은 실수만 입력이 가능합니다.");
} }
if(!StringUtil.containsCharOnly(excelWp.get("col6",k).trim(),"0123456789.")){ if(!StringUtil.containsCharOnly(excelWp.get("col6",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 수량(c㎥)은 실수만 입력이 가능합니다.");
}
if(!StringUtil.containsCharOnly(excelWp.get("col7",k).trim(),"0123456789.")){
resultMsg += String.format(fmtMsg, k+"번째 투수계수(K,cm/sec)는 실수만 입력이 가능합니다."); resultMsg += String.format(fmtMsg, k+"번째 투수계수(K,cm/sec)는 실수만 입력이 가능합니다.");
} }
@ -5746,10 +5653,6 @@ public class ManageExcelUploadProc03Controller {
} }
HashMap<String,Object> map = new HashMap<>(); HashMap<String,Object> map = new HashMap<>();
String fieldperSubTotalHead = excelWp.get("col2", k).trim();
if("-".equals(fieldperSubTotalHead)) {
fieldperSubTotalHead = "-999";
}
String fieldperSubFallingHead = excelWp.get("col3", k).trim(); String fieldperSubFallingHead = excelWp.get("col3", k).trim();
if("-".equals(fieldperSubFallingHead)) { if("-".equals(fieldperSubFallingHead)) {
fieldperSubFallingHead = "-999"; fieldperSubFallingHead = "-999";
@ -5760,7 +5663,8 @@ public class ManageExcelUploadProc03Controller {
map.put("fieldperCode", mFieldperCode); map.put("fieldperCode", mFieldperCode);
map.put("fieldperOrder", tNo); map.put("fieldperOrder", tNo);
map.put("fieldperSubTime", excelWp.get("col1", k).trim()); map.put("fieldperSubTime", excelWp.get("col1", k).trim());
map.put("fieldperSubTotalHead", fieldperSubTotalHead); map.put("fieldperSubTotalHead", excelWp.get("col2", k).trim());
// map.put("fieldperSubFallingHead", excelWp.get("col3", k).trim()); // [YJI / 26.04.09] 엑셀 업로드 '-' 입력 지원. 입력값이 '-' 이면 DB에 저장은 -999로 한다.
map.put("fieldperSubFallingHead", fieldperSubFallingHead); map.put("fieldperSubFallingHead", fieldperSubFallingHead);
map.put("fieldperSubWaterLoose", excelWp.get("col4", k).trim()); map.put("fieldperSubWaterLoose", excelWp.get("col4", k).trim());
map.put("fieldperSubQuantity", excelWp.get("col5", k).trim()); map.put("fieldperSubQuantity", excelWp.get("col5", k).trim());
@ -6763,21 +6667,10 @@ public class ManageExcelUploadProc03Controller {
String fmtMsg = "[기본물성시험정보] %s|"; String fmtMsg = "[기본물성시험정보] %s|";
RsWrapper excelWpHeader = ExcelUtil.getRsWp(strFile, "기본물성시험정보", 1, 0, 11); RsWrapper excelWpHeader = ExcelUtil.getRsWp(strFile, "기본물성시험정보", 1, 0, 11);
String szHasNoBasicPhysicalPropertyTest = excelWpHeader.get("col10",0).trim(); // 기본물성시험 데이터가 없는 사업 여부를 체크한다. TRUE면 기본물성시험 데이터가 없는사업이며, FALSE면 기본물성시험 데이터가 있는 일반적인 사업이다.
boolean hasNoBasicPhysicalPropertyTest = false; boolean hasNoBasicPhysicalPropertyTest = false;
if( excelWpHeader.getLength() == 0 ) { if( szHasNoBasicPhysicalPropertyTest != null && szHasNoBasicPhysicalPropertyTest.equalsIgnoreCase("true") ) {
resultMsg += String.format(fmtMsg, "기본물성시험정보 엑셀이 아닙니다."); hasNoBasicPhysicalPropertyTest = true;
params.put("resultMsg", resultMsg);
return params;
} else if( excelWpHeader.get("col10",0) == null ) {
resultMsg += String.format(fmtMsg, "엑셀양식이 올바르지 않습니다. 최신 엑셀양식을 확인해주세요.");
params.put("resultMsg", resultMsg);
return params;
} else {
String szHasNoBasicPhysicalPropertyTest = excelWpHeader.get("col10",0).trim(); // 기본물성시험 데이터가 없는 사업 여부를 체크한다. TRUE면 기본물성시험 데이터가 없는사업이며, FALSE면 기본물성시험 데이터가 있는 일반적인 사업이다.
if( szHasNoBasicPhysicalPropertyTest != null && szHasNoBasicPhysicalPropertyTest.equalsIgnoreCase("true") ) {
hasNoBasicPhysicalPropertyTest = true;
}
} }
try{ try{
@ -7107,11 +7000,6 @@ public class ManageExcelUploadProc03Controller {
int idx = _holeAdminDistrict.indexOf("시"); int idx = _holeAdminDistrict.indexOf("시");
String _district[] = _holeAdminDistrict.split(" "); String _district[] = _holeAdminDistrict.split(" ");
if( _district.length < 2 ) {
params.put("resultMsg", "시추위치는 필수 입니다. 예) 인천 서구 가정동 산 118");
return params;
}
List<EgovMap> dis = infoService.getDisList(params); List<EgovMap> dis = infoService.getDisList(params);
String _holeAdminDistrictSd = ""; //시추위치 String _holeAdminDistrictSd = ""; //시추위치
@ -7147,15 +7035,6 @@ public class ManageExcelUploadProc03Controller {
String _holeEl = excel1Wp.get("col2",11).trim(); //표고 String _holeEl = excel1Wp.get("col2",11).trim(); //표고
String _holeWl = excel1Wp.get("col3",12).trim(); //지하수위 String _holeWl = excel1Wp.get("col3",12).trim(); //지하수위
String _holeWlUnit = excel1Wp.get("col2",12).trim(); //지하수위단위 String _holeWlUnit = excel1Wp.get("col2",12).trim(); //지하수위단위
String _holeWlExcept = excel1Wp.get("col12",12).trim(); //지하수위가 심도 이하이다 체크여부
boolean isHoleWlExcept = false;
if( _holeWlExcept != null && _holeWlExcept.equalsIgnoreCase("true") ) {
isHoleWlExcept = true;
_holeWl = "0";
_holeWlExcept = "Y";
}
String _holeTotalDepth = excel1Wp.get("col3",13).trim(); //굴진심도 String _holeTotalDepth = excel1Wp.get("col3",13).trim(); //굴진심도
String _holeCasingDepth = excel1Wp.get("col3",14).trim(); //케이싱심도 String _holeCasingDepth = excel1Wp.get("col3",14).trim(); //케이싱심도
if( _holeCasingDepth == null ) { if( _holeCasingDepth == null ) {
@ -7430,7 +7309,6 @@ public class ManageExcelUploadProc03Controller {
params.put("HOLE_DATE_TO",_holeDateTo ); params.put("HOLE_DATE_TO",_holeDateTo );
params.put("HOLE_EL",_holeEl ); params.put("HOLE_EL",_holeEl );
params.put("HOLE_WL",_holeWlVal ); params.put("HOLE_WL",_holeWlVal );
params.put("HOLE_WL_EXCEPT",_holeWlExcept ); //지하수위가 심도 이하이다 체크여부
params.put("HOLE_TOTAL_DEPTH",_holeTotalDepth ); params.put("HOLE_TOTAL_DEPTH",_holeTotalDepth );
params.put("HOLE_CASING_DEPTH",_holeCasingDepth ); params.put("HOLE_CASING_DEPTH",_holeCasingDepth );
params.put("HOLE_DIA",_holeDia ); params.put("HOLE_DIA",_holeDia );

View File

@ -545,15 +545,15 @@ function fn_grid_refresh(){
var kendoJQuery = jQuery.noConflict(); // web/js/tree/lib/jquery.js 와 kendoUI jquery.js의 충돌방지 변수 var kendoJQuery = jQuery.noConflict(); // web/js/tree/lib/jquery.js 와 kendoUI jquery.js의 충돌방지 변수
kendoJQuery(document).ready(function () { kendoJQuery(document).ready(function () {
fn_onLoad(); fn_onLoad();
fn_kendoGrid(); fn_kendoGrid();
fn_kendoGridStyle(); fn_kendoGridStyle();
fn_setGridCombo(); fn_setGridCombo();
var grid = kendoJQuery("#kictGrid").data("kendoGrid"); fn_setHeaderText(); //기준계 조회 해서 SetHeaderText
var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource; var dataSource = grid.dataSource;
// 콤보박스 데이터 추출을 위한 refresh // 콤보박스 데이터 추출을 위한 refresh
@ -635,7 +635,7 @@ function fn_grid_refresh(){
{ field: "fieldpresInspectedBy", title: "조사자", attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldpresInspectedBy == null) ? '' : fieldpresInspectedBy #</div>" }, { field: "fieldpresInspectedBy", title: "조사자", attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldpresInspectedBy == null) ? '' : fieldpresInspectedBy #</div>" },
{ field: "fieldpresCheckedBy", title: "검수자", attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldpresCheckedBy == null) ? '' : fieldpresCheckedBy #</div>" }, { field: "fieldpresCheckedBy", title: "검수자", attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldpresCheckedBy == null) ? '' : fieldpresCheckedBy #</div>" },
{ field: "fieldpresDepth", title: "심도(m)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresDepth == null) ? '0' : fieldpresDepth #</div>" }, { field: "fieldpresDepth", title: "심도(m)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresDepth == null) ? '0' : fieldpresDepth #</div>" },
{ field: "fieldpresKp", title: "변형계수(${fieldpresKp})", format: "{0:G}", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresKp == null) ? '0' : fieldpresKp #</div>" }, { field: "fieldpresKp", title: "변형계수(${fieldpresKp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresKp == null) ? '0' : fieldpresKp #</div>" },
{ field: "fieldpresEp", title: "탄성계수(${fieldpresEp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresEp == null) ? '0' : fieldpresEp #</div>" }, { field: "fieldpresEp", title: "탄성계수(${fieldpresEp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresEp == null) ? '0' : fieldpresEp #</div>" },
], ],
scrollable: true, scrollable: true,

View File

@ -1024,7 +1024,7 @@
culture: "ko-KR", culture: "ko-KR",
format : "yyyyMMdd" format : "yyyyMMdd"
}); });
$("#PROJECT_START_DATE").attr("readonly",false); $("#PROJECT_START_DATE").attr("readonly",true);
</script> </script>
</td> </td>
<th class="td-head">공사종료일</th> <th class="td-head">공사종료일</th>
@ -1036,7 +1036,7 @@
culture: "ko-KR", culture: "ko-KR",
format : "yyyyMMdd" format : "yyyyMMdd"
}); });
$("#PROJECT_END_DATE").attr("readonly",false); $("#PROJECT_END_DATE").attr("readonly",true);
</script> </script>
</td> </td>
</tr> </tr>

View File

@ -12,6 +12,7 @@ var extFile = "<%=fileCmmn.getFileList("IMG")%>";
var extFileList = extFile.split(","); var extFileList = extFile.split(",");
</script> </script>
<!-- 기준계정보 가져오기 위한 Param -->
<jsp:include page="/web/common/referenceCodeCsDb.do?TEST_INFO_CODE=ROCK_TRIAXIAL&TYPEOFTEST="> <jsp:include page="/web/common/referenceCodeCsDb.do?TEST_INFO_CODE=ROCK_TRIAXIAL&TYPEOFTEST=">
<jsp:param name="PROJECT_CODE" value="${params.PROJECT_CODE}" /> <jsp:param name="PROJECT_CODE" value="${params.PROJECT_CODE}" />
<jsp:param name="HOLE_CODE" value="${params.HOLE_CODE}" /> <jsp:param name="HOLE_CODE" value="${params.HOLE_CODE}" />
@ -19,6 +20,7 @@ var extFileList = extFile.split(",");
<jsp:param name="TYPEOFTEST" value="" /> <jsp:param name="TYPEOFTEST" value="" />
</jsp:include> </jsp:include>
<!-- 사용자 정의 설정 시작 -->
<script type="text/javascript"> <script type="text/javascript">
var gridData = new Array(); //데이터 배열객체 var gridData = new Array(); //데이터 배열객체
@ -28,7 +30,7 @@ function fn_MakeData(){
title = [ title = [
{"TITLE1" : "시험횟수" , "TITLE2" : "" }, {"TITLE1" : "시험횟수" , "TITLE2" : "" },
{"TITLE1" : "심도" , "TITLE2" : "From(m)" }, {"TITLE1" : "심도" , "TITLE2" : "From(m)" },
{"TITLE1" : "심도" , "TITLE2" : "To(m)" }, {"TITLE1" : "심도" , "TITLE2" : "To(m)" },
{"TITLE1" : "내부마찰각(Φ, °)" , "TITLE2" : "" }, {"TITLE1" : "내부마찰각(Φ, °)" , "TITLE2" : "" },
{"TITLE1" : "점착력(c,MPa)" , "TITLE2" : "" }, {"TITLE1" : "점착력(c,MPa)" , "TITLE2" : "" },
@ -46,6 +48,7 @@ function fn_MakeData(){
{"TITLE1" : "150" , "TITLE2" : "구속압(σ3,MPa)" }, {"TITLE1" : "150" , "TITLE2" : "구속압(σ3,MPa)" },
{"TITLE1" : "150" , "TITLE2" : "최대압축강도(σ1,MPa)"}, {"TITLE1" : "150" , "TITLE2" : "최대압축강도(σ1,MPa)"},
{"TITLE1" : "비고" , "TITLE2" : "" } {"TITLE1" : "비고" , "TITLE2" : "" }
]; ];
//title //title
@ -77,8 +80,10 @@ function fn_MakeData(){
//----------------------- 기타 ----------------------- //----------------------- 기타 -----------------------
//저장 //저장
function fn_save(rUrl){ function fn_save(rUrl){
// ----------------------- kendoGrid XML 구조저장 시작 ----------------------- // ----------------------- kendoGrid XML 구조저장 시작 -----------------------
var grid = kendoJQuery("#kictGrid").data("kendoGrid"); var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource; var dataSource = grid.dataSource;
@ -87,7 +92,18 @@ function fn_save(rUrl){
var kendoRowCount = dataSource.view().length; // 가로(행) 갯수 var kendoRowCount = dataSource.view().length; // 가로(행) 갯수
var kendoColCount = grid.columns.length; // 세로(열) 갯수 var kendoColCount = grid.columns.length; // 세로(열) 갯수
var kendoStartIndex = 3; var kendoStartIndex = 3;
var dynamicColCount = kendoColCount - kendoStartIndex; // 실제 데이터 열 수
//변경여부 확인
/* if(rUrl == ""){
var dirty = $.grep(data, function(item) {
return item.dirty;
});
if (dirty.length === 0) {
alert("변경된 자료가 없습니다");
fn_progressbarHideKendo();
return false;
}
} */
//숫자체크 //숫자체크
var colInfo = { var colInfo = {
@ -116,10 +132,9 @@ function fn_save(rUrl){
} }
//비고 입력체크 //비고 입력체크
for(var i=1; i <= dynamicColCount; i++){ for(var i=1; i <= Math.floor(kendoColCount/2); i++){
var remarkVal = data[18]["VALUE" + i]; if(gridData['18']['VALUE'+i] == " " || dataSource._data[18]["VALUE"+i] == " "){
if(remarkVal === undefined || remarkVal === null || String(remarkVal).trim() === ""){ alert("비고를 입력해주세요");
alert(i + "번째 시험의 비고를 입력해주세요.");
return false; return false;
} }
} }
@ -129,41 +144,47 @@ function fn_save(rUrl){
for(var i=0; i<kendoRowCount; i++){ for(var i=0; i<kendoRowCount; i++){
var row = data[i]; var row = data[i];
m = m + "<data>"; m = m + "<data>";
for(var j=kendoStartIndex; j<kendoColCount; j++){ for(var j=kendoStartIndex; j<kendoColCount; j++){
var column = grid.columns[j]; var column = grid.columns[j];
var dataField = column.field; var dataField = column.field;
//var data = grid.dataSource._data;
//var data = grid.dataSource.options.data[j];
m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">"; m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">";
} }
m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>"; m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>";
m = m + "</data>"; m = m + "</data>";
} }
var e = "</changedData>"; var e = "</changedData>";
var strData = s+m+e; var strData = s+m+e;
// ----------------------- kendoGrid XML 구조저장 끝 ----------------------- // ----------------------- kendoGrid XML 구조저장 끝 -----------------------
var tri_code = prevRtriCode; var tri_code = prevRtriCode;
var re_tri_code = prevRtriCode;
// [수정] 삼축압축은 그래프 1개만 업로드하므로 1번만 체크 // 2019.10.10 이미지 업로드 필수 수정
if (dynamicColCount > 0) { var fileImgID = "GRAPH_IMAGE_"+prevRtriCode;
var fileImgID = "GRAPH_IMAGE_" + tri_code; var fileImg = $("#GRAPH_IMAGE_"+prevRtriCode).val();
var fileImg = $("#" + fileImgID).val(); var fileImg_bk = $("#OLD_GRAPH_IMAGE_"+prevRtriCode).val();
var fileImg_bk = $("#OLD_GRAPH_IMAGE_" + tri_code).val(); const fileImgCheck = fileImg === "" || fileImg === "null" || fileImg == null;
const fileImg_bkCheck = fileImg_bk === "" || fileImg_bk === "null" || fileImg_bk == null;
const fileImgCheck = fileImg === "" || fileImg === "null" || fileImg == null; if(fileImg_bkCheck === false){
const fileImg_bkCheck = fileImg_bk === "" || fileImg_bk === "null" || fileImg_bk == null; if(fileImgCheck === false){
//첨부파일이 있을경우 확장자 체크
if(fileImg_bkCheck === false){ fn_fileTotalCheck(fileImgID);
if(fileImgCheck === false){
fn_fileTotalCheck(fileImgID);
}
} }
}
if(fileImg_bkCheck === true){ if(fileImg_bkCheck === true){
if(fileImgCheck === true){ if(fileImgCheck === true){
alert("삼축압축시험결과 그래프 (1회) 업로드는 필수입니다."); alert("그래프 업로드는 필수입니다.");
return false; return false;
}
} }
} }
@ -173,12 +194,11 @@ function fn_save(rUrl){
var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode; var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode;
var dbUrl = "/web/input/rockTriaxialDb.do"+param_code+"&srhRTRI_CODE="+$("#RTRICODE").val(); var dbUrl = "/web/input/rockTriaxialDb.do"+param_code+"&srhRTRI_CODE="+$("#RTRICODE").val();
document.getElementById("PROJECT_CODE").value = projectCode; $("#PROJECT_CODE").val('<c:out value='${params.PROJECT_CODE}'/>');
document.getElementById("HOLE_CODE").value = holeCode; $("#HOLE_CODE").val('<c:out value='${params.HOLE_CODE}'/>');
document.getElementById("RTRI_CODE").value = tri_code; $("#RTRI_CODE").val(tri_code);
document.getElementById("SAMPLE_CNT").value = document.getElementById("SAMPLECNT").value; $("#SAMPLE_CNT").val($("#SAMPLECNT").val());
document.getElementById("TOTALCNT").value = kendoColCount - 1; // 서버 호환성 유지 $("#TOTALCNT").val(kendoColCount - 1);
document.getElementById("rowDelFileArr").value = rowDelFileArr;
fn_submitAll(dbUrl, rUrl, strData, document.frmTri); fn_submitAll(dbUrl, rUrl, strData, document.frmTri);
} }
@ -186,6 +206,7 @@ function fn_save(rUrl){
//kendoGrid submitAll //kendoGrid submitAll
function fn_submitAll(strUrl, rUrl, strData, frm) { function fn_submitAll(strUrl, rUrl, strData, frm) {
document.getElementById("dataAll").value = "<changedData>"+strData+"</changedData>"; document.getElementById("dataAll").value = "<changedData>"+strData+"</changedData>";
var $form = $(frm); var $form = $(frm);
$form.append("<input type=\"hidden\" name=\"rUrl\" id=\"rUrl\" value=\""+rUrl+"\"/>"); $form.append("<input type=\"hidden\" name=\"rUrl\" id=\"rUrl\" value=\""+rUrl+"\"/>");
frm.action = strUrl; frm.action = strUrl;
@ -195,10 +216,23 @@ function fn_submitAll(strUrl, rUrl, strData, frm) {
//시료번호 change //시료번호 change
function fn_Reload(value){ function fn_Reload(value){
/* if(Is_GridUpdate(gridRoot) || Is_FileUpdateOne("GRAPH_IMAGE_",prevRtriCode,"FILE_DEL_")){
if(confirm("변경내용이 있습니다. 저장하시겠습니까? ")){
fn_save_loading('');
return false;
}else{
fn_select(value);
}
}else{
fn_select(value);
} */
fn_select(value); fn_select(value);
} }
function fn_select(value){ function fn_select(value){
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: "/rockTriaxialSelect.do", url: "/rockTriaxialSelect.do",
@ -213,21 +247,28 @@ function fn_select(value){
console.log(e); console.log(e);
}, },
complete:function(e){ complete:function(e){
//file
//fn_setFile();
kendoJQuery("#kictGrid").kendoGrid('destroy').empty(); kendoJQuery("#kictGrid").kendoGrid('destroy').empty();
fn_kendoGrid(); fn_kendoGrid();
fn_kendoGridStyle(); fn_kendoGridStyle();
//전역변수 변경
prevRuniCode = $("#RUNICODE").val(); prevRuniCode = $("#RUNICODE").val();
} }
}); });
} }
//ajax 리턴 //ajax 리턴
function fn_SelectPointLoad(data){ function fn_SelectPointLoad(data){
$("head").append(data); $("head").append(data);
// [중요] 기존 구형 서버 HTML이 덮어쓰여도 피할 수 있도록 독립적인 렌더링 함수 사용 //file
renderDynamicFileUI(); fn_setFile();
//전역변수 변경
prevRtriCode = $("#RTRICODE").val(); prevRtriCode = $("#RTRICODE").val();
} }
@ -235,19 +276,25 @@ function fn_SelectPointLoad(data){
function fn_addCode(){ function fn_addCode(){
var samplecnt = $("#SAMPLECNT").val(); var samplecnt = $("#SAMPLECNT").val();
var cnt = 0; var cnt = 0;
if(samplecnt == "" || samplecnt == "0"){ if(samplecnt == "" || samplecnt == "0"){
$("#SAMPLECNT").val(1); $("#SAMPLECNT").val(1);
cnt = 1; cnt = 1;
}else{ }else{
cnt = Number(samplecnt); cnt = Number(samplecnt);
} }
//add option
$("#RTRICODE").html(""); $("#RTRICODE").html("");
var projectCode = '<c:out value='${params.PROJECT_CODE}'/>'; var projectCode = '<c:out value='${params.PROJECT_CODE}'/>';
var holeCode = '<c:out value='${params.HOLE_CODE}'/>'; var holeCode = '<c:out value='${params.HOLE_CODE}'/>';
for(var i=0; i<cnt; i++){ for(var i=0; i<cnt; i++){
$("#RTRICODE").append("<option value = \"" + holeCode+"T"+fn_setZero(i+1)+"\">"+holeCode.substr(5,5)+"T"+fn_setZero(i+1)+"</option>"); $("#RTRICODE").append("<option value = \"" + holeCode+"T"+fn_setZero(i+1)+"\">"+holeCode.substr(5,5)+"T"+fn_setZero(i+1)+"</option>");
} }
$("#RTRICODE option:eq(0)").attr("selected", "selected"); $("#RTRICODE option:eq(0)").attr("selected", "selected");
//data init
fn_Reload($("#RTRICODE").val()); fn_Reload($("#RTRICODE").val());
} }
@ -260,59 +307,19 @@ function fn_onLoad(){
//selectbox 전역변수 //selectbox 전역변수
var prevRtriCode = '<c:out value='${params.RTRI_CODE}'/>'; var prevRtriCode = '<c:out value='${params.RTRI_CODE}'/>';
// [신규] 삼축압축은 그래프 1개만! (1회)가 고정으로 적힌 완벽한 HTML 생성기 //열 추가
function buildFileHtml(img1, loc1) {
var rtriCode = $("#RTRICODE").val();
var html = '';
html += '<div id="TR_GRAPH_IMAGE_' + rtriCode + '" class="table-file-wrapper">';
html += ' <div class="contents-title-1depth marT20"><span>삼축압축시험결과 그래프 (1회)를(을) 입력하세요. (최대크기: 500KB) 파일은 <span class="textR">JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>';
html += ' <table class="table table-file marT0" data-target="form-file"><colgroup><col width="160px" /><col width="auto" /></colgroup>';
html += ' <tbody>';
html += ' <input type="hidden" id="OLD_GRAPH_IMAGE_' + rtriCode + '" name="OLD_GRAPH_IMAGE_' + rtriCode + '" value="' + img1 + '" />';
html += ' <input type="hidden" id="OLD_GRAPH_LOCAL_' + rtriCode + '" name="OLD_GRAPH_LOCAL_' + rtriCode + '" value="' + loc1 + '" />';
html += ' <tr><td class="td-head">삼축압축시험결과<br>그래프 입력</td>';
html += ' <td class="plus_file"><input type="file" id="GRAPH_IMAGE_' + rtriCode + '" name="GRAPH_IMAGE_' + rtriCode + '" class="gg-input file-input" />';
html += ' <ul class="content-ul-list marT5"><li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li><li>파일크기는 "최대 500KB" 입니다.</li></ul></td></tr>';
if(img1 && img1 !== '' && img1 !== 'null'){
html += ' <tr><td class="td-head">첨부된 파일정보</td><td class="plus_img">';
html += ' <div class="marB10"><b>첨부파일</b> : <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_TRIAXIAL/' + img1 + '", event.x,event.y); return false;\'>' + loc1 + '</a>';
html += ' <label class="gg-checkbox gg-checkbox-outline marL20"><input type="checkbox" id="FILE_DEL_' + rtriCode + '" name="FILE_DEL_' + rtriCode + '" value="Y" class="checkbox_T" /> 파일삭제<span></span></label></div>';
html += ' <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_TRIAXIAL/' + img1 + '", event.x,event.y); return false;\'><img src="/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_TRIAXIAL/' + img1 + '" class="file-preview-img" /></a>';
html += ' </td></tr>';
}
html += ' </tbody></table></div>';
return html;
}
// 구형 서버 통신 찌꺼기를 날리고 새로 그리는 무적 렌더링 함수
function renderDynamicFileUI(){
var rtriCode = $("#RTRICODE").val();
// 서버가 방금 그린 DOM에서 기존 파일 정보 픽업 (AJAX에서 넘어온 데이터 살리기)
var img1 = $("#OLD_GRAPH_IMAGE_" + rtriCode).val() || '';
var loc1 = $("#OLD_GRAPH_LOCAL_" + rtriCode).val() || '';
$("#table_file").empty(); // 기존 껍데기 폼 완벽 초기화
var cnt = Number($("#GridRowCnt").val());
if (isNaN(cnt) || cnt <= 0) {
$("#GridRowCnt").val(0);
return; // 0일 경우 화면에 아무것도 그리지 않고 종료
}
// 1 이상이면 무조건 1개의 폼만 렌더링
$("#table_file").html(buildFileHtml(img1, loc1));
}
//열 추가 (+ 버튼)
function fn_add(){ function fn_add(){
// kendo 열 추가
var grid = kendoJQuery("#kictGrid").data("kendoGrid"); var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource; var dataSource = grid.dataSource;
var data = dataSource.data(); var data = dataSource.data();
var nowColLength = grid.columns.length - 3; // 타이틀 수 제외 var nowColLength = grid.columns.length - 3; // 타이틀 수 제외
var nowRowLength = grid.dataSource.options.data.length var nowRowLength = grid.dataSource.options.data.length
var nowColCount = nowColLength + 1; var nowColCount = nowColLength + 1;
var nowRowCount = nowRowLength;
var nowColCountVALUE = 'VALUE' + nowColCount; var nowColCountVALUE = 'VALUE' + nowColCount;
if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){ if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){
@ -322,34 +329,34 @@ function fn_add(){
$("#GridRowCnt").val(nowColCount); $("#GridRowCnt").val(nowColCount);
var data = dataSource.data();
var maxRcSeq = 0;
for(var i=0; i<data.length; i++){
if (data[i].RT_SEQ > maxRcSeq){
maxRcSeq = data[i].RT_SEQ;
}
}
var RT_SEQ = nowColLength + 1; var RT_SEQ = nowColLength + 1;
// [수정] DOM 폼 동기화 제어 //첨부추가
fn_ColAddInput(nowColCount); //fn_gridAddRow("TR_GRAPH_IMAGE_","GRAPH_IMAGE_", RT_SEQ, "삼축시험결과 그래프를 입력하세요. (최대크기: 500KB)");
myFields = grid.dataSource.options.schema.model.fields; myFields = grid.dataSource.options.schema.model.fields;
for (var i = 0; i < 1; i++) { for (var i = 0; i < 1; i++) {
var row = data[i]; var row = data[i];
var optionAdd = {"editable": true, "defaultValue": 0, nullable: true}; var fieldsAdd = new Object();
var optionAdd = new Object();
// 중복 컬럼 추가 방지 grid.setOptions({
var isExist = false; columns: grid.columns.concat([
for(var c=0; c<grid.columns.length; c++) { { field: nowColCountVALUE, editor: chooseEditor }
if (grid.columns[c].field === nowColCountVALUE) { ]),
isExist = true; break; });
}
}
if(!isExist) { for (var j = 0; j < nowRowCount; j++) {
grid.setOptions({
columns: grid.columns.concat([
{ field: nowColCountVALUE, editor: chooseEditor }
]),
});
}
for (var j = 0; j < nowRowLength; j++) {
dataSource.data()[j].set(nowColCountVALUE, 0); dataSource.data()[j].set(nowColCountVALUE, 0);
if (grid.dataSource.options.data[j].COLUMN === "TEST_ORDER") { if (grid.dataSource.options.data[j].COLUMN === "TEST_ORDER") {
dataSource.data()[j].set(nowColCountVALUE, RT_SEQ) dataSource.data()[j].set(nowColCountVALUE, RT_SEQ)
@ -357,85 +364,94 @@ function fn_add(){
dataSource.data()[j].set(nowColCountVALUE, " ") dataSource.data()[j].set(nowColCountVALUE, " ")
} }
} }
optionAdd = {"editable": true, "defaultValue": 0, nullable: true};
fieldsAdd[nowColCountVALUE] = optionAdd;
myFields[nowColCountVALUE] = optionAdd; myFields[nowColCountVALUE] = optionAdd;
} }
} }
// 열 삭제 (- 버튼) //열 삭제
function removeItemAt() { function removeItemAt() {
var grid = kendoJQuery("#kictGrid").data("kendoGrid"); var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var data = dataSource.data();
var nowColLength = grid.columns.length - 3; // 타이틀 수 제외 var nowColLength = grid.columns.length - 3; // 타이틀 수 제외
var nowRowLength = grid.dataSource.options.data.length
var nowColCount = nowColLength + 1;
var nowRowCount = nowRowLength;
if(nowColLength == 0){return false;} // 20211219 ssheo 행 (-) 차단
if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){ if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){
alert("시료번호를 선택하세요."); alert("시료번호를 선택하세요.");
return false; return false;
} }
// 0개까지 지울 수 있도록 허용 (최소 0개 유지) if( nowColCount == 2 ) {
if( nowColLength <= 0 ) {
return false; return false;
} else { } else {
nowColCount = nowColLength - 1
grid.columns.pop(); grid.columns.pop();
kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){ kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){
kendoJQuery(this).remove(); kendoJQuery(this).remove();
}); });
} }
var nowColCount = nowColLength - 1;
$("#GridRowCnt").val(nowColCount); $("#GridRowCnt").val(nowColCount);
// [수정] DOM 폼 동기화 제어
fn_ColAddInput(nowColCount);
var dataItem = grid._data[nowColCount-1]; var dataItem = grid._data[nowColCount-1];
if(dataItem) { return dataItem.dirty = true;
return dataItem.dirty = true;
}
} }
//그리드 col수 이벤트 (텍스트박스 숫자 입력 시) //그리드 col수 이벤트
function fn_rowChange(){ function fn_rowChange(){
var grid = kendoJQuery("#kictGrid").data("kendoGrid"); var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource; var dataSource = grid.dataSource;
// 1. 현재 정보 파악
var currentColumns = grid.columns.slice(); // 기존 컬럼 배열 복사 var currentColumns = grid.columns.slice(); // 기존 컬럼 배열 복사
var baseColCount = 3; // TITLE1, TITLE2, COLUMN (고정 컬럼 수) var baseColCount = 3; // TITLE1, TITLE2, COLUMN (고정 컬럼 수)
var nowColLength = currentColumns.length - baseColCount; var nowColLength = currentColumns.length - baseColCount;
var cnt = Number($("#GridRowCnt").val()); var cnt = Number($("#GridRowCnt").val()) || 0;
if(isNaN(cnt) || cnt < 0){ cnt = Number(cnt); // number로 형변환
if(cnt == null || cnt == ""){
cnt = 0; cnt = 0;
} }
if(cnt >= 0){ if(cnt>=0){
if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){ if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){
alert("시료번호를 선택하세요."); alert("시료번호를 선택하세요.");
$("#GridRowCnt").val("0"); $("#GridRowCnt").val("0");
return false; return false;
} }
// 폼 추가삭제 로직 (0이더라도 깨끗하게 지우기 위해 호출) if(cnt == 0){
fn_ColAddInput(cnt); alert("1건 이상 입력하세요.");
$("#GridRowCnt").val(1);
$("#GridRowCnt").focus();
return false;
}
} }
myFields = grid.dataSource.options.schema.model.fields;
// 2. 컬럼 배열 재구성
if (cnt > nowColLength) { if (cnt > nowColLength) {
// 추가가 필요한 만큼 루프
var addCount = cnt - nowColLength; var addCount = cnt - nowColLength;
for (var i = 1; i <= addCount; i++) { for (var i = 1; i <= addCount; i++) {
var newIdx = nowColLength + i; var newIdx = nowColLength + i;
var colExists = false; currentColumns.push({
for(var c=0; c<currentColumns.length; c++) { field: "VALUE" + newIdx,
if(currentColumns[c].field === "VALUE" + newIdx) { editor: chooseEditor
colExists = true; break; });
}
}
if(!colExists) {
currentColumns.push({
field: "VALUE" + newIdx,
editor: chooseEditor
});
}
} }
} else if (cnt < nowColLength) { } else if (cnt < nowColLength) {
// 삭제가 필요한 만큼 제거 (최소 1개 유지 조건 등 추가 가능)
var removeCount = nowColLength - cnt; var removeCount = nowColLength - cnt;
for (var i = 0; i < removeCount; i++) { for (var i = 0; i < removeCount; i++) {
currentColumns.pop(); currentColumns.pop();
@ -444,16 +460,20 @@ function fn_rowChange(){
return; // 변경 사항 없음 return; // 변경 사항 없음
} }
// 3. setOptions를 단 한 번 호출하여 그리드 전체 갱신
// 이 과정에서 Kendo가 HTML과 내부 객체를 모두 동기화합니다.
grid.setOptions({ grid.setOptions({
columns: currentColumns columns: currentColumns
}); });
// 4. 데이터 세팅 (필요시)
// setOptions 후에는 데이터 소스를 다시 체크하여 신규 컬럼에 기본값 할당
var newData = dataSource.data(); var newData = dataSource.data();
for (var j = 0; j < newData.length; j++) { for (var j = 0; j < newData.length; j++) {
for (var k = 1; k <= cnt; k++) { for (var k = 1; k <= cnt; k++) {
var colName = "VALUE" + k; var colName = "VALUE" + k;
if (newData[j][colName] === undefined) { if (newData[j][colName] === undefined) {
newData[j].set(colName, 0); newData[j].set(colName, 0); // 기본값 0 세팅
if (newData[j].COLUMN === "TEST_ORDER") newData[j].set(colName, k); if (newData[j].COLUMN === "TEST_ORDER") newData[j].set(colName, k);
if (newData[j].COLUMN === "RTRI_REMARK") newData[j].set(colName, " "); if (newData[j].COLUMN === "RTRI_REMARK") newData[j].set(colName, " ");
} }
@ -461,26 +481,6 @@ function fn_rowChange(){
} }
} }
// [수정] 폼 추가/삭제 제어 (0이면 삭제, 1이상이면 무조건 1개만 렌더링 유지)
function fn_ColAddInput(cnt){
var rtriCode = $("#RTRICODE").val();
// 이중 생성 막기 위해 구형 찌꺼기 완벽 제거
$("#table_file").children().not(".table-file-wrapper").remove();
if (cnt <= 0) {
// 0이면 무조건 삭제 (기존 파일 정보 지우기 배열에 저장)
var oldImg = $("#OLD_GRAPH_IMAGE_" + rtriCode).val();
if(oldImg) rowDelFileArr += oldImg + ",";
$("#table_file").empty();
} else {
// 1이상이면 무조건 폼은 딱 1개만 존재해야 함!
if ($("#TR_GRAPH_IMAGE_" + rtriCode).length === 0) {
$("#table_file").append(buildFileHtml('', ''));
}
}
}
/* 도움말 시작 */ /* 도움말 시작 */
function fn_help_tour_confirm(){ function fn_help_tour_confirm(){
var answer; var answer;
@ -555,16 +555,25 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</script> </script>
<!-- header start-->
<c:import url="/manage/includeTopInput.do" /> <c:import url="/manage/includeTopInput.do" />
<!-- header end-->
<!-- 페이지 컨테이너 시작 -->
<section class="page-container"> <section class="page-container">
<div class="page-content-wrapper"> <div class="page-content-wrapper">
<!-- 서브메뉴 시작 -->
<c:import url="/include_left_tree_input.do" /> <c:import url="/include_left_tree_input.do" />
<!-- 서브메뉴 끝 -->
<!-- 컨텐츠 시작 -->
<div class="page-content"> <div class="page-content">
<div class="page-content-inner"> <div class="page-content-inner">
<!-- 카테고리 시작 -->
<div class="category-wrapper"> <div class="category-wrapper">
<ul class="page-category"> <ul class="page-category">
<li class="category-item" id="category_1dep"></li> <li class="category-item" id="category_1dep"></li>
@ -574,17 +583,23 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
<a href="javascript:;" class="btn btn-help start-tour" onClick="fn_help_tour_confirm();">도움말</a> <a href="javascript:;" class="btn btn-help start-tour" onClick="fn_help_tour_confirm();">도움말</a>
</div> </div>
<!-- 카테고리 끝 -->
<h1 class="page-title-1depth"><span>삼축압축</span></h1> <h1 class="page-title-1depth"><span>삼축압축</span></h1>
<!-- 내용 시작 -->
<div class="content-wrapper"> <div class="content-wrapper">
<!-- contents start-->
<div class="contents"> <div class="contents">
<!-- 기본정보 출력 -->
<c:import url="/web/include/includeProjectRockInfo.do" /> <c:import url="/web/include/includeProjectRockInfo.do" />
<div class="table-top-control"> <div class="table-top-control">
<div class="table-info-group form-inline" data-target="grid-row-cnt"> <div class="table-info-group form-inline" data-target="grid-row-cnt">
<input type="text" name="GridRowCnt" id="GridRowCnt" value="${fn:length(items)}" maxlength="2" onkeypress="fn_gridAddEnterKey(event);return isNumberKey(event);" onChange="fn_rowChange()" <input type="text" name="GridRowCnt" id="GridRowCnt" value="${fn:length(items)}" maxlength="2" onkeypress="fn_gridAddEnterKey(event);return isNumberKey(event);" onChange="fn_rowChange()"
onkeyup="fn_rowChange()"
onclick="this.select()" onclick="this.select()"
onfocus="this.select()" onfocus="this.select()"
class="gg-input row-control-input" /> class="gg-input row-control-input" />
@ -622,6 +637,7 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
var nowColumnIndex = colIdx - 2; var nowColumnIndex = colIdx - 2;
var nowColLength = grid.columns.length - 2; // 타이틀 수 제외 var nowColLength = grid.columns.length - 2; // 타이틀 수 제외
fn_kendoFileDisplayCol(nowColumnIndex, nowColLength, "TR_GRAPH_IMAGE_", 0);
}); });
fn_kendoGridStyle(); fn_kendoGridStyle();
@ -821,32 +837,42 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</div> </div>
</div> </div>
<!-- 첨부파일 -->
<form id="frmTri" name="frmTri" enctype="multipart/form-data"> <form id="frmTri" name="frmTri" enctype="multipart/form-data">
<div id="table_file" class="table-file"> <div id="table_file">
<c:if test="${fn:length(items) > 0 and params.RTRI_CODE != null and params.RTRI_CODE != ''}">
<div id="TR_GRAPH_IMAGE_${params.RTRI_CODE}" class="table-file-wrapper">
<div class="contents-title-1depth marT20"><span>삼축압축시험결과 그래프 (1회)를(을) 입력하세요. (최대크기: 500KB) 파일은 <span class='textR'>JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody>
<input type="hidden" id="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" name="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" value="${items[0].GRAPH_IMAGE}" />
<input type="hidden" id="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" name="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" value="${items[0].GRAPH_LOCAL}" />
<c:if test="${params.RTRI_CODE != null and params.RTRI_CODE != '' and params.RTRI_CODE != 'null'}">
<div class="contents-title-1depth marT20"><span>삼축압축시험결과 그래프를 입력하세요. (최대크기: 500KB)</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody id="TR_GRAPH_IMAGE_${params.RTRI_CODE}">
<input type="hidden" id="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" name="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" value="${items[0].GRAPH_IMAGE}" />
<input type="hidden" id="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" name="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" value="${items[0].GRAPH_LOCAL}" />
<c:if test="${items[0].GRAPH_LOCAL != null and items[0].GRAPH_LOCAL != '' and items[0].GRAPH_LOCAL != 'null'}">
<tr> <tr>
<td class="td-head">삼축압축시험결과<br>그래프 입력</td> <td class="td-head">
첨부파일입력
</td>
<td class="plus_file"> <td class="plus_file">
<input type="file" id="GRAPH_IMAGE_${params.RTRI_CODE}" name="GRAPH_IMAGE_${params.RTRI_CODE}" class="gg-input file-input" /> <input type="file" id="GRAPH_IMAGE_${params.RTRI_CODE}" name="GRAPH_IMAGE_${params.RTRI_CODE}" class="gg-input file-input" />
<ul class="content-ul-list marT5"> <ul class="content-ul-list marT5">
<li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li> <li>
<li>파일크기는 "최대 500KB" 입니다.</li> 시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul> </ul>
</td> </td>
</tr> </tr>
<c:if test="${items[0].GRAPH_IMAGE != '' and items[0].GRAPH_IMAGE != null and items[0].GRAPH_IMAGE != 'null'}">
<tr> <tr>
<td class="td-head">첨부된 파일정보</td> <td class="td-head">첨부된 파일정보</td>
<td class="plus_img"> <td class="plus_img">
@ -863,30 +889,56 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</a> </a>
</td> </td>
</tr> </tr>
</c:if> </c:if>
</tbody>
</table> <c:if test="${items[0].GRAPH_LOCAL == null or items[0].GRAPH_LOCAL == '' or items[0].GRAPH_LOCAL == 'null'}">
</div> <tr>
<td class="td-head">
첨부파일입력
</td>
<td class="plus_file" colspan="3">
<input type="file" id="GRAPH_IMAGE_${params.RTRI_CODE}" name="GRAPH_IMAGE_${params.RTRI_CODE}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
</c:if> </c:if>
</div> </div>
<div id="hidden_params"> <input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value='<c:out value='${params.PROJECT_CODE}'/>' />
<input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value='<c:out value="${params.PROJECT_CODE}"/>' /> <input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value='<c:out value='${params.HOLE_CODE}'/>' />
<input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value='<c:out value="${params.HOLE_CODE}"/>' /> <input type="hidden" id="RTRI_CODE" name="RTRI_CODE" />
<input type="hidden" id="RTRI_CODE" name="RTRI_CODE" /> <input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT" />
<input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT" /> <input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />
<input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" /> <input type="hidden" id="dataAll" name="dataAll" />
<input type="hidden" id="dataAll" name="dataAll" />
<input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />
</div>
</form> </form>
</div> </div>
</div> <!-- contents end-->
</div> </div>
<!-- 내용 끝 -->
</div>
</div> </div>
</div> <!-- 컨텐츠 끝 -->
</div>
</section> </section>
<!-- 페이지 컨테이너 끝 -->
<!-- footer start-->
<c:import url="/com/includeFooterInput.do?projectCode=${params.PROJECT_CODE}" /> <c:import url="/com/includeFooterInput.do?projectCode=${params.PROJECT_CODE}" />
<!-- footer end-->

View File

@ -711,7 +711,6 @@ function fn_grid_refresh(){
fn_isMsg(); fn_isMsg();
fn_onLoad(); fn_onLoad();
fn_MakeDataArray(); fn_MakeDataArray();
fn_ConvertGridData(); // DB에서 값없음(-999); 화면에서 갑없음(-); kendo grid에서 값 없음(null) 처리
fn_kendoGrid(); fn_kendoGrid();
fn_setGridCombo(); fn_setGridCombo();
@ -755,20 +754,7 @@ function fn_grid_refresh(){
}); });
/* 탭 & 엔터키 이동 끝 */ /* 탭 & 엔터키 이동 끝 */
} }
/**
* DB에서 값없음(-999); 화면에서 갑없음(-); kendo grid에서 값 없음(null) 처리
*/
function fn_ConvertGridData() {
if (!Array.isArray(gridData)) return;
gridData.forEach(item => {
if (item.sampleGs == -999) item.sampleGs = null;
if (item.sampleWc == -999) item.sampleWc = null;
if (item.sampleLl == -999) item.sampleLl = null;
if (item.samplePi == -999) item.samplePi = null;
if (item.sampleRd == -999) item.sampleRd = null;
});
}
function fn_kendoGrid() { function fn_kendoGrid() {
var nullTypeString = 'test'; var nullTypeString = 'test';
@ -815,12 +801,12 @@ function fn_grid_refresh(){
sampleDepthTo: { type: "number" }, sampleDepthTo: { type: "number" },
sampleSamplingMethod: { type: "string" }, sampleSamplingMethod: { type: "string" },
sampleShape: { type: "string" }, sampleShape: { type: "string" },
sampleWc: { type: "number", defaultValue: null}, sampleWc: { type: "number", defaultValue: "-"},
sampleGs: { type: "number", defaultValue: null}, sampleGs: { type: "number", defaultValue: "-"},
sampleLl: { type: "number", defaultValue: null }, sampleLl: { type: "number", defaultValue: "-" },
samplePi: { type: "number", defaultValue: null }, samplePi: { type: "number", defaultValue: "-" },
sampleDesc: { type: "string" }, sampleDesc: { type: "string" },
sampleRd: { type: "number", defaultValue: null }, sampleRd: { type: "number", defaultValue: "-" },
sampleUscs: { type: "string" }, sampleUscs: { type: "string" },
sampleCode: { type: "string", editable: false }, sampleCode: { type: "string", editable: false },
} }

View File

@ -61,124 +61,132 @@ function fn_MakeData(){
//저장 //저장
function fn_save(rUrl){ function fn_save(rUrl){
// ----------------------- kendoGrid XML 구조저장 시작 ----------------------- // ----------------------- kendoGrid XML 구조저장 시작 -----------------------
var grid = kendoJQuery("#kictGrid").data("kendoGrid"); var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource; var dataSource = grid.dataSource;
var data = dataSource.data(); var data = dataSource.data();
var kendoRowCount = dataSource.view().length; // 가로(행) 갯수 var kendoRowCount = dataSource.view().length; // 가로(행) 갯수
var kendoColCount = grid.columns.length; // 전체 컬럼 수 (고정3 + 데이터n) var kendoColCount = grid.columns.length; // 세로(열) 갯수
var kendoStartIndex = 3; // VALUE1이 시작되는 인덱스 var kendoStartIndex = 3;
var dynamicColCount = kendoColCount - kendoStartIndex; // 실제 시험 횟수(데이터 열 개수)
// 숫자체크 (유효성 검사) //변경여부 확인
var colInfo = { /* if(rUrl == ""){
"1_idx":1 , "1_title" :"From", "1_start_num":10, "1_end_num":4, var dirty = $.grep(data, function(item) {
"2_idx":2 , "2_title" :"심도(to)", "2_start_num":10, "2_end_num":4, return item.dirty;
"3_idx":3 , "3_title" :"시료직경", "3_start_num":10, "3_end_num":8, });
"4_idx":4 , "4_title" :"시료길이", "4_start_num":10, "4_end_num":8, if (dirty.length === 0) {
"5_idx":5 , "5_title" :"비중", "5_start_num":10, "5_end_num":8, alert("변경된 자료가 없습니다");
"6_idx":6 , "6_title" :"탄성파속도(p파속도)", "6_start_num":10, "6_end_num":8, fn_progressbarHideKendo();
"7_idx":7 , "7_title" :"탄성파속도(s파속도)", "7_start_num":10, "7_end_num":8, return false;
"8_idx":8 , "8_title" :"흡수율", "8_start_num":10, "8_end_num":8, }
"9_idx":9 , "9_title" :"일축압축강도", "9_start_num":10, "9_end_num":10, } */
"11_idx":11, "11_title":"포아송비", "11_start_num":10, "11_end_num":8
};
if(fn_saveNumberCheckKendo("COL", dataSource, grid, "grid1", 3, colInfo, grid.columns, true, "rockUniaxial") == false){ //숫자체크
$("#RUNICODE").val(prevRuniCode); var colInfo = {
return false; "1_idx":1 , "1_title" :"From", "1_start_num":10, "1_end_num":4,
} "2_idx":2 , "2_title" :"심도(to)", "2_start_num":10, "2_end_num":4,
"3_idx":3 , "3_title" :"시료직경", "3_start_num":10, "3_end_num":8,
"4_idx":4 , "4_title" :"시료길이", "4_start_num":10, "4_end_num":8,
"5_idx":5 , "5_title" :"비중", "5_start_num":10, "5_end_num":8,
"6_idx":6 , "6_title" :"탄성파속도(p파속도)", "6_start_num":10, "6_end_num":8,
"7_idx":7 , "7_title" :"탄성파속도(s파속도)", "7_start_num":10, "7_end_num":8,
"8_idx":8 , "8_title" :"흡수율", "8_start_num":10, "8_end_num":8,
"9_idx":9 , "9_title" :"일축압축강도", "9_start_num":10, "9_end_num":10,
"11_idx":11, "11_title":"포아송비", "11_start_num":10, "11_end_num":8
};
// [수정] 비고(Remark) 입력체크 (12번 인덱스가 '비고' 행) if(fn_saveNumberCheckKendo("COL", dataSource, grid, "grid1", 3, colInfo, grid.columns, true, "rockUniaxial") == false){
// i는 1부터 실제 데이터 열의 개수(dynamicColCount)까지 돕니다. $("#RUNICODE").val(prevRuniCode);
for(var i=1; i <= dynamicColCount; i++){ return false;
var remarkVal = data[12]["VALUE" + i]; }
// 값이 없거나, null이거나, 공백만 있는 경우 체크 //비고 입력체크
if(remarkVal === undefined || remarkVal === null || String(remarkVal).trim() === ""){ for(var i=1; i <= Math.floor(kendoColCount/2); i++){
alert(i + "번째 시험의 비고를 입력해주세요."); if(gridData['12']['VALUE'+i] == " " && dataSource._data[12]["VALUE"+i] == " "){
return false; alert("비고를 입력해주세요");
} return false;
} }
}
var s = "<changedData>";
var m = "";
for(var i=0; i<kendoRowCount; i++){ var s = "<changedData>";
var row = data[i]; var m = "";
m = m + "<data>"; for(var i=0; i<kendoRowCount; i++){
var row = data[i];
for(var j=kendoStartIndex; j<kendoColCount; j++){ m = m + "<data>";
var column = grid.columns[j];
var dataField = column.field;
m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">"; for(var j=kendoStartIndex; j<kendoColCount; j++){
} var column = grid.columns[j];
m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>"; var dataField = column.field;
m = m + "</data>";
}
var e = "</changedData>";
var strData = s+m+e;
// ----------------------- kendoGrid XML 구조저장 끝 -----------------------
var runi_code = prevRuniCode; m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">";
var re_runi_code = prevRuniCode;
// 삭제 되는 시료에 대한 처리 }
if(Number(runi_code.substr(11)) > Number($("#SAMPLECNT").val())){ m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>";
re_runi_code = ""; m = m + "</data>";
$("#table_file").html('');
}
// 현재 선택된 열 인덱스 (파일 업로드 체크용) }
var _seq = nowColumnIndex; var e = "</changedData>";
var strData = s+m+e;
// ----------------------- kendoGrid XML 구조저장 끝 -----------------------
// 이미지 업로드 필수 체크 로직 var runi_code = prevRuniCode;
var testOrderVal = data[0]["VALUE" + _seq]; // 시험횟수 행의 값 var re_runi_code = prevRuniCode;
var fileImgID1 = "GRAPH_IMAGE1_" + testOrderVal;
var fileImgID2 = "GRAPH_IMAGE2_" + testOrderVal;
var fileImg1 = $("#GRAPH_IMAGE1_" + testOrderVal).val();
var fileImg2 = $("#GRAPH_IMAGE2_" + testOrderVal).val();
var fileImg_bk1 = $("#OLD_GRAPH_IMAGE1_" + testOrderVal).val();
var fileImg_bk2 = $("#OLD_GRAPH_IMAGE2_" + testOrderVal).val();
const fileImgCheck1 = fileImg1 == "" || fileImg1 === "null" || fileImg1 === null; //삭제 되는 시료에 대한 처리
const fileImgCheck2 = fileImg2 == "" || fileImg2 === "null" || fileImg2 === null; if(Number(runi_code.substr(11)) > Number($("#SAMPLECNT").val())){
const fileImgBkCheck1 = fileImg_bk1 == "" || fileImg_bk1 === "null" || fileImg_bk1 === null; re_runi_code = "";
const fileImgBkCheck2 = fileImg_bk2 == "" || fileImg_bk2 === "null" || fileImg_bk2 === null; $("#table_file").html('');
}
if(fileImgBkCheck1 === false || fileImgBkCheck2 === false){ var _seq = nowColumnIndex;
fn_fileTotalCheck(fileImgID1);
fn_fileTotalCheck(fileImgID2);
}
if( fileImgBkCheck1 && fileImgCheck1 ) { // 2019.10.10 이미지 업로드 필수 수정
alert("파괴형태 그림 첨부는 필수입니다."); var fileImgID1 = "GRAPH_IMAGE1_"+dataSource._data[0]["VALUE"+_seq];
return false; var fileImgID2 = "GRAPH_IMAGE2_"+dataSource._data[0]["VALUE"+_seq];
} else if( fileImgBkCheck2 && fileImgCheck2 ) { var fileImg1 = $("#GRAPH_IMAGE1_"+dataSource._data[0]["VALUE"+_seq]).val();
alert("Stress-Strain 그래프 첨부는 필수입니다."); var fileImg2 = $("#GRAPH_IMAGE2_"+dataSource._data[0]["VALUE"+_seq]).val();
return false; var fileImg_bk1 = $("#OLD_GRAPH_IMAGE1_"+dataSource._data[0]["VALUE"+_seq]).val();
} var fileImg_bk2 = $("#OLD_GRAPH_IMAGE2_"+dataSource._data[0]["VALUE"+_seq]).val();
const fileImgCheck1 = fileImg1 == "" || fileImg1 === "null" || fileImg1 === null;
const fileImgCheck2 = fileImg2 == "" || fileImg2 === "null" || fileImg2 === null;
const fileImgBkCheck1 = fileImg_bk1 == "" || fileImg_bk1 === "null" || fileImg_bk1 === null;
const fileImgBkCheck2 = fileImg_bk2 == "" || fileImg_bk2 === "null" || fileImg_bk2 === null;
// 저장 파라미터 세팅 if(fileImgBkCheck1 === false || fileImgBkCheck2 === false){
var projectCode = '<c:out value='${params.PROJECT_CODE}'/>'; //첨부파일이 있을경우 확장자 체크
var holeCode = '<c:out value='${params.HOLE_CODE}'/>'; fn_fileTotalCheck(fileImgID1);
var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode; fn_fileTotalCheck(fileImgID2);
var dbUrl = "/web/input/rockUniaxialDb.do"+param_code+"&srhRUNI_CODE="+fn_isNull($("#RUNICODE").val()); }
document.getElementById("PROJECT_CODE").value = projectCode; if( fileImgBkCheck1 && fileImgCheck1 ) {
document.getElementById("HOLE_CODE").value = holeCode; alert("파괴형태 그림 첨부는 필수입니다.");
document.getElementById("RUNI_CODE").value = runi_code; return false;
document.getElementById("SAMPLE_CNT").value = document.getElementById("SAMPLECNT").value; } else if( fileImgBkCheck2 && fileImgCheck2 ) {
alert("Stress-Strain 그래프 첨부는 필수입니다.");
return false;
}
/* if(fileImgBkCheck1 === true || fileImgBkCheck2 === true){ */
/* } */
//그리드 저장
// [수정] TOTALCNT는 실제 데이터 열의 개수(dynamicColCount)로 설정 var projectCode = '<c:out value='${params.PROJECT_CODE}'/>';
//document.getElementById("TOTALCNT").value = dynamicColCount; var holeCode = '<c:out value='${params.HOLE_CODE}'/>';
document.getElementById("TOTALCNT").value = kendoColCount - 1;
document.getElementById("rowDelFileArr").value = rowDelFileArr;
fn_submitAll(dbUrl, rUrl, strData, document.frmRock); var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode;
var dbUrl = "/web/input/rockUniaxialDb.do"+param_code+"&srhRUNI_CODE="+fn_isNull($("#RUNICODE").val());
document.getElementById("PROJECT_CODE").value = '<c:out value='${params.PROJECT_CODE}'/>';
document.getElementById("HOLE_CODE").value = '<c:out value='${params.HOLE_CODE}'/>';
document.getElementById("RUNI_CODE").value = runi_code;
document.getElementById("SAMPLE_CNT").value = document.getElementById("SAMPLECNT").value;
document.getElementById("TOTALCNT").value = kendoColCount - 1;
document.getElementById("rowDelFileArr").value = rowDelFileArr;
fn_submitAll(dbUrl, rUrl, strData, document.frmRock);
} }
//kendoGrid submitAll //kendoGrid submitAll
@ -309,73 +317,168 @@ function setData(arrayRockColumn,arrayRock){
} }
function fn_setFile(arrayRock){ function fn_setFile(arrayRock){
$("#table_file").html('');
var file = '';
for(var i = 0; i < arrayRock.length; i++){ //file init
var testOrder = arrayRock[i].testOrder; $("#table_file").html('');
var img1 = (arrayRock[i].graphImage1 == 'null' || arrayRock[i].graphImage1 == null) ? '' : arrayRock[i].graphImage1; //file content
var loc1 = (arrayRock[i].graphLocal1 == 'null' || arrayRock[i].graphLocal1 == null) ? '' : arrayRock[i].graphLocal1; var file = '<div id="table_file" class="table-file">';
var img2 = (arrayRock[i].graphImage2 == 'null' || arrayRock[i].graphImage2 == null) ? '' : arrayRock[i].graphImage2;
var loc2 = (arrayRock[i].graphLocal2 == 'null' || arrayRock[i].graphLocal2 == null) ? '' : arrayRock[i].graphLocal2;
// 파괴형태 그림 for(var i =0; i < arrayRock.length; i++){
file += '<div id="TR_GRAPH_IMAGE1_' + testOrder + '" class="table-file-wrapper">';
file += ' <div class="contents-title-1depth marT20"><span>파괴형태 그림 (' + testOrder + '회)를(을) 입력하세요. (최대크기: 500KB)</span></div>';
file += ' <table class="table table-file marT0" data-target="form-file"><colgroup><col width="160px" /><col width="auto" /></colgroup>';
file += ' <tr><td class="td-head">첨부파일입력</td><td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE1_' + testOrder + '" name="GRAPH_IMAGE1_' + testOrder + '" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5"><li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li><li>파일크기는 "최대 500KB" 입니다.</li></ul>';
if(img1 !== ''){
file += ' <div class="marT10 marB10"><b>첨부파일</b> : <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img1 + '", event.x,event.y); return false;\'>' + loc1 + '</a><label class="gg-checkbox gg-checkbox-outline marL20"><input type="checkbox" id="FILE_DEL1_' + testOrder + '" name="FILE_DEL1_' + testOrder + '" value="Y" class="checkbox_T" /> 파일삭제<span></span></label></div>';
file += ' <img src="/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img1 + '" class="file-preview-img" />';
}
file += ' <input type="hidden" id="OLD_GRAPH_IMAGE1_' + testOrder + '" name="OLD_GRAPH_IMAGE1_' + testOrder + '" value="' + img1 + '" />';
file += ' <input type="hidden" id="OLD_GRAPH_LOCAL1_' + testOrder + '" name="OLD_GRAPH_LOCAL1_' + testOrder + '" value="' + loc1 + '" />';
file += ' </td></tr></table></div>';
// Stress-Strain 그래프
file += '<div id="TR_GRAPH_IMAGE2_' + testOrder + '" class="table-file-wrapper">'; file += ' <div class="contents-title-1depth marT20"><span>일축압축시험결과 그래프를 입력하세요. (최대크기: 500KB) 파일은 <span class="textR">JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>';
file += ' <div class="contents-title-1depth marT20"><span>Stress-Strain 그래프 (' + testOrder + '회)를(을) 입력하세요. (최대크기: 500KB)</span></div>'; file += ' <table class="table table-file marT0" data-target="form-file">';
file += ' <table class="table table-file marT0" data-target="form-file"><colgroup><col width="160px" /><col width="auto" /></colgroup>'; file += ' <colgroup>';
file += ' <tr><td class="td-head">첨부파일입력</td><td class="plus_file" colspan="3">'; file += ' <col width="160px" />';
file += ' <input type="file" id="GRAPH_IMAGE2_' + testOrder + '" name="GRAPH_IMAGE2_' + testOrder + '" class="gg-input file-input" />'; file += ' <col width="auto" />';
file += ' <ul class="content-ul-list marT5"><li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li><li>파일크기는 "최대 500KB" 입니다.</li></ul>'; file += ' </colgroup>';
if(img2 !== ''){ if(i == 0){
file += ' <div class="marT10 marB10"><b>첨부파일</b> : <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img2 + '", event.x,event.y); return false;\'>' + loc2 + '</a><label class="gg-checkbox gg-checkbox-outline marL20"><input type="checkbox" id="FILE_DEL2_' + testOrder + '" name="FILE_DEL2_' + testOrder + '" value="Y" class="checkbox_T" /> 파일삭제<span></span></label></div>'; file += ' <tbody id="TR_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" style="display:\'\'">';
file += ' <img src="/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img2 + '" class="file-preview-img" />'; }else{
} file += ' <tbody id="TR_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" style="display:none">';
file += ' <input type="hidden" id="OLD_GRAPH_IMAGE2_' + testOrder + '" name="OLD_GRAPH_IMAGE2_' + testOrder + '" value="' + img2 + '" />'; }
file += ' <input type="hidden" id="OLD_GRAPH_LOCAL2_' + testOrder + '" name="OLD_GRAPH_LOCAL2_' + testOrder + '" value="' + loc2 + '" />';
file += ' </td></tr></table></div>'; file += ' <input type="hidden" id="OLD_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphImage1+'" />';
} file += ' <input type="hidden" id="OLD_GRAPH_LOCAL1_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_LOCAL1_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphLocal1+'" />';
$("#table_file").html(file); file += ' <input type="hidden" id="OLD_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphImage2+'" />';
$("#GridRowCnt").val(arrayRock.length); file += ' <input type="hidden" id="OLD_GRAPH_LOCAL2_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_LOCAL2_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphLocal2+'" />';
if(arrayRock[i].graphImage1 != '' && arrayRock[i].graphImage1 != null && arrayRock[i].graphImage1 != 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' 파괴형태<br>그림 입력';
file += ' </td>';
file += ' <td class="plus_file">';
file += ' <input type="file" id="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
file += ' <tr>';
file += ' <td class="td-head">파괴형태<br>첨부된 파일정보</td>';
file += ' <td class="plus_img">';
file += ' <div class="marB10">';
file += ' <b>첨부파일</b> :';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage1+'", event.x,event.y); return false;\'>'+arrayRock[i].graphLocal1+'</a>';
file += ' <label class="gg-checkbox gg-checkbox-outline marL20">';
file += ' <input type="checkbox" id="FILE_DEL1_'+arrayRock[i].testOrder+'" name="FILE_DEL1_'+arrayRock[i].testOrder+'" value="Y" class="checkbox_T" /> 파일삭제';
file += ' <span></span>';
file += ' </label>';
file += ' </div>';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage1+'", event.x,event.y); return false;\'>';
file += ' <img src="/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage1+'" class="file-preview-img" />';
file += ' </a>';
file += ' </td>';
file += ' </tr>';
}
if(arrayRock[i].graphImage1 == '' || arrayRock[i].graphImage1 == null || arrayRock[i].graphImage1 == 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' 파괴형태<br>그림 입력';
file += ' </td>';
file += ' <td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
}
file += ' </tbody>';
if(i == 0){
file += ' <tbody id="TR_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" style="display:\'\'">';
}else{
file += ' <tbody id="TR_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" style="display:none">';
}
if(arrayRock[i].graphImage2 != '' && arrayRock[i].graphImage2 != null && arrayRock[i].graphImage2 != 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' Stress-Strain<br>그래프 입력';
file += ' </td>';
file += ' <td class="plus_file">';
file += ' <input type="file" id="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
file += ' <tr>';
file += ' <td class="td-head">Stress-Strain<br>첨부된 파일정보</td>';
file += ' <td class="plus_img">';
file += ' <div class="marB10">';
file += ' <b>첨부파일</b> :';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage2+'", event.x,event.y); return false;\'>'+arrayRock[i].graphLocal2+'</a>';
file += ' <label class="gg-checkbox gg-checkbox-outline marL20">';
file += ' <input type="checkbox" id="FILE_DEL2_'+arrayRock[i].testOrder+'" name="FILE_DEL2_'+arrayRock[i].testOrder+'" value="Y" class="checkbox_T" /> 파일삭제';
file += ' <span></span>';
file += ' </label>';
file += ' </div>';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage2+'", event.x,event.y); return false;\'>';
file += ' <img src="/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage2+'" class="file-preview-img" />';
file += ' </a>';
file += ' </td>';
file += ' </tr>';
}
if(arrayRock[i].graphImage2 == '' || arrayRock[i].graphImage2 == null || arrayRock[i].graphImage2 == 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' Stress-Strain<br>그래프 입력';
file += ' </td>';
file += ' <td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
}
file += ' </tbody>';
file += ' </table>';
}
file += ' <input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value="${params.PROJECT_CODE}" />';
file += ' <input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value="${params.HOLE_CODE}" />';
file += ' <input type="hidden" id="RUNI_CODE" name="RUNI_CODE" value="${params.RUNI_CODE}"/>';
file += ' <input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT"/>';
file += ' <input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />';
file += ' <input type="hidden" id="dataAll" name="dataAll" />';
file += ' <input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />';
file += '</div>';
$("#table_file").html(file);
$("#GridRowCnt").val(arrayRock.length);
} }
//열추가삭제
function fn_ColAddInput(nowColCount, nowColLength, cnt){
var oldCnt = nowColCount;
if(cnt>=0){
if(cnt < oldCnt){ //삭제
for(var i = oldCnt ; i >= cnt + 1; i--){
// 실제 물리적인 파일 삭제 하기 위해 파일명 Arr 세팅
rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+i).val() + ",";
rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+i).val() + ",";
// 해당 회차의 DOM을 직접 제거 (전체 삭제 후 재생성 방지)
$("#TR_GRAPH_IMAGE1_" + i).remove();
$("#TR_GRAPH_IMAGE2_" + i).remove();
}
}else if(cnt > oldCnt){ //추가
for(var i = oldCnt+1 ; i <= cnt; i++){
fn_FileAddRow("table_file", i, "GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_", "파괴형태 그림 ("+i+"회)");
fn_FileAddRow("table_file", i, "GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_", "Stress-Strain 그래프 ("+i+"회)");
}
}
}
}
//ajax 리턴 //ajax 리턴
function fn_SelectLoad(data){ function fn_SelectLoad(data){
@ -464,6 +567,13 @@ function fn_add(){
fn_FileAddRow("table_file",nowColCount,"GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_","파괴형태 그림"); fn_FileAddRow("table_file",nowColCount,"GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_","파괴형태 그림");
fn_FileAddRow("table_file",nowColCount,"GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_","Stress-Strain 그래프"); fn_FileAddRow("table_file",nowColCount,"GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_","Stress-Strain 그래프");
//첨부추가
/* fn_gridAddRow("TR_GRAPH_IMAGE1_","GRAPH_IMAGE1_", nowColCount, "파괴형태 그림");
fn_gridAddRow("TR_GRAPH_IMAGE2_","GRAPH_IMAGE2_", nowColCount, "Stress-Strain 그래프"); */
//display controll
fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE1_",0);
fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE2_",0);
myFields = grid.dataSource.options.schema.model.fields; myFields = grid.dataSource.options.schema.model.fields;
@ -495,39 +605,45 @@ function fn_add(){
//열 삭제 //열 삭제
function removeItemAt() { function removeItemAt() {
var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var nowColLength = grid.columns.length - 3; // 타이틀 수 제외
if($("#RUNICODE").val() == "" || $("#RUNICODE").val() == null){ var grid = kendoJQuery("#kictGrid").data("kendoGrid");
alert("시료번호를 선택하세요."); var dataSource = grid.dataSource;
return false; var data = dataSource.data();
}
if( nowColLength <= 1 ) { // 최소 1개는 유지 var nowColLength = grid.columns.length - 3; // 타이틀 수 제외
return false; var nowRowLength = grid.dataSource.options.data.length
} else { var nowColCount = nowColLength + 1;
grid.columns.pop(); var nowRowCount = nowRowLength;
kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){
kendoJQuery(this).remove();
});
}
var nowColCount = nowColLength - 1; if($("#RUNICODE").val() == "" || $("#RUNICODE").val() == null){
$("#GridRowCnt").val(nowColCount); alert("시료번호를 선택하세요.");
return false;
}
// 실제 파일 삭제 배열에 추가 if( nowColCount == 2 ) {
rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+nowColLength).val() + ","; return false;
rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+nowColLength).val() + ","; } else {
nowColCount = nowColLength - 1
grid.columns.pop();
kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){
kendoJQuery(this).remove();
});
}
// DOM에서 해당 회차의 첨부파일 DIV 영역 직접 완전 삭제 $("#GridRowCnt").val(nowColCount);
$("#TR_GRAPH_IMAGE1_" + nowColLength).remove(); var dataItem = grid._data[nowColCount-1];
$("#TR_GRAPH_IMAGE2_" + nowColLength).remove(); return dataItem.dirty = true;
//첨부삭제
fn_FileRemoveRow("table_file",nowColLength*2, 2);
//display controll
fn_kendoFileDisplayCol(nowColLength - 1, nowColCount, "TR_GRAPH_IMAGE1_",0);
fn_kendoFileDisplayCol(nowColLength - 1, nowColCount, "TR_GRAPH_IMAGE2_",0);
$("#table_file").find("div").last().remove(); //20211219 ssheo
$("#table_file").find("table:last-child").remove(); //20211219 ssheo
// return 문을 DOM 삭제 로직 아래인 제일 마지막으로 이동
var dataItem = grid._data[nowColCount-1];
if(dataItem) {
return dataItem.dirty = true;
}
} }
//그리드 col수 이벤트 //그리드 col수 이벤트
@ -614,30 +730,38 @@ function fn_rowChange(){
} }
} }
//열추가삭제 //열추가삭제
// 열 추가/삭제에 따른 파일 업로드 UI 제어 함수
function fn_ColAddInput(nowColCount, nowColLength, cnt){ function fn_ColAddInput(nowColCount, nowColLength, cnt){
var oldCnt = nowColCount; var oldCnt = nowColCount;
if(cnt>=0){ if(cnt>=0){
if(cnt < oldCnt){ //삭제 if(cnt < oldCnt){ //삭제
for(var i = oldCnt ; i >= cnt + 1; i--){ for(var i = oldCnt ; i>= cnt + 1; i--){
//실제 물리적인 파일 삭제 하기 위해 파일명 Arr //실제 물리적인 파일 삭제 하기 위해 파일명 Arr
rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+i).val() + ","; rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+i).val() + ",";
rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+i).val() + ","; rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+i).val() + ",";
$("#OLD_GRAPH_IMAGE1_"+i).val("");
$("#OLD_GRAPH_IMAGE2_"+i).val("");
// [핵심] fn_FileRemoveRow 대신 jQuery remove()를 사용하여 해당 회차 DIV 통째로 삭제 //file del
$("#TR_GRAPH_IMAGE1_" + i).remove(); fn_FileRemoveRow("table_file",(i)*2, 2); // 모든 파일 삭제
$("#TR_GRAPH_IMAGE2_" + i).remove();
} //display controll
}else if(cnt > oldCnt){ //추가 fn_kendoFileDisplayCol(i-1, i-1, "TR_GRAPH_IMAGE1_",0);
for(var i = oldCnt+1 ; i <= cnt; i++){ fn_kendoFileDisplayCol(i-1, i-1, "TR_GRAPH_IMAGE2_",0);
// common.js에 정의된 공통 함수를 사용해 HTML append }
fn_FileAddRow("table_file", i, "GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_", "파괴형태 그림"); }else if(cnt > oldCnt){ //추가
fn_FileAddRow("table_file", i, "GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_", "Stress-Strain 그래프"); var nowColAddCount = cnt - oldCnt;
} var nowColAddLength = nowColLength + nowColAddCount;
} for(var i = oldCnt+1 ; i<= cnt; i++){
} fn_FileAddRow("table_file",i,"GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_","파괴형태 그림");
fn_FileAddRow("table_file",i,"GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_","Stress-Strain 그래프");
//display controll
fn_kendoFileDisplayCol(i, i, "TR_GRAPH_IMAGE1_",0);
fn_kendoFileDisplayCol(i, i, "TR_GRAPH_IMAGE2_",0);
}
}
}
} }
/* 도움말 시작 */ /* 도움말 시작 */
@ -798,6 +922,8 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
nowColumnIndex = colIdx - 2; nowColumnIndex = colIdx - 2;
var nowColLength = grid.columns.length - 2; // 타이틀 수 제외 var nowColLength = grid.columns.length - 2; // 타이틀 수 제외
fn_kendoFileDisplayCol(nowColumnIndex, nowColLength, "TR_GRAPH_IMAGE1_", 0);
fn_kendoFileDisplayCol(nowColumnIndex, nowColLength, "TR_GRAPH_IMAGE2_", 0);
}); });
fn_kendoGridStyle(); fn_kendoGridStyle();
@ -838,6 +964,10 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
var nowColCount = nowColLength + 1; var nowColCount = nowColLength + 1;
var nowRowCount = nowRowLength; var nowRowCount = nowRowLength;
//display controll
fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE1_",0);
fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE2_",0);
fn_kendoGridStyle(); fn_kendoGridStyle();
} }
@ -1093,28 +1223,43 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
<div id="table_file" class="table-file"> <div id="table_file" class="table-file">
<c:forEach var="mapFile" items="${arrayRock}" varStatus="status"> <c:forEach var="mapFile" items="${arrayRock}" varStatus="status">
<div id="TR_GRAPH_IMAGE1_${mapFile.testOrder}" class="table-file-wrapper"> <div class="contents-title-1depth marT20"><span>일축압축시험결과 그래프를 입력하세요. (최대크기: 500KB) 파일은 <span class='textR'>JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></span></div>
<div class="contents-title-1depth marT20"><span>파괴형태 그림 (${mapFile.testOrder}회)를(을) 입력하세요. (최대크기: 500KB) 파일은 <span class='textR'>JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div> <table class="table table-file marT0" data-target="form-file">
<table class="table table-file marT0" data-target="form-file"> <colgroup>
<colgroup> <col width="160px" />
<col width="160px" /> <col width="auto" />
<col width="auto" /> </colgroup>
</colgroup>
<tbody>
<input type="hidden" id="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" value="${mapFile.graphImage1}" />
<input type="hidden" id="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" value="${mapFile.graphLocal1}" />
<!-- 이미지 1 -->
<c:if test="${status.index == 0 }">
<tbody id="TR_GRAPH_IMAGE1_${mapFile.testOrder}" style="display:''">
</c:if>
<c:if test="${status.index != 0 }">
<tbody id="TR_GRAPH_IMAGE1_${mapFile.testOrder}" style="display:none">
</c:if>
<input type="hidden" id="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" value="${mapFile.graphImage1}" />
<input type="hidden" id="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" value="${mapFile.graphLocal1}" />
<input type="hidden" id="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" value="${mapFile.graphImage2}" />
<input type="hidden" id="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" value="${mapFile.graphLocal2}" />
<c:if test="${mapFile.graphImage1 != '' and mapFile.graphImage1 != null and mapFile.graphImage1 != 'null'}">
<tr> <tr>
<td class="td-head">파괴형태<br>그림 입력</td> <td class="td-head">
파괴형태<br>그림 입력
</td>
<td class="plus_file"> <td class="plus_file">
<input type="file" id="GRAPH_IMAGE1_${mapFile.testOrder}" name="GRAPH_IMAGE1_${mapFile.testOrder}" class="gg-input file-input" /> <input type="file" id="GRAPH_IMAGE1_${mapFile.testOrder}" name="GRAPH_IMAGE1_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5"> <ul class="content-ul-list marT5">
<li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li> <li>
<li>파일크기는 "최대 500KB" 입니다.</li> 시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul> </ul>
</td> </td>
</tr> </tr>
<c:if test="${mapFile.graphImage1 != '' and mapFile.graphImage1 != null and mapFile.graphImage1 != 'null'}">
<tr> <tr>
<td class="td-head">파괴형태<br>첨부된 파일정보</td> <td class="td-head">파괴형태<br>첨부된 파일정보</td>
<td class="plus_img"> <td class="plus_img">
@ -1131,33 +1276,53 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</a> </a>
</td> </td>
</tr> </tr>
</c:if> </c:if>
</tbody> <c:if test="${mapFile.graphImage1 == '' or mapFile.graphImage1 == null or mapFile.graphImage1 == 'null'}">
</table>
</div>
<div id="TR_GRAPH_IMAGE2_${mapFile.testOrder}" class="table-file-wrapper">
<div class="contents-title-1depth marT20"><span>Stress-Strain 그래프 (${mapFile.testOrder}회)를(을) 입력하세요. (최대크기: 500KB)</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody>
<input type="hidden" id="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" value="${mapFile.graphImage2}" />
<input type="hidden" id="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" value="${mapFile.graphLocal2}" />
<tr> <tr>
<td class="td-head">Stress-Strain<br>그래프 입력</td> <td class="td-head">
<td class="plus_file"> 파괴형태<br>그림 입력
<input type="file" id="GRAPH_IMAGE2_${mapFile.testOrder}" name="GRAPH_IMAGE2_${mapFile.testOrder}" class="gg-input file-input" /> </td>
<td class="plus_file" colspan="3">
<input type="file" id="GRAPH_IMAGE1_${mapFile.testOrder}" name="GRAPH_IMAGE1_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5"> <ul class="content-ul-list marT5">
<li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li> <li>
<li>파일크기는 "최대 500KB" 입니다.</li> 시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
<!-- 이미지 2 -->
<c:if test="${status.index == 0 }">
<tbody id="TR_GRAPH_IMAGE2_${mapFile.testOrder}" style="display:''">
</c:if>
<c:if test="${status.index != 0 }">
<tbody id="TR_GRAPH_IMAGE2_${mapFile.testOrder}" style="display:none">
</c:if>
<c:if test="${mapFile.graphImage2 != '' and mapFile.graphImage2 != null and mapFile.graphImage2 != 'null'}">
<tr>
<td class="td-head">
Stress-Strain<br>그래프 입력
</td>
<td class="plus_file">
<input type="file" id="GRAPH_IMAGE2_${mapFile.testOrder}" name="GRAPH_IMAGE2_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul> </ul>
</td> </td>
</tr> </tr>
<c:if test="${mapFile.graphImage2 != '' and mapFile.graphImage2 != null and mapFile.graphImage2 != 'null'}">
<tr> <tr>
<td class="td-head">Stress-Strain<br>첨부된 파일정보</td> <td class="td-head">Stress-Strain<br>첨부된 파일정보</td>
<td class="plus_img"> <td class="plus_img">
@ -1174,23 +1339,38 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</a> </a>
</td> </td>
</tr> </tr>
</c:if> </c:if>
</tbody> <c:if test="${mapFile.graphImage2 == '' or mapFile.graphImage2 == null or mapFile.graphImage2 == 'null'}">
</table> <tr>
</div> <td class="td-head">
Stress-Strain<br>그래프 입력
</td>
<td class="plus_file" colspan="3">
<input type="file" id="GRAPH_IMAGE2_${mapFile.testOrder}" name="GRAPH_IMAGE2_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
</c:forEach> </c:forEach>
</div>
<div id="hidden_params"> <input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value='<c:out value='${params.PROJECT_CODE}'/>' />
<input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value="${params.PROJECT_CODE}" /> <input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value='<c:out value='${params.HOLE_CODE}'/>' />
<input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value="${params.HOLE_CODE}" /> <input type="hidden" id="RUNI_CODE" name="RUNI_CODE" value='<c:out value='${params.RUNI_CODE}'/>'/>
<input type="hidden" id="RUNI_CODE" name="RUNI_CODE" value="${params.RUNI_CODE}" /> <input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT"/>
<input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT" value="" /> <input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />
<input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" /> <input type="hidden" id="dataAll" name="dataAll" />
<input type="hidden" id="dataAll" name="dataAll" /> <input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />
<input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />
</div> </div>
</form> </form>
</div> </div>
<!-- contents end--> <!-- contents end-->

View File

@ -14,36 +14,31 @@ function textEditor(container, options) {
// 입력 type number로 변경 // 입력 type number로 변경
function numericEditor(container, options, isHyphenAllowed = false) { function numericEditor(container, options, isHyphenAllowed = false) {
// 소수점을 입력받아야 하므로 항상 text 타입을 권장합니다. (number 타입의 브라우저 간섭 방지) // 1. 하이픈 허용 여부에 따라 타입을 결정합니다.
var inputType = "text"; // 하이픈을 문자로서 입력받으려면 'text' 타입이 필요합니다.
var inputType = isHyphenAllowed ? "text" : "number";
var input = kendoJQuery('<input type="' + inputType + '" name="' + options.field + '" class="k-textbox" style="width:100%; text-align:right;" />'); var input = kendoJQuery('<input type="' + inputType + '" step="any" name="' + options.field + '" class="k-textbox" style="width:100%; text-align:right;" />');
input.appendTo(container) input.appendTo(container)
.val(options.model[options.field]) .val(options.model[options.field])
.on("focus", function() { .on("focus", function() {
this.select(); this.select();
}) })
.on("keydown", function(e) {
// 필요시, 숫자, 소수점(.), 하이픈(-), 백스페이스, 탭 등 필수 키만 허용하는 로직을 추가
})
.on("blur", function() { .on("blur", function() {
var valStr = this.value.trim(); var valStr = this.value.trim();
// 2. 하이픈 허용인 경우 '-' 입력을 그대로 모델에 저장합니다.
if (isHyphenAllowed && valStr === "-") { if (isHyphenAllowed && valStr === "-") {
options.model.set(options.field, "-"); options.model.set(options.field, "-");
} else if (valStr === "") { // 기존 common.js 로직에 따라 result 값도 세팅이 필요하다면 아래 추가
options.model.set(options.field, null); // options.model.set("result", "-");
} else { } else {
// parseFloat은 "3.23"을 숫자 3.23으로 정확히 변환합니다. // 숫자로 변환하여 모델에 저장
var valNum = parseFloat(valStr); var valNum = parseFloat(valStr);
var finalVal = isNaN(valNum) ? null : valNum;
if (isNaN(valNum)) { options.model.set(options.field, finalVal);
options.model.set(options.field, null); // options.model.set("result", finalVal); // 필요시 추가
} else {
// Kendo Model에 숫자로 반영 (이때 소수점이 유지됩니다)
options.model.set(options.field, valNum);
}
} }
}); });
@ -52,12 +47,8 @@ function numericEditor(container, options, isHyphenAllowed = false) {
function numericEditor2(container, options, isHyphenAllowed = false) { function numericEditor2(container, options, isHyphenAllowed = false) {
let rawVal = options.model[options.field]; var input = kendoJQuery('<input type="test" name="' + options.field + '" class="k-textbox" style="width:100%; text-align:right;" />');
if (rawVal === -999) {
options.model.set(options.field, null);
rawVal = null;
}
var input = kendoJQuery('<input type="text" name="' + options.field + '" data-bind="value:' + options.field + '" class="k-textbox" style="width:100%; text-align:right;" />');
input.appendTo(container) input.appendTo(container)
.val(options.model[options.field]) .val(options.model[options.field])
@ -70,12 +61,6 @@ function numericEditor2(container, options, isHyphenAllowed = false) {
this.value = val.slice(0, -1); this.value = val.slice(0, -1);
} }
}) })
.on("focus", function () {
if (this.value === "") {
this.value = "-";
}
this.select();
})
// 2. ↑ ↓ 키로 값 증가/감소 // 2. ↑ ↓ 키로 값 증가/감소
.on("keydown", function (e) { .on("keydown", function (e) {