CoreProfileHandler.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.SqlClient;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using EVCB_OCPP.Domain;
  9. using EVCB_OCPP.Domain.Models.Database;
  10. using EVCB_OCPP.Packet.Features;
  11. using EVCB_OCPP.Packet.Messages;
  12. using EVCB_OCPP.Packet.Messages.Core;
  13. using EVCB_OCPP.Packet.Messages.SubTypes;
  14. using EVCB_OCPP.WSServer.Dto;
  15. using Newtonsoft.Json;
  16. using OCPPPackage.Profiles;
  17. using OCPPServer.Protocol;
  18. namespace EVCB_OCPP.WSServer.Message
  19. {
  20. internal partial class ProfileHandler
  21. {
  22. private List<string> idtag_RejecttionList = new List<string>() { "AC5CDC3D", "48C4CBD9257A" };
  23. int counnter = 0;
  24. internal MessageResult ExecuteCoreRequest(Actions action, ClientData session, IRequest request)
  25. {
  26. MessageResult result = new MessageResult() { Success = false };
  27. switch (action)
  28. {
  29. case Actions.BootNotification:
  30. {
  31. BootNotificationRequest _request = request as BootNotificationRequest;
  32. int heartbeat_interval = GlobalConfig.GetHEARTBEAT_INTERVAL();
  33. using (var db = new MainDBContext())
  34. {
  35. var _machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
  36. _machine.ChargeBoxSerialNumber = string.IsNullOrEmpty(_request.chargeBoxSerialNumber) ? string.Empty : _request.chargeBoxSerialNumber;
  37. _machine.ChargePointModel = string.IsNullOrEmpty(_request.chargePointModel) ? string.Empty : _request.chargePointModel;
  38. _machine.ChargePointVendor = string.IsNullOrEmpty(_request.chargePointVendor) ? string.Empty : _request.chargePointVendor;
  39. _machine.FW_CurrentVersion = string.IsNullOrEmpty(_request.firmwareVersion) ? string.Empty : _request.firmwareVersion;
  40. _machine.Iccid = string.IsNullOrEmpty(_request.iccid) ? string.Empty : _request.iccid;
  41. _machine.Imsi = string.IsNullOrEmpty(_request.imsi) ? string.Empty : _request.imsi;
  42. _machine.MeterSerialNumber = string.IsNullOrEmpty(_request.meterSerialNumber) ? string.Empty : _request.meterSerialNumber;
  43. _machine.MeterType = string.IsNullOrEmpty(_request.meterType) ? string.Empty : _request.meterType;
  44. db.SaveChanges();
  45. var configVaule = db.MachineConfigure.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.ConfigureName == StandardConfiguration.HeartbeatInterval)
  46. .Select(x => x.ConfigureSetting).FirstOrDefault();
  47. if (configVaule != null)
  48. {
  49. int.TryParse(configVaule, out heartbeat_interval);
  50. }
  51. }
  52. var confirm = new BootNotificationConfirmation() { currentTime = DateTime.Now, interval = heartbeat_interval, status = Packet.Messages.SubTypes.RegistrationStatus.Accepted };
  53. result.Message = confirm;
  54. result.Success = true;
  55. }
  56. break;
  57. case Actions.StatusNotification:
  58. {
  59. //只保留最新上報狀況
  60. StatusNotificationRequest _request = request as StatusNotificationRequest;
  61. {
  62. List<string> removeIds = new List<string>();
  63. ConnectorErrorStauts _oldStatus = null;
  64. using (var oldDB = new MainDBContext())
  65. {
  66. if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
  67. {
  68. _oldStatus = oldDB.ConnectorStatus.Where(x => x.ChargeBoxId == session.ChargeBoxId
  69. && x.ConnectorId == _request.connectorId).Select(x => new ConnectorErrorStauts
  70. {
  71. Status = x.Status,
  72. ChargePointErrorCodeId = x.ChargePointErrorCodeId,
  73. ErrorInfo = x.ErrorInfo,
  74. VendorId = x.VendorId,
  75. VendorErrorCode = x.VendorErrorCode
  76. }).FirstOrDefault();
  77. }
  78. removeIds = oldDB.ConnectorStatus.Where(x => x.ChargeBoxId == session.ChargeBoxId
  79. && x.ConnectorId == _request.connectorId).Select(x => x.Id).ToList();
  80. }
  81. using (var db = new MainDBContext())
  82. {
  83. foreach (var id in removeIds)
  84. {
  85. string query = "DELETE FROM [dbo].[ConnectorStatus] WHERE [Id]={0} ";
  86. db.Database.ExecuteSqlCommand(query, id);
  87. }
  88. db.SaveChanges();
  89. var _currentStatus = new Domain.Models.Database.ConnectorStatus()
  90. {
  91. ChargeBoxId = session.ChargeBoxId,
  92. ConnectorId = (byte)_request.connectorId,
  93. CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now,
  94. Status = (int)_request.status,
  95. ChargePointErrorCodeId = (int)_request.errorCode,
  96. ErrorInfo = _request.info,
  97. VendorId = _request.vendorId,
  98. VendorErrorCode = _request.vendorErrorCode,
  99. Id = Guid.NewGuid().ToString()
  100. };
  101. db.ConnectorStatus.Add(_currentStatus);
  102. if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted)
  103. {
  104. db.MachineError.Add(new MachineError()
  105. {
  106. ConnectorId = (byte)_request.connectorId,
  107. CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now,
  108. Status = (int)_request.status,
  109. ChargeBoxId = session.ChargeBoxId,
  110. ErrorCodeId = (int)_request.errorCode,
  111. ErrorInfo = _request.info,
  112. PreStatus = _oldStatus.Status,
  113. VendorErrorCode = _request.vendorErrorCode,
  114. VendorId = _request.vendorId
  115. });
  116. }
  117. db.SaveChanges();
  118. }
  119. }
  120. var confirm = new StatusNotificationConfirmation() { };
  121. result.Message = confirm;
  122. result.Success = true;
  123. }
  124. break;
  125. case Actions.Heartbeat:
  126. {
  127. using (var db = new MainDBContext())
  128. {
  129. var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
  130. if (machine != null)
  131. {
  132. db.Configuration.AutoDetectChangesEnabled = false;
  133. db.Configuration.ValidateOnSaveEnabled = false;
  134. db.Machine.Attach(machine);
  135. machine.HeartbeatUpdatedOn = DateTime.Now;
  136. db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
  137. db.SaveChanges();
  138. }
  139. var confirm = new HeartbeatConfirmation() { currentTime = DateTime.Now };
  140. result.Message = confirm;
  141. result.Success = true;
  142. }
  143. }
  144. break;
  145. case Actions.MeterValues:
  146. {
  147. MeterValuesRequest _request = request as MeterValuesRequest;
  148. if (_request.meterValue.Count > 0)
  149. {
  150. using (var db = new MeterValueDBContext())
  151. {
  152. foreach (var item in _request.meterValue)
  153. {
  154. foreach (var sampleVaule in item.sampledValue)
  155. {
  156. string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
  157. "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
  158. List<SqlParameter> parameter = new List<SqlParameter>
  159. {
  160. new SqlParameter("ChargeBoxId",session.ChargeBoxId),
  161. new SqlParameter("ConnectorId", (byte)_request.connectorId),
  162. new SqlParameter("Value",sampleVaule.value),
  163. new SqlParameter("CreatedOn",item.timestamp),
  164. new SqlParameter("ContextId",sampleVaule.context.HasValue ? (int)sampleVaule.context : 0),
  165. new SqlParameter("FormatId",sampleVaule.format.HasValue ? (int)sampleVaule.format : 0),
  166. new SqlParameter("MeasurandId",sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0),
  167. new SqlParameter("PhaseId",sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0),
  168. new SqlParameter("LocationId",sampleVaule.location.HasValue ? (int)sampleVaule.location : 0),
  169. new SqlParameter("UnitId",sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0),
  170. new SqlParameter("TransactionId",_request.transactionId.HasValue?_request.transactionId:-1),
  171. };
  172. db.Database.ExecuteSqlCommand(sp, parameter.ToArray());
  173. }
  174. }
  175. }
  176. }
  177. var confirm = new MeterValuesConfirmation() { };
  178. result.Message = confirm;
  179. result.Success = true;
  180. }
  181. break;
  182. case Actions.StartTransaction:
  183. {
  184. StartTransactionRequest _request = request as StartTransactionRequest;
  185. long _pastTime = DateTimeOffset.Now.AddYears(-20).ToUnixTimeSeconds();
  186. int _tranId = (int)(_pastTime % 100000000) * 10 + 1;
  187. //需處理StopTransactionOnInvalidId 情境,時間若和當前時間差距10秒,發動Authorize詢問後在回覆
  188. using (var db = new MainDBContext())
  189. {
  190. var _CustomerId = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).Include(x => x.Customer).
  191. Select(x => x.CustomerId).FirstOrDefault();
  192. db.TransactionRecord.Add(new TransactionRecord()
  193. {
  194. ChargeBoxId = session.ChargeBoxId,
  195. ConnectorId = (byte)_request.connectorId,
  196. CreatedOn = DateTime.Now,
  197. StartIdTag = _request.idTag,
  198. MeterStart = _request.meterStart,
  199. CustomerId = _CustomerId,
  200. StartTime = _request.timestamp,
  201. ReservationId = _request.reservationId.HasValue ? _request.reservationId.Value : 0,
  202. TransactionId = _tranId
  203. });
  204. db.SaveChanges();
  205. }
  206. var confirm = new StartTransactionConfirmation()
  207. {
  208. idTagInfo = new Packet.Messages.SubTypes.IdTagInfo()
  209. {
  210. status = idtag_RejecttionList.Contains(_request.idTag) ? AuthorizationStatus.Invalid : AuthorizationStatus.Accepted
  211. },
  212. transactionId = _tranId
  213. };
  214. result.Message = confirm;
  215. result.Success = true;
  216. }
  217. break;
  218. case Actions.StopTransaction:
  219. {
  220. StopTransactionRequest _request = request as StopTransactionRequest;
  221. List<TransactionDataRecord> _TransactionDatas = new List<TransactionDataRecord>();
  222. if (_request.transactionData != null)
  223. {
  224. if (_request.transactionData.Count > 0)
  225. {
  226. foreach (var item in _request.transactionData)
  227. {
  228. foreach (var sampleVaule in item.sampledValue)
  229. {
  230. _TransactionDatas.Add(new TransactionDataRecord()
  231. {
  232. ChargeBoxId = session.ChargeBoxId,
  233. MeasuredOn = item.timestamp,
  234. TransactionId = _request.transactionId,
  235. ContextId = sampleVaule.context.HasValue ? (int)sampleVaule.context : 0,
  236. FormatId = sampleVaule.format.HasValue ? (int)sampleVaule.format : 0,
  237. LocationId = sampleVaule.location.HasValue ? (int)sampleVaule.location : 0,
  238. MeasurandId = sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0,
  239. PhaseId = sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0,
  240. UnitId = sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0,
  241. Value = sampleVaule.value
  242. });
  243. }
  244. }
  245. }
  246. }
  247. using (var db = new MainDBContext())
  248. {
  249. var transaction = db.TransactionRecord.Where(x => x.TransactionId == _request.transactionId
  250. && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
  251. if (transaction != null)
  252. {
  253. transaction.MeterStop = _request.meterStop;
  254. transaction.StopTime = _request.timestamp;
  255. transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0;
  256. transaction.StopIdTag = _request.idTag;
  257. if (_TransactionDatas.Count > 0)
  258. {
  259. _TransactionDatas.ForEach(x => x.ConnectorId = (byte)transaction.ConnectorId);
  260. }
  261. db.SaveChanges();
  262. var confirm = new StopTransactionConfirmation()
  263. {
  264. idTagInfo = new Packet.Messages.SubTypes.IdTagInfo()
  265. {
  266. status = Packet.Messages.SubTypes.AuthorizationStatus.Accepted
  267. }
  268. };
  269. result.Message = confirm;
  270. result.Success = true;
  271. }
  272. else
  273. {
  274. result.Exception = new Exception("Can't find transactionId " + _request.transactionId);
  275. }
  276. }
  277. }
  278. break;
  279. case Actions.Authorize:
  280. {
  281. AuthorizeRequest _request = request as AuthorizeRequest;
  282. var confirm = new AuthorizeConfirmation()
  283. {
  284. idTagInfo = new Packet.Messages.SubTypes.IdTagInfo()
  285. {
  286. status = idtag_RejecttionList.Contains(_request.idTag) ? AuthorizationStatus.Invalid : AuthorizationStatus.Accepted
  287. }
  288. };
  289. result.Message = confirm;
  290. result.Success = true;
  291. }
  292. break;
  293. default:
  294. {
  295. Console.WriteLine(string.Format("Not Implement {0} Logic", request.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
  296. }
  297. break;
  298. }
  299. return result;
  300. }
  301. internal MessageResult ExecuteCoreConfirm(Actions action, ClientData session, IConfirmation confirm, string requestId)
  302. {
  303. MessageResult result = new MessageResult() { Success = true };
  304. switch (action)
  305. {
  306. case Actions.ChangeAvailability:
  307. {
  308. ChangeAvailabilityConfirmation _confirm = confirm as ChangeAvailabilityConfirmation;
  309. ChangeAvailabilityRequest _request = _confirm.GetRequest() as ChangeAvailabilityRequest;
  310. using (var db = new MainDBContext())
  311. {
  312. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  313. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  314. if (operation != null)
  315. {
  316. operation.FinishedOn = DateTime.Now;
  317. operation.Status = 1;//電樁有回覆
  318. operation.EVSE_Status = (int)_confirm.status;
  319. operation.EVSE_Value = _confirm.status.ToString();
  320. db.SaveChanges();
  321. }
  322. }
  323. }
  324. break;
  325. case Actions.ClearCache:
  326. {
  327. ClearCacheConfirmation _confirm = confirm as ClearCacheConfirmation;
  328. ClearCacheRequest _request = _confirm.GetRequest() as ClearCacheRequest;
  329. using (var db = new MainDBContext())
  330. {
  331. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  332. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  333. if (operation != null)
  334. {
  335. operation.FinishedOn = DateTime.Now;
  336. operation.Status = 1;//電樁有回覆
  337. operation.EVSE_Status = (int)_confirm.status;
  338. operation.EVSE_Value = _confirm.status.ToString();
  339. db.SaveChanges();
  340. }
  341. }
  342. }
  343. break;
  344. case Actions.RemoteStartTransaction:
  345. {
  346. RemoteStartTransactionConfirmation _confirm = confirm as RemoteStartTransactionConfirmation;
  347. RemoteStartTransactionRequest _request = _confirm.GetRequest() as RemoteStartTransactionRequest;
  348. using (var db = new MainDBContext())
  349. {
  350. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  351. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  352. if (operation != null)
  353. {
  354. operation.FinishedOn = DateTime.Now;
  355. operation.Status = 1;//電樁有回覆
  356. operation.EVSE_Status = (int)_confirm.status;
  357. operation.EVSE_Value = _confirm.status.ToString();
  358. db.SaveChanges();
  359. }
  360. }
  361. }
  362. break;
  363. case Actions.RemoteStopTransaction:
  364. {
  365. RemoteStopTransactionConfirmation _confirm = confirm as RemoteStopTransactionConfirmation;
  366. RemoteStopTransactionRequest _request = _confirm.GetRequest() as RemoteStopTransactionRequest;
  367. using (var db = new MainDBContext())
  368. {
  369. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  370. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  371. if (operation != null)
  372. {
  373. operation.FinishedOn = DateTime.Now;
  374. operation.Status = 1;//電樁有回覆
  375. operation.EVSE_Status = (int)_confirm.status;
  376. operation.EVSE_Value = _confirm.status.ToString();
  377. db.SaveChanges();
  378. }
  379. }
  380. }
  381. break;
  382. case Actions.Reset:
  383. {
  384. ResetConfirmation _confirm = confirm as ResetConfirmation;
  385. ResetRequest _request = _confirm.GetRequest() as ResetRequest;
  386. using (var db = new MainDBContext())
  387. {
  388. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  389. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  390. if (operation != null)
  391. {
  392. operation.FinishedOn = DateTime.Now;
  393. operation.Status = 1;//電樁有回覆
  394. operation.EVSE_Status = (int)_confirm.status;
  395. operation.EVSE_Value = _confirm.status.ToString();
  396. db.SaveChanges();
  397. }
  398. }
  399. }
  400. break;
  401. case Actions.ChangeConfiguration:
  402. {
  403. ChangeConfigurationConfirmation _confirm = confirm as ChangeConfigurationConfirmation;
  404. ChangeConfigurationRequest _request = _confirm.GetRequest() as ChangeConfigurationRequest;
  405. using (var db = new MainDBContext())
  406. {
  407. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  408. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  409. if (operation != null)
  410. {
  411. operation.FinishedOn = DateTime.Now;
  412. operation.Status = 1;//電樁有回覆
  413. operation.EVSE_Status = (int)_confirm.status;
  414. operation.EVSE_Value = _confirm.status.ToString();
  415. }
  416. if (_confirm.status == Packet.Messages.SubTypes.ConfigurationStatus.Accepted || _confirm.status == Packet.Messages.SubTypes.ConfigurationStatus.RebootRequired)
  417. {
  418. var configure = db.MachineConfigure.Where(x => x.ChargeBoxId == session.ChargeBoxId).ToList();
  419. var foundConfig = configure.Find(x => x.ConfigureName == _request.key);
  420. if (foundConfig != null)
  421. {
  422. foundConfig.ReadOnly = false;
  423. foundConfig.ConfigureSetting = _request.value;
  424. }
  425. else
  426. {
  427. db.MachineConfigure.Add(new MachineConfigure()
  428. {
  429. ChargeBoxId = session.ChargeBoxId,
  430. ConfigureName = _request.key,
  431. ReadOnly = false,
  432. ConfigureSetting = _request.value
  433. });
  434. }
  435. }
  436. db.SaveChanges();
  437. }
  438. }
  439. break;
  440. case Actions.GetConfiguration:
  441. {
  442. GetConfigurationConfirmation _confirm = confirm as GetConfigurationConfirmation;
  443. GetConfigurationRequest _request = _confirm.GetRequest() as GetConfigurationRequest;
  444. using (var db = new MainDBContext())
  445. {
  446. var configure = db.MachineConfigure.Where(x => x.ChargeBoxId == session.ChargeBoxId).ToList();
  447. if (_confirm.configurationKey != null)
  448. {
  449. foreach (var item in _confirm.configurationKey)
  450. {
  451. var foundConfig = configure.Find(x => x.ConfigureName == item.key);
  452. if (foundConfig != null)
  453. {
  454. foundConfig.ReadOnly = item.IsReadOnly;
  455. foundConfig.ConfigureSetting = item.value;
  456. }
  457. else
  458. {
  459. db.MachineConfigure.Add(new MachineConfigure()
  460. {
  461. ChargeBoxId = session.ChargeBoxId,
  462. ConfigureName = item.key,
  463. ReadOnly = item.IsReadOnly,
  464. ConfigureSetting = item.value,
  465. Exists=true
  466. });
  467. }
  468. }
  469. }
  470. if (_confirm.unknownKey != null)
  471. {
  472. foreach (var item in _confirm.unknownKey)
  473. {
  474. var foundConfig = configure.Find(x => x.ConfigureName == item);
  475. if (foundConfig != null)
  476. {
  477. foundConfig.ReadOnly = true;
  478. foundConfig.ConfigureSetting = string.Empty;
  479. foundConfig.Exists = false;
  480. }
  481. else
  482. {
  483. db.MachineConfigure.Add(new MachineConfigure()
  484. {
  485. ChargeBoxId = session.ChargeBoxId,
  486. ConfigureName = item
  487. });
  488. }
  489. }
  490. }
  491. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  492. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  493. if (operation != null)
  494. {
  495. operation.FinishedOn = DateTime.Now;
  496. operation.Status = 1;//電樁有回覆
  497. operation.EVSE_Status = 1;
  498. operation.EVSE_Value = JsonConvert.SerializeObject(_confirm.configurationKey, Formatting.None);
  499. }
  500. db.SaveChanges();
  501. }
  502. }
  503. break;
  504. default:
  505. {
  506. Console.WriteLine(string.Format("Not Implement {0} Logic", confirm.GetType().ToString().Replace("OCPPPackage.Messages.Core.", "")));
  507. }
  508. break;
  509. }
  510. return result;
  511. }
  512. internal MessageResult ReceivedCoreError(Actions action, string errorMsg, ClientData session, string requestId)
  513. {
  514. MessageResult result = new MessageResult() { Success = true };
  515. switch (action)
  516. {
  517. case Actions.ChangeAvailability:
  518. case Actions.ChangeConfiguration:
  519. case Actions.ClearCache:
  520. case Actions.RemoteStartTransaction:
  521. case Actions.RemoteStopTransaction:
  522. case Actions.Reset:
  523. case Actions.GetConfiguration:
  524. {
  525. using (var db = new MainDBContext())
  526. {
  527. var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
  528. x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
  529. if (operation != null)
  530. {
  531. operation.FinishedOn = DateTime.Now;
  532. operation.Status = 1;//電樁有回覆
  533. operation.EVSE_Status = (int)255;//錯誤
  534. operation.EVSE_Value = errorMsg;
  535. db.SaveChanges();
  536. }
  537. }
  538. }
  539. break;
  540. default:
  541. {
  542. Console.WriteLine(string.Format("Not Implement {0} Logic", action));
  543. }
  544. break;
  545. }
  546. return result;
  547. }
  548. }
  549. }