diff --git a/module/programplan/model.php b/module/programplan/model.php index c82f53a416..8c1d22bfb6 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -958,4 +958,25 @@ class programplanModel extends model } return $tasks; } + + /** + * 根据阶段的开始和结束,计算工作日。 + * Calc stage days by stage begin and end. + * + * @param string $start + * @param string $end + * @access public + * @return int + */ + public function calcDaysForStage(string $start, string $end): int + { + $weekend = $this->config->execution->weekend; + $days = range(strtotime($start), strtotime($end), 86400); + foreach($days as $key => $day) + { + $weekDay = date('N', $day); + if(($weekend == 2 && $weekDay == 6) || $weekDay == 7) unset($days[$key]); + } + return count($days); + } } diff --git a/module/programplan/test/model/calcdaysforstage.php b/module/programplan/test/model/calcdaysforstage.php new file mode 100755 index 0000000000..f8aa570e73 --- /dev/null +++ b/module/programplan/test/model/calcdaysforstage.php @@ -0,0 +1,44 @@ +#!/usr/bin/env php +calcDaysForStage(); +timeout=0 +cid=0 + +- 测试计算2025-01-01到2025-01-01期间的工作日。 @1 +- 测试计算2025-01-01到2025-01-05期间的工作日。 @4 +- 测试计算2025-01-01到2025-01-10期间的工作日。 @9 +- 测试计算2025-01-01到3025-01-01期间的工作日。 @313066 +- 测试计算非正常日期字符串的工作日。 @1 +- 测试计算非正常日期字符串的工作日。 @1 +- 测试计算2025-01-01到2025-01-01期间的工作日。 @1 +- 测试计算2025-01-01到2025-01-05期间的工作日。 @3 +- 测试计算2025-01-01到2025-01-10期间的工作日。 @8 +- 测试计算2025-01-01到3025-01-01期间的工作日。 @260888 +- 测试计算非正常日期字符串的工作日。 @1 +- 测试计算非正常日期字符串的工作日。 @1 + +*/ + +global $tester, $config; +$tester->loadModel('programplan'); + +$config->execution->weekend = 1; +r($tester->programplan->calcDaysForStage('2025-01-01', '2025-01-01')) && p() && e('1'); // 测试计算2025-01-01到2025-01-01期间的工作日。 +r($tester->programplan->calcDaysForStage('2025-01-01', '2025-01-05')) && p() && e('4'); // 测试计算2025-01-01到2025-01-05期间的工作日。 +r($tester->programplan->calcDaysForStage('2025-01-01', '2025-01-10')) && p() && e('9'); // 测试计算2025-01-01到2025-01-10期间的工作日。 +r($tester->programplan->calcDaysForStage('2025-01-01', '3025-01-01')) && p() && e('313066'); // 测试计算2025-01-01到3025-01-01期间的工作日。 +r($tester->programplan->calcDaysForStage('asd', 'dsa')) && p() && e('1'); // 测试计算非正常日期字符串的工作日。 +r($tester->programplan->calcDaysForStage('0', '1')) && p() && e('1'); // 测试计算非正常日期字符串的工作日。 + +$config->execution->weekend = 2; +r($tester->programplan->calcDaysForStage('2025-01-01', '2025-01-01')) && p() && e('1'); // 测试计算2025-01-01到2025-01-01期间的工作日。 +r($tester->programplan->calcDaysForStage('2025-01-01', '2025-01-05')) && p() && e('3'); // 测试计算2025-01-01到2025-01-05期间的工作日。 +r($tester->programplan->calcDaysForStage('2025-01-01', '2025-01-10')) && p() && e('8'); // 测试计算2025-01-01到2025-01-10期间的工作日。 +r($tester->programplan->calcDaysForStage('2025-01-01', '3025-01-01')) && p() && e('260888'); // 测试计算2025-01-01到3025-01-01期间的工作日。 +r($tester->programplan->calcDaysForStage('asd', 'dsa')) && p() && e('1'); // 测试计算非正常日期字符串的工作日。 +r($tester->programplan->calcDaysForStage('0', '1')) && p() && e('1'); // 测试计算非正常日期字符串的工作日。 diff --git a/module/programplan/zen.php b/module/programplan/zen.php index b14ba0d9af..d4572c0bb6 100644 --- a/module/programplan/zen.php +++ b/module/programplan/zen.php @@ -81,7 +81,7 @@ class programplanZen extends programplan foreach($plans as $rowID => $plan) { if(empty($parentID) and empty($oldPlans)) $plan->id = ''; - $plan->days = isset($plan->enabled) && $plan->enabled == 'on' ? $this->calcDaysForStage($plan->begin, $plan->end) : 0; + $plan->days = isset($plan->enabled) && $plan->enabled == 'on' ? $this->programplan->calcDaysForStage($plan->begin, $plan->end) : 0; $plan->project = $projectID; $plan->order = (int)array_shift($orders); $plan->hasProduct = $project->hasProduct; @@ -158,36 +158,6 @@ class programplanZen extends programplan return $plans; } - /** - * 根据阶段的开始和结束,计算工作日。 - * Calc stage days by stage begin and end. - * - * @param string $start - * @param string $end - * @access public - * @return int - */ - public function calcDaysForStage($start, $end) - { - $weekend = $this->config->execution->weekend; - - $start = new DateTime($start); - $end = new DateTime($end); - $end->modify('+1 day'); // 包含结束日期 - - $interval = new DateInterval('P1D'); // 每次递增一天 - $dateRange = new DatePeriod($start, $interval, $end); - - $days = 0; - foreach($dateRange as $date) - { - if(($weekend == 2 && $date->format('N') == 6) || $date->format('N') == 7) continue; - $days++; - } - - return $days; - } - /** * 生成创建项目阶段视图数据。 * Build create view data. diff --git a/module/task/control.php b/module/task/control.php index 574683f985..f7c508e395 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -346,11 +346,8 @@ class task extends control if(!$this->loadModel('common')->checkPrivByObject('execution', $task->execution)) return $this->sendError($this->lang->execution->accessDenied, $this->createLink('execution', 'all')); /* 为视图设置常用的公共变量和设置菜单为任务所属执行. Set common variables to view and set menu to the execution of the task. */ - $this->taskZen->commonAction($taskID, $vision = 'all'); - - /* 如果当前主导航是项目,则设置菜单为会话中保存的项目. Set menu to project which saved in session if current app tab is project. */ - if($this->app->tab == 'project') $this->loadModel('project')->setMenu($this->session->project); $this->session->project = $task->project; + $this->taskZen->commonAction($taskID, $vision = 'all'); $this->session->set('executionList', $this->app->getURI(true), 'execution'); // This allow get var of session as `$_SESSION['app-execution']['executionList']`.