diff --git a/db/update22.0.sql b/db/update22.0.sql index 6929b470bb..f637aa80dd 100644 --- a/db/update22.0.sql +++ b/db/update22.0.sql @@ -31,6 +31,7 @@ ALTER TABLE `zt_searchindex` CHANGE `content` `content` longtext NULL; CREATE TABLE IF NOT EXISTS `zt_projectdeliverable` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT, `project` int(8) unsigned NOT NULL, + `review` int(8) unsigned NOT NULL DEFAULT '0', `deliverable` varchar(30) NOT NULL, `name` varchar(255) NOT NULL, `doc` int(8) unsigned NOT NULL DEFAULT '0', diff --git a/db/zentao.sql b/db/zentao.sql index eb53a19848..fc4b8ef0ae 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1678,6 +1678,7 @@ CREATE UNIQUE INDEX `group_account` ON `zt_projectadmin`(`group`, `account`); CREATE TABLE IF NOT EXISTS `zt_projectdeliverable` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT, `project` int(8) unsigned NOT NULL, + `review` int(8) unsigned NOT NULL DEFAULT '0', `deliverable` varchar(30) NOT NULL, `name` varchar(255) NOT NULL, `doc` int(8) unsigned NOT NULL DEFAULT '0', diff --git a/module/upgrade/config/upgradeflow.php b/module/upgrade/config/upgradeflow.php index ebb809a4c3..062ec48eec 100644 --- a/module/upgrade/config/upgradeflow.php +++ b/module/upgrade/config/upgradeflow.php @@ -112,7 +112,7 @@ $config->upgrade->execFlow['21_6_beta'] = array('functions' => 'processCharter $config->upgrade->execFlow['21_6_1'] = array('xxsqls' => "$appRoot/db/upgradexuanxuan9.1.2.sql"); $config->upgrade->execFlow['21_7'] = array('functions' => 'fixWorkflowNameForExecution'); $config->upgrade->execFlow['21_7_1'] = array('functions' => 'convertCharset,processActionProduct'); -$config->upgrade->execFlow['21_7_3'] = array('functions' => 'upgradeProcessAndActivity,addDefaultDeliverableModule,upgradeDesignToDeliverable,upgradeDeliverable,upgradeBaselineObjects'); +$config->upgrade->execFlow['21_7_3'] = array('functions' => 'upgradeProcessAndActivity,addDefaultDeliverableModule,upgradeDesignToDeliverable,upgradeDeliverable,upgradeBaselineObjects,upgradeReviewToDeliverable'); if(!empty($config->isINT)) { diff --git a/module/upgrade/model.php b/module/upgrade/model.php index fc5a99d5dc..35fe9bcc57 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -11609,7 +11609,7 @@ class upgradeModel extends model $this->dao->update(TABLE_PROJECTDELIVERABLE)->set('name')->eq($doc->title)->set('docVersion')->eq($doc->version)->where('id')->eq($deliverableID)->exec(); } - $this->dao->exec("ALTER TABLE " . TABLE_PROJECT . " DROP `deliverable`;"); + $this->dao->query("ALTER TABLE " . TABLE_PROJECT . " DROP COLUMN `deliverable`;"); } /** @@ -11782,6 +11782,75 @@ class upgradeModel extends model $this->dao->delete()->from(TABLE_REVIEWCL)->where('id')->in($upgradeReviewcls)->exec(); $this->dao->exec("ALTER TABLE " . TABLE_REVIEWCL . " CHANGE `object` `object` mediumint(8) unsigned NOT NULL DEFAULT '0';"); - $this->dao->exec('ALTER TABLE ' . TABLE_REVIEWCL . ' DROP `type`'); + $this->dao->exec("ALTER TABLE " . TABLE_REVIEWCL . " DROP `type`;"); + } + + /** + * 升级项目评审对象到项目交付物。 + * Upgrade review to deliverable. + * + * @access public + * @return void + */ + public function upgradeReviewToDeliverable() + { + if(!in_array($this->config->edition, array('ipd', 'max'))) return; // 开源版、企业版没有评审功能。 + + $this->loadModel('review'); + $reviews = $this->dao->select('t1.*, t2.category, t2.version')->from(TABLE_REVIEW)->alias('t1') + ->leftJoin(TABLE_OBJECT)->alias('t2')->on('t1.object=t2.id') + ->where('t1.deleted')->eq('0') + ->beginIF($this->config->edition == 'ipd')->andWhere('t2.category')->notin(array_keys($this->lang->review->reviewPoint->titleList))->fi() // IPD 模式下,只升级非评审点的评审。 + ->fetchAll('id'); + + $projectDeliverables = $this->dao->select('t1.id, t2.id as deliverable, t2.category')->from(TABLE_PROJECT)->alias('t1') + ->leftJoin(TABLE_DELIVERABLE)->alias('t2')->on('t1.workflowGroup=t2.workflowGroup') + ->where('t2.category IS NOT NULL') + ->fetchGroup('id', 'category'); + + $docIdList = array_column($reviews, 'doc'); + $docIdList = array_unique($docIdList); + $docIdList = array_filter($docIdList); + $docList = $this->dao->select('id, title')->from(TABLE_DOC)->where('id')->in($docIdList)->fetchPairs(); + + $projectMainLibPairs = $this->dao->select('project, id')->from(TABLE_DOCLIB)->where('main')->eq('1')->andWhere('type')->eq('project')->fetchPairs(); + + foreach($reviews as $review) + { + if(!isset($projectDeliverables[$review->project][$review->category])) continue; + + /* 不是系统模板生成、也没选文档的,自动生成文档。 */ + if(!$review->template && !$review->doc) + { + $doc = new stdclass(); + $doc->title = $review->title; + $doc->lib = $projectMainLibPairs[$review->project]; + $doc->project = $review->project; + $doc->version = 1; + $doc->type = 'text'; + $doc->addedBy = $review->createdBy; + $doc->addedDate = $review->createdDate; + $doc->acl = 'open'; + $doc->addedBy = 'system'; + $doc->addedDate = helper::now(); + + $this->dao->insert(TABLE_DOC)->data($doc)->exec(); + $review->doc = $this->dao->lastInsertID(); + $this->dao->update(TABLE_REVIEW)->set('doc')->eq($review->doc)->where('id')->eq($review->id)->exec(); + } + + $deliverable = new stdclass(); + $deliverable->name = isset($docList[$review->doc]) ? $docList[$review->doc] : $review->title; // 优先使用文档的标题 + $deliverable->project = $review->project; + $deliverable->review = $review->id; + $deliverable->deliverable = $projectDeliverables[$review->project][$review->category]->deliverable; + $deliverable->doc = $review->doc; + $deliverable->docVersion = $review->docVersion; + $deliverable->createdBy = $review->createdBy; + $deliverable->createdDate = $review->createdDate; + $deliverable->status = $review->status; + $deliverable->version = $review->version; + $this->dao->insert(TABLE_PROJECTDELIVERABLE)->data($deliverable)->exec(); + } } }