V2_CPOController.cs 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256
  1. using Dapper;
  2. using EVCB_OCPP.Packet.Messages.SubTypes;
  3. using EVCB_OCPP.WEBAPI.Handlers;
  4. using EVCB_OCPP.WEBAPI.Models;
  5. using EVCB_OCPP.WEBAPI.Models.WebAPI;
  6. using EVCB_OCPP.WEBAPI.Models.WebAPI.Dto;
  7. using EVCB_OCPP.WEBAPI.Services;
  8. using EVCB_OCPP.WEBAPI.Services.Integration;
  9. using Microsoft.AspNetCore.Http;
  10. using Microsoft.AspNetCore.Mvc;
  11. using Newtonsoft.Json;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Configuration;
  15. using System.Data;
  16. using System.Data.SqlClient;
  17. using System.Linq;
  18. using System.Net;
  19. using System.Net.Http;
  20. using System.Threading.Tasks;
  21. using ChargingStationService = EVCB_OCPP.WEBAPI.Services.Integration.ChargingStationService;
  22. using CommandType = EVCB_OCPP.WEBAPI.Models.WebAPI.Dto.CommandType;
  23. using IChargePointService = EVCB_OCPP.WEBAPI.Services.Integration.IChargePointService;
  24. using Microsoft.Extensions.Configuration;
  25. using Microsoft.AspNetCore.Http.Extensions;
  26. using Microsoft.Extensions.DependencyInjection;
  27. namespace EVCB_OCPP.WEBAPI.Controllers.Version2
  28. {
  29. [ApiExplorerSettings(IgnoreApi = false)]
  30. [Route("api/v2/cpo")]
  31. [ServiceFilter(typeof(CPOAuthentication))]
  32. public class V2_CPOController : ControllerBase
  33. {
  34. private readonly IServiceProvider serviceProvider;
  35. public V2_CPOController(IServiceProvider serviceProvider)
  36. {
  37. this.serviceProvider = serviceProvider;
  38. }
  39. [Route("information")]
  40. [Produces(typeof(CPOOuterResponse))]
  41. [HttpGet]
  42. public IActionResult BasicInformationofEVSEs(int? Limit = -1, int StationId = -1, string ChargeBoxId = "", DateTime? DateFrom = null, DateTime? DateTo = null, int? Offset = 0)
  43. {
  44. var result = new CPOOuterResponse();
  45. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  46. int statusCode = StatusCodes.Status500InternalServerError;
  47. try
  48. {
  49. if (Request.Headers.Keys.Contains(EVCBConfiguration.Header_PartnerId))
  50. {
  51. var _customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  52. var _innerResponse = new { EVSEs = new List<EVSE>() };
  53. ChargingStationService _stationService = serviceProvider.GetRequiredService<ChargingStationService>();
  54. if (StationId > -1)
  55. {
  56. if (_stationService.ContainsStation(_customerId, StationId))
  57. {
  58. if (DateTo.HasValue)
  59. {
  60. if (!DateFrom.HasValue)
  61. {
  62. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_PARAMETER_OUTOFRANGE_INCORRECT;
  63. result.StatusCode = (int)CPO_StatusCode.PARAMETER_OUTOFRANGE_INCORRECT;
  64. //statusCode = HttpStatusCode.BadRequest;
  65. statusCode = StatusCodes.Status400BadRequest;
  66. return StatusCode(statusCode, result);
  67. }
  68. }
  69. _innerResponse = new { EVSEs = _stationService.GetEVSEsbyStationId(StationId, DateFrom, DateTo, Offset.Value, Limit == -1 ? 1000 : Limit.Value) };
  70. }
  71. }
  72. else
  73. {
  74. IChargePointService _service = null;
  75. if (GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16)
  76. {
  77. _service = serviceProvider.GetRequiredService<ChargePoint16Service>();
  78. }
  79. else
  80. {
  81. _service = serviceProvider.GetRequiredService<ChargePoint201Service>();
  82. }
  83. _innerResponse = new { EVSEs = new List<EVSE>() };
  84. _innerResponse.EVSEs.Add(_service.GetEVSEsbyChargeBoxId(ChargeBoxId, DateFrom, DateTo));
  85. }
  86. result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  87. result.StatusCode = (int)CPO_StatusCode.Success;
  88. result.StatusMessage = CPO_StatusMessage.Success;
  89. //statusCode = HttpStatusCode.OK;
  90. statusCode = StatusCodes.Status200OK;
  91. }
  92. return StatusCode(statusCode, result);
  93. }
  94. catch (Exception ex)
  95. {
  96. result.ErrorDetail = ex.ToString();
  97. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  98. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  99. return StatusCode(statusCode, result);
  100. }
  101. }
  102. [Route("contact_information")]
  103. [Produces(typeof(CPOOuterResponse))]
  104. [HttpGet]
  105. public IActionResult ContactInformation([FromServices]IConfiguration configuration)
  106. {
  107. var result = new CPOOuterResponse();
  108. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  109. int statusCode = StatusCodes.Status500InternalServerError;
  110. try
  111. {
  112. if (Request.Headers.Keys.Contains(EVCBConfiguration.Header_PartnerId))
  113. {
  114. var customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  115. string mainConnectionString = configuration.GetConnectionString("MainDBContext");
  116. var parameters = new DynamicParameters();
  117. parameters.Add("@CustomerId", customerId, DbType.String, ParameterDirection.Input);
  118. string hotline = string.Empty;
  119. using (SqlConnection conn = new SqlConnection(mainConnectionString))
  120. {
  121. string strSql = "SELECT [Hotline] FROM [dbo].[Customer] where Id=@CustomerId; ";
  122. hotline = conn.ExecuteScalar<string>(strSql, parameters);
  123. }
  124. result.Data = JsonConvert.SerializeObject(new { Info = hotline }, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  125. result.StatusCode = (int)CPO_StatusCode.Success;
  126. result.StatusMessage = CPO_StatusMessage.Success;
  127. //statusCode = HttpStatusCode.OK;
  128. statusCode = StatusCodes.Status200OK;
  129. }
  130. result.StatusCode = (int)CPO_StatusCode.Success;
  131. result.StatusMessage = CPO_StatusMessage.Success;
  132. //statusCode = HttpStatusCode.OK;
  133. statusCode = StatusCodes.Status200OK;
  134. return StatusCode(statusCode, result);
  135. }
  136. catch (Exception ex)
  137. {
  138. result.ErrorDetail = ex.ToString();
  139. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  140. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  141. return StatusCode(statusCode, result);
  142. }
  143. }
  144. [Route("stationInfo")]
  145. [Produces(typeof(CPOOuterResponse))]
  146. [HttpGet]
  147. public IActionResult StationInfo(string ChargeBoxId)
  148. {
  149. var result = new CPOOuterResponse();
  150. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  151. int statusCode = StatusCodes.Status500InternalServerError;
  152. try
  153. {
  154. ChargingStationService service = serviceProvider.GetRequiredService<ChargingStationService>();
  155. var _innerData = service.GetInfobyChargeBoxId(ChargeBoxId);
  156. if (_innerData == null)
  157. {
  158. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  159. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_SESSIONDETAIL;
  160. //statusCode = HttpStatusCode.NotFound;
  161. statusCode = StatusCodes.Status404NotFound;
  162. return StatusCode(statusCode, result);
  163. }
  164. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  165. result.StatusCode = (int)CPO_StatusCode.Success;
  166. result.StatusMessage = CPO_StatusMessage.Success;
  167. //statusCode = HttpStatusCode.OK;
  168. statusCode = StatusCodes.Status200OK;
  169. return StatusCode(statusCode, result);
  170. }
  171. catch (Exception ex)
  172. {
  173. result.ErrorDetail = ex.ToString();
  174. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  175. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  176. return StatusCode(statusCode, result);
  177. }
  178. }
  179. [Route("version")]
  180. [Produces(typeof(CPOOuterResponse))]
  181. [HttpGet]
  182. public IActionResult Version(string ChargeBoxId)
  183. {
  184. var result = new CPOOuterResponse();
  185. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  186. int statusCode = StatusCodes.Status500InternalServerError;
  187. try
  188. {
  189. IChargePointService _service = null;
  190. if (GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16)
  191. {
  192. _service = serviceProvider.GetRequiredService<ChargePoint16Service>();
  193. }
  194. else
  195. {
  196. _service = serviceProvider.GetRequiredService<ChargePoint201Service>();
  197. }
  198. result.Data = _service.GetVersionbyChargeBoxId(ChargeBoxId);
  199. result.StatusCode = (int)CPO_StatusCode.Success;
  200. result.StatusMessage = CPO_StatusMessage.Success;
  201. //statusCode = HttpStatusCode.OK;
  202. statusCode = StatusCodes.Status200OK;
  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 StatusCode(statusCode, result);
  210. }
  211. return StatusCode(statusCode, result);
  212. }
  213. [Route("station")]
  214. [Produces(typeof(CPOOuterResponse))]
  215. [HttpGet]
  216. public IActionResult Station()
  217. {
  218. var result = new CPOOuterResponse();
  219. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  220. int statusCode = StatusCodes.Status500InternalServerError;
  221. try
  222. {
  223. if (Request.Headers.Keys.Contains(EVCBConfiguration.Header_PartnerId))
  224. {
  225. var _customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  226. ChargingStationService _service = serviceProvider.GetRequiredService<ChargingStationService>();
  227. var _innerResponse = new { Stations = _service.GetStationsbyCustomerId(_customerId) };
  228. result.Data = JsonConvert.SerializeObject(_innerResponse, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  229. result.StatusCode = (int)CPO_StatusCode.Success;
  230. result.StatusMessage = CPO_StatusMessage.Success;
  231. //statusCode = HttpStatusCode.OK;
  232. statusCode = StatusCodes.Status200OK;
  233. }
  234. return StatusCode(statusCode, result);
  235. }
  236. catch (Exception ex)
  237. {
  238. result.ErrorDetail = ex.ToString();
  239. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  240. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  241. return StatusCode(statusCode, result);
  242. }
  243. }
  244. [Route("commands/start_session")]
  245. [Produces(typeof(CPOOuterResponse))]
  246. [HttpPost]
  247. async public Task<IActionResult> StartSession([FromBody] StartSessionRequest request)
  248. {
  249. var result = new CPOOuterResponse();
  250. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  251. int statusCode = StatusCodes.Status500InternalServerError;
  252. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  253. try
  254. {
  255. string _CustomerId = string.Empty;
  256. if (!ContainsChargePoint(request.ChargeBoxId, out _CustomerId))
  257. {
  258. // 沒槍~ 沒得充...
  259. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  260. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  261. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  262. //statusCode = HttpStatusCode.BadRequest;
  263. statusCode = StatusCodes.Status400BadRequest;
  264. return StatusCode(statusCode, result);
  265. }
  266. IChargePointService _service = null;
  267. if (GetChargePointOCPPProtocol(request.ChargeBoxId) == OCPPProtocolType.OCPP16)
  268. {
  269. _service = serviceProvider.GetRequiredService<ChargePoint16Service>();
  270. }
  271. else
  272. {
  273. _service = serviceProvider.GetRequiredService<ChargePoint201Service>();
  274. }
  275. if (!string.IsNullOrEmpty(request.ChargeBoxId) && request.ChargeBoxId.Length <= 25 && (!request.ConnectorId.HasValue
  276. || (_service.GetNumberofConnectors(request.ChargeBoxId) >= request.ConnectorId && request.ConnectorId > 0))
  277. && !string.IsNullOrEmpty(request.Token) && request.Token.Length <= 20)
  278. {
  279. InternalHttpClient _client = new InternalHttpClient();
  280. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  281. //trigger to charge
  282. var _request = new Models.WebAPI.StartTransactionRequest()
  283. {
  284. ConnectorId = request.ConnectorId,
  285. IdTag = request.Token
  286. };
  287. string[] parts = Request.GetDisplayUrl().ToString().Split('/');
  288. string urlformat = "{0}//{1}/api/v1/ocpp{2}/transaction?ChargeBoxId={3}";
  289. var _innerResult = await _client.Post(string.Format(urlformat, parts[0], parts[2],
  290. GetChargePointOCPPProtocol(request.ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20", request.ChargeBoxId), new Dictionary<string, string>()
  291. {
  292. { "PartnerId",_CustomerId}
  293. }, _request, _customer.GetAPIKey(new Guid(_CustomerId)));
  294. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  295. result = GetErrorDescription(_innerResult);
  296. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  297. if (_innerResult.Status == HttpStatusCode.InternalServerError)
  298. {
  299. result.StatusCode = _innerResult.ErrorCode;
  300. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  301. //statusCode = HttpStatusCode.InternalServerError;
  302. statusCode = StatusCodes.Status500InternalServerError;
  303. }
  304. else
  305. {
  306. result.SerialNo = _innerResult.SerialNo;
  307. result.StatusCode = _innerResult.ErrorCode;
  308. result.StatusMessage = _innerResult.Message;
  309. //statusCode = HttpStatusCode.OK;
  310. statusCode = StatusCodes.Status200OK;
  311. }
  312. }
  313. else
  314. {
  315. // 參數不符合定義
  316. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_PARAMETER_OUTOFRANGE_INCORRECT;
  317. result.StatusCode = (int)CPO_StatusCode.PARAMETER_OUTOFRANGE_INCORRECT;
  318. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  319. //statusCode = HttpStatusCode.BadRequest;
  320. statusCode = StatusCodes.Status400BadRequest;
  321. }
  322. return StatusCode(statusCode, result);
  323. }
  324. catch (Exception ex)
  325. {
  326. result.ErrorDetail = ex.ToString();
  327. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  328. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  329. return StatusCode(statusCode, result);
  330. }
  331. }
  332. [Route("commands/stop_session")]
  333. [Produces(typeof(CPOOuterResponse))]
  334. [HttpPost]
  335. async public Task<IActionResult> StopSession(string ChargeBoxId, int SessionId)
  336. {
  337. var result = new CPOOuterResponse();
  338. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  339. int statusCode = StatusCodes.Status500InternalServerError;
  340. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  341. try
  342. {
  343. string _CustomerId = string.Empty;
  344. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  345. {
  346. // 沒槍~ 沒得充...
  347. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  348. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  349. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  350. //statusCode = HttpStatusCode.BadRequest;
  351. statusCode = StatusCodes.Status400BadRequest;//.BadRequest;
  352. return StatusCode(statusCode, result);
  353. }
  354. InternalHttpClient _client = new InternalHttpClient();
  355. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  356. string[] parts = Request.GetDisplayUrl().Split('/');
  357. string urlformat = "{0}//{1}/api/v1/ocpp{2}/transaction?ChargeBoxId={3}&TransactionId={4}";
  358. var _innerResult = await _client.Put(string.Format(urlformat, parts[0], parts[2], GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20", ChargeBoxId, SessionId), new Dictionary<string, string>()
  359. {
  360. { "PartnerId",_CustomerId}
  361. }, null, _customer.GetAPIKey(new Guid(_CustomerId)));
  362. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  363. result = GetErrorDescription(_innerResult);
  364. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  365. if (_innerResult.Success)
  366. {
  367. result.SerialNo = _innerResult.SerialNo;
  368. result.StatusCode = (int)CPO_StatusCode.Success;
  369. result.StatusMessage = CPO_StatusMessage.Success;
  370. //statusCode = HttpStatusCode.OK;
  371. statusCode = StatusCodes.Status200OK;
  372. }
  373. else
  374. {
  375. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  376. {
  377. result.StatusCode = _innerResult.ErrorCode;
  378. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  379. //statusCode = HttpStatusCode.BadRequest;
  380. statusCode = StatusCodes.Status400BadRequest;
  381. }
  382. else
  383. {
  384. result.StatusCode = _innerResult.ErrorCode;
  385. result.StatusMessage = _innerResult.Message;
  386. //statusCode = HttpStatusCode.BadRequest;
  387. statusCode = StatusCodes.Status400BadRequest;
  388. }
  389. }
  390. }
  391. catch (Exception ex)
  392. {
  393. result.ErrorDetail = ex.ToString();
  394. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  395. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  396. return StatusCode(statusCode, result);
  397. }
  398. return StatusCode(statusCode, result);
  399. }
  400. [Route("commands/reserve_now")]
  401. [Produces(typeof(CPOOuterResponse))]
  402. [HttpPost]
  403. async public Task<IActionResult> ReserveNow([FromBody] ReserveNowRequest request)
  404. {
  405. var result = new CPOOuterResponse();
  406. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  407. int statusCode = StatusCodes.Status500InternalServerError;
  408. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  409. try
  410. {
  411. string _CustomerId = string.Empty;
  412. if (!ContainsChargePoint(request.ChargeBoxId, out _CustomerId))
  413. {
  414. // 沒槍~ 沒得充...
  415. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  416. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  417. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  418. //statusCode = HttpStatusCode.BadRequest;
  419. statusCode = StatusCodes.Status400BadRequest;
  420. return StatusCode(statusCode, result);
  421. }
  422. InternalHttpClient _client = new InternalHttpClient();
  423. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  424. string[] parts = Request.GetDisplayUrl().Split('/');
  425. string urlformat = "{0}//{1}/api/v1/ocpp{2}/reservation?ChargeBoxId={3}";
  426. var _innerRequest = new ReserveRequest()
  427. {
  428. ConnectorId = request.ConnectorId,
  429. IdTag = request.Token,
  430. ReservationId = request.ReservationId,
  431. ExpiryDate = request.ExpiryDate.ToString(EVCBConfiguration.UTC_DATETIMEFORMAT)
  432. };
  433. var _innerResult = await _client.Post(string.Format(urlformat, parts[0], parts[2],
  434. GetChargePointOCPPProtocol(request.ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20", request.ChargeBoxId), new Dictionary<string, string>()
  435. {
  436. { "PartnerId",_CustomerId}
  437. }, _innerRequest, _customer.GetAPIKey(new Guid(_CustomerId)));
  438. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  439. result = GetErrorDescription(_innerResult);
  440. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  441. if (_innerResult.Success)
  442. {
  443. result.SerialNo = _innerResult.SerialNo;
  444. result.StatusCode = (int)CPO_StatusCode.Success;
  445. result.StatusMessage = CPO_StatusMessage.Success;
  446. //statusCode = HttpStatusCode.OK;
  447. statusCode = StatusCodes.Status200OK;
  448. }
  449. else
  450. {
  451. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  452. {
  453. result.StatusCode = _innerResult.ErrorCode;
  454. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  455. //statusCode = HttpStatusCode.BadRequest;
  456. statusCode = StatusCodes.Status400BadRequest;
  457. }
  458. else
  459. {
  460. result.StatusCode = _innerResult.ErrorCode;
  461. result.StatusMessage = _innerResult.Message;
  462. //statusCode = HttpStatusCode.BadRequest;
  463. statusCode = statusCode = StatusCodes.Status400BadRequest;
  464. }
  465. }
  466. }
  467. catch (Exception ex)
  468. {
  469. result.ErrorDetail = ex.ToString();
  470. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  471. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  472. return StatusCode(statusCode, result);
  473. }
  474. return StatusCode(statusCode, result);
  475. }
  476. [Route("commands/cancel_reservation")]
  477. [Produces(typeof(CPOOuterResponse))]
  478. [HttpDelete]
  479. async public Task<IActionResult> CancelReservation(string ChargeBoxId, int ReservationId)
  480. {
  481. var result = new CPOOuterResponse();
  482. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  483. int statusCode = StatusCodes.Status500InternalServerError;
  484. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  485. try
  486. {
  487. string _CustomerId = string.Empty;
  488. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  489. {
  490. // 沒槍~ 沒得充...
  491. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  492. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  493. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  494. //statusCode = HttpStatusCode.BadRequest;
  495. statusCode = StatusCodes.Status400BadRequest;
  496. return StatusCode(statusCode, result);
  497. }
  498. InternalHttpClient _client = new InternalHttpClient();
  499. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  500. string[] parts = Request.GetDisplayUrl().ToString().Split('/');
  501. string urlformat = "{0}//{1}/api/v1/ocpp{2}/reservation?ChargeBoxId={3}&ReservationId={4}";
  502. var _innerResult = await _client.Delete(string.Format(urlformat, parts[0], parts[2],
  503. GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20", ChargeBoxId, ReservationId), new Dictionary<string, string>()
  504. {
  505. { "PartnerId",_CustomerId}
  506. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  507. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  508. result = GetErrorDescription(_innerResult);
  509. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  510. if (_innerResult.Success)
  511. {
  512. result.SerialNo = _innerResult.SerialNo;
  513. result.StatusCode = (int)CPO_StatusCode.Success;
  514. result.StatusMessage = CPO_StatusMessage.Success;
  515. //statusCode = HttpStatusCode.OK;
  516. statusCode = StatusCodes.Status200OK;
  517. }
  518. else
  519. {
  520. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  521. {
  522. result.StatusCode = _innerResult.ErrorCode;
  523. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  524. //statusCode = HttpStatusCode.BadRequest;
  525. statusCode = StatusCodes.Status400BadRequest;
  526. }
  527. else
  528. {
  529. result.StatusCode = _innerResult.ErrorCode;
  530. result.StatusMessage = _innerResult.Message;
  531. //statusCode = HttpStatusCode.BadRequest;
  532. statusCode = StatusCodes.Status400BadRequest;
  533. }
  534. }
  535. }
  536. catch (Exception ex)
  537. {
  538. result.ErrorDetail = ex.ToString();
  539. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  540. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  541. return StatusCode(statusCode, result);
  542. }
  543. return StatusCode(statusCode, result);
  544. }
  545. [Route("commands/set_locallist")]
  546. [Produces(typeof(CPOOuterResponse))]
  547. [HttpPost]
  548. async public Task<IActionResult> SendLocalList(string ChargeBoxId, [FromBody] LocalListRequest request)
  549. {
  550. var result = new CPOOuterResponse();
  551. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  552. int statusCode = StatusCodes.Status500InternalServerError;
  553. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  554. try
  555. {
  556. string _CustomerId = string.Empty;
  557. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  558. {
  559. // 沒槍~ 沒得充...
  560. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  561. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  562. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  563. //statusCode = HttpStatusCode.BadRequest;
  564. statusCode = StatusCodes.Status400BadRequest;
  565. return StatusCode(statusCode, result);
  566. }
  567. InternalHttpClient _client = new InternalHttpClient();
  568. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  569. string[] parts = Request.GetDisplayUrl().Split('/');
  570. string urlformat = "{0}//{1}/api/v1/ocpp{2}/locallist?ChargeBoxId={3}";
  571. var _innerResult = await _client.Post(string.Format(urlformat, parts[0], parts[2],
  572. GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20", ChargeBoxId), new Dictionary<string, string>()
  573. {
  574. { "PartnerId",_CustomerId}
  575. }, request, _customer.GetAPIKey(new Guid(_CustomerId)));
  576. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  577. result = GetErrorDescription(_innerResult);
  578. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  579. if (_innerResult.Success)
  580. {
  581. result.SerialNo = _innerResult.SerialNo;
  582. result.StatusCode = (int)CPO_StatusCode.Success;
  583. result.StatusMessage = CPO_StatusMessage.Success;
  584. //statusCode = HttpStatusCode.OK;
  585. statusCode = StatusCodes.Status200OK;
  586. }
  587. else
  588. {
  589. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  590. {
  591. result.StatusCode = _innerResult.ErrorCode;
  592. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  593. //statusCode = HttpStatusCode.BadRequest;
  594. statusCode = StatusCodes.Status400BadRequest;
  595. }
  596. else
  597. {
  598. result.StatusCode = _innerResult.ErrorCode;
  599. result.StatusMessage = _innerResult.Message;
  600. //statusCode = HttpStatusCode.BadRequest;
  601. statusCode = StatusCodes.Status400BadRequest;
  602. }
  603. }
  604. }
  605. catch (Exception ex)
  606. {
  607. result.ErrorDetail = ex.ToString();
  608. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  609. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  610. return StatusCode(statusCode, result);
  611. }
  612. return StatusCode(statusCode, result);
  613. }
  614. [Route("commands/locallistversion")]
  615. [Produces(typeof(CPOOuterResponse))]
  616. [HttpGet]
  617. async public Task<IActionResult> GetLocalListVersion(string ChargeBoxId)
  618. {
  619. var result = new CPOOuterResponse();
  620. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  621. int statusCode = StatusCodes.Status500InternalServerError;
  622. var _innerData = new { Result = CommandResponseType.Rejected.ToString(), Timeout = 60 };
  623. try
  624. {
  625. string _CustomerId = string.Empty;
  626. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  627. {
  628. // 沒槍~ 沒得充...
  629. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  630. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  631. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  632. //statusCode = HttpStatusCode.BadRequest;
  633. statusCode = StatusCodes.Status400BadRequest;
  634. return StatusCode(statusCode, result);
  635. }
  636. InternalHttpClient _client = new InternalHttpClient();
  637. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  638. string[] parts = Request.GetDisplayUrl().Split('/');
  639. string urlformat = "{0}//{1}/api/v1/ocpp{2}/locallistversion?ChargeBoxId={3}";
  640. var _innerResult = await _client.Get(string.Format(urlformat, parts[0], parts[2], GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20",
  641. ChargeBoxId), new Dictionary<string, string>()
  642. {
  643. { "PartnerId",_CustomerId}
  644. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  645. _innerData = new { Result = string.IsNullOrEmpty(_innerResult.SerialNo) ? CommandResponseType.Rejected.ToString() : CommandResponseType.Accepted.ToString(), Timeout = 60 };
  646. result = GetErrorDescription(_innerResult);
  647. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  648. if (_innerResult.Success)
  649. {
  650. result.SerialNo = _innerResult.SerialNo;
  651. result.StatusCode = (int)CPO_StatusCode.Success;
  652. result.StatusMessage = CPO_StatusMessage.Success;
  653. //statusCode = HttpStatusCode.OK;
  654. statusCode = StatusCodes.Status200OK;
  655. }
  656. else
  657. {
  658. if (_innerResult.ErrorCode == (int)CPO_StatusCode.UnexpectedError)
  659. {
  660. result.StatusCode = _innerResult.ErrorCode;
  661. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_INNERSERVICE_ERROR;
  662. //statusCode = HttpStatusCode.BadRequest;
  663. statusCode = StatusCodes.Status400BadRequest;
  664. }
  665. else
  666. {
  667. result.StatusCode = _innerResult.ErrorCode;
  668. result.StatusMessage = _innerResult.Message;
  669. //statusCode = HttpStatusCode.BadRequest;
  670. statusCode = StatusCodes.Status400BadRequest;
  671. }
  672. }
  673. //statusCode = HttpStatusCode.OK;
  674. statusCode = StatusCodes.Status200OK;
  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 StatusCode(statusCode, result);
  682. }
  683. return StatusCode(statusCode, result);
  684. }
  685. [Route("commands/results")]
  686. [Produces(typeof(CPOOuterResponse))]
  687. [HttpGet]
  688. async public Task<IActionResult> ExecutionofCmdSearch(string ChargeBoxId, CommandType? commandType, string SerialNo)
  689. {
  690. var result = new CPOOuterResponse();
  691. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  692. int statusCode = StatusCodes.Status500InternalServerError;
  693. try
  694. {
  695. string _CustomerId = string.Empty;
  696. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  697. {
  698. // 沒槍~ 沒得充...
  699. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  700. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  701. //statusCode = HttpStatusCode.BadRequest;
  702. statusCode = StatusCodes.Status400BadRequest;
  703. return StatusCode(statusCode, result);
  704. }
  705. InternalHttpClient _client = new InternalHttpClient();
  706. ICustomerService _customer = serviceProvider.GetRequiredService<ICustomerService>();
  707. int? orderNo = (int?)null;
  708. switch (commandType.Value)
  709. {
  710. case CommandType.CancelReservation:
  711. {
  712. orderNo = 4;
  713. }
  714. break;
  715. case CommandType.ClearChargingProfile:
  716. {
  717. orderNo = 6;
  718. }
  719. break;
  720. case CommandType.GetAcitveChargingProfile:
  721. {
  722. orderNo = 7;
  723. }
  724. break;
  725. case CommandType.GetLocalListVersion:
  726. {
  727. orderNo = 9;
  728. }
  729. break;
  730. case CommandType.Start_Session:
  731. {
  732. orderNo = 10;
  733. }
  734. break;
  735. case CommandType.Stop_Session:
  736. {
  737. orderNo = 11;
  738. }
  739. break;
  740. case CommandType.Reserve_Now:
  741. {
  742. orderNo = 12;
  743. }
  744. break;
  745. case CommandType.SetLocalList:
  746. {
  747. orderNo = 14;
  748. }
  749. break;
  750. case CommandType.SetChargingProfile:
  751. {
  752. orderNo = 15;
  753. }
  754. break;
  755. default:
  756. {
  757. orderNo = 18;
  758. }
  759. break;
  760. }
  761. string[] parts = Request.GetDisplayUrl().Split('/');
  762. string urlformat = "{0}//{1}/api/v1/ocpp{2}/command?ChargeBoxId={3}{4}&SerialNo={5}";
  763. var _innerResult = await _client.Get(string.Format(urlformat, parts[0], parts[2], GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16 ? "16" : "20",
  764. ChargeBoxId, orderNo.HasValue ? "&OrderNo=" + orderNo.Value : "", SerialNo), new Dictionary<string, string>()
  765. {
  766. { "PartnerId",_CustomerId}
  767. }, _customer.GetAPIKey(new Guid(_CustomerId)));
  768. result = GetErrorDescription(_innerResult);
  769. if (_innerResult.Success)
  770. {
  771. ComandExecution _execution = JsonConvert.DeserializeObject<ComandExecution>(_innerResult.Message);
  772. CommandResultType? _cmdResult = (CommandResultType?)null;
  773. switch (_execution.Code)
  774. {
  775. case 1:
  776. {
  777. _cmdResult = CommandResultType.Accepted;
  778. }
  779. break;
  780. case 9:
  781. {
  782. _cmdResult = CommandResultType.Notsupported;
  783. }
  784. break;
  785. case 10:
  786. {
  787. _cmdResult = CommandResultType.Unknown;
  788. }
  789. break;
  790. case 26:
  791. {
  792. _cmdResult = CommandResultType.Occupied;
  793. }
  794. break;
  795. case 31:
  796. {
  797. _cmdResult = CommandResultType.Rejected;
  798. }
  799. break;
  800. case 32:
  801. {
  802. _cmdResult = CommandResultType.Failed;
  803. }
  804. break;
  805. case 254:
  806. {
  807. _cmdResult = CommandResultType.EVSE_ERROR;
  808. }
  809. break;
  810. default:
  811. {
  812. if (_execution.Detail == "Timeout") _cmdResult = CommandResultType.Timeout;
  813. if (_execution.Detail == "Waited") _cmdResult = CommandResultType.Waited;
  814. }
  815. break;
  816. }
  817. if (!_cmdResult.HasValue)
  818. {
  819. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  820. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_RESULT;
  821. //statusCode = HttpStatusCode.NotFound;
  822. statusCode = StatusCodes.Status404NotFound;
  823. }
  824. else
  825. {
  826. var _innerData = new { Result = _cmdResult.Value.ToString(), Message = _execution.Detail };
  827. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  828. result.SerialNo = _innerResult.SerialNo;
  829. result.StatusCode = (int)CPO_StatusCode.Success;
  830. result.StatusMessage = CPO_StatusMessage.Success;
  831. //statusCode = HttpStatusCode.OK;
  832. statusCode = StatusCodes.Status200OK;
  833. }
  834. }
  835. }
  836. catch (Exception ex)
  837. {
  838. result.ErrorDetail = ex.ToString();
  839. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  840. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  841. return StatusCode(statusCode, result);
  842. }
  843. return StatusCode(statusCode, result);
  844. }
  845. [Route("activesession")]
  846. [Produces(typeof(CPOOuterResponse))]
  847. [HttpGet]
  848. public IActionResult ActiveSession(string ChargeBoxId, string SessionId = "", string IdTag = "")
  849. {
  850. var result = new CPOOuterResponse();
  851. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  852. int statusCode = StatusCodes.Status500InternalServerError;
  853. try
  854. {
  855. string _CustomerId = string.Empty;
  856. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  857. {
  858. // 沒槍~ 沒得充...
  859. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  860. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  861. //statusCode = HttpStatusCode.BadRequest;
  862. statusCode = StatusCodes.Status400BadRequest;
  863. return StatusCode(statusCode, result);
  864. }
  865. // query meter value
  866. IChargePointService _service = null;
  867. if (GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16)
  868. {
  869. _service = serviceProvider.GetRequiredService<ChargePoint16Service>();
  870. }
  871. else
  872. {
  873. _service = serviceProvider.GetRequiredService<ChargePoint201Service>();
  874. }
  875. var transactionDatas = _service.GetActiveSessionInfo(ChargeBoxId, new List<Measurand>()
  876. { Measurand.Voltage,
  877. Measurand.Current_Import,
  878. Measurand.SoC,
  879. Measurand.Power_Active_Import,
  880. Measurand.TotalEnergy,
  881. Measurand.ChargingCost
  882. }, SessionId, IdTag);
  883. if (transactionDatas == null)
  884. {
  885. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  886. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_RESULT;
  887. //statusCode = HttpStatusCode.NotFound;
  888. statusCode = StatusCodes.Status404NotFound;
  889. }
  890. else
  891. {
  892. List<ActiveSession> _innerData = new List<ActiveSession>();
  893. foreach (var transactionData in transactionDatas)
  894. {
  895. string currencyText = string.IsNullOrEmpty(transactionData.Fee)?"":transactionData.Fee.Split('|')[1];
  896. _innerData.Add(new ActiveSession()
  897. {
  898. ChargeBoxId = ChargeBoxId,
  899. SessionId = transactionData.Id,
  900. ElaspedTime = (int)DateTime.UtcNow.Subtract(transactionData.StartTime).TotalMinutes,
  901. ConnectorId = transactionData.ConnectorId,
  902. IdTag = transactionData.StartIdTag,
  903. Power = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Power_Active_Import).Select(x => x.Value).FirstOrDefault(),
  904. 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(),
  905. Current = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Current_Import).Select(x => x.Value).FirstOrDefault(),
  906. 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(),
  907. Energy = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.TotalEnergy).Select(x => x.Value).FirstOrDefault(),
  908. 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(),
  909. Voltage = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.Voltage).Select(x => x.Value).FirstOrDefault(),
  910. 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(),
  911. 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(),
  912. 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(),
  913. CurrentCost = transactionData.MeterValues == null ? "0" : transactionData.MeterValues.Where(x => x.Measurand == Packet.Messages.SubTypes.Measurand.ChargingCost).Select(x => x.Value).FirstOrDefault(),
  914. Currency = currencyText
  915. });
  916. decimal energy = decimal.Parse(_innerData[_innerData.Count - 1].Energy);
  917. energy = _innerData[_innerData.Count - 1].Energy_Format == UnitOfMeasure.Wh.ToString() ? Decimal.Divide(energy, 1000) : energy;
  918. }
  919. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  920. result.StatusCode = (int)CPO_StatusCode.Success;
  921. result.StatusMessage = CPO_StatusMessage.Success;
  922. //statusCode = HttpStatusCode.OK;
  923. statusCode = StatusCodes.Status200OK;
  924. }
  925. return StatusCode(statusCode, result);
  926. }
  927. catch (Exception ex)
  928. {
  929. result.ErrorDetail = ex.ToString();
  930. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  931. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  932. return StatusCode(statusCode, result);
  933. }
  934. }
  935. [Route("completedsession")]
  936. [Produces(typeof(CPOOuterResponse))]
  937. [HttpGet]
  938. public IActionResult CompletedSession(string ChargeBoxId, string SessionId = "", string IdTag = "", string StartTime = "", string StopTime = "")
  939. {
  940. var result = new CPOOuterResponse();
  941. //HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
  942. int statusCode = StatusCodes.Status500InternalServerError;
  943. try
  944. {
  945. string _CustomerId = string.Empty;
  946. if (!ContainsChargePoint(ChargeBoxId, out _CustomerId))
  947. {
  948. // 沒槍~ 沒得充...
  949. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CHARGEBOXID_DOESNT_EXIST;
  950. result.StatusCode = (int)CPO_StatusCode.CHARGEBOXID_ISNT_EXIST_OR_OFFLINE;
  951. //statusCode = HttpStatusCode.BadRequest;
  952. statusCode = StatusCodes.Status400BadRequest;
  953. return StatusCode(statusCode, result);
  954. }
  955. DateTime startDt = string.IsNullOrEmpty(StartTime) ? new DateTime(1991, 1, 1) : DateTime.Parse(StartTime);
  956. DateTime stopDt = string.IsNullOrEmpty(StopTime) ? new DateTime(1991, 1, 1) : DateTime.Parse(StopTime);
  957. // query meter value
  958. IChargePointService _service = null;
  959. if (GetChargePointOCPPProtocol(ChargeBoxId) == OCPPProtocolType.OCPP16)
  960. {
  961. _service = serviceProvider.GetRequiredService<ChargePoint16Service>();
  962. }
  963. else
  964. {
  965. _service = serviceProvider.GetRequiredService<ChargePoint201Service>();
  966. }
  967. var _innerData = _service.GetSessionDetail(ChargeBoxId, SessionId, IdTag, startDt, stopDt);
  968. if (_innerData == null)
  969. {
  970. result.StatusCode = (int)CPO_StatusCode.CANT_FOUND_DATA;
  971. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_SESSIONDETAIL;
  972. //statusCode = HttpStatusCode.NotFound;
  973. statusCode = StatusCodes.Status404NotFound;
  974. return StatusCode(statusCode, result);
  975. }
  976. result.Data = JsonConvert.SerializeObject(_innerData, EVCBConfiguration.JSONSERIALIZER_FORMAT);
  977. result.StatusCode = (int)CPO_StatusCode.Success;
  978. result.StatusMessage = CPO_StatusMessage.Success;
  979. //statusCode = HttpStatusCode.OK;
  980. statusCode = StatusCodes.Status200OK;
  981. return StatusCode(statusCode, result);
  982. }
  983. catch (Exception ex)
  984. {
  985. result.ErrorDetail = ex.ToString();
  986. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_UNEXPECTEDERROR;
  987. result.StatusCode = (int)CPO_StatusCode.UnexpectedError;
  988. return StatusCode(statusCode, result);
  989. }
  990. }
  991. #region private method
  992. private bool ContainsChargePoint(string chargeBoxId, out string customerId)
  993. {
  994. customerId = string.Empty;
  995. if (!Request.Headers.Keys.Contains(EVCBConfiguration.Header_PartnerId)) return false;
  996. customerId = Request.Headers[EVCBConfiguration.Header_PartnerId].First();
  997. ChargePoint201Service _service201 = serviceProvider.GetRequiredService<ChargePoint201Service>();
  998. ChargePoint16Service _service16 = serviceProvider.GetRequiredService<ChargePoint16Service>();
  999. return _service16.ContainsChargePoint(chargeBoxId, customerId) ? true : _service201.ContainsChargePoint(chargeBoxId, customerId) ? true : false;
  1000. }
  1001. private OCPPProtocolType GetChargePointOCPPProtocol(string chargeBoxId)
  1002. {
  1003. ChargePoint201Service _service201 = serviceProvider.GetRequiredService<ChargePoint201Service>();
  1004. ChargePoint16Service _service16 = serviceProvider.GetRequiredService<ChargePoint16Service>();
  1005. return _service201.GetMachineUpdatedOn(chargeBoxId) > _service16.GetMachineUpdatedOn(chargeBoxId)
  1006. ? OCPPProtocolType.OCPP201 : OCPPProtocolType.OCPP16;
  1007. }
  1008. private CPOOuterResponse GetErrorDescription(InternalHttpResult innerResponse)
  1009. {
  1010. CPOOuterResponse result = new CPOOuterResponse();
  1011. result.ErrorDetail = innerResponse.Exception == null ? null : innerResponse.Exception.ToString();
  1012. if (innerResponse.Status != HttpStatusCode.Accepted)
  1013. {
  1014. switch (innerResponse.ErrorCode)
  1015. {
  1016. #region Authorization
  1017. case 2000:
  1018. {
  1019. result.StatusCode = innerResponse.ErrorCode;
  1020. result.StatusMessage = string.Format("{0}-{1}", "InnerService", "Authorize Unexpected Error");
  1021. result.ErrorDetail = result.StatusMessage;
  1022. }
  1023. break;
  1024. case 2001:
  1025. case 2002:
  1026. case 2003:
  1027. {
  1028. result.StatusCode = innerResponse.ErrorCode;
  1029. result.StatusMessage = string.Format("{0}-{1}", "InnerService", innerResponse.Message);
  1030. }
  1031. break;
  1032. #endregion
  1033. case 2100:
  1034. case 2101:
  1035. case 2102:
  1036. case 2103:
  1037. case 2104:
  1038. case 2105:
  1039. case 2106:
  1040. {
  1041. result.StatusCode = innerResponse.ErrorCode;
  1042. result.StatusMessage = innerResponse.Message;
  1043. }
  1044. break;
  1045. case 2999:
  1046. {
  1047. result.StatusCode = innerResponse.ErrorCode;
  1048. result.StatusMessage = string.Format("{0}-{1}", "InnerService", "Unexpected Error");
  1049. result.ErrorDetail = result.StatusMessage;
  1050. }
  1051. break;
  1052. default:
  1053. {
  1054. result.StatusCode = 2998;
  1055. result.StatusMessage = CPO_StatusMessage.ERROR_MSG_CANT_FIND_ERRORCODE;
  1056. }
  1057. break;
  1058. }
  1059. }
  1060. return result;
  1061. }
  1062. #endregion
  1063. }
  1064. }