diff --git a/WebApi_data_value/Services/BackgroundService.cs b/WebApi_data_value/Services/BackgroundService.cs index d9ba3be..ad67e4d 100644 --- a/WebApi_data_value/Services/BackgroundService.cs +++ b/WebApi_data_value/Services/BackgroundService.cs @@ -27,7 +27,7 @@ public class ParkingService : BackgroundService await PerformParkingCheckAsync(stoppingToken); while (!stoppingToken.IsCancellationRequested) { - await Task.Delay(TimeSpan.FromSeconds(50), stoppingToken); //每50秒執行 + await Task.Delay(TimeSpan.FromSeconds(50), stoppingToken); // 每50秒執行 await PerformParkingCheckAsync(stoppingToken); } } @@ -39,7 +39,7 @@ public class ParkingService : BackgroundService var _context = scope.ServiceProvider.GetRequiredService(); var now = DateTime.Now; - var startTime = now.AddHours(-15); // 獲取最近 15 小時進入的車輛 + var startTime = now.AddDays(-2); // 獲取最近兩天內進入的車輛 var inCars = await _context.yuntech_in_car_table .Where(car => car.in_time >= startTime) .ToListAsync(stoppingToken); @@ -47,55 +47,83 @@ public class ParkingService : BackgroundService // 獲取月租名單 var monthlyUsers = await _context.yuntech_parking_user_list.ToListAsync(stoppingToken); - var monthlycar = 0; - var temporarycar = 0; + int monthlycar = 0; + int temporarycar = 0; foreach (var car in inCars) { - var matchedUsers = monthlyUsers - .Where(user => user.user_license_plate_number == car.license_plate_number) - .ToList(); + bool isMonthlyUser = monthlyUsers.Any(user => user.user_license_plate_number == car.license_plate_number); - if (matchedUsers.Count > 0) + if (isMonthlyUser) { - - if (matchedUsers.Count % 2 == 1) + int monthlyNum = 0; + + + if (car.in_time.HasValue && !car.out_time.HasValue) { - monthlycar++; + + if ((now - car.in_time.Value).TotalHours > 15) + { + monthlyNum = 0; + } + else + { + + int countWithin15Hours = inCars.Count(c => c.license_plate_number == car.license_plate_number + && c.in_time.HasValue + && (now - c.in_time.Value).TotalHours <= 15); + + monthlyNum = countWithin15Hours % 2 == 1 ? 1 : 0; + } } - else + else if (car.out_time.HasValue) { - monthlycar--; + monthlyNum = 0; } + monthlycar += monthlyNum; } - else + else // 臨停車輛 { - - if (temporarycar % 2 == 1) + int temporaryNum = 0; + + if (car.in_time.HasValue && !car.out_time.HasValue) { - temporarycar++; + + if ((now - car.in_time.Value).TotalHours > 15) + { + temporaryNum = 0; + } + else + { + + int countWithin15Hours = inCars.Count(c => c.license_plate_number == car.license_plate_number + && c.in_time.HasValue + && (now - c.in_time.Value).TotalHours <= 15); + + temporaryNum = countWithin15Hours % 2 == 1 ? 1 : 0; + } } - else + else if (car.out_time.HasValue) { - temporarycar--; + temporaryNum = 0; } + temporarycar += temporaryNum; } } - //絕對值 + + // 絕對值 monthlycar = Math.Abs(monthlycar); - temporarycar = Math.Abs(temporarycar); + temporarycar = Math.Abs(temporarycar); _logger.LogInformation($"月租車位數量: {monthlycar}"); _logger.LogInformation($"臨停車位數量: {temporarycar}"); - - await UpdateMonthly(_context, monthlycar, temporarycar, stoppingToken); //更新月租跟臨停 + await UpdateMonthly(_context, monthlycar, temporarycar, stoppingToken); } } private async Task UpdateMonthly(SqlContext context, int monthlycar, int temporarycar, CancellationToken stoppingToken) { - var monthlyRentData = await context.yuntech_monthly_rent_number .FirstOrDefaultAsync(rent => rent.category == "月租", stoppingToken); @@ -103,6 +131,7 @@ public class ParkingService : BackgroundService { monthlyRentData.number = monthlycar.ToString(); } + var temporaryRentData = await context.yuntech_monthly_rent_number .FirstOrDefaultAsync(rent => rent.category == "臨停", stoppingToken); @@ -115,6 +144,8 @@ public class ParkingService : BackgroundService } } + + #endregion #region 執行計算剩餘車位並不為負數存入資料庫ParkingLogs