* Refactor holidayModel::getActualWorkingDays, and modify its unit test.

This commit is contained in:
liumengyi
2023-12-04 13:41:13 +08:00
parent 96a8f25c91
commit ed6dea8db8
3 changed files with 35 additions and 45 deletions
+14 -27
View File
@@ -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;
}
+6 -3
View File
@@ -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();
@@ -2,6 +2,10 @@
<?php
include dirname(__FILE__, 5) . '/test/lib/init.php';
include dirname(__FILE__, 2) . '/holiday.class.php';
zdTable('holiday')->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的情况
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'); // 测试输入开始和结束日期为空。