From b71da2d1bdcdc8feaaace50ad84c5f31ea31d944 Mon Sep 17 00:00:00 2001 From: wangyuting Date: Wed, 20 Dec 2023 15:26:05 +0800 Subject: [PATCH] * Refactor userModel::getProductMembers and fix computeuserview unit test bug. --- module/user/model.php | 118 ++++++++++--------- module/user/test/model/computeuserview.php | 1 + module/user/test/model/getproductmembers.php | 31 ----- 3 files changed, 64 insertions(+), 86 deletions(-) delete mode 100755 module/user/test/model/getproductmembers.php diff --git a/module/user/model.php b/module/user/model.php index 977c2bdb8a..eeb18788ea 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -1633,19 +1633,20 @@ class userModel extends model * 初始化访问权限所属的数据。 * Init user view objects. * + * @param bool $force * @access private * @return array */ - private function initViewObjects(): array + private function initViewObjects(bool $force = false): array { static $allProducts, $allProjects, $allPrograms, $allSprints, $teams, $whiteList, $stakeholders; - if(!$allProducts) $allProducts = $this->dao->select('id,PO,QD,RD,createdBy,acl,whitelist,program,createdBy,reviewer,PMT')->from(TABLE_PRODUCT)->where('acl')->ne('open')->fetchAll('id'); - if(!$allProjects) $allProjects = $this->dao->select('id,PO,PM,QD,RD,acl,type,path,parent,openedBy')->from(TABLE_PROJECT)->where('acl')->ne('open')->andWhere('type')->eq('project')->fetchAll('id'); - if(!$allPrograms) $allPrograms = $this->dao->select('id,PO,PM,QD,RD,acl,type,path,parent,openedBy')->from(TABLE_PROGRAM)->where('acl')->ne('open')->andWhere('type')->eq('program')->fetchAll('id'); - if(!$allSprints) $allSprints = $this->dao->select('id,PO,PM,QD,RD,acl,project,path,parent,type,openedBy')->from(TABLE_PROJECT)->where('acl')->eq('private')->andWhere('type')->in('sprint,stage,kanban')->fetchAll('id'); + if(!$allProducts || $force) $allProducts = $this->dao->select('id,PO,QD,RD,createdBy,acl,whitelist,program,createdBy,reviewer,PMT')->from(TABLE_PRODUCT)->where('acl')->ne('open')->fetchAll('id'); + if(!$allProjects || $force) $allProjects = $this->dao->select('id,PO,PM,QD,RD,acl,type,path,parent,openedBy')->from(TABLE_PROJECT)->where('acl')->ne('open')->andWhere('type')->eq('project')->fetchAll('id'); + if(!$allPrograms || $force) $allPrograms = $this->dao->select('id,PO,PM,QD,RD,acl,type,path,parent,openedBy')->from(TABLE_PROGRAM)->where('acl')->ne('open')->andWhere('type')->eq('program')->fetchAll('id'); + if(!$allSprints || $force) $allSprints = $this->dao->select('id,PO,PM,QD,RD,acl,project,path,parent,type,openedBy')->from(TABLE_PROJECT)->where('acl')->eq('private')->andWhere('type')->in('sprint,stage,kanban')->fetchAll('id'); - if(!$teams) + if(!$teams || $force) { $teams = array(); $stmt = $this->dao->select('root,type,account')->from(TABLE_TEAM)->where('type')->in('project,execution')->query(); @@ -1653,7 +1654,7 @@ class userModel extends model } /* Get white list. */ - if(!$whiteList) + if(!$whiteList || $force) { $whiteList = array(); $stmt = $this->dao->select('objectID,objectType,account')->from(TABLE_ACL)->where('objectType')->in('program,project,sprint,product')->query(); @@ -1661,7 +1662,7 @@ class userModel extends model } /* Get stakeholders. */ - if(!$stakeholders) + if(!$stakeholders || $force) { $stakeholders = array(); $stmt = $this->dao->select('objectID,objectType,user')->from(TABLE_STAKEHOLDER)->query(); @@ -1888,7 +1889,7 @@ class userModel extends model if(empty($userView) || $force) { /* Init objects. */ - list($allProducts, $allProjects, $allPrograms, $allSprints, $teams, $whiteList, $stakeholders) = $this->initViewObjects(); + list($allProducts, $allProjects, $allPrograms, $allSprints, $teams, $whiteList, $stakeholders) = $this->initViewObjects($force); /* Init user view. */ $userView = new stdclass(); @@ -1927,42 +1928,59 @@ class userModel extends model } /** - * Get product teams and stakeholders. + * 获取产品关联的项目集干系人。 + * Get program stakeholder. * - * @param array $allProducts - * @access public + * @param array $programProduct + * @access private * @return array */ - public function getProductMembers($allProducts) + private function getProgramStakeholder($programProduct): array + { + $stakeholderGroups = array(); + $stmt = $this->dao->select('objectID,user')->from(TABLE_STAKEHOLDER) + ->where('objectType')->eq('program') + ->andWhere('objectID')->in(array_keys($programProduct)) + ->query(); + + while($programStakeholder = $stmt->fetch()) + { + $productIDList = zget($programProduct, $programStakeholder->objectID, array()); + foreach($productIDList as $productID) $stakeholderGroups[$productID][$programStakeholder->user] = $programStakeholder->user; + } + + $stmt = $this->dao->select('id,PM')->from(TABLE_PROGRAM) + ->where('type')->eq('program') + ->andWhere('id')->in(array_keys($programProduct)) + ->query(); + + while($programOwner = $stmt->fetch()) + { + $productIDList = zget($programProduct, $programOwner->id, array()); + foreach($productIDList as $productID) $stakeholderGroups[$productID][$programOwner->PM] = $programOwner->PM; + } + + return $stakeholderGroups; + } + + /** + * Get product teams and stakeholders. + * + * @param array $allProducts + * @access private + * @return array + */ + private function getProductMembers(array $allProducts): array { /* Get product and project relation. */ $projectProducts = array(); - $productProjects = array(); $stmt = $this->dao->select('t1.project, t1.product')->from(TABLE_PROJECTPRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') ->where('t1.product')->in(array_keys($allProducts)) ->andWhere('t2.deleted')->eq('0') ->query(); - while($projectProduct = $stmt->fetch()) - { - $productProjects[$projectProduct->product][$projectProduct->project] = $projectProduct->project; - $projectProducts[$projectProduct->project][$projectProduct->product] = $projectProduct->product; - } - /* Get linked projects teams. */ - $teamGroups = array(); - $stmt = $this->dao->select('root,account')->from(TABLE_TEAM) - ->where('1=1') - ->andWhere('type')->eq('project') - ->andWhere('root')->in(array_keys($projectProducts)) - ->andWhere('root')->ne(0) - ->query(); - - while($team = $stmt->fetch()) - { - $productIdList = zget($projectProducts, $team->root, array()); - foreach($productIdList as $productID) $teamGroups[$productID][$team->account] = $team->account; - } + while($projectProduct = $stmt->fetch()) $projectProducts[$projectProduct->project][$projectProduct->product] = $projectProduct->product; /* Get linked projects stakeholders. */ $stmt = $this->dao->select('objectID,user')->from(TABLE_STAKEHOLDER) @@ -1984,30 +2002,20 @@ class userModel extends model { if($product->program) $programProduct[$product->program][$product->id] = $product->id; } + if($programProduct) $stakeholderGroups = array_merge($stakeholderGroups, $this->getProgramStakeholder($programProduct)); - if($programProduct) + /* Get linked projects teams. */ + $teamGroups = array(); + $stmt = $this->dao->select('root,account')->from(TABLE_TEAM) + ->where('type')->eq('project') + ->andWhere('root')->in(array_keys($projectProducts)) + ->andWhere('root')->ne(0) + ->query(); + + while($team = $stmt->fetch()) { - $stmt = $this->dao->select('objectID,user')->from(TABLE_STAKEHOLDER) - ->where('objectType')->eq('program') - ->andWhere('objectID')->in(array_keys($programProduct)) - ->query(); - - while($programStakeholder = $stmt->fetch()) - { - $productIdList = zget($programProduct, $programStakeholder->objectID, array()); - foreach($productIdList as $productID) $stakeholderGroups[$productID][$programStakeholder->user] = $programStakeholder->user; - } - - $sql = $this->dao->select('id,PM')->from(TABLE_PROGRAM) - ->where('type')->eq('program') - ->andWhere('id')->in(array_keys($programProduct)) - ->query(); - - while($programOwner = $sql->fetch()) - { - $productIdList = zget($programProduct, $programOwner->id, array()); - foreach($productIdList as $productID) $stakeholderGroups[$productID][$programOwner->PM] = $programOwner->PM; - } + $productIdList = zget($projectProducts, $team->root, array()); + foreach($productIdList as $productID) $teamGroups[$productID][$team->account] = $team->account; } return array($teamGroups, $stakeholderGroups); diff --git a/module/user/test/model/computeuserview.php b/module/user/test/model/computeuserview.php index f37ba9f59b..bbb9cc504f 100755 --- a/module/user/test/model/computeuserview.php +++ b/module/user/test/model/computeuserview.php @@ -23,6 +23,7 @@ pid=1 include dirname(__FILE__, 5) . '/test/lib/init.php'; include dirname(__FILE__, 2) . '/user.class.php'; +dao::$cache = array(); zdTable('user')->gen(10); zdTable('userview')->gen(10); zdTable('team')->config('team')->gen(200); diff --git a/module/user/test/model/getproductmembers.php b/module/user/test/model/getproductmembers.php deleted file mode 100755 index 7c40500248..0000000000 --- a/module/user/test/model/getproductmembers.php +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env php -getProductMembers(); -cid=1 -pid=1 - -获取ID为1的产品的团队成员,判断是否包含pm92 >> pm92 -获取ID为4的产品的团队成员,判断是否包含user5 >> user5 -获取ID为2的产品的干系人,判断是否包含po3 >> po3 -获取ID为3的产品的干系人,判断是否包含user14 >> user14 - -*/ - -$user = new userTest(); -$products = array(1 => 1, 2 => 2, 3 => 3, 4 => 4); - -$members = $user->getProductMembersTest($products); -$teamGroups = $members[0]; -$stakeholderGroups = $members[0]; - -r($teamGroups) && p('1:pm92') && e('pm92'); //获取ID为1的产品的团队成员,判断是否包含pm92 -r($teamGroups) && p('4:user5') && e('user5'); //获取ID为4的产品的团队成员,判断是否包含user5 -r($stakeholderGroups) && p('2:po3') && e('po3'); //获取ID为2的产品的干系人,判断是否包含po3 -r($stakeholderGroups) && p('3:user14') && e('user14'); //获取ID为3的产品的干系人,判断是否包含user14 -