Files
wace_plm/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp

614 lines
20 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ page import="java.util.*" %>
<%@include file="/init_jqGrid.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
<style>
html, body { height: 100%; margin: 0; overflow: hidden; }
#wbsTaskList td { text-align: center; padding: 2px 4px; }
#wbsTaskList input[type="text"] { width: 95%; }
#wbsTaskList select { width: 80px; }
</style>
<script>
var rowSeq = 0;
var isEditMode = ("${templateObjId}" !== "");
$(document).ready(function(){
$("#product1").prop("disabled","disabled");
if(isEditMode){
loadExistingTasks();
$("#title").val("${masterInfo.TITLE}");
$("#product").val("${masterInfo.PRODUCT_OBJID}");
} else {
addTotalRow();
}
$("#templateDownload").click(function(){
location.href="/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx";
});
fnc_setFileDropZone(
"excelImportDropZone",
"${OBJID}",
"WBS_EXCEL_IMPORT",
"WBS Excel Import Template",
"setExcelFileArea",
true,
"fileUploadPreProc",
"/project/excelImportFileProc.do",
null
);
$("#excelImportList").hide();
});
function addTotalRow(){
var objId = generateObjId();
var tr = '<tr id="row_total" data-depth="0">';
tr += '<td></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + objId + '">';
tr += '<input type="hidden" name="UNIT_NO_' + objId + '" id="UNIT_NO_' + objId + '" value="0">';
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="0">';
tr += '<td></td><td></td><td></td>';
tr += '<td style="font-weight:bold;">TOTAL';
tr += '<input type="hidden" name="TASK_NAME_' + objId + '" value="TOTAL">';
tr += '</td>';
tr += '</tr>';
$("#wbsTaskList").append(tr);
}
function loadExistingTasks(){
$.ajax({
url:"/project/getWBSTemplateTaskList.do",
type:"POST",
data:{"OBJID":"${templateObjId}"},
dataType:"json",
async:false,
success:function(data){
if(!data || data.length == 0) return;
for(var i = 0; i < data.length; i++){
var d = data[i];
var objId = d.OBJID;
var taskLevel = fnc_checkNull(d.TASK_LEVEL);
var depth = parseInt(taskLevel) || 0;
if(depth === 0){
var tr = '<tr id="row_total" data-depth="0">';
tr += '<td></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + objId + '">';
tr += '<input type="hidden" name="UNIT_NO_' + objId + '" id="UNIT_NO_' + objId + '" value="0">';
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="0">';
tr += '<td></td><td></td><td></td>';
tr += '<td style="font-weight:bold;">TOTAL';
tr += '<input type="hidden" name="TASK_NAME_' + objId + '" value="TOTAL">';
tr += '</td>';
tr += '</tr>';
$("#wbsTaskList").append(tr);
} else {
var unitNo = fnc_checkNull(d.UNIT_NO);
var taskName = fnc_checkNull(d.TASK_NAME);
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="' + unitNo + '">';
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="' + depth + '">';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="1" style="width:80%;text-align:center;"' + (depth==1 ? ' value="'+unitNo+'"' : '') + '></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="2" style="width:80%;text-align:center;"' + (depth==2 ? ' value="'+unitNo+'"' : '') + '></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="3" style="width:80%;text-align:center;"' + (depth==3 ? ' value="'+unitNo+'"' : '') + '></td>';
tr += '<td><input type="text" name="TASK_NAME_' + objId + '" id="TASK_NAME_' + objId + '" value="' + taskName + '"></td>';
tr += '</tr>';
$("#wbsTaskList").append(tr);
bindLevelInput(objId);
}
}
},
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
}
});
}
function setExcelFileArea(){
setUploadTemplateFile();
}
function setUploadTemplateFile(){
var docType = "WBS_EXCEL_IMPORT";
var deleteCallBackFN = "excelFileDelete";
$.ajax({
url:"/common/getFileList.do",
type:"POST",
data:{"targetObjId":"${OBJID}", "docType":docType},
dataType:"json",
async:false,
success:function(data){
$.each(data, function(i){
var s = "<tr>";
s += "<td><a href='javascript:fnc_downloadFile(\""+data[i].OBJID+"\")'>"+data[i].REAL_FILE_NAME+"</a></td>";
s += "<td>"+data[i].FILE_SIZE+"</td>";
s += "<td><div class='delete_btn' onclick='javascript:fnc_deleteFile(\""+data[i].OBJID+"\", \""+deleteCallBackFN+"\")'></div></td>";
s += "</tr>";
$("#excelImportArea").append(s);
});
parsingExcelFile();
},
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
}
});
}
function excelFileDelete(){
$("#excelImportArea").empty();
$("#excelImportList").hide();
// TOTAL 행만 남기고 나머지 제거
$("#wbsTaskList tr:not(#row_total)").remove();
}
function parsingExcelFile(){
// TOTAL 행만 남기고 나머지 제거
$("#wbsTaskList tr:not(#row_total)").remove();
$.ajax({
url:"/project/parsingExcelFile.do",
type:"POST",
data:{"targetObjId":"${OBJID}", "docType":"WBS_EXCEL_IMPORT"},
dataType:"json",
async:false,
success:function(data){
if(data && 0 < data.length){
for(var i = 0; i < data.length; i++){
var WBS_OBJID = data[i].WBS_OBJID;
var TASK_NAME = data[i].TASK_NAME;
var UNIT_NO = data[i].UNIT_NO;
var lvl = String(UNIT_NO);
var depth = (lvl.match(/\./g) || []).length + 1;
var tr = '<tr id="row_' + WBS_OBJID + '">';
tr += '<td><input type="checkbox" name="rowCheck" value="' + WBS_OBJID + '"></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + WBS_OBJID + '">';
tr += '<input type="hidden" name="UNIT_NO_' + WBS_OBJID + '" id="UNIT_NO_' + WBS_OBJID + '" value="' + UNIT_NO + '">';
tr += '<input type="hidden" name="UPPER_TASK_OBJID_' + WBS_OBJID + '" id="UPPER_TASK_OBJID_' + WBS_OBJID + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + WBS_OBJID + '" id="TASK_LEVEL_' + WBS_OBJID + '" value="' + depth + '">';
tr += '<td>' + (depth==1 ? '<input type="text" class="lvl_input" data-objid="'+WBS_OBJID+'" data-level="1" style="width:80%;text-align:center;" value="'+UNIT_NO+'">' : '<input type="text" class="lvl_input" data-objid="'+WBS_OBJID+'" data-level="1" style="width:80%;text-align:center;">') + '</td>';
tr += '<td>' + (depth==2 ? '<input type="text" class="lvl_input" data-objid="'+WBS_OBJID+'" data-level="2" style="width:80%;text-align:center;" value="'+UNIT_NO+'">' : '<input type="text" class="lvl_input" data-objid="'+WBS_OBJID+'" data-level="2" style="width:80%;text-align:center;">') + '</td>';
tr += '<td>' + (depth==3 ? '<input type="text" class="lvl_input" data-objid="'+WBS_OBJID+'" data-level="3" style="width:80%;text-align:center;" value="'+UNIT_NO+'">' : '<input type="text" class="lvl_input" data-objid="'+WBS_OBJID+'" data-level="3" style="width:80%;text-align:center;">') + '</td>';
tr += '<td><input type="text" name="TASK_NAME_' + WBS_OBJID + '" id="TASK_NAME_' + WBS_OBJID + '" value="' + TASK_NAME + '"></td>';
tr += '</tr>';
$("#wbsTaskList").append(tr);
bindLevelInput(WBS_OBJID);
}
}
},
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
}
});
}
function fileUploadPreProc(){
preFileDelete();
}
function preFileDelete(){
if(confirm("파일을 업로드하시겠습니까?\n기존에 업로드된 파일은 삭제됩니다.")){
$.ajax({
url:"/common/deleteFileInfo.do",
type:"POST",
data:{"targetObjId":"${OBJID}"},
dataType:"json",
async:true,
success:function(data){
excelFileDelete();
},
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
}
});
}
}
function bindLevelInput(objId){
$("#row_" + objId + " .lvl_input").on("input", function(){
var curObjId = $(this).data("objid");
var level = $(this).data("level");
$("#row_" + curObjId + " .lvl_input").not(this).val("");
$("#UNIT_NO_" + curObjId).val($(this).val());
$("#TASK_LEVEL_" + curObjId).val($(this).val() ? level : "");
});
}
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="' + 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>';
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(){
var checked = $("input[name='rowCheck']:checked");
if(checked.length == 0){
Swal.fire('삭제할 행을 선택해 주세요');
return;
}
var removeTargets = [];
var hasChildren = false;
checked.each(function(){
var objId = $(this).val();
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();
}
});
}
function fn_checkWBSTemplateRevision(){
var resultFlag = true;
$.ajax({
type:"POST",
url : "/project/checkWBSTemplateProduct.do",
data : {"PRODUCT":fnc_checkNull($("#product").val()),"TITLE":fnc_checkNull($("#title").val())},
dataType:"json",
async:false,
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
},
success:function(data){
if(0 < data.length){
resultFlag = false;
}
}
});
return resultFlag;
}
function getRowDepth(tr){
var objId = $(tr).find("input[name='WBS_TASK_OBJID']").val();
var taskLevel = $.trim($("#TASK_LEVEL_" + objId).val());
if(taskLevel !== "") return parseInt(taskLevel);
var unitNo = $.trim($("#UNIT_NO_" + objId).val());
if(unitNo === "0") return 0;
if(unitNo === "") return -1;
return (unitNo.match(/\./g) || []).length + 1;
}
function calculateParentRelations(){
var rows = $("#wbsTaskList tr");
var totalObjId = $("#row_total").find("input[name='WBS_TASK_OBJID']").val();
rows.each(function(idx){
var trId = $(this).attr("id");
if(trId === "row_total") return true;
var objId = $(this).find("input[name='WBS_TASK_OBJID']").val();
var depth = getRowDepth(this);
var parentObjId = "";
if(depth === 1){
parentObjId = totalObjId;
} else if(depth > 1){
var prevRows = $(this).prevAll("tr");
prevRows.each(function(){
var prevDepth = getRowDepth(this);
if(prevDepth === depth - 1){
parentObjId = $(this).find("input[name='WBS_TASK_OBJID']").val();
return false;
}
});
}
$("#UPPER_TASK_OBJID_" + objId).val(parentObjId);
});
}
function saveWBS(){
if($("#title").val() == ""){
Swal.fire('제목을 입력해 주세요');
return;
}
if($("input[name='WBS_TASK_OBJID']").length == 0){
Swal.fire('등록할 항목을 추가해 주세요');
return;
}
var isValid = true;
$("input[name='WBS_TASK_OBJID']").each(function(){
var objId = $(this).val();
if($(this).closest("tr").attr("id") === "row_total") return true;
var level = $.trim($("#UNIT_NO_" + objId).val());
var taskName = $.trim($("#TASK_NAME_" + objId).val());
if(level == "" || taskName == ""){
isValid = false;
return false;
}
});
if(!isValid){
Swal.fire('수준과 Unit Name / 공정을 모두 입력해 주세요');
return;
}
if(!isEditMode){
if(!fn_checkWBSTemplateRevision()){
Swal.fire("이미 해당 제목으로 등록된 정보가 존재합니다.");
return;
}
}
calculateParentRelations();
Swal.fire({
title: '저장하시겠습니까?',
icon: 'question',
showCancelButton: true,
confirmButtonText: '확인',
cancelButtonText: '취소'
}).then(function(result){
if(result.isConfirmed){
$.ajax({
type:"POST",
url : "/project/saveExcelUploadWBS.do",
data : $("#form1").serialize(),
dataType:"json",
async:false,
error: function(jqxhr, status, error){
Swal.fire(jqxhr.statusText + ", " + status + ", " + error);
},
success: function(result){
if(null != result){
Swal.fire(result.message);
opener.fn_search();
self.close();
}
}
});
}
});
}
</script>
</head>
<body>
<form name="form1" id="form1" action="" method="post">
<input type="hidden" name="importPopObjid" id="importPopObjid" value="${OBJID}">
<input type="hidden" name="product" id="product" value="${param.product}">
<input type="hidden" name="templateObjId" id="templateObjId" value="${templateObjId}">
<div class="content-box">
<div class="content-box-s">
<div class="plm_menu_name">
<h2>
<span>${empty templateObjId ? 'WBS 템플릿 등록' : 'WBS 템플릿 수정'}</span>
</h2>
</div>
<div id="plmSearchZon" style="width:auto;">
<table>
<tbody>
<tr>
<td class="align_r">
<label for="">제품구분</label>
</td>
<td>
<select name="product1" id="product1" style="" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.product_cd}
</select>
</td>
<td class="align_r">
<label for="title">제목</label>
</td>
<td>
<input id="title" name="title" type="text" value="">
</td>
</tr>
</tbody>
</table>
</div>
<section class="contents_page_basic_margin">
<div class="btn_wrap">
<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();">
</div>
</div>
<div id="excelImportDropZone" class="dropzone" style="height:50px;">Drag & Drop 엑셀 템플릿</div>
<div id="excelImportList">
<table id="excelImportTable" class="excelUploadPopupForm">
<thead>
<tr><td colspan="3">Excel 첨부파일</td></tr>
</thead>
<tbody id="excelImportArea">
</tbody>
</table>
</div>
<div style="width:100%;">
<table class="plm_table" style="width:100%;border-collapse:collapse;">
<colgroup>
<col width="5%" />
<col width="8%" />
<col width="8%" />
<col width="8%" />
<col width="71%" />
</colgroup>
<thead>
<tr class="plm_thead">
<td rowspan="2">선택</td>
<td colspan="3">수준</td>
<td rowspan="2">Unit Name / 공정</td>
</tr>
<tr class="plm_thead">
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</thead>
</table>
</div>
<div style="width:100%;height:calc(100vh - 280px);overflow-y:auto;">
<table class="plm_table" style="width:100%;border-collapse:collapse;">
<colgroup>
<col width="5%" />
<col width="8%" />
<col width="8%" />
<col width="8%" />
<col width="71%" />
</colgroup>
<tbody id="wbsTaskList"></tbody>
</table>
</div>
</section>
</div>
</div>
</form>
</body>
</html>