CoreProfileHandler.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. using EVCB_OCPP.Domain;
  2. using EVCB_OCPP.Domain.Models.Database;
  3. using EVCB_OCPP.Packet.Features;
  4. using EVCB_OCPP.Packet.Messages;
  5. using EVCB_OCPP.Packet.Messages.Core;
  6. using EVCB_OCPP.Packet.Messages.SubTypes;
  7. using EVCB_OCPP.WSServer.Dto;
  8. using EVCB_OCPP.WSServer.Service;
  9. using Newtonsoft.Json;
  10. using NLog;
  11. using OCPPPackage.Profiles;
  12. using OCPPServer.Protocol;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Data.Entity;
  16. using System.Data.SqlClient;
  17. using System.Diagnostics;
  18. using System.Linq;
  19. using System.Threading.Tasks;
  20. namespace EVCB_OCPP.WSServer.Message
  21. {
  22. internal partial class ProfileHandler
  23. {
  24. static private ILogger logger = NLog.LogManager.GetCurrentClassLogger();
  25. async internal Task<MessageResult> ExecuteCoreRequest(Actions action, ClientData session, IRequest request)
  26. {
  27. Stopwatch watch = new Stopwatch();
  28. if (action == Actions.Heartbeat)
  29. {
  30. watch.Start();
  31. }
  32. MessageResult result = new MessageResult() { Success = false };
  33. try
  34. {
  35. switch (action)
  36. {
  37. case Actions.DataTransfer:
  38. {
  39. var confirm = new DataTransferConfirmation() { status = DataTransferStatus.Rejected };
  40. result.Message = confirm;
  41. result.Success = true;
  42. }
  43. break;
  44. case Actions.BootNotification:
  45. {
  46. BootNotificationRequest _request = request as BootNotificationRequest;
  47. int heartbeat_interval = GlobalConfig.GetHEARTBEAT_INTERVAL();
  48. using (var db = new MainDBContext())
  49. {
  50. var _machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
  51. _machine.ChargeBoxSerialNumber = string.IsNullOrEmpty(_request.chargeBoxSerialNumber) ? string.Empty : _request.chargeBoxSerialNumber;
  52. _machine.ChargePointModel = string.IsNullOrEmpty(_request.chargePointModel) ? string.Empty : _request.chargePointModel;
  53. _machine.ChargePointVendor = string.IsNullOrEmpty(_request.chargePointVendor) ? string.Empty : _request.chargePointVendor;
  54. _machine.FW_CurrentVersion = string.IsNullOrEmpty(_request.firmwareVersion) ? string.Empty : _request.firmwareVersion;
  55. _machine.Iccid = string.IsNullOrEmpty(_request.iccid) ? string.Empty : _request.iccid;
  56. _machine.Imsi = string.IsNullOrEmpty(_request.imsi) ? string.Empty : _request.imsi;
  57. _machine.MeterSerialNumber = string.IsNullOrEmpty(_request.meterSerialNumber) ? string.Empty : _request.meterSerialNumber;
  58. _machine.MeterType = string.IsNullOrEmpty(_request.meterType) ? string.Empty : _request.meterType;
  59. db.SaveChanges();
  60. var configVaule = db.MachineConfiguration.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.ConfigureName == StandardConfiguration.HeartbeatInterval)
  61. .Select(x => x.ConfigureSetting).FirstOrDefault();
  62. if (configVaule != null)
  63. {
  64. int.TryParse(configVaule, out heartbeat_interval);
  65. }
  66. }
  67. var confirm = new BootNotificationConfirmation() { currentTime = DateTime.Now, interval = heartbeat_interval, status = Packet.Messages.SubTypes.RegistrationStatus.Accepted };
  68. result.Message = confirm;
  69. result.Success = true;
  70. }
  71. break;
  72. case Actions.StatusNotification:
  73. {
  74. //只保留最新上報狀況
  75. StatusNotificationRequest _request = request as StatusNotificationRequest;
  76. int preStatus = 0;
  77. using (var db = new MainDBContext())
  78. {
  79. var _oldStatus = db.ConnectorStatus.Where(x => x.ChargeBoxId == session.ChargeBoxId
  80. && x.ConnectorId == _request.connectorId).AsNoTracking().FirstOrDefault();
  81. if (_oldStatus != null && (_request.status != (ChargePointStatus)_oldStatus.Status || _request.status == ChargePointStatus.Faulted))
  82. {
  83. preStatus = _oldStatus.Status;
  84. db.Configuration.AutoDetectChangesEnabled = false;
  85. db.Configuration.ValidateOnSaveEnabled = false;
  86. db.ConnectorStatus.Attach(_oldStatus);
  87. _oldStatus.CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now;
  88. _oldStatus.Status = (int)_request.status;
  89. _oldStatus.ChargePointErrorCodeId = (int)_request.errorCode;
  90. _oldStatus.ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info;
  91. _oldStatus.VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId;
  92. _oldStatus.VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode;
  93. db.Entry(_oldStatus).Property(x => x.CreatedOn).IsModified = true;
  94. db.Entry(_oldStatus).Property(x => x.Status).IsModified = true;
  95. db.Entry(_oldStatus).Property(x => x.ChargePointErrorCodeId).IsModified = true;
  96. db.Entry(_oldStatus).Property(x => x.ErrorInfo).IsModified = true;
  97. db.Entry(_oldStatus).Property(x => x.VendorId).IsModified = true;
  98. db.Entry(_oldStatus).Property(x => x.VendorErrorCode).IsModified = true;
  99. }
  100. if (_oldStatus == null)
  101. {
  102. var _currentStatus = new Domain.Models.Database.ConnectorStatus()
  103. {
  104. ChargeBoxId = session.ChargeBoxId,
  105. ConnectorId = (byte)_request.connectorId,
  106. CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now,
  107. Status = (int)_request.status,
  108. ChargePointErrorCodeId = (int)_request.errorCode,
  109. ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info,
  110. VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId,
  111. VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode,
  112. Id = Guid.NewGuid().ToString()
  113. };
  114. db.ConnectorStatus.Add(_currentStatus);
  115. }
  116. if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
  117. {
  118. db.MachineError.Add(new MachineError()
  119. {
  120. ConnectorId = (byte)_request.connectorId,
  121. CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now,
  122. Status = (int)_request.status,
  123. ChargeBoxId = session.ChargeBoxId,
  124. ErrorCodeId = (int)_request.errorCode,
  125. ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info,
  126. PreStatus = _oldStatus == null ? -1 : preStatus,
  127. VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode,
  128. VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId
  129. });
  130. }
  131. db.SaveChanges();
  132. }
  133. if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
  134. {
  135. var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
  136. var notification = businessService.NotifyFaultStatus(new ErrorDetails()
  137. {
  138. ChargeBoxId = session.ChargeBoxId,
  139. ConnectorId = _request.connectorId,
  140. ErrorCode = _request.errorCode,
  141. Info = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info,
  142. OCcuredOn = _request.timestamp ?? DateTime.Now,
  143. VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode,
  144. });
  145. }
  146. var confirm = new StatusNotificationConfirmation() { };
  147. result.Message = confirm;
  148. result.Success = true;
  149. }
  150. break;
  151. case Actions.Heartbeat:
  152. {
  153. //Task updateBeatTask = Task.Run(async () =>
  154. // {
  155. // using (var db = new MainDBContext())
  156. // {
  157. // var machine = new Machine() { Id = session.MachineId };
  158. // if (machine != null)
  159. // {
  160. // db.Configuration.AutoDetectChangesEnabled = false;
  161. // db.Configuration.ValidateOnSaveEnabled = false;
  162. // db.Machine.Attach(machine);
  163. // machine.HeartbeatUpdatedOn = DateTime.Now;
  164. // machine.ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1;
  165. // db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
  166. // db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
  167. // await db.SaveChangesAsync();
  168. // }
  169. // }
  170. // });
  171. var confirm = new HeartbeatConfirmation() { currentTime = DateTime.Now };
  172. result.Message = confirm;
  173. result.Success = true;
  174. }
  175. break;
  176. case Actions.MeterValues:
  177. {
  178. MeterValuesRequest _request = request as MeterValuesRequest;
  179. if (_request.meterValue.Count > 0)
  180. {
  181. using (var db = new MeterValueDBContext())
  182. {
  183. foreach (var item in _request.meterValue)
  184. {
  185. foreach (var sampleVaule in item.sampledValue)
  186. {
  187. decimal value = Convert.ToDecimal(sampleVaule.value);
  188. string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
  189. "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
  190. List<SqlParameter> parameter = new List<SqlParameter>
  191. {
  192. new SqlParameter("ChargeBoxId",session.ChargeBoxId),
  193. new SqlParameter("ConnectorId", (byte)_request.connectorId),
  194. new SqlParameter("Value",value),
  195. new SqlParameter("CreatedOn",item.timestamp),
  196. new SqlParameter("ContextId",sampleVaule.context.HasValue ? (int)sampleVaule.context : 0),
  197. new SqlParameter("FormatId",sampleVaule.format.HasValue ? (int)sampleVaule.format : 0),
  198. new SqlParameter("MeasurandId",sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0),
  199. new SqlParameter("PhaseId",sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0),
  200. new SqlParameter("LocationId",sampleVaule.location.HasValue ? (int)sampleVaule.location : 0),
  201. new SqlParameter("UnitId",sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0),
  202. new SqlParameter("TransactionId",_request.transactionId.HasValue?_request.transactionId:-1),
  203. };
  204. db.Database.ExecuteSqlCommand(sp, parameter.ToArray());
  205. }
  206. }
  207. }
  208. }
  209. var confirm = new MeterValuesConfirmation() { };
  210. result.Message = confirm;
  211. result.Success = true;
  212. }
  213. break;
  214. case Actions.StartTransaction:
  215. {
  216. StartTransactionRequest _request = request as StartTransactionRequest;
  217. int _transactionId = -1;
  218. var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
  219. //var _idTagInfo = new IdTagInfo() { status = AuthorizationStatus.Accepted };
  220. var _idTagInfo = _request.idTag == "Backend" ? new IdTagInfo() { expiryDate = DateTime.UtcNow.AddDays(1), status = AuthorizationStatus.Accepted } : await businessService.Authorize(session.ChargeBoxId, _request.idTag);
  221. using (var db = new MainDBContext())
  222. {
  223. var _CustomerId = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).Include(x => x.Customer).
  224. Select(x => x.CustomerId).FirstOrDefault();
  225. var _existedTx = db.TransactionRecord.Where(x => x.CustomerId == _CustomerId && x.ChargeBoxId == session.ChargeBoxId
  226. && x.ConnectorId == _request.connectorId && x.StartTime == _request.timestamp).Select(C => new { C.Id }).AsNoTracking().FirstOrDefault();
  227. TransactionRecord _newTransaction = new TransactionRecord();
  228. if (_existedTx == null)
  229. {
  230. _newTransaction = new TransactionRecord()
  231. {
  232. ChargeBoxId = session.ChargeBoxId,
  233. ConnectorId = (byte)_request.connectorId,
  234. CreatedOn = DateTime.Now,
  235. StartIdTag = _request.idTag,
  236. MeterStart = _request.meterStart,
  237. CustomerId = _CustomerId,
  238. StartTime = _request.timestamp,
  239. ReservationId = _request.reservationId.HasValue ? _request.reservationId.Value : 0,
  240. };
  241. db.TransactionRecord.Add(_newTransaction);
  242. db.SaveChanges();
  243. _transactionId = _newTransaction.Id;
  244. Console.WriteLine("***************************************************** ");
  245. Console.WriteLine(string.Format("{0} :TransactionId {1} ", session.ChargeBoxId, _newTransaction.Id));
  246. Console.WriteLine("***************************************************** ");
  247. }
  248. else
  249. {
  250. _transactionId = _existedTx.Id;
  251. Console.WriteLine("Duplication ***************************************************** " + _existedTx.Id);
  252. }
  253. }
  254. var confirm = new StartTransactionConfirmation()
  255. {
  256. idTagInfo = _idTagInfo,
  257. transactionId = _transactionId
  258. };
  259. result.Message = confirm;
  260. result.Success = true;
  261. }
  262. break;
  263. case Actions.StopTransaction:
  264. {
  265. StopTransactionRequest _request = request as StopTransactionRequest;
  266. List<TransactionDataRecord> _TransactionDatas = new List<TransactionDataRecord>();
  267. int _ConnectorId = 0;
  268. var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
  269. var _idTagInfo = new IdTagInfo() { status = AuthorizationStatus.Accepted };
  270. using (var db = new MainDBContext())
  271. {
  272. var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId
  273. && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
  274. if (transaction != null)
  275. {
  276. _ConnectorId = transaction.ConnectorId;
  277. transaction.MeterStop = _request.meterStop;
  278. transaction.StopTime = _request.timestamp;
  279. transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0;
  280. transaction.StopIdTag = _request.idTag;
  281. if (_TransactionDatas.Count > 0)
  282. {
  283. _TransactionDatas.ForEach(x => x.ConnectorId = (byte)transaction.ConnectorId);
  284. }
  285. await db.SaveChangesAsync();
  286. var confirm = new StopTransactionConfirmation()
  287. {
  288. idTagInfo = _idTagInfo
  289. };
  290. result.Message = confirm;
  291. result.Success = true;
  292. }
  293. else
  294. {
  295. result.Exception = new Exception("Can't find transactionId " + _request.transactionId);
  296. }
  297. }
  298. if (_request.transactionData != null)
  299. {
  300. if (_request.transactionData.Count > 0)
  301. {
  302. using (var _meterDb = new MeterValueDBContext())
  303. {
  304. foreach (var item in _request.transactionData)
  305. {
  306. foreach (var sampleVaule in item.sampledValue)
  307. {
  308. decimal value = Convert.ToDecimal(sampleVaule.value);
  309. string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
  310. "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
  311. List<SqlParameter> parameter = new List<SqlParameter>
  312. {
  313. new SqlParameter("ChargeBoxId",session.ChargeBoxId),
  314. new SqlParameter("ConnectorId", (byte)_ConnectorId),
  315. new SqlParameter("Value",value),
  316. new SqlParameter("CreatedOn",item.timestamp),
  317. new SqlParameter("ContextId",sampleVaule.context.HasValue ? (int)sampleVaule.context : 0),
  318. new SqlParameter("FormatId",sampleVaule.format.HasValue ? (int)sampleVaule.format : 0),
  319. new SqlParameter("MeasurandId",sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0),
  320. new SqlParameter("PhaseId",sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0),
  321. new SqlParameter("LocationId",sampleVaule.location.HasValue ? (int)sampleVaule.location : 0),
  322. new SqlParameter("UnitId",sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0),
  323. new SqlParameter("TransactionId",_request.transactionId),
  324. };
  325. _meterDb.Database.ExecuteSqlCommand(sp, parameter.ToArray());
  326. }
  327. }
  328. }
  329. }
  330. }
  331. }
  332. break;
  333. case Actions.Authorize:
  334. {
  335. AuthorizeRequest _request = request as AuthorizeRequest;
  336. var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString());
  337. var confirm = new AuthorizeConfirmation()
  338. {
  339. idTagInfo = _request.idTag == "Backend" ? new IdTagInfo() { expiryDate = DateTime.UtcNow.AddDays(1), status = AuthorizationStatus.Accepted } : await businessService.Authorize(session.ChargeBoxId, _request.idTag)
  340. };
  341. result.Message = confirm;
  342. result.Success = true;
  343. }
  344. break;
  345. default:
  346. {
  347. Console.WriteLine(string.Format("Not Implement {0} Logic(ExecuteCoreRequest)", request.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
  348. }
  349. break;
  350. }
  351. }
  352. catch (Exception ex)
  353. {
  354. logger.Fatal(string.Format("chargeBoxId:{0} {1}", session.ChargeBoxId, action));
  355. logger.Fatal(string.Format("Data {0}", request.ToString()));
  356. logger.Fatal(string.Format("Error {0}", ex.ToString()));
  357. result.Exception = ex;
  358. }
  359. if (action == Actions.Heartbeat)
  360. {
  361. watch.Stop();
  362. if (watch.ElapsedMilliseconds / 1000 > 3)
  363. {
  364. logger.Error("Processing Hearbeat costs " + watch.ElapsedMilliseconds / 1000 + " seconds");
  365. }
  366. }
  367. return result;
  368. }
  369. internal MessageResult ExecuteCoreConfirm(Actions action, ClientData session, IConfirmation confirm, string requestId)
  370. {
  371. MessageResult result = new MessageResult() { Success = true };
  372. switch (action)
  373. {
  374. case Actions.DataTransfer:
  375. {
  376. DataTransferConfirmation _confirm = confirm as DataTransferConfirmation;
  377. DataTransferRequest _request = _confirm.GetRequest() as DataTransferRequest;
  378. using (var db = new MainDBContext())
  379. {
  380. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  381. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  382. if (operation != null)
  383. {
  384. operation.FinishedOn = DateTime.Now;
  385. operation.Status = 1;//電樁有回覆
  386. operation.EVSE_Status = (int)_confirm.status;
  387. operation.EVSE_Value = string.IsNullOrEmpty(_confirm.data) ? "" : _confirm.data;
  388. db.SaveChanges();
  389. }
  390. if (_request.messageId == "ID_FirmwareVersion")
  391. {
  392. var machine = new Machine() { Id = session.MachineId };
  393. if (machine != null)
  394. {
  395. db.Configuration.AutoDetectChangesEnabled = false;
  396. db.Configuration.ValidateOnSaveEnabled = false;
  397. db.Machine.Attach(machine);
  398. machine.BoardVersions = _confirm.data;
  399. db.Entry(machine).Property(x => x.BoardVersions).IsModified = true;
  400. db.SaveChanges();
  401. }
  402. }
  403. }
  404. }
  405. break;
  406. case Actions.ChangeAvailability:
  407. {
  408. ChangeAvailabilityConfirmation _confirm = confirm as ChangeAvailabilityConfirmation;
  409. ChangeAvailabilityRequest _request = _confirm.GetRequest() as ChangeAvailabilityRequest;
  410. using (var db = new MainDBContext())
  411. {
  412. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  413. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  414. if (operation != null)
  415. {
  416. operation.FinishedOn = DateTime.Now;
  417. operation.Status = 1;//電樁有回覆
  418. operation.EVSE_Status = (int)_confirm.status;
  419. operation.EVSE_Value = _confirm.status.ToString();
  420. db.SaveChanges();
  421. }
  422. }
  423. }
  424. break;
  425. case Actions.ClearCache:
  426. {
  427. ClearCacheConfirmation _confirm = confirm as ClearCacheConfirmation;
  428. ClearCacheRequest _request = _confirm.GetRequest() as ClearCacheRequest;
  429. using (var db = new MainDBContext())
  430. {
  431. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  432. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  433. if (operation != null)
  434. {
  435. operation.FinishedOn = DateTime.Now;
  436. operation.Status = 1;//電樁有回覆
  437. operation.EVSE_Status = (int)_confirm.status;
  438. operation.EVSE_Value = _confirm.status.ToString();
  439. db.SaveChanges();
  440. }
  441. }
  442. }
  443. break;
  444. case Actions.RemoteStartTransaction:
  445. {
  446. RemoteStartTransactionConfirmation _confirm = confirm as RemoteStartTransactionConfirmation;
  447. RemoteStartTransactionRequest _request = _confirm.GetRequest() as RemoteStartTransactionRequest;
  448. using (var db = new MainDBContext())
  449. {
  450. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  451. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  452. if (operation != null)
  453. {
  454. operation.FinishedOn = DateTime.Now;
  455. operation.Status = 1;//電樁有回覆
  456. operation.EVSE_Status = (int)_confirm.status;
  457. operation.EVSE_Value = _confirm.status.ToString();
  458. db.SaveChanges();
  459. }
  460. }
  461. }
  462. break;
  463. case Actions.RemoteStopTransaction:
  464. {
  465. RemoteStopTransactionConfirmation _confirm = confirm as RemoteStopTransactionConfirmation;
  466. RemoteStopTransactionRequest _request = _confirm.GetRequest() as RemoteStopTransactionRequest;
  467. using (var db = new MainDBContext())
  468. {
  469. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  470. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  471. if (operation != null)
  472. {
  473. operation.FinishedOn = DateTime.Now;
  474. operation.Status = 1;//電樁有回覆
  475. operation.EVSE_Status = (int)_confirm.status;
  476. operation.EVSE_Value = _confirm.status.ToString();
  477. db.SaveChanges();
  478. }
  479. }
  480. }
  481. break;
  482. case Actions.Reset:
  483. {
  484. ResetConfirmation _confirm = confirm as ResetConfirmation;
  485. ResetRequest _request = _confirm.GetRequest() as ResetRequest;
  486. using (var db = new MainDBContext())
  487. {
  488. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  489. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  490. if (operation != null)
  491. {
  492. operation.FinishedOn = DateTime.Now;
  493. operation.Status = 1;//電樁有回覆
  494. operation.EVSE_Status = (int)_confirm.status;
  495. operation.EVSE_Value = _confirm.status.ToString();
  496. db.SaveChanges();
  497. }
  498. }
  499. }
  500. break;
  501. case Actions.ChangeConfiguration:
  502. {
  503. ChangeConfigurationConfirmation _confirm = confirm as ChangeConfigurationConfirmation;
  504. ChangeConfigurationRequest _request = _confirm.GetRequest() as ChangeConfigurationRequest;
  505. using (var db = new MainDBContext())
  506. {
  507. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  508. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  509. if (operation != null)
  510. {
  511. operation.FinishedOn = DateTime.Now;
  512. operation.Status = 1;//電樁有回覆
  513. operation.EVSE_Status = (int)_confirm.status;
  514. operation.EVSE_Value = _confirm.status.ToString();
  515. }
  516. if (_confirm.status == Packet.Messages.SubTypes.ConfigurationStatus.Accepted || _confirm.status == Packet.Messages.SubTypes.ConfigurationStatus.RebootRequired)
  517. {
  518. var configure = db.MachineConfiguration.Where(x => x.ChargeBoxId == session.ChargeBoxId).ToList();
  519. var foundConfig = configure.Find(x => x.ConfigureName == _request.key);
  520. if (foundConfig != null)
  521. {
  522. foundConfig.ReadOnly = false;
  523. foundConfig.ConfigureSetting = _request.value;
  524. }
  525. else
  526. {
  527. db.MachineConfiguration.Add(new MachineConfiguration()
  528. {
  529. ChargeBoxId = session.ChargeBoxId,
  530. ConfigureName = _request.key,
  531. ReadOnly = false,
  532. ConfigureSetting = _request.value
  533. });
  534. }
  535. }
  536. db.SaveChanges();
  537. }
  538. }
  539. break;
  540. case Actions.GetConfiguration:
  541. {
  542. GetConfigurationConfirmation _confirm = confirm as GetConfigurationConfirmation;
  543. GetConfigurationRequest _request = _confirm.GetRequest() as GetConfigurationRequest;
  544. using (var db = new MainDBContext())
  545. {
  546. var configure = db.MachineConfiguration.Where(x => x.ChargeBoxId == session.ChargeBoxId).ToList();
  547. if (_confirm.configurationKey != null)
  548. {
  549. foreach (var item in _confirm.configurationKey)
  550. {
  551. string oldValue = string.Empty;
  552. var foundConfig = configure.Find(x => x.ConfigureName == item.key);
  553. if (foundConfig != null)
  554. {
  555. if (foundConfig.ConfigureName == "SecurityProfile")
  556. {
  557. oldValue = foundConfig.ConfigureSetting;
  558. }
  559. foundConfig.ReadOnly = item.IsReadOnly;
  560. foundConfig.ConfigureSetting = string.IsNullOrEmpty(item.value) ? string.Empty : item.value;
  561. }
  562. else
  563. {
  564. db.MachineConfiguration.Add(new MachineConfiguration()
  565. {
  566. ChargeBoxId = session.ChargeBoxId,
  567. ConfigureName = item.key,
  568. ReadOnly = item.IsReadOnly,
  569. ConfigureSetting = string.IsNullOrEmpty(item.value) ? string.Empty : item.value,
  570. Exists = true
  571. });
  572. }
  573. if (foundConfig.ConfigureName == "SecurityProfile")
  574. {
  575. if (foundConfig.ConfigureSetting != oldValue)
  576. {
  577. session.ResetSecurityProfile = true;
  578. }
  579. }
  580. }
  581. }
  582. if (_confirm.unknownKey != null)
  583. {
  584. foreach (var item in _confirm.unknownKey)
  585. {
  586. var foundConfig = configure.Find(x => x.ConfigureName == item);
  587. if (foundConfig != null)
  588. {
  589. foundConfig.ReadOnly = true;
  590. foundConfig.ConfigureSetting = string.Empty;
  591. foundConfig.Exists = false;
  592. }
  593. else
  594. {
  595. db.MachineConfiguration.Add(new MachineConfiguration()
  596. {
  597. ChargeBoxId = session.ChargeBoxId,
  598. ConfigureName = item
  599. });
  600. }
  601. }
  602. }
  603. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  604. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  605. if (operation != null)
  606. {
  607. operation.FinishedOn = DateTime.Now;
  608. operation.Status = 1;//電樁有回覆
  609. operation.EVSE_Status = 1;
  610. operation.EVSE_Value = JsonConvert.SerializeObject(_confirm.configurationKey, Formatting.None);
  611. }
  612. db.SaveChanges();
  613. }
  614. }
  615. break;
  616. case Actions.UnlockConnector:
  617. {
  618. UnlockConnectorConfirmation _confirm = confirm as UnlockConnectorConfirmation;
  619. UnlockConnectorRequest _request = _confirm.GetRequest() as UnlockConnectorRequest;
  620. using (var db = new MainDBContext())
  621. {
  622. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  623. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  624. if (operation != null)
  625. {
  626. operation.FinishedOn = DateTime.Now;
  627. operation.Status = 1;//電樁有回覆
  628. operation.EVSE_Status = (int)_confirm.status;
  629. operation.EVSE_Value = _confirm.status.ToString();
  630. db.SaveChanges();
  631. }
  632. }
  633. }
  634. break;
  635. default:
  636. {
  637. Console.WriteLine(string.Format("Not Implement {0} Logic(ExecuteCoreConfirm)", confirm.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
  638. }
  639. break;
  640. }
  641. return result;
  642. }
  643. internal MessageResult ReceivedCoreError(Actions action, string errorMsg, ClientData session, string requestId)
  644. {
  645. MessageResult result = new MessageResult() { Success = true };
  646. switch (action)
  647. {
  648. case Actions.ChangeAvailability:
  649. case Actions.ChangeConfiguration:
  650. case Actions.ClearCache:
  651. case Actions.RemoteStartTransaction:
  652. case Actions.RemoteStopTransaction:
  653. case Actions.Reset:
  654. case Actions.GetConfiguration:
  655. case Actions.UnlockConnector:
  656. case Actions.DataTransfer:
  657. {
  658. if (action == Actions.DataTransfer)
  659. {
  660. logger.Debug(string.Format("DataTransfer Error {0}: {1}", session.ChargeBoxId, requestId));
  661. }
  662. using (var db = new MainDBContext())
  663. {
  664. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  665. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  666. if (operation != null)
  667. {
  668. operation.FinishedOn = DateTime.Now;
  669. operation.Status = 1;//電樁有回覆
  670. operation.EVSE_Status = (int)255;//錯誤
  671. operation.EVSE_Value = errorMsg;
  672. db.SaveChanges();
  673. }
  674. }
  675. }
  676. break;
  677. default:
  678. {
  679. Console.WriteLine(string.Format("Not Implement {0} Logic(ReceivedCoreError)", action));
  680. }
  681. break;
  682. }
  683. return result;
  684. }
  685. }
  686. }