CPOController.cs 85 KB

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