using Dapper; using EVCB_OCPP.Domain.ConnectionFactory; using EVCB_OCPP.WSServer.Dto; using EVCB_OCPP.WSServer.Helper; using EVCB_OCPP.WSServer.Service.WsService; using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EVCB_OCPP.WSServer.Service.DbService; public class WebDbService { private readonly ISqlConnectionFactory webDbConnectionFactory; private readonly ILogger logger; public WebDbService(ISqlConnectionFactory webDbConnectionFactory, ILogger logger) { this.webDbConnectionFactory = webDbConnectionFactory; this.logger = logger; //this.webConnectionString = configuration.GetConnectionString("WebDBContext"); } //private readonly string webConnectionString; public async Task> GetDenyModelNames(CancellationToken token = default) { using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); string strSql = """ SELECT [Value] FROM [dbo].[KernelConfig] where SystemKey = 'DenyModelNames'; """; var result = await conn.QueryFirstOrDefaultAsync( new CommandDefinition(strSql, cancellationToken: token) ); return result.Split(',').ToList(); } async public Task SetDefaultFee(WsClientData client) { string displayPriceText = string.Empty; string charingPriceText = string.Empty; if (string.IsNullOrEmpty(client.ChargeBoxId)) return displayPriceText; try { using (SqlConnection conn = await webDbConnectionFactory.CreateAsync()) { var parameters = new DynamicParameters(); parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input, 36); string displayPricestrSql = ""; string strSql = ""; if (client.IsAC) { displayPricestrSql = """ SELECT [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour ,[AC_ParkingFee] as ParkingFee, [Currency] FROM[StationMachine] left join[dbo].[Station] on[StationMachine].StationId = Station.[Id] where StationMachine.MachineId=@MachineId and Station.IsBilling=1; """; strSql = """ SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee] FROM[StationMachine] left join [dbo].[StationFee] on[StationMachine].StationId = StationFee.StationId where StationMachine.MachineId =@MachineId and StationFee.IsAC=1; """; } else { displayPricestrSql = """ SELECT [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour ,[DC_ParkingFee] as ParkingFee, [Currency] FROM[StationMachine] left join[dbo].[Station] on[StationMachine].StationId = Station.[Id] where StationMachine.MachineId=@MachineId and Station.IsBilling=1; """; strSql = """ SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee] FROM[StationMachine] left join [dbo].[StationFee] on[StationMachine].StationId = StationFee.StationId where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; """; } var result = await conn.QueryAsync(displayPricestrSql, parameters); if (result.Count() == 0) { return string.Empty; } var stationPrice = result.First(); if (stationPrice.BillingMethod == 1) { var chargingPriceResult = await conn.QueryAsync(strSql, parameters); client.ChargingPrices = chargingPriceResult.ToList(); if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime)) { client.ChargingPrices = new List(); } } displayPriceText = stationPrice.FeeName; client.BillingMethod = stationPrice.BillingMethod; client.Currency = stationPrice.Currency; client.ChargingFeebyHour = stationPrice.ChargingFeebyHour; client.ParkingFee = stationPrice.ParkingFee; client.IsBilling = true; } } catch (Exception ex) { logger.LogError("SetDefaultFee", ex.ToString()); } return displayPriceText; } internal async Task> GetCustomerStationEvseConfig(string chargeBoxId, CancellationToken token = default) { string strSql = """ SELECT [ConfigureName], [ConfigureSetting] FROM [dbo].[StationMachine] INNER Join [dbo].[StationMachineConfig] on [dbo].[StationMachine].StationId = [dbo].[StationMachineConfig].StationId WHERE [ChargeBoxId] = @ChargeBoxId """; using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); DynamicParameters parameters = new DynamicParameters(); parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input, 25); var configs = await conn.QueryAsync(new CommandDefinition(strSql, parameters: parameters, cancellationToken: token)); return configs.ToDictionary(x=>x.ConfigureName, x=>x.ConfigureSetting); } internal async Task> GetEvseStationConfig(int stationId, CancellationToken token = default) { string strSql = """ SELECT [ConfigureName], [ConfigureSetting] FROM [dbo].[StationMachineConfig] WHERE [StationId] = @StationId """; using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); DynamicParameters parameters = new DynamicParameters(); parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input); var configs = await conn.QueryAsync(new CommandDefinition(strSql, parameters: parameters, cancellationToken: token)); return configs.ToDictionary(x => x.ConfigureName, x => x.ConfigureSetting); } internal async Task GetEvseStation(string chargeboxId, CancellationToken token = default) { string getStationStrSql = """ SELECT [StationId] FROM [dbo].[StationMachine] WHERE [ChargeBoxId] = @ChargeBoxIds; """; var parameters = new DynamicParameters(); parameters.Add("@ChargeBoxIds", chargeboxId, direction: ParameterDirection.Input, size: 25); using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); var stationId = await conn.QuerySingleAsync(new CommandDefinition(getStationStrSql, parameters, cancellationToken: token)); return stationId; } internal async Task> GetEvseStationPair(List chargeboxIds) { string getStationStrSql = """ SELECT [StationId],[ChargeBoxId] FROM [dbo].[StationMachine] WHERE [ChargeBoxId] IN @ChargeBoxIds; """; var parameters = new DynamicParameters(); parameters.Add("@ChargeBoxIds", chargeboxIds, direction: ParameterDirection.Input, size: 25); using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); var configs = await conn.QueryAsync(getStationStrSql, parameters); return configs.ToDictionary(x => x.ChargeBoxId, x => x.StationId); } internal async Task>> GetStationEvseConfigs(List stationIds, CancellationToken token = default) { string getSql = """ SELECT [StationId],[ConfigureName],[ConfigureSetting] FROM [dbo].[StationMachine] WHERE [StationId] in @StationIds """; using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); var parameters = new DynamicParameters(); parameters.Add("@StationIds", stationIds, direction: ParameterDirection.Input); var configs = await conn.QueryAsync(new CommandDefinition(getSql, parameters, cancellationToken: token)); return configs .GroupBy(x => x.StationId) .ToDictionary( x => x.Key, x => x.ToDictionary( x => x.ConfigureName, x => x.ConfigureSetting )); } internal async Task>> GetStationEvseConfigs(CancellationToken token = default) { string getSql = """ SELECT [StationId],[ConfigureName],[ConfigureSetting] FROM [dbo].[StationMachineConfig] """; using SqlConnection conn = await webDbConnectionFactory.CreateAsync(); try { var configs = await conn.QueryAsync(new CommandDefinition(getSql, cancellationToken: token)); return configs .GroupBy(x => x.StationId) .ToDictionary( x => x.Key, x => x.ToDictionary( x => x.ConfigureName, x => x.ConfigureSetting )); } catch { logger.LogWarning("StationMachineConfig get failed"); return new Dictionary>(); } } }