|
@@ -10,6 +10,7 @@ using Microsoft.Extensions.Logging;
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
using EVCB_OCPP.TaskScheduler.Helper;
|
|
|
using EVCB_OCPP.Domain;
|
|
|
+using EVCB_OCPP.TaskScheduler.Services;
|
|
|
|
|
|
namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
{
|
|
@@ -19,29 +20,32 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
[DisallowConcurrentExecution]
|
|
|
public class CheckEVSEOnlineJob : IJob
|
|
|
{
|
|
|
- private readonly ILogger logger;
|
|
|
- private readonly SqlConnectionFactory<MainDBContext> mainDbConnectionFactory;
|
|
|
- private readonly SqlConnectionFactory<OnlineLogDBContext> onlineLogDbConnectionFactory;
|
|
|
-
|
|
|
//private readonly string mainDBConnectString;
|
|
|
//private readonly string onlineDBConnectString;
|
|
|
|
|
|
- private DateTime latestHeartbeatTime = DateTime.Now;
|
|
|
- private List<EVSEOnlineRecord> updateData = new List<EVSEOnlineRecord>();
|
|
|
- private List<EVSEOnlineRecord> insertData = new List<EVSEOnlineRecord>();
|
|
|
-
|
|
|
public CheckEVSEOnlineJob(
|
|
|
ILogger<CheckEVSEOnlineJob> logger,
|
|
|
+ OnlineLogDbService onlineLogDbService,
|
|
|
SqlConnectionFactory<MainDBContext> mainDbConnectionFactory,
|
|
|
SqlConnectionFactory<OnlineLogDBContext> onlineLogDbConnectionFactory)
|
|
|
{
|
|
|
this.logger = logger;
|
|
|
+ this.onlineLogDbService = onlineLogDbService;
|
|
|
this.mainDbConnectionFactory = mainDbConnectionFactory;
|
|
|
this.onlineLogDbConnectionFactory = onlineLogDbConnectionFactory;
|
|
|
//this.mainDBConnectString = configuration.GetConnectionString("MainDBContext");
|
|
|
//this.onlineDBConnectString = configuration.GetConnectionString("OnlineLogDBContext");
|
|
|
}
|
|
|
|
|
|
+ private readonly ILogger logger;
|
|
|
+ private readonly OnlineLogDbService onlineLogDbService;
|
|
|
+ private readonly SqlConnectionFactory<MainDBContext> mainDbConnectionFactory;
|
|
|
+ private readonly SqlConnectionFactory<OnlineLogDBContext> onlineLogDbConnectionFactory;
|
|
|
+
|
|
|
+ private DateTime latestHeartbeatTime = DateTime.Now;
|
|
|
+ private List<EVSEOnlineRecord> updateData = new List<EVSEOnlineRecord>();
|
|
|
+ private List<EVSEOnlineRecord> insertData = new List<EVSEOnlineRecord>();
|
|
|
+
|
|
|
public async Task Execute(IJobExecutionContext context)
|
|
|
{
|
|
|
logger.LogDebug(this.ToString() + " :Starting........");
|
|
@@ -50,38 +54,43 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
List<EVSECurrentStatus> _EVSEs = await GetEVSEs();
|
|
|
var checktime = DateTime.UtcNow.AddDays(-3);
|
|
|
_EVSEs = _EVSEs.Where(x => x.HeartbeatUpdatedOn > checktime).ToList();
|
|
|
+ List<Task> saveTasks = new List<Task>();
|
|
|
|
|
|
- foreach (var evse in _EVSEs)
|
|
|
- {
|
|
|
+ var temp = _EVSEs.GroupBy(x => IsOnlineNow(x)).ToList();
|
|
|
|
|
|
- if (IsOnlineNow(evse))
|
|
|
+ foreach (var g in temp)
|
|
|
+ {
|
|
|
+ if (g.Key)
|
|
|
{
|
|
|
+ _EVSEs = g.Where(x => !x.Online).ToList();
|
|
|
|
|
|
- if (!evse.Online)
|
|
|
- { //off - on
|
|
|
-
|
|
|
- await UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, true, DefaultSetting.DefaultNullTime);
|
|
|
- await UpdateOnlineRecords(evse.ChargeBoxId, true, evse.HeartbeatUpdatedOn, null);
|
|
|
+ for (int evseIndex = 0; evseIndex < _EVSEs.Count; evseIndex++)
|
|
|
+ {
|
|
|
+ var evse = _EVSEs[evseIndex];
|
|
|
+ saveTasks.Add(UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, true, DefaultSetting.DefaultNullTime));
|
|
|
+ //saveTasks.Add(UpdateOnlineRecords(evse.ChargeBoxId, true, evse.HeartbeatUpdatedOn, null));
|
|
|
+ saveTasks.Add(onlineLogDbService.InsertOnlineLog(evse.ChargeBoxId, evse.HeartbeatUpdatedOn));
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ _EVSEs = g.Where(x => x.Online).ToList();
|
|
|
+ var ChargeBoxIdOnlineRecordIdPairs = await GetOnlineRecordId(_EVSEs.Select(x=>x.ChargeBoxId).ToList());
|
|
|
|
|
|
- if (evse.Online)
|
|
|
+ for (int evseIndex = 0; evseIndex < _EVSEs.Count; evseIndex++)
|
|
|
{
|
|
|
- //on -off
|
|
|
-
|
|
|
- await UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn);
|
|
|
- var online_row = await GetOnlineRecord(evse.ChargeBoxId);
|
|
|
- if (online_row != null)
|
|
|
+ var evse = _EVSEs[evseIndex];
|
|
|
+ saveTasks.Add(UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn));
|
|
|
+ var online_rowId = ChargeBoxIdOnlineRecordIdPairs[evse.ChargeBoxId];
|
|
|
+ if (online_rowId is not null)
|
|
|
{
|
|
|
- await UpdateOnlineRecords(evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn, online_row.Id);
|
|
|
+ saveTasks.Add(onlineLogDbService.UpdateOnlineLog(online_rowId.Value, evse.HeartbeatUpdatedOn));
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ await Task.WhenAll(saveTasks);
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
@@ -105,7 +114,7 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
string sqlstring =
|
|
|
"""
|
|
|
SELECT m.CustomerId,m.Id,m.ChargeBoxId,m.Online,m.HeartbeatUpdatedOn,MachineConfigurations.ConfigureSetting HeartbeatInterval
|
|
|
- FROM [dbo].[Machine] m left join [dbo].[MachineConfigurations] MachineConfigurations on m.ChargeBoxId = MachineConfigurations.ChargeBoxId
|
|
|
+ FROM [dbo].[Machine] m left join [dbo].[MachineConfigurations] MachineConfigurations on m.ChargeBoxId = MachineConfigurations.ChargeBoxId
|
|
|
WHERE MachineConfigurations.ConfigureName = 'HeartbeatInterval' and MachineConfigurations.ConfigureSetting!=''
|
|
|
""";
|
|
|
result = (await dbConn.QueryAsync<EVSECurrentStatus>(sqlstring)).ToList();
|
|
@@ -127,7 +136,7 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
using var dbConn = await mainDbConnectionFactory.CreateAsync();
|
|
|
var parameters = new DynamicParameters();
|
|
|
parameters.Add("@Online", turnOn, System.Data.DbType.Boolean);
|
|
|
- parameters.Add("@chargeBoxId", ChargeBoxId, System.Data.DbType.String);
|
|
|
+ parameters.Add("@chargeBoxId", ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 50);
|
|
|
|
|
|
if (!turnOn)
|
|
|
{
|
|
@@ -154,7 +163,7 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
using var dbConn = await onlineLogDbConnectionFactory.CreateAsync();
|
|
|
{
|
|
|
var parameters = new DynamicParameters();
|
|
|
- parameters.Add("@ChargeBoxId", chargeBoxId, System.Data.DbType.String);
|
|
|
+ parameters.Add("@ChargeBoxId", chargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
|
|
|
parameters.Add("@OnlineTime", hearbeatDt, System.Data.DbType.DateTime);
|
|
|
parameters.Add("@OfflineTime", DefaultSetting.DefaultNullTime, System.Data.DbType.DateTime);
|
|
|
|
|
@@ -165,7 +174,7 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
{
|
|
|
if (rowId.HasValue)
|
|
|
{
|
|
|
- string sqlString = "UPDATE dbo.EVSEOnlineRecord SET OfflineTime=@OfflineTime WHERE Id=@Id";
|
|
|
+ string sqlString = "UPDATE dbo.EVSEOnlineRecord SET OfflineTime=@OfflineTime WHERE Id=@Id";
|
|
|
using (var dbConn = await onlineLogDbConnectionFactory.CreateAsync())
|
|
|
{
|
|
|
var parameters = new DynamicParameters();
|
|
@@ -194,20 +203,20 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
|
|
|
|
|
|
|
|
|
- async private Task<EVSEOnlineRecord> GetOnlineRecord(string chargeBoxId)
|
|
|
+ private async Task<EVSEOnlineRecord> GetOnlineRecord(string chargeBoxId)
|
|
|
{
|
|
|
EVSEOnlineRecord lastrow = new EVSEOnlineRecord();
|
|
|
try
|
|
|
{
|
|
|
string sqlString = string.Format("SELECT Id FROM dbo.EVSEOnlineRecord WHERE chargeBoxId=@chargeBoxId Order by OnlineTime desc");
|
|
|
- using (var dbConn = onlineLogDbConnectionFactory.Create())
|
|
|
+ using (var dbConn = await onlineLogDbConnectionFactory.CreateAsync())
|
|
|
{
|
|
|
var parameters = new DynamicParameters();
|
|
|
- parameters.Add("@chargeBoxId", chargeBoxId, System.Data.DbType.String);
|
|
|
+ parameters.Add("@chargeBoxId", chargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
|
|
|
|
|
|
|
|
|
- var result = await dbConn.QueryAsync<EVSEOnlineRecord>(sqlString, parameters);
|
|
|
- lastrow = result.FirstOrDefault();
|
|
|
+ lastrow = await dbConn.QueryFirstOrDefaultAsync<EVSEOnlineRecord>(sqlString, parameters);
|
|
|
+ //lastrow = result.FirstOrDefault();
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -218,6 +227,44 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
return lastrow;
|
|
|
}
|
|
|
|
|
|
+ private async Task<Dictionary<string, long?>> GetOnlineRecordId(List<string> chargeBoxIds)
|
|
|
+ {
|
|
|
+ Dictionary<string, long?> toReturn = new();
|
|
|
+ Dictionary<string, long> queryResult;
|
|
|
+ string sqlString = """
|
|
|
+ WITH CTE AS (
|
|
|
+ SELECT
|
|
|
+ Id, ChargeBoxId,
|
|
|
+ ROW_NUMBER() OVER (PARTITION BY s.ChargeBoxId ORDER BY s.OnlineTime DESC) AS RowNum
|
|
|
+ FROM [dbo].[EVSEOnlineRecord] s
|
|
|
+ WHERE ChargeBoxId in @ChargeBoxIds
|
|
|
+ )
|
|
|
+ SELECT Id,ChargeBoxId
|
|
|
+ FROM CTE
|
|
|
+ WHERE RowNum = 1;
|
|
|
+ """;
|
|
|
+ var parameters = new DynamicParameters();
|
|
|
+ parameters.Add("@ChargeBoxIds", chargeBoxIds.Select(x => new DbString() { Value = x, Length = 36 }));
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ using (var dbConn = await onlineLogDbConnectionFactory.CreateAsync())
|
|
|
+ {
|
|
|
+ var temp = await dbConn.QueryAsync<EVSEOnlineRecord>(sqlString, parameters);
|
|
|
+ queryResult = temp.ToDictionary(x => x.ChargeBoxId, x => x.Id);
|
|
|
+ //lastrow = result.FirstOrDefault();
|
|
|
+ }
|
|
|
+
|
|
|
+ toReturn = chargeBoxIds.ToDictionary<string,string,long?>(keySelector: x => x, elementSelector: x => queryResult.ContainsKey(x) ? queryResult[x] : null);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ logger.LogError("Query Data Error " + ex.ToString());
|
|
|
+ toReturn = chargeBoxIds.ToDictionary<string, string, long?>(keySelector: x => x, elementSelector: null);
|
|
|
+ }
|
|
|
+ return toReturn;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
private bool IsOnlineNow(EVSECurrentStatus currentEVSE)
|
|
|
{
|