* Fix bug #41779, get data from metric in scrum overview block and optimize code for scrum overview block and project statistic block.

This commit is contained in:
liumengyi
2023-12-16 15:21:01 +08:00
parent 89eff40a0a
commit 46fe110fb2
2 changed files with 123 additions and 89 deletions
+3 -3
View File
@@ -48,7 +48,7 @@ foreach($config->block->projectstatistic->items as $module => $items)
span
(
setClass('font-bold text-black mr-0.5'),
zget($project, $field, 0)
round(zget($project, $field, 0), 2)
),
span
(
@@ -122,7 +122,7 @@ panel
span
(
setClass('font-bold text-warning'),
999
round(zget($project, 'risks', 0), 2)
)
),
span
@@ -132,7 +132,7 @@ panel
span
(
setClass('font-bold text-warning'),
999
zget($project, 'issues', 0)
)
)
) : '',
+120 -86
View File
@@ -898,89 +898,13 @@ class blockZen extends block
$projects = $this->loadModel('project')->getProjectList($status, 'order_asc', $count, $excludedModel);
$projectIdList = array_keys($projects);
$this->loadModel('metric');
/* 敏捷和瀑布相关目的统计信息。 */
$riskCountGroup = $this->metric->getResultByCode('count_of_opened_risk_in_project', array('project' => join(',', $projectIdList)));
$issueCountGroup = $this->metric->getResultByCode('count_of_opened_issue_in_project', array('project' => join(',', $projectIdList)));
/* 敏捷项目的统计信息。 */
$investedGroup = $this->metric->getResultByCode('day_of_invested_in_project', array('project' => join(',', $projectIdList)));
$consumeTaskGroup = $this->metric->getResultByCode('consume_of_task_in_project', array('project' => join(',', $projectIdList)));
$leftTaskGroup = $this->metric->getResultByCode('left_of_task_in_project', array('project' => join(',', $projectIdList)));
$countStoryGroup = $this->metric->getResultByCode('scale_of_story_in_project', array('project' => join(',', $projectIdList)));
$finishedStoryGroup = $this->metric->getResultByCode('count_of_finished_story_in_project', array('project' => join(',', $projectIdList)));
$unclosedStoryGroup = $this->metric->getResultByCode('count_of_unclosed_story_in_project', array('project' => join(',', $projectIdList)));
$countTaskGroup = $this->metric->getResultByCode('count_of_task_in_project', array('project' => join(',', $projectIdList)));
$waitTaskGroup = $this->metric->getResultByCode('count_of_wait_task_in_project', array('project' => join(',', $projectIdList)));
$doingTaskGroup = $this->metric->getResultByCode('count_of_doing_task_in_project', array('project' => join(',', $projectIdList)));
$countBugGroup = $this->metric->getResultByCode('count_of_bug_in_project', array('project' => join(',', $projectIdList)));
$closedBugGroup = $this->metric->getResultByCode('count_of_closed_bug_in_project ', array('project' => join(',', $projectIdList)));
$activatedBugGroup = $this->metric->getResultByCode('count_of_activated_bug_in_project', array('project' => join(',', $projectIdList)));
if($investedGroup) $investedGroup = array_column($investedGroup, null, 'project');
if($consumeTaskGroup) $consumeTaskGroup = array_column($consumeTaskGroup, null, 'project');
if($leftTaskGroup) $leftTaskGroup = array_column($leftTaskGroup, null, 'project');
if($countStoryGroup) $countStoryGroup = array_column($countStoryGroup, null, 'project');
if($finishedStoryGroup) $finishedStoryGroup = array_column($finishedStoryGroup, null, 'project');
if($unclosedStoryGroup) $unclosedStoryGroup = array_column($unclosedStoryGroup, null, 'project');
if($countTaskGroup) $countTaskGroup = array_column($countTaskGroup, null, 'project');
if($waitTaskGroup) $waitTaskGroup = array_column($waitTaskGroup, null, 'project');
if($doingTaskGroup) $doingTaskGroup = array_column($doingTaskGroup, null, 'project');
if($countBugGroup) $countBugGroup = array_column($countBugGroup, null, 'project');
if($closedBugGroup) $closedBugGroup = array_column($closedBugGroup, null, 'project');
if($activatedBugGroup) $activatedBugGroup = array_column($activatedBugGroup, null, 'project');
/* 瀑布项目的统计信息。 */
$taskProgressGroup = $this->metric->getResultByCode('progress_of_task_in_project', array('project' => join(',', $projectIdList)));
$SVGroup = $this->metric->getResultByCode('sv_in_waterfall', array('project' => join(',', $projectIdList)));
$PVGroup = $this->metric->getResultByCode('pv_of_task_in_waterfall', array('project' => join(',', $projectIdList)));
$EVGroup = $this->metric->getResultByCode('ev_of_finished_task_in_waterfall', array('project' => join(',', $projectIdList)));
$CVGroup = $this->metric->getResultByCode('cv_in_waterfall', array('project' => join(',', $projectIdList)));
$ACGroup = $this->metric->getResultByCode('ac_of_all_in_waterfall', array('project' => join(',', $projectIdList)));
if($riskCountGroup) $riskCountGroup = array_column($riskCountGroup, null, 'project');
if($issueCountGroup) $issueCountGroup = array_column($issueCountGroup, null, 'project');
if($taskProgressGroup) $taskProgressGroup = array_column($taskProgressGroup, null, 'project');
if($SVGroup) $SVGroup = array_column($SVGroup, null, 'project');
if($PVGroup) $PVGroup = array_column($PVGroup, null, 'project');
if($EVGroup) $EVGroup = array_column($EVGroup, null, 'project');
if($CVGroup) $CVGroup = array_column($CVGroup, null, 'project');
if($ACGroup) $ACGroup = array_column($ACGroup, null, 'project');
/* Get metric data. */
$data = $this->getProjectsStatisticData($projectIdList);
/* 将获取的度量数据塞入项目列表数据中。 */
$this->loadModel('execution');
$this->app->loadClass('pager', true);
$pager = pager::init(0, 3, 1);
$today = helper::today();
foreach($projects as $projectID => $project)
{
$project->progress = isset($taskProgressGroup[$projectID]['value']) ? $taskProgressGroup[$projectID]['value'] * 100 : 0;
if(in_array($project->model, array('scrum', 'kanban', 'agileplus')))
{
$project->executions = $this->execution->getStatData($projectID, 'all', 0, 0, false, '', 'id_desc', $pager);
$project->costs = isset($investedGroup[$projectID]['value']) ? $investedGroup[$projectID]['value'] : 0;
$project->consumed = isset($consumeTaskGroup[$projectID]['value']) ? $consumeTaskGroup[$projectID]['value'] : 0;
$project->remainder = isset($leftTaskGroup[$projectID]['value']) ? $leftTaskGroup[$projectID]['value'] : 0;
$project->storyPoints = isset($countStoryGroup[$projectID]['value']) ? $countStoryGroup[$projectID]['value'] : 0;
$project->done = isset($finishedStoryGroup[$projectID]['value']) ? $finishedStoryGroup[$projectID]['value'] : 0;
$project->undone = isset($unclosedStoryGroup[$projectID]['value']) ? $unclosedStoryGroup[$projectID]['value'] : 0;
$project->tasks = isset($countTaskGroup[$projectID]['value']) ? $countTaskGroup[$projectID]['value'] : 0;
$project->wait = isset($waitTaskGroup[$projectID]['value']) ? $waitTaskGroup[$projectID]['value'] : 0;
$project->doing = isset($doingTaskGroup[$projectID]['value']) ? $doingTaskGroup[$projectID]['value'] : 0;
$project->bugs = isset($countBugGroup[$projectID]['value']) ? $countBugGroup[$projectID]['value'] : 0;
$project->resolvedDate = isset($closedBugGroup[$projectID]['value']) ? $closedBugGroup[$projectID]['value'] : 0;
$project->active = isset($activatedBugGroup[$projectID]['value']) ? $activatedBugGroup[$projectID]['value'] : 0;
}
elseif(in_array($project->model, array('waterfall', 'waterfallplus', 'ipd')))
{
$project->pv = isset($PVGroup[$projectID]['value']) ? (int)$PVGroup[$projectID]['value'] * 100 : 0;
$project->ev = isset($EVGroup[$projectID]['value']) ? (int)$EVGroup[$projectID]['value'] * 100 : 0;
$project->ac = isset($ACGroup[$projectID]['value']) ? (int)$ACGroup[$projectID]['value'] * 100 : 0;
$project->sv = isset($SVGroup[$projectID]['value']) ? (int)$SVGroup[$projectID]['value'] * 100 : 0;
$project->cv = isset($CVGroup[$projectID]['value']) ? (int)$CVGroup[$projectID]['value'] * 100 : 0;
}
if($project->end != LONG_TIME) $project->remainingDays = helper::diffDate($project->end, $today);
}
$pager = pager::init(0, 3, 1);
foreach($projects as $project) $project = $this->buildProjectStatistic($project, $data, $pager);
$this->view->projects = $projects;
$this->view->users = $this->loadModel('user')->getPairs('noletter');
@@ -1355,15 +1279,19 @@ class blockZen extends block
{
$projectID = $this->session->project;
$this->app->loadLang('bug');
$totalData = $this->loadModel('project')->getOverviewList('', $projectID, 'id_desc', 1);
$project = zget($totalData, $projectID, new stdclass());
/* Get metric data. */
$projectIdList = array($projectID);
$data = $this->getProjectsStatisticData($projectIdList);
/* Get base project. */
$project = $this->loadModel('project')->fetchById($projectID);
/* Build project statistic data. */
$this->app->loadClass('pager', true);
$pager = pager::init(0, 3, 1);
$project->progress = empty($project->allStories) ? 0 : round($project->doneStories / $project->allStories, 3) * 100;
$project->executions = $this->loadModel('execution')->getStatData($projectID, 'all', 0, 0, false, '', 'id_desc', $pager);
$pager = pager::init(0, 3, 1);
$project = $this->buildProjectStatistic($project, $data, $pager);
$this->view->totalData = $totalData;
$this->view->projectID = $projectID;
$this->view->project = $project;
}
@@ -3264,4 +3192,110 @@ class blockZen extends block
$this->view->sso = $sso;
$this->view->sign = strpos($sso, '?') === false ? '?' : '&';
}
/**
* 获取项目总览相关数据。
* Get project overview related data.
*
* @param array $projectIdList
* @access protected
* @return array
*/
protected function getProjectsStatisticData(array $projectIdList): array
{
/* 敏捷和瀑布相关目的统计信息。 */
$riskCountGroup = $this->loadModel('metric')->getResultByCode('count_of_opened_risk_in_project', array('project' => join(',', $projectIdList)));
$issueCountGroup = $this->metric->getResultByCode('count_of_opened_issue_in_project', array('project' => join(',', $projectIdList)));
if($riskCountGroup) $riskCountGroup = array_column($riskCountGroup, null, 'project');
if($issueCountGroup) $issueCountGroup = array_column($issueCountGroup, null, 'project');
/* 敏捷项目的统计信息。 */
$investedGroup = $this->metric->getResultByCode('day_of_invested_in_project', array('project' => join(',', $projectIdList)));
$consumeTaskGroup = $this->metric->getResultByCode('consume_of_task_in_project', array('project' => join(',', $projectIdList)));
$leftTaskGroup = $this->metric->getResultByCode('left_of_task_in_project', array('project' => join(',', $projectIdList)));
$countStoryGroup = $this->metric->getResultByCode('scale_of_story_in_project', array('project' => join(',', $projectIdList)));
$finishedStoryGroup = $this->metric->getResultByCode('count_of_finished_story_in_project', array('project' => join(',', $projectIdList)));
$unclosedStoryGroup = $this->metric->getResultByCode('count_of_unclosed_story_in_project', array('project' => join(',', $projectIdList)));
$countTaskGroup = $this->metric->getResultByCode('count_of_task_in_project', array('project' => join(',', $projectIdList)));
$waitTaskGroup = $this->metric->getResultByCode('count_of_wait_task_in_project', array('project' => join(',', $projectIdList)));
$doingTaskGroup = $this->metric->getResultByCode('count_of_doing_task_in_project', array('project' => join(',', $projectIdList)));
$countBugGroup = $this->metric->getResultByCode('count_of_bug_in_project', array('project' => join(',', $projectIdList)));
$closedBugGroup = $this->metric->getResultByCode('count_of_closed_bug_in_project ', array('project' => join(',', $projectIdList)));
$activatedBugGroup = $this->metric->getResultByCode('count_of_activated_bug_in_project', array('project' => join(',', $projectIdList)));
if($investedGroup) $investedGroup = array_column($investedGroup, null, 'project');
if($consumeTaskGroup) $consumeTaskGroup = array_column($consumeTaskGroup, null, 'project');
if($leftTaskGroup) $leftTaskGroup = array_column($leftTaskGroup, null, 'project');
if($countStoryGroup) $countStoryGroup = array_column($countStoryGroup, null, 'project');
if($finishedStoryGroup) $finishedStoryGroup = array_column($finishedStoryGroup, null, 'project');
if($unclosedStoryGroup) $unclosedStoryGroup = array_column($unclosedStoryGroup, null, 'project');
if($countTaskGroup) $countTaskGroup = array_column($countTaskGroup, null, 'project');
if($waitTaskGroup) $waitTaskGroup = array_column($waitTaskGroup, null, 'project');
if($doingTaskGroup) $doingTaskGroup = array_column($doingTaskGroup, null, 'project');
if($countBugGroup) $countBugGroup = array_column($countBugGroup, null, 'project');
if($closedBugGroup) $closedBugGroup = array_column($closedBugGroup, null, 'project');
if($activatedBugGroup) $activatedBugGroup = array_column($activatedBugGroup, null, 'project');
/* 瀑布项目的统计信息。 */
$SVGroup = $this->metric->getResultByCode('sv_in_waterfall', array('project' => join(',', $projectIdList)));
$PVGroup = $this->metric->getResultByCode('pv_of_task_in_waterfall', array('project' => join(',', $projectIdList)));
$EVGroup = $this->metric->getResultByCode('ev_of_finished_task_in_waterfall', array('project' => join(',', $projectIdList)));
$CVGroup = $this->metric->getResultByCode('cv_in_waterfall', array('project' => join(',', $projectIdList)));
$ACGroup = $this->metric->getResultByCode('ac_of_all_in_waterfall', array('project' => join(',', $projectIdList)));
$taskProgressGroup = $this->metric->getResultByCode('progress_of_task_in_project', array('project' => join(',', $projectIdList)));
if($SVGroup) $SVGroup = array_column($SVGroup, null, 'project');
if($PVGroup) $PVGroup = array_column($PVGroup, null, 'project');
if($EVGroup) $EVGroup = array_column($EVGroup, null, 'project');
if($CVGroup) $CVGroup = array_column($CVGroup, null, 'project');
if($ACGroup) $ACGroup = array_column($ACGroup, null, 'project');
if($taskProgressGroup) $taskProgressGroup = array_column($taskProgressGroup, null, 'project');
return array('riskCountGroup' => $riskCountGroup, 'issueCountGroup' => $issueCountGroup, 'investedGroup' => $investedGroup, 'consumeTaskGroup' => $consumeTaskGroup, 'leftTaskGroup' => $leftTaskGroup, 'countStoryGroup' => $countStoryGroup, 'finishedStoryGroup' => $finishedStoryGroup, 'unclosedStoryGroup' => $unclosedStoryGroup, 'countTaskGroup' => $countTaskGroup, 'waitTaskGroup' => $waitTaskGroup, 'doingTaskGroup' => $doingTaskGroup, 'countBugGroup' => $countBugGroup, 'closedBugGroup' => $closedBugGroup, 'activatedBugGroup' => $activatedBugGroup, 'taskProgressGroup' => $taskProgressGroup, 'SVGroup' => $SVGroup, 'PVGroup' => $PVGroup, 'EVGroup' => $EVGroup, 'CVGroup' => $CVGroup, 'ACGroup' => $ACGroup);
}
/**
* 构建项目统计信息。
* Build project statistic.
*
* @param object $project
* @param array $data
* @param object $pager
* @access protected
* @return object
*/
protected function buildProjectStatistic(object $project, array $data, object $pager = null): object
{
extract($data);
$projectID = $project->id;
$project->progress = isset($taskProgressGroup[$projectID]['value']) ? $taskProgressGroup[$projectID]['value'] * 100 : 0;
if(in_array($project->model, array('scrum', 'kanban', 'agileplus')))
{
$project->executions = $this->loadModel('execution')->getStatData($projectID, 'all', 0, 0, false, '', 'id_desc', $pager);
$project->costs = isset($investedGroup[$projectID]['value']) ? $investedGroup[$projectID]['value'] : 0;
$project->consumed = isset($consumeTaskGroup[$projectID]['value']) ? $consumeTaskGroup[$projectID]['value'] : 0;
$project->remainder = isset($leftTaskGroup[$projectID]['value']) ? $leftTaskGroup[$projectID]['value'] : 0;
$project->storyPoints = isset($countStoryGroup[$projectID]['value']) ? $countStoryGroup[$projectID]['value'] : 0;
$project->done = isset($finishedStoryGroup[$projectID]['value']) ? $finishedStoryGroup[$projectID]['value'] : 0;
$project->undone = isset($unclosedStoryGroup[$projectID]['value']) ? $unclosedStoryGroup[$projectID]['value'] : 0;
$project->tasks = isset($countTaskGroup[$projectID]['value']) ? $countTaskGroup[$projectID]['value'] : 0;
$project->wait = isset($waitTaskGroup[$projectID]['value']) ? $waitTaskGroup[$projectID]['value'] : 0;
$project->doing = isset($doingTaskGroup[$projectID]['value']) ? $doingTaskGroup[$projectID]['value'] : 0;
$project->bugs = isset($countBugGroup[$projectID]['value']) ? $countBugGroup[$projectID]['value'] : 0;
$project->closed = isset($closedBugGroup[$projectID]['value']) ? $closedBugGroup[$projectID]['value'] : 0;
$project->activated = isset($activatedBugGroup[$projectID]['value']) ? $activatedBugGroup[$projectID]['value'] : 0;
}
elseif(in_array($project->model, array('waterfall', 'waterfallplus', 'ipd')))
{
$project->pv = isset($PVGroup[$projectID]['value']) ? (int)$PVGroup[$projectID]['value'] * 100 : 0;
$project->ev = isset($EVGroup[$projectID]['value']) ? (int)$EVGroup[$projectID]['value'] * 100 : 0;
$project->ac = isset($ACGroup[$projectID]['value']) ? (int)$ACGroup[$projectID]['value'] * 100 : 0;
$project->sv = isset($SVGroup[$projectID]['value']) ? (int)$SVGroup[$projectID]['value'] * 100 : 0;
$project->cv = isset($CVGroup[$projectID]['value']) ? (int)$CVGroup[$projectID]['value'] * 100 : 0;
}
if($project->end != LONG_TIME) $project->remainingDays = helper::diffDate($project->end, helper::today());
$project->risks = isset($riskCountGroup[$projectID]['value']) ? (int)$riskCountGroup[$projectID]['value'] * 100 : 0;
$project->issues = isset($issueCountGroup[$projectID]['value']) ? (int)$issueCountGroup[$projectID]['value'] * 100 : 0;
return $project;
}
}