using EVCB_OCPP.Domain; using EVCB_OCPP.Domain.Models.Database; using EVCB_OCPP.Packet.Features; using EVCB_OCPP.Packet.Messages; using EVCB_OCPP.Packet.Messages.Core; using EVCB_OCPP.Packet.Messages.SubTypes; using EVCB_OCPP.WSServer.Dto; using EVCB_OCPP.WSServer.Service; using Newtonsoft.Json; using NLog; using OCPPPackage.Profiles; using OCPPServer.Protocol; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.SqlClient; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace EVCB_OCPP.WSServer.Message { internal partial class ProfileHandler { static private ILogger logger = NLog.LogManager.GetCurrentClassLogger(); async internal Task ExecuteCoreRequest(Actions action, ClientData session, IRequest request) { Stopwatch watch = new Stopwatch(); if (action == Actions.Heartbeat) { watch.Start(); } MessageResult result = new MessageResult() { Success = false }; try { switch (action) { case Actions.DataTransfer: { var confirm = new DataTransferConfirmation() { status = DataTransferStatus.Rejected }; result.Message = confirm; result.Success = true; } break; case Actions.BootNotification: { BootNotificationRequest _request = request as BootNotificationRequest; int heartbeat_interval = GlobalConfig.GetHEARTBEAT_INTERVAL(); using (var db = new MainDBContext()) { var _machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault(); _machine.ChargeBoxSerialNumber = string.IsNullOrEmpty(_request.chargeBoxSerialNumber) ? string.Empty : _request.chargeBoxSerialNumber; _machine.ChargePointModel = string.IsNullOrEmpty(_request.chargePointModel) ? string.Empty : _request.chargePointModel; _machine.ChargePointVendor = string.IsNullOrEmpty(_request.chargePointVendor) ? string.Empty : _request.chargePointVendor; _machine.FW_CurrentVersion = string.IsNullOrEmpty(_request.firmwareVersion) ? string.Empty : _request.firmwareVersion; _machine.Iccid = string.IsNullOrEmpty(_request.iccid) ? string.Empty : _request.iccid; _machine.Imsi = string.IsNullOrEmpty(_request.imsi) ? string.Empty : _request.imsi; _machine.MeterSerialNumber = string.IsNullOrEmpty(_request.meterSerialNumber) ? string.Empty : _request.meterSerialNumber; _machine.MeterType = string.IsNullOrEmpty(_request.meterType) ? string.Empty : _request.meterType; db.SaveChanges(); var configVaule = db.MachineConfiguration.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.ConfigureName == StandardConfiguration.HeartbeatInterval) .Select(x => x.ConfigureSetting).FirstOrDefault(); if (configVaule != null) { int.TryParse(configVaule, out heartbeat_interval); } } var confirm = new BootNotificationConfirmation() { currentTime = DateTime.Now, interval = session.IsPending ? heartbeat_interval : 5, status = session.IsPending ? Packet.Messages.SubTypes.RegistrationStatus.Accepted : RegistrationStatus.Pending }; session.IsPending = !session.IsPending; result.Message = confirm; result.Success = true; } break; case Actions.StatusNotification: { //只保留最新上報狀況 StatusNotificationRequest _request = request as StatusNotificationRequest; int preStatus = 0; using (var db = new MainDBContext()) { var _oldStatus = db.ConnectorStatus.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.ConnectorId == _request.connectorId).AsNoTracking().FirstOrDefault(); if (_oldStatus != null && (_request.status != (ChargePointStatus)_oldStatus.Status || _request.status == ChargePointStatus.Faulted)) { preStatus = _oldStatus.Status; db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false; db.ConnectorStatus.Attach(_oldStatus); _oldStatus.CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now; _oldStatus.Status = (int)_request.status; _oldStatus.ChargePointErrorCodeId = (int)_request.errorCode; _oldStatus.ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info; _oldStatus.VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId; _oldStatus.VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode; db.Entry(_oldStatus).Property(x => x.CreatedOn).IsModified = true; db.Entry(_oldStatus).Property(x => x.Status).IsModified = true; db.Entry(_oldStatus).Property(x => x.ChargePointErrorCodeId).IsModified = true; db.Entry(_oldStatus).Property(x => x.ErrorInfo).IsModified = true; db.Entry(_oldStatus).Property(x => x.VendorId).IsModified = true; db.Entry(_oldStatus).Property(x => x.VendorErrorCode).IsModified = true; } if (_oldStatus == null) { var _currentStatus = new Domain.Models.Database.ConnectorStatus() { ChargeBoxId = session.ChargeBoxId, ConnectorId = (byte)_request.connectorId, CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now, Status = (int)_request.status, ChargePointErrorCodeId = (int)_request.errorCode, ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info, VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId, VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode, Id = Guid.NewGuid().ToString() }; db.ConnectorStatus.Add(_currentStatus); } if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted) { db.MachineError.Add(new MachineError() { ConnectorId = (byte)_request.connectorId, CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.Now, Status = (int)_request.status, ChargeBoxId = session.ChargeBoxId, ErrorCodeId = (int)_request.errorCode, ErrorInfo = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info, PreStatus = _oldStatus == null ? -1 : preStatus, VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode, VendorId = string.IsNullOrEmpty(_request.vendorId) ? string.Empty : _request.vendorId }); } db.SaveChanges(); } if (_request.status == Packet.Messages.SubTypes.ChargePointStatus.Faulted) { var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString()); var notification = businessService.NotifyFaultStatus(new ErrorDetails() { ChargeBoxId = session.ChargeBoxId, ConnectorId = _request.connectorId, ErrorCode = _request.errorCode, Info = string.IsNullOrEmpty(_request.info) ? string.Empty : _request.info, OCcuredOn = _request.timestamp ?? DateTime.Now, VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode, }); } var confirm = new StatusNotificationConfirmation() { }; result.Message = confirm; result.Success = true; } break; case Actions.Heartbeat: { //Task updateBeatTask = Task.Run(async () => // { // using (var db = new MainDBContext()) // { // var machine = new Machine() { Id = session.MachineId }; // if (machine != null) // { // db.Configuration.AutoDetectChangesEnabled = false; // db.Configuration.ValidateOnSaveEnabled = false; // db.Machine.Attach(machine); // machine.HeartbeatUpdatedOn = DateTime.Now; // machine.ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1; // db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true; // db.Entry(machine).Property(x => x.ConnectionType).IsModified = true; // await db.SaveChangesAsync(); // } // } // }); var confirm = new HeartbeatConfirmation() { currentTime = DateTime.Now }; result.Message = confirm; result.Success = true; } break; case Actions.MeterValues: { MeterValuesRequest _request = request as MeterValuesRequest; if (_request.meterValue.Count > 0) { using (var db = new MeterValueDBContext()) { foreach (var item in _request.meterValue) { foreach (var sampleVaule in item.sampledValue) { decimal value = Convert.ToDecimal(sampleVaule.value); string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," + "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId"; List parameter = new List { new SqlParameter("ChargeBoxId",session.ChargeBoxId), new SqlParameter("ConnectorId", (byte)_request.connectorId), new SqlParameter("Value",value), new SqlParameter("CreatedOn",item.timestamp), new SqlParameter("ContextId",sampleVaule.context.HasValue ? (int)sampleVaule.context : 0), new SqlParameter("FormatId",sampleVaule.format.HasValue ? (int)sampleVaule.format : 0), new SqlParameter("MeasurandId",sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0), new SqlParameter("PhaseId",sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0), new SqlParameter("LocationId",sampleVaule.location.HasValue ? (int)sampleVaule.location : 0), new SqlParameter("UnitId",sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0), new SqlParameter("TransactionId",_request.transactionId.HasValue?_request.transactionId:-1), }; db.Database.ExecuteSqlCommand(sp, parameter.ToArray()); } } } } var confirm = new MeterValuesConfirmation() { }; result.Message = confirm; result.Success = true; } break; case Actions.StartTransaction: { StartTransactionRequest _request = request as StartTransactionRequest; int _transactionId = -1; var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString()); //var _idTagInfo = new IdTagInfo() { status = AuthorizationStatus.Accepted }; var _idTagInfo = _request.idTag == "Backend" ? new IdTagInfo() { expiryDate = DateTime.UtcNow.AddDays(1), status = AuthorizationStatus.Accepted } : await businessService.Authorize(session.ChargeBoxId, _request.idTag); using (var db = new MainDBContext()) { var _CustomerId = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).Include(x => x.Customer). Select(x => x.CustomerId).FirstOrDefault(); var _existedTx = db.TransactionRecord.Where(x => x.CustomerId == _CustomerId && x.ChargeBoxId == session.ChargeBoxId && x.ConnectorId == _request.connectorId && x.StartTime == _request.timestamp).Select(C => new { C.Id }).AsNoTracking().FirstOrDefault(); TransactionRecord _newTransaction = new TransactionRecord(); if (_existedTx == null) { _newTransaction = new TransactionRecord() { ChargeBoxId = session.ChargeBoxId, ConnectorId = (byte)_request.connectorId, CreatedOn = DateTime.Now, StartIdTag = _request.idTag, MeterStart = _request.meterStart, CustomerId = _CustomerId, StartTime = _request.timestamp, ReservationId = _request.reservationId.HasValue ? _request.reservationId.Value : 0, }; db.TransactionRecord.Add(_newTransaction); db.SaveChanges(); _transactionId = _newTransaction.Id; Console.WriteLine("***************************************************** "); Console.WriteLine(string.Format("{0} :TransactionId {1} ", session.ChargeBoxId, _newTransaction.Id)); Console.WriteLine("***************************************************** "); } else { _transactionId = _existedTx.Id; Console.WriteLine("Duplication ***************************************************** " + _existedTx.Id); } } var confirm = new StartTransactionConfirmation() { idTagInfo = _idTagInfo, transactionId = _transactionId }; result.Message = confirm; result.Success = true; } break; case Actions.StopTransaction: { StopTransactionRequest _request = request as StopTransactionRequest; List _TransactionDatas = new List(); int _ConnectorId = 0; var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString()); var _idTagInfo = new IdTagInfo() { status = AuthorizationStatus.Accepted }; using (var db = new MainDBContext()) { var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault(); if (transaction != null) { _ConnectorId = transaction.ConnectorId; transaction.MeterStop = _request.meterStop; transaction.StopTime = _request.timestamp; transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0; transaction.StopIdTag = _request.idTag; if (_TransactionDatas.Count > 0) { _TransactionDatas.ForEach(x => x.ConnectorId = (byte)transaction.ConnectorId); } await db.SaveChangesAsync(); var confirm = new StopTransactionConfirmation() { idTagInfo = _idTagInfo }; result.Message = confirm; result.Success = true; } else { result.Exception = new Exception("Can't find transactionId " + _request.transactionId); } } if (_request.transactionData != null) { if (_request.transactionData.Count > 0) { using (var _meterDb = new MeterValueDBContext()) { foreach (var item in _request.transactionData) { foreach (var sampleVaule in item.sampledValue) { decimal value = Convert.ToDecimal(sampleVaule.value); string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," + "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId"; List parameter = new List { new SqlParameter("ChargeBoxId",session.ChargeBoxId), new SqlParameter("ConnectorId", (byte)_ConnectorId), new SqlParameter("Value",value), new SqlParameter("CreatedOn",item.timestamp), new SqlParameter("ContextId",sampleVaule.context.HasValue ? (int)sampleVaule.context : 0), new SqlParameter("FormatId",sampleVaule.format.HasValue ? (int)sampleVaule.format : 0), new SqlParameter("MeasurandId",sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0), new SqlParameter("PhaseId",sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0), new SqlParameter("LocationId",sampleVaule.location.HasValue ? (int)sampleVaule.location : 0), new SqlParameter("UnitId",sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0), new SqlParameter("TransactionId",_request.transactionId), }; _meterDb.Database.ExecuteSqlCommand(sp, parameter.ToArray()); } } } } } } break; case Actions.Authorize: { AuthorizeRequest _request = request as AuthorizeRequest; var businessService = BusinessServiceFactory.CreateBusinessService(session.CustomerId.ToString()); var confirm = new AuthorizeConfirmation() { idTagInfo = _request.idTag == "Backend" ? new IdTagInfo() { expiryDate = DateTime.UtcNow.AddDays(1), status = AuthorizationStatus.Accepted } : await businessService.Authorize(session.ChargeBoxId, _request.idTag) }; result.Message = confirm; result.Success = true; } break; default: { Console.WriteLine(string.Format("Not Implement {0} Logic(ExecuteCoreRequest)", request.GetType().ToString().Replace("OCPPPackage.Messages.Core.", ""))); } break; } } catch (Exception ex) { logger.Fatal(string.Format("chargeBoxId:{0} {1}", session.ChargeBoxId, action)); logger.Fatal(string.Format("Data {0}", request.ToString())); logger.Fatal(string.Format("Error {0}", ex.ToString())); result.Exception = ex; } if (action == Actions.Heartbeat) { watch.Stop(); if (watch.ElapsedMilliseconds / 1000 > 3) { logger.Error("Processing Hearbeat costs " + watch.ElapsedMilliseconds / 1000 + " seconds"); } } return result; } internal MessageResult ExecuteCoreConfirm(Actions action, ClientData session, IConfirmation confirm, string requestId) { MessageResult result = new MessageResult() { Success = true }; switch (action) { case Actions.DataTransfer: { DataTransferConfirmation _confirm = confirm as DataTransferConfirmation; DataTransferRequest _request = _confirm.GetRequest() as DataTransferRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = string.IsNullOrEmpty(_confirm.data) ? "" : _confirm.data; db.SaveChanges(); } if (_request.messageId == "ID_FirmwareVersion") { var machine = new Machine() { Id = session.MachineId }; if (machine != null) { db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false; db.Machine.Attach(machine); machine.BoardVersions = _confirm.data; db.Entry(machine).Property(x => x.BoardVersions).IsModified = true; db.SaveChanges(); } } } } break; case Actions.ChangeAvailability: { ChangeAvailabilityConfirmation _confirm = confirm as ChangeAvailabilityConfirmation; ChangeAvailabilityRequest _request = _confirm.GetRequest() as ChangeAvailabilityRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); db.SaveChanges(); } } } break; case Actions.ClearCache: { ClearCacheConfirmation _confirm = confirm as ClearCacheConfirmation; ClearCacheRequest _request = _confirm.GetRequest() as ClearCacheRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); db.SaveChanges(); } } } break; case Actions.RemoteStartTransaction: { RemoteStartTransactionConfirmation _confirm = confirm as RemoteStartTransactionConfirmation; RemoteStartTransactionRequest _request = _confirm.GetRequest() as RemoteStartTransactionRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); db.SaveChanges(); } } } break; case Actions.RemoteStopTransaction: { RemoteStopTransactionConfirmation _confirm = confirm as RemoteStopTransactionConfirmation; RemoteStopTransactionRequest _request = _confirm.GetRequest() as RemoteStopTransactionRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); db.SaveChanges(); } } } break; case Actions.Reset: { ResetConfirmation _confirm = confirm as ResetConfirmation; ResetRequest _request = _confirm.GetRequest() as ResetRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); db.SaveChanges(); } } } break; case Actions.ChangeConfiguration: { ChangeConfigurationConfirmation _confirm = confirm as ChangeConfigurationConfirmation; ChangeConfigurationRequest _request = _confirm.GetRequest() as ChangeConfigurationRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); } if (_confirm.status == Packet.Messages.SubTypes.ConfigurationStatus.Accepted || _confirm.status == Packet.Messages.SubTypes.ConfigurationStatus.RebootRequired) { var configure = db.MachineConfiguration.Where(x => x.ChargeBoxId == session.ChargeBoxId).ToList(); var foundConfig = configure.Find(x => x.ConfigureName == _request.key); if (foundConfig != null) { foundConfig.ReadOnly = false; foundConfig.ConfigureSetting = _request.value; } else { db.MachineConfiguration.Add(new MachineConfiguration() { ChargeBoxId = session.ChargeBoxId, ConfigureName = _request.key, ReadOnly = false, ConfigureSetting = _request.value }); } } db.SaveChanges(); } } break; case Actions.GetConfiguration: { try { GetConfigurationConfirmation _confirm = confirm as GetConfigurationConfirmation; // GetConfigurationRequest _request = _confirm.GetRequest() as GetConfigurationRequest; using (var db = new MainDBContext()) { var configure = db.MachineConfiguration.Where(x => x.ChargeBoxId == session.ChargeBoxId).ToList(); if (_confirm.configurationKey != null) { foreach (var item in _confirm.configurationKey) { string oldValue = string.Empty; if (item.key == null) { Console.WriteLine("*********************"); } var foundConfig = configure.Find(x => x.ConfigureName == item.key); if (foundConfig != null) { if (foundConfig.ConfigureName == null) { Console.WriteLine("*********************"); } if (foundConfig.ConfigureName == "SecurityProfile") { oldValue = foundConfig.ConfigureSetting; } foundConfig.ReadOnly = item.IsReadOnly; foundConfig.ConfigureSetting = string.IsNullOrEmpty(item.value) ? string.Empty : item.value; } else { db.MachineConfiguration.Add(new MachineConfiguration() { ChargeBoxId = session.ChargeBoxId, ConfigureName = item.key, ReadOnly = item.IsReadOnly, ConfigureSetting = string.IsNullOrEmpty(item.value) ? string.Empty : item.value, Exists = true }); } } } if (_confirm.unknownKey != null) { foreach (var item in _confirm.unknownKey) { var foundConfig = configure.Find(x => x.ConfigureName == item); if (foundConfig != null) { foundConfig.ReadOnly = true; foundConfig.ConfigureSetting = string.Empty; foundConfig.Exists = false; } else { db.MachineConfiguration.Add(new MachineConfiguration() { ChargeBoxId = session.ChargeBoxId, ConfigureName = item }); } } } var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = 1; operation.EVSE_Value = JsonConvert.SerializeObject(_confirm.configurationKey, Formatting.None); } db.SaveChanges(); } } catch (Exception ex) { logger.Error(ex.ToString()); } } break; case Actions.UnlockConnector: { UnlockConnectorConfirmation _confirm = confirm as UnlockConnectorConfirmation; UnlockConnectorRequest _request = _confirm.GetRequest() as UnlockConnectorRequest; using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)_confirm.status; operation.EVSE_Value = _confirm.status.ToString(); db.SaveChanges(); } } } break; default: { Console.WriteLine(string.Format("Not Implement {0} Logic(ExecuteCoreConfirm)", confirm.GetType().ToString().Replace("OCPPPackage.Messages.Core.", ""))); } break; } return result; } internal MessageResult ReceivedCoreError(Actions action, string errorMsg, ClientData session, string requestId) { MessageResult result = new MessageResult() { Success = true }; switch (action) { case Actions.ChangeAvailability: case Actions.ChangeConfiguration: case Actions.ClearCache: case Actions.RemoteStartTransaction: case Actions.RemoteStopTransaction: case Actions.Reset: case Actions.GetConfiguration: case Actions.UnlockConnector: case Actions.DataTransfer: { if (action == Actions.DataTransfer) { logger.Debug(string.Format("DataTransfer Error {0}: {1}", session.ChargeBoxId, requestId)); } using (var db = new MainDBContext()) { var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault(); if (operation != null) { operation.FinishedOn = DateTime.Now; operation.Status = 1;//電樁有回覆 operation.EVSE_Status = (int)255;//錯誤 operation.EVSE_Value = errorMsg; db.SaveChanges(); } } } break; default: { Console.WriteLine(string.Format("Not Implement {0} Logic(ReceivedCoreError)", action)); } break; } return result; } } }