diff --git a/db/update21.7.3.sql b/db/update21.7.3.sql index f6a7cf06ce..495ebd2b28 100644 --- a/db/update21.7.3.sql +++ b/db/update21.7.3.sql @@ -71,14 +71,12 @@ UPDATE `zt_bug` SET `injection` = '' WHERE `injection` = '0'; UPDATE `zt_bug` SET `identify` = '' WHERE `identify` = '0'; ALTER TABLE `zt_doc` ADD `isDeliverable` tinyint(1) NOT NULL DEFAULT 0 AFTER `acl`; -ALTER TABLE `zt_deliverable` CHANGE `module` `module` mediumint(8) unsigned NOT NULL DEFAULT '0'; ALTER TABLE `zt_deliverable` ADD `workflowGroup` int(8) NOT NULL DEFAULT '0' AFTER `id`; ALTER TABLE `zt_deliverable` ADD `activity` int(8) unsigned NOT NULL DEFAULT '0' AFTER `name`; ALTER TABLE `zt_deliverable` ADD `trimmable` char(30) NOT NULL DEFAULT '0' AFTER `activity`; ALTER TABLE `zt_deliverable` ADD `trimRule` varchar(255) NOT NULL AFTER `trimmable`; ALTER TABLE `zt_deliverable` ADD `template` text NOT NULL AFTER `trimRule`; ALTER TABLE `zt_deliverable` ADD `status` varchar(30) NOT NULL DEFAULT 'enabled' AFTER `name`; -ALTER TABLE `zt_deliverable` DROP `method`, DROP `model`, DROP `type`, DROP `files`; CREATE TABLE IF NOT EXISTS `zt_deliverablestage` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT, diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 170eb7f432..7d2da20b4c 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -3706,7 +3706,7 @@ class upgradeModel extends model $projectList = $result; } - else if(!empty($data->projects)) + elseif(!empty($data->projects)) { $projectList = (int)$data->projects; $this->dao->update(TABLE_PROJECT)->set('status')->eq($data->projectStatus)->where('id')->eq($projectList)->exec(); @@ -11317,92 +11317,109 @@ class upgradeModel extends model $deliverable->createdDate = helper::now(); $deliverableStage = new stdClass(); + $deliverableStage->stage = 'project'; + $deliverableStage->required = '0'; - $deliverableList = array(); - $workflowGroups = $this->dao->select('id,deliverable,projectModel,projectType')->from(TABLE_WORKFLOWGROUP)->fetchAll(); - $deliverables = $this->dao->select('id,name')->from(TABLE_DELIVERABLE)->where('deleted')->eq('0')->fetchAll('id'); - $fileList = $this->dao->select('id,title,objectType,objectID')->from(TABLE_FILE)->where('objectType')->eq('deliverable')->fetchAll('objectID'); + $deliverableList = array(); + $nameFilter = array(); // 过滤重名交付物。 + $otherModule = array(); // 交付物其他分类。 + $workflowGroups = $this->dao->select('id,deliverable,projectModel,projectType')->from(TABLE_WORKFLOWGROUP)->where('type')->eq('project')->fetchAll(); + $deliverables = $this->dao->select('id,name,model,`desc`')->from(TABLE_DELIVERABLE)->where('deleted')->eq('0')->andWhere('model')->ne('')->fetchAll('id'); + $fileList = $this->dao->select('id,title,objectType,objectID')->from(TABLE_FILE)->where('objectType')->eq('deliverable')->fetchAll('objectID'); + /* 将旧的交付物按照适用范围升级到各个项目流程中。 */ + foreach($deliverables as $oldDeliverable) + { + foreach(explode(',', $oldDeliverable->model) as $model) + { + foreach($workflowGroups as $workflowGroup) + { + if(!empty($deliverableList[$workflowGroup->id][$oldDeliverable->id])) continue; + if(strpos($model, "{$workflowGroup->projectType}_{$workflowGroup->projectModel}") === false) continue; + if(empty($otherModule[$workflowGroup->id])) $otherModule[$workflowGroup->id] = $this->createDeliverableModule($workflowGroup->id, $this->lang->tree->otherModule); + + $deliverableFile = $fileList[$oldDeliverable->id]; // 原交付物只会上传一个附件。 + $deliverable->workflowGroup = $workflowGroup->id; + $deliverable->desc = $oldDeliverable->desc; + $deliverable->module = $otherModule[$workflowGroup->id]; + $deliverable->template = $deliverableFile ? '{"new_0":{"name":"' . $deliverableFile->title . '","doc":"","fileID":"' . $deliverableFile->id . '"}}' : '[]'; + + /* 重名的交付物名称后面加数字。 */ + if(!empty($nameFilter[$workflowGroup->id][$oldDeliverable->name])) + { + $deliverable->name = $oldDeliverable->name . $nameFilter[$oldDeliverable->name]; + $nameFilter[$workflowGroup->id][$oldDeliverable->name] ++; + } + else + { + $deliverable->name = $oldDeliverable->name; + $nameFilter[$workflowGroup->id][$oldDeliverable->name] = 1; + } + + $this->dao->insert(TABLE_DELIVERABLE)->data($deliverable)->exec(); + $deliverableID = $this->dao->lastInsertID(); + $deliverableList[$workflowGroup->id][$oldDeliverable->id] = $deliverableID; + + $deliverableStage->deliverable = $deliverableID; + $this->dao->insert(TABLE_DELIVERABLESTAGE)->data($deliverableStage)->exec(); + } + } + } + + $sprintFilter = array(); // 过滤重复交付物检查规则。 + /* 按照项目流程下的交付物配置设置各个交付物的检查规则。 */ foreach($workflowGroups as $workflowGroup) { - $nameFilter = array(); // 过滤重名交付物。 - $deliverableFilter = array(); // 过滤重复交付物。 - $sprintFilter = array(); // 过滤重复交付物检查规则。 - $groupDeliverable = !empty($workflowGroup->deliverable) ? json_decode($workflowGroup->deliverable, true) : array(); - if($groupDeliverable) $otherModule = $this->createDeliverableModule($workflowGroup->id, $this->lang->tree->otherModule); - /* 解析项目流程的交付物配置。 */ + $groupDeliverable = !empty($workflowGroup->deliverable) ? json_decode($workflowGroup->deliverable, true) : array(); foreach($groupDeliverable as $stageCode => $methodDeliverable) { foreach($methodDeliverable as $deliverableConfigs) { foreach($deliverableConfigs as $config) { - $oldDeliverableID = $config['deliverable']; - if(empty($deliverables[$oldDeliverableID])) continue; - - $oldDeliverable = $deliverables[$oldDeliverableID]; - if(empty($deliverableFilter[$oldDeliverable->id])) - { - $deliverableFile = $fileList[$oldDeliverableID]; // 原交付物只会上传一个附件。 - $deliverable->workflowGroup = $workflowGroup->id; - $deliverable->desc = $oldDeliverable->desc; - $deliverable->module = $otherModule; - $deliverable->template = $deliverableFile ? '{"new_0":{"name":"' . $deliverableFile->title . '","doc":"","fileID":"' . $deliverableFile->id . '"}}' : '[]'; - - /* 重名的交付物名称后面加数字。 */ - if(!empty($nameFilter[$oldDeliverable->name])) - { - $deliverable->name = $oldDeliverable->name . $nameFilter[$oldDeliverable->name]; - $nameFilter[$oldDeliverable->name] ++; - } - else - { - $deliverable->name = $oldDeliverable->name; - $nameFilter[$oldDeliverable->name] = 1; - } - - $this->dao->insert(TABLE_DELIVERABLE)->data($deliverable)->exec(); - $deliverableID = $this->dao->lastInsertID(); - $deliverableFilter[$oldDeliverable->id] = $deliverableID; - $deliverableList[$oldDeliverable->id] = $deliverableID; - } - else - { - $deliverableID = $deliverableFilter[$oldDeliverable->id]; - } + if(empty($deliverableList[$workflowGroup->id][$config['deliverable']])) continue; + $deliverableID = $deliverableList[$workflowGroup->id][$config['deliverable']]; $workflowGroupModel = "{$workflowGroup->projectType}_{$workflowGroup->projectModel}"; $deliverableStage->stage = $stageCode == $workflowGroupModel ? 'project' : str_replace("{$workflowGroupModel}_", '', $stageCode); $deliverableStage->required = !empty($config['required']) ? '1' : '0'; $deliverableStage->deliverable = $deliverableID; - /* 将原来不同类型的迭代合并成一个迭代。 */ - if(in_array($deliverableStage->stage, array('short', 'long', 'ops', 'kanban'))) + if($deliverableStage->stage == 'project') { + $this->dao->update(TABLE_DELIVERABLESTAGE)->set('required')->eq($deliverableStage->required)->where('deliverable')->eq($deliverableID)->andWhere('stage')->eq('project')->exec(); + } + elseif(in_array($deliverableStage->stage, array('short', 'long', 'ops', 'kanban'))) + { + /* 将原来不同类型的迭代合并成一个迭代。 */ $deliverableStage->stage = 'sprint'; /* 其中有一个类型是必填的合并后的结果就是必填。 */ - if(isset($sprintFilter[$deliverableID]) && empty($sprintFilter[$deliverableID]) && !empty($deliverableStage->required)) + if(isset($sprintFilter[$deliverableID]['sprint']) && empty($sprintFilter[$deliverableID]['sprint']) && !empty($deliverableStage->required)) { $this->dao->update(TABLE_DELIVERABLESTAGE)->set('required')->eq('1')->where('deliverable')->eq($deliverableID)->andWhere('stage')->eq('sprint')->exec(); } - if(!isset($sprintFilter[$deliverableID])) + if(!isset($sprintFilter[$deliverableID]['sprint'])) { $this->dao->insert(TABLE_DELIVERABLESTAGE)->data($deliverableStage)->exec(); } } - else + elseif(!isset($sprintFilter[$deliverableID][$deliverableStage->stage])) { $this->dao->insert(TABLE_DELIVERABLESTAGE)->data($deliverableStage)->exec(); } - $sprintFilter[$deliverableID] = $deliverableStage->required; + $sprintFilter[$deliverableID][$deliverableStage->stage] = $deliverableStage->required; } } } } - /* 将历史的交付物数据删掉。 */ - $this->dao->delete()->from(TABLE_DELIVERABLE)->where('id')->in(array_keys($deliverableList))->andWhere('workflowGroup')->eq('0')->exec(); + /* 将已升级的历史交付物数据删掉。 */ + $this->dao->delete()->from(TABLE_DELIVERABLE)->where('id')->in(array_keys($deliverables))->andWhere('workflowGroup')->eq('0')->exec(); - $this->upgradeProjectDeliverable($deliverableList); + /* 升级完后把没用的字段删掉。 */ + $this->dao->exec("ALTER TABLE " . TABLE_DELIVERABLE . " DROP `method`, DROP `model`, DROP `type`, DROP `files`;"); + $this->dao->exec("ALTER TABLE " . TABLE_DELIVERABLE . " CHANGE `module` `module` mediumint(8) unsigned NOT NULL DEFAULT '0';"); + + if($deliverableList) $this->upgradeProjectDeliverable($deliverableList); } /** @@ -11450,7 +11467,7 @@ class upgradeModel extends model */ public function upgradeProjectDeliverable(array $deliverableList) { - $projectList = $this->dao->select('id,deliverable')->from(TABLE_PROJECT)->where('deliverable')->ne('')->fetchAll(); + $projectList = $this->dao->select('id,deliverable,workflowGroup')->from(TABLE_PROJECT)->where('deliverable')->ne('')->fetchAll(); foreach($projectList as $project) { $projectDeliverable = array(); @@ -11467,7 +11484,7 @@ class upgradeModel extends model if(empty($config['doc']) && empty($config['file'])) continue; $oldDeliverableID = $config['deliverable']; - $deliverableID = !empty($deliverableList[$oldDeliverableID]) ? $deliverableList[$oldDeliverableID] : $oldDeliverableID; + $deliverableID = !empty($deliverableList[$project->workflowGroup][$oldDeliverableID]) ? $deliverableList[$project->workflowGroup][$oldDeliverableID] : $oldDeliverableID; $projectDeliverable[$deliverableID]['id'] = $deliverableID; $projectDeliverable[$deliverableID]['doc'] = !empty($config['doc']) ? $config['doc'] : ''; $projectDeliverable[$deliverableID]['file'] = !empty($config['file']) ? $config['file'] : '';