From afef797b9b95b7d2d8e8973d3c80ebe58ee63763 Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Thu, 22 Feb 2024 09:38:38 +0800 Subject: [PATCH] * Fix variance of time in project, bug#43671. --- module/metric/calc.class.php | 16 ++++++++++++++++ .../time/count_of_actual_time_in_project.php | 14 ++++++++++++-- .../project/time/variance_of_time_in_project.php | 14 ++++++++++++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/module/metric/calc.class.php b/module/metric/calc.class.php index 997c32105f..5b139137b0 100644 --- a/module/metric/calc.class.php +++ b/module/metric/calc.class.php @@ -170,6 +170,22 @@ class baseCalc return !empty($filteredRows) ? $filteredRows : false; } + /** + * 判断是否为日期。 + * Check if a string is a date. + * + * @param string $dateString + * @access public + * @return bool + */ + public function isDate($dateString) + { + $format = 'Y-m-d'; + $dateTime = DateTime::createFromFormat($format, $dateString); + + return $dateTime && $dateTime->format($format) === $dateString; + } + /** * 扩展选项。 * Expand options. diff --git a/module/metric/calc/project/time/count_of_actual_time_in_project.php b/module/metric/calc/project/time/count_of_actual_time_in_project.php index 0513b4f3fa..4c8e9844eb 100755 --- a/module/metric/calc/project/time/count_of_actual_time_in_project.php +++ b/module/metric/calc/project/time/count_of_actual_time_in_project.php @@ -33,8 +33,18 @@ class count_of_actual_time_in_project extends baseCalc $realEnd = $row->realEnd; $status = $row->status; - if($status == 'closed') $actual = (strtotime($realEnd) - strtotime($realBegan)) / 86400; - if($status != 'closed') $actual = (strtotime(date('Y-m-d')) - strtotime($realBegan)) / 86400; + if($status != 'doing' and $status != 'closed') return false; + + if($status == 'doing') + { + if(!$this->isDate($realBegan)) return false; + + $realEnd = date('Y-m-d'); + } + + if($status == 'closed' && (!$this->isDate($realBegan) || !$this->isDate($realEnd))) return false; + + $actual = (strtotime($realEnd) - strtotime($realBegan)) / 86400; $this->result[$project] = $actual; } diff --git a/module/metric/calc/project/time/variance_of_time_in_project.php b/module/metric/calc/project/time/variance_of_time_in_project.php index 25e1283128..e25c95a3f4 100755 --- a/module/metric/calc/project/time/variance_of_time_in_project.php +++ b/module/metric/calc/project/time/variance_of_time_in_project.php @@ -35,10 +35,20 @@ class variance_of_time_in_project extends baseCalc $realEnd = $row->realEnd; $status = $row->status; + if($status != 'doing' and $status != 'closed') return false; + $plan = (strtotime($end) - strtotime($begin)) / 86400; - if($status == 'closed') $actual = (strtotime($realEnd) - strtotime($realBegan)) / 86400; - if($status != 'closed') $actual = (strtotime(date('Y-m-d')) - strtotime($realBegan)) / 86400; + if($status == 'doing') + { + if(!$this->isDate($realBegan)) return false; + + $realEnd = date('Y-m-d'); + } + + if($status == 'closed' && (!$this->isDate($realBegan) || !$this->isDate($realEnd))) return false; + + $actual = (strtotime($realEnd) - strtotime($realBegan)) / 86400; $this->result[$project] = $actual - $plan; }