Merge branch 'sprint/zentaopms240_#task69256' into sprint/zentaopms240

This commit is contained in:
wangyuting2
2022-09-16 01:34:51 +00:00
8 changed files with 244 additions and 8 deletions
+9 -5
View File
@@ -635,18 +635,22 @@ class upgrade extends control
* Select the merge mode when upgrading to zentaopms 18.0.
*
* @param string $fromVersion
* @param string $mode lean | new
* @access public
* @return void
*/
public function selectMergeMode($fromVersion)
public function selectMergeMode($fromVersion, $mode = 'lean')
{
if($_POST)
{
$mode = $this->post->mode;
if($mode == 'project') echo 'execute mergeData method';
if($mode == 'execution') echo 'execute mergeData method';
if($mode == 'manually') $this->locate(inlink('mergeProgram'));
$mergeMode = $this->post->projectType;
if($mergeMode == 'manually') $this->locate(inlink('mergeProgram'));
$program = $this->upgrade->createDefaultProgram();
if($mergeMode == 'project') $this->upgrade->upgradeInProjectMode($program->id);
if($mergeMode == 'execution') $this->upgrade->upgradeInExecutionMode($program->id);
if(dao::isError()) return print(js::error(dao::getError()));
$this->locate(inlink('afterExec', "fromVersion=$fromVersion"));
}
$this->view->title = $this->lang->upgrade->selectMergeMode;
+1
View File
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
$lang->upgrade->line = 'Product Line';
$lang->upgrade->allLines = "All Product Lines";
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->defaultProgram = 'Default Program';
$lang->upgrade->existProgram = 'Existing programs';
$lang->upgrade->existProject = 'Existing projects';
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
+1
View File
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
$lang->upgrade->line = 'Product Line';
$lang->upgrade->allLines = "All Product Lines";
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->defaultProgram = 'Default Program';
$lang->upgrade->existProgram = 'Existing programs';
$lang->upgrade->existProject = 'Existing projects';
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
+1
View File
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
$lang->upgrade->line = 'Product Line';
$lang->upgrade->allLines = "All Product Lines";
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->defaultProgram = 'Default Program';
$lang->upgrade->existProgram = 'Existing programs';
$lang->upgrade->existProject = 'Existing projects';
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
+1
View File
@@ -99,6 +99,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
$lang->upgrade->line = 'Product Line';
$lang->upgrade->allLines = "All Product Lines";
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->defaultProgram = 'Default Program';
$lang->upgrade->existProgram = 'Existing programs';
$lang->upgrade->existProject = 'Existing projects';
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
+1
View File
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = '切换为项目集管理模式需
$lang->upgrade->line = '产品线';
$lang->upgrade->allLines = "所有{$lang->productCommon}线";
$lang->upgrade->program = '目标项目集和项目';
$lang->upgrade->defaultProgram = '默认项目集';
$lang->upgrade->existProgram = '已有项目集';
$lang->upgrade->existProject = '已有项目';
$lang->upgrade->existLine = '已有' . $lang->productCommon . '线';
+228 -1
View File
@@ -4941,7 +4941,7 @@ class upgradeModel extends model
* @access public
* @return void
*/
public function processMergedData($programID, $projectID, $lineID, $productIdList = array(), $sprintIdList = array())
public function processMergedData($programID, $projectID, $lineID = 0, $productIdList = array(), $sprintIdList = array())
{
/* Product linked objects. */
$this->dao->update(TABLE_RELEASE)->set('project')->eq($projectID)->where('product')->in($productIdList)->exec();
@@ -7570,4 +7570,231 @@ class upgradeModel extends model
return !dao::isError();
}
/**
* Create a default program.
*
* @access public
* @return object
*/
public function createDefaultProgram()
{
$program = $this->dao->select('*')->from(TABLE_PROGRAM)->where('name')->eq($this->lang->upgrade->defaultProgram)->fetch();
if($program) return $program;
$account = isset($this->app->user->account) ? $this->app->user->account : '';
$program = new stdclass();
$program->name = $this->lang->upgrade->defaultProgram;
$program->type = 'program';
$program->status = 'doing';
$program->begin = helper::now();
$program->end = LONG_TIME;
$program->openedBy = $account;
$program->openedDate = helper::now();
$program->openedVersion = $this->config->version;
$program->acl = 'open';
$program->days = $this->computeDaysDelta($program->begin, $program->end);
$program->grade = 1;
$program->vision = 'rnd';
$this->app->loadLang('program');
$this->app->loadLang('project');
$this->lang->project->name = $this->lang->program->name;
$this->dao->insert(TABLE_PROGRAM)->data($program)->exec();
if(dao::isError()) return false;
$programID = $this->dao->lastInsertId();
$this->dao->update(TABLE_PROGRAM)->set('path')->eq(",{$programID},")->set('`order`')->eq($programID * 5)->where('id')->eq($programID)->exec();
$this->loadModel('action')->create('program', $programID, 'openedbysystem');
return $this->loadModel('program')->getByID($programID);
}
/**
* Historical projects are upgraded by project.
*
* @param int $programID
* @access public
* @return bool
*/
public function upgradeInProjectMode($programID)
{
$this->loadModel('action');
$now = helper::now();
$account = isset($this->app->user->account) ? $this->app->user->account : '';
$noMergedSprints = $this->getNoMergedSprints();
if(!$noMergedSprints) return true;
foreach($noMergedSprints as $sprint)
{
$project = new stdclass();
$project->name = $sprint->name;
$project->type = 'project';
$project->model = 'scrum';
$project->parent = $programID;
$project->status = $sprint->status;
$project->begin = $sprint->begin;
$project->end = isset($sprint->end) ? $sprint->end : LONG_TIME;
$project->days = $this->computeDaysDelta($project->begin, $project->end);
$project->PM = $sprint->PM;
$project->auth = 'extend';
$project->openedBy = $account;
$project->openedDate = $now;
$project->openedVersion = $this->config->version;
$project->lastEditedBy = $account;
$project->lastEditedDate = $now;
$project->grade = 2;
$project->acl = $sprint->acl == 'open' ? 'open' : 'private';
$this->dao->insert(TABLE_PROJECT)->data($project)->check('name', 'unique', "type='project' AND parent=$programID AND deleted='0'")->exec();
if(dao::isError()) return false;
$projectID = $this->dao->lastInsertId();
$this->action->create('project', $projectID, 'openedbysystem');
if($project->status == 'closed') $this->action->create('project', $projectID, 'closedbysystem');
$project->id = $projectID;
$this->createProjectDocLib($project);
$this->processMergedData($programID, $projectID, '', array(), array($sprint->id));
}
$this->fixProjectPath($programID);
if(dao::isError()) return false;
return true;
}
/**
* Historical projects are upgraded by execution.
*
* @param int $programID
* @access public
* @return bool
*/
public function upgradeInExecutionMode($programID)
{
$this->loadModel('action');
$now = helper::now();
$account = isset($this->app->user->account) ? $this->app->user->account : '';
$noMergedSprints = $this->getNoMergedSprints();
if(!$noMergedSprints) return true;
$projects = array();
foreach($noMergedSprints as $sprint)
{
$year = date('Y', strtotime($sprint->openedDate));
$projects[$year][$sprint->id] = $sprint;
}
foreach($projects as $year => $sprints)
{
$project = new stdclass();
$project->name = $year;
$project->type = 'project';
$project->model = 'scrum';
$project->parent = $programID;
$project->auth = 'extend';
$project->begin = '';
$project->end = '';
$project->openedBy = $account;
$project->openedDate = $now;
$project->openedVersion = $this->config->version;
$project->lastEditedBy = $account;
$project->lastEditedDate = $now;
$project->grade = 2;
$project->acl = 'open';
$projectStatus = 'closed';
foreach($sprints as $sprint)
{
if(!$project->begin || $sprint->begin < $project->begin) $project->begin = $sprint->begin;
if(!$project->end || $sprint->end > $project->end) $project->end = $sprint->end;
if($sprint->status != 'closed') $projectStatus = 'doing';
}
$project->status = $projectStatus;
$project->days = $this->computeDaysDelta($project->begin, $project->end);
$this->dao->insert(TABLE_PROJECT)->data($project)->exec();
if(dao::isError()) return false;
$projectID = $this->dao->lastInsertId();
$this->action->create('project', $projectID, 'openedbysystem');
if($project->status == 'closed') $this->action->create('project', $projectID, 'closedbysystem');
$project->id = $projectID;
$this->createProjectDocLib($project);
$this->processMergedData($programID, $projectID, '', array(), array_keys($sprints));
}
$this->fixProjectPath($programID);
if(dao::isError()) return false;
return true;
}
/**
* Get sprints has not been merged.
*
* @access public
* @return array
*/
public function getNoMergedSprints()
{
$noMergedSprints = $this->dao->select('*')->from(TABLE_PROJECT)
->where('project')->eq(0)
->andWhere('vision')->eq('rnd')
->andWhere('type')->eq('sprint')
->andWhere('deleted')->eq(0)
->fetchAll('id');
$projectProducts = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('project')->in(array_keys($noMergedSprints))->fetchGroup('project', 'product');
foreach($projectProducts as $sprintID => $products) unset($noMergedSprints[$sprintID]);
if(empty($noMergedSprints)) return false;
return $noMergedSprints;
}
/**
* Create doc lib for project.
*
* @param object $project
* @access public
* @return void
*/
public function createProjectDocLib($project)
{
$this->app->loadLang('doc');
$lib = new stdclass();
$lib->project = $project->id;
$lib->name = $this->lang->doclib->main['project'];
$lib->type = 'project';
$lib->main = '1';
$lib->acl = $project->acl != 'program' ? $project->acl : 'custom';
$this->dao->insert(TABLE_DOCLIB)->data($lib)->exec();
}
/**
* Fix the project path under the program.
*
* @param int $programID
* @access public
* @return void
*/
public function fixProjectPath($programID)
{
$this->dao->update(TABLE_PROJECT)
->set("path = CONCAT(',{$programID},', id, ',')")->set("`order` = `id` * 5")
->where('type')->eq('project')
->andWhere('parent')->eq($programID)
->andWhere('grade')->eq('2')
->exec();
}
}
+2 -2
View File
@@ -25,9 +25,9 @@
<th class='w-100px' valign='top'><?php echo $lang->upgrade->mergeMode;?></th>
<td>
<?php foreach($lang->upgrade->mergeModes as $mode => $label):?>
<div class="radio">
<div class='radio'>
<label>
<input type="radio" name="mode" value="<?php echo $mode;?>" checked="checked">
<input type='radio' name='projectType' value='<?php echo $mode;?>' <?php if($mode == 'project') echo "checked='checked'";?>>
<?php echo $label;?>
<?php $tipLang = 'merge' . ucfirst($mode) . 'Tip';?>
<div class='tips text-gray'><?php echo $lang->upgrade->{$tipLang};?></div>