ChargePointService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. using Dapper;
  2. using EVCB_OCPP.Packet.Messages.SubTypes;
  3. using EVCB_OCPP.WEBAPI.Models;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Configuration;
  7. using System.Data;
  8. using System.Data.SqlClient;
  9. using System.Linq;
  10. using System.Web;
  11. namespace EVCB_OCPP.WEBAPI.Services
  12. {
  13. public interface IChargePointService
  14. {
  15. int GetNumberofConnectors(string chargeBoxId);
  16. }
  17. public class ChargePointService : IChargePointService
  18. {
  19. string mainConnectionString = ConfigurationManager.ConnectionStrings["MainDBContext"].ConnectionString;
  20. public int GetNumberofConnectors(string chargeBoxId)
  21. {
  22. int count = 0;
  23. if (string.IsNullOrEmpty(chargeBoxId)) return -1;
  24. if (Exists(chargeBoxId))
  25. {
  26. var parameters = new DynamicParameters();
  27. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  28. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  29. {
  30. string strSql = "Select GunAmt from [dbo].[Machine] where ChargeBoxId=@ChargeBoxId; ";
  31. count = conn.ExecuteScalarAsync<int>(strSql, parameters, null, EVCBConfiguration.DB_DefaultConnectionTimeout).Result;
  32. }
  33. }
  34. return count;
  35. }
  36. public bool Exists(string chargeBoxId)
  37. {
  38. bool exists = false;
  39. if (string.IsNullOrEmpty(chargeBoxId)) return exists;
  40. var parameters = new DynamicParameters();
  41. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  42. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  43. {
  44. string strSql = "Select count(*) from [dbo].[Machine] where ChargeBoxId=@ChargeBoxId; ";
  45. exists = conn.ExecuteScalar<bool>(strSql, parameters, null, EVCBConfiguration.DB_DefaultConnectionTimeout);
  46. }
  47. return exists;
  48. }
  49. public int GetConnectorwithOngoingTransaction(string chargeBoxId, int transactionId)
  50. {
  51. int connectorId = -1;
  52. if (string.IsNullOrEmpty(chargeBoxId)) return connectorId;
  53. var parameters = new DynamicParameters();
  54. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  55. parameters.Add("@TransactionId", transactionId, DbType.Int32, ParameterDirection.Input);
  56. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  57. {
  58. string strSql = "Select ConnectorId from [dbo].[TransactionRecord] where ChargeBoxId=@ChargeBoxId and Id= @TransactionId and StopTime='1991/01/01'; ";
  59. connectorId = conn.Query<Int32>(strSql, parameters).FirstOrDefault();
  60. }
  61. return connectorId;
  62. }
  63. public bool IsTransactionRunning(string chargeBoxId, int transactionId)
  64. {
  65. bool exists = false;
  66. if (string.IsNullOrEmpty(chargeBoxId)) return exists;
  67. var parameters = new DynamicParameters();
  68. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  69. parameters.Add("@TransactionId", transactionId, DbType.Int32, ParameterDirection.Input);
  70. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  71. {
  72. string strSql = "Select Id from [dbo].[TransactionRecord] where ChargeBoxId=@ChargeBoxId and Id= @TransactionId and StopTime='1991/01/01'; ";
  73. int id = conn.Query<Int32>(strSql, parameters).FirstOrDefault();
  74. exists = id > 0 ? true : false;
  75. }
  76. return exists;
  77. }
  78. /// <summary>
  79. /// 取得電樁或充電槍的狀態
  80. /// </summary>
  81. /// <param name="chargeBoxId">Charge Box Id</param>
  82. /// <param name="connectorId">充電槍號(0代表樁/槍號從1開始)</param>
  83. /// <returns>依據OCPP狀態回覆 NULL表示離線</returns>
  84. public ChargePointStatus? GetChargePointCurrentSatus(string chargeBoxId, int connectorId = 0)
  85. {
  86. ChargePointStatus? _status = null;
  87. if (string.IsNullOrEmpty(chargeBoxId)) return _status;
  88. var parameters = new DynamicParameters();
  89. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  90. parameters.Add("@ConnectorId", connectorId, DbType.Int32, ParameterDirection.Input);
  91. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  92. {
  93. string strSql = "Select online from [dbo].[Machine] where ChargeBoxId=@ChargeBoxId; ";
  94. bool online = conn.ExecuteScalar<bool>(strSql, parameters, null, EVCBConfiguration.DB_DefaultConnectionTimeout);
  95. if (online)
  96. {
  97. string connectorStrSql = "Select Status from [dbo].[ConnectorStatus] where ChargeBoxId=@ChargeBoxId and ConnectorId=@ConnectorId; ";
  98. int _statusfromdb = conn.Query<Int32>(connectorStrSql, parameters).FirstOrDefault();
  99. _status = (_statusfromdb <= 0 && connectorId == 0) ? ChargePointStatus.Available : (_statusfromdb <= 0 ? ((ChargePointStatus?)null) : ((ChargePointStatus)_statusfromdb));
  100. }
  101. }
  102. return _status;
  103. }
  104. public bool IsOnline(string chargeBoxId)
  105. {
  106. bool online = false;
  107. if (string.IsNullOrEmpty(chargeBoxId)) return online;
  108. var parameters = new DynamicParameters();
  109. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  110. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  111. {
  112. string strSql = "Select online from [dbo].[Machine] where ChargeBoxId=@ChargeBoxId; ";
  113. online = conn.ExecuteScalar<bool>(strSql, parameters, null, EVCBConfiguration.DB_DefaultConnectionTimeout);
  114. }
  115. return online;
  116. }
  117. public bool ContainsChargePoint(string chargeBoxId, string customerId)
  118. {
  119. bool existed = false;
  120. if (string.IsNullOrEmpty(chargeBoxId)) return existed;
  121. var parameters = new DynamicParameters();
  122. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  123. parameters.Add("@CustomerId", customerId, DbType.String, ParameterDirection.Input);
  124. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  125. {
  126. string strSql = "Select Count(*) from [dbo].[Machine] where ChargeBoxId=@ChargeBoxId and CustomerId=@CustomerId; ";
  127. existed = conn.ExecuteScalar<bool>(strSql, parameters, null, EVCBConfiguration.DB_DefaultConnectionTimeout);
  128. }
  129. return existed;
  130. }
  131. public List<ConnectorMeterValue> GetActiveSessionInfo(string chargeBoxId, string sessionId, List<Measurand> requiredMeasurands)
  132. {
  133. List<ConnectorMeterValue> meterValues = new List<ConnectorMeterValue>();
  134. ConnectorMeterValueModel meterModel = null;
  135. if (string.IsNullOrEmpty(chargeBoxId)) return meterValues;
  136. for (int i = 0; i < requiredMeasurands.Count; i++)
  137. {
  138. var parameters = new DynamicParameters();
  139. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  140. parameters.Add("@TransactionId", sessionId, DbType.String, ParameterDirection.Input);
  141. parameters.Add("@MeasurandId", requiredMeasurands[i], DbType.String, ParameterDirection.Input);
  142. try
  143. {
  144. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  145. {
  146. string date = DateTime.UtcNow.ToString("yyMMdd");
  147. string strSql = "Select Top(1) * from [dbo].[ConnectorMeterValueRecord" + date + "] where ChargeBoxId=@ChargeBoxId and Id=@TransactionId and MeasurandId=@MeasurandId order by CreatedOn desc;";
  148. meterModel = conn.Query<ConnectorMeterValueModel>(strSql, parameters, null, true, EVCBConfiguration.DB_DefaultConnectionTimeout).FirstOrDefault();
  149. }
  150. if (meterModel != null)
  151. {
  152. meterValues.Add(new ConnectorMeterValue()
  153. {
  154. ChargeBoxId = meterModel.ChargeBoxId,
  155. ConnectorId = meterModel.ConnectorId,
  156. CreatedOn = meterModel.CreatedOn,
  157. Context = meterModel.ContextId < 1 ? (ReadingContext?)null : (ReadingContext?)meterModel.ContextId,
  158. Format = meterModel.FormatId < 1 ? (ValueFormat?)null : (ValueFormat?)meterModel.FormatId,
  159. Location = meterModel.LocationId < 1 ? (Location?)null : (Location?)meterModel.LocationId,
  160. Measurand = meterModel.MeasurandId < 1 ? (Measurand?)null : (Measurand?)meterModel.MeasurandId,
  161. Phase = meterModel.PhaseId < 1 ? (Phase?)null : (Phase?)meterModel.PhaseId,
  162. Unit = meterModel.UnitId < 1 ? (UnitOfMeasure?)UnitOfMeasure.Wh : (UnitOfMeasure?)meterModel.UnitId,
  163. Value = meterModel.Value,
  164. TransactionId = meterModel.TransactionId
  165. });
  166. }
  167. }
  168. catch
  169. {
  170. break;
  171. }
  172. }
  173. return meterValues;
  174. }
  175. public SessionDetail GetSessionDetail(string chargeBoxId, string sessionId)
  176. {
  177. SessionDetail detail = null;
  178. TransactionRecordModel transactionModel = null;
  179. if (string.IsNullOrEmpty(chargeBoxId)) return detail;
  180. var parameters = new DynamicParameters();
  181. parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
  182. parameters.Add("@TransactionId", sessionId, DbType.String, ParameterDirection.Input);
  183. try
  184. {
  185. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  186. {
  187. string date = DateTime.UtcNow.ToString("yyMMdd");
  188. string strSql = "Select Top(1) * from [dbo].[TransactionRecord] where ChargeBoxId=@ChargeBoxId and Id=@TransactionId and StopTime!='1991-01-01 00:00:00.000' ;";
  189. transactionModel = conn.Query<TransactionRecordModel>(strSql, parameters, null, true, EVCBConfiguration.DB_DefaultConnectionTimeout).FirstOrDefault();
  190. }
  191. if (transactionModel != null)
  192. {
  193. detail = new SessionDetail()
  194. {
  195. ConnectorId = (int)transactionModel.ConnectorId,
  196. IdTag = transactionModel.StartIdTag,
  197. MeterStart = transactionModel.MeterStart,
  198. MeterStop = transactionModel.MeterStop,
  199. StartTime = transactionModel.StartTime.ToString(EVCBConfiguration.UTC_DATETIMEFORMAT),
  200. StopTime = transactionModel.StopTime.ToString(EVCBConfiguration.UTC_DATETIMEFORMAT),
  201. StopReason = transactionModel.StopReasonId < 1 ? Reason.Local : (Reason)transactionModel.StopReasonId
  202. };
  203. }
  204. }
  205. catch
  206. {
  207. }
  208. return detail;
  209. }
  210. }
  211. }