Răsfoiți Sursa

加入StopTx 遇到Exception 不要回電樁
訊息讓電樁重送

Jessica Tseng 2 ani în urmă
părinte
comite
0bc54e37b1

+ 103 - 94
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -68,6 +68,7 @@ namespace EVCB_OCPP.WSServer.Message
         static private ILogger logger = NLog.LogManager.GetCurrentClassLogger();
         string webConnectionString = ConfigurationManager.ConnectionStrings["WebDBContext"].ConnectionString;
         private OuterHttpClient httpClient = new OuterHttpClient();
+     
         async internal Task<MessageResult> ExecuteCoreRequest(Actions action, ClientData session, IRequest request)
         {
             Stopwatch watch = new Stopwatch();
@@ -572,129 +573,130 @@ namespace EVCB_OCPP.WSServer.Message
                             {
                                 _idTagInfo = new IdTagInfo() { expiryDate = DateTime.UtcNow.AddDays(1), status = AuthorizationStatus.Accepted };
                             }
-
-                            using (var db = new MainDBContext())
-                            {
-                                var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId
-                                 && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
-
-
-
-                                //遠傳太久以前的停止充電 直接拒絕 避免電樁持續重送~~~~~~~
-                                if (_request.timestamp < new DateTime(2021, 11, 1))
+                            try
+                            {                              
+                                using (var db = new MainDBContext())
                                 {
-                                    var confirm = new StopTransactionConfirmation()
-                                    {
-                                        idTagInfo = new IdTagInfo()
-                                        {
-                                            status = AuthorizationStatus.Invalid
-                                        }
+                                    var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId
+                                     && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
 
-                                    };
 
-                                    result.Message = confirm;
-                                    result.Success = true;
-                                    return result;
-                                }
 
-
-                                if (transaction != null)
-                                {
-                                    var confirm = new StopTransactionConfirmation()
+                                    //遠傳太久以前的停止充電 直接拒絕 避免電樁持續重送~~~~~~~
+                                    if (_request.timestamp < new DateTime(2021, 11, 1))
                                     {
-                                        idTagInfo = _idTagInfo
+                                        var confirm = new StopTransactionConfirmation()
+                                        {
+                                            idTagInfo = new IdTagInfo()
+                                            {
+                                                status = AuthorizationStatus.Invalid
+                                            }
 
-                                    };
+                                        };
 
-                                    //Avoid rewrite transaction data
-                                    if (transaction.StopTime != GlobalConfig.DefaultNullTime)
-                                    {
                                         result.Message = confirm;
                                         result.Success = true;
                                         return result;
                                     }
 
-                                    _ConnectorId = transaction.ConnectorId;
-                                    transaction.MeterStop = _request.meterStop;
-                                    transaction.StopTime = _request.timestamp.ToUniversalTime();
-                                    transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0;
-                                    transaction.StopReason = _request.reason.HasValue ? _request.reason.Value.ToString() : Reason.Local.ToString();
-                                    transaction.StopIdTag = _request.idTag;
-                                    transaction.Receipt = string.Empty;
-                                    transaction.Cost = session.IsBilling ? -1 : 0;
 
-                                    if (_request.transactionData != null && _request.transactionData.Count > 0)
+                                    if (transaction != null)
                                     {
-                                        _request.transactionData[0].sampledValue.Add(new SampledValue()
+                                        var confirm = new StopTransactionConfirmation()
                                         {
-                                            context = ReadingContext.Transaction_End,
-                                            format = ValueFormat.Raw,
-                                            location = Location.Outlet,
-                                            phase = _request.transactionData[0].sampledValue.Where(x => x.context.HasValue).Select(x => x.phase).FirstOrDefault(),
-                                            unit = UnitOfMeasure.Wh,
-                                            measurand = Measurand.TotalEnergy,
-                                            value = decimal.Subtract(transaction.MeterStop, transaction.MeterStart).ToString()
-                                        });
-                                    }
+                                            idTagInfo = _idTagInfo
 
+                                        };
 
-                                    await db.SaveChangesAsync();
+                                        //Avoid rewrite transaction data
+                                        if (transaction.StopTime != GlobalConfig.DefaultNullTime)
+                                        {
+                                            result.Message = confirm;
+                                            result.Success = true;
+                                            return result;
+                                        }
 
+                                        _ConnectorId = transaction.ConnectorId;
+                                        transaction.MeterStop = _request.meterStop;
+                                        transaction.StopTime = _request.timestamp.ToUniversalTime();
+                                        transaction.StopReasonId = _request.reason.HasValue ? (int)_request.reason.Value : 0;
+                                        transaction.StopReason = _request.reason.HasValue ? _request.reason.Value.ToString() : Reason.Local.ToString();
+                                        transaction.StopIdTag = _request.idTag;
+                                        transaction.Receipt = string.Empty;
+                                        transaction.Cost = session.IsBilling ? -1 : 0;
 
-                                    if (session.IsBilling)
-                                    {
-                                        db.ServerMessage.Add(new ServerMessage()
+                                        if (_request.transactionData != null && _request.transactionData.Count > 0)
                                         {
-                                            ChargeBoxId = session.ChargeBoxId,
-                                            CreatedBy = "Server",
-                                            CreatedOn = DateTime.UtcNow,
-                                            OutAction = Actions.DataTransfer.ToString(),
-                                            OutRequest = JsonConvert.SerializeObject(
-                                                       new DataTransferRequest()
-                                                       {
-                                                           messageId = "ID_TxEnergy",
-                                                           vendorId = "Phihong Technology",
-                                                           data = JsonConvert.SerializeObject(new { txId = _request.transactionId, ConnectorId = transaction.ConnectorId })
-                                                       },
-                                                       new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                            SerialNo = Guid.NewGuid().ToString(),
-                                            InMessage = string.Empty
+                                            _request.transactionData[0].sampledValue.Add(new SampledValue()
+                                            {
+                                                context = ReadingContext.Transaction_End,
+                                                format = ValueFormat.Raw,
+                                                location = Location.Outlet,
+                                                phase = _request.transactionData[0].sampledValue.Where(x => x.context.HasValue).Select(x => x.phase).FirstOrDefault(),
+                                                unit = UnitOfMeasure.Wh,
+                                                measurand = Measurand.TotalEnergy,
+                                                value = decimal.Subtract(transaction.MeterStop, transaction.MeterStart).ToString()
+                                            });
+                                        }
 
-                                        });
 
-                                        db.SaveChanges();
-                                    }
+                                        await db.SaveChangesAsync();
 
-                                    result.Message = confirm;
-                                    result.Success = true;
-                                }
-                                else
-                                {
 
-                                    result.Exception = new Exception("Can't find transactionId " + _request.transactionId);
+                                        if (session.IsBilling)
+                                        {
+                                            db.ServerMessage.Add(new ServerMessage()
+                                            {
+                                                ChargeBoxId = session.ChargeBoxId,
+                                                CreatedBy = "Server",
+                                                CreatedOn = DateTime.UtcNow,
+                                                OutAction = Actions.DataTransfer.ToString(),
+                                                OutRequest = JsonConvert.SerializeObject(
+                                                           new DataTransferRequest()
+                                                           {
+                                                               messageId = "ID_TxEnergy",
+                                                               vendorId = "Phihong Technology",
+                                                               data = JsonConvert.SerializeObject(new { txId = _request.transactionId, ConnectorId = transaction.ConnectorId })
+                                                           },
+                                                           new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                                                SerialNo = Guid.NewGuid().ToString(),
+                                                InMessage = string.Empty
+
+                                            });
 
+                                            db.SaveChanges();
+                                        }
+
+                                        result.Message = confirm;
+                                        result.Success = true;
+                                    }
+                                    else
+                                    {
+
+                                        result.Exception = new Exception("Can't find transactionId " + _request.transactionId);
+
+                                    }
                                 }
-                            }
 
-                            #region Save MeterValue
+                                #region Save MeterValue
 
-                            if (_request.transactionData != null)
-                            {
-                                if (_request.transactionData.Count > 0)
+                                if (_request.transactionData != null)
                                 {
-                                    using (var _meterDb = new MeterValueDBContext())
+                                    if (_request.transactionData.Count > 0)
                                     {
-                                        foreach (var item in _request.transactionData)
+                                        using (var _meterDb = new MeterValueDBContext())
                                         {
-                                            foreach (var sampleVaule in item.sampledValue)
+                                            foreach (var item in _request.transactionData)
                                             {
-                                                decimal value = Convert.ToDecimal(sampleVaule.value);
+                                                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";
+                                                    string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
+                                 "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
 
-                                                List<SqlParameter> parameter = new List<SqlParameter>
+                                                    List<SqlParameter> parameter = new List<SqlParameter>
                                         {
                                               new SqlParameter("ChargeBoxId",session.ChargeBoxId),
                                               new SqlParameter("ConnectorId",  (byte)_ConnectorId),
@@ -710,17 +712,24 @@ namespace EVCB_OCPP.WSServer.Message
                                           };
 
 
-                                                _meterDb.Database.ExecuteSqlCommand(sp, parameter.ToArray());
+                                                    _meterDb.Database.ExecuteSqlCommand(sp, parameter.ToArray());
+                                                }
                                             }
                                         }
-                                    }
 
 
+                                    }
                                 }
-                            }
-
-                            #endregion
 
+                                #endregion
+                            }
+                            catch (Exception ex)
+                            {
+                                result.Exception = new Exception("TransactionId " + _request.transactionId + " " + ex.Message);
+                                result.CallErrorMsg = "Reject Response Message";
+                                result.Success = false;
+                                // return result;
+                            }
                         }
                         break;
                     case Actions.Authorize:
@@ -1051,7 +1060,7 @@ namespace EVCB_OCPP.WSServer.Message
 
                                                 };
 
-                                                logger.Debug("completed_session "+JsonConvert.SerializeObject(request));
+                                                logger.Debug("completed_session " + JsonConvert.SerializeObject(request));
                                                 var response = await httpClient.Post(customerInfo.ApiUrl + "completed_session", new Dictionary<string, string>()
                                                 {
                                                     { "PartnerId",session.CustomerId.ToString()}

+ 4 - 4
EVCB_OCPP.WSServer/Properties/AssemblyInfo.cs

@@ -31,8 +31,8 @@ using System.Runtime.InteropServices;
 //
 // 您可以指定所有的值,或將組建編號或修訂編號設為預設值
 // 指定為預設值: 
-// [assembly: AssemblyVersion("1.0.6.0")]
-[assembly: AssemblyVersion("1.0.6.0")]
-[assembly: AssemblyFileVersion("1.0.6.0")]
+// [assembly: AssemblyVersion("1.2.0.0")]
+[assembly: AssemblyVersion("1.2.0.0")]
+[assembly: AssemblyFileVersion("1.2.0.0")]
 
-[assembly: AssemblyInformationalVersion("d6fe7ae")]
+[assembly: AssemblyInformationalVersion("92c630c")]

+ 10 - 3
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -937,10 +937,17 @@ namespace EVCB_OCPP.WSServer
                             }
                             else
                             {
-                                string response = BasicMessageHandler.GenerateCallError(analysisResult.UUID, OCPPErrorCodes.InternalError, OCPPErrorDescription.InternalError);
-                                string errorMsg = replyResult.Exception != null ? replyResult.Exception.ToString() : string.Empty;
+                                if (action == Actions.StopTransaction && replyResult.CallErrorMsg == "Reject Response Message")
+                                {
+                                    //do nothing 
+                                }
+                                else
+                                {
+                                    string response = BasicMessageHandler.GenerateCallError(analysisResult.UUID, OCPPErrorCodes.InternalError, OCPPErrorDescription.InternalError);
+                                    string errorMsg = replyResult.Exception != null ? replyResult.Exception.ToString() : string.Empty;
 
-                                Send(session, response, string.Format("{0} {1}", analysisResult.Action, "Error"), errorMsg);
+                                    Send(session, response, string.Format("{0} {1}", analysisResult.Action, "Error"), errorMsg);
+                                }
                             }
 
                             if (action == Actions.StartTransaction)

BIN
SuperWebSocket/bin/Debug/SuperWebSocket.dll


BIN
SuperWebSocket/bin/Debug/SuperWebSocket.pdb