diff --git a/module/product/control.php b/module/product/control.php index c1cc8b662a..bfe9d9ab37 100755 --- a/module/product/control.php +++ b/module/product/control.php @@ -826,9 +826,22 @@ class product extends control if(empty($storyType)) $storyType = key($storyTypeList); /* Load pager. */ - $this->app->loadClass('pager', true); - $pager = new pager($recTotal, $recPerPage, $pageID); - $stories = $this->productZen->getStories($projectID, $productID, $branch, 0, (int)$param, ($browseType == 'bysearch' ? $storyType : 'all'), $browseType, $trackOrder, $pager); + if($browseType == 'bysearch' || $this->app->rawModule == 'projectstory') + { + $stories = $this->productZen->getStories($projectID, $productID, $branch, 0, (int)$param, ($browseType == 'bysearch' ? $storyType : 'all'), $browseType, $trackOrder); + } + else + { + $queryStoryType = 'all'; + if($storyType == 'requirement') $queryStoryType = 'requirement,story'; + if($storyType == 'story') $queryStoryType = 'story'; + if($browseType == 'bysearch') $queryStoryType = $storyType; + + $this->app->loadClass('pager', true); + $pager = new pager($recTotal, $recPerPage, $pageID); + $stories = $this->productZen->getStoriesByStoryType($productID, $branch, $queryStoryType, $trackOrder, $pager); + $this->view->pager = $pager; + } $tracks = $this->loadModel('story')->getTracksByStories($stories, $storyType); $customFields = $this->productZen->getCustomFieldsForTrack($storyType); @@ -861,7 +874,6 @@ class product extends control $this->view->title = $this->lang->story->track; $this->view->tracks = $tracks; $this->view->storyIdList = array_keys($stories); - $this->view->pager = $pager; $this->view->productID = $productID; $this->view->branch = $branch; $this->view->projectID = $projectID; diff --git a/module/product/ui/track.html.php b/module/product/ui/track.html.php index e3c6636581..ba9a40cf33 100644 --- a/module/product/ui/track.html.php +++ b/module/product/ui/track.html.php @@ -28,8 +28,8 @@ foreach($lang->story->trackOrderByList as $orderByType => $orderByName) $item['text'] = $orderByName; $item['selected'] = strpos($orderBy, $orderByType) === 0; $item['items'] = array(); - $item['items'][] = array('text' => $lang->story->trackSortList['asc'], 'selected' => $orderBy == "{$orderByType}_asc", 'url' => createLink($app->rawModule, 'track', sprintf($paramTemplate, $storyType, "{$orderByType}_asc") . "&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}")); - $item['items'][] = array('text' => $lang->story->trackSortList['desc'], 'selected' => $orderBy == "{$orderByType}_desc", 'url' => createLink($app->rawModule, 'track', sprintf($paramTemplate, $storyType, "{$orderByType}_desc") . "&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}")); + $item['items'][] = array('text' => $lang->story->trackSortList['asc'], 'selected' => $orderBy == "{$orderByType}_asc", 'url' => createLink($app->rawModule, 'track', sprintf($paramTemplate, $storyType, "{$orderByType}_asc") . (isset($pager) ? "&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}" : ''))); + $item['items'][] = array('text' => $lang->story->trackSortList['desc'], 'selected' => $orderBy == "{$orderByType}_desc", 'url' => createLink($app->rawModule, 'track', sprintf($paramTemplate, $storyType, "{$orderByType}_desc") . (isset($pager) ? "&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}" : ''))); $orderByItems[] = $item; if($item['selected']) @@ -137,7 +137,7 @@ empty($tracks) ? div(setClass('dtable-empty-tip bg-white shadow'), span(setClass 'afterRender' => jsRaw('window.afterRender'), 'draggable' => false ))), - set::height('calc(100vh - 130px)') + set::height('calc(100vh - ' . (isset($pager) ? '130px' : '110px') . ')') ), - pager(setClass('justify-end')) + isset($pager) ? pager(setClass('justify-end')) : null ); diff --git a/module/product/zen.php b/module/product/zen.php index 9b44345af1..9cd521b25c 100644 --- a/module/product/zen.php +++ b/module/product/zen.php @@ -952,6 +952,46 @@ class productZen extends product return $stories; } + /** + * 根据需求类型获取需求。 + * Get stories by story type. + * + * @param int $productID + * @param string $branch + * @param string $storyType + * @param string $orderBy + * @param object $pager + * @access public + * @return array + */ + public function getStoriesByStoryType(int $productID, string $branch = '', string $storyType = 'all', string $orderBy = 'id_desc', object $pager = null): array + { + /* Append id for second sort. */ + $sort = common::appendOrder($orderBy); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); + + $parentIdList = array(); + if($storyType == 'requirement,story' && !empty($this->config->enableER)) $parentIdList = $this->dao->select('id')->from(TABLE_STORY)->where('type')->eq('epic')->andWhere('isParent')->eq(1)->fetchPairs('id', 'id'); + if($storyType == 'story' && (!empty($this->config->URAndSR) || $this->config->edition == 'ipd')) $parentIdList = $this->dao->select('id')->from(TABLE_STORY)->where('type')->eq('requirement')->andWhere('isParent')->eq(1)->fetchPairs('id', 'id'); + + $productQuery = $this->loadModel('story')->buildProductsCondition($productID, $branch); + $stories = $this->dao->select("*,plan,path")->from(TABLE_STORY) + ->where('deleted')->eq(0) + ->andWhere($productQuery) + ->andWhere('parent', true)->eq(0) + ->beginIF($parentIdList)->orWhere("parent")->in($parentIdList)->fi() + ->markRight(1) + ->andWhere("FIND_IN_SET('{$this->config->vision}', vision)") + ->beginIF($storyType != 'all')->andWhere('type')->in($storyType)->fi() + ->beginIF(empty($this->config->enableER))->andWhere('type')->ne('epic')->fi() + ->beginIF(empty($this->config->URAndSR) && $this->config->edition != 'ipd')->andWhere('type')->ne('requirement')->fi() + ->orderBy($orderBy) + ->page($pager) + ->fetchAll('id'); + + return $stories; + } + /** * 获取分支的配置数据。 * Get branch options.