diff --git a/module/block/css/bugstatisticblock.ui.css b/module/block/css/bugstatisticblock.ui.css index 82dbad8a52..a7db3645ff 100644 --- a/module/block/css/bugstatisticblock.ui.css +++ b/module/block/css/bugstatisticblock.ui.css @@ -1,4 +1,4 @@ -.bugstatistic-block .progress-circle text {font-size: 35px;} -.bugstatistic-block .progress-circle .progress-text {position: relative; top: -45px;} -.bugstatistic-block .bg-secondary-pale {background: #F3F6FA;} -.bugstatistic-block .tab-pane .nav-tabs>.nav-item>a:after {border-bottom: none;} +.block-bugstatistic .progress-circle text {font-size: 35px;} +.block-bugstatistic .progress-circle .progress-text {position: relative; top: -45px;} +.block-bugstatistic .bg-secondary-pale {background: #F3F6FA;} +.block-bugstatistic .tab-pane .nav-tabs>.nav-item>a:after {border-bottom: none;} diff --git a/module/block/ui/bugstatisticblock.html.php b/module/block/ui/bugstatisticblock.html.php index 325f0c2864..d4225a6f34 100644 --- a/module/block/ui/bugstatisticblock.html.php +++ b/module/block/ui/bugstatisticblock.html.php @@ -11,18 +11,30 @@ declare(strict_types=1); namespace zin; -$uniqid = uniqid(); -$blockNavCode = 'nav-' . $uniqid; -$navTabs = array(); -$selected = key($products); -$statisticCells = array(); -$preproductID = 0; -$nextproductID = 0; -$productIdList = array_keys($products); -$tabItems = array(); -foreach($products as $productID => $product) +$active = isset($params['active']) ? $params['active'] : key($products); +$product = null; + +$items = array(); +foreach($products as $productItem) { - $productInfo = div + $projectID = isset($params['projectID']) ? $params['projectID'] : 0; + $params = helper::safe64Encode("module={$block->module}&projectID={$projectID}&active={$productItem->id}"); + $items[] = array + ( + 'id' => $productItem->id, + 'text' => $productItem->name, + 'url' => createLink('product', 'browse', "productID={$productItem->id}"), + 'activeUrl' => createLink('block', 'printBlock', "blockID={$block->id}¶ms={$params}") + ); + if($productItem->id == $active) $product = $productItem; +} + +statisticBlock +( + set::block($block), + set::active($active), + set::items($items), + div ( setClass('flex' . ($longBlock ? ' flex-nowrap' : ' flex-wrap')), cell @@ -34,10 +46,10 @@ foreach($products as $productID => $product) setClass('flex justify-center w-full'), zui::progressCircle ( - set('percent', zget($resolvedRate, $productID, 0)), + set('percent', $resolvedRate), set('size', 112), set('circleWidth', 6), - set('text', zget($resolvedRate, $productID, 0) . '%'), + set('text', $active . '%'), set('textY', 50), set('textStyle', 'font-size: 30px;'), ), @@ -65,7 +77,7 @@ foreach($products as $productID => $product) span ( setClass('flex justify-center'), - zget($totalBugs, $productID, 0), + $active, ), span ( @@ -78,7 +90,7 @@ foreach($products as $productID => $product) span ( setClass('flex justify-center'), - zget($closedBugs, $productID, 0), + $active, ), span ( @@ -91,7 +103,7 @@ foreach($products as $productID => $product) span ( setClass('flex justify-center'), - zget($unresovledBugs, $productID, 0), + $active, ), span ( @@ -125,169 +137,27 @@ foreach($products as $productID => $product) 'barWidth' => '8', 'stack' => 'Ad', 'name' => $lang->bug->activate, - 'data' => array_values($activateBugs[$productID]), + 'data' => $activateBug, ), array ( 'type' => 'bar', 'name' => $lang->bug->resolve, 'stack' => 'Ad', - 'data' => array_values($resolveBugs[$productID]), + 'data' => $resolveBug, ), array ( 'type' => 'bar', 'name' => $lang->bug->close, 'stack' => 'Ad', - 'data' => array_values($closeBugs[$productID]), + 'data' => $closeBug, ), ), ), )->size('100%', 200), ), - ); - - if($longBlock) - { - $navTabs[] = li - ( - setClass('nav-item'), - a - ( - setClass('ellipsis title ' . ($product->id == $selected ? ' active' : '')), - set('data-toggle', 'tab'), - set::href("#tab{$blockNavCode}Content{$product->id}"), - $product->name - - ), - a - ( - setClass('link flex-1 text-right hidden'), - set::href(helper::createLink('product', 'browse', "productID={$product->id}")), - icon - ( - setClass('rotate-90 text-primary'), - 'export' - ) - ) - ); - - $tabItems[] = div - ( - setClass('tab-pane' . ($product->id == $selected ? ' active' : '')), - set('id', "tab{$blockNavCode}Content{$product->id}"), - $productInfo, - ); - } - else - { - $index = array_search($product->id, $productIdList); - $nextProductID = $index !== false && !empty($productIdList[$index + 1]) ? $productIdList[$index + 1] : 0; - - $tabItems = array(); - $tabItems[] = cell - ( - ul - ( - setClass('nav nav-tabs h-10 px-1 justify-between items-center'), - set::width('100%'), - li - ( - setClass('nav-item'), - btn - ( - setClass('size-sm shadow-lg circle pre-button'), - set::square(true), - set::disabled(empty($preProductID)), - set::href("#tab{$blockNavCode}Content{$preProductID}"), - set('data-toggle', 'tab'), - set::iconClass('text-xl text-primary'), - set::icon('angle-left'), - ), - ), - li - ( - setClass('nav-item px-4'), - hasPriv('product', 'browse') ? btn - ( - setClass('ghost'), - set::url(createLink('product', 'browse', "productID={$product->id}")), - span - ( - setClass('text-primary'), - $product->name - ), - icon - ( - setClass('text-primary ml-4 rotate-90'), - 'export' - ), - ) : $product->name, - ), - li - ( - setClass('nav-item'), - btn - ( - setClass('size-sm shadow-lg circle next-button'), - set::square(true), - set::disabled(empty($nextProductID)), - set::href("#tab{$blockNavCode}Content{$nextProductID}"), - set('data-toggle', 'tab'), - set::iconClass('text-xl text-primary'), - set::icon('angle-right'), - ), - ), - ), - ); - $tabItems[] = cell - ( - setClass('tab-content pt-1'), - set::width('100%'), - div - ( - $productInfo, - ), - ); - $statisticCells[] = cell - ( - setClass('tab-pane pt-1 w-full' . ($product->id == $selected ? ' active' : '')), - set('id', "tab{$blockNavCode}Content{$product->id}"), - $tabItems, - ); - $preProductID = $product->id; - } -} -if($longBlock) -{ - $statisticCells[] = cell - ( - set::width('22%'), - setClass('bg-secondary-pale overflow-y-auto overflow-x-hidden'), - ul - ( - setClass('nav nav-tabs nav-stacked'), - $navTabs, - ), - ); - $statisticCells[] = cell - ( - setClass('tab-content'), - set::width('78%'), - $tabItems, - ); -} - -panel -( - setClass('bugstatistic-block ' . ($longBlock ? 'block-long' : 'block-sm')), - set::bodyClass('no-shadow border-t p-0'), - set::title($block->title), - div - ( - setClass('flex h-full' . (!$longBlock ? ' flex-wrap' : '')), - $statisticCells, - ) + ), ); render(); diff --git a/module/block/zen.php b/module/block/zen.php index 7357309c4b..47b1baf492 100644 --- a/module/block/zen.php +++ b/module/block/zen.php @@ -2603,23 +2603,24 @@ class blockZen extends block * Print bug statistic block. * * @param object $block + * @param array $param * @access protected * @return void */ - protected function printBugStatisticBlock(object $block) + protected function printBugStatisticBlock(object $block, array $params = array()) { /* 获取需要统计的产品列表。 */ /* Obtain a list of products that require statistics. */ - $status = isset($block->params->type) ? $block->params->type : ''; - $count = isset($block->params->count) ? $block->params->count : ''; - $products = $this->loadModel('product')->getOrderedProducts($status, (int)$count); - $productIdList = array_keys($products); + $status = isset($block->params->type) ? $block->params->type : ''; + $count = isset($block->params->count) ? $block->params->count : ''; + $products = $this->loadModel('product')->getOrderedProducts($status, (int)$count); + $productID = !empty($params['active']) ? $params['active'] : key($products); $this->loadModel('metric'); - $bugFixedRate = $this->metric->getResultByCode('rate_of_fixed_bug_in_product', array('product' => join(',', $productIdList))); // 从度量项获取各个产品的Bug修复率。 - $effectiveBugGroup = $this->metric->getResultByCode('count_of_effective_bug_in_product', array('product' => join(',', $productIdList))); // 从度量项获取各个产品的有效Bug数。 - $fixedBugGroup = $this->metric->getResultByCode('count_of_fixed_bug_in_product', array('product' => join(',', $productIdList))); // 从度量项获取各个产品的Bug修复数。 - $activatedBugGroup = $this->metric->getResultByCode('count_of_activated_bug_in_product', array('product' => join(',', $productIdList))); // 从度量项获取各个产品的Bug激活数。 + $bugFixedRate = $this->metric->getResultByCode('rate_of_fixed_bug_in_product', array('product' => $productID)); // 从度量项获取各个产品的Bug修复率。 + $effectiveBugGroup = $this->metric->getResultByCode('count_of_effective_bug_in_product', array('product' => $productID)); // 从度量项获取各个产品的有效Bug数。 + $fixedBugGroup = $this->metric->getResultByCode('count_of_fixed_bug_in_product', array('product' => $productID)); // 从度量项获取各个产品的Bug修复数。 + $activatedBugGroup = $this->metric->getResultByCode('count_of_activated_bug_in_product', array('product' => $productID)); // 从度量项获取各个产品的Bug激活数。 if(!empty($bugFixedRate)) $bugFixedRate = array_column($bugFixedRate, null, 'product'); if(!empty($effectiveBugGroup)) $effectiveBugGroup = array_column($effectiveBugGroup, null, 'product'); @@ -2637,64 +2638,56 @@ class blockZen extends block $groups[] = date('Y-m', strtotime("first day of -{$i} month")); } - $monthCreatedBugGroup = $this->metric->getResultByCode('count_of_monthly_created_bug_in_product', array('product' => join(',', $productIdList), 'year' => join(',', $years), 'month' => join(',', $months))); // 从度量项获取每月的激活Bug数。 - $monthFixedBugGroup = $this->metric->getResultByCode('count_of_monthly_fixed_bug_in_product', array('product' => join(',', $productIdList), 'year' => join(',', $years), 'month' => join(',', $months))); // 从度量项获取每月的解决Bug数。 - $monthClosedBugGroup = $this->metric->getResultByCode('count_of_monthly_closed_bug_in_product', array('product' => join(',', $productIdList), 'year' => join(',', $years), 'month' => join(',', $months))); // 从度量项获取每月的关闭Bug数。 + $monthCreatedBugGroup = $this->metric->getResultByCode('count_of_monthly_created_bug_in_product', array('product' => $productID, 'year' => join(',', $years), 'month' => join(',', $months))); // 从度量项获取每月的激活Bug数。 + $monthFixedBugGroup = $this->metric->getResultByCode('count_of_monthly_fixed_bug_in_product', array('product' => $productID, 'year' => join(',', $years), 'month' => join(',', $months))); // 从度量项获取每月的解决Bug数。 + $monthClosedBugGroup = $this->metric->getResultByCode('count_of_monthly_closed_bug_in_product', array('product' => $productID, 'year' => join(',', $years), 'month' => join(',', $months))); // 从度量项获取每月的关闭Bug数。 /* 组装页面所需的度量项数组。 */ - $closedBugs = array(); - $unresovledBugs = array(); - $resolvedRate = array(); - $activateBugs = array(); - $resolveBugs = array(); - $closeBugs = array(); - foreach($productIdList as $productID) + $closedBug = isset($fixedBugGroup[$productID]['value']) ? $fixedBugGroup[$productID]['value'] : 0; + $unresovledBug = isset($activatedBugGroup[$productID]['value']) ? $activatedBugGroup[$productID]['value'] : 0; + $totalBug = isset($effectiveBugGroup[$productID]['value']) ? $effectiveBugGroup[$productID]['value'] : 0; + $resolvedRate = isset($bugFixedRate[$productID]['value']) ? $bugFixedRate[$productID]['value'] * 100 : 0; + foreach($groups as $group) { - $closedBugs[$productID] = isset($fixedBugGroup[$productID]['value']) ? $fixedBugGroup[$productID]['value'] : 0; - $unresovledBugs[$productID] = isset($activatedBugGroup[$productID]['value']) ? $activatedBugGroup[$productID]['value'] : 0; - $totalBugs[$productID] = isset($effectiveBugGroup[$productID]['value']) ? $effectiveBugGroup[$productID]['value'] : 0; - $resolvedRate[$productID] = isset($bugFixedRate[$productID]['value']) ? $bugFixedRate[$productID]['value'] * 100 : 0; - foreach($groups as $group) + $activateBug[$group] = 0; + $resolveBug[$group] = 0; + $closeBug[$group] = 0; + + if(!empty($monthCreatedBugGroup)) { - $activateBugs[$productID][$group] = 0; - $resolveBugs[$productID][$group] = 0; - $closeBugs[$productID][$group] = 0; - - if(!empty($monthCreatedBugGroup)) + foreach($monthCreatedBugGroup as $data) { - foreach($monthCreatedBugGroup as $data) - { - if($group == "{$data['year']}-{$data['month']}" && $productID == $data['product']) $activateBugs[$productID][$group] = $data['value']; - } + if($group == "{$data['year']}-{$data['month']}" && $productID == $data['product']) $activateBugs[$group] = $data['value']; } + } - if(!empty($monthFixedBugGroup)) + if(!empty($monthFixedBugGroup)) + { + foreach($monthFixedBugGroup as $data) { - foreach($monthFixedBugGroup as $data) - { - if($group == "{$data['year']}-{$data['month']}" && $productID == $data['product']) $resolveBugs[$productID][$group] = $data['value']; - } + if($group == "{$data['year']}-{$data['month']}" && $productID == $data['product']) $resolveBugs[$group] = $data['value']; } + } - if(!empty($monthClosedBugGroup)) + if(!empty($monthClosedBugGroup)) + { + foreach($monthClosedBugGroup as $data) { - foreach($monthClosedBugGroup as $data) - { - if($group == "{$data['year']}-{$data['month']}" && $productID == $data['product']) $closeBugs[$productID][$group] = $data['value']; - } + if($group == "{$data['year']}-{$data['month']}" && $productID == $data['product']) $closeBugs[$group] = $data['value']; } } } - $this->view->months = $months; - $this->view->products = $products; - $this->view->totalBugs = $totalBugs; - $this->view->closedBugs = $closedBugs; - $this->view->unresovledBugs = $unresovledBugs; - $this->view->resolvedRate = $resolvedRate; - $this->view->activateBugs = $activateBugs; - $this->view->resolveBugs = $resolveBugs; - $this->view->closeBugs = $closeBugs; + + $this->view->months = $months; + $this->view->products = $products; + $this->view->totalBug = $totalBug; + $this->view->closedBug = $closedBug; + $this->view->unresovledBug = $unresovledBug; + $this->view->resolvedRate = $resolvedRate; + $this->view->activateBug = $activateBug; + $this->view->resolveBug = $resolveBug; + $this->view->closeBug = $closeBug; } /**