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);
}
}
}