* finish task #4887.

This commit is contained in:
wangyidong
2018-09-20 10:23:53 +08:00
parent 40d662e996
commit 46173702a5
7 changed files with 82 additions and 122 deletions
+38 -77
View File
@@ -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;
}
+1
View File
@@ -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';
+5 -4
View File
@@ -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';
+17 -4
View File
@@ -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);
}
}
+21 -33
View File
@@ -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;}
</style>
<script>
<?php $blockNavId = 'nav-' . uniqid(); ?>
@@ -80,91 +81,78 @@ $(function()
<?php $index = 1;?>
<?php foreach($products as $product):?>
<div class="tab-pane fade <?php if($index == 1) echo 'active';?> in" id="tabContent<?php echo $product->id;?>">
<?php if(!$product->builds):?>
<div class="table-empty-tip">
<p><span class="text-muted"><?php echo $lang->block->noData;?></span></p>
</div>
<?php endif;?>
<div class="statistic-menu input-group space w-400px">
<?php if($product->builds):?>
<select id='build' name='build' class="form-control chosen">
<?php foreach($product->builds as $build):?>
<option value="<?php echo $build->id;?>"><?php echo $build->name;?></option>
<?php endforeach;?>
</select>
<div class="input-group-cell">
<span class="text-muted small"><?php echo $lang->bug->hasSubmittedTest;?><a href="<?php echo $this->createLink('testtask', 'browse', "productID={$product->id}");?>" class="text-primary"><?php echo $lang->bug->nowToTest;?> <i class="icon icon-right-circle icon-sm"></i></a></span>
</div>
<?php if($product->testtask):?>
<?php echo $product->testtask->name;?>
<span class="text-muted small"><a href="<?php echo $this->createLink('testtask', 'browse', "productID={$product->id}");?>" class="text-primary"><?php echo $lang->block->lblTesttask;?> <i class="icon icon-right-circle icon-sm"></i></a></span>
<?php endif;?>
</div>
</div>
<?php $buildIndex = 1;?>
<?php foreach($product->builds as $build):?>
<div class="table-row <?php if($buildIndex != 1) echo 'hidden';?>" id='bugBox<?php echo $build->id;?>'>
<div class="table-row" id='bugBox<?php echo $product->id;?>'>
<div class="col-5 text-middle text-center">
<div class="progress-pie inline-block space progress-pie-100" data-value="<?php echo $build->assignedRate;?>" data-doughnut-size="80">
<div class="progress-pie inline-block space progress-pie-100" data-value="<?php echo $product->assignedRate;?>" data-doughnut-size="80">
<canvas width="100" height="100" style="width: 100px; height: 100px;"></canvas>
<div class="progress-info">
<small><?php echo $lang->bug->allBugs . ' Bug';?></small>
<strong><span class="progress-value"><?php echo $build->total;?></span></strong>
<strong><span class="progress-value"><?php echo $product->total;?></span></strong>
</div>
</div>
<div class="text-center small with-padding">
<span class="label label-dot label-primary"></span> &nbsp; <?php echo $lang->bug->assignToMe;?> &nbsp; <strong><?php echo $build->assignedToMe;?></strong>
<span class="label label-dot label-primary"></span> &nbsp; <?php echo $lang->bug->assignToMe;?> &nbsp; <strong><?php echo $product->assignedToMe;?></strong>
</div>
</div>
<div class="col-7">
<div class="product-info">
<?php if($build->yesterdayResolved):?>
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayResolved;?></span> <strong><?php echo $build->yesterdayResolved;?></strong></div>
<?php if($product->yesterdayResolved):?>
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayResolved;?></span> <strong><?php echo $product->yesterdayResolved;?></strong></div>
<?php endif;?>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $build->unresovedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $build->unresovedRate;?>%"></div>
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $product->unresolvedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $product->unresolvedRate;?>%"></div>
</div>
<div class="type-info">
<div class="type-label">
<span><?php echo $lang->bug->unResolved;?></span>
</div>
<div class="type-value">
<strong><?php echo $build->unresolved;?></strong>
<strong><?php echo $product->unresolved;?></strong>
</div>
</div>
</div>
<div class="product-info">
<?php if($build->yesterdayConfirmed):?>
<div class="progress-info"><i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayConfirmed;?></span> <strong><?php echo $build->yesterdayConfirmed;?></strong></div>
<?php if($product->yesterdayConfirmed):?>
<div class="progress-info"><i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayConfirmed;?></span> <strong><?php echo $product->yesterdayConfirmed;?></strong></div>
<?php endif;?>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $build->unconfirmedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $build->unconfirmedRate;?>%"></div>
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $product->unconfirmedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $product->unconfirmedRate;?>%"></div>
</div>
<div class="type-info">
<div class="type-label">
<span><?php echo $lang->bug->unconfirmed;?></span>
</div>
<div class="type-value">
<strong><?php echo $build->unconfirmed;?></strong>
<strong><?php echo $product->unconfirmed;?></strong>
</div>
</div>
</div>
<div class="product-info">
<?php if($build->yesterdayClosed):?>
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayClosed;?></span> <strong><?php echo $build->yesterdayClosed;?></strong></div>
<?php if($product->yesterdayClosed):?>
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayClosed;?></span> <strong><?php echo $product->yesterdayClosed;?></strong></div>
<?php endif;?>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $build->unclosedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $build->unclosedRate;?>%"></div>
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $product->unclosedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $product->unclosedRate;?>%"></div>
</div>
<div class="type-info">
<div class="type-label">
<span><?php echo $lang->bug->unclosed;?></span>
</div>
<div class="type-value">
<strong><?php echo $build->unclosed;?></strong>
<strong><?php echo $product->unclosed;?></strong>
</div>
</div>
</div>
</div>
</div>
<?php $buildIndex++;?>
<?php endforeach;?>
</div>
<?php $index++;?>
<?php endforeach;?>
-2
View File
@@ -167,8 +167,6 @@ $lang->bug->remindTask = 'This Bug has been converted to Task. Do you
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
$lang->bug->applyTemplate = 'Template';
$lang->bug->confirmDeleteTemplate = 'Do you want to delete this template?';
$lang->bug->hasSubmittedTest = 'Developer has submitted test task,';
$lang->bug->nowToTest = 'Now to test';
/* 模板。*/
$lang->bug->tplStep = "<p>[Steps]</p><br/>";
-2
View File
@@ -167,8 +167,6 @@ $lang->bug->remindTask = '该Bug已经转化为任务,是否更新
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
$lang->bug->applyTemplate = '应用模板';
$lang->bug->confirmDeleteTemplate = '您确认要删除该模板吗?';
$lang->bug->hasSubmittedTest = '开发已提交测试申请,';
$lang->bug->nowToTest = '现在去测试';
/* 模板。*/
$lang->bug->tplStep = "<p>[步骤]</p><br/>";