* Fix cv_in_waterfall.
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
<?php
|
||||
/**
|
||||
* 按瀑布项目统计的成本偏差率。
|
||||
* 按瀑布项目统计的截止本周的成本偏差率。
|
||||
* Cv in waterfall.
|
||||
*
|
||||
* 范围:project
|
||||
* 对象:task
|
||||
* 目的:rate
|
||||
* 度量名称:按瀑布项目统计的成本偏差率
|
||||
* 度量名称:按瀑布项目统计的截止本周的成本偏差率
|
||||
* 单位:%
|
||||
* 描述:按瀑布项目统计的成本偏差率用于衡量项目的实际成本与计划成本之间的差异。它通过计算已花费的成本与预计花费的成本之间的差异来评估项目的成本绩效。
|
||||
* 定义:复用:;按瀑布项目统计的已完成任务工作的预计;按瀑布项目统计的实际花费工时(AC);公式:;按瀑布项目统计的成本偏差率=(EV-AC)/AC*100%;
|
||||
* 描述:按瀑布项目统计的截止本周的成本偏差率用于衡量项目的实际成本与计划成本之间的差异。它通过计算已花费的成本与预计花费的成本之间的差异来评估项目的成本绩效。
|
||||
* 定义:复用: 按瀑布项目统计的截止本周已完成任务工作的预计工时、按瀑布项目统计的截止本周的实际花费工时(AC) 公式: 按瀑布项目统计的截止本周的成本偏差率=(EV-AC)/AC*100%
|
||||
*
|
||||
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
|
||||
* @author qixinzhi <qixinzhi@easycorp.ltd>
|
||||
@@ -20,43 +20,61 @@
|
||||
*/
|
||||
class cv_in_waterfall extends baseCalc
|
||||
{
|
||||
public $dataset = 'getWaterfallTasks';
|
||||
|
||||
public $fieldList = array('t1.id as project', 't2.estimate', 't2.consumed', 't2.left', 't3.consumed as ac');
|
||||
|
||||
public $result = array();
|
||||
|
||||
public function calculate($row)
|
||||
public $reuse = true;
|
||||
|
||||
public $reuseMetrics = array('ac' => 'ac_of_all_in_waterfall', 'ev' => 'ev_of_finished_task_in_waterfall');
|
||||
|
||||
public $reuseRule = '({ev} - {ac}) / {ac}';
|
||||
|
||||
public function calculate($metrics)
|
||||
{
|
||||
$project = $row->project;
|
||||
$ac = $row->ac;
|
||||
$acs = $metrics['ac'];
|
||||
$evs = $metrics['ev'];
|
||||
if(empty($acs) || empty($evs)) return false;
|
||||
|
||||
$estimate = (float)$row->estimate;
|
||||
$consumed = (float)$row->consumed;
|
||||
$left = (float)$row->left;
|
||||
$total = $consumed + $left;
|
||||
$all = array_merge($acs, $evs);
|
||||
|
||||
$ev = $total == 0 ? 0 : round($consumed / $total * $estimate, 2);
|
||||
$projects = array_column($all, 'project', 'project');
|
||||
$years = array_column($all, 'year', 'year');
|
||||
$weeks = array_column($all, 'week', 'week');
|
||||
|
||||
if(!isset($this->result[$project]))
|
||||
$acs = $this->generateUniqueKey($acs);
|
||||
$evs = $this->generateUniqueKey($evs);
|
||||
|
||||
foreach($projects as $project)
|
||||
{
|
||||
$this->result[$project]['ev'] = $ev;
|
||||
$this->result[$project]['ac'] = $ac;
|
||||
foreach($years as $year)
|
||||
{
|
||||
foreach($weeks as $week)
|
||||
{
|
||||
$key = "{$project}_{$year}_{$week}";
|
||||
$ac = isset($acs[$key]) ? $acs[$key] : 0;
|
||||
$ev = isset($evs[$key]) ? $evs[$key] : 0;
|
||||
|
||||
if($ac == 0) continue;
|
||||
$this->result[$project] = array($year => array($week => round(($ev - $ac) / $ac, 4)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getResult($options = array())
|
||||
{
|
||||
$records = array();
|
||||
foreach($this->result as $project => $value)
|
||||
{
|
||||
$ac = (float)$value['ac'];
|
||||
$ev = (float)$value['ev'];
|
||||
|
||||
$ratio = $ac == 0 ? 0 : round(($ev - $ac) / $ac, 4);
|
||||
|
||||
$records[] = array('project' => $project, 'value' => $ratio);
|
||||
}
|
||||
$records = $this->getRecords(array('project', 'year', 'week', 'value'));
|
||||
return $this->filterByOptions($records, $options);
|
||||
}
|
||||
|
||||
public function generateUniqueKey($records)
|
||||
{
|
||||
$uniqueKeyRecords = array();
|
||||
foreach($records as $record)
|
||||
{
|
||||
$key = "{$record['project']}_{$record['year']}_{$record['week']}";
|
||||
$uniqueKeyRecords[$key] = $record['value'];
|
||||
}
|
||||
|
||||
return $uniqueKeyRecords;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
<?php
|
||||
/**
|
||||
* 按瀑布项目统计的进度偏差率。
|
||||
* 按瀑布项目统计的截止本周的进度偏差率。
|
||||
* Sv in waterfall.
|
||||
*
|
||||
* 范围:project
|
||||
* 对象:task
|
||||
* 目的:rate
|
||||
* 度量名称:按瀑布项目统计的进度偏差率
|
||||
* 度量名称:按瀑布项目统计的截止本周的进度偏差率
|
||||
* 单位:%
|
||||
* 描述:按瀑布项目统计的进度偏差率是用来衡量项目当前的进度与计划进度之间的差异。它通过计算已完成的工作量与计划工作量之间的差异来评估项目的进展情况。
|
||||
* 定义:复用:;按瀑布项目统计的已完成任务工作的预计工时(EV);按瀑布项目统计的任务的计划完成工时(PV);公式:;按瀑布项目统计的进度偏差率=(EV-PV)/PV*100%;
|
||||
* 描述:按瀑布项目统计的截止本周的进度偏差率是用来衡量项目截止本周的进度与计划进度之间的差异。它通过计算已完成的工作量与计划工作量之间的差异来评估项目的进展情况。
|
||||
* 定义:复用: 按瀑布项目统计的截止本周已完成任务工作的预计工时(EV) 、按瀑布项目统计的截止本周的任务的计划完成工时(PV),公式: 按瀑布项目统计的截止本周的进度偏差率=(EV-PV)/PV*100%
|
||||
*
|
||||
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
|
||||
* @author qixinzhi <qixinzhi@easycorp.ltd>
|
||||
|
||||
@@ -8,7 +8,7 @@ timeout=0
|
||||
cid=1
|
||||
|
||||
- 测试分组数。 @5
|
||||
- 测试项目7。第0条的value属性 @-0.7799
|
||||
- 测试项目1。第0条的value属性 @45.6259
|
||||
|
||||
*/
|
||||
include dirname(__FILE__, 7) . '/test/lib/init.php';
|
||||
@@ -17,11 +17,11 @@ include dirname(__FILE__, 4) . '/calc.class.php';
|
||||
zdTable('project')->config('waterfall', true, 4)->gen(10);
|
||||
zdTable('project')->config('stage', true, 4)->gen(40, false);
|
||||
zdTable('task')->config('task_waterfall', true, 4)->gen(1000);
|
||||
zdTable('effort')->config('effort', true, 4)->gen(1000);
|
||||
zdTable('effort')->config('effort_ac', true, 4)->gen(1000);
|
||||
|
||||
$metric = new metricTest();
|
||||
$calc = $metric->calcMetric(__FILE__);
|
||||
|
||||
r(count($calc->getResult())) && p('') && e('5'); // 测试分组数。
|
||||
r(count($metric->getReuseCalcResult($calc))) && p('') && e('5'); // 测试分组数。
|
||||
|
||||
r($calc->getResult(array('project' => '7'))) && p('0:value') && e('-0.7799'); // 测试项目7。
|
||||
r($metric->getReuseCalcResult($calc, array('project' => '1', 'year' => '2024', 'week' => '05'))) && p('0:value') && e('45.6259'); // 测试项目1。
|
||||
Reference in New Issue
Block a user