var selectedPdServiceId; // 제품(서비스) 아이디
var selectedVersionId; // 선택된 버전 아이디
var dataTableRef;
// 최상단 메뉴 변수
var req_state, resource_info, issue_info, period_info, total_days_progress;
var modifiedRows = {};
let fileName = "인력별_연봉정보_템플릿.xlsx";
var pdServiceListData;
var versionListData;
var versionRequirementAssignee = {}; // 버전 - 요구사항 - 담당자 데이터
var allAssignees = {}; // 선택된 버전의 전체 담당자 목록
var allRequirements = {}; // 선택된 버전의 요구사항 전체목록
var requirementKeyList = {}; // 버전 - 요구사항 cid - 요구사항 키 데이터
var assigneeSalaryInfo = {}; // 인력별 연봉정보 데이터
////////////////////////////////////////////////////////////////////////////////////////
//Document Ready
////////////////////////////////////////////////////////////////////////////////////////
function execDocReady() {
var pluginGroups = [
[
"../reference/light-blue/lib/vendor/jquery.ui.widget.js",
"../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Templates_js_tmpl.js",
"../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Load-Image_js_load-image.js",
"../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Canvas-to-Blob_js_canvas-to-blob.js",
"../reference/light-blue/lib/jquery.iframe-transport.js",
"../reference/light-blue/lib/jquery.fileupload.js",
"../reference/light-blue/lib/jquery.fileupload-fp.js",
"../reference/light-blue/lib/jquery.fileupload-ui.js",
"../reference/lightblue4/docs/lib/widgster/widgster.js",
"../reference/lightblue4/docs/lib/slimScroll/jquery.slimscroll.min.js"
],
[
"../reference/jquery-plugins/select2-4.0.2/dist/css/select2_lightblue4.css",
"../reference/jquery-plugins/lou-multi-select-0.9.12/css/multiselect-lightblue4.css",
"../reference/jquery-plugins/multiple-select-1.5.2/dist/multiple-select-bluelight.css",
"../reference/jquery-plugins/select2-4.0.2/dist/js/select2.min.js",
"../reference/jquery-plugins/lou-multi-select-0.9.12/js/jquery.quicksearch.js",
"../reference/jquery-plugins/lou-multi-select-0.9.12/js/jquery.multi-select.js",
"../reference/jquery-plugins/multiple-select-1.5.2/dist/multiple-select.min.js",
"../reference/jquery-plugins/jspreadsheet-ce-4.13.1/dist/jsuites.js",
"../reference/jquery-plugins/jspreadsheet-ce-4.13.1/dist/index.js",
"../reference/jquery-plugins/jspreadsheet-ce-4.13.1/dist/jsuites.css",
"../reference/jquery-plugins/jspreadsheet-ce-4.13.1/dist/jspreadsheet.css",
"../reference/jquery-plugins/jspreadsheet-ce-4.13.1/dist/jspreadsheet.datatables.css",
"../reference/jquery-plugins/jspreadsheet-ce-4.13.1/dist/jspreadsheet.theme.css",
"./js/common/jspreadsheet/spreadsheet.js",
"./css/jspreadsheet/custom_sheet.css"
],
[
"../reference/jquery-plugins/dataTables-1.10.16/media/css/jquery.dataTables_lightblue4.css",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/css/responsive.dataTables_lightblue4.css",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/css/select.dataTables_lightblue4.css",
"../reference/jquery-plugins/dataTables-1.10.16/media/js/jquery.dataTables.min.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/js/dataTables.responsive.min.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/js/dataTables.select.min.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/RowGroup/js/dataTables.rowsGroup.min.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/dataTables.buttons.min.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.html5.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.print.js",
"../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/jszip.min.js",
],
[
//chart Colors
"./js/common/colorPalette.js",
// Apache Echarts
"../reference/jquery-plugins/echarts-5.4.3/dist/echarts.min.js",
// 투입 인력별 요구사항 관여 차트
"../reference/jquery-plugins/Jit-2.0.1/jit.js",
"../reference/jquery-plugins/Jit-2.0.1/Examples/css/Treemap.css",
// 제품-버전-투입인력 차트
"../reference/jquery-plugins/d3-sankey-v0.12.3/d3-sankey.min.js",
// d3-5.16.0 네트워크 차트
"../reference/jquery-plugins/d3-5.16.0/d3.min.js",
// 최상단 메뉴
"./js/analysis/topmenu/topMenuApi.js",
"./js/common/chart/eCharts/basicRadar.js",
"./js/common/chart/d3/sankey.js"
],
// 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다.
];
loadPluginGroupsParallelAndSequential(pluginGroups)
.then(function() {
//vfs_fonts 파일이 커서 defer 처리 함.
setTimeout(function () {
var script = document.createElement("script");
script.src = "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/vfs_fonts.js";
script.defer = true; // defer 속성 설정
document.head.appendChild(script);
}, 5000); // 5초 후에 실행됩니다.
//pdfmake 파일이 커서 defer 처리 함.
setTimeout(function () {
var script = document.createElement("script");
script.src = "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/pdfmake.min.js";
script.defer = true; // defer 속성 설정
document.head.appendChild(script);
}, 5000); // 5초 후에 실행됩니다.
// 사이드 메뉴 색상 설정
$(".widget").widgster();
setSideMenu("sidebar_menu_analysis", "sidebar_menu_analysis_cost");
//제품(서비스) 셀렉트 박스 이니시에이터
makePdServiceSelectBox();
//버전 멀티 셀렉트 박스 이니시에이터
makeVersionMultiSelectBox();
// 높이 조정
$('.top-menu-div').matchHeight({
target: $('.top-menu-div-scope')
});
비용분석계산버튼();
})
.catch(function(e) {
console.error("플러그인 로드 중 오류 발생");
console.error(e);
});
}
///////////////////////
//제품 서비스 셀렉트 박스
//////////////////////
function makePdServiceSelectBox() {
//제품 서비스 셀렉트 박스 이니시에이터
$(".chzn-select").each(function() {
$(this).select2($(this).data());
});
//제품 서비스 셀렉트 박스 데이터 바인딩
$.ajax({
url: "/auth-user/api/arms/pdServicePure/getPdServiceMonitor.do",
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
progress: true,
statusCode: {
200: function(data) {
//////////////////////////////////////////////////////////
pdServiceListData = [];
for (var k in data.response) {
var obj = data.response[k];
pdServiceListData.push({ "pdServiceId": obj.c_id, "pdServiceName": obj.c_title });
var newOption = new Option(obj.c_title, obj.c_id, false, false);
$("#selected_pdService").append(newOption).trigger("change");
}
//////////////////////////////////////////////////////////
console.log("[analysisCost :: makePdServiceSelectBox] :: pdServiceListData => ");
console.log(pdServiceListData);
}
}
});
$("#selected_pdService").on("select2:open", function() {
//슬림스크롤
makeSlimScroll(".select2-results__options");
});
// --- select2 ( 제품(서비스) 검색 및 선택 ) 이벤트 --- //
$("#selected_pdService").on("select2:select", function(e) {
selectedPdServiceId = $("#selected_pdService").val();
차트초기화();
modifiedRows = {}; // 연봉정보 변경점 초기화
//refreshDetailChart(); 변수값_초기화();
// 제품( 서비스 ) 선택했으니까 자동으로 버전을 선택할 수 있게 유도
// 디폴트는 base version 을 선택하게 하고 ( select all )
//~> 이벤트 연계 함수 :: Version 표시 jsTree 빌드
bind_VersionData_By_PdService();
});
} // end makePdServiceSelectBox()
////////////////////////////////////////
//버전 멀티 셀렉트 박스
////////////////////////////////////////
function makeVersionMultiSelectBox() {
//버전 선택시 셀렉트 박스 이니시에이터
$(".multiple-select").multipleSelect({
filter: true,
onClose: function() {
console.log("onOpen event fire!\n");
var checked = $("#checkbox1").is(":checked");
var endPointUrl = "";
var versionTag = $(".multiple-select").val();
console.log("[ analysisCost :: makeVersionMultiSelectBox ] :: versionTag");
console.log(versionTag);
selectedVersionId = versionTag.join(",");
if (versionTag === null || versionTag == "") {
alert("버전이 선택되지 않았습니다.");
$(".ms-parent").css("z-index", 1000);
return;
}
차트초기화();
modifiedRows = {}; // 연봉정보 변경점 초기화
// 최상단 메뉴 세팅
TopMenuApi.톱메뉴_초기화();
TopMenuApi.톱메뉴_세팅();
버전별_요구사항별_인력정보가져오기(selectedPdServiceId, selectedVersionId);
$(".ms-parent").css("z-index", 1000);
},
onOpen: function() {
console.log("open event");
$(".ms-parent").css("z-index", 9999);
}
});
}
function productCostChart() {
const url = new UrlBuilder()
.setBaseUrl('/auth-admin/api/arms/analysis/cost/product-accumulate-cost-by-month')
.addQueryParam('pdServiceLink', selectedPdServiceId)
.addQueryParam('pdServiceVersionLinks', selectedVersionId)
.build();
$.ajax({
url: url,
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
progress: true,
statusCode: {
200: function(apiResponse) {
var line = apiResponse.line;
var bar = apiResponse.bar;
var candleStick = apiResponse.candleStick;
console.log(" [ analysisCost :: line ] :: response data -> " + JSON.stringify(line));
console.log(" [ analysisCost :: bar ] :: response data -> " + JSON.stringify(bar));
console.log(" [ analysisCost :: candleStick ] :: response data -> " + JSON.stringify(candleStick));
var maxCost = Math.max(...Object.values(line));
var productChartDom = document.getElementById('product-accumulate-cost-by-month');
$(productChartDom).height("500px");
var productCostChart = echarts.init(productChartDom);
var option;
var dates = Object.keys(line);
var lineCosts = Object.values(line);
var barCosts = Object.values(bar);
var candleStickCosts = Object.values(candleStick);
option = {
dataZoom: [{
type: 'slider',
start: 0,
end: 100
}],
tooltip: {
trigger: 'axis',
formatter: function(params) {
var lineTooltip = new Intl.NumberFormat().format(params[0].value);
var barTooltip = new Intl.NumberFormat().format(params[1].value);
var candleStickTooltip = params[2] ? params[2].value : null;
var candleText = '';
if (candleStickTooltip) {
var 시가 = new Intl.NumberFormat().format(candleStickTooltip[1]);
var 종가 = new Intl.NumberFormat().format(candleStickTooltip[2]);
var 최저가 = new Intl.NumberFormat().format(candleStickTooltip[3]);
var 최고가 = new Intl.NumberFormat().format(candleStickTooltip[4]);
candleText = `시가: ${시가}
종가: ${종가}
최저가: ${최저가}
최고가: ${최고가}`;
return '날짜: ' + params[0].name + '
성과 기준선: ' + lineTooltip + '
성과: ' + barTooltip + (candleText ? '
' + candleText : '');
} else {
return '날짜: ' + params[0].name + '
성과 기준선: ' + lineTooltip + '
성과: ' + barTooltip;
}
}
},
xAxis: {
type: 'category',
data: dates,
axisLabel: {
textStyle: {
color: 'white',
},
},
},
yAxis: [
{
type: 'value',
min: 0,
max: maxCost,
interval: Math.floor(maxCost / 10),
name: '누적 성과 비용',
nameTextStyle: {
color: 'white',
},
axisLabel: {
textStyle: {
color: 'white',
},
},
},
{
type: 'value',
scale: true,
name: '총 연봉 비용 변동 추이',
nameTextStyle: {
color: 'white',
},
axisLabel: {
textStyle: {
color: 'white',
},
},
}
],
legend: {
data: ['누적 성과 기준선', '누적 성과 비용', '총 연봉 비용 변동 추이'],
textStyle: {
color: 'white',
},
},
series: [{
name: '누적 성과 기준선',
data: lineCosts,
type: 'line',
yAxisIndex: 0,
textStyle: {
color: 'white',
},
}, {
name: '누적 성과 비용',
data: barCosts,
type: 'bar',
yAxisIndex: 0,
textStyle: {
color: 'white',
},
},
{
name: '총 연봉 비용 변동 추이',
type: 'candlestick',
data: candleStickCosts,
yAxisIndex: 1,
itemStyle: {
color: 'red', // 양봉 색상
color0: 'blue', // 음봉 색상
borderColor: 'red', // 테두리 색상
borderColor0: 'blue', // 음봉 테두리 색상
// borderWidth: 3, // 테두리 두께
},
textStyle: {
color: 'white',
},
// barWidth: 3, // 캔들 가로 두께
}]
};
if (option && typeof option === 'object') {
productCostChart.setOption(option);
}
window.addEventListener('resize', productCostChart.resize);
}
}
});
}
function bind_VersionData_By_PdService() {
$(".multiple-select option").remove();
$.ajax({
url: "/auth-user/api/arms/pdService/getVersionList?c_id=" + $("#selected_pdService").val(),
type: "GET",
dataType: "json",
progress: true,
statusCode: {
200: function(data) {
//////////////////////////////////////////////////////////
//console.log(data.response);
var pdServiceVersionIds = [];
versionListData = {};
// 버전 목록 데이터 및 비용 초기화
for (var k in data.response) {
var obj = data.response[k];
pdServiceVersionIds.push(obj.c_id);
obj.버전비용 = 0;
versionListData[obj.c_id] = obj;
var newOption = new Option(obj.c_title, obj.c_id, true, false);
$(".multiple-select").append(newOption);
}
console.log("[ analysisCost :: bind_VersionData_By_PdService ] :: versionTag");
selectedVersionId = pdServiceVersionIds.join(",");
// 최상단 메뉴 세팅
TopMenuApi.톱메뉴_초기화();
TopMenuApi.톱메뉴_세팅();
modifiedRows = {}; // 연봉정보 변경점 초기화
버전별_요구사항별_인력정보가져오기(selectedPdServiceId, selectedVersionId);
if (data.length > 0) {
console.log("display 재설정.");
}
//$('#multiversion').multipleSelect('refresh');
//$('#edit_multi_version').multipleSelect('refresh');
$(".multiple-select").multipleSelect("refresh");
//////////////////////////////////////////////////////////
}
}
});
}
////////////////////////////////////////////////////////////////////////////////////////
// 연봉 정보 수정 PUT API 호출
////////////////////////////////////////////////////////////////////////////////////////
function 버전별_요구사항별_인력정보가져오기(pdServiceLink, pdServiceVersionLinks) {
$(".spinner").html(
' ' +
"요구사항별 인력정보를 조회 중 입니다..."
);
const url = new UrlBuilder()
.setBaseUrl('/auth-admin/api/arms/analysis/cost/version-req-assignees')
.addQueryParam('pdServiceLink', pdServiceLink)
.addQueryParam('pdServiceVersionLinks', pdServiceVersionLinks)
.addQueryParam('크기', 1000)
.addQueryParam('하위_크기', 1000)
.addQueryParam('컨텐츠_보기_여부', true)
.build();
$.ajax({
url: url,
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
progress: true,
statusCode: {
200: function(apiResponse) {
console.log(" [ analysisCost :: 버전별_요구사항별_인력정보가져오기 ] :: response data -> ");
console.log(apiResponse);
versionRequirementAssignee = apiResponse.versionRequirementAssignee;
allAssignees = apiResponse.allAssignees;
console.log(versionRequirementAssignee);
console.log(allAssignees);
Object.keys(allAssignees).forEach((key) => {
allAssignees[key].인력별소모비용 = 0;
allAssignees[key].완료성과 = 0;
});
costInput(allAssignees, pdServiceVersionLinks);
}
}
});
}
function formatDate(date) {
return new Date(date).toISOString().split('T')[0];
}
// 엑셀 파일 업로드
function file_upload_setting() {
// 업로드 영역 로드
$('.body-middle').html(`