From 11f0ca4453ccda798e69f0d2740fe2d56b4e7e4f Mon Sep 17 00:00:00 2001 From: liugang Date: Wed, 21 Sep 2022 11:10:34 +0800 Subject: [PATCH] * Optimize the method getPairs of the product module. --- module/product/control.php | 6 ++-- module/product/model.php | 68 +++++++++++++++++++++---------------- module/testtask/control.php | 4 +-- module/tree/control.php | 3 +- 4 files changed, 44 insertions(+), 37 deletions(-) diff --git a/module/product/control.php b/module/product/control.php index d4fa601d3c..0c0edadad0 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1135,15 +1135,15 @@ class product extends control */ public function ajaxGetDropMenu($productID, $module, $method, $extra = '', $from = '') { - $queryType = 'normal'; + $shadow = 0; if($from == 'qa') { - $queryType = 'all'; + $shadow = 'all'; $this->app->loadConfig('qa'); foreach($this->config->qa->menuList as $menu) $this->lang->navGroup->$menu = 'qa'; } - $products = $this->app->tab == 'project' ? $this->product->getProducts($this->session->project) : $this->product->getList(0, 'all', 0, 0, $queryType); + $products = $this->app->tab == 'project' ? $this->product->getProducts($this->session->project) : $this->product->getList(0, 'all', 0, 0, $shadow); $programProducts = array(); foreach($products as $product) $programProducts[$product->program][] = $product; diff --git a/module/product/model.php b/module/product/model.php index 79847ff6aa..4c461baba0 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -263,11 +263,11 @@ class productModel extends model /** * Get products. * - * @param int $programID - * @param string $status - * @param int $limit - * @param int $line - * @param string $shadow all | 0 | 1 + * @param int $programID + * @param string $status + * @param int $limit + * @param int $line + * @param string|int $shadow all | 0 | 1 * @access public * @return array */ @@ -298,7 +298,7 @@ class productModel extends model ->beginIF($limit > 0)->limit($limit)->fi() ->fetchAll('id'); - if($shadow == 'all') + if($shadow) { $shadowProducts = array(); foreach($products as $product) @@ -311,8 +311,6 @@ class productModel extends model ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product') ->leftJoin(TABLE_PROJECT)->alias('t3')->on("t2.project = t3.id AND t3.type = 'project'") ->where('t1.id')->in($shadowProducts) - ->andWhere('t3.deleted')->eq('0') - ->andWhere('t3.type')->eq('project') ->fetchPairs(); foreach($shadowProducts as $id => $name) { @@ -373,10 +371,10 @@ class productModel extends model * @param string $mode * @param string $programID * @param string|array $append - * @param bool $dealShadow: If it is true, the name of the shadow product will be displayed as the name of the project. If it is false, the shadow product will be hidden. + * @param string|int $shadow all | 0 | 1 * @return array */ - public function getPairs($mode = '', $programID = 0, $append = '', $dealShadow = false) + public function getPairs($mode = '', $programID = 0, $append = '', $shadow = 0) { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProductPairs(); @@ -385,38 +383,48 @@ class productModel extends model $views = empty($append) ? $this->app->user->view->products : $this->app->user->view->products . ",$append"; if($this->config->systemMode == 'new') { - $select = 't1.*, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed'; - if($dealShadow) $select = 't1.*, IF(t1.shadow = 1, t4.name, t1.name) AS name, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed'; + if($shadow) + { + $this->dao->select('t1.*, IF(t1.shadow = 1, t4.name, t1.name) AS name, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed')->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id') + ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t3')->on('t1.id = t3.product') + ->leftJoin(TABLE_PROJECT)->alias('t4')->on("t3.project = t4.id AND t4.type = 'project'"); + } + else + { + $this->dao->select('t1.*, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed')->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id'); + } /* Order by program. */ - return $this->dao->select($select)->from(TABLE_PRODUCT)->alias('t1') - ->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id') - ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t3')->on('t1.id = t3.product') - ->leftJoin(TABLE_PROJECT)->alias('t4')->on('t3.project = t4.id') - ->where(1) + return $this->dao->where(1) ->beginIF(strpos($mode, 'all') === false)->andWhere('t1.deleted')->eq(0)->fi() ->beginIF($programID)->andWhere('t1.program')->eq($programID)->fi() ->beginIF(strpos($mode, 'noclosed') !== false)->andWhere('t1.status')->ne('closed')->fi() ->beginIF(!$this->app->user->admin and $this->config->vision == 'rnd')->andWhere('t1.id')->in($views)->fi() - ->beginIF(!$dealShadow)->andWhere('t1.shadow')->eq(0)->fi() + ->beginIF($shadow != 'all')->andWhere('t1.shadow')->eq((int)$shadow)->fi() ->andWhere('t1.vision')->eq($this->config->vision) ->orderBy('isClosed, t2.order_asc, t1.line_desc, t1.order_asc') ->fetchPairs('id', 'name'); } else { - $select = 't1.*, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed'; - if($dealShadow) $select = 't1.*, IF(t1.shadow = 1, t3.name, t1.name) AS name, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed'; + if($shadow) + { + $this->dao->select('t1.*, IF(t1.shadow = 1, t3.name, t1.name) AS name, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed')->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product') + ->leftJoin(TABLE_PROJECT)->alias('t3')->on("t2.project = t3.id AND t3.type = 'project'"); + } + else + { + $this->dao->select('t1.*, IF(INSTR(" closed", t1.status) < 2, 0, 1) AS isClosed')->from(TABLE_PRODUCT)->alias('t1'); + } $orderBy = !empty($this->config->product->orderBy) ? $this->config->product->orderBy : 'isClosed'; - return $this->dao->select('*, IF(INSTR(" closed", status) < 2, 0, 1) AS isClosed') - ->from(TABLE_PRODUCT)->alias('t1') - ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product') - ->leftJoin(TABLE_PROJECT)->alias('t3')->on('t2.project = t3.id') - ->where(1) + return $this->dao->where(1) ->beginIF(strpos($mode, 'all') === false)->andWhere('t1.deleted')->eq(0)->fi() ->beginIF($programID)->andWhere('t1.program')->eq($programID)->fi() ->beginIF(strpos($mode, 'noclosed') !== false)->andWhere('t1.status')->ne('closed')->fi() ->beginIF(!$this->app->user->admin and $this->config->vision == 'rnd')->andWhere('t1.id')->in($views)->fi() - ->beginIF(!$dealShadow)->andWhere('t1.shadow')->eq(0)->fi() + ->beginIF($shadow != 'all')->andWhere('t1.shadow')->eq((int)$shadow)->fi() ->andWhere('t1.vision')->eq($this->config->vision) ->orderBy($orderBy) ->fetchPairs('id', 'name'); @@ -556,10 +564,10 @@ class productModel extends model /** * Get ordered products. * - * @param string $status - * @param int $num - * @param int $projectID - * @param mixed $shadow all | 0 | 1 + * @param string $status + * @param int $num + * @param int $projectID + * @param string|int $shadow all | 0 | 1 * @access public * @return array */ diff --git a/module/testtask/control.php b/module/testtask/control.php index 0d6bec0eba..5c12a25e90 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -57,13 +57,13 @@ class testtask extends control } else { - $products = $this->product->getPairs('', 0, '', true); + $products = $this->product->getPairs('', 0, '', 'all'); } if(empty($products) and !helper::isAjaxRequest()) helper::end($this->locate($this->createLink('product', 'showErrorNone', "moduleName=$tab&activeMenu=testtask&objectID=$objectID"))); } else { - $products = $this->product->getPairs('', 0, '', true); + $products = $this->product->getPairs('', 0, '', 'all'); } $this->view->products = $this->products = $products; } diff --git a/module/tree/control.php b/module/tree/control.php index 959734be20..2ec0211ea5 100644 --- a/module/tree/control.php +++ b/module/tree/control.php @@ -102,8 +102,7 @@ class tree extends control if($viewType == 'story') { /* Set menu.*/ - $lib = $this->product->getById($rootID); - $products = $this->product->getPairs($mode = '', $programID = 0, $append = '', !empty($lib->shadow)); + $products = $this->product->getPairs($mode = '', $programID = 0, $append = '', 'all'); $this->product->saveState($rootID, $products); unset($products[$rootID]);