WBS 템플릿 (제품관리_unit관리)

This commit is contained in:
2026-03-11 16:44:12 +09:00
parent 53dcb5b133
commit ad7e72c129
3 changed files with 148 additions and 68 deletions

View File

@@ -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 id="row_' + objId + '">';
tr += '<td><input type="checkbox" name="rowCheck" value="' + objId + '"></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + objId + '">';
tr += '<input type="hidden" name="UNIT_NO_' + objId + '" id="UNIT_NO_' + objId + '" value="">';
tr += '<input type="hidden" name="UPPER_TASK_OBJID_' + objId + '" id="UPPER_TASK_OBJID_' + objId + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + objId + '" id="TASK_LEVEL_' + objId + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + objId + '" id="TASK_LEVEL_' + objId + '" value="' + autoLevel + '">';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="1" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="2" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="3" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" name="TASK_NAME_' + objId + '" id="TASK_NAME_' + objId + '"></td>';
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 id="row_' + objId + '">';
tr += '<td><input type="checkbox" name="rowCheck" value="' + objId + '"></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + objId + '">';
tr += '<input type="hidden" name="UNIT_NO_' + objId + '" id="UNIT_NO_' + objId + '" value="">';
tr += '<input type="hidden" name="UPPER_TASK_OBJID_' + objId + '" id="UPPER_TASK_OBJID_' + objId + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + objId + '" id="TASK_LEVEL_' + objId + '" value="' + autoLevel + '">';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="1" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="2" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="3" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" name="TASK_NAME_' + objId + '" id="TASK_NAME_' + objId + '"></td>';
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(){
<div class="plm_btn_wrap">
<input type="button" value="Template Download" id="templateDownload" class="plm_btns">
<input type="button" value="추가" class="plm_btns" onclick="addRow();">
<input type="button" value="하위추가" class="plm_btns" onclick="addChildRow();">
<input type="button" value="삭제" class="plm_btns" onclick="deleteRow();">
<input type="button" value="저장" class="plm_btns" onclick="saveWBS();">
<input type="button" value="닫기" id="btn_close" class="plm_btns" onclick="javascript:self.close();">

View File

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