Merge branch feature/workflowgroup of zentao/zentaopms (#10750)

This commit is contained in:
刘刚
2025-08-04 16:34:26 +08:00
committed by Gitfox
2 changed files with 72 additions and 57 deletions
-2
View File
@@ -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,
+72 -55
View File
@@ -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'] : '';