Index: arms/html/analysisResource/content-container.html =================================================================== diff -u -r1584893aecd5d5aa5c903e2124a4747890c9b52d -rc503bdf97b5191a644e820f50fdfb993dcd4af5d --- arms/html/analysisResource/content-container.html (.../content-container.html) (revision 1584893aecd5d5aa5c903e2124a4747890c9b52d) +++ arms/html/analysisResource/content-container.html (.../content-container.html) (revision c503bdf97b5191a644e820f50fdfb993dcd4af5d) @@ -124,7 +124,7 @@
-
-
+
-
투입 작업자 수 @@ -148,15 +148,6 @@
-
-
-
- 잔여 요구사항 평균 : -
-
-
-
@@ -166,21 +157,21 @@

- 요구사항 현황 + 요구사항 및 연결이슈 현황

-
-
+
-
작업 중 요구사항
-
/
+
|
-
@@ -194,53 +185,40 @@ style="padding-bottom: 10px; border: 0">
- 잔여 요구사항 : -
+ 작업 중 요구사항()의 연결이슈 평균: -
+
- 총 요구사항
-

+ 총 요구사항 (미할당)
- 개 (-)

- 미할당 요구사항
-

+ 총 연결이슈 (미할당)
- 개 (-)

-
-
-
-

- - - 등록된 연결이슈 및 하위작업 현황 - -

-
+
+
+
+
종합 진행 현황
-
-
-
-
-
- - 생성한 연결이슈 -
-
-
-
-
- 작업 중 요구사항 당 연결이슈 : -
-
-
-
-
+
+
@@ -381,7 +359,7 @@

- 작업자별 항목 상세는 상세보기 열의 아이콘을 클릭하세요.
+ 작업자별 업무 상세는 아래 체크박스를 클릭하세요.
복수 선택 시, 선택한 작업자를 함께 확인하실 수 있습니다.

@@ -420,6 +398,13 @@ refresh +
- + \ No newline at end of file Index: arms/js/analysis/resource/chart/basicRadar.js =================================================================== diff -u --- arms/js/analysis/resource/chart/basicRadar.js (revision 0) +++ arms/js/analysis/resource/chart/basicRadar.js (revision c503bdf97b5191a644e820f50fdfb993dcd4af5d) @@ -0,0 +1,160 @@ +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[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: '작업자수 (명)', max: objectiveArr[0] }, + { name: '요구사항 (개)', max: objectiveArr[1] }, + { name: '일정 (일)', max: scheduleMax } + ], + name: { + textStyle: { + color: 'white', // 데이터 전체의 이름 폰트 색상 설정 + fontSize: 11 // 데이터 전체의 이름 폰트 크기 설정 + } + }, + center: ["50%","65%"], + radius: 100, + 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: '제품(서비스) 기준목표', + areaStyle: { + opacity: 0.3 + } + }, + { + value: currentProgressArr, + name: '현재 진행상황', + areaStyle: { + opacity: 0.6 + } + } + ] + } + ] + }; + + option && myChart.setOption(option,true); +} \ No newline at end of file Index: arms/js/analysisResource.js =================================================================== diff -u -rc3551387419a51e9b08f56a0ca1a6598e13efa7d -rc503bdf97b5191a644e820f50fdfb993dcd4af5d --- arms/js/analysisResource.js (.../analysisResource.js) (revision c3551387419a51e9b08f56a0ca1a6598e13efa7d) +++ arms/js/analysisResource.js (.../analysisResource.js) (revision c503bdf97b5191a644e820f50fdfb993dcd4af5d) @@ -1,10 +1,10 @@ -//////////////////////////////////////////////////////////////////////////////////////// +////////////////// //Document Ready -//////////////////////////////////////////////////////////////////////////////////////// +////////////////// var selectedPdServiceId; // 제품(서비스) 아이디 -var reqStatusDataTable; +var selectedVersionId; // 선택된 버전 아이디 var dataTableRef; -var selectedVersionId; // 선택된 버전 아이디 +var mailAddressList; var dashboardColor; var req_count, linkedIssue_subtask_count, resource_count, req_in_action; var labelType, useGradients, nativeTextSupport, animate; //투입 인력별 요구사항 관여 차트 @@ -61,7 +61,8 @@ "js/analysis/api/resourceApi.js", "js/analysis/table/workerStatusTable.js", "js/analysis/resource/chart/horizontalBarChart.js", - "js/analysis/resource/chart/simplePie.js" + "js/analysis/resource/chart/simplePie.js", + "js/analysis/resource/chart/basicRadar.js" ], [ "../reference/jquery-plugins/dataTables-1.10.16/media/css/jquery.dataTables_lightblue4.css", @@ -307,18 +308,8 @@ //~> 이벤트 연계 함수 :: Version 표시 jsTree 빌드 bind_VersionData_By_PdService(); - var checked = $("#checkbox1").is(":checked"); - var endPointUrl = ""; - if (checked) { - endPointUrl = "/T_ARMS_REQSTATUS_" + $("#selected_pdService").val() + "/getStatusMonitor.do?disable=true"; - } else { - endPointUrl = "/T_ARMS_REQSTATUS_" + $("#selected_pdService").val() + "/getStatusMonitor.do?disable=false"; - } - //statisticsMonitor($("#selected_pdService").val()); //ES모으는중 by YHS - - }); } // end makePdServiceSelectBox() @@ -340,9 +331,9 @@ refreshDetailChart(); // 요구사항 및 연결이슈 통계 - getReqAndLinkedIssueData($("#selected_pdService").val(), selectedVersionId); + getReqAndLinkedIssueData(selectedPdServiceId, selectedVersionId); // 작업자별 상태 - drawResource($("#selected_pdService").val(), selectedVersionId); + drawResource(selectedPdServiceId, selectedVersionId); drawProductToManSankeyChart($("#selected_pdService").val(), selectedVersionId); drawManRequirementTreeMapChart($("#selected_pdService").val(), selectedVersionId); @@ -371,13 +362,15 @@ refreshDetailChart(); selectedVersionId = pdServiceVersionIds.join(','); // 요구사항 및 연결이슈 통계 - getReqAndLinkedIssueData($("#selected_pdService").val(), selectedVersionId); - // 작업자별 상태 - drawResource($("#selected_pdService").val(), selectedVersionId); + getReqAndLinkedIssueData(selectedPdServiceId, selectedVersionId); + // 작업자별 상태 - dataTable + drawResource(selectedPdServiceId, selectedVersionId); - drawProductToManSankeyChart($("#selected_pdService").val(), selectedVersionId); - drawManRequirementTreeMapChart($("#selected_pdService").val(), selectedVersionId); + drawProductToManSankeyChart(selectedPdServiceId, selectedVersionId); + drawManRequirementTreeMapChart(selectedPdServiceId, selectedVersionId); stackedHorizontalBar(); + + if (data.length > 0) { console.log("display 재설정."); } @@ -476,6 +469,7 @@ // 담당자 미지정 - 요구사항 및 연결이슈 $('#no_assigned_req_count').text(no_assigned_req_count); $('#no_assigned_linkedIssue_subtask_count').text(no_assigned_linkedIssue_subtask_count); + } // 작업자수 및 평균계산 getAssigneeInfo(pdservice_id,pdServiceVersionLinks); @@ -535,6 +529,7 @@ }; function getAssigneeInfo(pdservice_id, pdServiceVersionLinks) { + mailAddressList = []; $.ajax({ url: "/auth-user/api/arms/analysis/resource/workerStatus/"+pdservice_id, type: "GET", @@ -549,7 +544,7 @@ statusCode: { 200: function (data) { let assigneesArr = data["검색결과"]["group_by_assignee.assignee_emailAddress.keyword"]; - let mailAddressList = []; + //제품(서비스)에 투입된 총 인원수 resource_count = assigneesArr.length; if (data["전체합계"] === 0) { //담당자(작업자) 없음. @@ -607,7 +602,8 @@ $('#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 조회에 실패했습니다. 나중에 다시 시도 바랍니다."); @@ -629,6 +625,27 @@ }); } +function drawDetailOverallChart() { + let mailList = mailAddressList; + let mailStr =""; + + if (mailAddressList.length === 1) { + mailStr = mailList[0]; + } else { + for (let cnt = 0; cnt < mailList.length; cnt++) { + if(cnt !== mailList.length-1) { + mailStr += mailList[cnt] +","; + } else { + mailStr += mailList[cnt]; + } + } + } + searchMap.forEach( + (target, index) => { + drawChartsPerPerson(selectedPdServiceId,selectedVersionId,mailStr, target["field"], target["reqId"], target["subId"]); + } + ) +} //공통코드-extract필요 function drawDetailChartForAll(pdservice_id, pdServiceVersionLinks, mailAddressList) { let mailList = mailAddressList; @@ -801,8 +818,69 @@ }); } +//email에서 ID 만 가져오기 function getIdFromMail (param) { var full_str = param; var indexOfAt = full_str.indexOf('@'); return full_str.substring(0,indexOfAt); -} \ No newline at end of file +} + +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/pdService/getNodeWithVersionOrderByCidDesc.do", + data: { + c_id: pdservice_id, + pdServiceVersionEntities: 선택한_버전_세트 + }, + type: "GET", + contentType: "application/json;charset=UTF-8", + dataType: "json", + progress: true, + statusCode: { + 200: function (json) { + let 버전_세트 = json.pdServiceVersionEntities; + let earliestStartDate; let lastEndDate; + let versionArray= []; + 버전_세트.forEach(e => versionArray.push(e)); + + if(versionArray !== 0) { + for (let i=0; i lastEndDate) { + lastEndDate = versionArray[i]["c_pds_version_end_date"]; + } + } + } + } + + let 목표데이터_배열 = [resource_count, req_count, getDateDiff(earliestStartDate, lastEndDate)]; + let 현재진행데이터_배열 = [resource_count, req_in_action, getDateDiff(earliestStartDate, new Date())]; + + 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(1); // 밀리세컨 * 초 * 분 * 시 = 일 + +}