|
@@ -1,7 +1,10 @@
|
|
|
using EVCB_OCPP.Packet.Messages.Core;
|
|
|
using EVCB_OCPP.WSServer.Message;
|
|
|
using EVCB_OCPP.WSServer.Service.DbService;
|
|
|
+using EVCB_OCPP.WSServer.Service.WsService;
|
|
|
using log4net.Core;
|
|
|
+using Microsoft.Extensions.DependencyInjection;
|
|
|
+using Microsoft.Extensions.Hosting;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
@@ -11,46 +14,142 @@ using System.Threading.Tasks;
|
|
|
|
|
|
namespace EVCB_OCPP.WSServer.Service;
|
|
|
|
|
|
-internal class StationConfigService
|
|
|
+public static class StationConfigServiceExt
|
|
|
+{
|
|
|
+ public static Task InitStationConfigService(this IHost host)
|
|
|
+ {
|
|
|
+ return host.Services.GetRequiredService<StationConfigService>().Init();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+public class StationConfigService
|
|
|
{
|
|
|
public StationConfigService(
|
|
|
- WebDbService webDbService
|
|
|
+ ProtalServer portalServer
|
|
|
+ , WebDbService webDbService
|
|
|
, ServerMessageService messageService
|
|
|
, ConfirmWaitingMessageSerevice confirmWaitingMessageSerevice
|
|
|
, ILogger<StationConfigService> logger)
|
|
|
{
|
|
|
+ this.portalServer = portalServer;
|
|
|
this.webDbService = webDbService;
|
|
|
this.messageService = messageService;
|
|
|
this.confirmWaitingMessageSerevice = confirmWaitingMessageSerevice;
|
|
|
this.logger = logger;
|
|
|
}
|
|
|
+
|
|
|
+ private readonly ProtalServer portalServer;
|
|
|
private readonly WebDbService webDbService;
|
|
|
private readonly ServerMessageService messageService;
|
|
|
private readonly ConfirmWaitingMessageSerevice confirmWaitingMessageSerevice;
|
|
|
private readonly ILogger<StationConfigService> logger;
|
|
|
- private readonly Dictionary<int, Dictionary<string, string>> stationConfigRecord = new();
|
|
|
|
|
|
- public async Task CheckAndUpdateEvseConfig(string chargeBoxId, CancellationToken token = default)
|
|
|
+ internal static Dictionary<int, Dictionary<string, string>> stationConfigRecord = null;
|
|
|
+
|
|
|
+ public async Task Init()
|
|
|
{
|
|
|
- MessageResult response = await GetEvseCurrentConfig(chargeBoxId, token);
|
|
|
- if (!response.Success || response.Message is not GetConfigurationConfirmation confirmation)
|
|
|
+ stationConfigRecord = await webDbService.GetStationEvseConfigs();
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task CheckAndUpdateEvseConfig(WsClientData session, CancellationToken token = default)
|
|
|
+ {
|
|
|
+ var chargeBoxId = session.ChargeBoxId;
|
|
|
+ var stationId = await webDbService.GetEvseStation(chargeBoxId);
|
|
|
+ if (stationId is null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- Dictionary<string, string> configs = await GetEvseDBCurrentConfig(chargeBoxId, token);
|
|
|
- if (configs == null)
|
|
|
+ if (session.StationId != stationId)
|
|
|
+ {
|
|
|
+ session.StationId = stationId;
|
|
|
+ await UpdateEvseConfig(chargeBoxId, stationId.Value);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task CheckAndUpdateStationConfig()
|
|
|
+ {
|
|
|
+ await UpdateStationConfigChangedEvses();
|
|
|
+ await UpdateStationChangedEvses();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task UpdateStationConfigChangedEvses()
|
|
|
+ {
|
|
|
+ List<int> modifiedStations = new();
|
|
|
+ var dbStationEvseConfig = await webDbService.GetStationEvseConfigs();
|
|
|
+ foreach (var stationConfig in dbStationEvseConfig)
|
|
|
+ {
|
|
|
+ if (!stationConfigRecord.ContainsKey(stationConfig.Key) ||
|
|
|
+ !CheckIsEqual(stationConfig.Value, stationConfigRecord[stationConfig.Key]))
|
|
|
+ {
|
|
|
+ modifiedStations.Add(stationConfig.Key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (modifiedStations.Count == 0)
|
|
|
{
|
|
|
- logger.LogInformation("{0} get station config failed", chargeBoxId);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ stationConfigRecord = dbStationEvseConfig;
|
|
|
+
|
|
|
+ var connectedEvses = portalServer.GetClientDic().Values;
|
|
|
+ foreach (var evse in connectedEvses)
|
|
|
+ {
|
|
|
+ if (evse.IsCheckIn &&
|
|
|
+ evse.StationId is not null &&
|
|
|
+ modifiedStations.Contains(evse.StationId.Value))
|
|
|
+ {
|
|
|
+ await UpdateEvseConfig(evse.ChargeBoxId, evse.StationId.Value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task UpdateStationChangedEvses()
|
|
|
+ {
|
|
|
+ List<string> modifiedEvses = new();
|
|
|
+ var connectedEvses = portalServer.GetClientDic().Values.ToList();
|
|
|
+ foreach (var evse in connectedEvses)
|
|
|
+ {
|
|
|
+ var currentStation = await webDbService.GetEvseStation(evse.ChargeBoxId);
|
|
|
+ if (currentStation is null)
|
|
|
+ {
|
|
|
+ evse.StationId = null;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (evse.StationId != currentStation)
|
|
|
+ {
|
|
|
+ evse.StationId = currentStation;
|
|
|
+ await UpdateEvseConfig(evse.ChargeBoxId, currentStation.Value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task UpdateEvseConfig(string chargeBoxId, int stationId, CancellationToken token = default)
|
|
|
+ {
|
|
|
+ MessageResult getEvseCurrentConfigResponse = await GetEvseCurrentConfig(chargeBoxId, token);
|
|
|
+ if (!getEvseCurrentConfigResponse.Success || getEvseCurrentConfigResponse.Message is not GetConfigurationConfirmation confirmation)
|
|
|
+ {
|
|
|
+ logger.LogWarning("{chargeBoxId} get config from evse failed", chargeBoxId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!stationConfigRecord.ContainsKey(stationId))
|
|
|
+ {
|
|
|
+ logger.LogInformation("{chargeBoxId} doesnt has station config", chargeBoxId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var dbConfigs = stationConfigRecord[stationId];
|
|
|
await ComparenUpdateConfig(chargeBoxId,
|
|
|
evseCurrentConfigs: confirmation.configurationKey.ToDictionary(x => x.key, x => x.value),
|
|
|
- evseDbConfigs: configs,
|
|
|
+ evseDbConfigs: dbConfigs,
|
|
|
token);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
private async Task<MessageResult> GetEvseCurrentConfig(string chargeBoxId, CancellationToken token = default)
|
|
|
{
|
|
|
var sendTask = async () => await messageService.SendGetEVSEConfigureRequest(chargeBoxId);
|
|
@@ -70,11 +169,11 @@ internal class StationConfigService
|
|
|
|
|
|
if (!stationConfigRecord.Keys.Contains(staionID))
|
|
|
{
|
|
|
- await webDbService.GetEvseStationConfig(staionID);
|
|
|
+ stationConfigRecord[staionID] = await webDbService.GetEvseStationConfig(staionID);
|
|
|
}
|
|
|
|
|
|
return stationConfigRecord[staionID];
|
|
|
- return webDbService.GetCustomerStationEvseConfig(chargeBoxId, token);
|
|
|
+ //return webDbService.GetCustomerStationEvseConfig(chargeBoxId, token);
|
|
|
}
|
|
|
|
|
|
internal async Task ComparenUpdateConfig(string chargeBoxId,
|
|
@@ -95,4 +194,13 @@ internal class StationConfigService
|
|
|
response = await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask, token);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private bool CheckIsEqual(Dictionary<string, string> d1, Dictionary<string, string> d2)
|
|
|
+ {
|
|
|
+ return d1.Count == d2.Count && d1.All(
|
|
|
+ (d1KV) => d2.TryGetValue(d1KV.Key, out var d2Value) && (
|
|
|
+ d1KV.Value == d2Value ||
|
|
|
+ d1KV.Value?.Equals(d2Value) == true)
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|