diff --git a/module/task/model.php b/module/task/model.php index d1a7a9fe92..d62f594b35 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -2463,10 +2463,8 @@ class taskModel extends model public function getExecutionTasks(int $executionID, int $productID = 0, string|array $type = 'all', array $modules = array(), string $orderBy = 'status_asc, id_desc', object $pager = null): array { $tasks = $this->taskTao->fetchExecutionTasks($executionID, $productID, $type, $modules, $orderBy, $pager); - if(empty($tasks)) return array(); - $parents = array(); $taskTeam = $this->taskTao->getTeamMembersByIdList(array_keys($tasks)); foreach($tasks as $task) { @@ -2475,7 +2473,15 @@ class taskModel extends model if($this->config->vision == 'lite') $tasks = $this->appendLane($tasks); - $tasks = $this->taskTao->restructureHierarchy($tasks); + $parentIdList = array(); + foreach($tasks as $task) + { + if($task->parent <= 0 or isset($tasks[$task->parent]) or isset($parentIdList[$task->parent])) continue; + $parentIdList[$task->parent] = $task->parent; + } + + $parentTasks = $this->getByList($parentIdList); + $tasks = $this->taskTao->buildTaskTree($tasks, $parentTasks); return $this->processTasks($tasks); } @@ -2626,19 +2632,26 @@ class taskModel extends model * @access public * @return object[] */ - public function getStoryTasks(int $storyID, int $executionID = 0, int $projectID = 0): array + public function getListByStory(int $storyID, int $executionID = 0, int $projectID = 0): array { $tasks = $this->dao->select('id, parent, name, assignedTo, pri, status, estimate, consumed, closedReason, `left`') ->from(TABLE_TASK) - ->where('story')->eq((int)$storyID) + ->where('story')->eq($storyID) ->andWhere('deleted')->eq(0) ->beginIF($executionID)->andWhere('execution')->eq($executionID)->fi() ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() ->fetchAll('id'); - $tasks = $this->taskTao->restructureHierarchy($tasks); + $parentIdList = array(); + foreach($tasks as $task) + { + if($task->parent <= 0 or isset($tasks[$task->parent]) or isset($parentIdList[$task->parent])) continue; + $parentIdList[$task->parent] = $task->parent; + } - return $this->taskTao->computeTasksProgress($tasks); + $parentTasks = $this->getByList($parentIdList); + $tasks = $this->taskTao->buildTaskTree($tasks, $parentTasks); + return $this->taskTao->batchComputeProgress($tasks); } /** diff --git a/module/task/tao.php b/module/task/tao.php index eef8e7b7ee..cea6c29c4a 100644 --- a/module/task/tao.php +++ b/module/task/tao.php @@ -17,42 +17,39 @@ class taskTao extends taskModel * 获取任务的进度。 * * @param object $task - * @access private + * @access protected * @return float */ protected function computeTaskProgress(object $task): float { - if($task->consumed == 0 and $task->left == 0) return 0; - if($task->consumed != 0 and $task->left == 0) return 100; - return round($task->consumed / ($task->consumed + $task->left), 2) * 100; + if($task->left != 0) return round($task->consumed / ($task->consumed + $task->left), 2) * 100; + if($task->consumed == 0) return 0; + return 100; } /** * Compute progress of task list, include its' children. * 计算任务列表中每个任务的进度,包括子任务。 * - * @param array $tasks - * @access private + * @param object[] $tasks + * @access protected * @return object[] */ - protected function computeTasksProgress(array $tasks): array + protected function batchComputeProgress(array $tasks): array { foreach($tasks as $task) { - $task->progress = $this->computeTaskProgress($task); - + $task->progress = $this->computeProgress($task); if(empty($task->children)) continue; - foreach($task->children as $child) - { - $child->progress = $this->computeTaskProgress($child); - } + + $task->children = $this->batchComputeProgress($task->children); } return $tasks; } /** - * Fetch tasks under execution by executionID, + * Fetch tasks under execution by executionID(Todo). * 获取执行下的任务。 * * @param int $executionID @@ -175,14 +172,13 @@ class taskTao extends taskModel * @param string $field * @param string $condition * @access public - * @return ojbect[] + * @return object[] */ protected function getListByReportCondition(string $field, string $condition): array { - $tasks = $this->dao->select("id,{$field}")->from(TABLE_TASK) + return $this->dao->select("id,{$field}")->from(TABLE_TASK) ->where($condition) ->fetchAll('id'); - return $tasks; } /** @@ -223,31 +219,25 @@ class taskTao extends taskModel * Change the hierarchy of tasks to a parent-child structure. * 将任务的层级改为父子结构。 * - * @param array $tasks + * @param object[] $tasks + * @param object[] $parentTasks * @access protected * @return object[] */ - protected function restructureHierarchy(array $tasks): array + protected function buildTaskTree(array $tasks, array $parentTasks): array { - $parentIdList = array(); - foreach($tasks as $task) - { - if($task->parent <= 0 or isset($tasks[$task->parent]) or isset($parentIdList[$task->parent])) continue; - $parentIdList[$task->parent] = $task->parent; - } - - $parents = $this->getByList($parentIdList); foreach($tasks as $task) { if($task->parent <= 0) continue; if(isset($tasks[$task->parent])) { + if(!isset($tasks[$task->parent]->children)) $tasks[$task->parent]->children = array(); $tasks[$task->parent]->children[$task->id] = $task; unset($tasks[$task->id]); } else { - $parent = $parents[$task->parent]; + $parent = $parentTasks[$task->parent]; $task->parentName = $parent->name; } } diff --git a/module/task/test/model/getstorytasks.php b/module/task/test/model/getlistbystory.php similarity index 53% rename from module/task/test/model/getstorytasks.php rename to module/task/test/model/getlistbystory.php index 2d8a852f07..8355042d1a 100755 --- a/module/task/test/model/getstorytasks.php +++ b/module/task/test/model/getlistbystory.php @@ -6,7 +6,7 @@ su('admin'); /** -title=taskModel->getStoryTasks(); +title=taskModel->getListByStory(); cid=1 pid=1 @@ -19,5 +19,5 @@ $storyID = '1'; $count = array('0','1'); $task = new taskTest(); -r($task->getStoryTasksTest($storyID,$count[0])) && p('1:name') && e('开发任务11'); // 根据需求查看任务 -r($task->getStoryTasksTest($storyID,$count[1])) && p() && e('6'); // 根据需求查看任务数量统计 \ No newline at end of file +r($task->getListByStoryTest($storyID,$count[0])) && p('1:name') && e('开发任务11'); // 根据需求查看任务 +r($task->getListByStoryTest($storyID,$count[1])) && p() && e('6'); // 根据需求查看任务数量统计 diff --git a/module/task/test/tao/batchcomputeprogress.php b/module/task/test/tao/batchcomputeprogress.php new file mode 100755 index 0000000000..d60aed8d18 --- /dev/null +++ b/module/task/test/tao/batchcomputeprogress.php @@ -0,0 +1,35 @@ +#!/usr/bin/env php +id->range('1-5'); + $task->name->prefix('任务')->range('1-5'); + $task->consumed->range('0,10,15,20,25'); + $task->left->range('0,0,1,5,10'); + + $task->gen(5); +} + +/** + +title=taskModel->batchComputeProgress(); +timeout=0 +cid=2 + + +*/ +$tester->loadModel('task'); + +initData(); + +$taskIDList = range(1,5); +$taskList = $tester->task->getByList($taskIDList); + +r($tester->task->batchComputeProgress($taskList)) && p('1:progress') && e('0'); // 测试任务消耗工时为0,剩余工时为0的情况 +r($tester->task->batchComputeProgress($taskList)) && p('2:progress') && e('100'); // 测试任务消耗工时不为0,剩余工时为0的情况 +r($tester->task->batchComputeProgress($taskList)) && p('3:progress') && e('94'); // 测试任务消耗工时为15,剩余工时为1的情况 +r($tester->task->batchComputeProgress($taskList)) && p('4:progress') && e('80'); // 测试任务消耗工时为20,剩余工时为5的情况 +r($tester->task->batchComputeProgress($taskList)) && p('5:progress') && e('71'); // 测试任务消耗工时为25,剩余工时为10的情况 diff --git a/module/task/test/tao/buildtasktree.php b/module/task/test/tao/buildtasktree.php new file mode 100755 index 0000000000..bcc72bdf14 --- /dev/null +++ b/module/task/test/tao/buildtasktree.php @@ -0,0 +1,42 @@ +#!/usr/bin/env php +id->range('1-9'); +$task->name->setFields(array( + array('field' => 'name1', 'range' => '父任务{3},子任务{3},普通任务{3}'), + array('field' => 'name2', 'range' => '1-9') +)); +$task->parent->range('`-1`{3},,1{2},2,0{3}'); +$task->status->range('doing,closed,wait{2},doing{3},wait{2}'); +$task->closedBy->range('[],admin,[]{7}'); + +$task->gen(9); +su('admin'); + +/** + +title=taskModel->buildTaskTree(); +timeout=0 +cid=1 + +*/ + +$taskTester = new taskTest(); +$allTaskIdList = range(1, 9); +$notParentTaskIdList = range(4, 9); + +$emptyData = $taskTester->buildTaskTreeTest(array()); +$allTasks = $taskTester->buildTaskTreeTest($allTaskIdList); +$notParentTasks = $taskTester->buildTaskTreeTest($notParentTaskIdList); +$parentTask = current($allTasks); +$allTasksCount = count($allTasks); +$notParentTasksCount = count($notParentTasks); + +r($emptyData) && p() && e('0'); // 测试空数据的情况 +r($allTasksCount) && p() && e('6'); // 测试数据中有父任务时,重构结构后的任务数量 +r($parentTask->children) && p('4:name') && e('子任务4'); // 测试数据中有父任务时,重构结构后子任务的数据 +r($notParentTasksCount) && p() && e('6'); // 测试数据中没有父任务时,重构结构后的任务数量 +r($notParentTasks) && p('4:parentName') && e('父任务1'); // 测试数据中没有父任务时,重构结构后的子任务中父任务的名称 diff --git a/module/task/test/tao/computetasksprogress.php b/module/task/test/tao/computetasksprogress.php deleted file mode 100755 index 1fa21dcf5c..0000000000 --- a/module/task/test/tao/computetasksprogress.php +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env php -id->range('1-5'); - $task->name->prefix('任务')->range('1-5'); - $task->consumed->range('0,10,15,20,25'); - $task->left->range('0,0,1,5,10'); - - $task->gen(5); -} - -/** - -title=测试computeTasksProgress -timeout=0 -cid=2 - - -*/ -$tester->loadModel('task'); - -initData(); - -$taskIDList = range(1,5); -$taskList = $tester->task->getByList($taskIDList); - -r($tester->task->computeTasksProgress($taskList)) && p('1:progress') && e('0'); //测试任务消耗工时为0,剩余工时为0的情况 -r($tester->task->computeTasksProgress($taskList)) && p('2:progress') && e('100'); //测试任务消耗工时不为0,剩余工时为0的情况 -r($tester->task->computeTasksProgress($taskList)) && p('3:progress') && e('94'); //测试任务消耗工时为15,剩余工时为1的情况 -r($tester->task->computeTasksProgress($taskList)) && p('4:progress') && e('80'); //测试任务消耗工时为20,剩余工时为5的情况 -r($tester->task->computeTasksProgress($taskList)) && p('5:progress') && e('71'); //测试任务消耗工时为25,剩余工时为10的情况 diff --git a/module/task/test/task.class.php b/module/task/test/task.class.php index 3c8311cf5e..a9392fcc8a 100644 --- a/module/task/test/task.class.php +++ b/module/task/test/task.class.php @@ -611,9 +611,9 @@ class taskTest * @access public * @return array */ - public function getStoryTasksTest($storyID, $count) + public function getListByStoryTest($storyID, $count) { - $object = $this->objectModel->getStoryTasks($storyID); + $object = $this->objectModel->getListByStory($storyID); if(dao::isError()) { $error = dao::getError(); @@ -1548,11 +1548,11 @@ class taskTest * @access public * @return object[] */ - public function restructureHierarchyTest(array $taskIdList): array + public function buildTaskTreeTest(array $taskIdList): array { $tasks = array(); if(!empty($taskIdList)) $tasks = $this->objectModel->getByList($taskIdList); - return $this->objectModel->restructureHierarchy($tasks); + return $this->objectModel->buildTaskTree($tasks); } /**