From 46173702a5c91aa5c68f433ac15b7fadbc8a7a21 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 20 Sep 2018 10:23:53 +0800 Subject: [PATCH] * finish task #4887. --- module/block/control.php | 115 +++++++------------- module/block/lang/en.php | 1 + module/block/lang/zh-cn.php | 9 +- module/block/model.php | 21 +++- module/block/view/qastatisticblock.html.php | 54 ++++----- module/bug/lang/en.php | 2 - module/bug/lang/zh-cn.php | 2 - 7 files changed, 82 insertions(+), 122 deletions(-) diff --git a/module/block/control.php b/module/block/control.php index f9d9678996..1987f4738b 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -740,9 +740,10 @@ class block extends control { if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die(); - $status = isset($this->params->type) ? $this->params->type : ''; + $status = isset($this->params->type) ? $this->params->type : ''; + $num = isset($this->params->num) ? $this->params->num : ''; - $products = $this->block->getProductsLikeDropMenu($status); + $products = $this->block->getProductsLikeDropMenu($status, $num); $productIdList = array_keys($products); if(empty($products)) @@ -873,7 +874,7 @@ class block extends control $num = isset($this->params->num) ? (int)$this->params->num : 0; /* Get projects. */ - $projects = $this->block->getProjectsLikeDropMenu($status); + $projects = $this->block->getProjectsLikeDropMenu($status, $num); if(empty($projects)) { $this->view->projects = $projects; @@ -979,9 +980,11 @@ class block extends control { if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die(); + $this->app->loadLang('bug'); $status = isset($this->params->type) ? $this->params->type : ''; + $num = isset($this->params->num) ? (int)$this->params->num : 0; - $products = $this->block->getProductsLikeDropMenu($status); + $products = $this->block->getProductsLikeDropMenu($status, $num); $productIdList = array_keys($products); if(empty($products)) @@ -990,91 +993,49 @@ class block extends control return false; } - $testedBuilds = $this->dao->select('build')->from(TABLE_TESTTASK)->where('product')->in(array_keys($products))->andWhere('project')->ne(0)->andWhere('deleted')->eq(0)->fetchPairs(); - $builds = $this->dao->select('id, product, name, bugs')->from(TABLE_BUILD)->where('id')->in($testedBuilds)->andWhere('deleted')->eq(0)->orderBy('id_desc')->fetchGroup('product', 'id'); - $openedBugs = $this->dao->select('id, openedBuild')->from(TABLE_BUG)->where('openedBuild')->in($testedBuilds)->andWhere('deleted')->eq(0)->fetchGroup('openedBuild', 'id'); - - /* Get bugs. */ - $bugIDList = array(); - foreach($builds as $product => $productBuilds) - { - foreach($productBuilds as $buildID => $build) - { - /* If don't clone $build, the exploded bugs of build will be stored in dao::$cache and it occurs an error when the qa statistic block be loaded twice. */ - $build = clone $build; - $build->bugs = explode(',', trim($build->bugs, ',')); - foreach($build->bugs as $bugID) $bugIDList[$bugID] = $bugID; - - $builds[$product][$buildID] = $build; - } - } - foreach($openedBugs as $buildBugs) - { - foreach($buildBugs as $bugID => $bug) $bugIDList[$bugID] = $bugID; - } - $today = date(DT_DATE1); $yesterday = date(DT_DATE1, strtotime('yesterday')); + $testtasks = $this->dao->select('*')->from(TABLE_TESTTASK)->where('product')->in($productIdList)->andWhere('project')->ne(0)->andWhere('deleted')->eq(0)->orderBy('id')->fetchAll('product'); + $bugs = $this->dao->select("product, count(id) as total, + count(assignedTo = '{$this->app->user->account}' or null) as assignedToMe, + count(status != 'closed' or null) as unclosed, + count((status != 'closed' and status != 'resolved') or null) as unresolved, + count(confirmed = '0' or null) as unconfirmed, + count((resolvedDate >= '$yesterday' and resolvedDate < '$today') or null) as yesterdayResolved, + count((closedDate >= '$yesterday' and closedDate < '$today') or null) as yesterdayClosed") + ->from(TABLE_BUG) + ->where('product')->in($productIdList) + ->andWhere('deleted')->eq(0) + ->groupBy('product') + ->fetchAll('product'); - $bugs = $this->loadModel('bug')->getByList($bugIDList, 'id, assignedTo, resolvedDate, closedDate, status'); - $confirmedBugs = $this->dao->select('objectID')->from(TABLE_ACTION) + $confirmedBugs = $this->dao->select('count(product) as product')->from(TABLE_ACTION) ->where('objectType')->eq('bug') ->andWhere('action')->eq('bugconfirmed') ->andWhere('date')->ge($yesterday) ->andWhere('date')->lt($today) - ->fetchPairs(); + ->groupBy('product') + ->fetchPairs('product', 'product'); - foreach($builds as $product => $productBuilds) + foreach($products as $productID => $product) { - foreach($productBuilds as $buildID => $build) - { - $build->total = 0; - $build->assignedToMe = 0; - $build->unresolved = 0; - $build->unconfirmed = 0; - $build->unclosed = 0; - $build->yesterdayResolved = 0; - $build->yesterdayConfirmed = 0; - $build->yesterdayClosed = 0; + $bug = isset($bugs[$productID]) ? $bugs[$productID] : ''; + $product->total = empty($bug) ? 0 : $bug->total; + $product->assignedToMe = empty($bug) ? 0 : $bug->assignedToMe; + $product->unclosed = empty($bug) ? 0 : $bug->unclosed; + $product->unresolved = empty($bug) ? 0 : $bug->unresolved; + $product->unconfirmed = empty($bug) ? 0 : $bug->unconfirmed; + $product->yesterdayResolved = empty($bug) ? 0 : $bug->yesterdayResolved; + $product->yesterdayClosed = empty($bug) ? 0 : $bug->yesterdayClosed; + $product->yesterdayConfirmed = empty($confirmedBugs[",$productID,"]) ? 0 : $confirmedBugs[",$productID,"]; - $buildOpenedBugs = zget($openedBugs, $buildID, array()); - $build->bugs = array_flip(array_merge(array_flip($build->bugs), array_flip(array_keys($buildOpenedBugs)))); - foreach($build->bugs as $key => $bugID) - { - if(!isset($bugs[$bugID])) continue; - - $bug = $bugs[$bugID]; - - if($bug->assignedTo = $this->app->user->account) $build->assignedToMe++; - - if($bug->status != 'closed') - { - $build->unclosed++; - - if($bug->status != 'resoloved') - { - $build->unresolved++; - - if($bug->status != 'confirmed') $build->unconfirmed++; - } - } - - if($bug->resolvedDate >= $yesterday && $bug->resolvedDate < $today) $build->yesterdayResolved++; - if($bug->closedDate >= $yesterday && $bug->closedDate < $today) $build->yesterdayClosed++; - if(isset($confirmedBugs[$bugID])) $yesterdayConfirmed++; - - $build->total++; - } - - $build->assignedRate = $build->total ? round($build->assignedToMe / $build->total * 100, 2) : 0; - $build->unresolvedRate = $build->total ? round($build->unresolved / $build->total * 100, 2) : 0; - $build->unconfirmedRate = $build->total ? round($build->unconfirmed / $build->total * 100, 2) : 0; - $build->unclosedRate = $build->total ? round($build->unclosed / $build->total * 100, 2) : 0; - } + $product->assignedRate = $product->total ? round($product->assignedToMe / $product->total * 100, 2) : 0; + $product->unresolvedRate = $product->total ? round($product->unresolved / $product->total * 100, 2) : 0; + $product->unconfirmedRate = $product->total ? round($product->unconfirmed / $product->total * 100, 2) : 0; + $product->unclosedRate = $product->total ? round($product->unclosed / $product->total * 100, 2) : 0; + $product->testtask = isset($testtasks[$productID]) ? $testtasks[$productID] : ''; } - foreach($products as $product) $product->builds = zget($builds, $product->id, array()); - $this->view->products = $products; } diff --git a/module/block/lang/en.php b/module/block/lang/en.php index 000c403a40..620e6016fd 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -34,6 +34,7 @@ $lang->block->dynamic = 'Dynamic'; $lang->block->assignToMe = 'Assign To Me'; $lang->block->lblFlowchart = 'Workflow'; $lang->block->welcome = 'Welcome'; +$lang->block->lblTesttask = 'Show test task'; $lang->block->leftToday = 'Works for Today'; $lang->block->myTask = 'My Task'; diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index e52a7cb2b4..3449c71af5 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -34,6 +34,7 @@ $lang->block->dynamic = '最新动态'; $lang->block->assignToMe = '指派给我'; $lang->block->lblFlowchart = '流程图'; $lang->block->welcome = '欢迎总览'; +$lang->block->lblTesttask = '查看测试详情'; $lang->block->leftToday = '今天剩余工作总计'; $lang->block->myTask = '我的任务'; @@ -66,8 +67,8 @@ $lang->block->default['product']['1']['title'] = $lang->productCommon . '统计' $lang->block->default['product']['1']['block'] = 'statistic'; $lang->block->default['product']['1']['grid'] = 8; -$lang->block->default['product']['1']['params']['orderBy'] = 'id_desc'; -$lang->block->default['product']['1']['params']['type'] = 'all'; +$lang->block->default['product']['1']['params']['type'] = 'all'; +$lang->block->default['product']['1']['params']['num'] = '20'; $lang->block->default['product']['2']['title'] = $lang->productCommon . '总览'; $lang->block->default['product']['2']['block'] = 'overview'; @@ -92,8 +93,8 @@ $lang->block->default['project']['1']['title'] = $lang->projectCommon . '统计' $lang->block->default['project']['1']['block'] = 'statistic'; $lang->block->default['project']['1']['grid'] = 8; -$lang->block->default['project']['1']['params']['orderBy'] = 'id_desc'; -$lang->block->default['project']['1']['params']['type'] = 'all'; +$lang->block->default['project']['1']['params']['type'] = 'all'; +$lang->block->default['project']['1']['params']['num'] = '20'; $lang->block->default['project']['2']['title'] = $lang->projectCommon . '总览'; $lang->block->default['project']['2']['block'] = 'overview'; diff --git a/module/block/model.php b/module/block/model.php index 49bc9f1b19..d3017d0beb 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -471,6 +471,9 @@ class blockModel extends model $params->type['options'] = $this->lang->block->typeList->product; $params->type['control'] = 'select'; + $params->num['name'] = $this->lang->block->num; + $params->num['control'] = 'input'; + return json_encode($params); } @@ -487,6 +490,9 @@ class blockModel extends model $params->type['options'] = $this->lang->block->typeList->project; $params->type['control'] = 'select'; + $params->num['name'] = $this->lang->block->num; + $params->num['control'] = 'input'; + return json_encode($params); } @@ -503,6 +509,9 @@ class blockModel extends model $params->type['options'] = $this->lang->block->typeList->product; $params->type['control'] = 'select'; + $params->num['name'] = $this->lang->block->num; + $params->num['control'] = 'input'; + return json_encode($params); } @@ -635,10 +644,11 @@ class blockModel extends model * Get products like drop menu order * * @param strint $status + * @param int $num * @access public * @return array */ - public function getProductsLikeDropMenu($status) + public function getProductsLikeDropMenu($status, $num) { $products = $this->loadModel('product')->getList($status); if(empty($products)) return $products; @@ -678,17 +688,19 @@ class blockModel extends model } $products = $mineProducts + $otherProducts + $closedProducts; - return $products; + if(empty($num)) return $products; + return array_slice($products, 0, $num, true); } /** * Get projects like drop menu order * * @param string $status + * @param int $num * @access public * @return array */ - public function getProjectsLikeDropMenu($status) + public function getProjectsLikeDropMenu($status, $num) { $projectList = $this->loadModel('project')->getList($status); if(empty($projectList)) return $projectList; @@ -712,6 +724,7 @@ class blockModel extends model } $projects = $mineProjects + $otherProjects + $closedProjects; - return $projects; + if(empty($num)) return $projects; + return array_slice($projects, 0, $num, true); } } diff --git a/module/block/view/qastatisticblock.html.php b/module/block/view/qastatisticblock.html.php index b6b29d546c..75d50aa01e 100644 --- a/module/block/view/qastatisticblock.html.php +++ b/module/block/view/qastatisticblock.html.php @@ -49,6 +49,7 @@ .block-statistic.block-sm .nav-secondary > li > a {padding: 5px 10px; border-radius: 4px;} .block-statistic.block-sm .nav-secondary > li > a:before {display: none;} .block-statistic.block-sm .nav-secondary > li.switch-icon {width: 40px;} +.block-statistic .statistic-menu {height:20px;}