Merge branch '20.x' of https://github.com/easysoft/zentaopms into 20.x
This commit is contained in:
@@ -288,3 +288,5 @@ CREATE TABLE `zt_weeklyreport`(
|
||||
|
||||
ALTER TABLE `zt_project` ADD `path` varchar(255) NOT NULL AFTER `parent`;
|
||||
ALTER TABLE `zt_project` ADD `grade` tinyint unsigned NOT NULL AFTER `path`;
|
||||
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system','custom','','URAndSR','1'),('system','custom','','URSRName','{\"urCommon\":{\"zh-cn\":\"\\u7528\\u6237\\u9700\\u6c42\"},\"srCommon\":{\"zh-cn\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\"}}'),('system','custom','','storyPoint','1');
|
||||
|
||||
@@ -67,7 +67,7 @@ class block extends control
|
||||
}
|
||||
elseif(isset($this->lang->block->moduleList[$module]))
|
||||
{
|
||||
$this->get->set('mode', 'getblocklist');
|
||||
$module == 'program' ? $this->get->set('mode', 'getprogramlist') : $this->get->set('mode', 'getblocklist');
|
||||
$this->view->blocks = $this->fetch('block', 'main', "module=$module&id=$id");
|
||||
$this->view->module = $module;
|
||||
}
|
||||
@@ -400,9 +400,10 @@ class block extends control
|
||||
|
||||
$mode = strtolower($this->get->mode);
|
||||
|
||||
if($mode == 'getblocklist')
|
||||
if($mode == 'getblocklist' || $mode == 'getprogramlist')
|
||||
{
|
||||
$blocks = $this->block->getAvailableBlocks($module);
|
||||
$type = $mode == 'getblocklist' ? '' : 'program';
|
||||
$blocks = $this->block->getAvailableBlocks($module, $type);
|
||||
if(!$this->selfCall)
|
||||
{
|
||||
echo $blocks;
|
||||
@@ -699,6 +700,29 @@ class block extends control
|
||||
->fetchAll();
|
||||
}
|
||||
|
||||
public function printProgramBlock()
|
||||
{
|
||||
$this->loadModel('project');
|
||||
$programs = $this->loadModel('program')->getUserPrograms('all', $this->params->orderBy, $this->params->num);
|
||||
foreach($programs as $programID => $program)
|
||||
{
|
||||
$members = $this->project->getTeamMemberPairs($programID);
|
||||
$consumed = $this->dao->select('sum(consumed) as consumed')->from(TABLE_TASK)->where('program')->eq($programID)->andWhere('deleted')->eq(0)->andWhere('status')->ne('cancel')->fetch('consumed');
|
||||
$leftTasks = $this->dao->select('count(*) as leftTasks')->from(TABLE_TASK)->where('program')->eq($programID)->andWhere('deleted')->eq(0)->andWhere('status')->in('wait,doing,pause')->fetch('leftTasks');
|
||||
$leftStories = $this->dao->select('count(*) as leftStories')->from(TABLE_STORY)->where('program')->eq($programID)->andWhere('deleted')->eq(0)->andWhere('status')->eq('active')->fetch('leftStories');
|
||||
$leftBugs = $this->dao->select('count(*) as leftBugs')->from(TABLE_BUG)->where('program')->eq($programID)->andWhere('deleted')->eq(0)->andWhere('status')->eq('active')->fetch('leftBugs');
|
||||
|
||||
$program->countMembers = count($members) ? count($members) : 0;
|
||||
$program->consumed = $consumed ? $consumed : 0;
|
||||
$program->leftTasks = $leftTasks ? $leftTasks : 0;
|
||||
$program->leftStories = $leftStories ? $leftStories : 0;
|
||||
$program->leftBugs = $leftBugs ? $leftBugs : 0;
|
||||
}
|
||||
|
||||
$this->view->programs = $programs;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
}
|
||||
|
||||
/**
|
||||
* Print product block.
|
||||
*
|
||||
|
||||
+30
-12
@@ -261,9 +261,16 @@ $lang->block->default['full']['my']['7']['params']['orderBy'] = 'id_desc';
|
||||
$lang->block->default['full']['my']['7']['params']['num'] = '15';
|
||||
$lang->block->default['full']['my']['7']['params']['type'] = 'assignedTo';
|
||||
|
||||
$lang->block->default['full']['my']['8']['title'] = '项目人力投入';
|
||||
$lang->block->default['full']['my']['8']['block'] = 'programteam';
|
||||
$lang->block->default['full']['my']['8']['grid'] = 8;
|
||||
$lang->block->default['full']['my']['8']['title'] = '项目人力投入';
|
||||
$lang->block->default['full']['my']['8']['block'] = 'programteam';
|
||||
$lang->block->default['full']['my']['8']['grid'] = 8;
|
||||
|
||||
$lang->block->default['full']['my']['8']['title'] = '项目列表';
|
||||
$lang->block->default['full']['my']['8']['block'] = 'program';
|
||||
$lang->block->default['full']['my']['8']['grid'] = 8;
|
||||
|
||||
$lang->block->default['full']['my']['8']['params']['orderBy'] = 'id_desc';
|
||||
$lang->block->default['full']['my']['8']['params']['num'] = '15';
|
||||
|
||||
$lang->block->num = '数量';
|
||||
$lang->block->type = '类型';
|
||||
@@ -283,22 +290,33 @@ $lang->block->availableBlocks->release = '发布列表';
|
||||
$lang->block->availableBlocks->build = '版本列表';
|
||||
$lang->block->availableBlocks->testtask = '测试版本列表';
|
||||
|
||||
$lang->block->moduleList['program'] = '项目';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
$lang->block->moduleList['project'] = $lang->projectCommon;
|
||||
$lang->block->moduleList['qa'] = '测试';
|
||||
$lang->block->moduleList['todo'] = '待办';
|
||||
$lang->block->moduleList['program'] = '项目';
|
||||
|
||||
|
||||
$lang->block->modules['program'] = new stdclass();
|
||||
$lang->block->modules['program']->availableBlocks = new stdclass();
|
||||
$lang->block->modules['program']->availableBlocks->scrumoverall = '项目整体情况';
|
||||
$lang->block->modules['program']->availableBlocks->scrumprogress = '进行中的迭代';
|
||||
$lang->block->modules['program']->availableBlocks->scrumproject = '迭代总览';
|
||||
$lang->block->modules['program']->availableBlocks->scrumproduct = '产品总览';
|
||||
$lang->block->modules['program']->availableBlocks->scrumtest = '待测版本';
|
||||
$lang->block->modules['program']->availableBlocks->scrumroadmap = '产品路线图';
|
||||
$lang->block->modules['program']->availableBlocks->scrumdynamic = '最新动态';
|
||||
$lang->block->modules['program']->availableBlocks->list = '项目列表';
|
||||
|
||||
$lang->block->modules['scrum']['index'] = new stdclass();
|
||||
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
|
||||
$lang->block->modules['scrum']['index']->availableBlocks->scrumoverall = '项目整体情况';
|
||||
$lang->block->modules['scrum']['index']->availableBlocks->scrumprogress = '进行中的迭代';
|
||||
$lang->block->modules['scrum']['index']->availableBlocks->scrumproject = '迭代总览';
|
||||
$lang->block->modules['scrum']['index']->availableBlocks->scrumproduct = '产品总览';
|
||||
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = '待测版本';
|
||||
$lang->block->modules['scrum']['index']->availableBlocks->scrumroadmap = '产品路线图';
|
||||
|
||||
$lang->block->modules['cmmi']['index'] = new stdclass();
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks = new stdclass();
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks->cmmireport = '项目周报';
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks->cmmiestimate = '估算';
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks->cmmigantt = '计划甘特图';
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks->cmmiprogress = '到目前为止项目进展趋势图';
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks->cmmiissue = '项目问题';
|
||||
$lang->block->modules['cmmi']['index']->availableBlocks->cmmirisk = '项目风险';
|
||||
|
||||
$lang->block->modules['product'] = new stdclass();
|
||||
$lang->block->modules['product']->availableBlocks = new stdclass();
|
||||
|
||||
+12
-2
@@ -248,10 +248,20 @@ class blockModel extends model
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getAvailableBlocks($module = '')
|
||||
public function getAvailableBlocks($module = '', $type = '')
|
||||
{
|
||||
$blocks = $this->lang->block->availableBlocks;
|
||||
if($module and isset($this->lang->block->modules[$module])) $blocks = $this->lang->block->modules[$module]->availableBlocks;
|
||||
if($type == 'program')
|
||||
{
|
||||
$programID = $this->session->program;
|
||||
$program = $this->loadModel('project')->getByID($programID);
|
||||
$blocks = $this->lang->block->modules[$program->template]['index']->availableBlocks;
|
||||
}
|
||||
else
|
||||
{
|
||||
if($module and isset($this->lang->block->modules[$module])) $blocks = $this->lang->block->modules[$module]->availableBlocks;
|
||||
}
|
||||
|
||||
if(isset($this->config->block->closed))
|
||||
{
|
||||
foreach($blocks as $blockKey => $blockName)
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php if(empty($programs)): ?>
|
||||
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
|
||||
<?php else:?>
|
||||
<style>
|
||||
.block-programs .c-pri {width: 45px;text-align: center;}
|
||||
.block-programs .c-status {width: 80px;}
|
||||
</style>
|
||||
<div class='panel-body has-table scrollbar-hover'>
|
||||
<table class='table table-borderless table-hover table-fixed table-fixed-head tablesorter block-programs <?php if(!$longBlock) echo 'block-sm';?>'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-name'><?php echo $lang->program->name;?></th>
|
||||
<th class='w-100px'> <?php echo $lang->program->PM;?></th>
|
||||
<th class='w-80px'><?php echo $lang->program->status;?></th>
|
||||
<?php if($longBlock):?>
|
||||
<th class='w-80px'><?php echo $lang->program->countMembers;?></th>
|
||||
<th class='w-80px'><?php echo $lang->task->consumed;?></th>
|
||||
<th class='w-100px'><?php echo $lang->program->budget;?></th>
|
||||
<th class='w-80px'><?php echo $lang->program->leftStories;?></th>
|
||||
<th class='w-80px'><?php echo $lang->program->leftTasks;?></th>
|
||||
<th class='w-80px'><?php echo $lang->program->leftBugs;?></th>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($programs as $program):?>
|
||||
<?php
|
||||
$viewLink = $this->createLink('program', 'index', "programID={$program->id}");
|
||||
?>
|
||||
<tr>
|
||||
<td title='<?php echo $program->name?>'><?php echo html::a($viewLink, $program->name);?></td>
|
||||
<td><?php echo zget($users, $program->PM, $program->PM)?></td>
|
||||
<td class='c-status'>
|
||||
<span class="status-program status-<?php echo $program->status?>"><?php echo zget($lang->project->statusList, $program->status);?></span>
|
||||
</td>
|
||||
<?php if($longBlock):?>
|
||||
<td><?php echo $program->countMembers;?></td>
|
||||
<td><?php echo $program->consumed;?></td>
|
||||
<td><?php echo $program->budget . ' ' . zget($lang->program->unitList, $program->budgetUnit);?></td>
|
||||
<td><?php echo $program->leftStories;?></td>
|
||||
<td><?php echo $program->leftTasks;?></td>
|
||||
<td><?php echo $program->leftBugs;?></td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
@@ -47,6 +47,12 @@ $lang->program->setPlanduration = '设置工期';
|
||||
$lang->program->privway = '权限控制';
|
||||
$lang->program->durationEstimation = '工作量估算';
|
||||
$lang->program->progress = '项目进度';
|
||||
$lang->program->countMembers = '投入人数';
|
||||
$lang->program->leftStories = '剩余需求';
|
||||
$lang->program->leftTasks = '剩余任务';
|
||||
$lang->program->leftBugs = '剩余Bug';
|
||||
$lang->program->children = '子项目';
|
||||
$lang->program->parent = '父项目';
|
||||
|
||||
$lang->program->unitList[''] = '';
|
||||
$lang->program->unitList['yuan'] = '元';
|
||||
|
||||
+28
-34
@@ -41,6 +41,20 @@ class programModel extends model
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
public function getUserPrograms($status = 'all', $orderBy = 'id_desc', $limit = 15)
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_PROJECT)
|
||||
->where('iscat')->eq(0)
|
||||
->andWhere('template')->ne('')
|
||||
->andWhere('program')->eq(0)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi()
|
||||
->beginIF($status != 'all')->andWhere('status')->eq($status)->fi()
|
||||
->orderBy($orderBy)
|
||||
->limit($limit)
|
||||
->fetchAll('id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show accessDenied response.
|
||||
*
|
||||
@@ -94,11 +108,8 @@ class programModel extends model
|
||||
$this->dao->update(TABLE_PROJECT)->set('`order`')->eq($programID * 5)->where('id')->eq($programID)->exec();
|
||||
$this->file->updateObjectID($this->post->uid, $programID, 'project');
|
||||
|
||||
if($project->parent > 0)
|
||||
{
|
||||
$this->dao->update(TABLE_PROJECT)->set('isCat')->eq(1)->where('id')->eq($project->parent)->exec();
|
||||
$this->fixPath($programID);
|
||||
}
|
||||
if($project->parent > 0) $this->dao->update(TABLE_PROJECT)->set('isCat')->eq(1)->where('id')->eq($project->parent)->exec();
|
||||
$this->setTreePath($programID);
|
||||
|
||||
/* Add program admin.*/
|
||||
$groupPriv = $this->dao->select('t1.*')->from(TABLE_USERGROUP)->alias('t1')
|
||||
@@ -135,19 +146,6 @@ class programModel extends model
|
||||
$productID = $this->dao->lastInsertId();
|
||||
$this->dao->update(TABLE_PRODUCT)->set('`order`')->eq($productID * 5)->where('id')->eq($productID)->exec();
|
||||
|
||||
/* Create doc lib. */
|
||||
$this->app->loadLang('doc');
|
||||
$lib = new stdclass();
|
||||
$lib->product = $productID;
|
||||
$lib->name = $this->lang->doclib->main['product'];
|
||||
$lib->type = 'product';
|
||||
$lib->main = '1';
|
||||
$lib->acl = 'default';
|
||||
$this->dao->insert(TABLE_DOCLIB)->data($lib)->exec();
|
||||
|
||||
$docLibID = $this->dao->lastInsertId();
|
||||
$this->loadModel('doc')->syncDocModule($docLibID);
|
||||
|
||||
$data = new stdclass();
|
||||
$data->project = $programID;
|
||||
$data->product = $productID;
|
||||
@@ -221,24 +219,20 @@ class programModel extends model
|
||||
return $count > 0;
|
||||
}
|
||||
|
||||
public function fixPath($programID)
|
||||
public function setTreePath($programID)
|
||||
{
|
||||
$path = array();
|
||||
$program = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($programID)->fetch();
|
||||
if($program->parent == 0)
|
||||
{
|
||||
$path['path'] = ",{$program->id},";
|
||||
$path['grade'] = 1;
|
||||
$this->dao->update(TABLE_PROJECT)->set('path')->eq($path['path'])->set('grade')->eq($path['grade'])->where('id')->eq($program->id)->exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
$path = $this->fixPath($program->parent);
|
||||
$path['path'] .= "{$program->id},";
|
||||
$path['grade'] += 1;
|
||||
$this->dao->update(TABLE_PROJECT)->set('path')->eq($path['path'])->set('grade')->eq($path['grade'])->where('id')->eq($program->id)->exec();
|
||||
}
|
||||
|
||||
return $path;
|
||||
$path['path'] = ",{$program->id},";
|
||||
$path['grade'] = 1;
|
||||
|
||||
if($program->parent)
|
||||
{
|
||||
$parent = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($program->parent)->fetch();
|
||||
|
||||
$path['path'] = $parent->path . "{$program->id},";
|
||||
$path['grade'] = $parent->grade + 1;
|
||||
}
|
||||
$this->dao->update(TABLE_PROJECT)->set('path')->eq($path['path'])->set('grade')->eq($path['grade'])->where('id')->eq($program->id)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,13 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->program->name;?></th>
|
||||
<td class="col-main"><?php echo html::input('name', $name, "class='form-control' required");?></td>
|
||||
<td></td><td></td>
|
||||
<td>
|
||||
<div class="checkbox-primary">
|
||||
<input type="checkbox" name="isCat" value="1" id="isCat">
|
||||
<label for="isCat"><?php echo $lang->program->parent;?></label>
|
||||
</div>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->program->code;?></th>
|
||||
|
||||
Reference in New Issue
Block a user