Second upload

This commit is contained in:
qi_0527 2024-10-25 00:59:31 +08:00
parent a0102de0b0
commit ae9fad7e14
2 changed files with 111 additions and 8 deletions

View File

@ -19,11 +19,15 @@ builder.Services.AddCors();
builder.Services.AddControllers(); builder.Services.AddControllers();
//執行每日存取剩餘車位 //執行每日存取剩餘車位
builder.Services.AddHostedService<ParkingService>();// 更新月租車位
builder.Services.AddScoped<ExcelGenerationService>(); // ExcelGenerationService 下載Excel builder.Services.AddScoped<ExcelGenerationService>(); // ExcelGenerationService 下載Excel
builder.Services.AddHostedService<DailyExcelGenerationService>(); // 每天設定ExcelGenerationService 存取剩餘車位 builder.Services.AddHostedService<DailyExcelGenerationService>(); // 每天設定ExcelGenerationService 存取剩餘車位
builder.Services.AddHostedService<ParkingLogCleanupService>(); //執行定期清除3個月前剩餘車位 builder.Services.AddHostedService<ParkingLogCleanupService>(); //執行定期清除3個月前剩餘車位
builder.Services.AddHostedService<ParkingUpdateService>(); //執行每一分鐘更新剩餘車位 builder.Services.AddHostedService<ParkingUpdateService>(); //執行每一分鐘更新剩餘車位
builder.Logging.SetMinimumLevel(LogLevel.Information); // 設置日誌
// 連線PostgreSQL資料庫 // 連線PostgreSQL資料庫
var connectionString = "Server=140.125.20.183;UserID=postgres;password=EL404el404;Database=postgres;port=5432;Search Path=public;CommandTimeout=1800"; var connectionString = "Server=140.125.20.183;UserID=postgres;password=EL404el404;Database=postgres;port=5432;Search Path=public;CommandTimeout=1800";
//var connectionString = "Server=127.0.0.1;UserID=postgres;password=EL404el404;Database=postgres;port=5432;Search Path=public;CommandTimeout=1800"; //var connectionString = "Server=127.0.0.1;UserID=postgres;password=EL404el404;Database=postgres;port=5432;Search Path=public;CommandTimeout=1800";

View File

@ -6,8 +6,106 @@ using System.Globalization;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Parking_space_WebAPI.Services; using Parking_space_WebAPI.Services;
using WebApi_data_value.Models; using WebApi_data_value.Models;
// 執行計算剩餘車位並不為負數存入資料庫ParkingLogs using Microsoft.Extensions.Logging; // 確保引用
using System.Linq;
#region
public class ParkingService : BackgroundService
{
private readonly IServiceScopeFactory _scopeFactory;
private readonly ILogger<ParkingService> _logger;
public ParkingService(IServiceScopeFactory scopeFactory, ILogger<ParkingService> logger)
{
_scopeFactory = scopeFactory;
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await PerformParkingCheckAsync(stoppingToken);
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(TimeSpan.FromSeconds(50), stoppingToken); //每50秒執行
await PerformParkingCheckAsync(stoppingToken);
}
}
private async Task PerformParkingCheckAsync(CancellationToken stoppingToken)
{
using (var scope = _scopeFactory.CreateScope())
{
var _context = scope.ServiceProvider.GetRequiredService<SqlContext>();
var now = DateTime.Now;
var startTime = now.AddHours(-12); // 獲取最近 12 小時進入的車輛
var inCars = await _context.yuntech_in_car_table
.Where(car => car.in_time >= startTime)
.ToListAsync(stoppingToken);
// 獲取月租名單
var monthlyUsers = await _context.yuntech_parking_user_list.ToListAsync(stoppingToken);
var monthlycar = 0;
var temporarycar = 0;
foreach (var car in inCars)
{
var matchedUsers = monthlyUsers
.Where(user => user.user_license_plate_number == car.license_plate_number)
.ToList();
if (matchedUsers.Count > 0)
{
if (matchedUsers.Count % 2 == 1)
{
monthlycar++;
}
else
{
monthlycar--;
}
}
else
{
temporarycar++;
}
}
_logger.LogInformation($"月租車位數量: {monthlycar}");
_logger.LogInformation($"臨停車位數量: {temporarycar}");
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);
if (monthlyRentData != null)
{
monthlyRentData.number = monthlycar.ToString();
}
var temporaryRentData = await context.yuntech_monthly_rent_number
.FirstOrDefaultAsync(rent => rent.category == "臨停", stoppingToken);
if (temporaryRentData != null)
{
temporaryRentData.number = temporarycar.ToString();
}
await context.SaveChangesAsync(stoppingToken);
}
}
#endregion
#region ParkingLogs
public class ParkingUpdateService : BackgroundService public class ParkingUpdateService : BackgroundService
{ {
private readonly IServiceScopeFactory _scopeFactory; private readonly IServiceScopeFactory _scopeFactory;
@ -30,10 +128,10 @@ public class ParkingUpdateService : BackgroundService
var yuntech_parking = await _context.yuntech_parking.FirstOrDefaultAsync(); var yuntech_parking = await _context.yuntech_parking.FirstOrDefaultAsync();
if (yuntech_parking != null) if (yuntech_parking != null)
{ {
if (Int32.TryParse(yuntech_parking.all_num, out int totalParkingSpaces)) if (Int32.TryParse(yuntech_parking.all_num, out int totalParkingSpaces))
{ {
var monthly_rent_data = await _context.yuntech_monthly_rent_number var monthly_rent_data = await _context.yuntech_monthly_rent_number
.FirstOrDefaultAsync(rent => rent.category == "月租"); .FirstOrDefaultAsync(rent => rent.category == "月租");
int monthlyRentNumber = 0; int monthlyRentNumber = 0;
@ -42,7 +140,7 @@ public class ParkingUpdateService : BackgroundService
Int32.TryParse(monthly_rent_data.number, out monthlyRentNumber); Int32.TryParse(monthly_rent_data.number, out monthlyRentNumber);
} }
var temporary_rent_data = await _context.yuntech_monthly_rent_number var temporary_rent_data = await _context.yuntech_monthly_rent_number
.FirstOrDefaultAsync(rent => rent.category == "臨停"); .FirstOrDefaultAsync(rent => rent.category == "臨停");
int temporaryRentNumber = 0; int temporaryRentNumber = 0;
@ -51,17 +149,17 @@ public class ParkingUpdateService : BackgroundService
Int32.TryParse(temporary_rent_data.number, out temporaryRentNumber); Int32.TryParse(temporary_rent_data.number, out temporaryRentNumber);
} }
int totalOccupiedSpaces = monthlyRentNumber + Math.Abs(temporaryRentNumber); //確保絕對值 int totalOccupiedSpaces = monthlyRentNumber + Math.Abs(temporaryRentNumber); //確保絕對值
int remainingSpaces = totalParkingSpaces - totalOccupiedSpaces; int remainingSpaces = totalParkingSpaces - totalOccupiedSpaces;
// 確保剩餘車位數不為負數 // 確保剩餘車位數不為負數
yuntech_parking.now_num = Math.Max(remainingSpaces, 0).ToString(); yuntech_parking.now_num = Math.Max(remainingSpaces, 0).ToString();
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
var log = new ParkingLog var log = new ParkingLog
{ {
Timestamp = DateTime.Now, Timestamp = DateTime.Now,
@ -90,3 +188,4 @@ public class ParkingUpdateService : BackgroundService
} }
} }
} }
#endregion