progress_of_task_in_project.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <?php
  2. /**
  3. * 按项目统计的任务进度。
  4. * Progress of task in project.
  5. *
  6. * 范围:project
  7. * 对象:task
  8. * 目的:rate
  9. * 度量名称:按项目统计的任务进度
  10. * 单位:%
  11. * 描述:按项目统计的任务进度是指项目团队按已消耗的工时数与已消耗和剩余的工时数的比率。这个度量项能够反映项目进度的准确性和任务执行的效率。
  12. * 定义:复用:;按项目统计的任务消耗工时数;按项目统计的任务剩余工时数;公式:;按项目统计的任务进度=按项目统计的任务消耗工时数/(按项目统计的任务消耗工时数+按项目统计的任务剩余工时数);
  13. *
  14. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  15. * @author zhouxin <zhouxin@easycorp.ltd>
  16. * @package
  17. * @uses func
  18. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  19. * @Link https://www.zentao.net
  20. */
  21. class progress_of_task_in_project extends baseCalc
  22. {
  23. public $dataset = 'getTasks';
  24. public $fieldList = array('t1.consumed', 't1.left', 't1.project', 't1.status', 't1.isParent');
  25. public $result = array();
  26. public function calculate($row)
  27. {
  28. if($row->isParent == '1') return false;
  29. $consumed = !empty($row->consumed) ? $row->consumed : 0;
  30. $left = !empty($row->left) ? $row->left : 0;
  31. if(!isset($this->result[$row->project])) $this->result[$row->project] = array('consumed' => 0, 'left' => 0);
  32. $this->result[$row->project]['consumed'] += $consumed;
  33. if($row->status != 'cancel' && $row->status != 'closed') $this->result[$row->project]['left'] += $left;
  34. }
  35. public function getResult($options = array())
  36. {
  37. $records = array();
  38. foreach($this->result as $project => $taskInfo)
  39. {
  40. $total = $taskInfo['consumed'] + $taskInfo['left'];
  41. $progress = $total ? round($taskInfo['consumed'] / $total, 4) : 0;
  42. $records[] = array('project' => $project, 'value' => $progress);
  43. }
  44. return $this->filterByOptions($records, $options);
  45. }
  46. }