diff --git a/module/productplan/zen.php b/module/productplan/zen.php index 85b0775093..00a9d69b3b 100644 --- a/module/productplan/zen.php +++ b/module/productplan/zen.php @@ -433,15 +433,17 @@ class productplanZen extends productplan */ public function reorderStories() { - /* 对需求重新按照父子关系排序,保证进入需求详情后上一页下一页的URL符合预期。 */ + /* 获取不分页的 SQL 语句,为重新按照父子关系排序做准备。*/ $sql = $this->dao->get(); if(strpos($sql, 'LIMIT')) $sql = substr($sql, 0, strpos($sql, 'LIMIT')); - $parents = array(); + /* 取出用户重新排序的关键字段。*/ + $stories = array(); $query = $this->dao->query($sql); - while($story = $query->fetch()) $parents[$story->id] = $story->parent; + while($story = $query->fetch()) $stories[$story->id] = (object)['id' => $story->id, 'parent' => $story->parent, 'grade' => $story->grade]; - $objectList = $this->loadModel('story')->reorderStories($parents); + /* 对需求重新按照父子关系排序,保证进入需求详情后上一页下一页的URL符合预期。 */ + $objectList = $this->loadModel('story')->reorderStories($stories); if($objectList) $this->session->set('storyBrowseList', array('sql' => $sql, 'idkey' => 'id', 'objectList' => $objectList), $this->app->tab); } } diff --git a/module/story/tao.php b/module/story/tao.php index bfe193cf5c..5175be37b0 100644 --- a/module/story/tao.php +++ b/module/story/tao.php @@ -2497,53 +2497,43 @@ class storyTao extends storyModel */ public function reorderStories(array $stories): array { - $tree = $this->buildStoryTree($stories); + $storyCount = count($stories); - $result = array(); - $this->buildReorderResult($tree, $result); + /* 按照需求的层级倒序排序。*/ + usort($stories, function($a, $b) {return $b->grade - $a->grade;}); + + /* 将需求按照父子关系组成树形结构。*/ + foreach($stories as $id => $story) + { + if(!isset($stories[$story->parent])) continue; + + $stories[$story->parent]->children[] = $story; + unset($stories[$id]); + } + + /* 把树形嵌套数组提取成一维数组。*/ + $orderedStories = $this->extractStories($stories); /* 重排后数量如果和重排之前不一致,说明该列表只有子任务、没有父任务,使用重排之前的顺序。*/ - return count($stories) == count($result) ? $result : array_keys($stories); + return $storyCount == count($orderedStories) ? $orderedStories : array_keys($stories); } /** - * 递归将一维需求数组构造成父子关系的嵌套数组。 - * Build story tree by parent and children. + * 把树形嵌套数组提取成一维数组。 + * Extract stories from nested array. * * @param array $stories - * @param int $parentId * @access public * @return array */ - public function buildStoryTree(array &$stories, int $parentId = 0): array + public function extractStories(array $stories): array { - $tree = array(); - foreach($stories as $id => $parent) + $result = []; + foreach($stories as $story) { - if($parent == $parentId) - { - $tree[$id] = $this->buildStoryTree($stories, $id); - } - } - - return $tree; - } - - /** - * 递归将父子关系的嵌套数组构造成一维需求数组。 - * Build story result by parent and children. - * - * @param array $parent - * @param array $result - * @access public - * @return void - */ - public function buildReorderResult(array $parent, array &$result) - { - foreach($parent as $key => $children) - { - $result[$key] = $key; - if(!empty($children)) $this->buildReorderResult($children, $result); + $result[$story->id] = $story->id; + if(!empty($story->children)) $result += $this->extractStories($story->children); } + return $result; } }