diff --git a/module/execution/tao.php b/module/execution/tao.php index b00b4f0da6..d7bca3f4ee 100644 --- a/module/execution/tao.php +++ b/module/execution/tao.php @@ -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' ? "" : 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; } diff --git a/module/execution/test/tao/gettaskcount.php b/module/execution/test/tao/gettaskcount.php new file mode 100644 index 0000000000..3e0edd31f7 --- /dev/null +++ b/module/execution/test/tao/gettaskcount.php @@ -0,0 +1,48 @@ +#!/usr/bin/env php +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'); //删除其中一级子任务