CPOController.cs 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809
  1. using EVCB_OCPP.WEBAPI.Handlers;
  2. using EVCB_OCPP.WEBAPI.Models.WebAPI;
  3. using EVCB_OCPP.WEBAPI.Services;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Net;
  8. using Newtonsoft.Json;
  9. using System.Threading.Tasks;
  10. using EVCB_OCPP.WEBAPI.Models.WebAPI.Dto;
  11. using EVCB_OCPP.Packet.Messages.SubTypes;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.AspNetCore.Http.Extensions;
  15. using Microsoft.Extensions.Configuration;
  16. using Microsoft.Extensions.DependencyInjection;
  17. using Microsoft.Extensions.Logging;
  18. using System.Diagnostics;
  19. namespace EVCB_OCPP.WEBAPI.Controllers.Version1
  20. {
  21. //[ApiExplorerSettings(IgnoreApi = true)]
  22. [ServiceFilter(typeof(CPOAuthentication))]
  23. //[CPOAuthentication]
  24. [ApiController]
  25. [Route("api/v1/cpo")]
  26. public class CPOController : ControllerBase
  27. {
  28. private readonly IServiceProvider serviceProvider;
  29. private readonly ILogger<CPOController> logger;
  30. public CPOController(IServiceProvider serviceProvider, IConfiguration configuration, ILogger<CPOController> logger)
  31. {
  32. this.serviceProvider = serviceProvider;
  33. this.logger = logger;
  34. }
  35. [Route("station")]
  36. [HttpGet]
  37. public async Task<IActionResult> Station()
  38. {
  39. var result = new CPOOuterResponse();
  40. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  41. int statusCode = StatusCodes.Status500InternalServerError;
  42. try
  43. {
  44. if (Request.Headers.ContainsKey(EVCBConfiguration.Header_PartnerId))
  45. {
  46. var _customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  47. ChargingStationService _service = serviceProvider.GetRequiredService<ChargingStationService>();
  48. var _innerResponse = new { Stations = await _service.GetStationsbyCustomerIdAsync(_customerId) };
  49. result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  50. result.StatusCode = (int)CPO_StatusCode.Success;
  51. result.StatusMessage = CPO_StatusMessage.Success;
  52. //statusCode = HttpStatusCode.OK;
  53. statusCode = StatusCodes.Status200OK;
  54. }
  55. //return Request.CreateResponse(statusCode, result);
  56. return StatusCode(statusCode, result);
  57. }
  58. catch (Exception ex)
  59. {
  60. result.ErrorDetail = ex.ToString();
  61. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  62. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  63. //return Request.CreateResponse(statusCode, result);
  64. return StatusCode(statusCode, result);
  65. }
  66. finally
  67. {
  68. }
  69. }
  70. [Route("information")]
  71. [Produces(typeof(CPOOuterResponse))]
  72. [HttpGet]
  73. public IActionResult BasicInformationofEVSEs(int? Limit = -1, int StationId = -1, string ChargeBoxId = "", DateTime? DateFrom = null, DateTime? DateTo = null, int? Offset = 0)
  74. {
  75. var result = new CPOOuterResponse();
  76. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  77. int statusCode = StatusCodes.Status500InternalServerError;
  78. try
  79. {
  80. ChargePointService _CPService = serviceProvider.GetRequiredService<ChargePointService>();// new ChargePointService();
  81. var tt = _CPService.GetLastUpdatedTimebyMachineId("0da4f4a6-a952-46f0-b2f3-696385a9a56a");
  82. if (Request.Headers.ContainsKey(EVCBConfiguration.Header_PartnerId))
  83. {
  84. var _customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  85. var _innerResponse = new { EVSEs = new List<EVSE>() };
  86. ChargingStationService _stationService = serviceProvider.GetRequiredService<ChargingStationService>();// new ChargingStationService();
  87. if (StationId > -1)
  88. {
  89. if (_stationService.ContainsStation(_customerId, StationId))
  90. {
  91. if (DateTo.HasValue)
  92. {
  93. if (!DateFrom.HasValue)
  94. {
  95. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_PARAMETER_OUTOFRANGE_INCORRECT;
  96. result.StatusCode = (int)CPO_StatusCode.PARAMETER_OUTOFRANGE_INCORRECT;
  97. //statusCode = HttpStatusCode.BadRequest;
  98. statusCode = StatusCodes.Status400BadRequest;
  99. //return Request.CreateResponse(statusCode, result);
  100. return StatusCode(statusCode, result);
  101. }
  102. }
  103. _innerResponse = new { EVSEs = _stationService.GetEVSEsbyStationId(StationId, DateFrom, DateTo, Offset.Value, Limit == -1 ? 1000 : Limit.Value) };
  104. }
  105. }
  106. else
  107. {
  108. _innerResponse = new { EVSEs = new List<EVSE>() };
  109. _innerResponse.EVSEs.Add(_CPService.GetEVSEsbyChargeBoxId(ChargeBoxId, DateFrom, DateTo));
  110. }
  111. result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  112. result.StatusCode = (int)CPO_StatusCode.Success;
  113. result.StatusMessage = CPO_StatusMessage.Success;
  114. //statusCode = HttpStatusCode.OK;
  115. statusCode = StatusCodes.Status200OK;
  116. }
  117. //return Request.CreateResponse(statusCode, result);
  118. return StatusCode(statusCode, result);
  119. }
  120. catch (Exception ex)
  121. {
  122. result.ErrorDetail = ex.ToString();
  123. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  124. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  125. //return Request.CreateResponse(statusCode, result);
  126. return StatusCode(statusCode, result);
  127. }
  128. }
  129. [Route("commands/start_session")]
  130. [Produces(typeof(CPOOuterResponse))]
  131. [HttpPost]
  132. async public Task<IActionResult> StartSession([FromBody] StartSessionRequest request)
  133. {
  134. var result = new CPOOuterResponse();
  135. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  136. int statusCode = StatusCodes.Status500InternalServerError;
  137. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  138. try
  139. {
  140. string _CustomerId = string.Empty;
  141. if (!ContainsChargePoint(request.ChargeBoxId, out _CustomerId))
  142. {
  143. // 沒槍~ 沒得充...
  144. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  145. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  146. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  147. //statusCode = HttpStatusCode.BadRequest;
  148. statusCode = StatusCodes.Status400BadRequest;
  149. //return Request.CreateResponse(statusCode, result);
  150. return StatusCode(statusCode, result);
  151. }
  152. ChargePointService _CPService = serviceProvider.GetRequiredService<ChargePointService>();
  153. if (!string.IsNullOrEmpty(request.ChargeBoxId) && request.ChargeBoxId.Length <= 25 && (!request.ConnectorId.HasValue
  154. || (_CPService.GetNumberofConnectors(request.ChargeBoxId) >= request.ConnectorId && request.ConnectorId > 0))
  155. && !string.IsNullOrEmpty(request.Token) && request.Token.Length <= 20)
  156. {
  157. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  158. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  159. //trigger to charge
  160. var _request = new Models.WebAPI.StartTransactionRequest()
  161. {
  162. ConnectorId = request.ConnectorId,
  163. IdTag = request.Token
  164. };
  165. string urlformat = "{0}://{1}";
  166. var _innerResult = await _client.Post(
  167. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent())
  168. , $"/api/v1/ocpp16/transaction?ChargeBoxId={request.ChargeBoxId}"
  169. , new Dictionary<string, string>()
  170. {
  171. { "PartnerId",_CustomerId}
  172. }, _request, _customer.GetAPIKey(new Guid(_CustomerId)));
  173. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  174. result = GetErrorDescription(_innerResult);
  175. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  176. if (_innerResult.Status == HttpStatusCode.InternalServerError)
  177. {
  178. result.StatusCode = _innerResult.ErrorCode;
  179. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  180. //statusCode = HttpStatusCode.InternalServerError;
  181. statusCode = StatusCodes.Status500InternalServerError;
  182. }
  183. else
  184. {
  185. result.SerialNo = _innerResult.SerialNo;
  186. result.StatusCode = _innerResult.ErrorCode;
  187. result.StatusMessage = _innerResult.Message;
  188. //statusCode = HttpStatusCode.OK;
  189. statusCode = StatusCodes.Status200OK;
  190. }
  191. }
  192. else
  193. {
  194. // 參數不符合定義
  195. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_PARAMETER_OUTOFRANGE_INCORRECT;
  196. result.StatusCode = (int)CPO_StatusCode.PARAMETER_OUTOFRANGE_INCORRECT;
  197. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  198. //statusCode = HttpStatusCode.BadRequest;
  199. statusCode = StatusCodes.Status400BadRequest;
  200. }
  201. //return Request.CreateResponse(statusCode, result);
  202. return StatusCode(statusCode, result);
  203. }
  204. catch (Exception ex)
  205. {
  206. result.ErrorDetail = ex.ToString();
  207. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  208. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  209. //return Request.CreateResponse(statusCode, result);
  210. return StatusCode(statusCode, result);
  211. }
  212. }
  213. [Route("commands/stop_session")]
  214. [Produces(typeof(CPOOuterResponse))]
  215. [HttpPost]
  216. async public Task<IActionResult> StopSession(string ChargeBoxId, int SessionId)
  217. {
  218. var result = new CPOOuterResponse();
  219. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  220. int statusCode = StatusCodes.Status500InternalServerError;
  221. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  222. try
  223. {
  224. string _CustomerId = string.Empty;
  225. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  226. {
  227. // 沒槍~ 沒得充...
  228. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  229. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  230. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  231. //statusCode = HttpStatusCode.BadRequest;
  232. statusCode = StatusCodes.Status400BadRequest;
  233. //return Request.CreateResponse(statusCode, result);
  234. return StatusCode(statusCode, result);
  235. }
  236. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  237. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  238. string urlformat = "{0}://{1}";
  239. var _innerResult = await _client.Put(
  240. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent() ),
  241. $"/api/v1/ocpp16/transaction?ChargeBoxId={ChargeBoxId}&TransactionId={SessionId}",
  242. new Dictionary<string, string>()
  243. {
  244. { "PartnerId",_CustomerId}
  245. },
  246. null,
  247. _customer.GetAPIKey(new Guid(_CustomerId)));
  248. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  249. result = GetErrorDescription(_innerResult);
  250. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  251. if (_innerResult.Success)
  252. {
  253. result.SerialNo = _innerResult.SerialNo;
  254. result.StatusCode = (int)CPO_StatusCode.Success;
  255. result.StatusMessage = CPO_StatusMessage.Success;
  256. //statusCode = HttpStatusCode.OK;
  257. statusCode = StatusCodes.Status200OK;
  258. }
  259. else
  260. {
  261. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  262. {
  263. result.StatusCode = _innerResult.ErrorCode;
  264. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  265. //statusCode = HttpStatusCode.BadRequest;
  266. statusCode = StatusCodes.Status400BadRequest;
  267. }
  268. else
  269. {
  270. result.StatusCode = _innerResult.ErrorCode;
  271. result.StatusMessage = _innerResult.Message;
  272. //statusCode = HttpStatusCode.BadRequest;
  273. statusCode = StatusCodes.Status400BadRequest;
  274. }
  275. }
  276. }
  277. catch (Exception ex)
  278. {
  279. result.ErrorDetail = ex.ToString();
  280. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  281. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  282. //return Request.CreateResponse(statusCode, result);
  283. return StatusCode(statusCode, result);
  284. }
  285. //return Request.CreateResponse(statusCode, result);
  286. return StatusCode(statusCode, result);
  287. }
  288. [Route("commands/reserve_now")]
  289. [Produces(typeof(CPOOuterResponse))]
  290. [HttpPost]
  291. async public Task<IActionResult> ReserveNow([FromBody] ReserveNowRequest request)
  292. {
  293. var result = new CPOOuterResponse();
  294. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  295. int statusCode = StatusCodes.Status500InternalServerError;
  296. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  297. try
  298. {
  299. string _CustomerId = string.Empty;
  300. if (!ContainsChargePoint(request.ChargeBoxId, out _CustomerId))
  301. {
  302. // 沒槍~ 沒得充...
  303. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  304. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  305. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  306. //statusCode = HttpStatusCode.BadRequest;
  307. statusCode = StatusCodes.Status400BadRequest;
  308. //return Request.CreateResponse(statusCode, result);
  309. return StatusCode(statusCode, result);
  310. }
  311. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  312. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  313. string urlformat = "{0}://{1}";
  314. var _innerRequest = new ReserveRequest()
  315. {
  316. ConnectorId = request.ConnectorId,
  317. IdTag = request.Token,
  318. ReservationId = request.ReservationId,
  319. ExpiryDate = request.ExpiryDate.ToString(EVCBConfiguration.UTC_DATETIMEFORMAT)
  320. };
  321. var _innerResult = await _client.Post(
  322. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  323. $"/api/v1/ocpp16/reservation?ChargeBoxId={request.ChargeBoxId}",
  324. new Dictionary<string, string>()
  325. {
  326. { "PartnerId",_CustomerId}
  327. },
  328. _innerRequest,
  329. _customer.GetAPIKey(new Guid(_CustomerId)));
  330. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  331. result = GetErrorDescription(_innerResult);
  332. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  333. if (_innerResult.Success)
  334. {
  335. result.SerialNo = _innerResult.SerialNo;
  336. result.StatusCode = (int)CPO_StatusCode.Success;
  337. result.StatusMessage = CPO_StatusMessage.Success;
  338. //statusCode = HttpStatusCode.OK;
  339. statusCode = StatusCodes.Status200OK;
  340. }
  341. else
  342. {
  343. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  344. {
  345. result.StatusCode = _innerResult.ErrorCode;
  346. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  347. //statusCode = HttpStatusCode.BadRequest;
  348. statusCode = StatusCodes.Status400BadRequest;
  349. }
  350. else
  351. {
  352. result.StatusCode = _innerResult.ErrorCode;
  353. result.StatusMessage = _innerResult.Message;
  354. //statusCode = HttpStatusCode.BadRequest;
  355. statusCode = StatusCodes.Status400BadRequest;
  356. }
  357. }
  358. }
  359. catch (Exception ex)
  360. {
  361. result.ErrorDetail = ex.ToString();
  362. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  363. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  364. //return Request.CreateResponse(statusCode, result);
  365. return StatusCode(statusCode, result);
  366. }
  367. //return Request.CreateResponse(statusCode, result);
  368. return StatusCode(statusCode, result);
  369. }
  370. [Route("commands/cancel_reservation")]
  371. [Produces(typeof(CPOOuterResponse))]
  372. [HttpPost]
  373. async public Task<IActionResult> CancelReservation(string ChargeBoxId, int ReservationId)
  374. {
  375. var result = new CPOOuterResponse();
  376. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  377. int statusCode = StatusCodes.Status500InternalServerError;
  378. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  379. try
  380. {
  381. string _CustomerId = string.Empty;
  382. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  383. {
  384. // 沒槍~ 沒得充...
  385. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  386. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  387. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  388. //statusCode = HttpStatusCode.BadRequest;
  389. statusCode = StatusCodes.Status400BadRequest;
  390. //return Request.CreateResponse(statusCode, result);
  391. return StatusCode(statusCode, result);
  392. }
  393. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  394. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  395. string urlformat = "{0}://{1}";
  396. var _innerResult = await _client.Delete(
  397. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  398. $"/api/v1/ocpp16/reservation?ChargeBoxId={ChargeBoxId}&ReservationId={ReservationId}",
  399. new Dictionary<string, string>()
  400. {
  401. { "PartnerId",_CustomerId}
  402. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  403. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  404. result = GetErrorDescription(_innerResult);
  405. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  406. if (_innerResult.Success)
  407. {
  408. result.SerialNo = _innerResult.SerialNo;
  409. result.StatusCode = (int)CPO_StatusCode.Success;
  410. result.StatusMessage = CPO_StatusMessage.Success;
  411. //statusCode = HttpStatusCode.OK;
  412. statusCode = StatusCodes.Status200OK;
  413. }
  414. else
  415. {
  416. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  417. {
  418. result.StatusCode = _innerResult.ErrorCode;
  419. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  420. //statusCode = HttpStatusCode.BadRequest;
  421. statusCode = StatusCodes.Status400BadRequest;
  422. }
  423. else
  424. {
  425. result.StatusCode = _innerResult.ErrorCode;
  426. result.StatusMessage = _innerResult.Message;
  427. //statusCode = HttpStatusCode.BadRequest;
  428. statusCode = StatusCodes.Status400BadRequest;
  429. }
  430. }
  431. }
  432. catch (Exception ex)
  433. {
  434. result.ErrorDetail = ex.ToString();
  435. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  436. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  437. //return Request.CreateResponse(statusCode, result);
  438. return StatusCode(statusCode, result);
  439. }
  440. //return Request.CreateResponse(statusCode, result);
  441. return StatusCode(statusCode, result);
  442. }
  443. [Route("commands/chargingprofiles")]
  444. [Produces(typeof(CPOOuterResponse))]
  445. [HttpGet]
  446. async public Task<IActionResult> GetActiveChargingProfile(string ChargeBoxId, int ConnectorId, int Duration, int ChargingRateUnit = -1)
  447. {
  448. var result = new CPOOuterResponse();
  449. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  450. int statusCode = StatusCodes.Status500InternalServerError;
  451. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  452. try
  453. {
  454. string _CustomerId = string.Empty;
  455. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  456. {
  457. // 沒槍~ 沒得充...
  458. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  459. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  460. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  461. //statusCode = HttpStatusCode.BadRequest;
  462. statusCode = StatusCodes.Status400BadRequest;
  463. //return Request.CreateResponse(statusCode, result);
  464. return StatusCode(statusCode, result);
  465. }
  466. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  467. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  468. string urlformat = "{0}://{1}";
  469. var _innerResult = await _client.Get(
  470. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  471. $"/api/v1/ocpp16/compositeschedule?ChargeBoxId={ChargeBoxId}&ConnectorId={ConnectorId}&Duration={Duration}&ChargingRateUnit={ChargingRateUnit}",
  472. new Dictionary<string, string>()
  473. {
  474. { "PartnerId",_CustomerId}
  475. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  476. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  477. result = GetErrorDescription(_innerResult);
  478. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  479. if (_innerResult.Success)
  480. {
  481. result.SerialNo = _innerResult.SerialNo;
  482. result.StatusCode = (int)CPO_StatusCode.Success;
  483. result.StatusMessage = CPO_StatusMessage.Success;
  484. //statusCode = HttpStatusCode.OK;
  485. statusCode = StatusCodes.Status200OK;
  486. }
  487. else
  488. {
  489. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  490. {
  491. result.StatusCode = _innerResult.ErrorCode;
  492. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  493. //statusCode = HttpStatusCode.BadRequest;
  494. statusCode = StatusCodes.Status400BadRequest;
  495. }
  496. else
  497. {
  498. result.StatusCode = _innerResult.ErrorCode;
  499. result.StatusMessage = _innerResult.Message;
  500. //statusCode = HttpStatusCode.BadRequest;
  501. statusCode = StatusCodes.Status400BadRequest;
  502. }
  503. }
  504. }
  505. catch (Exception ex)
  506. {
  507. result.ErrorDetail = ex.ToString();
  508. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  509. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  510. //return Request.CreateResponse(statusCode, result);
  511. return StatusCode(statusCode, result);
  512. }
  513. //return Request.CreateResponse(statusCode, result);
  514. return StatusCode(statusCode, result);
  515. }
  516. [Route("commands/chargingprofiles")]
  517. [Produces(typeof(CPOOuterResponse))]
  518. [HttpPut]
  519. async public Task<IActionResult> SetChargingProfile(string ChargeBoxId, [FromBody] ChargingProfileRequest request)
  520. {
  521. var result = new CPOOuterResponse();
  522. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  523. int statusCode = StatusCodes.Status500InternalServerError;
  524. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  525. try
  526. {
  527. string _CustomerId = string.Empty;
  528. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  529. {
  530. // 沒槍~ 沒得充...
  531. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  532. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  533. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  534. //statusCode = HttpStatusCode.BadRequest;
  535. statusCode = StatusCodes.Status400BadRequest;
  536. //return Request.CreateResponse(statusCode, result);
  537. return StatusCode(statusCode, result);
  538. }
  539. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  540. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  541. string urlformat = "{0}://{1}";
  542. var _innerResult = await _client.Post(
  543. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  544. $"/api/v1/ocpp16/chargingprofile?ChargeBoxId={ChargeBoxId}",
  545. new Dictionary<string, string>()
  546. {
  547. { "PartnerId", _CustomerId}
  548. },
  549. request,
  550. _customer.GetAPIKey(new Guid(_CustomerId)));
  551. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  552. result = GetErrorDescription(_innerResult);
  553. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  554. if (_innerResult.Success)
  555. {
  556. result.SerialNo = _innerResult.SerialNo;
  557. result.StatusCode = (int)CPO_StatusCode.Success;
  558. result.StatusMessage = CPO_StatusMessage.Success;
  559. //statusCode = HttpStatusCode.OK;
  560. statusCode = StatusCodes.Status200OK;
  561. }
  562. else
  563. {
  564. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  565. {
  566. result.StatusCode = _innerResult.ErrorCode;
  567. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  568. //statusCode = HttpStatusCode.BadRequest;
  569. statusCode = StatusCodes.Status400BadRequest;
  570. }
  571. else
  572. {
  573. result.StatusCode = _innerResult.ErrorCode;
  574. result.StatusMessage = _innerResult.Message;
  575. //statusCode = HttpStatusCode.BadRequest;
  576. statusCode = StatusCodes.Status400BadRequest;
  577. }
  578. }
  579. ChargePointService chargePointService = serviceProvider.GetRequiredService<ChargePointService>();
  580. if (!chargePointService.IsOnline(ChargeBoxId))
  581. {
  582. //return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse() { Code = 2101, Message = EVCBConfiguration.ERROR_MSG_CHARGEBOXID_ISNT_EXIST_OR_OFFLINE });
  583. return StatusCode(
  584. StatusCodes.Status400BadRequest,
  585. new ErrorResponse()
  586. {
  587. Code = 2101,
  588. Message = EVCBConfiguration.ERROR_MSG_CHARGEBOXID_ISNT_EXIST_OR_OFFLINE
  589. });
  590. }
  591. }
  592. catch (Exception ex)
  593. {
  594. result.ErrorDetail = ex.ToString();
  595. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  596. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  597. //return Request.CreateResponse(statusCode, result);
  598. return StatusCode(statusCode, result);
  599. }
  600. //return Request.CreateResponse(statusCode, result);
  601. return StatusCode(statusCode, result);
  602. }
  603. [Route("commands/chargingprofiles")]
  604. [Produces(typeof(CPOOuterResponse))]
  605. [HttpDelete]
  606. async public Task<IActionResult> ClearChargingPorfile(string ChargeBoxId, int ChargeProfileId = -1)
  607. {
  608. var result = new CPOOuterResponse();
  609. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  610. int statusCode = StatusCodes.Status500InternalServerError;
  611. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  612. try
  613. {
  614. string _CustomerId = string.Empty;
  615. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  616. {
  617. // 沒槍~ 沒得充...
  618. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  619. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  620. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  621. // statusCode = HttpStatusCode.BadRequest;
  622. statusCode = StatusCodes.Status400BadRequest;
  623. //return Request.CreateResponse(statusCode, result);
  624. return StatusCode(statusCode, result);
  625. }
  626. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  627. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  628. string urlformat = "{0}://{1}";
  629. var _innerResult = await _client.Delete(
  630. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  631. string.Format("/api/v1/ocpp16/chargingprofile?ChargeBoxId={2}{3}", ChargeBoxId, ChargeProfileId == -1 ? "" : "&Id=" + ChargeProfileId),
  632. new Dictionary<string, string>()
  633. {
  634. { "PartnerId",_CustomerId}
  635. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  636. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  637. result = GetErrorDescription(_innerResult);
  638. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  639. if (_innerResult.Success)
  640. {
  641. result.SerialNo = _innerResult.SerialNo;
  642. result.StatusCode = (int)CPO_StatusCode.Success;
  643. result.StatusMessage = CPO_StatusMessage.Success;
  644. //statusCode = HttpStatusCode.OK;
  645. statusCode = StatusCodes.Status200OK;
  646. }
  647. else
  648. {
  649. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  650. {
  651. result.StatusCode = _innerResult.ErrorCode;
  652. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  653. //statusCode = HttpStatusCode.BadRequest;
  654. statusCode = StatusCodes.Status400BadRequest;
  655. }
  656. else
  657. {
  658. result.StatusCode = _innerResult.ErrorCode;
  659. result.StatusMessage = _innerResult.Message;
  660. //statusCode = HttpStatusCode.BadRequest;
  661. statusCode = StatusCodes.Status400BadRequest;
  662. }
  663. }
  664. }
  665. catch (Exception ex)
  666. {
  667. result.ErrorDetail = ex.ToString();
  668. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  669. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  670. //return Request.CreateResponse(statusCode, result);
  671. return StatusCode(statusCode, result);
  672. }
  673. //return Request.CreateResponse(statusCode, result);
  674. return StatusCode(statusCode, result);
  675. }
  676. [Route("commands/set_locallist")]
  677. [Produces(typeof(CPOOuterResponse))]
  678. [HttpPost]
  679. async public Task<IActionResult> SendLocalList(string ChargeBoxId, [FromBody] LocalListRequest request)
  680. {
  681. var result = new CPOOuterResponse();
  682. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  683. int statusCode = StatusCodes.Status500InternalServerError;
  684. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  685. try
  686. {
  687. string _CustomerId = string.Empty;
  688. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  689. {
  690. // 沒槍~ 沒得充...
  691. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  692. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  693. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  694. //statusCode = HttpStatusCode.BadRequest;
  695. statusCode = StatusCodes.Status400BadRequest;
  696. //return Request.CreateResponse(statusCode, result);
  697. return StatusCode(statusCode, result);
  698. }
  699. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  700. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  701. string urlformat = "{0}://{1}";
  702. var _innerResult = await _client.Post(
  703. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  704. $"/api/v1/ocpp16/locallist?ChargeBoxId={ChargeBoxId}",
  705. new Dictionary<string, string>()
  706. {
  707. { "PartnerId",_CustomerId}
  708. }, request, _customer.GetAPIKey(new Guid(_CustomerId)));
  709. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  710. result = GetErrorDescription(_innerResult);
  711. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  712. if (_innerResult.Success)
  713. {
  714. result.SerialNo = _innerResult.SerialNo;
  715. result.StatusCode = (int)CPO_StatusCode.Success;
  716. result.StatusMessage = CPO_StatusMessage.Success;
  717. //statusCode = HttpStatusCode.OK;
  718. statusCode = StatusCodes.Status200OK;
  719. }
  720. else
  721. {
  722. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  723. {
  724. result.StatusCode = _innerResult.ErrorCode;
  725. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  726. //statusCode = HttpStatusCode.BadRequest;
  727. statusCode = StatusCodes.Status400BadRequest;
  728. }
  729. else
  730. {
  731. result.StatusCode = _innerResult.ErrorCode;
  732. result.StatusMessage = _innerResult.Message;
  733. //statusCode = HttpStatusCode.BadRequest;
  734. statusCode = StatusCodes.Status400BadRequest;
  735. }
  736. }
  737. }
  738. catch (Exception ex)
  739. {
  740. result.ErrorDetail = ex.ToString();
  741. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  742. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  743. //return Request.CreateResponse(statusCode, result);
  744. return StatusCode(statusCode, result);
  745. }
  746. //return Request.CreateResponse(statusCode, result);
  747. return StatusCode(statusCode, result);
  748. }
  749. [Route("commands/locallistversion")]
  750. [Produces(typeof(CPOOuterResponse))]
  751. [HttpGet]
  752. async public Task<IActionResult> GetLocalListVersion(string ChargeBoxId)
  753. {
  754. var result = new CPOOuterResponse();
  755. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  756. int statusCode = StatusCodes.Status500InternalServerError;
  757. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  758. try
  759. {
  760. string _CustomerId = string.Empty;
  761. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  762. {
  763. // 沒槍~ 沒得充...
  764. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  765. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  766. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  767. //statusCode = HttpStatusCode.BadRequest;
  768. statusCode = StatusCodes.Status400BadRequest;
  769. //return Request.CreateResponse(statusCode, result);
  770. return StatusCode(statusCode, result);
  771. }
  772. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  773. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  774. string urlformat = "{0}://{1}";
  775. var _innerResult = await _client.Get(
  776. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent() ),
  777. $"/api/v1/ocpp16/locallistversion?ChargeBoxId={ChargeBoxId}",
  778. new Dictionary<string, string>()
  779. {
  780. { "PartnerId",_CustomerId}
  781. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  782. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  783. result = GetErrorDescription(_innerResult);
  784. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  785. if (_innerResult.Success)
  786. {
  787. result.SerialNo = _innerResult.SerialNo;
  788. result.StatusCode = (int)CPO_StatusCode.Success;
  789. result.StatusMessage = CPO_StatusMessage.Success;
  790. //statusCode = HttpStatusCode.OK;
  791. statusCode = StatusCodes.Status200OK;
  792. }
  793. else
  794. {
  795. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  796. {
  797. result.StatusCode = _innerResult.ErrorCode;
  798. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  799. //statusCode = HttpStatusCode.BadRequest;
  800. statusCode = StatusCodes.Status400BadRequest;
  801. }
  802. else
  803. {
  804. result.StatusCode = _innerResult.ErrorCode;
  805. result.StatusMessage = _innerResult.Message;
  806. //statusCode = HttpStatusCode.BadRequest;
  807. statusCode = StatusCodes.Status400BadRequest;
  808. }
  809. }
  810. //statusCode = HttpStatusCode.OK;
  811. statusCode = StatusCodes.Status200OK;
  812. }
  813. catch (Exception ex)
  814. {
  815. result.ErrorDetail = ex.ToString();
  816. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  817. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  818. //return Request.CreateResponse(statusCode, result);
  819. return StatusCode(statusCode, result);
  820. }
  821. //return Request.CreateResponse(statusCode, result);
  822. return StatusCode(statusCode, result);
  823. }
  824. [Route("commands/results")]
  825. [Produces(typeof(CPOOuterResponse))]
  826. [HttpGet]
  827. async public Task<IActionResult> ExecutionofCmdSearch(string ChargeBoxId, CommandType? commandType, string SerialNo)
  828. {
  829. var result = new CPOOuterResponse();
  830. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  831. int statusCode = StatusCodes.Status500InternalServerError;
  832. try
  833. {
  834. string _CustomerId = string.Empty;
  835. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  836. {
  837. // 沒槍~ 沒得充...
  838. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  839. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  840. //statusCode = HttpStatusCode.BadRequest;
  841. statusCode = StatusCodes.Status400BadRequest;
  842. //return Request.CreateResponse(statusCode, result);
  843. return StatusCode(statusCode, result);
  844. }
  845. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  846. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  847. int? orderNo = (int?)null;
  848. switch (commandType.Value)
  849. {
  850. case CommandType.CancelReservation:
  851. {
  852. orderNo = 4;
  853. }
  854. break;
  855. case CommandType.ClearChargingProfile:
  856. {
  857. orderNo = 6;
  858. }
  859. break;
  860. case CommandType.GetAcitveChargingProfile:
  861. {
  862. orderNo = 7;
  863. }
  864. break;
  865. case CommandType.GetLocalListVersion:
  866. {
  867. orderNo = 9;
  868. }
  869. break;
  870. case CommandType.Start_Session:
  871. {
  872. orderNo = 10;
  873. }
  874. break;
  875. case CommandType.Stop_Session:
  876. {
  877. orderNo = 11;
  878. }
  879. break;
  880. case CommandType.Reserve_Now:
  881. {
  882. orderNo = 12;
  883. }
  884. break;
  885. case CommandType.SetLocalList:
  886. {
  887. orderNo = 14;
  888. }
  889. break;
  890. case CommandType.SetChargingProfile:
  891. {
  892. orderNo = 15;
  893. }
  894. break;
  895. default:
  896. {
  897. orderNo = 18;
  898. }
  899. break;
  900. }
  901. string urlformat = "{0}://{1}";
  902. var _innerResult = await _client.Get(
  903. string.Format(urlformat, Request.Scheme, Request.Host.ToUriComponent()),
  904. string.Format("/api/v1/ocpp16/command?ChargeBoxId={0}{1}&SerialNo={2}", ChargeBoxId, orderNo.HasValue ? "&OrderNo=" + orderNo.Value : "", SerialNo),
  905. new Dictionary<string, string>()
  906. {
  907. { "PartnerId",_CustomerId}
  908. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  909. result = GetErrorDescription(_innerResult);
  910. if (_innerResult.Success)
  911. {
  912. ComandExecution _execution = JsonConvert.DeserializeObject<ComandExecution>(_innerResult.Message);
  913. CommandResultType? _cmdResult = (CommandResultType?)null;
  914. switch (_execution.Code)
  915. {
  916. case 1:
  917. {
  918. _cmdResult = CommandResultType.Accepted;
  919. }
  920. break;
  921. case 9:
  922. {
  923. _cmdResult = CommandResultType.Notsupported;
  924. }
  925. break;
  926. case 10:
  927. {
  928. _cmdResult = CommandResultType.Unknown;
  929. }
  930. break;
  931. case 26:
  932. {
  933. _cmdResult = CommandResultType.Occupied;
  934. }
  935. break;
  936. case 31:
  937. {
  938. _cmdResult = CommandResultType.Rejected;
  939. }
  940. break;
  941. case 32:
  942. {
  943. _cmdResult = CommandResultType.Failed;
  944. }
  945. break;
  946. case 254:
  947. {
  948. _cmdResult = CommandResultType.EVSE_ERROR;
  949. }
  950. break;
  951. default:
  952. {
  953. if (_execution.Detail == "Timeout") _cmdResult = CommandResultType.Timeout;
  954. if (_execution.Detail == "Waited") _cmdResult = CommandResultType.Waited;
  955. }
  956. break;
  957. }
  958. if (!_cmdResult.HasValue)
  959. {
  960. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  961. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_RESULT;
  962. //statusCode = HttpStatusCode.NotFound;
  963. statusCode = StatusCodes.Status404NotFound;
  964. }
  965. else
  966. {
  967. var _innerData = new { Result = _cmdResult.Value.ToString(), Message = _execution.Detail };
  968. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  969. result.SerialNo = _innerResult.SerialNo;
  970. result.StatusCode = (int)CPO_StatusCode.Success;
  971. result.StatusMessage = CPO_StatusMessage.Success;
  972. //statusCode = HttpStatusCode.OK;
  973. statusCode = StatusCodes.Status200OK;
  974. }
  975. }
  976. }
  977. catch (Exception ex)
  978. {
  979. result.ErrorDetail = ex.ToString();
  980. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  981. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  982. //return Request.CreateResponse(statusCode, result);
  983. return StatusCode(statusCode, result);
  984. }
  985. //return Request.CreateResponse(statusCode, result);
  986. return StatusCode(statusCode, result);
  987. }
  988. [Route("version")]
  989. [Produces(typeof(CPOOuterResponse))]
  990. [HttpGet]
  991. public IActionResult Version(string ChargeBoxId)
  992. {
  993. var result = new CPOOuterResponse();
  994. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  995. int statusCode = StatusCodes.Status500InternalServerError;
  996. try
  997. {
  998. ChargePointService _service = serviceProvider.GetRequiredService<ChargePointService>();
  999. string version = _service.GetVersionbyChargeBoxId(ChargeBoxId);
  1000. result.Data = version;
  1001. result.StatusCode = (int)CPO_StatusCode.Success;
  1002. result.StatusMessage = CPO_StatusMessage.Success;
  1003. //statusCode = HttpStatusCode.OK;
  1004. statusCode = StatusCodes.Status200OK;
  1005. }
  1006. catch (Exception ex)
  1007. {
  1008. result.ErrorDetail = ex.ToString();
  1009. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1010. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1011. //return Request.CreateResponse(statusCode, result);
  1012. return StatusCode(statusCode, result);
  1013. }
  1014. //return Request.CreateResponse(statusCode, result);
  1015. return StatusCode(statusCode, result);
  1016. }
  1017. [Route("activesession")]
  1018. [Produces(typeof(CPOOuterResponse))]
  1019. [HttpGet]
  1020. public IActionResult ActiveSession(string ChargeBoxId, string SessionId = "", string IdTag = "")
  1021. {
  1022. var result = new CPOOuterResponse();
  1023. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1024. int statusCode = StatusCodes.Status500InternalServerError;
  1025. try
  1026. {
  1027. string _CustomerId = string.Empty;
  1028. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  1029. {
  1030. // 沒槍~ 沒得充...
  1031. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  1032. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  1033. //statusCode = HttpStatusCode.BadRequest;
  1034. statusCode = StatusCodes.Status400BadRequest;
  1035. //return Request.CreateResponse(statusCode, result);
  1036. return StatusCode(statusCode, result);
  1037. }
  1038. // query meter value
  1039. ChargePointService _service = serviceProvider.GetRequiredService<ChargePointService>();
  1040. var transactionDatas = _service.GetActiveSessionInfo(ChargeBoxId, new List<Measurand>()
  1041. { Measurand.Voltage,
  1042. Measurand.Current_Import,
  1043. Measurand.SoC,
  1044. Measurand.Power_Active_Import,
  1045. Measurand.TotalEnergy,
  1046. Measurand.ChargingCost
  1047. }, SessionId, IdTag);
  1048. if (transactionDatas == null)
  1049. {
  1050. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1051. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_RESULT;
  1052. //statusCode = HttpStatusCode.NotFound;
  1053. statusCode = StatusCodes.Status404NotFound;
  1054. }
  1055. else
  1056. {
  1057. List<ActiveSession> _innerData = new();
  1058. foreach (var transactionData in transactionDatas)
  1059. {
  1060. string currencyText = string.IsNullOrEmpty(transactionData.Fee) ? "TWD" : transactionData.Fee.Remove(0, transactionData.Fee.Length - 3);
  1061. _innerData.Add(new ActiveSession()
  1062. {
  1063. ChargeBoxId = ChargeBoxId,
  1064. SessionId = transactionData.Id,
  1065. ElaspedTime = (int)DateTime.UtcNow.Subtract(transactionData.StartTime).TotalMinutes,
  1066. ConnectorId = transactionData.ConnectorId,
  1067. IdTag = transactionData.StartIdTag,
  1068. Power = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Power_Active_Import).Select(x => x.Value).FirstOrDefault(),
  1069. Power_Format = transactionData.MeterValues == null ? UnitOfMeasure.W.ToString() : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Power_Active_Import).Select(x => x.Unit.ToString()).FirstOrDefault(),
  1070. Current = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Current_Import).Select(x => x.Value).FirstOrDefault(),
  1071. Current_Format = transactionData.MeterValues == null ? UnitOfMeasure.A.ToString() : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Current_Import).Select(x => x.Unit.ToString()).FirstOrDefault(),
  1072. Energy = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.TotalEnergy).Select(x => x.Value).FirstOrDefault(),
  1073. Energy_Format = transactionData.MeterValues == null ? UnitOfMeasure.Wh.ToString() : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.TotalEnergy).Select(x => x.Unit.ToString()).FirstOrDefault(),
  1074. Voltage = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Voltage).Select(x => x.Value).FirstOrDefault(),
  1075. Voltage_Format = transactionData.MeterValues == null ? UnitOfMeasure.V.ToString() : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Voltage).Select(x => x.Unit.ToString()).FirstOrDefault(),
  1076. SOC = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.SoC).Select(x => x.Unit.ToString()).FirstOrDefault() == null ? null : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.SoC).Select(x => x.Value).FirstOrDefault(),
  1077. SOC_Format = transactionData.MeterValues == null ? UnitOfMeasure.Percent.ToString() : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.SoC).Select(x => x.Unit.ToString()).FirstOrDefault(),
  1078. CurrentCost = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.ChargingCost).Select(x => x.Value).FirstOrDefault(),
  1079. Currency = currencyText
  1080. });
  1081. decimal energy = decimal.Parse(_innerData[_innerData.Count - 1].Energy);
  1082. energy = _innerData[^1].Energy_Format == UnitOfMeasure.Wh.ToString() ? Decimal.Divide(energy, 1000) : energy;
  1083. _innerData[^1].Energy = energy.ToString("0.000");
  1084. _innerData[^1].Energy_Format = UnitOfMeasure.kWh.ToString();
  1085. }
  1086. var _innerResponse = new { Sessions = _innerData };
  1087. result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  1088. result.StatusCode = (int)CPO_StatusCode.Success;
  1089. result.StatusMessage = CPO_StatusMessage.Success;
  1090. //statusCode = HttpStatusCode.OK;
  1091. statusCode = StatusCodes.Status200OK;
  1092. }
  1093. //return Request.CreateResponse(statusCode, result);
  1094. return StatusCode(statusCode, result);
  1095. }
  1096. catch (Exception ex)
  1097. {
  1098. result.ErrorDetail = ex.ToString();
  1099. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1100. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1101. //return Request.CreateResponse(statusCode, result);
  1102. return StatusCode(statusCode, result);
  1103. }
  1104. }
  1105. [Route("completedsession")]
  1106. [Produces(typeof(CPOOuterResponse))]
  1107. [HttpGet]
  1108. public IActionResult CompletedSession(string ChargeBoxId, int SessionId = -1, string IdTag = "", string StartTime = "", string StopTime = "")
  1109. {
  1110. var result = new CPOOuterResponse();
  1111. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1112. int statusCode = StatusCodes.Status500InternalServerError;
  1113. try
  1114. {
  1115. string _CustomerId = string.Empty;
  1116. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  1117. {
  1118. // 沒槍~ 沒得充...
  1119. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  1120. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  1121. //statusCode = HttpStatusCode.BadRequest;
  1122. statusCode = StatusCodes.Status400BadRequest;
  1123. //return Request.CreateResponse(statusCode, result);
  1124. return StatusCode(statusCode, result);
  1125. }
  1126. DateTime startDt = string.IsNullOrEmpty(StartTime) ? new DateTime(1991, 1, 1) : DateTime.Parse(StartTime);
  1127. DateTime stopDt = string.IsNullOrEmpty(StopTime) ? new DateTime(1991, 1, 1) : DateTime.Parse(StopTime);
  1128. // query meter value
  1129. ChargePointService _service = serviceProvider.GetRequiredService<ChargePointService>();
  1130. var _innerData = _service.GetSessionDetail(ChargeBoxId, SessionId, IdTag, startDt, stopDt);
  1131. if (_innerData == null)
  1132. {
  1133. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1134. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_SESSIONDETAIL;
  1135. //statusCode = HttpStatusCode.NotFound;
  1136. statusCode = StatusCodes.Status404NotFound;
  1137. //return Request.CreateResponse(statusCode, result);
  1138. return StatusCode(statusCode, result);
  1139. }
  1140. var _innerResponse = new { SessionDetails = _innerData };
  1141. result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  1142. result.StatusCode = (int)CPO_StatusCode.Success;
  1143. result.StatusMessage = CPO_StatusMessage.Success;
  1144. //statusCode = HttpStatusCode.OK;
  1145. statusCode = StatusCodes.Status200OK;
  1146. //return Request.CreateResponse(statusCode, result);
  1147. return StatusCode(statusCode, result);
  1148. }
  1149. catch (Exception ex)
  1150. {
  1151. result.ErrorDetail = ex.ToString();
  1152. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1153. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1154. //return Request.CreateResponse(statusCode, result);
  1155. return StatusCode(statusCode, result);
  1156. }
  1157. }
  1158. [Route("statistics/charging_sessions")]
  1159. [Produces(typeof(CPOOuterResponse))]
  1160. [HttpPost]
  1161. async public Task<IActionResult> ChargingSessionsStatistics([FromBody] StatisticsRequest request, [FromServices] IConfiguration configuration)
  1162. {
  1163. var result = new CPOOuterResponse();
  1164. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1165. int statusCode = StatusCodes.Status500InternalServerError;
  1166. //var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  1167. try
  1168. {
  1169. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  1170. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  1171. string url = configuration["StatisticsAPI"] + 1;
  1172. string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
  1173. HttpClientService service = new HttpClientService();
  1174. Dictionary<string, string> postData = new Dictionary<string, string>()
  1175. {
  1176. { "ChargeBoxId", chargeBoxIds },
  1177. { "Type", request.Type.ToString() },
  1178. { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
  1179. { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
  1180. };
  1181. var _innerresult = await service.PostFormDataAsync(url, postData, null);
  1182. if (_innerresult.StatusCode == HttpStatusCode.OK)
  1183. {
  1184. _innerresult.Response = _innerresult.Response.Replace("item", "Title");
  1185. _innerresult.Response = _innerresult.Response.Replace("Data", "Count");
  1186. result.Data = _innerresult.Response;
  1187. result.StatusCode = (int)CPO_StatusCode.Success;
  1188. result.StatusMessage = CPO_StatusMessage.Success;
  1189. //statusCode = HttpStatusCode.OK;
  1190. statusCode = StatusCodes.Status200OK;
  1191. }
  1192. else
  1193. {
  1194. logger.LogWarning(_innerresult.Exception, _innerresult.Response);
  1195. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1196. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  1197. //statusCode = HttpStatusCode.BadRequest;
  1198. statusCode = StatusCodes.Status400BadRequest;
  1199. }
  1200. }
  1201. catch (Exception ex)
  1202. {
  1203. result.ErrorDetail = ex.ToString();
  1204. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1205. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1206. //return Request.CreateResponse(statusCode, result);
  1207. return StatusCode(statusCode, result);
  1208. }
  1209. //return Request.CreateResponse(statusCode, result);
  1210. return StatusCode(statusCode, result);
  1211. }
  1212. [Route("statistics/energy_delivered")]
  1213. [Produces(typeof(CPOOuterResponse))]
  1214. [HttpPost]
  1215. async public Task<IActionResult> Energy_Delivered([FromBody] StatisticsRequest request, [FromServices] IConfiguration configuration)
  1216. {
  1217. var result = new CPOOuterResponse();
  1218. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1219. int statusCode = StatusCodes.Status500InternalServerError;
  1220. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  1221. try
  1222. {
  1223. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  1224. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  1225. string url = configuration["StatisticsAPI"] + 2;
  1226. string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
  1227. HttpClientService service = new HttpClientService();
  1228. Dictionary<string, string> postData = new Dictionary<string, string>()
  1229. {
  1230. { "ChargeBoxId",chargeBoxIds },
  1231. { "Type", request.Type.ToString() },
  1232. { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
  1233. { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
  1234. };
  1235. var _innerresult = await service.PostFormDataAsync(url, postData, null);
  1236. if (_innerresult.StatusCode == HttpStatusCode.OK)
  1237. {
  1238. _innerresult.Response = _innerresult.Response.Replace("item", "Title");
  1239. _innerresult.Response = _innerresult.Response.Replace("Data", "DeliveredEnergy");
  1240. result.Data = _innerresult.Response;
  1241. result.StatusCode = (int)CPO_StatusCode.Success;
  1242. result.StatusMessage = CPO_StatusMessage.Success;
  1243. //statusCode = HttpStatusCode.OK;
  1244. statusCode = StatusCodes.Status200OK;
  1245. }
  1246. else
  1247. {
  1248. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1249. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  1250. //statusCode = HttpStatusCode.BadRequest;
  1251. statusCode = StatusCodes.Status400BadRequest;
  1252. }
  1253. }
  1254. catch (Exception ex)
  1255. {
  1256. result.ErrorDetail = ex.ToString();
  1257. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1258. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1259. //return Request.CreateResponse(statusCode, result);
  1260. return StatusCode(statusCode, result);
  1261. }
  1262. //return Request.CreateResponse(statusCode, result);
  1263. return StatusCode(statusCode, result);
  1264. }
  1265. [Route("statistics/time_of_use")]
  1266. [Produces(typeof(CPOOuterResponse))]
  1267. [HttpPost]
  1268. async public Task<IActionResult> Time_of_Use([FromBody] StatisticsRequest request, [FromServices] IConfiguration configuration)
  1269. {
  1270. var result = new CPOOuterResponse();
  1271. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1272. int statusCode = StatusCodes.Status500InternalServerError;
  1273. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  1274. try
  1275. {
  1276. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  1277. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  1278. string url = configuration["StatisticsAPI"] + 3;
  1279. string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
  1280. HttpClientService service = new HttpClientService();
  1281. Dictionary<string, string> postData = new Dictionary<string, string>()
  1282. {
  1283. { "ChargeBoxId",chargeBoxIds },
  1284. { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
  1285. { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
  1286. };
  1287. var _innerresult = await service.PostFormDataAsync(url, postData, null);
  1288. if (_innerresult.StatusCode == HttpStatusCode.OK)
  1289. {
  1290. _innerresult.Response = _innerresult.Response.Replace("item", "Title");
  1291. _innerresult.Response = _innerresult.Response.Replace("data", "Count");
  1292. _innerresult.Response = _innerresult.Response.Replace("data2", "DeliveredEnergy");
  1293. result.Data = _innerresult.Response;
  1294. result.StatusCode = (int)CPO_StatusCode.Success;
  1295. result.StatusMessage = CPO_StatusMessage.Success;
  1296. //statusCode = HttpStatusCode.OK;
  1297. statusCode = StatusCodes.Status200OK;
  1298. }
  1299. else
  1300. {
  1301. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1302. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  1303. //statusCode = HttpStatusCode.BadRequest;
  1304. statusCode = StatusCodes.Status400BadRequest;
  1305. }
  1306. }
  1307. catch (Exception ex)
  1308. {
  1309. result.ErrorDetail = ex.ToString();
  1310. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1311. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1312. //return Request.CreateResponse(statusCode, result);
  1313. return StatusCode(statusCode, result);
  1314. }
  1315. //return Request.CreateResponse(statusCode, result);
  1316. return StatusCode(statusCode, result);
  1317. }
  1318. [Route("statistics/peak_load")]
  1319. [Produces(typeof(CPOOuterResponse))]
  1320. [HttpPost]
  1321. async public Task<IActionResult> Peak_Load([FromBody] StatisticsRequest request, [FromServices] IConfiguration configuration)
  1322. {
  1323. var result = new CPOOuterResponse();
  1324. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1325. int statusCode = StatusCodes.Status500InternalServerError;
  1326. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  1327. try
  1328. {
  1329. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  1330. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  1331. string url = configuration["StatisticsAPI"] + 4;
  1332. string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
  1333. HttpClientService service = new HttpClientService();
  1334. Dictionary<string, string> postData = new Dictionary<string, string>()
  1335. {
  1336. { "ChargeBoxId", chargeBoxIds },
  1337. { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
  1338. { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
  1339. };
  1340. var _innerresult = await service.PostFormDataAsync(url, postData, null);
  1341. if (_innerresult.StatusCode == HttpStatusCode.OK)
  1342. {
  1343. _innerresult.Response = _innerresult.Response.Replace("item", "Title");
  1344. _innerresult.Response = _innerresult.Response.Replace("data", "DeliveredEnergy");
  1345. result.Data = _innerresult.Response;
  1346. result.StatusCode = (int)CPO_StatusCode.Success;
  1347. result.StatusMessage = CPO_StatusMessage.Success;
  1348. //statusCode = HttpStatusCode.OK;
  1349. statusCode = StatusCodes.Status200OK;
  1350. }
  1351. else
  1352. {
  1353. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1354. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  1355. //statusCode = HttpStatusCode.BadRequest;
  1356. statusCode = StatusCodes.Status400BadRequest;
  1357. }
  1358. }
  1359. catch (Exception ex)
  1360. {
  1361. result.ErrorDetail = ex.ToString();
  1362. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1363. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1364. //return Request.CreateResponse(statusCode, result);
  1365. return StatusCode(statusCode, result);
  1366. }
  1367. //return Request.CreateResponse(statusCode, result);
  1368. return StatusCode(statusCode, result);
  1369. }
  1370. [Route("statistics/sessions")]
  1371. [Produces(typeof(CPOOuterResponse))]
  1372. [HttpPost]
  1373. async public Task<IActionResult> Sessions([FromBody] StatisticsRequest request, [FromServices] IConfiguration configuration)
  1374. {
  1375. var result = new CPOOuterResponse();
  1376. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1377. int statusCode = StatusCodes.Status500InternalServerError;
  1378. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  1379. try
  1380. {
  1381. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  1382. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  1383. string url = configuration["StatisticsAPI"] + 6;
  1384. string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
  1385. HttpClientService service = new HttpClientService();
  1386. Dictionary<string, string> postData = new Dictionary<string, string>()
  1387. {
  1388. { "ChargeBoxId", chargeBoxIds },
  1389. { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
  1390. { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
  1391. };
  1392. var _innerresult = await service.PostFormDataAsync(url, postData, null);
  1393. if (_innerresult.StatusCode == HttpStatusCode.OK)
  1394. {
  1395. string titles = "\"Title\":[\"ChargeBox Id\",\"Connector Id\",\"Session Id\",\"DateFrom\",\"DateTo\",\"Duration(sec)\",\"Energy(kWh)\",\"Stop Reason\"],";
  1396. _innerresult.Response = _innerresult.Response.Replace("data", "Session");
  1397. _innerresult.Response = _innerresult.Response.Insert(1, titles);
  1398. result.Data = _innerresult.Response;
  1399. result.StatusCode = (int)CPO_StatusCode.Success;
  1400. result.StatusMessage = CPO_StatusMessage.Success;
  1401. //statusCode = HttpStatusCode.OK;
  1402. statusCode = StatusCodes.Status200OK;
  1403. }
  1404. else
  1405. {
  1406. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1407. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  1408. //statusCode = HttpStatusCode.BadRequest;
  1409. statusCode = StatusCodes.Status400BadRequest;
  1410. }
  1411. }
  1412. catch (Exception ex)
  1413. {
  1414. result.ErrorDetail = ex.ToString();
  1415. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1416. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1417. //return Request.CreateResponse(statusCode, result);
  1418. return StatusCode(statusCode, result);
  1419. }
  1420. //return Request.CreateResponse(statusCode, result);
  1421. return StatusCode(statusCode, result);
  1422. }
  1423. [Route("statistics/fault")]
  1424. [Produces(typeof(CPOOuterResponse))]
  1425. [HttpPost]
  1426. async public Task<IActionResult> Fault([FromBody] StatisticsRequest request, [FromServices] IConfiguration configuration)
  1427. {
  1428. var result = new CPOOuterResponse();
  1429. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  1430. int statusCode = StatusCodes.Status500InternalServerError;
  1431. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  1432. try
  1433. {
  1434. InternalHttpClient _client = serviceProvider.GetRequiredService<InternalHttpClient>();
  1435. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  1436. string url = configuration["StatisticsAPI"] + 5;
  1437. string chargeBoxIds = GetStatisticChargeBoxIds(request.ChargeBoxIds);
  1438. HttpClientService service = new HttpClientService();
  1439. Dictionary<string, string> postData = new Dictionary<string, string>()
  1440. {
  1441. { "ChargeBoxId", chargeBoxIds},
  1442. { "StartDate",request.DateFrom.ToString(EVCBConfiguration.DATETIMEFORMAT)},
  1443. { "EndDate",request.DateTo.ToString(EVCBConfiguration.DATETIMEFORMAT)}
  1444. };
  1445. var _innerresult = await service.PostFormDataAsync(url, postData, null);
  1446. if (_innerresult.StatusCode == HttpStatusCode.OK)
  1447. {
  1448. _innerresult.Response = _innerresult.Response.Replace("item", "Title");
  1449. _innerresult.Response = _innerresult.Response.Replace("data", "Count");
  1450. _innerresult.Response = _innerresult.Response.Replace("data2", "CumulativePercentage");
  1451. result.Data = _innerresult.Response;
  1452. result.StatusCode = (int)CPO_StatusCode.Success;
  1453. result.StatusMessage = CPO_StatusMessage.Success;
  1454. //statusCode = HttpStatusCode.OK;
  1455. statusCode = StatusCodes.Status200OK;
  1456. }
  1457. else
  1458. {
  1459. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  1460. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  1461. //statusCode = HttpStatusCode.BadRequest;
  1462. statusCode = StatusCodes.Status400BadRequest;
  1463. }
  1464. }
  1465. catch (Exception ex)
  1466. {
  1467. result.ErrorDetail = ex.ToString();
  1468. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  1469. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  1470. //return Request.CreateResponse(statusCode, result);
  1471. return StatusCode(statusCode, result);
  1472. }
  1473. //return Request.CreateResponse(statusCode, result);
  1474. return StatusCode(statusCode, result);
  1475. }
  1476. private string GetStatisticChargeBoxIds(List<string> chargeBoxIds)
  1477. {
  1478. string result = JsonConvert.SerializeObject(chargeBoxIds, Formatting.None).Replace("\"", "'");
  1479. result = result.Replace("[", "");
  1480. result = result.Replace("]", "");
  1481. return result;
  1482. }
  1483. private CPOOuterResponse GetErrorDescription(InternalHttpResult innerResponse)
  1484. {
  1485. CPOOuterResponse result = new CPOOuterResponse();
  1486. result.ErrorDetail = innerResponse.Exception == null ? null : innerResponse.Exception.ToString();
  1487. if (innerResponse.Status != HttpStatusCode.Accepted)
  1488. {
  1489. switch (innerResponse.ErrorCode)
  1490. {
  1491. #region Authorization
  1492. case 2000:
  1493. {
  1494. result.StatusCode = innerResponse.ErrorCode;
  1495. result.StatusMessage = string.Format("{0}-{1}", "InnerService", "Authorize Unexpected Error");
  1496. result.ErrorDetail = result.StatusMessage;
  1497. }
  1498. break;
  1499. case 2001:
  1500. case 2002:
  1501. case 2003:
  1502. {
  1503. result.StatusCode = innerResponse.ErrorCode;
  1504. result.StatusMessage = string.Format("{0}-{1}", "InnerService", innerResponse.Message);
  1505. }
  1506. break;
  1507. #endregion
  1508. case 2100:
  1509. case 2101:
  1510. case 2102:
  1511. case 2103:
  1512. case 2104:
  1513. case 2105:
  1514. case 2106:
  1515. {
  1516. result.StatusCode = innerResponse.ErrorCode;
  1517. result.StatusMessage = innerResponse.Message;
  1518. }
  1519. break;
  1520. case 2999:
  1521. {
  1522. result.StatusCode = innerResponse.ErrorCode;
  1523. result.StatusMessage = string.Format("{0}-{1}", "InnerService", "Unexpected Error");
  1524. result.ErrorDetail = result.StatusMessage;
  1525. }
  1526. break;
  1527. default:
  1528. {
  1529. result.StatusCode = 2998;
  1530. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_ERRORCODE;
  1531. }
  1532. break;
  1533. }
  1534. }
  1535. return result;
  1536. }
  1537. private bool ContainsChargePoint(string chargeBoxId, out string customerId)
  1538. {
  1539. customerId = string.Empty;
  1540. if (!Request.Headers.ContainsKey(EVCBConfiguration.Header_PartnerId)) return false;
  1541. customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  1542. ChargePointService _service = serviceProvider.GetRequiredService<ChargePointService>();//;new ChargePointService();
  1543. return _service.ContainsChargePoint(chargeBoxId, customerId);
  1544. }
  1545. }
  1546. }