Explorar o código

1. revert heartbeatcheck design
2. add type parammeter to uspInsertMachineConnectionLog
3. add type parammeter to uspInsertMeterValueRecord

Robert %!s(int64=2) %!d(string=hai) anos
pai
achega
57a8e858c5

BIN=BIN
EVCB_OCPP.WSServer/DLL/EVCB_OCPP.Domain.dll


+ 62 - 0
EVCB_OCPP.WSServer/Helper/DbExtention.cs

@@ -0,0 +1,62 @@
+using Microsoft.Data.SqlClient;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EVCB_OCPP.WSServer.Helper
+{
+    public static class DbExtention
+    {
+        public static async Task<(bool, int)> SaveChangesUntilSuccessAsync(this DbContext context)
+        {
+            bool result = false;
+            int rows = 0;
+            do
+            {
+                (result, rows) = await context.TrySaveChangesAsync();
+            }
+            while (!result);
+            return (result, rows);
+        }
+
+        public static async Task<(bool, int)> TrySaveChangesAsync(this DbContext context)
+        {
+            int affectedRows = 0;
+            try
+            {
+                affectedRows = await context.SaveChangesAsync();
+                return (true, affectedRows);
+            }
+            catch (Exception e)
+            {
+                return (false, affectedRows);
+            }
+        }
+
+        public static void AddInsertMeterValueRecordSqlParameters(this List<SqlParameter> sqlParameters,
+            string chargeBoxId, byte connectorId, decimal value, DateTime createdOn
+            ,int contextId, int formatId, int measurandId, int phaseId
+            ,int locationId,int unitId,int transactionId)
+        {
+            List<SqlParameter> parameter = new List<SqlParameter>
+            {
+                new SqlParameter("ChargeBoxId", SqlDbType.NVarChar, 50){ Value = chargeBoxId },
+                new SqlParameter("ConnectorId", SqlDbType.TinyInt) { Value = connectorId },
+                new SqlParameter("Value", SqlDbType.Decimal) { Value = value, Precision = 18, Scale = 8 },
+                new SqlParameter("CreatedOn", SqlDbType.DateTime) { Value = createdOn },
+                new SqlParameter("ContextId", SqlDbType.Int) { Value = contextId },
+                new SqlParameter("FormatId", SqlDbType.Int) { Value = formatId },
+                new SqlParameter("MeasurandId", SqlDbType.Int) { Value = measurandId },
+                new SqlParameter("PhaseId", SqlDbType.Int) { Value = phaseId },
+                new SqlParameter("LocationId", SqlDbType.Int) { Value = locationId },
+                new SqlParameter("UnitId", SqlDbType.Int) { Value = unitId },
+                new SqlParameter("TransactionId", SqlDbType.Int) { Value = transactionId },
+            };
+            sqlParameters.AddRange(parameter);
+        }
+    }
+}

+ 4 - 44
EVCB_OCPP.WSServer/Jobs/HeartBeatCheckJob.cs

@@ -43,11 +43,9 @@ namespace EVCB_OCPP.WSServer.Jobs
 
                 watch.Start();
 
-                var wssClients = clients.Where(x => x.UriScheme.Equals("wss")).ToList();
-                var wsClients = clients.Except(wssClients).ToList();
-                using (var db = await maindbContextFactory.CreateDbContextAsync())
+                foreach (var session in clients)
                 {
-                    foreach (var session in wssClients)
+                    using (var db = await maindbContextFactory.CreateDbContextAsync())
                     {
                         var machine = new Machine() { Id = session.MachineId };
                         if (machine != null)
@@ -56,52 +54,14 @@ namespace EVCB_OCPP.WSServer.Jobs
                             //db.Configuration.ValidateOnSaveEnabled = false;
                             db.Machine.Attach(machine);
                             machine.HeartbeatUpdatedOn = DateTime.UtcNow;
-                            machine.ConnectionType = 2;
+                            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();
                         }
                     }
-                    await db.SaveChangesAsync();
                 }
 
-                using (var db = await maindbContextFactory.CreateDbContextAsync())
-                {
-                    foreach (var session in wsClients)
-                    {
-                        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.UtcNow;
-                            machine.ConnectionType = 1;
-                            db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
-                            db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
-                        }
-                    }
-                    await db.SaveChangesAsync();
-                }
-
-                //foreach (var session in clients)
-                //{
-                //    using (var db = await maindbContextFactory.CreateDbContextAsync())
-                //    {
-                //        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.UtcNow;
-                //            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();
-                //        }
-
-                //    }
-                //}
                 watch.Stop();
                 if (watch.ElapsedMilliseconds / 1000 > 5)
                 {

+ 72 - 77
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -6,6 +6,7 @@ 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.Helper;
 using EVCB_OCPP.WSServer.Service;
 using Microsoft.Data.SqlClient;
 using Microsoft.EntityFrameworkCore;
@@ -289,7 +290,8 @@ namespace EVCB_OCPP.WSServer.Message
                                         VendorErrorCode = string.IsNullOrEmpty(_request.vendorErrorCode) ? string.Empty : _request.vendorErrorCode,
                                         Id = Guid.NewGuid().ToString()
                                     };
-                                    await db.ConnectorStatus.AddAsync(_currentStatus);
+                                    db.ConnectorStatus.Add(_currentStatus);
+                                    await db.SaveChangesAsync();
                                 }
                             }
 
@@ -297,7 +299,7 @@ namespace EVCB_OCPP.WSServer.Message
                             {
                                 using (var db = await maindbContextFactory.CreateDbContextAsync())
                                 {
-                                    await db.MachineError.AddAsync(new MachineError()
+                                    db.MachineError.Add(new MachineError()
                                     {
                                         ConnectorId = (byte)_request.connectorId,
                                         CreatedOn = _request.timestamp.HasValue ? _request.timestamp.Value : DateTime.UtcNow,
@@ -393,20 +395,19 @@ namespace EVCB_OCPP.WSServer.Message
                                             string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
                          "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
 
-                                            List<SqlParameter> parameter = new List<SqlParameter>
-                                        {
-                                              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),
-                                          };
+                                            List<SqlParameter> parameter = new List<SqlParameter>();
+                                            parameter.AddInsertMeterValueRecordSqlParameters(
+                                                chargeBoxId: session.ChargeBoxId
+                                                ,connectorId: (byte)_request.connectorId
+                                                ,value: value
+                                                ,createdOn: item.timestamp
+                                                ,contextId: sampleVaule.context.HasValue ? (int)sampleVaule.context : 0
+                                                ,formatId: sampleVaule.format.HasValue ? (int)sampleVaule.format : 0
+                                                ,measurandId: sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0
+                                                ,phaseId: sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0
+                                                ,locationId: sampleVaule.location.HasValue ? (int)sampleVaule.location : 0
+                                                ,unitId: sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0
+                                                ,transactionId: _request.transactionId.HasValue ? _request.transactionId.Value : -1);
 
                                             db.Database.ExecuteSqlRaw(sp, parameter.ToArray());
                                         }
@@ -706,45 +707,41 @@ namespace EVCB_OCPP.WSServer.Message
 
                                 #region Save MeterValue
 
-                                if (_request.transactionData != null)
+                                if (_request.transactionData != null && 
+                                    _request.transactionData.Count > 0)
                                 {
-                                    if (_request.transactionData.Count > 0)
+                                    using (var _meterDb = await metervaluedbContextFactory.CreateDbContextAsync())
                                     {
-                                        using (var _meterDb = await metervaluedbContextFactory.CreateDbContextAsync())
+                                        foreach (var item in _request.transactionData)
+                                        foreach (var sampleVaule in item.sampledValue)
                                         {
-                                            foreach (var item in _request.transactionData)
-                                            {
-                                                foreach (var sampleVaule in item.sampledValue)
-                                                {
-                                                    decimal value = Convert.ToDecimal(sampleVaule.value);
-
+                                            decimal value = Convert.ToDecimal(sampleVaule.value);
 
-                                                    string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
-                                 "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
 
-                                                    List<SqlParameter> parameter = new List<SqlParameter>
-                                        {
-                                              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.ExecuteSqlRaw(sp, parameter.ToArray());
-                                                }
-                                            }
+                                            string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
+                            "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
+
+                                                List<SqlParameter> parameter = new List<SqlParameter>();
+                                                parameter.AddInsertMeterValueRecordSqlParameters(
+                                                    chargeBoxId: session.ChargeBoxId
+                                                    ,connectorId: (byte)_ConnectorId
+                                                    ,value: value
+                                                    ,createdOn: item.timestamp
+                                                    ,contextId: sampleVaule.context.HasValue ? (int)sampleVaule.context : 0
+                                                    ,formatId: sampleVaule.format.HasValue ? (int)sampleVaule.format : 0
+                                                    ,measurandId: sampleVaule.measurand.HasValue ? (int)sampleVaule.measurand : 0
+                                                    ,phaseId: sampleVaule.phase.HasValue ? (int)sampleVaule.phase : 0
+                                                    ,locationId: sampleVaule.location.HasValue ? (int)sampleVaule.location : 0
+                                                    ,unitId: sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0
+                                                    ,transactionId: _request.transactionId
+                                                    );
+
+                                            _meterDb.Database.ExecuteSqlRaw(sp, parameter.ToArray());
                                         }
 
-
                                     }
+
+
                                 }
 
                                 #endregion
@@ -1158,21 +1155,20 @@ namespace EVCB_OCPP.WSServer.Message
                                                 string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
                                    "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
 
-                                                List<SqlParameter> parameter = new List<SqlParameter>
-                                                {
-                                                      new SqlParameter("ChargeBoxId",session.ChargeBoxId),
-                                                      new SqlParameter("ConnectorId",  (byte)feedto.ConnectorId),
-                                                      new SqlParameter("Value",chargingCost),
-                                                      new SqlParameter("CreatedOn",DateTime.UtcNow),
-                                                      new SqlParameter("ContextId",(int)ReadingContext.Sample_Periodic),
-                                                      new SqlParameter("FormatId",(int)ValueFormat.Raw),
-                                                      new SqlParameter("MeasurandId",(int)Measurand.TotalCost),
-                                                      new SqlParameter("PhaseId", -1),
-                                                      new SqlParameter("LocationId", -1),
-                                                      new SqlParameter("UnitId", -1),
-                                                      new SqlParameter("TransactionId",feedto.Id),
-                                                };
-
+                                                List<SqlParameter> parameter = new List<SqlParameter>();
+                                                parameter.AddInsertMeterValueRecordSqlParameters(
+                                                    chargeBoxId: session.ChargeBoxId,
+                                                    connectorId: feedto.ConnectorId,
+                                                    value: chargingCost,
+                                                    createdOn: DateTime.UtcNow,
+                                                    contextId: (int)ReadingContext.Sample_Periodic,
+                                                    formatId: (int)ValueFormat.Raw,
+                                                    measurandId: (int)Measurand.TotalCost,
+                                                    phaseId: -1,
+                                                    locationId: -1,
+                                                    unitId: -1,
+                                                    transactionId: feedto.Id
+                                                    );
 
                                                 meterdb.Database.ExecuteSqlRaw(sp, parameter.ToArray());
                                             }
@@ -1244,21 +1240,20 @@ namespace EVCB_OCPP.WSServer.Message
                                                 string sp = "[dbo].[uspInsertMeterValueRecord] @ChargeBoxId," +
                        "@ConnectorId,@Value,@CreatedOn,@ContextId,@FormatId,@MeasurandId,@PhaseId,@LocationId,@UnitId,@TransactionId";
 
-                                                List<SqlParameter> parameter = new List<SqlParameter>
-                                                {
-                                                      new SqlParameter("ChargeBoxId",session.ChargeBoxId),
-                                                      new SqlParameter("ConnectorId",  (byte)feedto.ConnectorId),
-                                                      new SqlParameter("Value",chargingCost),
-                                                      new SqlParameter("CreatedOn",DateTime.UtcNow),
-                                                      new SqlParameter("ContextId",(int)ReadingContext.Sample_Periodic),
-                                                      new SqlParameter("FormatId",(int)ValueFormat.Raw),
-                                                      new SqlParameter("MeasurandId",(int)Measurand.ChargingCost),
-                                                      new SqlParameter("PhaseId", -1),
-                                                      new SqlParameter("LocationId", -1),
-                                                      new SqlParameter("UnitId", -1),
-                                                      new SqlParameter("TransactionId",feedto.Id),
-                                                };
-
+                                                List<SqlParameter> parameter = new List<SqlParameter>();
+                                                parameter.AddInsertMeterValueRecordSqlParameters(
+                                                    chargeBoxId: session.ChargeBoxId,
+                                                    connectorId: (byte)feedto.ConnectorId,
+                                                    value: chargingCost,
+                                                    createdOn: DateTime.UtcNow,
+                                                    contextId: (int)ReadingContext.Sample_Periodic,
+                                                    formatId: (int)ValueFormat.Raw,
+                                                    measurandId: (int)Measurand.ChargingCost,
+                                                    phaseId: -1,
+                                                    locationId: -1,
+                                                    unitId: -1,
+                                                    transactionId: feedto.Id
+                                                    );
 
                                                 meterdb.Database.ExecuteSqlRaw(sp, parameter.ToArray());
                                             }

+ 11 - 11
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -1431,17 +1431,17 @@ namespace EVCB_OCPP.WSServer
                     var dd = DateTime.UtcNow;
                     SqlParameter[] parameter =
                     {
-                      new SqlParameter("CreatedOn",dd),
-                      new SqlParameter("ChargeBoxId",clientData.ChargeBoxId==null?"unknown":clientData.ChargeBoxId.Replace("'","''")),
-                      new SqlParameter("MessageType",messageType.Replace("'","''")),
-                      new SqlParameter("Data",data.Replace("'","''")),
-                      new SqlParameter("Msg",errorMsg.Replace("'","''")),
-                      new  SqlParameter("IsSent",isSent),
-                      new  SqlParameter("EVSEEndPoint",clientData.RemoteEndPoint==null?"123":clientData.RemoteEndPoint.ToString()),
-                      new  SqlParameter("Session",clientData.SessionID==null?"123":clientData.SessionID)
-               };
-
-                    db.Database.ExecuteSqlRaw(sp, parameter);
+                           new SqlParameter("CreatedOn", SqlDbType.DateTime){ Value = dd },
+                           new SqlParameter("ChargeBoxId", SqlDbType.NVarChar, 50){ Value= clientData.ChargeBoxId==null?"unknown":clientData.ChargeBoxId.Replace("'","''") },
+                           new SqlParameter("MessageType", SqlDbType.NVarChar , 50){ Value =  messageType.Replace("'","''")},
+                           new SqlParameter("Data", SqlDbType.NVarChar) { Value = data.Replace("'", "''") },
+                           new SqlParameter("Msg", SqlDbType.NVarChar, 200) { Value = errorMsg.Replace("'", "''") },
+                           new  SqlParameter("IsSent", SqlDbType.Bit) { Value = isSent },
+                           new  SqlParameter("EVSEEndPoint", SqlDbType.NVarChar, 25) { Value = clientData.RemoteEndPoint == null ? "123" : clientData.RemoteEndPoint.ToString() },
+                           new  SqlParameter("Session", SqlDbType.NVarChar, 36) { Value = clientData.SessionID == null ? "123" : clientData.SessionID }
+                    };
+
+                    await db.Database.ExecuteSqlRawAsync(sp, parameter);
                 }
             }
             catch (Exception ex)