From 24d7f5d5354850a4177572e5e84acdf6e55b6721 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 17 Oct 2025 08:36:33 +0000 Subject: [PATCH 1/3] * [task#150912] Show stage list in open. --- db/zentao.sql | 6 +++ module/admin/model.php | 1 + module/stage/control.php | 63 +++++++++++++++------------- module/stage/ui/batchcreate.html.php | 4 +- module/stage/ui/browse.html.php | 36 ++++++++++++++++ module/stage/ui/create.html.php | 4 +- module/stage/ui/edit.html.php | 4 +- module/stage/ui/settype.html.php | 13 ++++++ 8 files changed, 95 insertions(+), 36 deletions(-) diff --git a/db/zentao.sql b/db/zentao.sql index 650385b4ac..c4ff383668 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -3209,6 +3209,12 @@ INSERT INTO `zt_storygrade` (`type`, `grade`, `name`, `status`) VALUES ('story', 2, '子', 'enable'); REPLACE INTO `zt_stage` (`workflowGroup`, `name`, `percent`, `type`, `createdBy`, `createdDate`, `editedBy`, `editedDate`, `deleted`) VALUES +('0', '需求', '10', 'request', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), +('0', '设计', '10', 'design', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), +('0', '开发', '50', 'dev', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), +('0', '测试', '15', 'qa', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), +('0', '发布', '10', 'release', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), +('0', '总结评审', '5', 'review', 'admin', '2020-02-08 21:08:45', 'admin', '2020-02-12 13:50:27', '0'), ('4', '需求', '10', 'request', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), ('4', '设计', '10', 'design', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), ('4', '开发', '50', 'dev', 'admin', '2020-02-08 21:08:30', 'admin', '2020-02-12 13:50:27', '0'), diff --git a/module/admin/model.php b/module/admin/model.php index e4f773ee9c..5784cb7558 100755 --- a/module/admin/model.php +++ b/module/admin/model.php @@ -393,6 +393,7 @@ class adminModel extends model $moduleName = $this->app->rawModule; $methodName = $this->app->rawMethod; $firstParam = $this->app->rawParams ? reset($this->app->rawParams) : ''; + if($this->config->edition == 'open') $this->config->admin->menuGroup['feature'][] = 'stage|browse'; foreach($this->config->admin->menuGroup as $menuKey => $menuGroup) { diff --git a/module/stage/control.php b/module/stage/control.php index d2f387901d..04e94aad46 100644 --- a/module/stage/control.php +++ b/module/stage/control.php @@ -23,37 +23,40 @@ class stage extends control */ public function browse(int $groupID = 0, string $orderBy = "order_asc") { - $workflowGroup = $this->loadModel('workflowgroup')->getByID($groupID); - if($workflowGroup->projectModel == 'ipd') + if($this->config->edition != 'open') { - $this->config->stage->dtable->fieldList['type']['statusMap'] = $this->lang->stage->ipdTypeList; - - $this->config->stage->dtable->fieldList['TRpoint']['title'] = $this->lang->stage->TRpoint; - $this->config->stage->dtable->fieldList['TRpoint']['type'] = 'desc'; - $this->config->stage->dtable->fieldList['TRpoint']['width'] = 100; - $this->config->stage->dtable->fieldList['TRpoint']['flex'] = false; - $this->config->stage->dtable->fieldList['TRpoint']['group'] = 3; - - $this->config->stage->dtable->fieldList['DCPpoint']['title'] = $this->lang->stage->DCPpoint; - $this->config->stage->dtable->fieldList['DCPpoint']['type'] = 'desc'; - $this->config->stage->dtable->fieldList['DCPpoint']['width'] = 100; - $this->config->stage->dtable->fieldList['DCPpoint']['flex'] = false; - $this->config->stage->dtable->fieldList['DCPpoint']['group'] = 4; - - if(common::hasPriv('stage', 'edit')) + $workflowGroup = $this->loadModel('workflowgroup')->getByID($groupID); + if($workflowGroup->projectModel == 'ipd') { - $this->config->stage->actionList['setTRpoint']['icon'] = 'seal'; - $this->config->stage->actionList['setTRpoint']['hint'] = $this->lang->stage->setTRpoint; - $this->config->stage->actionList['setTRpoint']['url'] = array('module' => 'stage', 'method' => 'setPoint', 'params' => 'type=TR&stageID={id}'); - $this->config->stage->actionList['setTRpoint']['data-toggle'] = 'modal'; + $this->config->stage->dtable->fieldList['type']['statusMap'] = $this->lang->stage->ipdTypeList; - $this->config->stage->actionList['setDCPpoint']['icon'] = 'seal'; - $this->config->stage->actionList['setDCPpoint']['hint'] = $this->lang->stage->setDCPpoint; - $this->config->stage->actionList['setDCPpoint']['url'] = array('module' => 'stage', 'method' => 'setPoint', 'params' => 'type=DCP&stageID={id}'); - $this->config->stage->actionList['setDCPpoint']['data-toggle'] = 'modal'; + $this->config->stage->dtable->fieldList['TRpoint']['title'] = $this->lang->stage->TRpoint; + $this->config->stage->dtable->fieldList['TRpoint']['type'] = 'desc'; + $this->config->stage->dtable->fieldList['TRpoint']['width'] = 100; + $this->config->stage->dtable->fieldList['TRpoint']['flex'] = false; + $this->config->stage->dtable->fieldList['TRpoint']['group'] = 3; - $this->config->stage->dtable->fieldList['actions']['menu'] = array('setTRpoint', 'setDCPpoint', 'edit', 'delete'); - $this->config->stage->dtable->fieldList['actions']['list'] = $this->config->stage->actionList; + $this->config->stage->dtable->fieldList['DCPpoint']['title'] = $this->lang->stage->DCPpoint; + $this->config->stage->dtable->fieldList['DCPpoint']['type'] = 'desc'; + $this->config->stage->dtable->fieldList['DCPpoint']['width'] = 100; + $this->config->stage->dtable->fieldList['DCPpoint']['flex'] = false; + $this->config->stage->dtable->fieldList['DCPpoint']['group'] = 4; + + if(common::hasPriv('stage', 'edit')) + { + $this->config->stage->actionList['setTRpoint']['icon'] = 'seal'; + $this->config->stage->actionList['setTRpoint']['hint'] = $this->lang->stage->setTRpoint; + $this->config->stage->actionList['setTRpoint']['url'] = array('module' => 'stage', 'method' => 'setPoint', 'params' => 'type=TR&stageID={id}'); + $this->config->stage->actionList['setTRpoint']['data-toggle'] = 'modal'; + + $this->config->stage->actionList['setDCPpoint']['icon'] = 'seal'; + $this->config->stage->actionList['setDCPpoint']['hint'] = $this->lang->stage->setDCPpoint; + $this->config->stage->actionList['setDCPpoint']['url'] = array('module' => 'stage', 'method' => 'setPoint', 'params' => 'type=DCP&stageID={id}'); + $this->config->stage->actionList['setDCPpoint']['data-toggle'] = 'modal'; + + $this->config->stage->dtable->fieldList['actions']['menu'] = array('setTRpoint', 'setDCPpoint', 'edit', 'delete'); + $this->config->stage->dtable->fieldList['actions']['list'] = $this->config->stage->actionList; + } } } @@ -87,7 +90,7 @@ class stage extends control $this->view->title = $this->lang->stage->common . $this->lang->hyphen . $this->lang->stage->create; $this->view->groupID = $groupID; - $this->view->flow = $this->loadModel('workflowgroup')->getByID($groupID); + $this->view->flow = $this->config->edition == 'open' ? new stdClass() : $this->loadModel('workflowgroup')->getByID($groupID); $this->display(); } @@ -113,7 +116,7 @@ class stage extends control $this->view->title = $this->lang->stage->common . $this->lang->hyphen . $this->lang->stage->batchCreate; $this->view->groupID = $groupID; - $this->view->flow = $this->loadModel('workflowgroup')->getByID($groupID); + $this->view->flow = $this->config->edition == 'open' ? new stdClass() : $this->loadModel('workflowgroup')->getByID($groupID); $this->display(); } @@ -143,7 +146,7 @@ class stage extends control $this->view->title = $this->lang->stage->common . $this->lang->hyphen . $this->lang->stage->edit; $this->view->stage = $stage; - $this->view->flow = $this->loadModel('workflowgroup')->getByID($stage->workflowGroup); + $this->view->flow = $this->config->edition == 'open' ? new stdClass() : $this->loadModel('workflowgroup')->getByID($stage->workflowGroup); $this->display(); } diff --git a/module/stage/ui/batchcreate.html.php b/module/stage/ui/batchcreate.html.php index c6715a73c6..0435e089be 100644 --- a/module/stage/ui/batchcreate.html.php +++ b/module/stage/ui/batchcreate.html.php @@ -11,7 +11,7 @@ declare(strict_types=1); namespace zin; $percentItem = ''; -if(isset($config->setPercent) && $config->setPercent == 1 && $flow->projectModel != 'ipd') +if(isset($config->setPercent) && $config->setPercent == 1 && isset($flow->projectModel) && $flow->projectModel != 'ipd') { $percentItem = formBatchItem( set::name('percent'), @@ -40,7 +40,7 @@ formBatchPanel set::label($lang->stage->type), set::width('150px'), set::control('select'), - set::items($flow->projectModel == 'ipd' ? $lang->stage->ipdTypeList : $lang->stage->typeList) + set::items(isset($flow->projectModel) && $flow->projectModel == 'ipd' ? $lang->stage->ipdTypeList : $lang->stage->typeList) ) ); /* ====== Render page ====== */ diff --git a/module/stage/ui/browse.html.php b/module/stage/ui/browse.html.php index bf9c79d2e7..97a3e61f59 100644 --- a/module/stage/ui/browse.html.php +++ b/module/stage/ui/browse.html.php @@ -22,6 +22,42 @@ toolbar !empty($createItem) ? item(set($createItem)) : null ); +if($this->config->edition == 'open') +{ + if(hasPriv('stage', 'settype')) + { + $menuItems[] = li + ( + setClass('menu-item'), + a + ( + set::href(createLink('stage', 'settype')), + $lang->stage->setType + ) + ); + } + + $menuItems[] = li + ( + setClass('menu-item'), + a + ( + setClass('active'), + set::href(createLink('stage', 'browse')), + $lang->stage->browse + ) + ); + + sidebar + ( + div + ( + setClass('cell p-2.5 bg-white'), + menu($menuItems) + ) + ); +} + $tableData = initTableData($stages, $config->stage->dtable->fieldList, $this->stage); dtable ( diff --git a/module/stage/ui/create.html.php b/module/stage/ui/create.html.php index d4244d0c63..fbce05c8b0 100644 --- a/module/stage/ui/create.html.php +++ b/module/stage/ui/create.html.php @@ -10,7 +10,7 @@ declare(strict_types=1); */ namespace zin; $percentRow = ''; -if(isset($config->setPercent) && $config->setPercent == 1 && $flow->projectModel != 'ipd') +if(isset($config->setPercent) && $config->setPercent == 1 && isset($flow->projectModel) && $flow->projectModel != 'ipd') { $percentRow = formRow( formGroup @@ -53,7 +53,7 @@ formPanel set::width('1/2'), set::label($lang->stage->type), set::name('type'), - set::items($flow->projectModel == 'ipd' ? $lang->stage->ipdTypeList : $lang->stage->typeList) + set::items(isset($flow->projectModel) && $flow->projectModel == 'ipd' ? $lang->stage->ipdTypeList : $lang->stage->typeList) ) ) ); diff --git a/module/stage/ui/edit.html.php b/module/stage/ui/edit.html.php index dabc48bec0..b434deed4f 100644 --- a/module/stage/ui/edit.html.php +++ b/module/stage/ui/edit.html.php @@ -10,7 +10,7 @@ declare(strict_types=1); */ namespace zin; $percentRow = ''; -if(isset($config->setPercent) && $config->setPercent == 1 && $flow->projectModel != 'ipd') +if(isset($config->setPercent) && $config->setPercent == 1 && isset($flow->projectModel) && $flow->projectModel != 'ipd') { $percentRow = formRow( formGroup @@ -59,7 +59,7 @@ formPanel set::label($lang->stage->type), set::name('type'), set::value($stage->type), - set::items($flow->projectModel == 'ipd' ? $lang->stage->ipdTypeList : $lang->stage->typeList) + set::items(isset($flow->projectModel) && $flow->projectModel == 'ipd' ? $lang->stage->ipdTypeList : $lang->stage->typeList) ) ) ); diff --git a/module/stage/ui/settype.html.php b/module/stage/ui/settype.html.php index 51a5e16f8f..18aa29696a 100644 --- a/module/stage/ui/settype.html.php +++ b/module/stage/ui/settype.html.php @@ -129,6 +129,19 @@ $menuItems[] = li ) ); +if($config->edition == 'open' && hasPriv('stage', 'browse')) +{ + $menuItems[] = li + ( + setClass('menu-item'), + a + ( + set::href(createLink('stage', 'browse')), + $lang->stage->browse + ) + ); +} + div ( setClass('row has-sidebar-left'), From 4fc1e2a0c35e7a1e2d44c9003e173701d70d55a0 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 17 Oct 2025 08:59:11 +0000 Subject: [PATCH 2/3] * [task#150912] Modify the style of stage list. --- module/stage/ui/browse.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/stage/ui/browse.html.php b/module/stage/ui/browse.html.php index 97a3e61f59..fefd1e8b11 100644 --- a/module/stage/ui/browse.html.php +++ b/module/stage/ui/browse.html.php @@ -15,7 +15,7 @@ featureBar(); $canCreateStage = hasPriv('stage', 'create'); $canbatchCreateStage = hasPriv('stage', 'batchCreate'); if($canCreateStage) $createItem = array('icon' => 'plus', 'class' => 'primary', 'text' => $lang->stage->create, 'url' => $this->createLink('stage', 'create', "groupID={$groupID}"), 'data-toggle' => 'modal'); -if($canbatchCreateStage) $batchCreateItem = array('icon' => 'plus', 'class' => 'primary mr-4', 'text' => $lang->stage->batchCreate, 'url' => $this->createLink('stage', 'batchCreate', "groupID={$groupID}")); +if($canbatchCreateStage) $batchCreateItem = array('icon' => 'plus', 'class' => 'primary', 'text' => $lang->stage->batchCreate, 'url' => $this->createLink('stage', 'batchCreate', "groupID={$groupID}")); toolbar ( !empty($batchCreateItem) ? item(set($batchCreateItem)) : null, From 0cbfd024a2f018a8828eec5118fb80772bb3ad9f Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 20 Oct 2025 06:01:13 +0000 Subject: [PATCH 3/3] * [task#150912] Upgrade the stage in open. --- module/upgrade/model.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 8f77577a49..0759341e47 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -12490,6 +12490,30 @@ class upgradeModel extends model $stageGroup = $this->dao->select('*')->from(TABLE_STAGE)->where('workflowGroup')->eq(0)->fetchGroup('projectType', 'id'); if(empty($stageGroup)) return true; + if($this->config->edition == 'open') + { + $typeNamePairs = array(); + $needDeleteStage = array(); + foreach($stageGroup as $projectModel => $stageList) + { + if($projectModel == 'ipd') continue; + foreach($stageList as $stageInfo) + { + if(isset($typeNamePairs[$stageInfo->type]) && in_array($stageInfo->name, $typeNamePairs[$stageInfo->type])) + { + $needDeleteStage[$stageInfo->id] = $stageInfo->id; + continue; + } + if(!isset($typeNamePairs[$stageInfo->type])) $typeNamePairs[$stageInfo->type] = array(); + $typeNamePairs[$stageInfo->type][] = $stageInfo->name; + } + } + + if(!empty($needDeleteStage)) $this->dao->delete()->from(TABLE_STAGE)->where('id')->in($needDeleteStage)->exec(); + $this->dao->delete()->from(TABLE_STAGE)->where('projectType')->eq('ipd')->exec(); + return true; + } + $this->app->loadConfig('project'); $this->app->loadConfig('review'); $typeCodeGroup = $this->dao->select('projectModel, code, id')->from(TABLE_WORKFLOWGROUP)->where('main')->eq('1')->andWhere('projectModel')->in('waterfall,waterfallplus,ipd')->fetchGroup('projectModel', 'code'); @@ -12497,6 +12521,8 @@ class upgradeModel extends model { foreach(array_keys($flowList) as $flowCode) { + if(!isset($stageGroup[$projectModel])) continue; + foreach($stageGroup[$projectModel] as $stage) { if($flowCode == 'tpdproduct' && !in_array($stage->type, $this->config->project->categoryStages['TPD'])) continue;