ServerTriggerService.cs 8.4 KB

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