This commit is contained in:
王怡栋
2021-08-27 10:20:27 +08:00
parent 4cf1c0daa9
commit 0a9b1f42ac
10 changed files with 188 additions and 34 deletions
+2
View File
@@ -164,3 +164,5 @@ $lang->createIcons['program'] = 'program';
$lang->createIcons['doc'] = 'w';
$lang->noMenuModule = array('report', 'my', 'todo', 'effort', 'program', 'product', 'execution', 'task', 'build', 'productplan', 'project', 'projectrelease', 'projectstory', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage', 'entry', 'jenkins', 'gitlab');
if(isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode'] and !defined('TUTORIAL')) define('TUTORIAL', true);
+12
View File
@@ -18,6 +18,18 @@ list($productModule, $productMethod) = explode('-', $config->productLink);
list($projectModule, $projectMethod) = explode('-', $config->projectLink);
list($executionModule, $executionMethod) = explode('-', $config->executionLink);
if(defined('TUTORIAL'))
{
$programModule = 'program';
$programMethod = 'browse';
$productModule = 'product';
$productMethod = 'all';
$projectModule = 'project';
$projectMethod = 'browse';
$executionModule = 'execution';
$executionMethod = 'task';
}
/* Main Navigation. */
$lang->mainNav = new stdclass();
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
+2
View File
@@ -40,6 +40,8 @@ class executionModel extends model
*/
public function accessDenied()
{
if(defined('TUTORIAL')) return true;
echo(js::alert($this->lang->execution->accessDenied));
if(!$this->server->http_referer) die(js::locate(helper::createLink('execution', 'index')));
+4
View File
@@ -186,6 +186,8 @@ class productModel extends model
*/
public function accessDenied()
{
if(defined('TUTORIAL')) return true;
echo(js::alert($this->lang->product->accessDenied));
if(!$this->server->http_referer) die(js::locate(helper::createLink('product', 'index')));
@@ -1661,6 +1663,8 @@ class productModel extends model
*/
public function statisticProgram($productStats)
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProductStats();
$productStructure = array();
foreach($productStats as $product)
+22 -20
View File
@@ -145,7 +145,7 @@ class programModel extends model
/**
* Get kanban group data.
*
*
* @access public
* @return void
*/
@@ -175,7 +175,7 @@ class programModel extends model
->fetchGroup('program', 'id');
$productPairs = array();
foreach($productGroup as $programID => $products)
foreach($productGroup as $programID => $products)
{
foreach($products as $productID => $product) $productPairs[$productID] = $productID;
}
@@ -236,7 +236,7 @@ class programModel extends model
/* Group data. */
foreach($productGroup as $programID => $products)
{
foreach($products as $productID => $product)
foreach($products as $productID => $product)
{
$product->plans = zget($plans, $productID, array());
$product->releases = zget($releases, $productID, array());
@@ -245,10 +245,10 @@ class programModel extends model
{
if(helper::diffDate(helper::today(), $project->end) > 0) $project->delay = 1;
$status = $project->status == 'wait' ? 'wait' : 'doing';
$status = $project->status == 'wait' ? 'wait' : 'doing';
$execution = zget($doingExecutions, $project->id, array());
if(!empty($execution))
if(!empty($execution))
{
$execution->hours = zget($hours, $execution->id, array());
if(helper::diffDate(helper::today(), $execution->end) > 0) $execution->delay = 1;
@@ -281,8 +281,8 @@ class programModel extends model
/**
* Get involved programs by user.
*
* @param string $account
*
* @param string $account
* @access public
* @return void
*/
@@ -299,12 +299,12 @@ class programModel extends model
foreach($objects as $id => $object)
{
if($object->type == 'program') $involvedPrograms[$id] = $id;
if($object->type == 'project')
if($object->type == 'project')
{
$programID = $this->getTopByID($id);
$involvedPrograms[$programID] = $programID;
}
if($object->type == 'sprint' || $object->type == 'stage')
if($object->type == 'sprint' || $object->type == 'stage')
{
$programID = $this->getTopByID($object->project);
$involvedPrograms[$programID] = $programID;
@@ -321,11 +321,11 @@ class programModel extends model
foreach($stakeholders as $objectID => $object)
{
if($object->type == 'program')
if($object->type == 'program')
{
$involvedPrograms[$objectID] = $objectID;
}
if($object->type == 'project')
if($object->type == 'project')
{
$programID = $this->getTopByID($objectID);
$involvedPrograms[$programID] = $programID;
@@ -342,12 +342,12 @@ class programModel extends model
foreach($teams as $objectID => $object)
{
if($object->type == 'project')
if($object->type == 'project')
{
$programID = $this->getTopByID($objectID);
$involvedPrograms[$programID] = $programID;
}
if($object->type == 'execution')
if($object->type == 'execution')
{
$programID = $this->getTopByID($object->project);
$involvedPrograms[$programID] = $programID;
@@ -364,7 +364,7 @@ class programModel extends model
/* Check priv. */
$involvedPrograms = $this->dao->select('id')->from(TABLE_PROGRAM)
->where('deleted')->eq(0)
->where('deleted')->eq(0)
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi()
->andWhere('id')->in($involvedPrograms)
->andWhere('grade')->eq(1)
@@ -375,8 +375,8 @@ class programModel extends model
/**
* Compute progress for project or execution.
*
* @param array $tasks
*
* @param array $tasks
* @access public
* @return void
*/
@@ -384,20 +384,20 @@ class programModel extends model
{
$hours = array();
foreach($tasks as $projectID => $projectTasks)
{
{
$hour = new stdclass();
$hour->totalConsumed = 0;
$hour->totalEstimate = 0;
$hour->totalLeft = 0;
foreach($projectTasks as $task)
{
{
$hour->totalConsumed += $task->consumed;
$hour->totalEstimate += $task->estimate;
if($task->status != 'cancel' and $task->status != 'closed') $hour->totalLeft += $task->left;
}
}
$hours[$projectID] = $hour;
}
}
foreach($hours as $hour)
{
@@ -1162,6 +1162,8 @@ class programModel extends model
*/
public function getProjectStats($programID = 0, $browseType = 'undone', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $involved = 0, $queryAll = false)
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProjectStats();
/* Init vars. */
$projects = $this->getProjectList($programID, $browseType, $queryID, $orderBy, $pager, $programTitle, $involved, $queryAll);
+3
View File
@@ -61,6 +61,9 @@ $lang->project->id = '项目编号';
$lang->project->stage = '阶段';
$lang->project->model = '项目管理方式';
$lang->project->PM = '负责人';
$lang->project->PO = '项目负责人';
$lang->project->QD = '测试负责人';
$lang->project->RD = '发布负责人';
$lang->project->name = '项目名称';
$lang->project->category = '项目类型';
$lang->project->desc = '项目描述';
+10
View File
@@ -32,6 +32,8 @@ class projectModel extends model
*/
public function accessDenied()
{
if(defined('TUTORIAL')) return true;
echo(js::alert($this->lang->project->accessDenied));
$this->session->set('project', '');
@@ -172,6 +174,8 @@ class projectModel extends model
*/
public function getByID($projectID, $type = 'project')
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProject();
$project = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->andWhere('`type`')->in($type)->fetch();
if(!$project) return false;
@@ -501,6 +505,12 @@ class projectModel extends model
*/
public function getProducts($projectID, $withBranch = true, $status = 'all')
{
if(defined('TUTORIAL'))
{
if(!$withBranch) return $this->loadModel('tutorial')->getProductPairs();
return $this->loadModel('tutorial')->getExecutionProducts();
}
$query = $this->dao->select('t2.id, t2.name, t2.type, t1.branch, t1.plan')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
->where('t1.project')->eq((int)$projectID)
+2
View File
@@ -115,6 +115,8 @@ class treeModel extends model
*/
public function getOptionMenu($rootID, $type = 'story', $startModule = 0, $branch = 0)
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getModulePairs();
if($type == 'line') $rootID = 0;
$branches = array($branch => '');
+1 -1
View File
@@ -99,7 +99,7 @@ class tutorial extends control
*/
public function wizard($module, $method, $params = '')
{
define('TUTORIAL', true);
if(!defined('TUTORIAL')) define('TUTORIAL', true);
define('WIZARD_MODULE', $module);
define('WIZARD_METHOD', $method);
+130 -13
View File
@@ -42,6 +42,17 @@ class tutorialModel extends model
return array(1 => 'Test product');
}
/**
* Get module pairs for tutorial.
*
* @access public
* @return array
*/
public function getModulePairs()
{
return array(1 => 'Test module');
}
/**
* Get tutorial product.
*
@@ -52,6 +63,8 @@ class tutorialModel extends model
{
$product = new stdclass();
$product->id = 1;
$product->program = 0;
$product->line = 0;
$product->name = 'Test product';
$product->code = 'test';
$product->type = 'normal';
@@ -70,6 +83,96 @@ class tutorialModel extends model
return $product;
}
/**
* Get product stats for tutorial.
*
* @access public
* @return array
*/
public function getProductStats()
{
$product = $this->getProduct();
$product->stories = array();
$product->stories[0] = '';
$product->stories[1] = 'draft';
$product->stories[2] = 'active';
$product->stories[3] = 'closed';
$product->stories[4] = 'changed';
$product->stories[''] = 0;
$product->stories['draft'] = 0;
$product->stories['active'] = 0;
$product->stories['closed'] = 0;
$product->stories['changed'] = 0;
$product->requirements = $product->stories;
$product->plans = 0;
$product->releases = 0;
$product->bugs = 0;
$product->unResolved = 0;
$product->closedBugs = 0;
$product->fixedBugs = 0;
$product->assignToNull = 0;
$productStat[$product->program][$product->line]['products'][$product->id] = $product;
return $productStat;
}
/**
* Get project for tutorial;
*
* @access public
* @return object
*/
public function getProject()
{
$project = new stdclass();
$project->id = 2;
$project->project = 0;
$project->model = 'scrum';
$project->type = 'project';
$project->name = 'Test Project';
$project->code = '';
$project->lifetime = '';
$project->begin = date('Y-m-d', strtotime('-7 days'));
$project->end = date('Y-m-d', strtotime('+7 days'));
$project->days = 10;
$project->status = 'wait';
$project->pri = '1';
$project->desc = '';
$project->goal = '';
$project->acl = 'open';
$project->parent = 0;
$project->path = ',2,';
$project->grade = 1;
$project->PM = $this->app->user->account;
$project->PO = $this->app->user->account;
$project->QD = $this->app->user->account;
$project->RD = $this->app->user->account;
$project->budget = 0;
$project->deleted = '0';
return $project;
}
/**
* Get project stats for tutorial
*
* @access public
* @return array
*/
public function getProjectStats()
{
$project = $this->getProject();
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
$project->hours = (object)$emptyHour;
$project->leftTasks = '—';
$project->teamMembers = $this->getTeamMembers();
$project->teamCount = count($project->teamMembers);
$projectStat[$project->id] = $project;
return $projectStat;
}
/**
* Get tutorial stories.
*
@@ -82,6 +185,8 @@ class tutorialModel extends model
$story->id = 1;
$story->product = 1;
$story->branch = 0;
$story->parent = 0;
$story->category = 0;
$story->module = 0;
$story->plan = '';
$story->planTitle = '';
@@ -111,6 +216,7 @@ class tutorialModel extends model
$story->version = 1;
$story->deleted = '0';
$story->order = '0';
$story->URChanged = false;
$stories = array();
$stories[] = $story;
@@ -129,7 +235,7 @@ class tutorialModel extends model
*/
public function getExecutionPairs()
{
return array(1 => 'Test execution');
return array(3 => 'Test execution');
}
/**
@@ -141,18 +247,28 @@ class tutorialModel extends model
public function getExecution()
{
$execution = new stdclass();
$execution->id = 1;
$execution->type = 'sprint';
$execution->name = 'Test execution';
$execution->code = 'test';
$execution->begin = date('Y-m-d', strtotime('-7 days'));
$execution->end = date('Y-m-d', strtotime('+7 days'));
$execution->days = 10;
$execution->status = 'wait';
$execution->pri = '1';
$execution->desc = '';
$execution->goal = '';
$execution->acl = 'open';
$execution->id = 3;
$execution->project = 2;
$execution->type = 'sprint';
$execution->name = 'Test execution';
$execution->code = 'test';
$execution->lifetime = '';
$execution->begin = date('Y-m-d', strtotime('-7 days'));
$execution->end = date('Y-m-d', strtotime('+7 days'));
$execution->days = 10;
$execution->status = 'wait';
$execution->pri = '1';
$execution->desc = '';
$execution->goal = '';
$execution->acl = 'open';
$execution->parent = 2;
$execution->path = ',2,3,';
$execution->grade = 1;
$execution->PM = $this->app->user->account;
$execution->PO = $this->app->user->account;
$execution->QD = $this->app->user->account;
$execution->RD = $this->app->user->account;
$execution->deleted = '0';
return $execution;
}
@@ -212,6 +328,7 @@ class tutorialModel extends model
$member->totalHours = 70.0;
$member->realname = $this->app->user->realname;
$member->limited = 'no';
$member->userID = $this->app->user->id;
return array($member->account => $member);
}