From ed6dea8db8b60bd451fc56fb41f1ad8329b79eef Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 4 Dec 2023 13:41:13 +0800 Subject: [PATCH] * Refactor holidayModel::getActualWorkingDays, and modify its unit test. --- module/holiday/model.php | 41 +++++++------------ module/holiday/test/holiday.class.php | 9 ++-- .../test/model/getactualworkingdays.php | 30 +++++++------- 3 files changed, 35 insertions(+), 45 deletions(-) diff --git a/module/holiday/model.php b/module/holiday/model.php index b540fc14a8..cefcb29c62 100644 --- a/module/holiday/model.php +++ b/module/holiday/model.php @@ -184,6 +184,7 @@ class holidayModel extends model } /** + * 获取实际工作日。 * Get actual working days. * * @param string $begin @@ -191,40 +192,32 @@ class holidayModel extends model * @access public * @return array */ - public function getActualWorkingDays($begin, $end) + public function getActualWorkingDays(string $begin, string $end): array { - if(empty($begin) or empty($end) or $begin == '0000-00-00' or $end == '0000-00-00') return array(); - - $actualDays = array(); - $currentDay = $begin; + if(empty($begin) || empty($end) || $begin == '0000-00-00' || $end == '0000-00-00') return array(); + /* Get holidays, working days and weekend days .*/ $holidays = $this->getHolidays($begin, $end); $workingDays = $this->getWorkingDays($begin, $end); $weekend = isset($this->config->project->weekend) ? $this->config->project->weekend : 2; /* When the start date and end date are the same. */ + $actualDays = array(); if($begin == $end) { - if(in_array($begin, $workingDays)) return $actualDays[] = $begin; - if(in_array($begin, $holidays)) return $actualDays; + if(in_array($begin, $workingDays)) return array($begin); + if(in_array($begin, $holidays)) return array(); $w = date('w', strtotime($begin)); - if($weekend == 2) - { - if($w == 0 or $w == 6) return $actualDays; - } - else - { - if($w == 0) return $actualDays; - } + if($w == 0 || ($weekend == 2 && $w == 6)) return array(); - $actualDays[] = $begin; - return $actualDays; + return array($begin); } - for($i = 0; $currentDay < $end; $i ++) + /* Process actual working days. */ + for($i = 0, $currentDay = $begin; $currentDay < $end; $i ++) { - $currentDay = date('Y-m-d', strtotime("$begin + $i days")); + $currentDay = date('Y-m-d', strtotime("{$begin} + {$i} days")); $w = date('w', strtotime($currentDay)); if(in_array($currentDay, $workingDays)) @@ -234,14 +227,8 @@ class holidayModel extends model } if(in_array($currentDay, $holidays)) continue; - if($weekend == 2) - { - if($w == 0 or $w == 6) continue; - } - else - { - if($w == 0) continue; - } + if($w == 0 || ($weekend == 2 && $w == 6)) continue; + $actualDays[] = $currentDay; } diff --git a/module/holiday/test/holiday.class.php b/module/holiday/test/holiday.class.php index c3b948762e..e74f865ef9 100644 --- a/module/holiday/test/holiday.class.php +++ b/module/holiday/test/holiday.class.php @@ -177,15 +177,18 @@ class holidayTest } /** - * Test getActualWorkingDays method. + * 测试获取实际工作日。 + * Test get actual working days. * * @param string $begin * @param string $end * @access public - * @return int + * @return int|array */ - public function getActualWorkingDaysTest($begin, $end) + public function getActualWorkingDaysTest(string $begin, string $end): int|array { + $begin = $begin ? date('Y-m-d', strtotime($begin)) : '0000-00-00'; + $end = $end ? date('Y-m-d', strtotime($end)) : ''; $objects = $this->objectModel->getActualWorkingDays($begin, $end); if(dao::isError()) return dao::getError(); diff --git a/module/holiday/test/model/getactualworkingdays.php b/module/holiday/test/model/getactualworkingdays.php index 26e842fbff..923822e067 100755 --- a/module/holiday/test/model/getactualworkingdays.php +++ b/module/holiday/test/model/getactualworkingdays.php @@ -2,6 +2,10 @@ gen(50); +zdTable('user')->gen(1); + su('admin'); /** @@ -10,22 +14,18 @@ title=测试 holidayModel->getActualWorkingDays(); cid=1 pid=1 -查询2022-04-01到2022-04-10的实际工作日 >> 8 -查询2022-04-06到2022-04-12的实际工作日 >> 7 -查询2022-05-10到2022-05-10的实际工作日 >> 9 -查询2022-05-10到2022-05-10的实际工作日 >> 1 -查询2022-05-13到2022-05-13的实际工作日 >> 1 -查询2022-05-14到2022-05-14的实际工作日 >> 0 -测试传入0000-00-00的情况 >> 0 - */ $holiday = new holidayTest(); +$begin = array('-14 day', '-7 day', '+7 day', '+14 day', ''); +$end = array('+7 day', '+14 day', ''); -r($holiday->getActualWorkingDaysTest('2022-04-01', '2022-04-10')) && p() && e('8'); //查询2022-04-01到2022-04-10的实际工作日 -r($holiday->getActualWorkingDaysTest('2022-04-06', '2022-04-12')) && p() && e('7'); //查询2022-04-06到2022-04-12的实际工作日 -r($holiday->getActualWorkingDaysTest('2022-05-10', '2022-05-20')) && p() && e('9'); //查询2022-05-10到2022-05-10的实际工作日 -r($holiday->getActualWorkingDaysTest('2022-04-06', '2022-04-06')) && p() && e('1'); //查询2022-05-10到2022-05-10的实际工作日 -r($holiday->getActualWorkingDaysTest('2022-05-13', '2022-05-13')) && p() && e('1'); //查询2022-05-13到2022-05-13的实际工作日 -r($holiday->getActualWorkingDaysTest('2022-05-14', '2022-05-14')) && p() && e('0'); //查询2022-05-14到2022-05-14的实际工作日 -r($holiday->getActualWorkingDaysTest('0000-00-00', '0000-00-00')) && p() && e('0'); //测试传入0000-00-00的情况 \ No newline at end of file +r($holiday->getActualWorkingDaysTest($begin[0], $end[0])) && p() && e('19'); // 返回处于 14天前 到 7天后 之间的实际工作日。 +r($holiday->getActualWorkingDaysTest($begin[0], $end[1])) && p() && e('24'); // 返回处于 14天前 到 14天后 之间的实际工作日。 +r($holiday->getActualWorkingDaysTest($begin[1], $end[0])) && p() && e('13'); // 返回处于 7天前 到 7天后 之间的实际工作日。 +r($holiday->getActualWorkingDaysTest($begin[1], $end[1])) && p() && e('18'); // 返回处于 7天前 到 14天后 之间的实际工作日。 +r($holiday->getActualWorkingDaysTest($begin[2], $end[0])) && p() && e('0'); // 测试开始和结束日期相同的实际工作日。 +r($holiday->getactualworkingdaystest($begin[3], $end[0])) && p() && e('0'); // 测试当结束日期小于开始日期时。 +r($holiday->getactualworkingdaystest($begin[4], $end[0])) && p() && e('0'); // 测试输入开始日期为空。 +r($holiday->getactualworkingdaystest($begin[0], $end[2])) && p() && e('0'); // 测试输入结束日期为空。 +r($holiday->getactualworkingdaystest($begin[4], $end[2])) && p() && e('0'); // 测试输入开始和结束日期为空。