From 3d54c6ea822ac3e5865f8fc2fb2fb7c31a4b655d Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Fri, 16 Sep 2022 01:25:47 +0000 Subject: [PATCH] * Finish task #69256. --- module/upgrade/control.php | 14 +- module/upgrade/lang/de.php | 1 + module/upgrade/lang/en.php | 1 + module/upgrade/lang/fr.php | 1 + module/upgrade/lang/vi.php | 1 + module/upgrade/lang/zh-cn.php | 1 + module/upgrade/model.php | 229 ++++++++++++++++++- module/upgrade/view/selectmergemode.html.php | 4 +- 8 files changed, 244 insertions(+), 8 deletions(-) diff --git a/module/upgrade/control.php b/module/upgrade/control.php index 22c0fef9f2..d8d5593280 100644 --- a/module/upgrade/control.php +++ b/module/upgrade/control.php @@ -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; diff --git a/module/upgrade/lang/de.php b/module/upgrade/lang/de.php index 1e0920a538..14ddc72fc1 100644 --- a/module/upgrade/lang/de.php +++ b/module/upgrade/lang/de.php @@ -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'; diff --git a/module/upgrade/lang/en.php b/module/upgrade/lang/en.php index 882f75a2ac..11703f3871 100644 --- a/module/upgrade/lang/en.php +++ b/module/upgrade/lang/en.php @@ -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'; diff --git a/module/upgrade/lang/fr.php b/module/upgrade/lang/fr.php index 02e766e464..79555a5524 100644 --- a/module/upgrade/lang/fr.php +++ b/module/upgrade/lang/fr.php @@ -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'; diff --git a/module/upgrade/lang/vi.php b/module/upgrade/lang/vi.php index e3f454e7c2..06aab7e2c5 100644 --- a/module/upgrade/lang/vi.php +++ b/module/upgrade/lang/vi.php @@ -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'; diff --git a/module/upgrade/lang/zh-cn.php b/module/upgrade/lang/zh-cn.php index cc919f92ef..20a409caab 100644 --- a/module/upgrade/lang/zh-cn.php +++ b/module/upgrade/lang/zh-cn.php @@ -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 . '线'; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index c0fd3dd323..4a9788acdd 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -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(); @@ -7528,4 +7528,231 @@ class upgradeModel extends model } return true; } + + /** + * 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(); + } } diff --git a/module/upgrade/view/selectmergemode.html.php b/module/upgrade/view/selectmergemode.html.php index 4dbcd69461..84bf3f2c18 100644 --- a/module/upgrade/view/selectmergemode.html.php +++ b/module/upgrade/view/selectmergemode.html.php @@ -25,9 +25,9 @@