Index: arms/html/analysisTime/content-container.html =================================================================== diff -u -r6200e258f449c7d6aae3b651fb5510cf10cd7806 -r8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb --- arms/html/analysisTime/content-container.html (.../content-container.html) (revision 6200e258f449c7d6aae3b651fb5510cf10cd7806) +++ arms/html/analysisTime/content-container.html (.../content-container.html) (revision 8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb) @@ -61,7 +61,7 @@
-
+
@@ -111,7 +111,7 @@
-
+
종합 진행 현황
@@ -120,7 +120,7 @@
-
+

@@ -170,7 +170,7 @@

-
+
일정(Time) 현황
@@ -193,7 +193,7 @@
-
+

Index: arms/js/analysis/resource/chart/basicRadar.js =================================================================== diff -u -r718855ecf93084aa751f3f5dc50a0caaa61b1b90 -r8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb --- arms/js/analysis/resource/chart/basicRadar.js (.../basicRadar.js) (revision 718855ecf93084aa751f3f5dc50a0caaa61b1b90) +++ arms/js/analysis/resource/chart/basicRadar.js (.../basicRadar.js) (revision 8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb) @@ -84,7 +84,9 @@ } } - let titleOption = {text: titleText, top: 25, + let titleOption = { + text: titleText, + top: 0, textStyle: { color: titleColor, fontSize: 13 @@ -96,9 +98,14 @@ /*tooltip: { trigger: 'axis' },*/ + grid: { + top: '15%', + containLabel: false + }, legend: { data: ['제품(서비스) 설정기준','현재 진행상황'], // left: "left", + top: "10%", textStyle: { color: 'white', // 이름의 텍스트 색상 설정 fontStyle: 'normal', // 이름의 텍스트 스타일 설정 (예: italic, normal) Index: arms/js/analysis/topmenu/basicRadar.js =================================================================== diff -u --- arms/js/analysis/topmenu/basicRadar.js (revision 0) +++ arms/js/analysis/topmenu/basicRadar.js (revision 8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb) @@ -0,0 +1,315 @@ +function exBasicChart() { + var chartDom = document.getElementById('main'); + var myChart = echarts.init(chartDom); + var option; + + option = { + title: { + text: 'Basic Radar Chart' + }, + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Target Business', 'Actual Progress'] + }, + radar: { + // shape: 'circle', + indicator: [ + { text: 'Resource', max: 5 }, + { text: 'Requirement/Subtask', max: 116 }, + { text: 'schedule', max: 120 } + ], + axisLine: { + lineStyle: { + color: 'rgba(3, 3, 3, 0.5)' + } + } + }, + series: [ + { + name: 'Budget vs spending', + type: 'radar', + tooltip: { + trigger: 'item' + }, + areaStyle: {}, + data: [ + { + value: [5, 116, 120], + name: 'Target Business', + areaStyle: { + opacity: 0.1 + } + }, + { + value: [5, 11, 100], + name: 'Actual Progress', + areaStyle: { + opacity: 0.5 + } + } + ] + } + ] + }; + + option && myChart.setOption(option); +} + +function drawBasicRadar(target,objectiveArr,currentProgressArr) { + let chartDom = document.getElementById(target); + let myChart = echarts.init(chartDom); + let option; + let scheduleMax ="-"; + let titleText = ""; + let titleColor = "white"; + let progress = ""; + + if(objectiveArr.length !== 0) { + if (objectiveArr[1] !== "" && objectiveArr[1] !== 0) { + progress = (currentProgressArr[1]*100/objectiveArr[1]).toFixed(1); + titleText+= "진행률: " + progress + "%, "; + } + let dateDiff = Math.abs(objectiveArr[2] - currentProgressArr[2]).toFixed(0); + + if (objectiveArr[2] >= currentProgressArr[2]) { + scheduleMax = objectiveArr[2]; + titleText += "일정: " + dateDiff +"일 남음"; + titleColor = 'rgb(164,198,255)'; + } else { + scheduleMax = currentProgressArr[2]; + titleText += "일정: " + dateDiff +"일 초과"; + titleColor = 'rgb(219,42,52)'; + } + } + + let titleOption = { + text: titleText, + top: 0, + textStyle: { + color: titleColor, + fontSize: 13 + } + }; + + option = { + title: titleOption, + /*tooltip: { + trigger: 'axis' + },*/ + grid: { + top: '15%', + containLabel: false + }, + legend: { + data: ['제품(서비스) 설정기준','현재 진행상황'], // + left: "left", + top: "10%", + textStyle: { + color: 'white', // 이름의 텍스트 색상 설정 + fontStyle: 'normal', // 이름의 텍스트 스타일 설정 (예: italic, normal) + fontSize: 11 // 이름의 텍스트 크기 설정 + } + }, + radar: { + // shape: 'circle', + indicator: [ + { name: '작업자수: ' + objectiveArr[0]+'명', max: objectiveArr[0] }, + { name: '요구사항: ' + objectiveArr[1]+'개', max: objectiveArr[1] }, + { name: '일정: ' + objectiveArr[2]+'일', max: scheduleMax } + ], + name: { + textStyle: { + color: 'white', // 데이터 전체의 이름 폰트 색상 설정 + fontSize: 12 // 데이터 전체의 이름 폰트 크기 설정 + } + }, + nameGap: 30, + center: ["52%","63%"], + radius: "55%", + axisLine: { + lineStyle: { + color: 'rgba(244, 244, 244, 0.5)' + } + }, + splitLine: { + lineStyle: { + color: 'gray' + } + } + }, + series: [ + { + name: 'Budget vs spending', + type: 'radar', + tooltip: { + trigger: 'item' + }, + areaStyle: {}, + data: [ + { + value: objectiveArr, + name: '제품(서비스) 설정기준', + symbol:'triangle', + symbolSize: 10, + areaStyle: { + opacity: 0.3 + } + }, + { + value: currentProgressArr, + name: '현재 진행상황', + symbol:'roundRect', // circle, rect, roundRect, triangle, diamond, pin, arrow + symbolSize: 10, + label: { + show: true, + textStyle: { + color: 'rgb(162,198,255)', + fontsize: 12, + backgroundColor: 'rgba(51,51,51,0.8)', + padding: [3, 5], + borderRadius: 3, + }, + formatter: function (params) { + return params.value; + } + }, + areaStyle: { + opacity: 0.6 + } + } + ] + } + ] + }; + + option && myChart.setOption(option,true); + + window.addEventListener('resize', function () { + myChart.resize(); + }); +} + +function drawBasicRadarForDashBoard(target,objectiveArr,currentProgressArr) { + let chartDom = document.getElementById(target); + let myChart = echarts.init(chartDom); + let option; + let scheduleMax ="-"; + let titleText = ""; + let titleColor = "white"; + let progress = ""; + if(objectiveArr.length !== 0) { + if (objectiveArr[1] !== "" || objectiveArr[1] !== 0) { + progress = (currentProgressArr[1]*100/objectiveArr[1]).toFixed(1); + titleText+= "진행률: " + progress + "%, "; + } + let dateDiff = Math.abs(objectiveArr[2] - currentProgressArr[2]).toFixed(0); + + if (objectiveArr[2] >= currentProgressArr[2]) { + scheduleMax = objectiveArr[2]; + titleText += "일정: " + dateDiff +"일 남음"; + titleColor = 'rgb(164,198,255)'; + } else { + scheduleMax = currentProgressArr[2]; + titleText += "일정: " + dateDiff +"일 초과"; + titleColor = 'rgb(219,42,52)'; + } + } + + let titleOption = {text: titleText, top: 25, + textStyle: { + color: titleColor, + fontSize: 13 + } + }; + + option = { + title: titleOption, + /*tooltip: { + trigger: 'axis' + },*/ + /*legend: { + data: ['제품(서비스) 설정기준','현재 진행상황'], // + left: "left", + textStyle: { + color: 'white', // 이름의 텍스트 색상 설정 + fontStyle: 'normal', // 이름의 텍스트 스타일 설정 (예: italic, normal) + fontSize: 11 // 이름의 텍스트 크기 설정 + } + },*/ + radar: { + // shape: 'circle', + indicator: [ + { name: '작업자수: ' + objectiveArr[0]+'명', max: objectiveArr[0] }, + { name: '요구사항: ' + objectiveArr[1]+'개', max: objectiveArr[1] }, + { name: '일정: ' + objectiveArr[2]+'일', max: scheduleMax } + ], + name: { + textStyle: { + color: 'white', // 데이터 전체의 이름 폰트 색상 설정 + fontSize: 12 // 데이터 전체의 이름 폰트 크기 설정 + } + }, + nameGap: 25, + center: ["50%","50%"], + radius: "50%", + axisLine: { + lineStyle: { + color: 'rgba(244, 244, 244, 0.5)' + } + }, + splitLine: { + lineStyle: { + color: 'gray' + } + } + }, + series: [ + { + name: 'Budget vs spending', + type: 'radar', + tooltip: { + trigger: 'item' + }, + areaStyle: {}, + data: [ + { + value: objectiveArr, + name: '제품(서비스) 설정기준', + symbol:'triangle', + symbolSize: 10, + areaStyle: { + opacity: 0.3 + } + }, + { + value: currentProgressArr, + name: '현재 진행상황', + symbol:'roundRect', // circle, rect, roundRect, triangle, diamond, pin, arrow + symbolSize: 10, + label: { + show: true, + textStyle: { + color: 'rgb(162,198,255)', + fontsize: 12, + backgroundColor: 'rgba(51,51,51,0.8)', + padding: [3, 5], + borderRadius: 3, + }, + formatter: function (params) { + return params.value; + } + }, + areaStyle: { + opacity: 0.6 + } + } + ] + } + ] + }; + + option && myChart.setOption(option,true); +} + Index: arms/js/analysis/topmenu/topMenu.js =================================================================== diff -u --- arms/js/analysis/topmenu/topMenu.js (revision 0) +++ arms/js/analysis/topmenu/topMenu.js (revision 8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb) @@ -0,0 +1,251 @@ +// 최상단 세팅 +function getReqAndLinkedIssueData(pdservice_id, pdServiceVersionLinks) { + $.ajax({ + url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, + type: "GET", + data: { "서비스아이디" : pdservice_id, + "pdServiceVersionLinks" : pdServiceVersionLinks, + "메인그룹필드" : "isReq", + "하위그룹필드들": "assignee.assignee_emailAddress.keyword", + "컨텐츠보기여부" : true, + "크기" : 1000}, + contentType: "application/json;charset=UTF-8", + dataType: "json", + progress: true, + statusCode: { + 200: function (data) { + //전체 요구사항, 연결이슈 + let all_req_count = 0; + let all_linkedIssue_subtask_count = 0; + //담당자존재 요구사항, 연결이슈 + let assignedReqSum = 0; + let assignedSubtaskSum = 0; + //담당자 미지정 요구사항,연결이슈 + let no_assigned_req_count = 0; + let no_assigned_linkedIssue_subtask_count =0; + + if (data["전체합계"] === 0) { + alert("작업자 업무 처리현황 데이터가 없습니다."); + 수치_초기화(); + } else { + let isReqGrpArr = data["검색결과"]["group_by_isReq"]; + isReqGrpArr.forEach((elementArr,index) => { + if(elementArr["필드명"] == "true") { + all_req_count = elementArr["개수"]; + let tempArrReq= elementArr["하위검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; + tempArrReq.forEach(e => { + assignedReqSum+=e["개수"]; + }); + no_assigned_req_count = all_req_count - assignedReqSum; + } + if(elementArr["필드명"] == "false") { + all_linkedIssue_subtask_count = elementArr["개수"]; + let tempArrReq= elementArr["하위검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; + tempArrReq.forEach(e => { + assignedSubtaskSum+=e["개수"]; + }); + no_assigned_linkedIssue_subtask_count = all_linkedIssue_subtask_count - assignedSubtaskSum; + } + }); + // 총 요구사항 및 연결이슈 수 + $('#total_req_count').text(all_req_count); + $('#total_linkedIssue_subtask_count').text(all_linkedIssue_subtask_count); + + // 담당자 지정 - 요구사항 및 연결이슈 + req_count = assignedReqSum; + $('#req_count').text(assignedReqSum); + linkedIssue_subtask_count = assignedSubtaskSum; + $('#linkedIssue_subtask_count').text(assignedSubtaskSum); + + // 담당자 미지정 - 요구사항 및 연결이슈 + $('#no_assigned_req_count').text(no_assigned_req_count); + $('#no_assigned_linkedIssue_subtask_count').text(no_assigned_linkedIssue_subtask_count); + + } + // 작업자수 및 평균계산 + getAssigneeInfo(pdservice_id,pdServiceVersionLinks); + }, + error: function (e) { + jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); + } + } + }); +} + +function getAssigneeInfo(pdservice_id, pdServiceVersionLinks) { + mailAddressList = []; + $.ajax({ + url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, + type: "GET", + data: { "서비스아이디" : pdservice_id, + "pdServiceVersionLinks" : pdServiceVersionLinks, + "메인그룹필드" : "assignee.assignee_emailAddress.keyword", + "컨텐츠보기여부" : true, + "크기" : 1000}, + contentType: "application/json;charset=UTF-8", + dataType: "json", + progress: true, + statusCode: { + 200: function (data) { + let assigneesArr = data["검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; + + //제품(서비스)에 투입된 총 인원수 + resource_count = assigneesArr.length; + if (data["전체합계"] === 0) { //담당자(작업자) 없음. + $('#resource_count').text("-"); + $('#avg_req_count').text("-"); + $('#avg_linkedIssue_count').text("-"); + //refreshDetailChart(); //상세 바차트 초기화 + } else { + //필요시 사용 + assigneesArr.forEach((element,idx) =>{ + mailAddressList.push(element["필드명"]); + }); + $('#resource_count').text(resource_count); + $('#avg_req_count').text((req_count/resource_count).toFixed(1)); + $('#avg_linkedIssue_count').text((linkedIssue_subtask_count/resource_count).toFixed(1)); + } + getReqInActionCount(pdservice_id,pdServiceVersionLinks); + //모든작업자 - 상세차트 + //drawDetailChartForAll(pdservice_id, pdServiceVersionLinks,mailAddressList); + }, + error: function (e) { + jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); + } + } + }); +} + +function getReqInActionCount(pdService_id, pdServiceVersionLinks) { + $.ajax({ + url: "/auth-user/api/arms/analysis/resource/reqInAction/"+pdService_id, + type: "GET", + data: { "서비스아이디" : pdService_id, + "pdServiceVersionLinks" : pdServiceVersionLinks, + "isReq" : false, + "메인그룹필드" : "parentReqKey", + "컨텐츠보기여부" : true, + "크기" : 1000}, + contentType: "application/json;charset=UTF-8", + dataType: "json", + progress: true, + statusCode: { + 200: function (data) { + req_in_action = data["parentReqCount"]; + let req_in_wait_count = req_count-req_in_action; + if (req_in_action === "") { + $("#req_in_action_count").text("-"); + $('#linkedIssue_subtask_count_per_req_in_action').text("-"); + } else { + if(req_in_action === 0) { + $('#linkedIssue_subtask_count_per_req_in_action').text("-"); + } else { + $("#req_in_action_count").text(req_in_action); //진행중 요구사항 + $("#req_in_action_avg").text((resource_count !== 0 ? (req_in_action/resource_count).toFixed(1) : "-")); + $("#req_in_wait_count").text(req_in_wait_count); //작업대기 요구사항 + $("#req_in_wait_avg").text((resource_count !== 0 ? (req_in_wait_count/resource_count).toFixed(1) : "-")); + $('#linkedIssue_subtask_count_per_req_in_action').text((linkedIssue_subtask_count/req_in_action).toFixed(1)); + } + } + // 리소스-요구사항-일정 레이더차트 + getScheduleToDrawRadarChart(pdService_id,pdServiceVersionLinks); + }, + error: function (e) { + jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); + } + } + }); +} + + +function getScheduleToDrawRadarChart(pdservice_id, pdServiceVersionLinks) { + + let 선택한_버전_세트 = new Set(); + pdServiceVersionLinks.split(",").forEach( e => 선택한_버전_세트.add({c_id:e})); + + if(선택한_버전_세트.size !== 0) { + $.ajax({ + url: "/auth-user/api/arms/pdServiceVersion/getVersionListBy.do", + data: { c_ids: pdServiceVersionLinks}, + type: "GET", + contentType: "application/json;charset=UTF-8", + dataType: "json", + progress: true, + statusCode: { + 200: function (json) { + + let 버전목록 = json; + let 가장이른시작날짜; + let 가장늦은종료날짜; + if(버전목록.length !== 0) { + for (let i=0; i<버전목록.length; i++) { + if (i === 0) { + 가장이른시작날짜 = 버전목록[i].c_pds_version_start_date; + 가장늦은종료날짜 = 버전목록[i].c_pds_version_end_date; + } else { + if(버전목록[i]["c_pds_version_start_date"] < 가장이른시작날짜) { + 가장이른시작날짜 = 버전목록[i]["c_pds_version_start_date"]; + } + if(버전목록[i]["c_pds_version_end_date"] > 가장늦은종료날짜) { + 가장늦은종료날짜 = 버전목록[i]["c_pds_version_end_date"]; + } + } + } + } + + if(가장이른시작날짜 ==="start") { 가장이른시작날짜 = new Date(); } + if(가장늦은종료날짜 ==="end") {가장늦은종료날짜 = new Date(); } + let objectiveDateDiff = getDateDiff(가장이른시작날짜, 가장늦은종료날짜); + let currentDateDiff = getDateDiff(가장이른시작날짜, new Date()); + + let 목표데이터_배열 = [resource_count, req_count, objectiveDateDiff]; + let 현재진행데이터_배열 = [resource_count, req_in_action, currentDateDiff]; + let dateDiff = Math.abs(objectiveDateDiff - currentDateDiff).toFixed(0); + + $("#progressDateRate").text((currentDateDiff*100/(objectiveDateDiff === 0 ? 1 : objectiveDateDiff)).toFixed(0)+"%"); + if(objectiveDateDiff>= currentDateDiff) { + $("#remaining_days").text("D-"+dateDiff); + } else { + $("#remaining_days").text("D+"+dateDiff); + $("#remaining_days").css("color", "rgb(219,42,52)"); + } + drawBasicRadar("radarPart",목표데이터_배열, 현재진행데이터_배열); + + } + } + }); + } + +} + +const getDateDiff = (d1, d2) => { + const date1 = new Date(d1); + const date2 = new Date(d2); + + const diffDate = date1.getTime() - date2.getTime(); + + return +(Math.abs(diffDate / (1000 * 60 * 60 * 24)).toFixed(0)); // 밀리세컨 * 초 * 분 * 시 = 일 + +} + +function 수치_초기화() { + req_count =0 + linkedIssue_subtask_count =0 + resource_count =0; + req_in_action =0; + $("#total_req_count").text("-"); // 총 요구사항 수(미할당포함) + $("#no_assigned_req_count").text("-"); // 미할당 요구사항 수 + $("#req_count").text("-"); // 작업 대상 요구사항 수 + $("#req_in_action_count").text("-"); // 작업중 요구사항 + + $("#total_linkedIssue_subtask_count").text("-"); //연결이슈 수 + $("#no_assigned_linkedIssue_subtask_count").text("-"); //미할당 연결이슈 수 + $("#linkedIssue_subtask_count_per_req_in_action").text("-"); // 작업중 요구사항에 대한 연결이슈 평균 + + $("#resource_count").text("-"); // 작업자수 + $("#req_in_action_avg").text("-"); // 작업중 요구사항 평균 + $("#avg_linkedIssue_count").text("-"); // 연결이슈 평균 + + let radarChart = echarts.getInstanceByDom(document.getElementById("radarPart")); + if(radarChart) { radarChart.dispose(); } +} \ No newline at end of file Index: arms/js/analysisScope.js =================================================================== diff -u -rd2347deffd142aa371e8f770a8412c357196a5c6 -r8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb --- arms/js/analysisScope.js (.../analysisScope.js) (revision d2347deffd142aa371e8f770a8412c357196a5c6) +++ arms/js/analysisScope.js (.../analysisScope.js) (revision 8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb) @@ -24,7 +24,7 @@ "../reference/light-blue/lib/jquery.fileupload-fp.js", "../reference/light-blue/lib/jquery.fileupload-ui.js", //d3 - "../reference/jquery-plugins/d3-v4.13.0/d3.v4.min.js", + "js/analysisTime/d3.v5.min.js", //chart Colors "./js/dashboard/chart/colorPalette.js", // Apache Echarts @@ -51,10 +51,8 @@ "../reference/jquery-plugins/d3-sankey-v0.12.3/d3-sankey.min.js", ], [ // 생성한 차트 import - "js/common/table.js", - "js/analysis/api/resourceApi.js", - "js/analysis/table/workerStatusTable.js", - "js/analysis/resource/chart/basicRadar.js" + "js/analysis/topmenu/basicRadar.js", + "js/analysis/topmenu/topMenu.js" ], [ "../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", @@ -165,12 +163,16 @@ // 요구사항 및 연결이슈 통계 getReqAndLinkedIssueData(selectedPdServiceId, selectedVersionId); + + // 네트워크 차트 + statisticsMonitor($("#selected_pdService").val(), selectedVersionId); + getRelationJiraIssueByPdServiceAndVersions($("#selected_pdService").val(), selectedVersionId); } }); } -function bind_VersionData_By_PdService() { +function bind_VersionData_By_PdService() { $(".multiple-select option").remove(); $.ajax({ url: "/auth-user/api/arms/pdService/getVersionList.do?c_id=" + $("#selected_pdService").val(), @@ -193,6 +195,10 @@ // 요구사항 및 연결이슈 통계 getReqAndLinkedIssueData(selectedPdServiceId, selectedVersionId); + // 네트워크 차트 + statisticsMonitor($("#selected_pdService").val(), selectedVersionId); + getRelationJiraIssueByPdServiceAndVersions($("#selected_pdService").val(), selectedVersionId); + if (data.length > 0) { console.log("display 재설정."); } @@ -624,9 +630,9 @@ var height = 500; var simulation = d3.forceSimulation(nodes) - .force("link", d3.forceLink(links).id( function(d){ return d.id; })) - .force("charge", d3.forceManyBody().strength(-100)) - .force("center", d3.forceCenter(width / 3, height / 3)); + .force("link", d3.forceLink(links).id( function(d){ return d.id; }).distance(80)) + .force("charge", d3.forceManyBody().strength(-800)) + .force("center", d3.forceCenter(width / 2, height / 2)); // .force("collide",d3.forceCollide().radius( function(d){ return d.value*8}) ); //simulation.stop(); // stop 필요한가? @@ -784,261 +790,3 @@ networkGraph.createGraph(); } -//email에서 ID 만 가져오기 -function getIdFromMail (param) { - var full_str = param; - var indexOfAt = full_str.indexOf('@'); - return full_str.substring(0,indexOfAt); -} - -// 최상단 세팅 -function getReqAndLinkedIssueData(pdservice_id, pdServiceVersionLinks) { - $.ajax({ - url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, - type: "GET", - data: { "서비스아이디" : pdservice_id, - "pdServiceVersionLinks" : pdServiceVersionLinks, - "메인그룹필드" : "isReq", - "하위그룹필드들": "assignee.assignee_emailAddress.keyword", - "컨텐츠보기여부" : true, - "크기" : 1000}, - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (data) { - //전체 요구사항, 연결이슈 - let all_req_count = 0; - let all_linkedIssue_subtask_count = 0; - //담당자존재 요구사항, 연결이슈 - let assignedReqSum = 0; - let assignedSubtaskSum = 0; - //담당자 미지정 요구사항,연결이슈 - let no_assigned_req_count = 0; - let no_assigned_linkedIssue_subtask_count =0; - - if (data["전체합계"] === 0) { - alert("작업자 업무 처리현황 데이터가 없습니다."); - 수치_초기화(); - } else { - let isReqGrpArr = data["검색결과"]["group_by_isReq"]; - isReqGrpArr.forEach((elementArr,index) => { - if(elementArr["필드명"] == "true") { - all_req_count = elementArr["개수"]; - let tempArrReq= elementArr["하위검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - tempArrReq.forEach(e => { - assignedReqSum+=e["개수"]; - }); - no_assigned_req_count = all_req_count - assignedReqSum; - } - if(elementArr["필드명"] == "false") { - all_linkedIssue_subtask_count = elementArr["개수"]; - let tempArrReq= elementArr["하위검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - tempArrReq.forEach(e => { - assignedSubtaskSum+=e["개수"]; - }); - no_assigned_linkedIssue_subtask_count = all_linkedIssue_subtask_count - assignedSubtaskSum; - } - }); - // 총 요구사항 및 연결이슈 수 - $('#total_req_count').text(all_req_count); - $('#total_linkedIssue_subtask_count').text(all_linkedIssue_subtask_count); - - // 담당자 지정 - 요구사항 및 연결이슈 - req_count = assignedReqSum; - $('#req_count').text(assignedReqSum); - linkedIssue_subtask_count = assignedSubtaskSum; - $('#linkedIssue_subtask_count').text(assignedSubtaskSum); - - // 담당자 미지정 - 요구사항 및 연결이슈 - $('#no_assigned_req_count').text(no_assigned_req_count); - $('#no_assigned_linkedIssue_subtask_count').text(no_assigned_linkedIssue_subtask_count); - - } - // 작업자수 및 평균계산 - getAssigneeInfo(pdservice_id,pdServiceVersionLinks); - }, - error: function (e) { - jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); - } - } - }); -} - -function getAssigneeInfo(pdservice_id, pdServiceVersionLinks) { - mailAddressList = []; - $.ajax({ - url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, - type: "GET", - data: { "서비스아이디" : pdservice_id, - "pdServiceVersionLinks" : pdServiceVersionLinks, - "메인그룹필드" : "assignee.assignee_emailAddress.keyword", - "컨텐츠보기여부" : true, - "크기" : 1000}, - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (data) { - let assigneesArr = data["검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - - //제품(서비스)에 투입된 총 인원수 - resource_count = assigneesArr.length; - if (data["전체합계"] === 0) { //담당자(작업자) 없음. - $('#resource_count').text("-"); - $('#avg_req_count').text("-"); - $('#avg_linkedIssue_count').text("-"); - //refreshDetailChart(); //상세 바차트 초기화 - } else { - //필요시 사용 - assigneesArr.forEach((element,idx) =>{ - mailAddressList.push(element["필드명"]); - }); - $('#resource_count').text(resource_count); - $('#avg_req_count').text((req_count/resource_count).toFixed(1)); - $('#avg_linkedIssue_count').text((linkedIssue_subtask_count/resource_count).toFixed(1)); - } - getReqInActionCount(pdservice_id,pdServiceVersionLinks); - //모든작업자 - 상세차트 - //drawDetailChartForAll(pdservice_id, pdServiceVersionLinks,mailAddressList); - }, - error: function (e) { - jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); - } - } - }); -} - -function getReqInActionCount(pdService_id, pdServiceVersionLinks) { - $.ajax({ - url: "/auth-user/api/arms/analysis/resource/reqInAction/"+pdService_id, - type: "GET", - data: { "서비스아이디" : pdService_id, - "pdServiceVersionLinks" : pdServiceVersionLinks, - "isReq" : false, - "메인그룹필드" : "parentReqKey", - "컨텐츠보기여부" : true, - "크기" : 1000}, - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (data) { - req_in_action = data["parentReqCount"]; - let req_in_wait_count = req_count-req_in_action; - if (req_in_action === "") { - $("#req_in_action_count").text("-"); - $('#linkedIssue_subtask_count_per_req_in_action').text("-"); - } else { - if(req_in_action === 0) { - $('#linkedIssue_subtask_count_per_req_in_action').text("-"); - } else { - $("#req_in_action_count").text(req_in_action); //진행중 요구사항 - $("#req_in_action_avg").text((resource_count !== 0 ? (req_in_action/resource_count).toFixed(1) : "-")); - $("#req_in_wait_count").text(req_in_wait_count); //작업대기 요구사항 - $("#req_in_wait_avg").text((resource_count !== 0 ? (req_in_wait_count/resource_count).toFixed(1) : "-")); - $('#linkedIssue_subtask_count_per_req_in_action').text((linkedIssue_subtask_count/req_in_action).toFixed(1)); - } - } - // 리소스-요구사항-일정 레이더차트 - getScheduleToDrawRadarChart(pdService_id,pdServiceVersionLinks); - }, - error: function (e) { - jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); - } - } - }); -} - - -function getScheduleToDrawRadarChart(pdservice_id, pdServiceVersionLinks) { - - let 선택한_버전_세트 = new Set(); - pdServiceVersionLinks.split(",").forEach( e => 선택한_버전_세트.add({c_id:e})); - - if(선택한_버전_세트.size !== 0) { - $.ajax({ - url: "/auth-user/api/arms/pdServiceVersion/getVersionListBy.do", - data: { c_ids: pdServiceVersionLinks}, - type: "GET", - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (json) { - - let 버전목록 = json; - let 가장이른시작날짜; - let 가장늦은종료날짜; - if(버전목록.length !== 0) { - for (let i=0; i<버전목록.length; i++) { - if (i === 0) { - 가장이른시작날짜 = 버전목록[i].c_pds_version_start_date; - 가장늦은종료날짜 = 버전목록[i].c_pds_version_end_date; - } else { - if(버전목록[i]["c_pds_version_start_date"] < 가장이른시작날짜) { - 가장이른시작날짜 = 버전목록[i]["c_pds_version_start_date"]; - } - if(버전목록[i]["c_pds_version_end_date"] > 가장늦은종료날짜) { - 가장늦은종료날짜 = 버전목록[i]["c_pds_version_end_date"]; - } - } - } - } - - if(가장이른시작날짜 ==="start") { 가장이른시작날짜 = new Date(); } - if(가장늦은종료날짜 ==="end") {가장늦은종료날짜 = new Date(); } - let objectiveDateDiff = getDateDiff(가장이른시작날짜, 가장늦은종료날짜); - let currentDateDiff = getDateDiff(가장이른시작날짜, new Date()); - - let 목표데이터_배열 = [resource_count, req_count, objectiveDateDiff]; - let 현재진행데이터_배열 = [resource_count, req_in_action, currentDateDiff]; - let dateDiff = Math.abs(objectiveDateDiff - currentDateDiff).toFixed(0); - - $("#progressDateRate").text((currentDateDiff*100/(objectiveDateDiff === 0 ? 1 : objectiveDateDiff)).toFixed(0)+"%"); - if(objectiveDateDiff>= currentDateDiff) { - $("#remaining_days").text("D-"+dateDiff); - } else { - $("#remaining_days").text("D+"+dateDiff); - $("#remaining_days").css("color", "rgb(219,42,52)"); - } - drawBasicRadar("radarPart",목표데이터_배열, 현재진행데이터_배열); - - } - } - }); - } - -} - -const getDateDiff = (d1, d2) => { - const date1 = new Date(d1); - const date2 = new Date(d2); - - const diffDate = date1.getTime() - date2.getTime(); - - return +(Math.abs(diffDate / (1000 * 60 * 60 * 24)).toFixed(0)); // 밀리세컨 * 초 * 분 * 시 = 일 - -} - -function 수치_초기화() { - req_count =0 - linkedIssue_subtask_count =0 - resource_count =0; - req_in_action =0; - $("#total_req_count").text("-"); // 총 요구사항 수(미할당포함) - $("#no_assigned_req_count").text("-"); // 미할당 요구사항 수 - $("#req_count").text("-"); // 작업 대상 요구사항 수 - $("#req_in_action_count").text("-"); // 작업중 요구사항 - - $("#total_linkedIssue_subtask_count").text("-"); //연결이슈 수 - $("#no_assigned_linkedIssue_subtask_count").text("-"); //미할당 연결이슈 수 - $("#linkedIssue_subtask_count_per_req_in_action").text("-"); // 작업중 요구사항에 대한 연결이슈 평균 - - $("#resource_count").text("-"); // 작업자수 - $("#req_in_action_avg").text("-"); // 작업중 요구사항 평균 - $("#avg_linkedIssue_count").text("-"); // 연결이슈 평균 - - let radarChart = echarts.getInstanceByDom(document.getElementById("radarPart")); - if(radarChart) { radarChart.dispose(); } -} Index: arms/js/analysisTime.js =================================================================== diff -u -r6200e258f449c7d6aae3b651fb5510cf10cd7806 -r8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb --- arms/js/analysisTime.js (.../analysisTime.js) (revision 6200e258f449c7d6aae3b651fb5510cf10cd7806) +++ arms/js/analysisTime.js (.../analysisTime.js) (revision 8fd1675d63377afdcefc03fe72ab9ecae4e4ebdb) @@ -46,10 +46,8 @@ // 7번째 박스 "../reference/jquery-plugins/timelines-chart-2.11.8/src/show-time-marker.js", "../reference/jquery-plugins/timelines-chart-2.11.8/example/random-data.js", - "js/common/table.js", - "js/analysis/api/resourceApi.js", - "js/analysis/table/workerStatusTable.js", - "js/analysis/resource/chart/basicRadar.js" + "js/analysis/topmenu/basicRadar.js", + "js/analysis/topmenu/topMenu.js" ], [ "../reference/lightblue4/docs/lib/slimScroll/jquery.slimscroll.min.js", @@ -489,258 +487,7 @@ $("#" + totalId).text(totalCount); } -// 최상단 세팅 -function getReqAndLinkedIssueData(pdservice_id, pdServiceVersionLinks) { - $.ajax({ - url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, - type: "GET", - data: { "서비스아이디" : pdservice_id, - "pdServiceVersionLinks" : pdServiceVersionLinks, - "메인그룹필드" : "isReq", - "하위그룹필드들": "assignee.assignee_emailAddress.keyword", - "컨텐츠보기여부" : true, - "크기" : 1000}, - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (data) { - //전체 요구사항, 연결이슈 - let all_req_count = 0; - let all_linkedIssue_subtask_count = 0; - //담당자존재 요구사항, 연결이슈 - let assignedReqSum = 0; - let assignedSubtaskSum = 0; - //담당자 미지정 요구사항,연결이슈 - let no_assigned_req_count = 0; - let no_assigned_linkedIssue_subtask_count =0; - if (data["전체합계"] === 0) { - alert("작업자 업무 처리현황 데이터가 없습니다."); - 수치_초기화(); - } else { - let isReqGrpArr = data["검색결과"]["group_by_isReq"]; - isReqGrpArr.forEach((elementArr,index) => { - if(elementArr["필드명"] == "true") { - all_req_count = elementArr["개수"]; - let tempArrReq= elementArr["하위검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - tempArrReq.forEach(e => { - assignedReqSum+=e["개수"]; - }); - no_assigned_req_count = all_req_count - assignedReqSum; - } - if(elementArr["필드명"] == "false") { - all_linkedIssue_subtask_count = elementArr["개수"]; - let tempArrReq= elementArr["하위검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - tempArrReq.forEach(e => { - assignedSubtaskSum+=e["개수"]; - }); - no_assigned_linkedIssue_subtask_count = all_linkedIssue_subtask_count - assignedSubtaskSum; - } - }); - // 총 요구사항 및 연결이슈 수 - $('#total_req_count').text(all_req_count); - $('#total_linkedIssue_subtask_count').text(all_linkedIssue_subtask_count); - - // 담당자 지정 - 요구사항 및 연결이슈 - req_count = assignedReqSum; - $('#req_count').text(assignedReqSum); - linkedIssue_subtask_count = assignedSubtaskSum; - $('#linkedIssue_subtask_count').text(assignedSubtaskSum); - - // 담당자 미지정 - 요구사항 및 연결이슈 - $('#no_assigned_req_count').text(no_assigned_req_count); - $('#no_assigned_linkedIssue_subtask_count').text(no_assigned_linkedIssue_subtask_count); - - } - // 작업자수 및 평균계산 - getAssigneeInfo(pdservice_id,pdServiceVersionLinks); - }, - error: function (e) { - jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); - } - } - }); -} - -function getAssigneeInfo(pdservice_id, pdServiceVersionLinks) { - mailAddressList = []; - $.ajax({ - url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, - type: "GET", - data: { "서비스아이디" : pdservice_id, - "pdServiceVersionLinks" : pdServiceVersionLinks, - "메인그룹필드" : "assignee.assignee_emailAddress.keyword", - "컨텐츠보기여부" : true, - "크기" : 1000}, - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (data) { - let assigneesArr = data["검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - - //제품(서비스)에 투입된 총 인원수 - resource_count = assigneesArr.length; - if (data["전체합계"] === 0) { //담당자(작업자) 없음. - $('#resource_count').text("-"); - $('#avg_req_count').text("-"); - $('#avg_linkedIssue_count').text("-"); - //refreshDetailChart(); //상세 바차트 초기화 - } else { - //필요시 사용 - assigneesArr.forEach((element,idx) =>{ - mailAddressList.push(element["필드명"]); - }); - $('#resource_count').text(resource_count); - $('#avg_req_count').text((req_count/resource_count).toFixed(1)); - $('#avg_linkedIssue_count').text((linkedIssue_subtask_count/resource_count).toFixed(1)); - } - getReqInActionCount(pdservice_id,pdServiceVersionLinks); - //모든작업자 - 상세차트 - //drawDetailChartForAll(pdservice_id, pdServiceVersionLinks,mailAddressList); - }, - error: function (e) { - jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); - } - } - }); -} - -function getReqInActionCount(pdService_id, pdServiceVersionLinks) { - $.ajax({ - url: "/auth-user/api/arms/analysis/resource/reqInAction/"+pdService_id, - type: "GET", - data: { "서비스아이디" : pdService_id, - "pdServiceVersionLinks" : pdServiceVersionLinks, - "isReq" : false, - "메인그룹필드" : "parentReqKey", - "컨텐츠보기여부" : true, - "크기" : 1000}, - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (data) { - req_in_action = data["parentReqCount"]; - let req_in_wait_count = req_count-req_in_action; - if (req_in_action === "") { - $("#req_in_action_count").text("-"); - $('#linkedIssue_subtask_count_per_req_in_action').text("-"); - } else { - if(req_in_action === 0) { - $('#linkedIssue_subtask_count_per_req_in_action').text("-"); - } else { - $("#req_in_action_count").text(req_in_action); //진행중 요구사항 - $("#req_in_action_avg").text((resource_count !== 0 ? (req_in_action/resource_count).toFixed(1) : "-")); - $("#req_in_wait_count").text(req_in_wait_count); //작업대기 요구사항 - $("#req_in_wait_avg").text((resource_count !== 0 ? (req_in_wait_count/resource_count).toFixed(1) : "-")); - $('#linkedIssue_subtask_count_per_req_in_action').text((linkedIssue_subtask_count/req_in_action).toFixed(1)); - } - } - // 리소스-요구사항-일정 레이더차트 - getScheduleToDrawRadarChart(pdService_id,pdServiceVersionLinks); - }, - error: function (e) { - jError("Resource Status 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); - } - } - }); -} - - -function getScheduleToDrawRadarChart(pdservice_id, pdServiceVersionLinks) { - - let 선택한_버전_세트 = new Set(); - pdServiceVersionLinks.split(",").forEach( e => 선택한_버전_세트.add({c_id:e})); - - if(선택한_버전_세트.size !== 0) { - $.ajax({ - url: "/auth-user/api/arms/pdServiceVersion/getVersionListBy.do", - data: { c_ids: pdServiceVersionLinks}, - type: "GET", - contentType: "application/json;charset=UTF-8", - dataType: "json", - progress: true, - statusCode: { - 200: function (json) { - - let 버전목록 = json; - let 가장이른시작날짜; - let 가장늦은종료날짜; - if(버전목록.length !== 0) { - for (let i=0; i<버전목록.length; i++) { - if (i === 0) { - 가장이른시작날짜 = 버전목록[i].c_pds_version_start_date; - 가장늦은종료날짜 = 버전목록[i].c_pds_version_end_date; - } else { - if(버전목록[i]["c_pds_version_start_date"] < 가장이른시작날짜) { - 가장이른시작날짜 = 버전목록[i]["c_pds_version_start_date"]; - } - if(버전목록[i]["c_pds_version_end_date"] > 가장늦은종료날짜) { - 가장늦은종료날짜 = 버전목록[i]["c_pds_version_end_date"]; - } - } - } - } - - if(가장이른시작날짜 ==="start") { 가장이른시작날짜 = new Date(); } - if(가장늦은종료날짜 ==="end") {가장늦은종료날짜 = new Date(); } - let objectiveDateDiff = getDateDiff(가장이른시작날짜, 가장늦은종료날짜); - let currentDateDiff = getDateDiff(가장이른시작날짜, new Date()); - - let 목표데이터_배열 = [resource_count, req_count, objectiveDateDiff]; - let 현재진행데이터_배열 = [resource_count, req_in_action, currentDateDiff]; - let dateDiff = Math.abs(objectiveDateDiff - currentDateDiff).toFixed(0); - - $("#progressDateRate").text((currentDateDiff*100/(objectiveDateDiff === 0 ? 1 : objectiveDateDiff)).toFixed(0)+"%"); - if(objectiveDateDiff>= currentDateDiff) { - $("#remaining_days").text("D-"+dateDiff); - } else { - $("#remaining_days").text("D+"+dateDiff); - $("#remaining_days").css("color", "rgb(219,42,52)"); - } - drawBasicRadar("radarPart",목표데이터_배열, 현재진행데이터_배열); - - } - } - }); - } - -} - -const getDateDiff = (d1, d2) => { - const date1 = new Date(d1); - const date2 = new Date(d2); - - const diffDate = date1.getTime() - date2.getTime(); - - return +(Math.abs(diffDate / (1000 * 60 * 60 * 24)).toFixed(0)); // 밀리세컨 * 초 * 분 * 시 = 일 - -} - -function 수치_초기화() { - req_count =0 - linkedIssue_subtask_count =0 - resource_count =0; - req_in_action =0; - $("#total_req_count").text("-"); // 총 요구사항 수(미할당포함) - $("#no_assigned_req_count").text("-"); // 미할당 요구사항 수 - $("#req_count").text("-"); // 작업 대상 요구사항 수 - $("#req_in_action_count").text("-"); // 작업중 요구사항 - - $("#total_linkedIssue_subtask_count").text("-"); //연결이슈 수 - $("#no_assigned_linkedIssue_subtask_count").text("-"); //미할당 연결이슈 수 - $("#linkedIssue_subtask_count_per_req_in_action").text("-"); // 작업중 요구사항에 대한 연결이슈 평균 - - $("#resource_count").text("-"); // 작업자수 - $("#req_in_action_avg").text("-"); // 작업중 요구사항 평균 - $("#avg_linkedIssue_count").text("-"); // 연결이슈 평균 - - let radarChart = echarts.getInstanceByDom(document.getElementById("radarPart")); - if(radarChart) { radarChart.dispose(); } -} - //////////////////// // 두번째 박스 //////////////////// @@ -1518,6 +1265,10 @@ color: 'white' } }, + grid: { + top: '20%', // 위쪽으로부터 10% 떨어진 위치에 그리드 영역의 위쪽 배치 + containLabel: false // 그리드 영역이 라벨을 포함하도록 설정 + }, toolbox: { show: true, orient: 'vertical',