* [perf story #69201] Add getTaskCount method.

This commit is contained in:
wangyidong
2024-11-27 13:07:18 +08:00
committed by 孙广明
parent ce23a27641
commit c3c84fabb2
2 changed files with 78 additions and 18 deletions
+30 -18
View File
@@ -538,6 +538,26 @@ class executionTao extends executionModel
return $taskGroups;
}
/**
* 递归获取任务数量。
* Get task count.
*
* @param array $tasks
* @access protected
* @return int
*
*/
protected function getTaskCount(array $tasks): int
{
$taskCount = count($tasks);
foreach($tasks as $task)
{
if(!empty($task->children)) $taskCount += $this->getTaskCount($task->children);
}
return $taskCount;
}
/**
* 追加子任务到任务
* Append children to task
@@ -581,7 +601,7 @@ class executionTao extends executionModel
if($node->id && isset($taskGroups[$node->id][0]))
{
$taskItems = $this->formatTasksForTree($taskGroups[$node->id][0]);
$node->tasksCount = count($taskItems);
$node->tasksCount = $this->getTaskCount($taskItems);
foreach($taskItems as $taskItem) $node->children[] = $taskItem;
}
@@ -633,8 +653,8 @@ class executionTao extends executionModel
$storyTasks = isset($taskGroups[$node->id][$story->id]) ? $taskGroups[$node->id][$story->id] : array();
if(!empty($storyTasks))
{
$taskItems = $this->formatTasksForTree($storyTasks, $story, $node, $taskGroups);
$storyItem->tasksCount = count($taskItems);
$taskItems = $this->formatTasksForTree($storyTasks, $stories);
$storyItem->tasksCount = $this->getTaskCount($taskItems);
$storyItem->children = $taskItems;
}
else
@@ -666,18 +686,9 @@ class executionTao extends executionModel
foreach($taskGroups[$node->id] as $tasks)
{
$taskItems = $this->formatTasksForTree($tasks, null, $node, $taskGroups);
$node->tasksCount += count($taskItems);
foreach($taskItems as $taskItem)
{
$node->children[$taskItem->id] = $taskItem;
if(!empty($tasks[$taskItem->id]->children))
{
$task = $this->formatTasksForTree($tasks[$taskItem->id]->children);
$node->children[$taskItem->id]->children=$task;
$node->tasksCount += count($task);
}
}
$taskItems = $this->formatTasksForTree($tasks);
$node->tasksCount += $this->getTaskCount($taskItems);
foreach($taskItems as $taskItem) $node->children[$taskItem->id] = $taskItem;
}
$node->children = array_values($node->children);
@@ -744,11 +755,11 @@ class executionTao extends executionModel
* Format tasks for tree.
*
* @param array $tasks
* @param object $story
* @param array $stories
* @access protected
* @return array
*/
protected function formatTasksForTree(array $tasks, object $story = null): array
protected function formatTasksForTree(array $tasks, array $stories = array()): array
{
static $users, $avatarPairs;
if(empty($users)) $users = $this->loadModel('user')->getPairs('noletter');
@@ -761,6 +772,7 @@ class executionTao extends executionModel
$userAvatar = zget($avatarPairs, $avatarAccount);
$userAvatar = $userAvatar && $avatarAccount != 'closed' ? "<img src='{$userAvatar}' />" : strtoupper(mb_substr($avatarAccount, 0, 1, 'utf-8'));
$story = zget($stories, $task->story, '');
$taskItem = new stdclass();
$taskItem->type = 'task';
$taskItem->id = $task->id;
@@ -779,7 +791,7 @@ class executionTao extends executionModel
$taskItem->avatarAccount = zget($users, $avatarAccount);
$taskItem->avatar = $userAvatar;
if(!empty($task->children)) $taskItem->children = $this->formatTasksForTree($task->children, $story);
if(!empty($task->children)) $taskItem->children = $this->formatTasksForTree($task->children, $stories);
$taskItems[] = $taskItem;
}
@@ -0,0 +1,48 @@
#!/usr/bin/env php
<?php
include dirname(__FILE__, 5) . '/test/lib/init.php';
include dirname(__FILE__, 2) . '/lib/execution.unittest.class.php';
/**
title=executionModel->getTaskCount();
cid=0
- 传入空数组,检查返回值 @0
- 传入无子任务数组。 @2
- 传入一级子任务数组 @4
- 传入二级子任务 @5
- 删除其中一级子任务 @3
*/
$tasks = array();
$tasks[0] = new stdclass();
$tasks[0]->id = 1;
$tasks[0]->name = 'test1';
$tasks[1] = new stdclass();
$tasks[1]->id = 2;
$tasks[1]->name = 'test2';
global $tester;
$executionModel = $tester->loadModel('execution');
r($executionModel->getTaskCount(array())) && p() && e('0'); //传入空数组,检查返回值
r($executionModel->getTaskCount($tasks)) && p() && e('2'); //传入无子任务数组。
$tasks[1]->children = array();
$tasks[1]->children[0] = new stdclass();
$tasks[1]->children[0]->id = 3;
$tasks[1]->children[0]->name = 'test3';
$tasks[1]->children[1] = new stdclass();
$tasks[1]->children[1]->id = 4;
$tasks[1]->children[1]->name = 'test4';
r($executionModel->getTaskCount($tasks)) && p() && e('4'); //传入一级子任务数组
$tasks[1]->children[1]->children = array();
$tasks[1]->children[1]->children[0] = new stdclass();
$tasks[1]->children[1]->children[0]->id = 5;
r($executionModel->getTaskCount($tasks)) && p() && e('5'); //传入二级子任务
unset($tasks[1]->children[1]);
r($executionModel->getTaskCount($tasks)) && p() && e('3'); //删除其中一级子任务