引言
水表是用于测量水消耗量的设备,对于水费计算非常重要。然而,在某些情况下,水表可能会被停用或重新启动,这对计算当月真正使用的天数带来了一些挑战。本文将探讨如何处理这种情况,以便准确计算水费。
背景
当水表被停用时,它不会记录任何数据。而当水表重新启动时,它将继续记录水的消耗量。因此,在计算当月真正使用的天数时,我们需要排除停用期间的数据。
解决方案
为了计算当月真正使用的天数,我们可以使用以下步骤:
下面是一个示例代码片段,用于演示如何计算当月真正使用的天数:
$startDate = strtotime(date("Y-m-01"));
$endDate = strtotime(date("Y-m-01")."+1 month");
// 计算最后一个状态
$lastStatus = TableStopLogModel::create()
->where('date_time', $startDate, '<')
->scalar("status") ?? 0;
// 计算天数
$logList = TableStopLogModel::create()
->where('date_time', $startDate, '>=')
->where('date_time', $endDate, '<')
->order('date_time', 'asc')->all();
$stopDay = 0; // 停用天数
$indexDate = $startDate; // 1号开始
$useDay = 0; // 使用天数
// 10 为停用 20 为 启用
foreach ($logList as $v) {
// 这里可以合并优化, 为了方便查看分开
if ($lastStatus == 0 && $v['status'] == 10) {
// 当月之前没有记录,第一条记录是启用,则默认第一条记录之前为停用
$stopDay += abs(($v['date_time'] - $indexDate) / 86400);
} else if ($lastStatus == 0 && $v['status'] == 10) {
// 当月之前没有记录,第一条记录是停用,则默认第一条记录之前为启用
$useDay += abs(($v['date_time'] - $indexDate) / 86400);
} else if ($v['status'] == 20 && $lastStatus == 10) {
// 从停用 到启用, 则 停用日期增加
$stopDay += abs(($v['date_time'] - $indexDate) / 86400);
} else if ($v['status'] == 10 && $lastStatus == 20) {
// 从启用到停用, 则 启动日期增加
$useDay += abs(($v['date_time'] - $indexDate) / 86400);
}
$indexDate = $v['date_time'];
$lastStatus = $v['status'];
}
if ($lastStatus == 0){
// 没有所有数据时 , 则自行判断视为当月默认启用还是停用
}else if ($lastStatus == 20) {
// 最后一条是启用 ,将当月最后的日期视为启用
$useDay += abs(($endDate - $indexDate) / 86400);
} else if ($lastStatus == 10) {
// 最后一条是停用 ,将当月最后的日期视为停用
$stopDay += abs(($endDate - $indexDate) / 86400);
}
var_dump("停用天数" . $userDay);
var_dump("使用天数" . $tempUserDay);