ServerTriggerService.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using Dapper;
  2. using EVCB_OCPP.Packet.Features;
  3. using EVCB_OCPP.Packet.Messages;
  4. using EVCB_OCPP.Packet.Messages.SubTypes;
  5. using EVCB_OCPP.WEBAPI.Models.WebAPI;
  6. using Microsoft.Extensions.Configuration;
  7. using Newtonsoft.Json;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Data;
  11. using System.Linq;
  12. using System.Net;
  13. using Microsoft.Data.SqlClient;
  14. using EVCB_OCPP.WEBAPI.Helpers;
  15. using EVCB_OCPP.Domain;
  16. namespace EVCB_OCPP.WEBAPI.Services
  17. {
  18. public interface IServerTriggerService
  19. {
  20. void AddMessage(string ChargeBoxId, string uuid, IRequest request);
  21. }
  22. public enum Internal_ExecutionCode
  23. {
  24. Accepted = 1,
  25. Blocked,
  26. Expired,
  27. Invalid,
  28. ConcurrentTx,
  29. Scheduled,
  30. Inoperative,
  31. Operative,
  32. NotSupported,
  33. Unknown,
  34. RebootRequired,
  35. UnknownMessageId,
  36. UnknownVendorId,
  37. Idle,
  38. Uploaded,
  39. UploadFailed,
  40. Uploading,
  41. Downloaded,
  42. DownloadFailed,
  43. Downloading,
  44. Installing,
  45. InstallationFailed,
  46. Installed,
  47. Pending,
  48. Faulted,
  49. Occupied,
  50. Unavailable,
  51. Unlocked,
  52. UnlockFailed,
  53. VersionMismatch,
  54. Rejected,
  55. Failed,
  56. }
  57. public enum Internal_Actions
  58. {
  59. ChangeAvailability = 1,
  60. ChangeConfiguration,
  61. GetConfiguration,
  62. CancelReservation,
  63. ClearCache,
  64. ClearChargingProfile,
  65. GetCompositeSchedule,
  66. GetDiagnostics,
  67. GetLocalListVersion,
  68. RemoteStartTransaction,
  69. RemoteStopTransaction,
  70. ReserveNow,
  71. Reset,
  72. SendLocalList,
  73. SetChargingProfile,
  74. TriggerMessage,
  75. UnlockConnector,
  76. DataTransfer
  77. }
  78. public class ServerTriggerService : IServerTriggerService
  79. {
  80. private readonly SqlConnectionFactory<MainDBContext> mainDbConnectionFactory;
  81. //private readonly string mainConnectionString;
  82. public ServerTriggerService(SqlConnectionFactory<MainDBContext> mainDbConnectionFactory)
  83. {
  84. //mainConnectionString = configuration.GetConnectionString("MainDBContext");
  85. var dt = new DateTime(1991, 1, 1).AddHours(8).ToUniversalTime();
  86. long ticks = dt.Ticks;
  87. this.mainDbConnectionFactory = mainDbConnectionFactory;
  88. }
  89. public void AddMessage(string ChargeBoxId, string uuid, IRequest request)
  90. {
  91. string sql_MachineOperateRecord = "INSERT INTO [dbo].[MachineOperateRecord](SerialNo, RequestType, RequestContent,Status, CreatedOn, FinishedOn,"
  92. + " EVSE_Value, EVSE_Status, ChargeBoxId, Action, ReportedOn) VALUES (@SerialNo, @RequestType, @RequestContent, @Status, @CreatedOn, @FinishedOn, @EVSE_Value, "
  93. + "@EVSE_Status, @ChargeBoxId, @Action,@ReportedOn);";
  94. string sql_ServerMessage = "INSERT INTO [dbo].[ServerMessage] (SerialNo, OutAction, OutRequest, InMessage, CreatedOn, CreatedBy, ReceivedOn, ChargeBoxId" +
  95. ", UpdatedOn) VALUES (@SerialNo, @OutAction, @OutRequest, @InMessage, @CreatedOn, @CreatedBy, @ReceivedOn, @ChargeBoxId" +
  96. ", @UpdatedOn);";
  97. string key = string.Empty;
  98. var parameters = new DynamicParameters();
  99. parameters.Add("@ChargeBoxId", ChargeBoxId, DbType.String, ParameterDirection.Input);
  100. parameters.Add("@RequestType", 1, DbType.Int32, ParameterDirection.Input);
  101. parameters.Add("@RequestContent", JsonConvert.SerializeObject(request, EVCBConfiguration.JSONSERIALIZER_FORMAT), DbType.String, ParameterDirection.Input);
  102. parameters.Add("@Status", 0, DbType.Int32, ParameterDirection.Input);
  103. parameters.Add("@CreatedOn", DateTime.Now.ToUniversalTime(), DbType.DateTime, ParameterDirection.Input);
  104. parameters.Add("@FinishedOn", EVCBConfiguration.DefaultTime, DbType.DateTime, ParameterDirection.Input);
  105. parameters.Add("@EVSE_Value", string.Empty, DbType.String, ParameterDirection.Input);
  106. parameters.Add("@EVSE_Status", 0, DbType.Int32, ParameterDirection.Input);
  107. parameters.Add("@SerialNo", uuid, DbType.String, ParameterDirection.Input);
  108. parameters.Add("@Action", request.Action, DbType.String, ParameterDirection.Input);
  109. parameters.Add("@OutAction", request.Action, DbType.String, ParameterDirection.Input);
  110. parameters.Add("@OutRequest", JsonConvert.SerializeObject(request, EVCBConfiguration.JSONSERIALIZER_FORMAT), DbType.String, ParameterDirection.Input);
  111. parameters.Add("@InMessage", "", DbType.String, ParameterDirection.Input);
  112. parameters.Add("@CreatedOn", DateTime.Now.ToUniversalTime(), DbType.DateTime, ParameterDirection.Input);
  113. parameters.Add("@CreatedBy", "WebAPI", DbType.String, ParameterDirection.Input);
  114. parameters.Add("@ReceivedOn", EVCBConfiguration.DefaultTime, DbType.DateTime, ParameterDirection.Input);
  115. parameters.Add("@UpdatedOn", EVCBConfiguration.DefaultTime, DbType.DateTime, ParameterDirection.Input);
  116. parameters.Add("@ReportedOn", EVCBConfiguration.DefaultTime, DbType.DateTime, ParameterDirection.Input);
  117. using (SqlConnection conn = mainDbConnectionFactory.Create())
  118. {
  119. using (var transaction = conn.BeginTransaction())
  120. {
  121. try
  122. {
  123. conn.Execute(sql_MachineOperateRecord, parameters, transaction);
  124. conn.Execute(sql_ServerMessage, parameters, transaction);
  125. transaction.Commit();
  126. }
  127. catch
  128. {
  129. transaction.Rollback();
  130. throw;
  131. }
  132. }
  133. }
  134. }
  135. public ComandExecution GetExecution(string uuid, Internal_Actions action, string chargeBoxId)
  136. {
  137. if (string.IsNullOrEmpty(chargeBoxId) || string.IsNullOrEmpty(uuid)) return null;
  138. ComandExecution excution = new ComandExecution();
  139. try
  140. {
  141. var parameters = new DynamicParameters();
  142. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  143. parameters.Add("@SerialNo", uuid, DbType.String, ParameterDirection.Input);
  144. parameters.Add("@Action", action.ToString(), DbType.String, ParameterDirection.Input);
  145. MachineOperation operation = new MachineOperation();
  146. using (SqlConnection conn = mainDbConnectionFactory.Create())
  147. {
  148. string strSql = "Select Top(1) Status,EVSE_Value,EVSE_Status,Action from [dbo].[MachineOperateRecord] where ChargeBoxId=@ChargeBoxId and SerialNo=@SerialNo and Action=@Action; ";
  149. operation = conn.Query<MachineOperation>(strSql, parameters, null, true, EVCBConfiguration.DB_DefaultConnectionTimeout).FirstOrDefault();
  150. }
  151. if (operation.EVSE_Status > 0)
  152. {
  153. excution.IsRepliedbyEVSE = true;
  154. if (operation.Action == "GetLocalListVersion")
  155. {
  156. excution.Code = 1;
  157. excution.Detail = operation.EVSE_Value;
  158. }
  159. else
  160. {
  161. excution.Code = ConverttoCode(operation.EVSE_Value);
  162. excution.Code = excution.Code == -1 ? (operation.EVSE_Status == 1 ? 1 : (operation.EVSE_Status == 255 ? 254 : excution.Code)) : excution.Code;
  163. excution.Detail = operation.EVSE_Value;
  164. }
  165. }
  166. else
  167. {
  168. excution.IsRepliedbyEVSE = false;
  169. if (operation.Status == 0)
  170. {
  171. excution.Code = 0;
  172. //excution.IsWaited = true;
  173. excution.Detail = "Waited";
  174. }
  175. if (operation.Status == -1)
  176. {
  177. // excution.IsTimeout = true;
  178. excution.Code = 0;
  179. excution.Detail = "Timeout";
  180. }
  181. }
  182. }
  183. catch
  184. {
  185. excution = null;
  186. }
  187. return excution;
  188. }
  189. public int ConverttoCode(string statusName)
  190. {
  191. int code = -1;
  192. if (string.IsNullOrEmpty(statusName)) return code;
  193. var tt = AuthorizationStatus.Accepted.ToString();
  194. Internal_ExecutionCode result = Internal_ExecutionCode.Accepted;
  195. if (Enum.TryParse<Internal_ExecutionCode>(statusName, out result))
  196. {
  197. code = (int)result;
  198. }
  199. return code;
  200. }
  201. }
  202. }