Index: arms/html/analysisCost/content-container.html =================================================================== diff -u -r8105e680317d065d9c3aba5c30987c170d3bf835 -r80fac8b6046ef94a37fe80db527edf5e1f15afa6 --- arms/html/analysisCost/content-container.html (.../content-container.html) (revision 8105e680317d065d9c3aba5c30987c170d3bf835) +++ arms/html/analysisCost/content-container.html (.../content-container.html) (revision 80fac8b6046ef94a37fe80db527edf5e1f15afa6) @@ -870,7 +870,7 @@ class="font13" style="font-weight: bold"> - 요구사항별 손익분기점 + 요구사항별 투입비용 현황
@@ -920,7 +920,7 @@
-
요구사항별 수익 현황을 확인할 수 있습니다.
+
요구사항별 투입 비용 현황을 확인할 수 있습니다.
Index: arms/js/analysisCost.js =================================================================== diff -u -r440e848bf5c4d02debbf33910ea7775bb3efeec5 -r80fac8b6046ef94a37fe80db527edf5e1f15afa6 --- arms/js/analysisCost.js (.../analysisCost.js) (revision 440e848bf5c4d02debbf33910ea7775bb3efeec5) +++ arms/js/analysisCost.js (.../analysisCost.js) (revision 80fac8b6046ef94a37fe80db527edf5e1f15afa6) @@ -729,7 +729,6 @@ }); $("#circularPacking").height("620px"); - drawCircularPacking("circularPacking",pdServiceName, 요구사항별_키목록); $("#version-stack-container").height("500px"); @@ -1286,7 +1285,7 @@ return 일급_합산; } -function 일자별_소모비용(요구사항_시작일, 일급, 요구사항_이슈키별_업데이트_데이터){ +function 요구사항_하위이슈_일자별_소모비용(요구사항_시작일, 일급, 요구사항_이슈키별_업데이트_데이터){ let 일자별_소모비용 = []; let assigneeList = new Set(); @@ -1326,18 +1325,54 @@ let 일자_차이 = (현재_데이터.getTime() - 시작일.getTime()) / (1000 * 60 * 60 * 24); // 일자 차이와 일급을 곱하여 일급을 다시 계산 + // 즉 업데이트 일까지의 소모비용을 계산 한 것 일자별_소모비용[i].일급 = 일자_차이 * 일자별_소모비용[i].일급; // 중복된 날짜가 아닐 경우에만 결과 데이터에 추가 if (resultData[resultData.length - 1].updated !== 일자별_소모비용[i].updated) { resultData.push(일자별_소모비용[i]); } } +// console.log(" [ analysisCost :: 요구사항별_소모비용_차트 :: 선택한 요구사항항 일자벌 소모 비용 -> "); +// console.log(resultData); return resultData; } +function 요구사항_일자별_소모비용(요구사항_시작일,요구사항_목표_종료일, 일급,요구사항_이슈키별_업데이트_데이터){ + // 요구사항_종료일(DB에 저장된 요구사항 종료 시점) 이 없거나 + // 요구사항_이슈키별_업데이트_데이터에서 레졸루션 데이트(es에서 수집한 데이터)가 없으면 오늘 날짜까지 만듬 있으면 해당중 가장 큰날까지 만듬 + let 일자별_소모비용 = []; + let 오늘 = new Date(); + console.log(요구사항_시작일); + console.log(요구사항_목표_종료일); + console.log(오늘); + + if(요구사항_목표_종료일 >= 오늘){ + for (let d = 요구사항_시작일; d <= 오늘; d.setDate(d.getDate() + 1)) { + let dateString = d.toISOString().split('T')[0]; + 일자별_소모비용.push({ + updated: dateString, + 일급: 일급 + }); + } + }else{ + for (let d = 요구사항_시작일; d <= 요구사항_목표_종료일; d.setDate(d.getDate() + 1)) { + let dateString = d.toISOString().split('T')[0]; + 일자별_소모비용.push({ + updated: dateString, + 일급: 일급 + }); + } + } + +// console.log(" [ analysisCost :: 요구사항별_소모비용_차트 :: 일자별 소모 비용 -> "); +// console.log(일자별_소모비용); + + return 일자별_소모비용; +} + function reqCostStatusChart(data){ var chartDom = document.getElementById('income_status_chart'); @@ -1346,13 +1381,20 @@ 요구사항_정보 = 요구사항전체목록[data.reqId]; console.log(" [ analysisCost :: 요구사항별_소모비용_차트 :: 선택한 요구사항 정보 -> "); console.log(요구사항_정보); - // 요구사항 일자 ( 시작일 계획일 없을 때 처리 전 ) + // 요구사항이 생성된 일자를 시작일로 설정 let 요구사항_시작일 = new Date(요구사항_정보.c_req_create_date); // c_req_start_date let 요구사항_계획일 = 요구사항_정보.c_req_plan_time; - let 임시데이터 = new Date(요구사항_시작일.getTime()); - 임시데이터.setDate(임시데이터.getDate() + 요구사항_계획일); - let 요구사항_목표_종료일 = 임시데이터; + let 요구사항_목표_종료일 ; + let 요구사항_종료일 = new Date(요구사항_정보.c_req_end_date); + if(요구사항_계획일 == null){ // 요구사항 계획일이 없으면 버전 종료일로 처리 + 요구사항_목표_종료일 = new Date(versionListData[data.versionId].c_pds_version_end_date); + }else{ + let 임시데이터 = new Date(요구사항_시작일.getTime()); + 임시데이터.setDate(임시데이터.getDate() + 요구사항_계획일); + 요구사항_목표_종료일 = 임시데이터; + } + const url = new UrlBuilder() .setBaseUrl('/auth-user/api/arms/analysis/cost/req-updated-list') .addQueryParam('issueList', data.issueKey) @@ -1370,18 +1412,17 @@ console.log(apiResponse.body); let 요구사항_이슈키별_업데이트_데이터 = apiResponse.body; + let allIsReqTrue = Object.values(요구사항_이슈키별_업데이트_데이터).flat().every(item => item.isReq === true); let 일급 = 요구사항_담당자_조회(data); - let 일자별_소모비용_데이터 = 일자별_소모비용(요구사항_시작일, 일급, 요구사항_이슈키별_업데이트_데이터); - drawReqCostStatusChart(chartDom,요구사항_정보,data,요구사항_목표_종료일,일자별_소모비용_데이터); -// if (Object.keys(요구사항_이슈키별_업데이트_데이터).length === 0) { // 요구사항 하위 이슈를 생성 하지 않고 다이렉트로 요구사항을 처리한 경우. -// -// //drawReqCostStatusChart(chartDom,요구사항_정보,data,요구사항_목표_종료일,일자별_소모비용_데이터); -// } else { -// console.log('하위 이슈 정보가 있음'); -// let 일자별_소모비용_데이터 = 일자별_소모비용(요구사항_시작일, 일급, 요구사항_이슈키별_업데이트_데이터); -// drawReqCostStatusChart(chartDom,요구사항_정보,data,요구사항_목표_종료일,일자별_소모비용_데이터); -// } + let 일자별_소모비용_데이터; + if (allIsReqTrue) {// 모든 사람이 요구사항을 직접 처리 하는 경우 + 일자별_소모비용_데이터 = 요구사항_일자별_소모비용(요구사항_시작일, 요구사항_목표_종료일, 일급,요구사항_이슈키별_업데이트_데이터); + + } else {// 참여 하는 사람 중 하나라도 하위 이슈 생성하여 작업하는 경우 + 일자별_소모비용_데이터 = 요구사항_하위이슈_일자별_소모비용(요구사항_시작일, 일급, 요구사항_이슈키별_업데이트_데이터); + } + drawReqCostStatusChart(chartDom,요구사항_정보,data,요구사항_목표_종료일,일자별_소모비용_데이터); } } }); @@ -1396,9 +1437,10 @@ function drawReqCostStatusChart(chartDom,요구사항_정보,data,요구사항_목표_종료일,일자별_소모비용_데이터){ var 투자비용 = data.reqCost; + 요구사항_목표_종료일 = 요구사항_목표_종료일.toISOString().substring(0, 10) let dates = 일자별_소모비용_데이터.map(item => item.updated); - dates.push(요구사항_목표_종료일.toISOString().substring(0, 10)); + dates.push(요구사항_목표_종료일); let costData = 일자별_소모비용_데이터.map(item => item.일급); @@ -1507,21 +1549,21 @@ fontSize: 15, // label의 폰트 크기 설정 color: '#FFFFFF', formatter: function(){ - return '요구사항 기한: '+ 요구사항_목표_종료일.toISOString().substring(0, 10); + return '요구사항 기한: '+ 요구사항_목표_종료일; } }, data: [ { - xAxis: 요구사항_목표_종료일.toISOString().substring(0, 10) + xAxis: 요구사항_목표_종료일 } ] } }, { - name: '누적 소모 비용', - type: 'bar', - stack: 'Total', - silent: true, + name: '누적 소모 비용', + type: 'bar', + stack: 'Total', + silent: true, itemStyle: { borderColor: 'transparent', color: 'transparent' @@ -1538,38 +1580,27 @@ data: accumulatedData // 누적값 }, { - name: '소모 비용', - type: 'bar', - stack: 'Total', - label: { - show: true, - color: '#FFFFFF', - position: 'top' - }, - itemStyle: { - color: '#eb5454' // 바의 색상을 빨간색으로 변경 - }, - data:costData// 증폭 - } + name: '소모 비용', + type: 'bar', + stack: 'Total', + label: { + show: true, + color: '#FFFFFF', + position: 'top' + }, + itemStyle: { + color: '#eb5454' // 바의 색상을 빨간색으로 변경 + }, + data:costData// 증폭 + } ], tooltip: { - trigger: "axis", - position: "top", - borderWidth: 1, - axisPointer: { - type: "shadow" - }/*, - formatter: function(params) { - var tooltipText = params[0].name + '
'; // X축 데이터 추가 - for (var i = 0; i < params.length; i++) { - if (params[i].seriesName !== '누적 소모 비용') { - tooltipText += params[i].marker + params[i].seriesName + ': ' + params[i].value + '
'; - } else { - tooltipText += params[i].seriesName + ': ' + params[i].value + '
'; - } - } - return tooltipText; - }*/ + trigger: "axis", + position: "top", + borderWidth: 1, + axisPointer: { + type: "shadow" + } }, };