- allStories ? html::a($this->createLink('project', 'story', 'projectID=' . $projectID), $totalData[$projectID]->allStories) : 0;?>
+ allStories;?>
diff --git a/module/product/model.php b/module/product/model.php
index f4f7d669bc..e1d541ffef 100644
--- a/module/product/model.php
+++ b/module/product/model.php
@@ -729,6 +729,26 @@ class productModel extends model
return $stories;
}
+ /**
+ * Get the total number of requirements associated with the product.
+ *
+ * @param array $productIdList
+ * @param array $type
+ * @param array $status closed|active|draft
+ * @access public
+ * @return array
+ */
+ public function getTotalStoriesByProduct($productIdList, $type, $status)
+ {
+ return $this->dao->select("count(*) as stories")->from(TABLE_STORY)
+ ->where('type')->eq($type)
+ ->andWhere('product')->in($productIdList)
+ ->andWhere('status')->eq($status)
+ ->beginIF($status == 'closed')->andWhere('closedReason')->eq('done')->fi()
+ ->andWhere('deleted')->eq(0)
+ ->fetch('stories');
+ }
+
/**
* Batch get story stage.
*
diff --git a/module/program/model.php b/module/program/model.php
index d9ae2758c2..f34590bf94 100644
--- a/module/program/model.php
+++ b/module/program/model.php
@@ -895,6 +895,8 @@ class programModel extends model
if(empty($projects)) return array();
$projectIdList = array_keys($projects);
+ $teams = $this->dao->select('root, count(*) as teams')->from(TABLE_TEAM)->where('root')->in($projectIdList)->groupBy('root')->fetchPairs();
+
$hours = $this->dao->select('PRJ,
cast(sum(consumed) as decimal(10,2)) as consumed,
cast(sum(estimate) as decimal(10,2)) as estimate')
@@ -905,72 +907,37 @@ class programModel extends model
->groupBy('PRJ')
->fetchAll('PRJ');
- $teams = $this->dao->select('root, count(*) as count')->from(TABLE_TEAM)
- ->where('root')->in($projectIdList)
- ->groupBy('root')
- ->fetchAll('root');
-
- $leftTasks = $this->dao->select('PRJ, count(*) as leftTasks')->from(TABLE_TASK)
+ $leftTasks = $this->dao->select('PRJ, count(*) as tasks')->from(TABLE_TASK)
->where('PRJ')->in($projectIdList)
->andWhere('deleted')->eq(0)
->andWhere('status')->in('wait,doing,pause')
->groupBy('PRJ')
- ->fetchAll('PRJ');
+ ->fetchPairs();
- $allStories = $this->dao->select('PRJ, count(*) as allStories')->from(TABLE_STORY)
- ->where('PRJ')->in($projectIdList)
- ->andWhere('deleted')->eq(0)
- ->andWhere('status')->ne('draft')
- ->groupBy('PRJ')
- ->fetchAll('PRJ');
+ foreach($projectIdList as $projectID)
+ {
+ $productIdList = $this->loadModel('product')->getProductIDByProject($projectID);
+ $allStories[$projectID] = $this->product->getTotalStoriesByProduct($productIdList, 'story', 'draft');
+ $doneStories[$projectID] = $this->product->getTotalStoriesByProduct($productIdList, 'story', 'closed');
+ $leftStories[$projectID] = $this->product->getTotalStoriesByProduct($productIdList, 'story', 'active');
+ }
- $doneStories = $this->dao->select('PRJ, count(*) as doneStories')->from(TABLE_STORY)
- ->where('PRJ')->in($projectIdList)
- ->andWhere('deleted')->eq(0)
- ->andWhere('status')->eq('closed')
- ->andWhere('closedReason')->eq('done')
- ->groupBy('PRJ')
- ->fetchAll('PRJ');
-
- $leftStories = $this->dao->select('PRJ, count(*) as leftStories')->from(TABLE_STORY)
- ->where('PRJ')->in($projectIdList)
- ->andWhere('deleted')->eq(0)
- ->andWhere('status')->eq('active')
- ->groupBy('PRJ')
- ->fetchAll('PRJ');
-
- $leftBugs = $this->dao->select('PRJ, count(*) as leftBugs')->from(TABLE_BUG)
- ->where('PRJ')->in($projectIdList)
- ->andWhere('deleted')->eq(0)
- ->andWhere('status')->eq('active')
- ->groupBy('PRJ')
- ->fetchAll('PRJ');
-
- $allBugs = $this->dao->select('PRJ, count(*) as allBugs')->from(TABLE_BUG)
- ->where('PRJ')->in($projectIdList)
- ->andWhere('deleted')->eq(0)
- ->groupBy('PRJ')
- ->fetchAll('PRJ');
-
- $doneBugs = $this->dao->select('PRJ, count(*) as doneBugs')->from(TABLE_BUG)
- ->where('PRJ')->in($projectIdList)
- ->andWhere('deleted')->eq(0)
- ->andWhere('status')->eq('resolved')
- ->groupBy('PRJ')
- ->fetchAll('PRJ');
+ $leftBugs = $this->getTotalBugByPRJ($projectIdList, 'active');
+ $allBugs = $this->getTotalBugByPRJ($projectIdList, 'all');
+ $doneBugs = $this->getTotalBugByPRJ($projectIdList, 'resolved');
foreach($projects as $projectID => $project)
{
- $project->teamCount = isset($teams[$projectID]) ? $teams[$projectID]->count : 0;
$project->consumed = isset($hours[$projectID]) ? $hours[$projectID]->consumed : 0;
$project->estimate = isset($hours[$projectID]) ? $hours[$projectID]->estimate : 0;
- $project->leftTasks = isset($leftTasks[$projectID]) ? $leftTasks[$projectID]->leftTasks : 0;
- $project->allStories = isset($allStories[$projectID]) ? $allStories[$projectID]->allStories : 0;
- $project->doneStories = isset($doneStories[$projectID]) ? $doneStories[$projectID]->doneStories : 0;
- $project->leftStories = isset($leftStories[$projectID]) ? $leftStories[$projectID]->leftStories : 0;
- $project->leftBugs = isset($leftBugs[$projectID]) ? $leftBugs[$projectID]->leftBugs : 0;
- $project->allBugs = isset($allBugs[$projectID]) ? $allBugs[$projectID]->allBugs : 0;
- $project->doneBugs = isset($doneBugs[$projectID]) ? $doneBugs[$projectID]->doneBugs : 0;
+ $project->teamCount = isset($teams[$projectID]) ? $teams[$projectID] : 0;
+ $project->leftTasks = isset($leftTasks[$projectID]) ? $leftTasks[$projectID] : 0;
+ $project->leftBugs = isset($leftBugs[$projectID]) ? $leftBugs[$projectID] : 0;
+ $project->allBugs = isset($allBugs[$projectID]) ? $allBugs[$projectID] : 0;
+ $project->doneBugs = isset($doneBugs[$projectID]) ? $doneBugs[$projectID] : 0;
+ $project->allStories = $allStories[$projectID];
+ $project->doneStories = $doneStories[$projectID];
+ $project->leftStories = $leftStories[$projectID];
}
return $projects;
@@ -1096,6 +1063,24 @@ class programModel extends model
->fetchAll('id');
}
+ /**
+ * Get associated bugs by project.
+ *
+ * @param array $projectIdList
+ * @param string $status active|resolved|all
+ * @access public
+ * @return object
+ */
+ public function getTotalBugByPRJ($projectIdList, $status)
+ {
+ return $this->dao->select('PRJ, count(*) as bugs')->from(TABLE_BUG)
+ ->where('PRJ')->in($projectIdList)
+ ->andWhere('deleted')->eq(0)
+ ->beginIF($status != 'all')->andWhere('status')->eq($status)->fi()
+ ->groupBy('PRJ')
+ ->fetchPairs('PRJ');
+ }
+
/**
* Build the query.
*
From a50371c5775bf3624da4f1b9fe2cb16c346eaa36 Mon Sep 17 00:00:00 2001
From: tianshujie98
Date: Fri, 4 Dec 2020 11:01:29 +0800
Subject: [PATCH 2/4] * Fix block bug.
---
module/block/control.php | 1 +
module/block/lang/de.php | 7 +++++++
module/block/lang/en.php | 7 +++++++
module/block/lang/fr.php | 7 +++++++
module/block/lang/vi.php | 7 +++++++
module/block/lang/zh-cn.php | 7 +++++++
6 files changed, 36 insertions(+)
diff --git a/module/block/control.php b/module/block/control.php
index 2368dd0b60..8125f1764f 100644
--- a/module/block/control.php
+++ b/module/block/control.php
@@ -203,6 +203,7 @@ class block extends control
* Display dashboard for app.
*
* @param string $module
+ * @param string $type
* @access public
* @return void
*/
diff --git a/module/block/lang/de.php b/module/block/lang/de.php
index 29ef822efb..b4878a843e 100644
--- a/module/block/lang/de.php
+++ b/module/block/lang/de.php
@@ -217,6 +217,13 @@ $lang->block->default['project']['4']['params']['count'] = 15;
$lang->block->default['project']['4']['params']['orderBy'] = 'id_desc';
$lang->block->default['project']['4']['params']['type'] = 'assignedTo';
+$lang->block->default['project']['5']['title'] = 'Build List';
+$lang->block->default['project']['5']['block'] = 'build';
+$lang->block->default['project']['5']['grid'] = 8;
+
+$lang->block->default['project']['5']['params']['count'] = 15;
+$lang->block->default['project']['5']['params']['orderBy'] = 'id_desc';
+
$lang->block->default['qa']['1']['title'] = 'Test Report';
$lang->block->default['qa']['1']['block'] = 'statistic';
$lang->block->default['qa']['1']['grid'] = 8;
diff --git a/module/block/lang/en.php b/module/block/lang/en.php
index 70a52e7777..68610dd446 100644
--- a/module/block/lang/en.php
+++ b/module/block/lang/en.php
@@ -217,6 +217,13 @@ $lang->block->default['project']['4']['params']['count'] = 15;
$lang->block->default['project']['4']['params']['orderBy'] = 'id_desc';
$lang->block->default['project']['4']['params']['type'] = 'assignedTo';
+$lang->block->default['project']['5']['title'] = 'Build List';
+$lang->block->default['project']['5']['block'] = 'build';
+$lang->block->default['project']['5']['grid'] = 8;
+
+$lang->block->default['project']['5']['params']['count'] = 15;
+$lang->block->default['project']['5']['params']['orderBy'] = 'id_desc';
+
$lang->block->default['qa']['1']['title'] = 'Test Report';
$lang->block->default['qa']['1']['block'] = 'statistic';
$lang->block->default['qa']['1']['grid'] = 8;
diff --git a/module/block/lang/fr.php b/module/block/lang/fr.php
index afa251dc2e..244783176f 100644
--- a/module/block/lang/fr.php
+++ b/module/block/lang/fr.php
@@ -218,6 +218,13 @@ $lang->block->default['project']['4']['params']['count'] = 15;
$lang->block->default['project']['4']['params']['orderBy'] = 'id_desc';
$lang->block->default['project']['4']['params']['type'] = 'assignedTo';
+$lang->block->default['project']['5']['title'] = 'Build List';
+$lang->block->default['project']['5']['block'] = 'build';
+$lang->block->default['project']['5']['grid'] = 8;
+
+$lang->block->default['project']['5']['params']['count'] = 15;
+$lang->block->default['project']['5']['params']['orderBy'] = 'id_desc';
+
$lang->block->default['qa']['1']['title'] = 'Rapport de Tests';
$lang->block->default['qa']['1']['block'] = 'statistic';
$lang->block->default['qa']['1']['grid'] = 8;
diff --git a/module/block/lang/vi.php b/module/block/lang/vi.php
index 5e128b42a5..2c1145fbeb 100644
--- a/module/block/lang/vi.php
+++ b/module/block/lang/vi.php
@@ -217,6 +217,13 @@ $lang->block->default['project']['4']['params']['count'] = 15;
$lang->block->default['project']['4']['params']['orderBy'] = 'id_desc';
$lang->block->default['project']['4']['params']['type'] = 'assignedTo';
+$lang->block->default['project']['5']['title'] = 'Build List';
+$lang->block->default['project']['5']['block'] = 'build';
+$lang->block->default['project']['5']['grid'] = 8;
+
+$lang->block->default['project']['5']['params']['count'] = 15;
+$lang->block->default['project']['5']['params']['orderBy'] = 'id_desc';
+
$lang->block->default['qa']['1']['title'] = 'Báo cáo Test';
$lang->block->default['qa']['1']['block'] = 'statistic';
$lang->block->default['qa']['1']['grid'] = 8;
diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php
index dac66606d7..9ff78df9d3 100644
--- a/module/block/lang/zh-cn.php
+++ b/module/block/lang/zh-cn.php
@@ -217,6 +217,13 @@ $lang->block->default['project']['4']['params']['count'] = 15;
$lang->block->default['project']['4']['params']['orderBy'] = 'id_desc';
$lang->block->default['project']['4']['params']['type'] = 'assignedTo';
+$lang->block->default['project']['5']['title'] = '版本列表';
+$lang->block->default['project']['5']['block'] = 'build';
+$lang->block->default['project']['5']['grid'] = 8;
+
+$lang->block->default['project']['5']['params']['count'] = 15;
+$lang->block->default['project']['5']['params']['orderBy'] = 'id_desc';
+
$lang->block->default['qa']['1']['title'] = '测试统计';
$lang->block->default['qa']['1']['block'] = 'statistic';
$lang->block->default['qa']['1']['grid'] = 8;
From 5dacb4172989e708b4ae664d66fbe755be756a2f Mon Sep 17 00:00:00 2001
From: leiyong <1549684884@qq.com>
Date: Fri, 4 Dec 2020 11:28:46 +0800
Subject: [PATCH 3/4] * Fix bug.
---
module/product/model.php | 1 +
module/project/model.php | 9 +--------
module/projectbuild/control.php | 14 +++++++++-----
3 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/module/product/model.php b/module/product/model.php
index e1d541ffef..187ee5dfde 100644
--- a/module/product/model.php
+++ b/module/product/model.php
@@ -818,6 +818,7 @@ class productModel extends model
->andWhere('t2.deleted')->eq('0')
->orderBy($orderBy)
->fetchAll('id');
+ $executionList = array('0' => '');
$project = $this->loadModel('program')->getPRJByID($this->session->PRJ);
diff --git a/module/project/model.php b/module/project/model.php
index 8dca37f636..1a789467dd 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -2941,12 +2941,10 @@ class projectModel extends model
* @param array $products
* @param int $queryID
* @param string $actionURL
- * @param array $projects
- * @param string $type projectBuild
* @access public
* @return void
*/
- public function buildProjectBuildSearchForm($products, $queryID, $actionURL, $projects = '', $type = '')
+ public function buildProjectBuildSearchForm($products, $queryID, $actionURL)
{
$this->loadModel('build');
@@ -2955,11 +2953,6 @@ class projectModel extends model
$this->config->build->search['actionURL'] = $actionURL;
$this->config->build->search['queryID'] = $queryID;
$this->config->build->search['params']['product']['values'] = $products;
- if($type == 'projectBuild')
- {
- $this->config->build->search['fields']['project'] = $this->lang->projectCommon;
- $this->config->build->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '') + $projects);
- }
$this->loadModel('search')->setSearchParams($this->config->build->search);
}
diff --git a/module/projectbuild/control.php b/module/projectbuild/control.php
index 33fc048a43..47d8320802 100644
--- a/module/projectbuild/control.php
+++ b/module/projectbuild/control.php
@@ -22,27 +22,31 @@ class projectBuild extends control
public function browse($projectID = 0, $type = 'all', $param = 0)
{
$this->loadModel('project');
+ $this->loadModel('build');
$project = $this->loadModel('program')->getPRJByID($projectID);
/* Get products' list. */
$products = $this->project->getProducts($projectID, false);
$products = array('' => '') + $products;
- $projects = $this->project->getExecutionsByProject((int)$projectID, 'all', '', true);
-
/* Build the search form. */
$type = strtolower($type);
- $queryID = ($type == 'bysearch') ? (int)$param : 0;
+ $queryID = ($type == 'bysearch') ? (int)$param : 0;
$actionURL = $this->createLink('projectbuild', 'browse', "projectID=$projectID&type=bysearch&queryID=myQueryID");
+
+ $projects = $this->project->getExecutionsByProject($projectID, 'all', '', true);
+ $this->config->build->search['fields']['project'] = $this->project->lang->projectCommon;
+ $this->config->build->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '') + $projects);
+
$this->project->buildProjectBuildSearchForm($products, $queryID, $actionURL, $projects, 'projectBuild');
if($type == 'bysearch')
{
- $builds = $this->loadModel('build')->getProjectBuildsBySearch((int)$projectID, (int)$param);
+ $builds = $this->build->getProjectBuildsBySearch((int)$projectID, (int)$param);
}
else
{
- $builds = $this->loadModel('build')->getProjectBuilds((int)$projectID, $type, $param);
+ $builds = $this->build->getProjectBuilds((int)$projectID, $type, $param);
}
/* Set project builds. */
From 58f8f4b234e63488bac8158b83cc5138a10c2af5 Mon Sep 17 00:00:00 2001
From: leiyong <1549684884@qq.com>
Date: Fri, 4 Dec 2020 13:48:23 +0800
Subject: [PATCH 4/4] * Adjust code.
---
module/block/control.php | 10 +++++-----
module/build/control.php | 18 ++++++------------
module/my/view/story.html.php | 8 ++++----
module/product/control.php | 1 +
module/product/model.php | 4 ++--
module/project/model.php | 8 ++++----
6 files changed, 22 insertions(+), 27 deletions(-)
diff --git a/module/block/control.php b/module/block/control.php
index 8125f1764f..550a2443c5 100644
--- a/module/block/control.php
+++ b/module/block/control.php
@@ -1332,14 +1332,14 @@ class block extends control
}
/**
- * Print srcum project block.
+ * Print sprint block.
*
* @access public
* @return void
*/
public function printSprintBlock()
{
- $status = $this->dao->select('status, count(*) as count')->from(TABLE_PROJECT)
+ $sprints = $this->dao->select('status, count(*) as sprints')->from(TABLE_EXECUTION)
->where('deleted')->eq(0)
->andWhere('type')->eq('sprint')
->andWhere('parent')->eq($this->session->PRJ)
@@ -1347,9 +1347,9 @@ class block extends control
->fetchPairs();
$summary = new stdclass();
- $summary->total = array_sum($status);
- $summary->doing = zget($status, 'doing', 0);
- $summary->closed = zget($status, 'closed', 0);
+ $summary->total = array_sum($sprints);
+ $summary->doing = zget($sprints, 'doing', 0);
+ $summary->closed = zget($sprints, 'closed', 0);
$progress = new stdclass();
$progress->doing = $summary->total == 0 ? 0 : round($summary->doing / $summary->total, 3);
diff --git a/module/build/control.php b/module/build/control.php
index 232507f060..98cad7ebf5 100644
--- a/module/build/control.php
+++ b/module/build/control.php
@@ -33,35 +33,29 @@ class build extends control
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID")));
}
- $this->session->set('buildCreate', $this->app->getURI(true));
-
/* Load these models. */
$this->loadModel('project');
$this->loadModel('user');
-
+
+ $this->session->set('buildCreate', $this->app->getURI(true));
+ $execution = $this->loadModel('project')->getExecutionById($executionID);
+
/* Set menu. */
$executions = $this->project->getExecutionPairs($this->session->PRJ);
$this->project->setMenu($executions, $executionID);
- /* Get stories and bugs. */
- $orderBy = 'status_asc, stage_asc, id_desc';
-
- /* Assign. */
- $project = $this->loadModel('project')->getExecutionById($executionID);
-
$productGroups = $this->project->getProducts($executionID);
$productID = $productID ? $productID : key($productGroups);
$products = array();
foreach($productGroups as $product) $products[$product->id] = $product->name;
- $this->view->title = $project->name . $this->lang->colon . $this->lang->build->create;
- $this->view->position[] = html::a($this->createLink('project', 'task', "projectID=$executionID"), $project->name);
+ $this->view->title = $execution->name . $this->lang->colon . $this->lang->build->create;
+ $this->view->position[] = html::a($this->createLink('project', 'task', "projectID=$executionID"), $execution->name);
$this->view->position[] = $this->lang->build->create;
$this->view->product = isset($productGroups[$productID]) ? $productGroups[$productID] : '';
$this->view->branches = (isset($productGroups[$productID]) and $productGroups[$productID]->type == 'normal') ? array() : $this->loadModel('branch')->getPairs($productID);
$this->view->executionID = $executionID;
- $this->view->orderBy = $orderBy;
$this->view->products = $products;
$this->view->lastBuild = $this->build->getLast($executionID);
$this->view->productGroups = $productGroups;
diff --git a/module/my/view/story.html.php b/module/my/view/story.html.php
index 536e9b7d35..e3532c8443 100644
--- a/module/my/view/story.html.php
+++ b/module/my/view/story.html.php
@@ -1,19 +1,19 @@
- * @package dashboard
- * @version $Id: story.html.php 5116 2013-07-12 06:37:48Z chencongzhi520@gmail.com $
+ * @package my
+ * @version $Id
* @link http://www.zentao.net
*/
?>