WebDbService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. using Dapper;
  2. using EVCB_OCPP.Domain.ConnectionFactory;
  3. using EVCB_OCPP.WSServer.Dto;
  4. using EVCB_OCPP.WSServer.Helper;
  5. using EVCB_OCPP.WSServer.Service.WsService;
  6. using Microsoft.Data.SqlClient;
  7. using Microsoft.Extensions.Configuration;
  8. using Microsoft.Extensions.Logging;
  9. using Newtonsoft.Json.Linq;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. namespace EVCB_OCPP.WSServer.Service.DbService;
  17. public class WebDbService
  18. {
  19. private readonly ISqlConnectionFactory<WebDBConetext> webDbConnectionFactory;
  20. private readonly ILogger<WebDbService> logger;
  21. public WebDbService(ISqlConnectionFactory<WebDBConetext> webDbConnectionFactory, ILogger<WebDbService> logger)
  22. {
  23. this.webDbConnectionFactory = webDbConnectionFactory;
  24. this.logger = logger;
  25. //this.webConnectionString = configuration.GetConnectionString("WebDBContext");
  26. }
  27. //private readonly string webConnectionString;
  28. public async Task<List<string>> GetDenyModelNames(CancellationToken token = default)
  29. {
  30. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  31. string strSql = """
  32. SELECT [Value]
  33. FROM [dbo].[KernelConfig]
  34. where SystemKey = 'DenyModelNames';
  35. """;
  36. var result = await conn.QueryFirstOrDefaultAsync<string>(
  37. new CommandDefinition(strSql, cancellationToken: token)
  38. );
  39. return result.Split(',').ToList();
  40. }
  41. async public Task<string> SetDefaultFee(WsClientData client)
  42. {
  43. string displayPriceText = string.Empty;
  44. string charingPriceText = string.Empty;
  45. if (string.IsNullOrEmpty(client.ChargeBoxId)) return displayPriceText;
  46. try
  47. {
  48. using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
  49. {
  50. var parameters = new DynamicParameters();
  51. parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input, 36);
  52. string displayPricestrSql = "";
  53. string strSql = "";
  54. if (client.IsAC)
  55. {
  56. displayPricestrSql = """
  57. SELECT [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour ,[AC_ParkingFee] as ParkingFee, [Currency]
  58. FROM[StationMachine] left join[dbo].[Station]
  59. on[StationMachine].StationId = Station.[Id]
  60. where StationMachine.MachineId=@MachineId and Station.IsBilling=1;
  61. """;
  62. strSql = """
  63. SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]
  64. FROM[StationMachine] left join [dbo].[StationFee]
  65. on[StationMachine].StationId = StationFee.StationId
  66. where StationMachine.MachineId =@MachineId and StationFee.IsAC=1;
  67. """;
  68. }
  69. else
  70. {
  71. displayPricestrSql = """
  72. SELECT [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour ,[DC_ParkingFee] as ParkingFee, [Currency]
  73. FROM[StationMachine] left join[dbo].[Station]
  74. on[StationMachine].StationId = Station.[Id]
  75. where StationMachine.MachineId=@MachineId and Station.IsBilling=1;
  76. """;
  77. strSql = """
  78. SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]
  79. FROM[StationMachine] left join [dbo].[StationFee]
  80. on[StationMachine].StationId = StationFee.StationId
  81. where StationMachine.MachineId =@MachineId and StationFee.IsAC=0;
  82. """;
  83. }
  84. var result = await conn.QueryFirstOrDefaultAsync<StationFee>(new CommandDefinition(
  85. commandText: displayPricestrSql,
  86. parameters: parameters,
  87. cancellationToken: client.DisconnetCancellationToken
  88. ));
  89. if (result == default)
  90. {
  91. client.IsBilling = false;
  92. return string.Empty;
  93. }
  94. var stationPrice = result;//.First();
  95. if (stationPrice.BillingMethod == 1)
  96. {
  97. //var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
  98. var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(new CommandDefinition(
  99. commandText: strSql,
  100. parameters: parameters,
  101. cancellationToken: client.DisconnetCancellationToken
  102. ));
  103. client.ChargingPrices = chargingPriceResult.ToList();
  104. if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
  105. {
  106. client.ChargingPrices = new List<ChargingPrice>();
  107. }
  108. }
  109. displayPriceText = stationPrice.FeeName;
  110. client.BillingMethod = stationPrice.BillingMethod;
  111. client.Currency = stationPrice.Currency;
  112. client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
  113. client.ParkingFee = stationPrice.ParkingFee;
  114. client.IsBilling = true;
  115. }
  116. }
  117. catch (Exception ex)
  118. {
  119. logger.LogError("SetDefaultFee", ex.ToString());
  120. }
  121. return displayPriceText;
  122. }
  123. internal async Task<Dictionary<string, string>> GetCustomerStationEvseConfig(string chargeBoxId, CancellationToken token = default)
  124. {
  125. string strSql = """
  126. SELECT [ConfigureName], [ConfigureSetting]
  127. FROM [dbo].[StationMachine]
  128. INNER Join [dbo].[StationMachineConfig] on [dbo].[StationMachine].StationId = [dbo].[StationMachineConfig].StationId
  129. WHERE [ChargeBoxId] = @ChargeBoxId
  130. """;
  131. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  132. DynamicParameters parameters = new DynamicParameters();
  133. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input, 50);
  134. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(strSql, parameters: parameters, cancellationToken: token));
  135. return configs.ToDictionary(x=>x.ConfigureName, x=>x.ConfigureSetting);
  136. }
  137. internal async Task<Dictionary<string, string>> GetEvseStationConfig(int stationId, CancellationToken token = default)
  138. {
  139. string strSql = """
  140. SELECT [ConfigureName], [ConfigureSetting]
  141. FROM [dbo].[StationMachineConfig]
  142. WHERE [StationId] = @StationId
  143. """;
  144. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  145. DynamicParameters parameters = new DynamicParameters();
  146. parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
  147. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(strSql, parameters: parameters, cancellationToken: token));
  148. return configs.ToDictionary(x => x.ConfigureName, x => x.ConfigureSetting);
  149. }
  150. internal async Task<int?> GetEvseStation(string chargeboxId, CancellationToken token = default)
  151. {
  152. string getStationStrSql = """
  153. SELECT [StationId]
  154. FROM [dbo].[StationMachine]
  155. WHERE [ChargeBoxId] = @ChargeBoxIds;
  156. """;
  157. var parameters = new DynamicParameters();
  158. parameters.Add("@ChargeBoxIds", chargeboxId, direction: ParameterDirection.Input, size: 50);
  159. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  160. var stationId = await conn.QueryFirstOrDefaultAsync<int?>(new CommandDefinition(getStationStrSql, parameters, cancellationToken: token));
  161. return stationId;
  162. }
  163. internal async Task<Dictionary<string, int>> GetEvseStationPair(List<string> chargeboxIds)
  164. {
  165. string getStationStrSql = """
  166. SELECT [StationId],[ChargeBoxId]
  167. FROM [dbo].[StationMachine]
  168. WHERE [ChargeBoxId] IN @ChargeBoxIds;
  169. """;
  170. var parameters = new DynamicParameters();
  171. parameters.Add("@ChargeBoxIds", chargeboxIds, direction: ParameterDirection.Input, size: 50);
  172. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  173. var configs = await conn.QueryAsync<StationMachine>(getStationStrSql, parameters);
  174. return configs.ToDictionary(x => x.ChargeBoxId, x => x.StationId);
  175. }
  176. internal async Task<Dictionary<int, Dictionary<string, string>>> GetStationEvseConfigs(List<int> stationIds, CancellationToken token = default)
  177. {
  178. string getSql = """
  179. SELECT [StationId],[ConfigureName],[ConfigureSetting]
  180. FROM [dbo].[StationMachine]
  181. WHERE [StationId] in @StationIds
  182. """;
  183. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  184. var parameters = new DynamicParameters();
  185. parameters.Add("@StationIds", stationIds, direction: ParameterDirection.Input);
  186. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(getSql, parameters, cancellationToken: token));
  187. return configs
  188. .GroupBy(x => x.StationId)
  189. .ToDictionary(
  190. x => x.Key,
  191. x => x.ToDictionary(
  192. x => x.ConfigureName,
  193. x => x.ConfigureSetting
  194. ));
  195. }
  196. internal async Task<Dictionary<int, Dictionary<string, string>>> GetStationEvseConfigs(CancellationToken token = default)
  197. {
  198. string getSql = """
  199. SELECT [StationId],[ConfigureName],[ConfigureSetting]
  200. FROM [dbo].[StationMachineConfig]
  201. """;
  202. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  203. try
  204. {
  205. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(getSql, cancellationToken: token));
  206. return configs
  207. .GroupBy(x => x.StationId)
  208. .ToDictionary(
  209. x => x.Key,
  210. x => x.ToDictionary(
  211. x => x.ConfigureName,
  212. x => x.ConfigureSetting
  213. ));
  214. }
  215. catch(Exception e)
  216. {
  217. logger.LogWarning("StationMachineConfig get failed");
  218. return new Dictionary<int, Dictionary<string, string>>();
  219. }
  220. }
  221. internal async Task<bool> GetStationIsPeriodEnergyRequired(string chargeBoxId, CancellationToken token = default)
  222. {
  223. var stationId = await GetEvseStation(chargeBoxId, token);
  224. if (stationId is null)
  225. {
  226. return false;
  227. }
  228. string getSql = """
  229. SELECT [IsPeriodEnergyRequired]
  230. FROM [dbo].[Station]
  231. WHERE [Id] = @StationId
  232. """;
  233. var parameters = new DynamicParameters();
  234. parameters.Add("@StationId", stationId, direction: ParameterDirection.Input);
  235. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  236. try
  237. {
  238. bool? isPeriodEnergyRequired = await conn.QueryFirstOrDefaultAsync<bool?>(new CommandDefinition(getSql, parameters, cancellationToken: token));
  239. return isPeriodEnergyRequired is null ? false : isPeriodEnergyRequired.Value;
  240. }
  241. catch (Exception e)
  242. {
  243. logger.LogWarning(e.Message);
  244. logger.LogWarning(e.StackTrace);
  245. return true;
  246. }
  247. }
  248. internal async Task UpdateProtocalVersion(string chargeBoxId, CancellationToken token = default)
  249. {
  250. string setSql = """
  251. UPDATE [dbo].[StationMachine]
  252. SET [ChargerProtocol] = '1.6'
  253. WHERE [ChargeBoxId] = @ChargeBoxId
  254. """;
  255. var parameters = new DynamicParameters();
  256. parameters.Add("@ChargeBoxId", chargeBoxId, direction: ParameterDirection.Input);
  257. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  258. try
  259. {
  260. int rows = await conn.ExecuteAsync(new CommandDefinition(setSql, parameters, cancellationToken: token));
  261. }
  262. catch (Exception e)
  263. {
  264. logger.LogWarning(e.Message);
  265. logger.LogWarning(e.StackTrace);
  266. }
  267. }
  268. }