diff --git a/db/update18.1.sql b/db/update18.1.sql
index dea20bab4f..7a9b0d9d6a 100644
--- a/db/update18.1.sql
+++ b/db/update18.1.sql
@@ -8,3 +8,15 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`, `
UPDATE `zt_project` AS parent INNER JOIN (select `id`,`parent`,`attribute` from `zt_project` where `parent` != 0 and `type` = 'stage') AS child ON parent.`id` = child.`parent` SET parent.`attribute`='mix' where parent.`grade`=1 and parent.`type`='stage' and parent.`attribute` != child.`attribute`;
REPLACE INTO `zt_grouppriv` (SELECT `group`,`module`,'batchChangeStatus' FROM `zt_grouppriv` WHERE `module` = 'execution' AND `method` = 'batchEdit');
+
+ALTER table `zt_stage` ADD `projectType` varchar(255) NOT NULL DEFAULT '' AFTER `type`;
+UPDATE `zt_stage` SET `projectType` = 'waterfall' WHERE `projectType` = '';
+
+REPLACE INTO `zt_stage` (`name`,`percent`,`type`, `projectType`, `createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
+('需求','10','request','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('设计','10','design','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('开发','50','dev','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('测试','15','qa','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('发布','10','release','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('总结评审','5','review','waterfallplus','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
+
diff --git a/db/zentao.sql b/db/zentao.sql
index 9d5ffb171a..b7c0f371e0 100755
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -6391,13 +6391,19 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) V
('all','stage','typeList','review','总结评审','1'),
('all','stage','typeList','other','其他','1');
-REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
-('需求','10','request','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('设计','10','design','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('开发','50','dev','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('测试','15','qa','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('发布','10','release','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('总结评审','5','review','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
+REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`projectType`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
+('需求','10','request','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('设计','10','design','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('开发','50','dev','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('测试','15','qa','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('发布','10','release','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('总结评审','5','review','waterfall','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
+('需求','10','request','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('设计','10','design','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('开发','50','dev','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('测试','15','qa','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('发布','10','release','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('总结评审','5','review','waterfallplus','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'custom', '', 'hourPoint', '0');
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1');
diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php
index 28890757f0..290221bc48 100644
--- a/module/admin/lang/menu.php
+++ b/module/admin/lang/menu.php
@@ -75,26 +75,34 @@ $lang->admin->menuList->switch['subMenu']['setmodule'] = array('link' => "{$lang
$lang->admin->menuList->switch['menuOrder']['5'] = 'setmodule';
-$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday');
-$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl');
-$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|settype|", 'subModule' => 'stage');
+$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday,stage', 'exclude' => 'stage-browse,stage-plusbrowse,stage-create,stage-edit,stage-batchcreate');
+$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl');
+$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-plusbrowse');
+$lang->admin->menuList->model['subMenu']['agileplus'] = array('link' => "{$lang->agilePlusModel}|auditcl|agileplusbrowse|", 'subModule' => 'auditcl');
+$lang->admin->menuList->model['subMenu']['waterfallplus'] = array('link' => "{$lang->waterfallPlusModel}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-browse');
$lang->admin->menuList->model['menuOrder']['5'] = 'common';
$lang->admin->menuList->model['menuOrder']['10'] = 'scrum';
$lang->admin->menuList->model['menuOrder']['15'] = 'waterfall';
+$lang->admin->menuList->model['menuOrder']['20'] = 'agileplus';
+$lang->admin->menuList->model['menuOrder']['25'] = 'waterfallplus';
-$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|'));
-$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom');
-$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
-$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
-$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|'));
-$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|'));
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage';
+$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|'));
+$lang->admin->menuList->model['tabMenu']['common']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|'));
+$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom');
+$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
+$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
+$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|'));
+$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-plusbrowse');
+$lang->admin->menuList->model['tabMenu']['waterfallplus']['stage'] = array('link' => "{$lang->stage->common}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-browse');
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['7'] = 'stage';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfallplus']['5'] = 'stage';
$lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo&field=priList", 'exclude' => 'set,required');
$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'exclude' => 'set,required', 'alias' => 'browsestoryconcept,product');
diff --git a/module/common/lang/de.php b/module/common/lang/de.php
index 139d0df14d..9533c3fd2c 100644
--- a/module/common/lang/de.php
+++ b/module/common/lang/de.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
Z PUBLIC LICENSE 1.2 .
Without authorization, I should not remove, hide or cover any logos/links of ZenTao.";
$lang->designedByAIUX = "
AIUX";
-$lang->reset = 'Zurücksetzen';
-$lang->cancel = 'Abbrechen';
-$lang->refresh = 'Aktualisieren';
-$lang->refreshIcon = "
";
-$lang->create = 'Create';
-$lang->edit = 'Bearbeiten';
-$lang->delete = 'Löschen';
-$lang->activate = 'Activate';
-$lang->close = 'Schließen';
-$lang->unlink = 'Entfernen';
-$lang->import = 'Importieren';
-$lang->export = 'Exportieren';
-$lang->setFileName = 'Dateiame';
-$lang->submitting = 'Speichern...';
-$lang->save = 'Speichern';
-$lang->confirm = 'Bestätigen';
-$lang->preview = 'Ansehen';
-$lang->goback = 'Zurück';
-$lang->goPC = 'PC';
-$lang->more = 'Mehr';
-$lang->moreLink = 'MORE';
-$lang->day = 'Tag';
-$lang->customConfig = 'Custom Config';
-$lang->public = 'Öffentlich';
-$lang->trunk = 'Trunk';
-$lang->sort = 'Sortieren';
-$lang->required = 'Pflicht';
-$lang->noData = 'Kein Datensatz';
-$lang->fullscreen = 'Fullscreen';
-$lang->retrack = 'Retrack';
-$lang->whitelist = 'Weiße Liste';
-$lang->globalSetting = 'Common';
-$lang->waterfallModel = 'Waterfall';
-$lang->scrumModel = 'Scrum';
-$lang->agilePlusModel = 'Agile Plus';
-$lang->all = 'All';
-$lang->viewDetails = 'View Details';
+$lang->reset = 'Zurücksetzen';
+$lang->cancel = 'Abbrechen';
+$lang->refresh = 'Aktualisieren';
+$lang->refreshIcon = "
";
+$lang->create = 'Create';
+$lang->edit = 'Bearbeiten';
+$lang->delete = 'Löschen';
+$lang->activate = 'Activate';
+$lang->close = 'Schließen';
+$lang->unlink = 'Entfernen';
+$lang->import = 'Importieren';
+$lang->export = 'Exportieren';
+$lang->setFileName = 'Dateiame';
+$lang->submitting = 'Speichern...';
+$lang->save = 'Speichern';
+$lang->confirm = 'Bestätigen';
+$lang->preview = 'Ansehen';
+$lang->goback = 'Zurück';
+$lang->goPC = 'PC';
+$lang->more = 'Mehr';
+$lang->moreLink = 'MORE';
+$lang->day = 'Tag';
+$lang->customConfig = 'Custom Config';
+$lang->public = 'Öffentlich';
+$lang->trunk = 'Trunk';
+$lang->sort = 'Sortieren';
+$lang->required = 'Pflicht';
+$lang->noData = 'Kein Datensatz';
+$lang->fullscreen = 'Fullscreen';
+$lang->retrack = 'Retrack';
+$lang->whitelist = 'Weiße Liste';
+$lang->globalSetting = 'Common';
+$lang->waterfallModel = 'Waterfall';
+$lang->scrumModel = 'Scrum';
+$lang->agilePlusModel = 'Agile Plus';
+$lang->waterfallPlusModel = 'Waterfall Plus';
+$lang->all = 'All';
+$lang->viewDetails = 'View Details';
$lang->actions = 'Aktionen';
$lang->restore = 'Wiederherstellen';
diff --git a/module/common/lang/en.php b/module/common/lang/en.php
index 1eedb95f60..5cfa642013 100644
--- a/module/common/lang/en.php
+++ b/module/common/lang/en.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
Without authorization, I should not remove, hide or cover any logos/links of ZenTao.";
$lang->designedByAIUX = "
AIUX";
-$lang->reset = 'Reset';
-$lang->cancel = 'Cancel';
-$lang->refresh = 'Refresh';
-$lang->refreshIcon = "
";
-$lang->create = 'Create';
-$lang->edit = 'Edit';
-$lang->delete = 'Delete';
-$lang->activate = 'Activate';
-$lang->close = 'Close';
-$lang->unlink = 'Unlink';
-$lang->import = 'Import';
-$lang->export = 'Export';
-$lang->setFileName = 'File Name';
-$lang->submitting = 'Saving...';
-$lang->save = 'Save';
-$lang->confirm = 'Confirm';
-$lang->preview = 'View';
-$lang->goback = 'Back';
-$lang->goPC = 'PC';
-$lang->more = 'More';
-$lang->moreLink = 'MORE';
-$lang->day = ' Day';
-$lang->customConfig = 'Custom Config';
-$lang->public = 'Public';
-$lang->trunk = 'Trunk';
-$lang->sort = 'Order';
-$lang->required = 'Required';
-$lang->noData = 'No data.';
-$lang->fullscreen = 'Fullscreen';
-$lang->retrack = 'Retrack';
-$lang->whitelist = 'Access whitelist';
-$lang->globalSetting = 'Common';
-$lang->waterfallModel = 'Waterfall';
-$lang->scrumModel = 'Scrum';
-$lang->agilePlusModel = 'Agile Plus';
-$lang->all = 'All';
-$lang->viewDetails = 'View Details';
+$lang->reset = 'Reset';
+$lang->cancel = 'Cancel';
+$lang->refresh = 'Refresh';
+$lang->refreshIcon = "
";
+$lang->create = 'Create';
+$lang->edit = 'Edit';
+$lang->delete = 'Delete';
+$lang->activate = 'Activate';
+$lang->close = 'Close';
+$lang->unlink = 'Unlink';
+$lang->import = 'Import';
+$lang->export = 'Export';
+$lang->setFileName = 'File Name';
+$lang->submitting = 'Saving...';
+$lang->save = 'Save';
+$lang->confirm = 'Confirm';
+$lang->preview = 'View';
+$lang->goback = 'Back';
+$lang->goPC = 'PC';
+$lang->more = 'More';
+$lang->moreLink = 'MORE';
+$lang->day = ' Day';
+$lang->customConfig = 'Custom Config';
+$lang->public = 'Public';
+$lang->trunk = 'Trunk';
+$lang->sort = 'Order';
+$lang->required = 'Required';
+$lang->noData = 'No data.';
+$lang->fullscreen = 'Fullscreen';
+$lang->retrack = 'Retrack';
+$lang->whitelist = 'Access whitelist';
+$lang->globalSetting = 'Common';
+$lang->waterfallModel = 'Waterfall';
+$lang->scrumModel = 'Scrum';
+$lang->agilePlusModel = 'Agile Plus';
+$lang->waterfallPlusModel = 'Waterfall Plus';
+$lang->all = 'All';
+$lang->viewDetails = 'View Details';
$lang->actions = 'Action';
$lang->restore = 'Reset';
diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php
index 985b8b6d92..4b6885212b 100644
--- a/module/common/lang/fr.php
+++ b/module/common/lang/fr.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
Z PUBLIC LICENSE 1.2 .
Sans autorisation, je ne dois pas supprimer, masquer ou couvrir les logos / liens de ZenTao.";
$lang->designedByAIUX = "
AIUX";
-$lang->reset = 'Réinitialiser';
-$lang->cancel = 'Annuler';
-$lang->refresh = 'Rafraichir';
-$lang->refreshIcon = "
";
-$lang->create = 'Create';
-$lang->edit = 'Editer';
-$lang->delete = 'Supprimer';
-$lang->activate = 'Activate';
-$lang->close = 'Fermer';
-$lang->unlink = 'Dissocier';
-$lang->import = 'Importer';
-$lang->export = 'Exporter';
-$lang->setFileName = 'Nom du Fichier';
-$lang->submitting = 'Enregistrement...';
-$lang->save = 'Sauvegarde';
-$lang->confirm = 'Confirmer';
-$lang->preview = 'Consulter';
-$lang->goback = 'Retour';
-$lang->goPC = 'PC';
-$lang->more = 'Plus';
-$lang->moreLink = 'MORE';
-$lang->day = 'Jour';
-$lang->customConfig = 'Personnalisation';
-$lang->public = 'Public';
-$lang->trunk = 'Tronc';
-$lang->sort = 'Ordre';
-$lang->required = 'Obligatoire';
-$lang->noData = 'No data.';
-$lang->fullscreen = 'Plein Ecran';
-$lang->retrack = 'Réduire';
-$lang->whitelist = 'Liste blanche';
-$lang->globalSetting = 'Common';
-$lang->waterfallModel = 'Waterfall';
-$lang->scrumModel = 'Scrum';
-$lang->agilePlusModel = 'Agile Plus';
-$lang->all = 'All';
-$lang->viewDetails = 'View Details';
+$lang->reset = 'Réinitialiser';
+$lang->cancel = 'Annuler';
+$lang->refresh = 'Rafraichir';
+$lang->refreshIcon = "
";
+$lang->create = 'Create';
+$lang->edit = 'Editer';
+$lang->delete = 'Supprimer';
+$lang->activate = 'Activate';
+$lang->close = 'Fermer';
+$lang->unlink = 'Dissocier';
+$lang->import = 'Importer';
+$lang->export = 'Exporter';
+$lang->setFileName = 'Nom du Fichier';
+$lang->submitting = 'Enregistrement...';
+$lang->save = 'Sauvegarde';
+$lang->confirm = 'Confirmer';
+$lang->preview = 'Consulter';
+$lang->goback = 'Retour';
+$lang->goPC = 'PC';
+$lang->more = 'Plus';
+$lang->moreLink = 'MORE';
+$lang->day = 'Jour';
+$lang->customConfig = 'Personnalisation';
+$lang->public = 'Public';
+$lang->trunk = 'Tronc';
+$lang->sort = 'Ordre';
+$lang->required = 'Obligatoire';
+$lang->noData = 'No data.';
+$lang->fullscreen = 'Plein Ecran';
+$lang->retrack = 'Réduire';
+$lang->whitelist = 'Liste blanche';
+$lang->globalSetting = 'Common';
+$lang->waterfallModel = 'Waterfall';
+$lang->scrumModel = 'Scrum';
+$lang->agilePlusModel = 'Agile Plus';
+$lang->waterfallPlusModel = 'Waterfall Plus';
+$lang->all = 'All';
+$lang->viewDetails = 'View Details';
$lang->actions = 'Action';
$lang->restore = 'Réinitialiser';
diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php
index e6a1814f28..1fe380222a 100644
--- a/module/common/lang/zh-cn.php
+++ b/module/common/lang/zh-cn.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
未经许可,不得去除、隐藏或遮掩禅道软件的任何标志及链接。";
$lang->designedByAIUX = "
艾体验设计";
-$lang->reset = '重填';
-$lang->cancel = '取消';
-$lang->refresh = '刷新';
-$lang->refreshIcon = "
";
-$lang->create = '新建';
-$lang->edit = '编辑';
-$lang->delete = '删除';
-$lang->activate = '激活';
-$lang->close = '关闭';
-$lang->unlink = '移除';
-$lang->import = '导入';
-$lang->export = '导出';
-$lang->setFileName = '文件名:';
-$lang->submitting = '稍候...';
-$lang->save = '保存';
-$lang->confirm = '确认';
-$lang->preview = '查看';
-$lang->goback = '返回';
-$lang->goPC = 'PC版';
-$lang->more = '更多';
-$lang->moreLink = 'More';
-$lang->day = '天';
-$lang->customConfig = '自定义';
-$lang->public = '公共';
-$lang->trunk = '主干';
-$lang->sort = '排序';
-$lang->required = '必填';
-$lang->noData = '暂无';
-$lang->fullscreen = '全屏';
-$lang->retrack = '收起';
-$lang->whitelist = '访问白名单';
-$lang->globalSetting = '通用';
-$lang->waterfallModel = '瀑布模型';
-$lang->scrumModel = '敏捷模型';
-$lang->agilePlusModel = '融合敏捷模型';
-$lang->all = '所有';
-$lang->viewDetails = '查看详情';
+$lang->reset = '重填';
+$lang->cancel = '取消';
+$lang->refresh = '刷新';
+$lang->refreshIcon = "
";
+$lang->create = '新建';
+$lang->edit = '编辑';
+$lang->delete = '删除';
+$lang->activate = '激活';
+$lang->close = '关闭';
+$lang->unlink = '移除';
+$lang->import = '导入';
+$lang->export = '导出';
+$lang->setFileName = '文件名:';
+$lang->submitting = '稍候...';
+$lang->save = '保存';
+$lang->confirm = '确认';
+$lang->preview = '查看';
+$lang->goback = '返回';
+$lang->goPC = 'PC版';
+$lang->more = '更多';
+$lang->moreLink = 'More';
+$lang->day = '天';
+$lang->customConfig = '自定义';
+$lang->public = '公共';
+$lang->trunk = '主干';
+$lang->sort = '排序';
+$lang->required = '必填';
+$lang->noData = '暂无';
+$lang->fullscreen = '全屏';
+$lang->retrack = '收起';
+$lang->whitelist = '访问白名单';
+$lang->globalSetting = '通用';
+$lang->waterfallModel = '瀑布模型';
+$lang->scrumModel = '敏捷模型';
+$lang->agilePlusModel = '融合敏捷模型';
+$lang->waterfallPlusModel = '融合瀑布模型';
+$lang->all = '所有';
+$lang->viewDetails = '查看详情';
$lang->actions = '操作';
$lang->restore = '恢复默认';
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index ac6c5c578b..408c960adb 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -399,6 +399,7 @@ $lang->resource->stage->batchCreate = 'batchCreate';
$lang->resource->stage->edit = 'edit';
$lang->resource->stage->setType = 'setType';
$lang->resource->stage->delete = 'delete';
+$lang->resource->stage->plusBrowse = 'plusBrowse';
$lang->stage->methodOrder[5] = 'browse';
$lang->stage->methodOrder[10] = 'create';
@@ -406,6 +407,7 @@ $lang->stage->methodOrder[15] = 'batchCreate';
$lang->stage->methodOrder[20] = 'edit';
$lang->stage->methodOrder[25] = 'setType';
$lang->stage->methodOrder[30] = 'delete';
+$lang->stage->methodOrder[35] = 'plusBrowse';
/* Program. */
$lang->resource->program = new stdclass();
diff --git a/module/programplan/control.php b/module/programplan/control.php
index 7a7783561f..ccf3baa0a5 100644
--- a/module/programplan/control.php
+++ b/module/programplan/control.php
@@ -211,7 +211,7 @@ class programplan extends control
$this->view->productList = $productList;
$this->view->project = $project;
$this->view->productID = $productID ? $productID : key($productList);
- $this->view->stages = empty($planID) ? $this->loadModel('stage')->getStages('id_asc') : array();
+ $this->view->stages = empty($planID) ? $this->loadModel('stage')->getStages('id_asc', 0, $project->model) : array();
$this->view->programPlan = $programPlan;
$this->view->plans = empty($executions) ? $plans : $executions;
$this->view->planID = $planID;
diff --git a/module/stage/control.php b/module/stage/control.php
index 1012136791..fe00fe1b34 100644
--- a/module/stage/control.php
+++ b/module/stage/control.php
@@ -15,13 +15,19 @@ class stage extends control
* Browse stages.
*
* @param string $orderBy
+ * @param string $type
* @access public
* @return void
*/
- public function browse($orderBy = "id_asc")
+ public function browse($orderBy = "id_asc", $type = 'waterfall')
{
- $this->view->stages = $this->stage->getStages($orderBy);
+ if($type == 'waterfallplus') $this->locate($this->createLink('stage', 'plusBrowse', "orderBy=$orderBy&type=waterfallplus"));
+
+ $this->stage->setMenu($type);
+
+ $this->view->stages = $this->stage->getStages($orderBy, 0, $type);
$this->view->orderBy = $orderBy;
+ $this->view->type = $type;
$this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse;
$this->view->position[] = $this->lang->stage->common;
$this->view->position[] = $this->lang->stage->browse;
@@ -30,16 +36,41 @@ class stage extends control
}
/**
- * Create a stage.
+ * Browse stages.
*
+ * @param string $orderBy
* @access public
* @return void
*/
- public function create()
+ public function plusBrowse($orderBy = "id_asc", $type = 'waterfallplus')
{
+ if($type == 'waterfall') $this->locate($this->createLink('stage', 'browse', "orderBy=$orderBy&type=waterfall"));
+
+ $this->stage->setMenu($type);
+
+ $this->view->stages = $this->stage->getStages($orderBy, 0, $type);
+ $this->view->orderBy = $orderBy;
+ $this->view->type = $type;
+ $this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse;
+ $this->view->position[] = $this->lang->stage->common;
+ $this->view->position[] = $this->lang->stage->browse;
+
+ $this->display('stage', 'browse');
+ }
+
+ /**
+ * Create a stage.
+ *
+ * @param string $type
+ * @access public
+ * @return void
+ */
+ public function create($type = 'waterfall')
+ {
+ $this->stage->setMenu($type);
if($_POST)
{
- $stageID = $this->stage->create();
+ $stageID = $this->stage->create($type);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$response['result'] = 'success';
@@ -52,7 +83,7 @@ class stage extends control
}
$this->loadModel('action')->create('stage', $stageID, 'Opened');
- $response['locate'] = inlink('browse');
+ $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type");
return $this->send($response);
}
@@ -66,14 +97,16 @@ class stage extends control
/**
* Batch create stages.
*
+ * @param string $type
* @access public
* @return void
*/
- public function batchCreate()
+ public function batchCreate($type = 'waterfall')
{
+ $this->stage->setMenu($type);
if($_POST)
{
- $this->stage->batchCreate();
+ $this->stage->batchCreate($type);
$response['result'] = 'success';
$response['message'] = $this->lang->saveSuccess;
@@ -84,7 +117,7 @@ class stage extends control
return $this->send($response);
}
- $response['locate'] = inlink('browse');
+ $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type");
return $this->send($response);
}
@@ -105,6 +138,7 @@ class stage extends control
public function edit($stageID = 0)
{
$stage = $this->stage->getByID($stageID);
+ $this->stage->setMenu($stage->projectType);
if($_POST)
{
$changes = $this->stage->update($stageID);
@@ -120,7 +154,7 @@ class stage extends control
$actionID = $this->loadModel('action')->create('stage', $stageID, 'Edited');
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
- $response['locate'] = inlink('browse');
+ $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$stage->projectType");
return $this->send($response);
}
diff --git a/module/stage/lang/de.php b/module/stage/lang/de.php
index e2f736148b..7af6a877ca 100644
--- a/module/stage/lang/de.php
+++ b/module/stage/lang/de.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = 'Stage List';
+$lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete';
$lang->stage->view = 'Details';
+$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */
$lang->stage->id = 'ID';
diff --git a/module/stage/lang/en.php b/module/stage/lang/en.php
index e2f736148b..7af6a877ca 100644
--- a/module/stage/lang/en.php
+++ b/module/stage/lang/en.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = 'Stage List';
+$lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete';
$lang->stage->view = 'Details';
+$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */
$lang->stage->id = 'ID';
diff --git a/module/stage/lang/fr.php b/module/stage/lang/fr.php
index e2f736148b..7af6a877ca 100644
--- a/module/stage/lang/fr.php
+++ b/module/stage/lang/fr.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = 'Stage List';
+$lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete';
$lang->stage->view = 'Details';
+$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */
$lang->stage->id = 'ID';
diff --git a/module/stage/lang/zh-cn.php b/module/stage/lang/zh-cn.php
index 8016239070..74db4344db 100644
--- a/module/stage/lang/zh-cn.php
+++ b/module/stage/lang/zh-cn.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = '阶段列表';
+$lang->stage->browse = '瀑布阶段列表';
$lang->stage->create = '新建';
$lang->stage->batchCreate = '批量新建';
$lang->stage->edit = '编辑';
$lang->stage->delete = '删除';
$lang->stage->view = '阶段详情';
+$lang->stage->plusBrowse = '融合瀑布阶段列表';
/* Fields. */
$lang->stage->id = '编号';
diff --git a/module/stage/model.php b/module/stage/model.php
index b4e616d0fe..e5ad79e754 100644
--- a/module/stage/model.php
+++ b/module/stage/model.php
@@ -19,14 +19,15 @@ class stageModel extends model
* @access public
* @return int|bool
*/
- public function create()
+ public function create($type = 'waterfall')
{
$stage = fixer::input('post')
+ ->setDefault('projectType', $type)
->add('createdBy', $this->app->user->account)
->add('createdDate', helper::today())
->get();
- $totalPercent = $this->getTotalPercent();
+ $totalPercent = $this->getTotalPercent($type);
if(!is_numeric($stage->percent)) return dao::$errors['message'][] = $this->lang->stage->error->notNum;
if(round($totalPercent + $stage->percent) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver;
@@ -48,11 +49,11 @@ class stageModel extends model
* @access public
* @return bool
*/
- public function batchCreate()
+ public function batchCreate($type = 'waterfall')
{
$data = fixer::input('post')->get();
- $totalPercent = $this->getTotalPercent();
+ $totalPercent = $this->getTotalPercent($type);
if(round($totalPercent + array_sum($data->percent)) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver;
@@ -65,6 +66,7 @@ class stageModel extends model
$stage->name = $name;
$stage->percent = $data->percent[$i];
$stage->type = $data->type[$i];
+ $stage->projectType = $type;
$stage->createdBy = $this->app->user->account;
$stage->createdDate = helper::today();
@@ -98,7 +100,7 @@ class stageModel extends model
->add('editedDate', helper::today())
->get();
- $totalPercent = $this->getTotalPercent();
+ $totalPercent = $this->getTotalPercent($oldStage->projectType);
if(round($totalPercent + $stage->percent - $oldStage->percent) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver;
@@ -118,10 +120,11 @@ class stageModel extends model
*
* @param string $orderBy
* @param int $projectID
+ * @param string $type
* @access public
* @return array
*/
- public function getStages($orderBy = 'id_desc', $projectID = 0)
+ public function getStages($orderBy = 'id_desc', $projectID = 0, $type = '')
{
if($projectID)
{
@@ -137,7 +140,7 @@ class stageModel extends model
}
else
{
- return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->orderBy($orderBy)->fetchAll('id');
+ return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->andWhere('projectType')->eq($type)->orderBy($orderBy)->fetchAll('id');
}
}
@@ -175,10 +178,35 @@ class stageModel extends model
/**
* Get stage total percent
*
- * return string
+ * @param string $type
+ * @return string
*/
- public function getTotalPercent()
+ public function getTotalPercent($type)
{
- return $this->dao->select('sum(percent) as total')->from(TABLE_STAGE)->where('deleted')->eq('0')->fetch('total');
+ return $this->dao->select('sum(percent) as total')->from(TABLE_STAGE)->where('deleted')->eq('0')->andWhere('projectType')->eq($type)->fetch('total');
+ }
+
+ /**
+ * Set menu.
+ *
+ * @param string $type
+ * @access public
+ * @return void
+ */
+ public function setMenu($type)
+ {
+ $this->app->loadLang('admin');
+ $moduleName = $this->app->rawModule;
+ $methodName = $this->app->rawMethod;
+ if(!isset($this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'])) $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] = '';
+ if(!isset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'])) $this->lang->admin->menuList->model['subMenu']['agileplus']['exclude'] = '';
+ if($type == 'waterfall')
+ {
+ $this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'] .= ",{$moduleName}-{$methodName}";
+ }
+ if($type == 'waterfallplus')
+ {
+ $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] .= ",{$moduleName}-{$methodName}";
+ }
}
}
diff --git a/module/stage/view/browse.html.php b/module/stage/view/browse.html.php
index 266234a805..2a5aeb0da2 100644
--- a/module/stage/view/browse.html.php
+++ b/module/stage/view/browse.html.php
@@ -17,7 +17,7 @@
stage->noStage;?>
- createLink('stage', 'create'), " " . $lang->stage->create, '', "class='btn btn-info'");?>
+ createLink('stage', 'create', "type={$type}"), " " . $lang->stage->create, '', "class='btn btn-info'");?>
@@ -26,8 +26,7 @@
- stage->setType);?>
- stage->browse, '', "class='selected'");?>
+ stage->browse, '', "class='selected'");?>
@@ -38,19 +37,19 @@
stage->browse;?>
- " . $lang->stage->batchCreate, '', "class='btn btn-primary'");?>
- " . $lang->stage->create, '', "class='btn btn-primary'");?>
+ " . $lang->stage->batchCreate, '', "class='btn btn-primary'");?>
+ " . $lang->stage->create, '', "class='btn btn-primary'");?>
-
+
| stage->id);?> |
stage->name);?> |
stage->percent);?> |
stage->type);?> |
- actions;?> |
+ actions;?> |
@@ -63,7 +62,7 @@
id", "", "list");
- common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", '', 'hiddenwin');
+ common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", 'trash', 'hiddenwin');
?>
|
diff --git a/module/stage/view/settype.html.php b/module/stage/view/settype.html.php
index 4dd7d72696..0546bd890f 100644
--- a/module/stage/view/settype.html.php
+++ b/module/stage/view/settype.html.php
@@ -34,7 +34,6 @@ EOT;
stage->setType, '', "class='selected'");?>
- stage->browse);?>