diff --git a/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp b/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp index 273a2d7..c3168d5 100644 --- a/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp @@ -233,29 +233,119 @@ function generateObjId(){ return String(Math.abs(Math.floor(Math.random() * 2147483647))) + String(++rowSeq); } +function findLastDescendant(parentTr){ + var parentDepth = getRowDepth(parentTr[0]); + var lastDescendant = parentTr; + parentTr.nextAll("tr").each(function(){ + if(getRowDepth(this) > parentDepth){ + lastDescendant = $(this); + } else { + return false; + } + }); + return lastDescendant; +} + +function renumberAllRows(){ + var rows = $("#wbsTaskList tr:not(#row_total)"); + var counters = [0, 0, 0]; + rows.each(function(){ + var objId = $(this).find("input[name='WBS_TASK_OBJID']").val(); + var depth = parseInt($("#TASK_LEVEL_" + objId).val()) || 0; + if(depth < 1 || depth > 3) return true; + + if(depth === 1){ + counters[0]++; + counters[1] = 0; + counters[2] = 0; + } else if(depth === 2){ + counters[1]++; + counters[2] = 0; + } else { + counters[2]++; + } + + var unitNo; + if(depth === 1) unitNo = String(counters[0]); + else if(depth === 2) unitNo = counters[0] + "." + counters[1]; + else unitNo = counters[0] + "." + counters[1] + "." + counters[2]; + + $("#UNIT_NO_" + objId).val(unitNo); + $(this).find(".lvl_input").val(""); + $(this).find(".lvl_input[data-level='" + depth + "']").val(unitNo); + }); +} + function addRow(){ var objId = generateObjId(); + var checked = $("input[name='rowCheck']:checked"); + var autoLevel = ""; + var insertAfterTr = null; + + if(checked.length > 0){ + var selectedTr = checked.last().closest("tr"); + var selectedDepth = getRowDepth(selectedTr[0]); + autoLevel = selectedDepth; + insertAfterTr = findLastDescendant(selectedTr); + checked.prop("checked", false); + } + var tr = ''; tr += ''; tr += ''; tr += ''; tr += ''; - tr += ''; + tr += ''; tr += ''; tr += ''; tr += ''; tr += ''; tr += ''; - var checked = $("input[name='rowCheck']:checked"); - if(checked.length > 0){ - checked.last().closest("tr").after(tr); - checked.prop("checked", false); + if(insertAfterTr){ + insertAfterTr.after(tr); } else { $("#wbsTaskList").append(tr); } bindLevelInput(objId); + renumberAllRows(); +} + +function addChildRow(){ + var checked = $("input[name='rowCheck']:checked"); + if(checked.length == 0){ + Swal.fire('부모 행을 선택해 주세요'); + return; + } + var selectedTr = checked.last().closest("tr"); + var selectedDepth = getRowDepth(selectedTr[0]); + + if(selectedDepth >= 3){ + Swal.fire('수준 3 이하로는 추가할 수 없습니다'); + return; + } + + var objId = generateObjId(); + var autoLevel = selectedDepth + 1; + var insertAfterTr = findLastDescendant(selectedTr); + + var tr = ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + + insertAfterTr.after(tr); + checked.prop("checked", false); + bindLevelInput(objId); + renumberAllRows(); } function deleteRow(){ @@ -264,10 +354,35 @@ function deleteRow(){ Swal.fire('삭제할 행을 선택해 주세요'); return; } + var removeTargets = []; + var hasChildren = false; checked.each(function(){ var objId = $(this).val(); - if($("#row_" + objId).attr("id") !== "row_total"){ - $("#row_" + objId).remove(); + var tr = $("#row_" + objId); + if(tr.attr("id") === "row_total") return true; + removeTargets.push(tr); + var parentDepth = getRowDepth(tr[0]); + tr.nextAll("tr").each(function(){ + if(getRowDepth(this) > parentDepth){ + removeTargets.push($(this)); + hasChildren = true; + } else { + return false; + } + }); + }); + + var msg = hasChildren ? '하위 항목도 함께 삭제됩니다. 삭제하시겠습니까?' : '삭제하시겠습니까?'; + Swal.fire({ + title: msg, + icon: 'warning', + showCancelButton: true, + confirmButtonText: '삭제', + cancelButtonText: '취소' + }).then(function(result){ + if(result.isConfirmed){ + $.each(removeTargets, function(i, tr){ tr.remove(); }); + renumberAllRows(); } }); } @@ -439,6 +554,7 @@ function saveWBS(){
+ diff --git a/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx b/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx index 952250e..db0e131 100644 Binary files a/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx and b/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx differ diff --git a/src/com/pms/service/ProjectService.java b/src/com/pms/service/ProjectService.java index a5170ac..47e5432 100644 --- a/src/com/pms/service/ProjectService.java +++ b/src/com/pms/service/ProjectService.java @@ -2786,7 +2786,7 @@ public class ProjectService { String path = CommonUtils.checkNull(fileMap.get("FILE_PATH")); String fileName = CommonUtils.checkNull(fileMap.get("SAVED_FILE_NAME")); - int lastColumnIndex = 2; + int lastColumnIndex = 4; FileInputStream fis = new FileInputStream(path + File.separator + fileName); XSSFWorkbook workBook = new XSSFWorkbook(fis); @@ -2803,13 +2803,12 @@ public class ProjectService { wbsMap.put("WBS_OBJID", CommonUtils.createObjId()); - String deptCode = ""; + String[] levelValues = new String[3]; + String taskName = ""; for(int columnIndex = 0 ; columnIndex < lastColumnIndex ; columnIndex++){ XSSFCell cell = row.getCell(columnIndex); - System.out.println("cell :: " + cell); - //데이버 유형별 get date String cellValue = ""; if(null == cell){ @@ -2818,27 +2817,19 @@ public class ProjectService { switch(cell.getCellType()){ case XSSFCell.CELL_TYPE_FORMULA: cellValue = cell.getCellFormula(); - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_FORMULA:"+cellValue); break; case XSSFCell.CELL_TYPE_NUMERIC: - DataFormatter formatter = new DataFormatter(); - cellValue = formatter.formatCellValue(cell); - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue); break; - case XSSFCell.CELL_TYPE_STRING: cellValue = cell.getStringCellValue()+""; - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue); break; case XSSFCell.CELL_TYPE_BLANK: - cellValue = cell.getBooleanCellValue()+""; - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_BLANK:"+cellValue); + cellValue = ""; break; case XSSFCell.CELL_TYPE_ERROR: cellValue = cell.getErrorCellValue()+""; - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_ERROR:"+cellValue); break; } } @@ -2849,56 +2840,29 @@ public class ProjectService { cellValue = CommonUtils.checkNull(cellValue); - //기본정보 시작=========================== - -/* //단계 - if(0 == columnIndex){ - wbsMap.put("STEP", cellValue); + if(columnIndex <= 2){ + levelValues[columnIndex] = cellValue; } - - //TASK명 - if(1 == columnIndex){ - wbsMap.put("TASK1", cellValue); - }*/ - - //공정명 - if(0 == columnIndex){ - wbsMap.put("TASK_NAME", cellValue); + if(columnIndex == 3){ + taskName = cellValue; } - //공정명 - if(1 == columnIndex){ - wbsMap.put("UNIT_NO", cellValue); - - resultList.add(wbsMap); - - System.out.println("wbsMap:"+wbsMap); - - break; - - } - - //담당자 - /*if(1 == columnIndex){ - wbsMap.put("USER_NAME", cellValue); - - if(!"".equals(cellValue)){ - - Map resultMap = new HashMap(); - Map codeParamMap = new HashMap(); - codeParamMap.put("USER_NAME", cellValue); - resultMap = commonService.getUserMap(codeParamMap); - - if(null != resultMap){ - wbsMap.put("USER_ID", CommonUtils.checkNull(resultMap.get("USER_ID"))); - wbsMap.put("USER_NAME", CommonUtils.checkNull(resultMap.get("USER_NAME"))); - } - } - resultList.add(wbsMap); - - System.out.println("wbsMap:"+wbsMap); - - break; - }*/ + } + + // 수준1/2/3 중 값이 있는 컬럼에서 UNIT_NO 결정 + String unitNo = ""; + if(!"".equals(CommonUtils.checkNull(levelValues[2]))){ + unitNo = levelValues[2]; + } else if(!"".equals(CommonUtils.checkNull(levelValues[1]))){ + unitNo = levelValues[1]; + } else if(!"".equals(CommonUtils.checkNull(levelValues[0]))){ + unitNo = levelValues[0]; + } + + if(!"".equals(unitNo) && !"".equals(taskName)){ + wbsMap.put("UNIT_NO", unitNo); + wbsMap.put("TASK_NAME", taskName); + resultList.add(wbsMap); + System.out.println("wbsMap:"+wbsMap); } } }