ServerSetFeeJob.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using Dapper;
  2. using EVCB_OCPP.Domain;
  3. using EVCB_OCPP.Domain.Models.Database;
  4. using EVCB_OCPP.Packet.Features;
  5. using EVCB_OCPP.Packet.Messages.Core;
  6. using EVCB_OCPP.WSServer.Dto;
  7. using EVCB_OCPP.WSServer.Message;
  8. using Microsoft.EntityFrameworkCore;
  9. using Microsoft.Extensions.Configuration;
  10. using Microsoft.Extensions.Logging;
  11. using Newtonsoft.Json;
  12. using OCPPServer.Protocol;
  13. using Quartz;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Configuration;
  17. using System.Data;
  18. using System.Data.SqlClient;
  19. using System.Linq;
  20. using System.Text;
  21. using System.Threading.Tasks;
  22. namespace EVCB_OCPP.WSServer.Jobs
  23. {
  24. [DisallowConcurrentExecution]
  25. public class ServerSetFeeJob : IJob
  26. {
  27. private readonly ProtalServer protalServer;
  28. private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
  29. private readonly ILogger<ServerSetFeeJob> logger;
  30. private readonly string webConnectionString;
  31. public ServerSetFeeJob(
  32. ProtalServer protalServer,
  33. IConfiguration configuration,
  34. IDbContextFactory<MainDBContext> maindbContextFactory,
  35. ILogger<ServerSetFeeJob> logger)
  36. {
  37. this.protalServer = protalServer;
  38. this.maindbContextFactory = maindbContextFactory;
  39. this.logger = logger;
  40. this.webConnectionString = configuration.GetConnectionString("WebDBContext");
  41. }
  42. public async Task Execute(IJobExecutionContext context)
  43. {
  44. logger.LogDebug("{0} Started", nameof(ServerSetFeeJob));
  45. BasicMessageHandler msgAnalyser = new BasicMessageHandler();
  46. Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
  47. foreach (var item in _copyClientDic)
  48. {
  49. try
  50. {
  51. ClientData session = item.Value;
  52. if (!session.IsCheckIn)
  53. {
  54. continue;
  55. }
  56. string displayPriceText = await SetDefaultFee(session);
  57. if (string.IsNullOrEmpty(displayPriceText) || displayPriceText == session.DisplayPrice)
  58. {
  59. continue;
  60. }
  61. protalServer.UpdateClientDisplayPrice(item.Key, displayPriceText);
  62. var _CheckFeeDt = DateTime.UtcNow;
  63. using (var db = await maindbContextFactory.CreateDbContextAsync())
  64. {
  65. db.ServerMessage.Add(new ServerMessage()
  66. {
  67. ChargeBoxId = session.ChargeBoxId,
  68. CreatedBy = "Server",
  69. CreatedOn = _CheckFeeDt,
  70. OutAction = Actions.ChangeConfiguration.ToString(),
  71. OutRequest = JsonConvert.SerializeObject(
  72. new ChangeConfigurationRequest()
  73. {
  74. key = "DefaultPrice",
  75. value = displayPriceText
  76. },
  77. new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  78. SerialNo = Guid.NewGuid().ToString(),
  79. InMessage = string.Empty
  80. });
  81. if (session.CustomerId == new Guid("10C7F5BD-C89A-4E2A-8611-B617E0B41A73"))
  82. {
  83. db.ServerMessage.Add(new ServerMessage()
  84. {
  85. ChargeBoxId = session.ChargeBoxId,
  86. CreatedBy = "Server",
  87. CreatedOn = _CheckFeeDt,
  88. OutAction = Actions.ChangeConfiguration.ToString(),
  89. OutRequest = JsonConvert.SerializeObject(
  90. new ChangeConfigurationRequest()
  91. {
  92. key = "ConnectionTimeOut",
  93. value = "120"
  94. },
  95. new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  96. SerialNo = Guid.NewGuid().ToString(),
  97. InMessage = string.Empty
  98. });
  99. db.ServerMessage.Add(new ServerMessage()
  100. {
  101. ChargeBoxId = session.ChargeBoxId,
  102. CreatedBy = "Server",
  103. CreatedOn = _CheckFeeDt,
  104. OutAction = Actions.ChangeConfiguration.ToString(),
  105. OutRequest = JsonConvert.SerializeObject(
  106. new ChangeConfigurationRequest()
  107. {
  108. key = "MeterValueSampleInterval",
  109. value = "3"
  110. },
  111. new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
  112. SerialNo = Guid.NewGuid().ToString(),
  113. InMessage = string.Empty
  114. });
  115. }
  116. await db.SaveChangesAsync();
  117. }
  118. }
  119. catch (Exception ex)
  120. {
  121. logger.LogError("ServerSetFeeTrigger ChargeBoxId:{0} Ex:{1}", item.Key, ex.ToString());
  122. }
  123. }
  124. }
  125. async private Task<string> SetDefaultFee(ClientData client)
  126. {
  127. string displayPriceText = string.Empty;
  128. string charingPriceText = string.Empty;
  129. if (string.IsNullOrEmpty(client.ChargeBoxId)) return displayPriceText;
  130. using (SqlConnection conn = new SqlConnection(webConnectionString))
  131. {
  132. var parameters = new DynamicParameters();
  133. parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input);
  134. string displayPricestrSql = "";
  135. string strSql = "";
  136. if (client.IsAC)
  137. {
  138. displayPricestrSql = " SELECT [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour" +
  139. " ,[AC_ParkingFee] as ParkingFee, [Currency] FROM[StationMachine] left join[dbo].[Station]" +
  140. " on[StationMachine].StationId = Station.[Id] where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
  141. strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee] FROM[StationMachine] left join [dbo].[StationFee]" +
  142. " on[StationMachine].StationId = StationFee.StationId where StationMachine.MachineId =@MachineId and StationFee.IsAC=1; ";
  143. }
  144. else
  145. {
  146. displayPricestrSql = " SELECT [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour" +
  147. " ,[DC_ParkingFee] as ParkingFee, [Currency] FROM[StationMachine] left join[dbo].[Station]" +
  148. " on[StationMachine].StationId = Station.[Id] where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
  149. strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee] FROM[StationMachine] left join [dbo].[StationFee]" +
  150. " on[StationMachine].StationId = StationFee.StationId where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; ";
  151. }
  152. var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
  153. if (result.Count() == 0)
  154. {
  155. return string.Empty;
  156. }
  157. var stationPrice = result.First();
  158. if (stationPrice.BillingMethod == 1)
  159. {
  160. var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
  161. client.ChargingPrices = chargingPriceResult.ToList();
  162. if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
  163. {
  164. client.ChargingPrices = new List<ChargingPrice>();
  165. }
  166. }
  167. displayPriceText = stationPrice.FeeName;
  168. client.BillingMethod = stationPrice.BillingMethod;
  169. client.Currency = stationPrice.Currency;
  170. client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
  171. client.ParkingFee = stationPrice.ParkingFee;
  172. client.IsBilling = true;
  173. }
  174. return displayPriceText;
  175. }
  176. }
  177. }