diff --git a/module/programplan/model.php b/module/programplan/model.php index 867dce7c7e..11524ebcf9 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -1471,31 +1471,33 @@ class programplanModel extends model * @access public * @return void */ - public function computeProgress($stageID, $action = '', $isParent = false) + public function computeProgress(int $stageID, string $action = '', bool $isParent = false) { - $stage = $this->loadModel('execution')->getByID($stageID); - $project = $this->loadModel('project')->getByID($stage->project); - if(empty($stage) or empty($stage->path) or ($project->model != 'waterfall' and $project->model != 'waterfallplus')) return false; - $this->loadModel('execution'); + $this->loadModel('project'); $this->loadModel('action'); + + $stage = $this->execution->getByID($stageID); + $project = $this->project->getByID($stage->project); + if(empty($stage) || empty($stage->path) || ($project->model != 'waterfall' && $project->model != 'waterfallplus')) return false; + $action = strtolower($action); $parentIdList = explode(',', trim($stage->path, ',')); $parentIdList = array_reverse($parentIdList); foreach($parentIdList as $id) { $parent = $this->execution->getByID($id); - if(empty($this->lang->execution->typeList[$parent->type]) or (!$isParent and $id == $stageID)) continue; + if(empty($this->lang->execution->typeList[$parent->type]) || (!$isParent && $id == $stageID)) continue; $statusCount = array(); $children = $this->execution->getChildExecutions($parent->id); $allChildren = $this->dao->select('id')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('path')->like("{$parent->path}%")->andWhere('id')->ne($id)->fetchPairs(); $startTasks = $this->dao->select('count(1) as count')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('execution')->in($allChildren)->andWhere('consumed')->ne(0)->fetch('count'); - foreach($children as $childID => $childExecution) $statusCount[$childExecution->status] = empty($statusCount[$childExecution->status]) ? 1 : $statusCount[$childExecution->status] ++; + foreach($children as $childExecution) $statusCount[$childExecution->status] = empty($statusCount[$childExecution->status]) ? 1 : $statusCount[$childExecution->status] ++; if(empty($statusCount)) continue; - - if(isset($statusCount['wait']) and count($statusCount) == 1 and helper::isZeroDate($parent->realBegan) and $startTasks == 0) + $count = count($statusCount); + if(isset($statusCount['wait']) && $count == 1 && helper::isZeroDate($parent->realBegan) && $startTasks == 0) { if($parent->status != 'wait') { @@ -1503,7 +1505,7 @@ class programplanModel extends model $parentAction = 'waitbychild'; } } - elseif(isset($statusCount['closed']) and count($statusCount) == 1) + elseif(isset($statusCount['closed']) && $count == 1) { if($parent->status != 'closed') { @@ -1511,7 +1513,7 @@ class programplanModel extends model $parentAction = 'closedbychild'; } } - elseif(isset($statusCount['suspended']) and (count($statusCount) == 1 or (isset($statusCount['closed']) and count($statusCount) == 2))) + elseif(isset($statusCount['suspended']) && ($count == 1 || (isset($statusCount['closed']) && $count == 2))) { if($parent->status != 'suspended') { diff --git a/module/programplan/test/model/checkleafstage.php b/module/programplan/test/model/checkleafstage.php index 95cbd14024..f766303bcb 100755 --- a/module/programplan/test/model/checkleafstage.php +++ b/module/programplan/test/model/checkleafstage.php @@ -1,23 +1,16 @@ #!/usr/bin/env php gen(5); + +function initData() +{ + zdTable('user')->gen(5); + zdTable('project')->config('checkleafstage')->gen(5); +} + su('admin'); -$execution = zdTable('project'); -$execution->id->range('1-5'); -$execution->name->range('瀑布项目1,阶段a,阶段a子1,阶段a子1子1,阶段b'); -$execution->type->range('project,stage{4}'); -$execution->project->range('0,1{4}'); -$execution->parent->range('0,1,2,3,1'); -$execution->path->range("`,1,`,`,1,2,`,`,1,2,3,`,`,1,2,3,4,`,`,1,5,`"); -$execution->status->range('doing,doing,doing,closed,suspended'); -$execution->openedBy->range('admin,user1'); -$execution->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD'); -$execution->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD'); -$execution->realBegan->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD'); -$execution->gen(5); /** @@ -25,8 +18,9 @@ title=测试programplanModel->checkLeafStage(); cid=1 pid=1 -测试id为2判断是否为叶子节点 >> 0 -测试id为5判断是否为叶子节点 >> 1 +- 测试id为2判断是否为叶子节点 @0 + +- 测试id为5判断是否为叶子节点 @1 */ diff --git a/module/programplan/test/model/yaml/checkleafstage/checkleafstage.yaml b/module/programplan/test/model/yaml/checkleafstage/checkleafstage.yaml new file mode 100644 index 0000000000..52225e216a --- /dev/null +++ b/module/programplan/test/model/yaml/checkleafstage/checkleafstage.yaml @@ -0,0 +1,33 @@ +title: programplanModel::checkLeafStage UTC. +desc: programplanModel::checkLeafStage UTC. +author: xushenjie +version: '1.0' +fields: + - field: name + range: '瀑布项目1,阶段a,阶段a子1,阶段a子1子1,阶段b' + - field: type + range: '0,1{4}' + - field: project + range: '0,1{4}' + - field: parent + range: '0,1,2,3,1' + - field: grade + range: 1 + - field: path + range: "`,1,`,`,1,2,`,`,1,2,3,`,`,1,2,3,4,`,`,1,5,`" + - field: status + range: 'doing,doing,doing,closed,suspended' + - field: openedBy + range: 'admin,user1' + - field: begin + range: '20230501 000000:0' + type: 'timestamp' + format: 'YY/MM/DD' + - field: end + range: '20300501 000000:0' + type: 'timestamp' + format: 'YY/MM/DD' + - field: realBegan + range: '20230501 000000:0' + type: 'timestamp' + format: 'YY/MM/DD'