WebDbService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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>(displayPricestrSql, parameters);
  85. if (result == default)
  86. {
  87. client.IsBilling = false;
  88. return string.Empty;
  89. }
  90. var stationPrice = result;//.First();
  91. if (stationPrice.BillingMethod == 1)
  92. {
  93. var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
  94. client.ChargingPrices = chargingPriceResult.ToList();
  95. if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
  96. {
  97. client.ChargingPrices = new List<ChargingPrice>();
  98. }
  99. }
  100. displayPriceText = stationPrice.FeeName;
  101. client.BillingMethod = stationPrice.BillingMethod;
  102. client.Currency = stationPrice.Currency;
  103. client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
  104. client.ParkingFee = stationPrice.ParkingFee;
  105. client.IsBilling = true;
  106. }
  107. }
  108. catch (Exception ex)
  109. {
  110. logger.LogError("SetDefaultFee", ex.ToString());
  111. }
  112. return displayPriceText;
  113. }
  114. internal async Task<Dictionary<string, string>> GetCustomerStationEvseConfig(string chargeBoxId, CancellationToken token = default)
  115. {
  116. string strSql = """
  117. SELECT [ConfigureName], [ConfigureSetting]
  118. FROM [dbo].[StationMachine]
  119. INNER Join [dbo].[StationMachineConfig] on [dbo].[StationMachine].StationId = [dbo].[StationMachineConfig].StationId
  120. WHERE [ChargeBoxId] = @ChargeBoxId
  121. """;
  122. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  123. DynamicParameters parameters = new DynamicParameters();
  124. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input, 50);
  125. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(strSql, parameters: parameters, cancellationToken: token));
  126. return configs.ToDictionary(x=>x.ConfigureName, x=>x.ConfigureSetting);
  127. }
  128. internal async Task<Dictionary<string, string>> GetEvseStationConfig(int stationId, CancellationToken token = default)
  129. {
  130. string strSql = """
  131. SELECT [ConfigureName], [ConfigureSetting]
  132. FROM [dbo].[StationMachineConfig]
  133. WHERE [StationId] = @StationId
  134. """;
  135. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  136. DynamicParameters parameters = new DynamicParameters();
  137. parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
  138. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(strSql, parameters: parameters, cancellationToken: token));
  139. return configs.ToDictionary(x => x.ConfigureName, x => x.ConfigureSetting);
  140. }
  141. internal async Task<int?> GetEvseStation(string chargeboxId, CancellationToken token = default)
  142. {
  143. string getStationStrSql = """
  144. SELECT [StationId]
  145. FROM [dbo].[StationMachine]
  146. WHERE [ChargeBoxId] = @ChargeBoxIds;
  147. """;
  148. var parameters = new DynamicParameters();
  149. parameters.Add("@ChargeBoxIds", chargeboxId, direction: ParameterDirection.Input, size: 50);
  150. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  151. var stationId = await conn.QueryFirstOrDefaultAsync<int?>(new CommandDefinition(getStationStrSql, parameters, cancellationToken: token));
  152. return stationId;
  153. }
  154. internal async Task<Dictionary<string, int>> GetEvseStationPair(List<string> chargeboxIds)
  155. {
  156. string getStationStrSql = """
  157. SELECT [StationId],[ChargeBoxId]
  158. FROM [dbo].[StationMachine]
  159. WHERE [ChargeBoxId] IN @ChargeBoxIds;
  160. """;
  161. var parameters = new DynamicParameters();
  162. parameters.Add("@ChargeBoxIds", chargeboxIds, direction: ParameterDirection.Input, size: 50);
  163. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  164. var configs = await conn.QueryAsync<StationMachine>(getStationStrSql, parameters);
  165. return configs.ToDictionary(x => x.ChargeBoxId, x => x.StationId);
  166. }
  167. internal async Task<Dictionary<int, Dictionary<string, string>>> GetStationEvseConfigs(List<int> stationIds, CancellationToken token = default)
  168. {
  169. string getSql = """
  170. SELECT [StationId],[ConfigureName],[ConfigureSetting]
  171. FROM [dbo].[StationMachine]
  172. WHERE [StationId] in @StationIds
  173. """;
  174. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  175. var parameters = new DynamicParameters();
  176. parameters.Add("@StationIds", stationIds, direction: ParameterDirection.Input);
  177. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(getSql, parameters, cancellationToken: token));
  178. return configs
  179. .GroupBy(x => x.StationId)
  180. .ToDictionary(
  181. x => x.Key,
  182. x => x.ToDictionary(
  183. x => x.ConfigureName,
  184. x => x.ConfigureSetting
  185. ));
  186. }
  187. internal async Task<Dictionary<int, Dictionary<string, string>>> GetStationEvseConfigs(CancellationToken token = default)
  188. {
  189. string getSql = """
  190. SELECT [StationId],[ConfigureName],[ConfigureSetting]
  191. FROM [dbo].[StationMachineConfig]
  192. """;
  193. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  194. try
  195. {
  196. var configs = await conn.QueryAsync<StationMachineConfig>(new CommandDefinition(getSql, cancellationToken: token));
  197. return configs
  198. .GroupBy(x => x.StationId)
  199. .ToDictionary(
  200. x => x.Key,
  201. x => x.ToDictionary(
  202. x => x.ConfigureName,
  203. x => x.ConfigureSetting
  204. ));
  205. }
  206. catch(Exception e)
  207. {
  208. logger.LogWarning("StationMachineConfig get failed");
  209. return new Dictionary<int, Dictionary<string, string>>();
  210. }
  211. }
  212. internal async Task<bool> GetStationIsPeriodEnergyRequired(string chargeBoxId, CancellationToken token = default)
  213. {
  214. var stationId = await GetEvseStation(chargeBoxId, token);
  215. if (stationId is null)
  216. {
  217. return false;
  218. }
  219. string getSql = """
  220. SELECT [IsPeriodEnergyRequired]
  221. FROM [dbo].[Station]
  222. WHERE [Id] = @StationId
  223. """;
  224. var parameters = new DynamicParameters();
  225. parameters.Add("@StationId", stationId, direction: ParameterDirection.Input);
  226. using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
  227. try
  228. {
  229. bool? isPeriodEnergyRequired = await conn.QueryFirstOrDefaultAsync<bool?>(new CommandDefinition(getSql, parameters, cancellationToken: token));
  230. return isPeriodEnergyRequired is null ? false : isPeriodEnergyRequired.Value;
  231. }
  232. catch (Exception e)
  233. {
  234. logger.LogWarning(e.Message);
  235. logger.LogWarning(e.StackTrace);
  236. return true;
  237. }
  238. }
  239. }