Robert před 2 roky
rodič
revize
34ad51a953

+ 41 - 42
EVCB_OCPP.WSServer/Jobs/DenyModelCheckJob.cs

@@ -12,60 +12,59 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class DenyModelCheckJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class DenyModelCheckJob : IJob
+    public DenyModelCheckJob(
+        ProtalServer protalServer,
+        IConfiguration configuration,
+        ILogger<DenyModelCheckJob> logger)
     {
-        public DenyModelCheckJob(
-            ProtalServer protalServer,
-            IConfiguration configuration,
-            ILogger<DenyModelCheckJob> logger)
-        {
-            this.webConnectionString = configuration.GetConnectionString("WebDBContext");
-            this.protalServer = protalServer;
-            this.logger = logger;
-        }
+        this.webConnectionString = configuration.GetConnectionString("WebDBContext");
+        this.protalServer = protalServer;
+        this.logger = logger;
+    }
 
-        private readonly string webConnectionString;
-        private readonly ProtalServer protalServer;
-        private readonly ILogger<DenyModelCheckJob> logger;
+    private readonly string webConnectionString;
+    private readonly ProtalServer protalServer;
+    private readonly ILogger<DenyModelCheckJob> logger;
 
-        public async Task Execute(IJobExecutionContext context)
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(DenyModelCheckJob));
+        try
         {
-            logger.LogDebug("{0} Started", nameof(DenyModelCheckJob));
-            try
+            using (SqlConnection conn = new SqlConnection(webConnectionString))
             {
-                using (SqlConnection conn = new SqlConnection(webConnectionString))
-                {
-                    string strSql = "SELECT [Value] FROM[StandardOCPP_Web].[dbo].[KernelConfig]" +
-                     "where SystemKey = 'DenyModelNames'; ";
-                    var result = await conn.QueryAsync<string>(strSql);
+                string strSql = "SELECT [Value] FROM[StandardOCPP_Web].[dbo].[KernelConfig]" +
+                 "where SystemKey = 'DenyModelNames'; ";
+                var result = await conn.QueryFirstOrDefaultAsync<string>(strSql);
 
-                    GlobalConfig.DenyModelNames = result.FirstOrDefault().Split(',').ToList();
-                    logger.LogDebug("Current DenyList:[{0}]", string.Join(",", GlobalConfig.DenyModelNames));
-                }
+                GlobalConfig.DenyModelNames = result.Split(',').ToList();
+                logger.LogDebug("Current DenyList:[{0}]", string.Join(",", GlobalConfig.DenyModelNames));
+            }
 
-                if (string.IsNullOrEmpty(GlobalConfig.DenyModelNames[0]))
-                {
-                    return;
-                }
+            if (string.IsNullOrEmpty(GlobalConfig.DenyModelNames[0]))
+            {
+                return;
+            }
 
-                Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
-                foreach (var denyName in GlobalConfig.DenyModelNames)
+            Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
+            foreach (var denyName in GlobalConfig.DenyModelNames)
+            {
+                var removeClients = _copyClientDic.Where(x => x.Key.StartsWith(denyName)).Select(x => x.Value).ToList();
+                foreach (var session in removeClients)
                 {
-                    var removeClients = _copyClientDic.Where(x => x.Key.StartsWith(denyName)).Select(x => x.Value).ToList();
-                    foreach (var session in removeClients)
-                    {
-                        Console.WriteLine(string.Format("Server forced to shut down ChargeBox ({0}: Reason: DenyModelName-{1}", session.ChargeBoxId, denyName));
-                        protalServer.RemoveClient(session);
-                    }
+                    Console.WriteLine(string.Format("Server forced to shut down ChargeBox ({0}: Reason: DenyModelName-{1}", session.ChargeBoxId, denyName));
+                    protalServer.RemoveClient(session);
                 }
             }
-            catch (Exception ex)
-            {
-                logger.LogError("DenyModelCheckTrigger  Ex:{0}", ex.ToString());
-            }
+        }
+        catch (Exception ex)
+        {
+            logger.LogError("DenyModelCheckTrigger  Ex:{0}", ex.ToString());
         }
     }
 }

+ 21 - 22
EVCB_OCPP.WSServer/Jobs/HealthCheckTriggerJob.cs

@@ -8,35 +8,34 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class HealthCheckTriggerJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class HealthCheckTriggerJob : IJob
+    public HealthCheckTriggerJob(
+        ProtalServer protalServer,
+        ILogger<HealthCheckTriggerJob> logger)
     {
-        public HealthCheckTriggerJob(
-            ProtalServer protalServer,
-            ILogger<HealthCheckTriggerJob> logger)
-        {
-            this.protalServer = protalServer;
-            this.logger = logger;
-        }
+        this.protalServer = protalServer;
+        this.logger = logger;
+    }
 
-        private readonly ProtalServer protalServer;
-        private readonly ILogger<HealthCheckTriggerJob> logger;
+    private readonly ProtalServer protalServer;
+    private readonly ILogger<HealthCheckTriggerJob> logger;
 
-        public async Task Execute(IJobExecutionContext context)
-        {
-            logger.LogDebug("{0} Started", nameof(HealthCheckTriggerJob));
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(HealthCheckTriggerJob));
 
-            Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
+        Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
 
-            var removeClients = _copyClientDic.Where(x => x.Value.LastActiveTime < DateTime.UtcNow.AddSeconds(-300)).Select(x => x.Value).ToList();
+        var removeClients = _copyClientDic.Where(x => x.Value.LastActiveTime < DateTime.UtcNow.AddSeconds(-300)).Select(x => x.Value).ToList();
 
-            foreach (var session in removeClients)
-            {
-                Console.WriteLine(string.Format("Server forced to shut down ChargeBox ({0}: LastActiveTime{1})", session.ChargeBoxId, session.LastActiveTime));
-                protalServer.RemoveClient(session);
-            }
+        foreach (var session in removeClients)
+        {
+            Console.WriteLine(string.Format("Server forced to shut down ChargeBox ({0}: LastActiveTime{1})", session.ChargeBoxId, session.LastActiveTime));
+            protalServer.RemoveClient(session);
         }
     }
 }

+ 46 - 47
EVCB_OCPP.WSServer/Jobs/HeartBeatCheckJob.cs

@@ -11,68 +11,67 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class HeartBeatCheckJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class HeartBeatCheckJob : IJob
+    public HeartBeatCheckJob(
+        ProtalServer protalServer,
+        IDbContextFactory<MainDBContext> maindbContextFactory,
+        ILogger<HeartBeatCheckJob> logger)
     {
-        public HeartBeatCheckJob(
-            ProtalServer protalServer,
-            IDbContextFactory<MainDBContext> maindbContextFactory,
-            ILogger<HeartBeatCheckJob> logger)
-        {
-            this.protalServer = protalServer;
-            this.maindbContextFactory = maindbContextFactory;
-            this.logger = logger;
-        }
+        this.protalServer = protalServer;
+        this.maindbContextFactory = maindbContextFactory;
+        this.logger = logger;
+    }
 
-        private readonly ProtalServer protalServer;
-        private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
-        private readonly ILogger<HeartBeatCheckJob> logger;
+    private readonly ProtalServer protalServer;
+    private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
+    private readonly ILogger<HeartBeatCheckJob> logger;
 
-        public async Task Execute(IJobExecutionContext context)
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(HeartBeatCheckJob));
+        try
         {
-            logger.LogDebug("{0} Started", nameof(HeartBeatCheckJob));
-            try
-            {
-                Stopwatch watch = new Stopwatch();
-                Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
+            Stopwatch watch = new Stopwatch();
+            Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
 
-                var cdt = DateTime.UtcNow;
-                var clients = _copyClientDic.Where(x => x.Value.LastActiveTime > cdt.AddSeconds(-120)).Select(x => x.Value).ToList();
+            var cdt = DateTime.UtcNow;
+            var clients = _copyClientDic.Where(x => x.Value.LastActiveTime > cdt.AddSeconds(-120)).Select(x => x.Value).ToList();
 
-                watch.Start();
+            watch.Start();
 
-                foreach (var session in clients)
+            foreach (var session in clients)
+            {
+                using (var db = await maindbContextFactory.CreateDbContextAsync())
                 {
-                    using (var db = await maindbContextFactory.CreateDbContextAsync())
+                    var machine = new Machine() { Id = session.MachineId };
+                    if (machine != null)
                     {
-                        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();
-                        }
+                        //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)
-                {
-                    logger.LogCritical("Update HeartBeatCheckTrigger cost " + watch.ElapsedMilliseconds / 1000 + " seconds.");
-                }
             }
-            catch (Exception ex)
+
+            watch.Stop();
+            if (watch.ElapsedMilliseconds / 1000 > 5)
             {
-                Console.WriteLine("***********************************************************");
-                logger.LogError(string.Format("HeartBeatCheckTrigger  Ex:{0}", ex.ToString()));
+                logger.LogCritical("Update HeartBeatCheckTrigger cost " + watch.ElapsedMilliseconds / 1000 + " seconds.");
             }
         }
+        catch (Exception ex)
+        {
+            Console.WriteLine("***********************************************************");
+            logger.LogError(string.Format("HeartBeatCheckTrigger  Ex:{0}", ex.ToString()));
+        }
     }
 }

+ 110 - 111
EVCB_OCPP.WSServer/Jobs/ServerMessageJob.cs

@@ -15,158 +15,157 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class ServerMessageJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class ServerMessageJob : IJob
+    public ServerMessageJob(
+        ProtalServer protalServer,
+        IConfiguration configuration,
+        IDbContextFactory<MainDBContext> maindbContextFactory,
+        ILogger<ServerMessageJob> logger)
+    {
+        this.protalServer = protalServer;
+        this.maindbContextFactory = maindbContextFactory;
+        this.logger = logger;
+    }
+
+    private readonly ProtalServer protalServer;
+    private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
+    private readonly ILogger<ServerMessageJob> logger;
+
+    public async Task Execute(IJobExecutionContext context)
     {
-        public ServerMessageJob(
-            ProtalServer protalServer,
-            IConfiguration configuration,
-            IDbContextFactory<MainDBContext> maindbContextFactory,
-            ILogger<ServerMessageJob> logger)
+        try
         {
-            this.protalServer = protalServer;
-            this.maindbContextFactory = maindbContextFactory;
-            this.logger = logger;
+            await ExecuteTrigger();
         }
+        catch (Exception ex)
+        {
+            logger.LogError("ServerMessageTrigger  Ex:{0}", ex.ToString());
+        }
+    }
 
-        private readonly ProtalServer protalServer;
-        private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
-        private readonly ILogger<ServerMessageJob> logger;
+    private async Task ExecuteTrigger()
+    {
+        protalServer.RemoveConfirmMessage();
 
-        public async Task Execute(IJobExecutionContext context)
+        BasicMessageHandler msgAnalyser = new BasicMessageHandler();
+        using (var db = await maindbContextFactory.CreateDbContextAsync())
         {
-            try
-            {
-                await ExecuteTrigger();
-            }
-            catch (Exception ex)
+            var dateTimeNoew = DateTime.UtcNow;
+            DateTime startDt = dateTimeNoew.AddSeconds(-30);
+            DateTime dt = new DateTime(1991, 1, 1);
+            DateTime currentTime = dateTimeNoew;
+            var commandList = db.ServerMessage.Where(c => c.ReceivedOn == dt && c.UpdatedOn == dt && c.CreatedOn >= startDt && c.CreatedOn <= currentTime).AsNoTracking().ToList();
+            var clientDic = protalServer.ClientDic;
+
+            //處理主機傳送的有指令
+            var cmdMachineList = commandList.Select(c => c.ChargeBoxId).Distinct().ToList();
+            if (commandList.Count > 0)
             {
-                logger.LogError("ServerMessageTrigger  Ex:{0}", ex.ToString());
+                // Console.WriteLine(string.Format("Now:{0} commandList Count:{1} ", DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss"), commandList.Count));
             }
-        }
-
-        private async Task ExecuteTrigger()
-        {
-            protalServer.RemoveConfirmMessage();
-
-            BasicMessageHandler msgAnalyser = new BasicMessageHandler();
-            using (var db = await maindbContextFactory.CreateDbContextAsync())
+            var resendList = protalServer.ResendMessage;
+            foreach (var resendItem in resendList)
             {
-                var dateTimeNoew = DateTime.UtcNow;
-                DateTime startDt = dateTimeNoew.AddSeconds(-30);
-                DateTime dt = new DateTime(1991, 1, 1);
-                DateTime currentTime = dateTimeNoew;
-                var commandList = db.ServerMessage.Where(c => c.ReceivedOn == dt && c.UpdatedOn == dt && c.CreatedOn >= startDt && c.CreatedOn <= currentTime).AsNoTracking().ToList();
-                var clientDic = protalServer.ClientDic;
-
-                //處理主機傳送的有指令
-                var cmdMachineList = commandList.Select(c => c.ChargeBoxId).Distinct().ToList();
-                if (commandList.Count > 0)
-                {
-                    // Console.WriteLine(string.Format("Now:{0} commandList Count:{1} ", DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss"), commandList.Count));
-                }
-                var resendList = protalServer.ResendMessage;
-                foreach (var resendItem in resendList)
+                ClientData session;
+                if (clientDic.TryGetValue(resendItem.ChargePointSerialNumber, out session))
                 {
-                    ClientData session;
-                    if (clientDic.TryGetValue(resendItem.ChargePointSerialNumber, out session))
+                    if (dateTimeNoew.Subtract(resendItem.SentOn).TotalSeconds > 1)
                     {
-                        if (dateTimeNoew.Subtract(resendItem.SentOn).TotalSeconds > 1)
-                        {
-                            resendItem.SentTimes--;
-                            resendItem.SentOn = dateTimeNoew;
-                            protalServer.SendMsg(session, resendItem.SentMessage, string.Format("{0} {1}", resendItem.SentAction, "Request"), "");
-                        }
-
+                        resendItem.SentTimes--;
+                        resendItem.SentOn = dateTimeNoew;
+                        protalServer.SendMsg(session, resendItem.SentMessage, string.Format("{0} {1}", resendItem.SentAction, "Request"), "");
                     }
 
                 }
-                foreach (var charger_SN in cmdMachineList)
+
+            }
+            foreach (var charger_SN in cmdMachineList)
+            {
+                ClientData session;
+                string uuid = string.Empty;
+                if (clientDic.TryGetValue(charger_SN, out session))
                 {
-                    ClientData session;
-                    string uuid = string.Empty;
-                    if (clientDic.TryGetValue(charger_SN, out session))
+                    //logger.LogDebug(string.Format("charger_SN:{0} startDt:{1} CreatedOn:{2}", charger_SN, startDt.ToString("yyyy/MM/dd HH:mm:ss"), DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss")));
+
+                    if (session.IsCheckIn && !session.ISOCPP20)
                     {
-                        //logger.LogDebug(string.Format("charger_SN:{0} startDt:{1} CreatedOn:{2}", charger_SN, startDt.ToString("yyyy/MM/dd HH:mm:ss"), DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss")));
+                        string rawRequest = string.Empty;
 
-                        if (session.IsCheckIn && !session.ISOCPP20)
-                        {
-                            string rawRequest = string.Empty;
+                        var cmdList = commandList.Where(c => c.ChargeBoxId == charger_SN).ToList();
 
-                            var cmdList = commandList.Where(c => c.ChargeBoxId == charger_SN).ToList();
+                        var profiles = protalServer.Profiles;
 
-                            var profiles = protalServer.Profiles;
+                        foreach (var item in cmdList)
+                        {
+                            IRequest request = null;
+                            Actions action = Actions.None;
+                            Enum.TryParse(item.OutAction, out action);
+                            Type _RequestType = null;
 
-                            foreach (var item in cmdList)
+                            for (int i = 0; i < profiles.Count; i++)
                             {
-                                IRequest request = null;
-                                Actions action = Actions.None;
-                                Enum.TryParse(item.OutAction, out action);
-                                Type _RequestType = null;
+                                var feature = profiles[i].GetFeaturebyAction(item.OutAction);
 
-                                for (int i = 0; i < profiles.Count; i++)
+                                if (feature != null)
                                 {
-                                    var feature = profiles[i].GetFeaturebyAction(item.OutAction);
-
-                                    if (feature != null)
-                                    {
-                                        _RequestType = feature.GetRequestType();
-                                        break;
-                                    }
+                                    _RequestType = feature.GetRequestType();
+                                    break;
                                 }
+                            }
+
+                            if (_RequestType != null && item.CreatedBy != "Destroyer")
+                            {
+                                request = JsonConvert.DeserializeObject(item.OutRequest, _RequestType) as IRequest;
+                                uuid = session.queue.store(request);
+                                rawRequest = BasicMessageHandler.GenerateRequest(uuid, item.OutAction, request);
+                                protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
+                            }
+
+
+                            if (item.CreatedBy == "Destroyer")
+                            {
 
-                                if (_RequestType != null && item.CreatedBy != "Destroyer")
+                                if (_RequestType != null)
                                 {
-                                    request = JsonConvert.DeserializeObject(item.OutRequest, _RequestType) as IRequest;
+                                    request = Activator.CreateInstance(_RequestType) as IRequest;
                                     uuid = session.queue.store(request);
-                                    rawRequest = BasicMessageHandler.GenerateRequest(uuid, item.OutAction, request);
+                                    rawRequest = BasicMessageHandler.GenerateDestroyRequest(uuid, item.OutAction, item.OutRequest);
                                     protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
-                                }
-
 
-                                if (item.CreatedBy == "Destroyer")
+                                }
+                                else
                                 {
 
-                                    if (_RequestType != null)
-                                    {
-                                        request = Activator.CreateInstance(_RequestType) as IRequest;
-                                        uuid = session.queue.store(request);
-                                        rawRequest = BasicMessageHandler.GenerateDestroyRequest(uuid, item.OutAction, item.OutRequest);
-                                        protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
-
-                                    }
-                                    else
-                                    {
-
-                                        rawRequest = BasicMessageHandler.GenerateDestroyRequest(Guid.NewGuid().ToString(), item.OutAction, item.OutRequest);
-                                        protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
+                                    rawRequest = BasicMessageHandler.GenerateDestroyRequest(Guid.NewGuid().ToString(), item.OutAction, item.OutRequest);
+                                    protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", action, "Request"), "");
 
-                                    }
                                 }
+                            }
 
-                                protalServer.AddConfirmMessage(charger_SN, item.Id, item.SerialNo, item.OutAction, uuid, item.CreatedBy, rawRequest);
+                            protalServer.AddConfirmMessage(charger_SN, item.Id, item.SerialNo, item.OutAction, uuid, item.CreatedBy, rawRequest);
 
-                                dateTimeNoew = DateTime.UtcNow;
-                                #region 更新資料表單一欄位
-                                var _UpdatedItem = new ServerMessage() { Id = item.Id, UpdatedOn = dateTimeNoew };
-                                //db.Configuration.AutoDetectChangesEnabled = false;//自動呼叫DetectChanges()比對所有的entry集合的每一個屬性Properties的新舊值
-                                //db.Configuration.ValidateOnSaveEnabled = false;// 因為Entity有些欄位必填,若不避開會有Validate錯誤
-                                // var _UpdatedItem = db.ServerMessage.Where(x => x.Id == item.Id).FirstOrDefault();
-                                db.ServerMessage.Attach(_UpdatedItem);
-                                _UpdatedItem.UpdatedOn = dateTimeNoew;
-                                db.Entry(_UpdatedItem).Property(x => x.UpdatedOn).IsModified = true;// 可以直接使用這方式強制某欄位要更新,只是查詢集合耗效能而己
+                            dateTimeNoew = DateTime.UtcNow;
+                            #region 更新資料表單一欄位
+                            var _UpdatedItem = new ServerMessage() { Id = item.Id, UpdatedOn = dateTimeNoew };
+                            //db.Configuration.AutoDetectChangesEnabled = false;//自動呼叫DetectChanges()比對所有的entry集合的每一個屬性Properties的新舊值
+                            //db.Configuration.ValidateOnSaveEnabled = false;// 因為Entity有些欄位必填,若不避開會有Validate錯誤
+                            // var _UpdatedItem = db.ServerMessage.Where(x => x.Id == item.Id).FirstOrDefault();
+                            db.ServerMessage.Attach(_UpdatedItem);
+                            _UpdatedItem.UpdatedOn = dateTimeNoew;
+                            db.Entry(_UpdatedItem).Property(x => x.UpdatedOn).IsModified = true;// 可以直接使用這方式強制某欄位要更新,只是查詢集合耗效能而己
 
-                                db.SaveChanges();
+                            db.SaveChanges();
 
-                                #endregion
+                            #endregion
 
-                                await Task.Delay(100);
-
-                            }
+                            await Task.Delay(100);
 
                         }
+
                     }
                 }
             }

+ 134 - 135
EVCB_OCPP.WSServer/Jobs/ServerSetFeeJob.cs

@@ -20,53 +20,73 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class ServerSetFeeJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class ServerSetFeeJob : IJob
+    private readonly ProtalServer protalServer;
+    private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
+    private readonly ILogger<ServerSetFeeJob> logger;
+    private readonly string webConnectionString;
+
+    public ServerSetFeeJob(
+        ProtalServer protalServer,
+        IConfiguration configuration,
+        IDbContextFactory<MainDBContext> maindbContextFactory,
+        ILogger<ServerSetFeeJob> logger) 
     {
-        private readonly ProtalServer protalServer;
-        private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
-        private readonly ILogger<ServerSetFeeJob> logger;
-        private readonly string webConnectionString;
-
-        public ServerSetFeeJob(
-            ProtalServer protalServer,
-            IConfiguration configuration,
-            IDbContextFactory<MainDBContext> maindbContextFactory,
-            ILogger<ServerSetFeeJob> logger) 
-        {
-            this.protalServer = protalServer;
-            this.maindbContextFactory = maindbContextFactory;
-            this.logger = logger;
-            this.webConnectionString = configuration.GetConnectionString("WebDBContext");
-        }
+        this.protalServer = protalServer;
+        this.maindbContextFactory = maindbContextFactory;
+        this.logger = logger;
+        this.webConnectionString = configuration.GetConnectionString("WebDBContext");
+    }
 
-        public async Task Execute(IJobExecutionContext context)
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(ServerSetFeeJob));
+        BasicMessageHandler msgAnalyser = new BasicMessageHandler();
+        Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
+        foreach (var item in _copyClientDic)
         {
-            logger.LogDebug("{0} Started", nameof(ServerSetFeeJob));
-            BasicMessageHandler msgAnalyser = new BasicMessageHandler();
-            Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
-            foreach (var item in _copyClientDic)
+            try
             {
-                try
+                ClientData session = item.Value;
+                if (!session.IsCheckIn)
                 {
-                    ClientData session = item.Value;
-                    if (!session.IsCheckIn)
-                    {
-                        continue;
-                    }
+                    continue;
+                }
 
-                    string displayPriceText = await SetDefaultFee(session);
-                    if (string.IsNullOrEmpty(displayPriceText) || displayPriceText == session.DisplayPrice)
-                    {
-                        continue;
-                    }
+                string displayPriceText = await SetDefaultFee(session);
+                if (string.IsNullOrEmpty(displayPriceText) || displayPriceText == session.DisplayPrice)
+                {
+                    continue;
+                }
 
-                    protalServer.UpdateClientDisplayPrice(item.Key, displayPriceText);
+                protalServer.UpdateClientDisplayPrice(item.Key, displayPriceText);
 
-                    var _CheckFeeDt = DateTime.UtcNow;
-                    using (var db = await maindbContextFactory.CreateDbContextAsync())
+                var _CheckFeeDt = DateTime.UtcNow;
+                using (var db = await maindbContextFactory.CreateDbContextAsync())
+                {
+                    db.ServerMessage.Add(new ServerMessage()
+                    {
+                        ChargeBoxId = session.ChargeBoxId,
+                        CreatedBy = "Server",
+                        CreatedOn = _CheckFeeDt,
+                        OutAction = Actions.ChangeConfiguration.ToString(),
+                        OutRequest = JsonConvert.SerializeObject(
+                                new ChangeConfigurationRequest()
+                                {
+                                    key = "DefaultPrice",
+                                    value = displayPriceText
+                                },
+                                new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                        SerialNo = Guid.NewGuid().ToString(),
+                        InMessage = string.Empty
+
+                    });
+
+                    if (session.CustomerId == new Guid("10C7F5BD-C89A-4E2A-8611-B617E0B41A73"))
                     {
                         db.ServerMessage.Add(new ServerMessage()
                         {
@@ -75,126 +95,105 @@ namespace EVCB_OCPP.WSServer.Jobs
                             CreatedOn = _CheckFeeDt,
                             OutAction = Actions.ChangeConfiguration.ToString(),
                             OutRequest = JsonConvert.SerializeObject(
-                                    new ChangeConfigurationRequest()
-                                    {
-                                        key = "DefaultPrice",
-                                        value = displayPriceText
-                                    },
-                                    new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                               new ChangeConfigurationRequest()
+                               {
+                                   key = "ConnectionTimeOut",
+                                   value = "120"
+                               },
+                               new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
                             SerialNo = Guid.NewGuid().ToString(),
                             InMessage = string.Empty
 
                         });
-
-                        if (session.CustomerId == new Guid("10C7F5BD-C89A-4E2A-8611-B617E0B41A73"))
+                        db.ServerMessage.Add(new ServerMessage()
                         {
-                            db.ServerMessage.Add(new ServerMessage()
-                            {
-                                ChargeBoxId = session.ChargeBoxId,
-                                CreatedBy = "Server",
-                                CreatedOn = _CheckFeeDt,
-                                OutAction = Actions.ChangeConfiguration.ToString(),
-                                OutRequest = JsonConvert.SerializeObject(
-                                   new ChangeConfigurationRequest()
-                                   {
-                                       key = "ConnectionTimeOut",
-                                       value = "120"
-                                   },
-                                   new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                SerialNo = Guid.NewGuid().ToString(),
-                                InMessage = string.Empty
-
-                            });
-                            db.ServerMessage.Add(new ServerMessage()
-                            {
-                                ChargeBoxId = session.ChargeBoxId,
-                                CreatedBy = "Server",
-                                CreatedOn = _CheckFeeDt,
-                                OutAction = Actions.ChangeConfiguration.ToString(),
-                                OutRequest = JsonConvert.SerializeObject(
-                                   new ChangeConfigurationRequest()
-                                   {
-                                       key = "MeterValueSampleInterval",
-                                       value = "3"
-                                   },
-                                   new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                SerialNo = Guid.NewGuid().ToString(),
-                                InMessage = string.Empty
-
-                            });
-                        }
-
-                        await db.SaveChangesAsync();
+                            ChargeBoxId = session.ChargeBoxId,
+                            CreatedBy = "Server",
+                            CreatedOn = _CheckFeeDt,
+                            OutAction = Actions.ChangeConfiguration.ToString(),
+                            OutRequest = JsonConvert.SerializeObject(
+                               new ChangeConfigurationRequest()
+                               {
+                                   key = "MeterValueSampleInterval",
+                                   value = "3"
+                               },
+                               new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                            SerialNo = Guid.NewGuid().ToString(),
+                            InMessage = string.Empty
 
+                        });
                     }
 
+                    await db.SaveChangesAsync();
+
                 }
-                catch (Exception ex)
-                {
-                    logger.LogError("ServerSetFeeTrigger ChargeBoxId:{0}  Ex:{1}", item.Key, ex.ToString());
-                }
+
+            }
+            catch (Exception ex)
+            {
+                logger.LogError("ServerSetFeeTrigger ChargeBoxId:{0}  Ex:{1}", item.Key, ex.ToString());
             }
         }
+    }
 
-        async private Task<string> SetDefaultFee(ClientData client)
-        {
-            string displayPriceText = string.Empty;
-            string charingPriceText = string.Empty;
+    async private Task<string> SetDefaultFee(ClientData client)
+    {
+        string displayPriceText = string.Empty;
+        string charingPriceText = string.Empty;
 
-            if (string.IsNullOrEmpty(client.ChargeBoxId)) return displayPriceText;
+        if (string.IsNullOrEmpty(client.ChargeBoxId)) return displayPriceText;
 
-            using (SqlConnection conn = new SqlConnection(webConnectionString))
-            {
-                var parameters = new DynamicParameters();
-                parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input);
-                string displayPricestrSql = "";
-                string strSql = "";
+        using (SqlConnection conn = new SqlConnection(webConnectionString))
+        {
+            var parameters = new DynamicParameters();
+            parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input, 36);
+            string displayPricestrSql = "";
+            string strSql = "";
 
-                if (client.IsAC)
-                {
-                    displayPricestrSql = "   SELECT  [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour" +
-                "  ,[AC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
-                "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
+            if (client.IsAC)
+            {
+                displayPricestrSql = "   SELECT  [AC_BillingMethod] as BillingMethod,[AC_FeeName] as FeeName,[AC_Fee] as ChargingFeebyHour" +
+            "  ,[AC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
+            "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
 
-                    strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
-                   " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=1; ";
-                }
-                else
-                {
-                    displayPricestrSql = "   SELECT  [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour" +
-               "  ,[DC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
-               "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
+                strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
+               " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=1; ";
+            }
+            else
+            {
+                displayPricestrSql = "   SELECT  [DC_BillingMethod] as BillingMethod,[DC_FeeName] as FeeName,[DC_Fee] as ChargingFeebyHour" +
+           "  ,[DC_ParkingFee] as ParkingFee, [Currency]  FROM[StationMachine]  left join[dbo].[Station]" +
+           "  on[StationMachine].StationId = Station.[Id]  where StationMachine.MachineId=@MachineId and Station.IsBilling=1; ";
 
-                    strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
-                   " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; ";
+                strSql = " SELECT CAST( [StartTime] as varchar(5)) StartTime,CAST( [EndTime] as varchar(5)) EndTime,[Fee]  FROM[StationMachine]  left join [dbo].[StationFee]" +
+               " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; ";
 
-                }
-                var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
-                if (result.Count() == 0)
-                {
-                    return string.Empty;
-                }
-                var stationPrice = result.First();
+            }
+            var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
+            if (result.Count() == 0)
+            {
+                return string.Empty;
+            }
+            var stationPrice = result.First();
 
-                if (stationPrice.BillingMethod == 1)
+            if (stationPrice.BillingMethod == 1)
+            {
+                var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
+                client.ChargingPrices = chargingPriceResult.ToList();
+                if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
                 {
-                    var chargingPriceResult = await conn.QueryAsync<ChargingPrice>(strSql, parameters);
-                    client.ChargingPrices = chargingPriceResult.ToList();
-                    if (string.IsNullOrEmpty(client.ChargingPrices[0].StartTime))
-                    {
-                        client.ChargingPrices = new List<ChargingPrice>();
-                    }
+                    client.ChargingPrices = new List<ChargingPrice>();
                 }
-
-                displayPriceText = stationPrice.FeeName;
-                client.BillingMethod = stationPrice.BillingMethod;
-                client.Currency = stationPrice.Currency;
-                client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
-                client.ParkingFee = stationPrice.ParkingFee;
-                client.IsBilling = true;
             }
 
-            return displayPriceText;
+            displayPriceText = stationPrice.FeeName;
+            client.BillingMethod = stationPrice.BillingMethod;
+            client.Currency = stationPrice.Currency;
+            client.ChargingFeebyHour = stationPrice.ChargingFeebyHour;
+            client.ParkingFee = stationPrice.ParkingFee;
+            client.IsBilling = true;
         }
+
+        return displayPriceText;
     }
 }

+ 105 - 106
EVCB_OCPP.WSServer/Jobs/ServerUpdateJob.cs

@@ -12,125 +12,124 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class ServerUpdateJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class ServerUpdateJob : IJob
+    private readonly ProtalServer protalServer;
+    private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
+    private readonly ILogger<ServerUpdateJob> logger;
+
+    public ServerUpdateJob(
+        ProtalServer protalServer, 
+        IDbContextFactory<MainDBContext> maindbContextFactory,
+        ILogger<ServerUpdateJob> logger)
     {
-        private readonly ProtalServer protalServer;
-        private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
-        private readonly ILogger<ServerUpdateJob> logger;
-
-        public ServerUpdateJob(
-            ProtalServer protalServer, 
-            IDbContextFactory<MainDBContext> maindbContextFactory,
-            ILogger<ServerUpdateJob> logger)
-        {
-            this.protalServer = protalServer;
-            this.maindbContextFactory = maindbContextFactory;
-            this.logger = logger;
-        }
+        this.protalServer = protalServer;
+        this.maindbContextFactory = maindbContextFactory;
+        this.logger = logger;
+    }
 
-        public async Task Execute(IJobExecutionContext context)
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(ServerUpdateJob));
+        BasicMessageHandler msgAnalyser = new BasicMessageHandler();
+        Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
+        var checkUpdateDt = DateTime.UtcNow;
+        using (var db = await maindbContextFactory.CreateDbContextAsync())
         {
-            logger.LogDebug("{0} Started", nameof(ServerUpdateJob));
-            BasicMessageHandler msgAnalyser = new BasicMessageHandler();
-            Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
-            var checkUpdateDt = DateTime.UtcNow;
-            using (var db = await maindbContextFactory.CreateDbContextAsync())
-            {
-                //var needUpdateChargers = db.Machine.Where(x => x.FW_AssignedMachineVersionId.HasValue == true &&
-                //    x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.Online == true)
-                //    .Select(x => new { x.Id, x.ChargeBoxId, x.FW_AssignedMachineVersionId }).ToList();
+            //var needUpdateChargers = db.Machine.Where(x => x.FW_AssignedMachineVersionId.HasValue == true &&
+            //    x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.Online == true)
+            //    .Select(x => new { x.Id, x.ChargeBoxId, x.FW_AssignedMachineVersionId }).ToList();
 
-                var needUpdateChargers = db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true &&
-                  x.FW_AssignedVersion != x.FW_VersionReport && x.Online == true)
-                  .Select(x => x.ChargeBoxId).AsNoTracking().ToList();
+            var needUpdateChargers = db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true &&
+              x.FW_AssignedVersion != x.FW_VersionReport && x.Online == true)
+              .Select(x => x.ChargeBoxId).AsNoTracking().ToList();
 
-                foreach (var chargeBoxId in needUpdateChargers)
+            foreach (var chargeBoxId in needUpdateChargers)
+            {
+                try
                 {
-                    try
+                    ClientData session;
+                    if (_copyClientDic.TryGetValue(chargeBoxId, out session))
                     {
-                        ClientData session;
-                        if (_copyClientDic.TryGetValue(chargeBoxId, out session))
-                        {
 
-                            string requestId = Guid.NewGuid().ToString();
-                            // using (var db = maindbContextFactory.CreateDbContext())
+                        string requestId = Guid.NewGuid().ToString();
+                        // using (var db = maindbContextFactory.CreateDbContext())
 
-                            if (session.IsCheckIn && !session.ISOCPP20)
-                            {
+                        if (session.IsCheckIn && !session.ISOCPP20)
+                        {
 
-                                var _request = new TriggerMessageRequest()
-                                {
-                                    requestedMessage = Packet.Messages.SubTypes.MessageTrigger.FirmwareStatusNotification
-                                };
-
-                                var uuid = session.queue.store(_request);
-                                string rawRequest = BasicMessageHandler.GenerateRequest(uuid, _request.Action, _request);
-                                protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", _request.Action, "Request"), "");
-
-                                #region OCTT   ,測試韌體更新方式
-                                //--------------------> OCTT   ,測試韌體更新方式
-                                //{
-                                //    var machine = db.Machine.Where(x => x.FW_AssignedMachineVersionId.HasValue == true &&
-                                //        x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.ChargeBoxId == session.ChargeBoxId)
-                                //        .Select(x => new { x.Id, x.FW_AssignedMachineVersionId }).FirstOrDefault();
-
-                                //    if (machine != null)
-                                //    {
-                                //        var mv = db.MachineVersion.Include(c => c.PublishVersion)
-                                //         .Include(c => c.PublishVersion.PublishVersionFiles)
-                                //         .Include(c => c.PublishVersion.PublishVersionFiles.Select(z => z.UploadFile))
-                                //         .Where(c => c.Id == machine.FW_AssignedMachineVersionId.Value).First();
-
-                                //        string downloadUrl = mv.PublishVersion.PublishVersionFiles.FirstOrDefault().UploadFile.FileUrl;
-
-                                //        var _updateFWrequest = new UpdateFirmwareRequest()
-                                //        {
-                                //            location = new Uri(downloadUrl),
-                                //            retries = 3,
-                                //            retrieveDate = DateTime.UtcNow,
-                                //            retryInterval = 10
-                                //        };
-                                //        db.MachineOperateRecord.Add(new MachineOperateRecord()
-                                //        {
-                                //            CreatedOn = DateTime.UtcNow,
-                                //            ChargeBoxId = session.ChargeBoxId,
-                                //            SerialNo = requestId,
-                                //            RequestContent = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                //            EVSE_Status = 0,
-                                //            EVSE_Value = "Fw Version:" + machine.FW_AssignedMachineVersionId,
-                                //            Status = 0,
-                                //            RequestType = 0,
-
-                                //        });
-
-                                //        db.ServerMessage.Add(new ServerMessage()
-                                //        {
-                                //            ChargeBoxId = session.ChargeBoxId,
-                                //            CreatedBy = "Server",
-                                //            CreatedOn = DateTime.UtcNow,
-                                //            OutAction = _updateFWrequest.Action.ToString(),
-                                //            OutRequest = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                //            SerialNo = requestId,
-                                //            InMessage = string.Empty
-
-                                //        });
-
-                                //        db.SaveChanges();
-
-                                //    }
-
-                                //}
-                                #endregion
-                            }
+                            var _request = new TriggerMessageRequest()
+                            {
+                                requestedMessage = Packet.Messages.SubTypes.MessageTrigger.FirmwareStatusNotification
+                            };
+
+                            var uuid = session.queue.store(_request);
+                            string rawRequest = BasicMessageHandler.GenerateRequest(uuid, _request.Action, _request);
+                            protalServer.SendMsg(session, rawRequest, string.Format("{0} {1}", _request.Action, "Request"), "");
+
+                            #region OCTT   ,測試韌體更新方式
+                            //--------------------> OCTT   ,測試韌體更新方式
+                            //{
+                            //    var machine = db.Machine.Where(x => x.FW_AssignedMachineVersionId.HasValue == true &&
+                            //        x.FW_AssignedMachineVersionId != x.FW_VersionReport && x.ChargeBoxId == session.ChargeBoxId)
+                            //        .Select(x => new { x.Id, x.FW_AssignedMachineVersionId }).FirstOrDefault();
+
+                            //    if (machine != null)
+                            //    {
+                            //        var mv = db.MachineVersion.Include(c => c.PublishVersion)
+                            //         .Include(c => c.PublishVersion.PublishVersionFiles)
+                            //         .Include(c => c.PublishVersion.PublishVersionFiles.Select(z => z.UploadFile))
+                            //         .Where(c => c.Id == machine.FW_AssignedMachineVersionId.Value).First();
+
+                            //        string downloadUrl = mv.PublishVersion.PublishVersionFiles.FirstOrDefault().UploadFile.FileUrl;
+
+                            //        var _updateFWrequest = new UpdateFirmwareRequest()
+                            //        {
+                            //            location = new Uri(downloadUrl),
+                            //            retries = 3,
+                            //            retrieveDate = DateTime.UtcNow,
+                            //            retryInterval = 10
+                            //        };
+                            //        db.MachineOperateRecord.Add(new MachineOperateRecord()
+                            //        {
+                            //            CreatedOn = DateTime.UtcNow,
+                            //            ChargeBoxId = session.ChargeBoxId,
+                            //            SerialNo = requestId,
+                            //            RequestContent = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                            //            EVSE_Status = 0,
+                            //            EVSE_Value = "Fw Version:" + machine.FW_AssignedMachineVersionId,
+                            //            Status = 0,
+                            //            RequestType = 0,
+
+                            //        });
+
+                            //        db.ServerMessage.Add(new ServerMessage()
+                            //        {
+                            //            ChargeBoxId = session.ChargeBoxId,
+                            //            CreatedBy = "Server",
+                            //            CreatedOn = DateTime.UtcNow,
+                            //            OutAction = _updateFWrequest.Action.ToString(),
+                            //            OutRequest = JsonConvert.SerializeObject(_updateFWrequest, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                            //            SerialNo = requestId,
+                            //            InMessage = string.Empty
+
+                            //        });
+
+                            //        db.SaveChanges();
+
+                            //    }
+
+                            //}
+                            #endregion
                         }
                     }
-                    catch (Exception ex)
-                    {
-                        logger.LogError("serverUpdateTrigger ChargeBoxId:{0}  Ex:{1}", chargeBoxId, ex.ToString());
-                    }
+                }
+                catch (Exception ex)
+                {
+                    logger.LogError("serverUpdateTrigger ChargeBoxId:{0}  Ex:{1}", chargeBoxId, ex.ToString());
                 }
             }
         }

+ 163 - 164
EVCB_OCPP.WSServer/Jobs/ServerWeatherNotificationJob.cs

@@ -18,200 +18,199 @@ using Microsoft.EntityFrameworkCore;
 using EVCB_OCPP.Packet.Features;
 using EVCB_OCPP.Packet.Messages.Core;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class ServerWeatherNotificationJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class ServerWeatherNotificationJob : IJob
+    public ServerWeatherNotificationJob(
+        ProtalServer protalServer,
+        IDbContextFactory<MainDBContext> maindbContextFactory,
+        ILogger<ServerWeatherNotificationJob> logger)
     {
-        public ServerWeatherNotificationJob(
-            ProtalServer protalServer,
-            IDbContextFactory<MainDBContext> maindbContextFactory,
-            ILogger<ServerWeatherNotificationJob> logger)
-        {
-            this.protalServer = protalServer;
-            this.maindbContextFactory = maindbContextFactory;
-            this.logger = logger;
-        }
+        this.protalServer = protalServer;
+        this.maindbContextFactory = maindbContextFactory;
+        this.logger = logger;
+    }
 
-        private readonly ProtalServer protalServer;
-        private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
-        private readonly ILogger<ServerWeatherNotificationJob> logger;
-        private OuterHttpClient httpClient = new OuterHttpClient();
+    private readonly ProtalServer protalServer;
+    private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
+    private readonly ILogger<ServerWeatherNotificationJob> logger;
+    private OuterHttpClient httpClient = new OuterHttpClient();
 
-        public async Task Execute(IJobExecutionContext context)
-        {
-            logger.LogDebug("{0} Started", nameof(ServerWeatherNotificationJob));
-            // Console.WriteLine("in...............ServerWeatherNotificationTrigger");
-            BasicMessageHandler msgAnalyser = new BasicMessageHandler();
-            Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
-            var _CheckWeatherDt = DateTime.UtcNow;
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(ServerWeatherNotificationJob));
+        // Console.WriteLine("in...............ServerWeatherNotificationTrigger");
+        BasicMessageHandler msgAnalyser = new BasicMessageHandler();
+        Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
+        var _CheckWeatherDt = DateTime.UtcNow;
 
-            var locations = _copyClientDic.Where(x => !string.IsNullOrEmpty(x.Value.StationLocation)).Distinct().Select(x => x.Value.StationLocation).ToList();
+        var locations = _copyClientDic.Where(x => !string.IsNullOrEmpty(x.Value.StationLocation)).Distinct().Select(x => x.Value.StationLocation).ToList();
 
-            // Console.WriteLine("in...............ServerWeatherNotificationTrigger");
-            foreach (var location in locations)
-            {
-                try
-                {   //query weather
-                    var httpResult = await httpClient.GetWeather("https://api.weatherapi.com/v1/current.json?key=874346abc0874e69a9423510222201&q=" + location, null, null);
+        // Console.WriteLine("in...............ServerWeatherNotificationTrigger");
+        foreach (var location in locations)
+        {
+            try
+            {   //query weather
+                var httpResult = await httpClient.GetWeather("https://api.weatherapi.com/v1/current.json?key=874346abc0874e69a9423510222201&q=" + location, null, null);
 
-                    string temp = "17";
-                    string weather_code = "1183";
-                    if (httpResult.Status == System.Net.HttpStatusCode.OK)
+                string temp = "17";
+                string weather_code = "1183";
+                if (httpResult.Status == System.Net.HttpStatusCode.OK)
+                {
+                    try
                     {
-                        try
-                        {
-                            var jsonResult = JsonConvert.DeserializeObject(httpResult.Response) as JObject;
-                            temp = jsonResult["current"]["temp_c"].ToString();
-                            weather_code = jsonResult["current"]["condition"]["code"].ToString();
-
+                        var jsonResult = JsonConvert.DeserializeObject(httpResult.Response) as JObject;
+                        temp = jsonResult["current"]["temp_c"].ToString();
+                        weather_code = jsonResult["current"]["condition"]["code"].ToString();
 
-                        }
-                        catch (Exception ex)
-                        {
-                            ;
-                        }
 
                     }
-
-                    #region 台泥氣象Mapping
-                    switch (weather_code)
+                    catch (Exception ex)
                     {
-                        case "1000":
-                            weather_code = "1";
-                            break;
-                        case "1003":
-                        case "1006":
-                        case "1009":
-                            weather_code = "2";
-                            break;
-                        case "1063":
-                        case "1072":
-                        case "1150":
-                        case "1153":
-                        case "1168":
-                        case "1171":
-                        case "1180":
-                        case "1183":
-                        case "1186":
-                        case "1189":
-                        case "1192":
-                        case "1195":
-                        case "1198":
-                        case "1201":
-                        case "1237":
-                        case "1240":
-                        case "1243":
-                        case "1246":
-                        case "1261":
-                        case "1264":
-                            weather_code = "3";
-                            break;
-                        case "1087":
-                        case "1273":
-                        case "1276":
-                        case "1279":
-                        case "1282":
-                            weather_code = "4";
-                            break;
-                        case "1066":
-                        case "1069":
-                        case "1114":
-                        case "1117":
-                        case "1204":
-                        case "1207":
-                        case "1210":
-                        case "1213":
-                        case "1216":
-                        case "1219":
-                        case "1222":
-                        case "1225":
-                        case "1249":
-                        case "1252":
-                        case "1255":
-                        case "1258":
-                            weather_code = "5";
-                            break;
-                        case "1030":
-                        case "1135":
-                        case "1147":
-                            weather_code = "2";
-                            break;
-                        default:
-                            weather_code = "2";
-                            break;
+                        ;
                     }
-                    #endregion
 
+                }
+
+                #region 台泥氣象Mapping
+                switch (weather_code)
+                {
+                    case "1000":
+                        weather_code = "1";
+                        break;
+                    case "1003":
+                    case "1006":
+                    case "1009":
+                        weather_code = "2";
+                        break;
+                    case "1063":
+                    case "1072":
+                    case "1150":
+                    case "1153":
+                    case "1168":
+                    case "1171":
+                    case "1180":
+                    case "1183":
+                    case "1186":
+                    case "1189":
+                    case "1192":
+                    case "1195":
+                    case "1198":
+                    case "1201":
+                    case "1237":
+                    case "1240":
+                    case "1243":
+                    case "1246":
+                    case "1261":
+                    case "1264":
+                        weather_code = "3";
+                        break;
+                    case "1087":
+                    case "1273":
+                    case "1276":
+                    case "1279":
+                    case "1282":
+                        weather_code = "4";
+                        break;
+                    case "1066":
+                    case "1069":
+                    case "1114":
+                    case "1117":
+                    case "1204":
+                    case "1207":
+                    case "1210":
+                    case "1213":
+                    case "1216":
+                    case "1219":
+                    case "1222":
+                    case "1225":
+                    case "1249":
+                    case "1252":
+                    case "1255":
+                    case "1258":
+                        weather_code = "5";
+                        break;
+                    case "1030":
+                    case "1135":
+                    case "1147":
+                        weather_code = "2";
+                        break;
+                    default:
+                        weather_code = "2";
+                        break;
+                }
+                #endregion
 
-                    if (protalServer.TCCStationDic.ContainsKey(location))
-                    {
-                        protalServer.TCCStationDic[location].Temperature = (int)double.Parse(temp);
-                        protalServer.TCCStationDic[location].WeatherID = int.Parse(weather_code);
-                    }
-                    else
-                    {
-                        protalServer.TCCStationDic.Add(location, new TCCWeatherDto() { WeatherID = int.Parse(weather_code), Temperature = (int)double.Parse(temp) });
-                    }
 
+                if (protalServer.TCCStationDic.ContainsKey(location))
+                {
+                    protalServer.TCCStationDic[location].Temperature = (int)double.Parse(temp);
+                    protalServer.TCCStationDic[location].WeatherID = int.Parse(weather_code);
                 }
-                catch (Exception ex)
+                else
                 {
-                    logger.LogError("ServerWeatherNotificationTrigger ChargeBoxId:{0}  Ex:{1}", location, ex.ToString());
+                    protalServer.TCCStationDic.Add(location, new TCCWeatherDto() { WeatherID = int.Parse(weather_code), Temperature = (int)double.Parse(temp) });
                 }
+
             }
+            catch (Exception ex)
+            {
+                logger.LogError("ServerWeatherNotificationTrigger ChargeBoxId:{0}  Ex:{1}", location, ex.ToString());
+            }
+        }
 
-            var clients = _copyClientDic.Where(x => x.Value.CustomerId == new Guid("009E603C-79CD-4620-A2B8-D9349C0E8AD8")).
-            Select(x => new { ChargeBoxId = x.Value.ChargeBoxId, StationLocation = x.Value.StationLocation }).ToList();
+        var clients = _copyClientDic.Where(x => x.Value.CustomerId == new Guid("009E603C-79CD-4620-A2B8-D9349C0E8AD8")).
+        Select(x => new { ChargeBoxId = x.Value.ChargeBoxId, StationLocation = x.Value.StationLocation }).ToList();
 
-            using (var db = await maindbContextFactory.CreateDbContextAsync())
-            {
+        using (var db = await maindbContextFactory.CreateDbContextAsync())
+        {
 
-                foreach (var client in clients)
+            foreach (var client in clients)
+            {
+                try
                 {
-                    try
+                    if (string.IsNullOrEmpty(client.StationLocation))
                     {
-                        if (string.IsNullOrEmpty(client.StationLocation))
-                        {
-                            Console.WriteLine(client.StationLocation + " is empty");
-                            continue;
-                        }
+                        Console.WriteLine(client.StationLocation + " is empty");
+                        continue;
+                    }
 
 
-                        if (protalServer.TCCStationDic.ContainsKey(client.StationLocation))
-                        {
-                            db.ServerMessage.Add(new ServerMessage()
-                            {
-                                ChargeBoxId = client.ChargeBoxId,
-                                CreatedBy = "Server",
-                                CreatedOn = DateTime.UtcNow,
-                                OutAction = Actions.DataTransfer.ToString(),
-                                OutRequest = JsonConvert.SerializeObject(
-                                                   new DataTransferRequest()
-                                                   {
-                                                       messageId = "ID_Weather_Info",
-                                                       vendorId = "Phihong Technology",
-                                                       data = JsonConvert.SerializeObject(
-                                                           new
-                                                           {
-                                                               weatherId = protalServer.TCCStationDic[client.StationLocation].WeatherID,
-                                                               Temperature = protalServer.TCCStationDic[client.StationLocation].Temperature
-                                                           })
-                                                   },
-                                                   new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
-                                SerialNo = Guid.NewGuid().ToString(),
-                                InMessage = string.Empty
-
-                            });
-
-                            await db.SaveChangesAsync();
-                        }
-                    }
-                    catch (Exception ex)
+                    if (protalServer.TCCStationDic.ContainsKey(client.StationLocation))
                     {
-                        logger.LogError("ServerWeatherNotificationTrigger ChargeBoxId:{0}  Ex:{1}", client.ChargeBoxId, ex.ToString());
+                        db.ServerMessage.Add(new ServerMessage()
+                        {
+                            ChargeBoxId = client.ChargeBoxId,
+                            CreatedBy = "Server",
+                            CreatedOn = DateTime.UtcNow,
+                            OutAction = Actions.DataTransfer.ToString(),
+                            OutRequest = JsonConvert.SerializeObject(
+                                               new DataTransferRequest()
+                                               {
+                                                   messageId = "ID_Weather_Info",
+                                                   vendorId = "Phihong Technology",
+                                                   data = JsonConvert.SerializeObject(
+                                                       new
+                                                       {
+                                                           weatherId = protalServer.TCCStationDic[client.StationLocation].WeatherID,
+                                                           Temperature = protalServer.TCCStationDic[client.StationLocation].Temperature
+                                                       })
+                                               },
+                                               new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None }),
+                            SerialNo = Guid.NewGuid().ToString(),
+                            InMessage = string.Empty
+
+                        });
+
+                        await db.SaveChangesAsync();
                     }
                 }
+                catch (Exception ex)
+                {
+                    logger.LogError("ServerWeatherNotificationTrigger ChargeBoxId:{0}  Ex:{1}", client.ChargeBoxId, ex.ToString());
+                }
             }
         }
     }

+ 47 - 48
EVCB_OCPP.WSServer/Jobs/SmartChargingJob.cs

@@ -12,68 +12,67 @@ using Microsoft.Extensions.Configuration;
 using Dapper;
 using Microsoft.Extensions.Logging;
 
-namespace EVCB_OCPP.WSServer.Jobs
+namespace EVCB_OCPP.WSServer.Jobs;
+
+[DisallowConcurrentExecution]
+public class SmartChargingJob : IJob
 {
-    [DisallowConcurrentExecution]
-    public class SmartChargingJob : IJob
+    public SmartChargingJob(
+        ProtalServer protalServer,
+        IConfiguration configuration,
+        ILogger<SmartChargingJob> logger)
     {
-        public SmartChargingJob(
-            ProtalServer protalServer,
-            IConfiguration configuration,
-            ILogger<SmartChargingJob> logger)
-        {
-            this.webConnectionString = configuration.GetConnectionString("WebDBContext");
-            this.protalServer = protalServer;
-            this.logger = logger;
-        }
+        this.webConnectionString = configuration.GetConnectionString("WebDBContext");
+        this.protalServer = protalServer;
+        this.logger = logger;
+    }
 
-        private readonly string webConnectionString;
-        private readonly ProtalServer protalServer;
-        private readonly ILogger<SmartChargingJob> logger;
-        private static List<StationInfoDto> _StationInfo = new List<StationInfoDto>();
+    private readonly string webConnectionString;
+    private readonly ProtalServer protalServer;
+    private readonly ILogger<SmartChargingJob> logger;
+    private static List<StationInfoDto> _StationInfo = new List<StationInfoDto>();
 
-        public async Task Execute(IJobExecutionContext context)
+    public async Task Execute(IJobExecutionContext context)
+    {
+        logger.LogDebug("{0} Started", nameof(SmartChargingJob));
+        List<StationInfoDto> stations = null;
+        using (SqlConnection conn = new SqlConnection(webConnectionString))
         {
-            logger.LogDebug("{0} Started", nameof(SmartChargingJob));
-            List<StationInfoDto> stations = null;
-            using (SqlConnection conn = new SqlConnection(webConnectionString))
+            string strSql = "SELECT[Id],[LBMode],[LBCurrent] as Availability FROM[StandardOCPP_Web].[dbo].[Station]" +
+             "where LBMode = 1; ";
+            var result = await conn.QueryAsync<StationInfoDto>(strSql);
+            stations = result.ToList();
+        }
+        foreach (var station in stations)
+        {
+            var compareStation = _StationInfo.Where(x => x.Id == station.Id).FirstOrDefault();
+
+            if (compareStation != null && (station.Id != compareStation.Id || station.Availability == compareStation.Availability))
             {
-                string strSql = "SELECT[Id],[LBMode],[LBCurrent] as Availability FROM[StandardOCPP_Web].[dbo].[Station]" +
-                 "where LBMode = 1; ";
-                var result = await conn.QueryAsync<StationInfoDto>(strSql);
-                stations = result.ToList();
+                continue;
             }
-            foreach (var station in stations)
+            var _powerDic = await protalServer.LoadingBalanceService.GetSettingPower(station.Id);
+            if (_powerDic == null)
             {
-                var compareStation = _StationInfo.Where(x => x.Id == station.Id).FirstOrDefault();
-
-                if (compareStation != null && (station.Id != compareStation.Id || station.Availability == compareStation.Availability))
-                {
-                    continue;
-                }
-                var _powerDic = await protalServer.LoadingBalanceService.GetSettingPower(station.Id);
-                if (_powerDic == null)
-                {
-                    continue;
-                }
-                foreach (var kv in _powerDic)
+                continue;
+            }
+            foreach (var kv in _powerDic)
+            {
+                try
                 {
-                    try
-                    {
 
-                        if (kv.Value.HasValue)
-                        {
-                            protalServer.ProfileHandler.SetChargingProfile(kv.Key, kv.Value.Value, Packet.Messages.SubTypes.ChargingRateUnitType.W);
-                        }
-                    }
-                    catch (Exception ex)
+                    if (kv.Value.HasValue)
                     {
-                        logger.LogError("Set Profile Exception: {0}", ex.ToString());
+                        protalServer.ProfileHandler.SetChargingProfile(kv.Key, kv.Value.Value, Packet.Messages.SubTypes.ChargingRateUnitType.W);
                     }
-
                 }
+                catch (Exception ex)
+                {
+                    logger.LogError("Set Profile Exception: {0}", ex.ToString());
+                }
+
             }
-            _StationInfo = stations;
         }
+        _StationInfo = stations;
     }
 }

+ 44 - 38
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -199,7 +199,7 @@ namespace EVCB_OCPP.WSServer.Message
                             int heartbeat_interval = GlobalConfig.GetHEARTBEAT_INTERVAL();
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var _machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+                                var _machine = await db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefaultAsync();
                                 _machine.ChargeBoxSerialNumber = string.IsNullOrEmpty(_request.chargeBoxSerialNumber) ? string.Empty : _request.chargeBoxSerialNumber;
                                 _machine.ChargePointSerialNumber = string.IsNullOrEmpty(_request.chargePointSerialNumber) ? string.Empty : _request.chargePointSerialNumber;
                                 _machine.ChargePointModel = string.IsNullOrEmpty(_request.chargePointModel) ? string.Empty : _request.chargePointModel;
@@ -217,8 +217,10 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var configVaule = db.MachineConfigurations.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.ConfigureName == StandardConfiguration.HeartbeatInterval)
-                                    .Select(x => x.ConfigureSetting).FirstOrDefault();
+                                var configVaule = await db.MachineConfigurations
+                                    .Where(x => x.ChargeBoxId == session.ChargeBoxId && x.ConfigureName == StandardConfiguration.HeartbeatInterval)
+                                    .Select(x => x.ConfigureSetting)
+                                    .FirstOrDefaultAsync();
 
                                 if (configVaule != null)
                                 {
@@ -370,7 +372,9 @@ namespace EVCB_OCPP.WSServer.Message
 
                                                 using (var maindb = await maindbContextFactory.CreateDbContextAsync())
                                                 {
-                                                    meterStart = maindb.TransactionRecord.Where(x => x.Id == _request.transactionId.Value).Select(x => x.MeterStart).FirstOrDefault();
+                                                    meterStart = await maindb.TransactionRecord
+                                                        .Where(x => x.Id == _request.transactionId.Value).Select(x => x.MeterStart)
+                                                        .FirstOrDefaultAsync();
                                                 }
 
                                                 item.sampledValue.Add(new SampledValue()
@@ -409,7 +413,7 @@ namespace EVCB_OCPP.WSServer.Message
                                                 ,unitId: sampleVaule.unit.HasValue ? (int)sampleVaule.unit : 0
                                                 ,transactionId: _request.transactionId.HasValue ? _request.transactionId.Value : -1);
 
-                                            db.Database.ExecuteSqlRaw(sp, parameter.ToArray());
+                                            await db.Database.ExecuteSqlRawAsync(sp, parameter.ToArray());
                                         }
 
                                     }
@@ -514,20 +518,20 @@ namespace EVCB_OCPP.WSServer.Message
                                 using (SqlConnection conn = new SqlConnection(webConnectionString))
                                 {
                                     var parameters = new DynamicParameters();
-                                    parameters.Add("@IdTag", _request.idTag, DbType.String, ParameterDirection.Input);
+                                    parameters.Add("@IdTag", _request.idTag, DbType.String, ParameterDirection.Input, 50);
                                     string strSql = "select parentIdTag from [dbo].[LocalListDetail]  where ListId = 27 and IdTag=@IdTag; ";
-                                    accountBalance = conn.ExecuteScalar<string>(strSql, parameters);
+                                    accountBalance = await conn.ExecuteScalarAsync<string>(strSql, parameters);
                                 }
                             }
 
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var _CustomerId = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).Include(x => x.Customer).
-                                     Select(x => x.CustomerId).FirstOrDefault();
+                                var _CustomerId = await db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).Include(x => x.Customer).
+                                     Select(x => x.CustomerId).FirstOrDefaultAsync();
 
-                                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();
+                                var _existedTx = await 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().FirstOrDefaultAsync();
                                 TransactionRecord _newTransaction = new TransactionRecord();
 
 
@@ -604,8 +608,8 @@ namespace EVCB_OCPP.WSServer.Message
                             {                              
                                 using (var db = await maindbContextFactory.CreateDbContextAsync())
                                 {
-                                    var transaction = db.TransactionRecord.Where(x => x.Id == _request.transactionId
-                                     && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+                                    var transaction = await db.TransactionRecord.Where(x => x.Id == _request.transactionId
+                                     && x.ChargeBoxId == session.ChargeBoxId).FirstOrDefaultAsync();
 
 
 
@@ -852,8 +856,8 @@ namespace EVCB_OCPP.WSServer.Message
                             DataTransferRequest _request = _confirm.GetRequest() as DataTransferRequest;
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -887,7 +891,7 @@ namespace EVCB_OCPP.WSServer.Message
                                         List<ChargingBill> bill = new List<ChargingBill>();
                                         List<ChargingPrice> chargingPrices = new List<ChargingPrice>();
                                         var txEnergy = JsonConvert.DeserializeObject<TransactionEnergy>(_confirm.data);
-                                        var feedto = db.TransactionRecord.Where(x => x.Id == txEnergy.TxId).Select(x => new { Id = x.Id, ConnectorId = x.ConnectorId, Fee = x.Fee, StopTime = x.StopTime, StartTime = x.StartTime }).FirstOrDefault();
+                                        var feedto = await db.TransactionRecord.Where(x => x.Id == txEnergy.TxId).Select(x => new { Id = x.Id, ConnectorId = x.ConnectorId, Fee = x.Fee, StopTime = x.StopTime, StartTime = x.StartTime }).FirstOrDefaultAsync();
                                         decimal chargedEnergy = 0m;
                                         if (feedto == null || string.IsNullOrEmpty(feedto.Fee)) return result;
                                         string currency = feedto.Fee.Substring(feedto.Fee.Length - 3);
@@ -974,12 +978,14 @@ namespace EVCB_OCPP.WSServer.Message
 
                                         if (feedto.StopTime != GlobalConfig.DefaultNullTime)
                                         {
-                                            var customerInfo = db.Customer.Where(x => x.Id == session.CustomerId).Select(x => new { x.InstantStopTxReport, x.ApiUrl, x.ApiKey }).FirstOrDefault();
+                                            var customerInfo = await db.Customer
+                                                .Where(x => x.Id == session.CustomerId).Select(x => new { x.InstantStopTxReport, x.ApiUrl, x.ApiKey })
+                                                .FirstOrDefaultAsync();
 
                                             decimal accountBalance = 0;
                                             decimal.TryParse(feedto.Fee.Split('+')[1], out accountBalance);
 
-                                            var tx = db.TransactionRecord.Where(x => x.Id == txEnergy.TxId).FirstOrDefault();
+                                            var tx = await db.TransactionRecord.Where(x => x.Id == txEnergy.TxId).FirstOrDefaultAsync();
                                             if (tx == null)
                                             {
                                                 Console.WriteLine("Tx is empty");
@@ -1176,8 +1182,8 @@ namespace EVCB_OCPP.WSServer.Message
                                             using (SqlConnection conn = new SqlConnection(webConnectionString))
                                             {
                                                 var parameters = new DynamicParameters();
-                                                parameters.Add("@IdTag", tx.StartIdTag, DbType.String, ParameterDirection.Input);
-                                                parameters.Add("@parentIdTag", accountBalance - tx.Cost, DbType.String, ParameterDirection.Input);
+                                                parameters.Add("@IdTag", tx.StartIdTag, DbType.String, ParameterDirection.Input, 50);
+                                                parameters.Add("@parentIdTag", accountBalance - tx.Cost, DbType.String, ParameterDirection.Input, 50);
                                                 string strSql = "update [dbo].[LocalListDetail] set parentIdTag =@parentIdTag  where ListId = 27 and IdTag=@IdTag; ";
                                                 await conn.ExecuteAsync(strSql, parameters);
 
@@ -1303,8 +1309,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -1325,8 +1331,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -1346,8 +1352,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -1367,8 +1373,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -1388,8 +1394,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -1409,8 +1415,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                         x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                         x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
 
                                 if (operation != null)
                                 {
@@ -1524,8 +1530,8 @@ namespace EVCB_OCPP.WSServer.Message
                                         }
                                     }
 
-                                    var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                   x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                    var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                   x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
 
                                     if (operation != null)
                                     {
@@ -1554,8 +1560,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                             using (var db = await maindbContextFactory.CreateDbContextAsync())
                             {
-                                var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                                var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                                x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                                 if (operation != null)
                                 {
                                     operation.FinishedOn = DateTime.UtcNow;
@@ -1609,8 +1615,8 @@ namespace EVCB_OCPP.WSServer.Message
 
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;

+ 12 - 10
EVCB_OCPP.WSServer/Message/FirmwareManagementProfileHandler.cs

@@ -6,10 +6,10 @@ using EVCB_OCPP.Packet.Messages.FirmwareManagement;
 using Newtonsoft.Json;
 using OCPPServer.Protocol;
 using System;
-using System.Data.Entity;
 using System.Linq;
 using Microsoft.Extensions.Logging;
 using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore;
 
 namespace EVCB_OCPP.WSServer.Message
 {
@@ -32,9 +32,9 @@ namespace EVCB_OCPP.WSServer.Message
                                 string requestId = Guid.NewGuid().ToString();
                                 using (var db = await maindbContextFactory.CreateDbContextAsync())
                                 {
-                                    var machine = db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true && x.FW_AssignedVersion.HasValue
+                                    var machine = await db.Machine.Where(x => x.FW_AssignedVersion.HasValue == true && x.FW_AssignedVersion.HasValue
                                        && x.FW_AssignedVersion != x.FW_VersionReport && x.ChargeBoxId == session.ChargeBoxId)
-                                        .Select(x => new { x.Id, x.FW_AssignedVersion }).AsNoTracking().FirstOrDefault();
+                                        .Select(x => new { x.Id, x.FW_AssignedVersion }).AsNoTracking().FirstOrDefaultAsync();
 
                                     if (machine != null)
                                     {
@@ -87,8 +87,8 @@ namespace EVCB_OCPP.WSServer.Message
                             {
                                 using (var db = await maindbContextFactory.CreateDbContextAsync())
                                 {
-                                    var item = db.MachineOperateRecord.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.RequestType == 0)
-                                        .OrderByDescending(x => x.CreatedOn).FirstOrDefault();
+                                    var item = await db.MachineOperateRecord.Where(x => x.ChargeBoxId == session.ChargeBoxId && x.RequestType == 0)
+                                        .OrderByDescending(x => x.CreatedOn).FirstOrDefaultAsync();
                                     if (item != null)
                                     {
                                         item.EVSE_Status = (int)_request.status;
@@ -102,7 +102,7 @@ namespace EVCB_OCPP.WSServer.Message
                                         {
                                             int version = 0;
                                             int.TryParse(item.EVSE_Value.Split(':').Last(), out version);
-                                            var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+                                            var machine = await db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefaultAsync();
                                             machine.FW_VersionReport = version;
                                         }
                                     }
@@ -165,8 +165,9 @@ namespace EVCB_OCPP.WSServer.Message
                         }
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord
+                                .Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0)
+                                .FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -202,8 +203,9 @@ namespace EVCB_OCPP.WSServer.Message
                     {
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord
+                                .Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0)
+                                .FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;

+ 7 - 6
EVCB_OCPP.WSServer/Message/LocalAuthListManagementProfileHandler.cs

@@ -2,6 +2,7 @@
 using EVCB_OCPP.Packet.Features;
 using EVCB_OCPP.Packet.Messages;
 using EVCB_OCPP.Packet.Messages.LocalAuthListManagement;
+using Microsoft.EntityFrameworkCore;
 using OCPPServer.Protocol;
 using System;
 using System.Linq;
@@ -23,8 +24,8 @@ namespace EVCB_OCPP.WSServer.Message
                         GetLocalListVersionRequest _request = _confirm.GetRequest() as GetLocalListVersionRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -43,8 +44,8 @@ namespace EVCB_OCPP.WSServer.Message
                         SendLocalListRequest _request = _confirm.GetRequest() as SendLocalListRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -78,8 +79,8 @@ namespace EVCB_OCPP.WSServer.Message
                     {
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;

+ 5 - 4
EVCB_OCPP.WSServer/Message/RemoteTriggerHandler.cs

@@ -2,6 +2,7 @@
 using EVCB_OCPP.Packet.Features;
 using EVCB_OCPP.Packet.Messages;
 using EVCB_OCPP.Packet.Messages.RemoteTrigger;
+using Microsoft.EntityFrameworkCore;
 using OCPPServer.Protocol;
 using System;
 using System.Linq;
@@ -25,8 +26,8 @@ namespace EVCB_OCPP.WSServer.Message
                         TriggerMessageRequest _request = _confirm.GetRequest() as TriggerMessageRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -59,8 +60,8 @@ namespace EVCB_OCPP.WSServer.Message
                     {
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;

+ 9 - 8
EVCB_OCPP.WSServer/Message/ReservationProfileHandler.cs

@@ -2,6 +2,7 @@
 using EVCB_OCPP.Packet.Features;
 using EVCB_OCPP.Packet.Messages;
 using EVCB_OCPP.Packet.Messages.Reservation;
+using Microsoft.EntityFrameworkCore;
 using OCPPServer.Protocol;
 using System;
 using System.Linq;
@@ -25,8 +26,8 @@ namespace EVCB_OCPP.WSServer.Message
                         ReserveNowRequest _request = _confirm.GetRequest() as ReserveNowRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -45,8 +46,8 @@ namespace EVCB_OCPP.WSServer.Message
                         CancelReservationRequest _request = _confirm.GetRequest() as CancelReservationRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -79,8 +80,8 @@ namespace EVCB_OCPP.WSServer.Message
                     {
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -97,8 +98,8 @@ namespace EVCB_OCPP.WSServer.Message
                     {
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;

+ 11 - 8
EVCB_OCPP.WSServer/Message/SmartChargingProfileHandler.cs

@@ -4,6 +4,7 @@ using EVCB_OCPP.Packet.Features;
 using EVCB_OCPP.Packet.Messages;
 using EVCB_OCPP.Packet.Messages.SmartCharging;
 using EVCB_OCPP.Packet.Messages.SubTypes;
+using Microsoft.EntityFrameworkCore;
 using Newtonsoft.Json;
 using OCPPServer.Protocol;
 using System;
@@ -101,8 +102,8 @@ namespace EVCB_OCPP.WSServer.Message
                         ClearChargingProfileRequest _request = _confirm.GetRequest() as ClearChargingProfileRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -121,8 +122,8 @@ namespace EVCB_OCPP.WSServer.Message
                         SetChargingProfileRequest _request = _confirm.GetRequest() as SetChargingProfileRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
+                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -141,8 +142,9 @@ namespace EVCB_OCPP.WSServer.Message
                         GetCompositeScheduleRequest _request = _confirm.GetRequest() as GetCompositeScheduleRequest;
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord
+                                .Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0)
+                                .FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;
@@ -177,8 +179,9 @@ namespace EVCB_OCPP.WSServer.Message
                     {
                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                         {
-                            var operation = db.MachineOperateRecord.Where(x => x.SerialNo == requestId &&
-                            x.ChargeBoxId == session.ChargeBoxId && x.Status == 0).FirstOrDefault();
+                            var operation = await db.MachineOperateRecord
+                                .Where(x => x.SerialNo == requestId && x.ChargeBoxId == session.ChargeBoxId && x.Status == 0)
+                                .FirstOrDefaultAsync();
                             if (operation != null)
                             {
                                 operation.FinishedOn = DateTime.UtcNow;

+ 12 - 11
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -536,7 +536,7 @@ namespace EVCB_OCPP.WSServer
             RemoveClient(session);
         }
 
-        private void AppServer_NewSessionConnected(ClientData session)
+        private async void AppServer_NewSessionConnected(ClientData session)
         {
             logger.Debug(string.Format("{0} NewSessionConnected", session.Path));
 
@@ -568,7 +568,7 @@ namespace EVCB_OCPP.WSServer
 
                 using (var db = maindbContextFactory.CreateDbContext())
                 {
-                    var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+                    var machine = await db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefaultAsync();
                     if (machine != null)
                     {
                         machine.ConnectionType = session.Origin.Contains("https") ? 2 : 1;
@@ -883,7 +883,7 @@ namespace EVCB_OCPP.WSServer
                                     {
                                         using (var db = await maindbContextFactory.CreateDbContextAsync())
                                         {
-                                            var machine = db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefault();
+                                            var machine = await db.Machine.Where(x => x.ChargeBoxId == session.ChargeBoxId).FirstOrDefaultAsync();
                                             if (machine != null)
                                             {
                                                 if (machine.ConnectorType.Contains("6") || machine.ConnectorType.Contains("7") || machine.ConnectorType.Contains("8") || machine.ConnectorType.Contains("9"))
@@ -954,7 +954,7 @@ namespace EVCB_OCPP.WSServer
 
                             if (action == Actions.StartTransaction)
                             {
-                                var stationId = _loadingBalanceService.GetStationIdByMachineId(session.MachineId);
+                                var stationId = await _loadingBalanceService.GetStationIdByMachineId(session.MachineId);
                                 var _powerDic = await _loadingBalanceService.GetSettingPower(stationId);
                                 if (_powerDic != null)
                                 {
@@ -978,7 +978,7 @@ namespace EVCB_OCPP.WSServer
 
                             if (action == Actions.StopTransaction)
                             {
-                                var stationId = _loadingBalanceService.GetStationIdByMachineId(session.MachineId);
+                                var stationId = await _loadingBalanceService.GetStationIdByMachineId(session.MachineId);
                                 var _powerDic = await _loadingBalanceService.GetSettingPower(stationId);
                                 if (_powerDic != null)
                                 {
@@ -1208,7 +1208,7 @@ namespace EVCB_OCPP.WSServer
             using (SqlConnection conn = new SqlConnection(webConnectionString))
             {
                 var parameters = new DynamicParameters();
-                parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input);
+                parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input, 36);
                 string displayPricestrSql = "";
                 string strSql = "";
 
@@ -1231,12 +1231,13 @@ namespace EVCB_OCPP.WSServer
                    " on[StationMachine].StationId = StationFee.StationId  where StationMachine.MachineId =@MachineId and StationFee.IsAC=0; ";
 
                 }
-                var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
-                if (result.Count() == 0)
+                //var result = await conn.QueryAsync<StationFee>(displayPricestrSql, parameters);
+                var result = await conn.QueryFirstOrDefaultAsync<StationFee>(displayPricestrSql, parameters);
+                if (result == default)
                 {
                     return string.Empty;
                 }
-                var stationPrice = result.First();
+                var stationPrice = result;//.First();
 
                 if (stationPrice.BillingMethod == 1)
                 {
@@ -1315,7 +1316,7 @@ namespace EVCB_OCPP.WSServer
 
                     using (var db = await maindbContextFactory.CreateDbContextAsync())
                     {
-                        var sc = db.ServerMessage.Where(x => x.Id == foundRequest.Id).FirstOrDefault();
+                        var sc = await db.ServerMessage.Where(x => x.Id == foundRequest.Id).FirstOrDefaultAsync();
                         sc.InMessage = JsonConvert.SerializeObject(analysisResult.Message, Formatting.None);
                         sc.ReceivedOn = DateTime.UtcNow;
                         await db.SaveChangesAsync();
@@ -1434,7 +1435,7 @@ namespace EVCB_OCPP.WSServer
                            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("Data", SqlDbType.NVarChar, -1) { 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() },

+ 58 - 49
EVCB_OCPP.WSServer/Service/LoadingBalanceService.cs

@@ -7,6 +7,7 @@ using System.Configuration;
 using System.Data;
 using System.Data.SqlClient;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace EVCB_OCPP.WSServer.Service
@@ -23,7 +24,8 @@ namespace EVCB_OCPP.WSServer.Service
 
     public class LoadingBalanceService
     {
-        ConcurrentDictionary<int, object> _lockDic = new ConcurrentDictionary<int, object>();
+        //ConcurrentDictionary<int, object> _lockDic = new ConcurrentDictionary<int, object>();
+        ConcurrentDictionary<int, SemaphoreSlim> _semaphoreDic = new ConcurrentDictionary<int, SemaphoreSlim>();
         private readonly string mainConnectionString;
         private readonly string webConnectionString;
 
@@ -33,15 +35,15 @@ namespace EVCB_OCPP.WSServer.Service
             webConnectionString = configuration.GetConnectionString("WebDBContext");
         }
 
-        public int GetStationIdByMachineId(string machineId)
+        public async Task<int> GetStationIdByMachineId(string machineId)
         {
             int stationId = 0;
             using (SqlConnection conn = new SqlConnection(webConnectionString))
             {
                 var parameters = new DynamicParameters();
-                parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input);
+                parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input, 36);
                 string strSql = "Select StationId from [dbo].[StationMachine] where MachineId=@MachineId ; ";
-                stationId = conn.ExecuteScalar<Int32>(strSql, parameters);
+                stationId = await conn.ExecuteScalarAsync<Int32>(strSql, parameters);
             }
             return stationId;
         }
@@ -52,38 +54,51 @@ namespace EVCB_OCPP.WSServer.Service
             var setting = await GetLoadBalance(stationId);
             if (setting == null) return false;
 
-            lock (GetLock(stationId))
+            var semaphore = GetSemaphore(stationId);
+            await semaphore.WaitAsync();
+            if (setting.LBMode > 0 && setting.LBMode < 3 && !await IsStillInTransactions(chargeBoxId))
             {
-                if (setting.LBMode > 0 && setting.LBMode < 3 && !IsStillInTransactions(chargeBoxId))
-                {
-                    // renew table
-                    //    UpdateLoadbalanceRecord(stationId, machineId, 0, DateTime.UtcNow);
-                    return true;
+                // renew table
+                //    UpdateLoadbalanceRecord(stationId, machineId, 0, DateTime.UtcNow);
+                return true;
 
-                }
+            }
 
-                if (setting.LBMode >= 3 || setting.LBMode < 1)
-                {
-                    //   CloseLoadbalanceRecord(stationId);
+            if (setting.LBMode >= 3 || setting.LBMode < 1)
+            {
+                //   CloseLoadbalanceRecord(stationId);
 
-                }
             }
+            semaphore.Release();
 
             return false;
 
         }
 
-        private object GetLock(int stationId)
+        //private object GetLock(int stationId)
+        //{
+
+        //    if (!_lockDic.ContainsKey(stationId))
+        //    {
+        //        _lockDic.TryAdd(stationId, new object());
+        //    }
+
+        //    return _lockDic[stationId];
+
+        //}
+
+        private SemaphoreSlim GetSemaphore(int stationId)
         {
 
-            if (!_lockDic.ContainsKey(stationId))
+            if (!_semaphoreDic.ContainsKey(stationId))
             {
-                _lockDic.TryAdd(stationId, new object());
+                _semaphoreDic.TryAdd(stationId, new SemaphoreSlim(1));
             }
 
-            return _lockDic[stationId];
+            return _semaphoreDic[stationId];
 
         }
+
         private void CloseLoadbalanceRecord(int stationId)
         {
             using (SqlConnection conn = new SqlConnection(mainConnectionString))
@@ -106,7 +121,7 @@ namespace EVCB_OCPP.WSServer.Service
                 if (finishedOn.HasValue)
                 {
                     var parameters = new DynamicParameters();
-                    parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input);
+                    parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input, 36);
                     parameters.Add("@FinishedOn", finishedOn.Value, DbType.DateTime, ParameterDirection.Input);
                     string strSql = "Update  [dbo].[LoadingBalance]  SET FinishedOn=@FinishedOn where MachineId=@MachineId and FinishedOn='1991/01/01'; ";
                     conn.Execute(strSql, parameters);
@@ -116,7 +131,7 @@ namespace EVCB_OCPP.WSServer.Service
                     if (keepgoing)
                     {
                         var parameters = new DynamicParameters();
-                        parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input);
+                        parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input, 36);
                         parameters.Add("@Power", power, DbType.Decimal, ParameterDirection.Input);
                         string strSql = "Update  [dbo].[LoadingBalance]  SET Power=@Power where MachineId=@MachineId and FinishedOn='1991/01/01'; ";
                         conn.Execute(strSql, parameters);
@@ -125,7 +140,7 @@ namespace EVCB_OCPP.WSServer.Service
                     {
                         var parameters = new DynamicParameters();
                         parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
-                        parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input);
+                        parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input, 36);
                         parameters.Add("@Power", power, DbType.Decimal, ParameterDirection.Input);
                         parameters.Add("@CreatedOn", DateTime.UtcNow, DbType.DateTime, ParameterDirection.Input);
                         parameters.Add("@FinishedOn", new DateTime(1991, 1, 1, 0, 0, 0, DateTimeKind.Utc), DbType.DateTime, ParameterDirection.Input);
@@ -143,16 +158,16 @@ namespace EVCB_OCPP.WSServer.Service
         }
 
 
-        private bool IsStillInTransactions(string chargeBoxId)
+        private async Task<bool> IsStillInTransactions(string chargeBoxId)
         {
             bool result = false;
 
             using (SqlConnection conn = new SqlConnection(mainConnectionString))
             {
                 var parameters = new DynamicParameters();
-                parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input);
+                parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input, 50);
                 string strSql = "Select count(*) from [dbo].[TransactionRecord] where ChargeBoxId=@ChargeBoxId and StopTime='1991/01/01'; ";
-                result = conn.ExecuteScalar<bool>(strSql, parameters);
+                result = await conn.ExecuteScalarAsync<bool>(strSql, parameters);
             }
 
             return result;
@@ -165,7 +180,7 @@ namespace EVCB_OCPP.WSServer.Service
             using (SqlConnection conn = new SqlConnection(mainConnectionString))
             {
                 var parameters = new DynamicParameters();
-                parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input);
+                parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input, 36);
                 string strSql = "Select Power from [dbo].[LoadingBalance] where MachineId=@MachineId and FinishedOn='1991/01/01'; ";
                 result = conn.ExecuteScalar<decimal>(strSql, parameters);
             }
@@ -173,29 +188,23 @@ namespace EVCB_OCPP.WSServer.Service
             return result;
         }
 
-
-
-
-
         async public Task<Dictionary<string, decimal?>> GetSettingPower(int stationId)
         {
             Dictionary<string, decimal?> dic = new Dictionary<string, decimal?>();
             var setting = await GetLoadBalance(stationId);
             if (setting == null) return null;
 
-            lock (GetLock(stationId))
+            var semaphore = GetSemaphore(stationId);
+            await semaphore.WaitAsync();
+            if (setting != null)
             {
-
-                if (setting != null)
+                if (setting.LBMode == 1)
                 {
-                    if (setting.LBMode == 1)
-                    {
-                        dic = GetAveragePower(stationId, setting.LBCurrent).Result;
-                    }
-
+                    dic = await GetAveragePower(stationId, setting.LBCurrent);
                 }
 
             }
+            semaphore.Release();
 
             return dic;
         }
@@ -210,8 +219,8 @@ namespace EVCB_OCPP.WSServer.Service
                 parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
 
                 string strSql = "Select LBMode,LBCurrent from [dbo].[Station] where Id=@StationId ; ";
-                var result = await conn.QueryAsync<LoadBalanceSetting>(strSql, parameters);
-                setting = result.FirstOrDefault();
+                setting = await conn.QueryFirstOrDefaultAsync<LoadBalanceSetting>(strSql, parameters);
+                //etting = result.FirstOrDefaultAsync();
             }
             return setting;
         }
@@ -238,7 +247,7 @@ namespace EVCB_OCPP.WSServer.Service
             availableCapacity = (int)(availableCapacity * 1000 / 1.05M);
             int keepPower = 0;
             //讀取上一次斷線但還沒充完電的分配量
-            var offlineCPs = GetChargeBoxIdbyOfflineCharging(stationId, out keepPower);
+            (var offlineCPs, keepPower) = await GetChargeBoxIdbyOfflineCharging(stationId);
             //扣除Keep充電功率  =  分配充電量
             var totalPower = availableCapacity - keepPower;
 
@@ -292,29 +301,29 @@ namespace EVCB_OCPP.WSServer.Service
         /// <param name="stationId">站點代號</param>
         /// <param name="ratedPowers">總額定功率</param>
         /// <returns></returns>
-        private List<string> GetChargeBoxIdbyOfflineCharging(int stationId, out int ratedPowers)
+        private async Task<(List<string>,int ratedPowers)> GetChargeBoxIdbyOfflineCharging(int stationId)
         {
             List<string> machineIds = GetIdsbyStationId(stationId).Result;
             List<string> result = new List<string>();
-            ratedPowers = 0;
+            int ratedPowers = 0;
             using (SqlConnection conn = new SqlConnection(mainConnectionString))
             {
 
                 string offlineChargerSql = "Select ChargeBoxId from [dbo].[Machine] where Id in @machineIds and [Online]=0; ";
-                result = conn.Query<string>(offlineChargerSql, new { machineIds = machineIds }).ToList();
+                result = (await conn.QueryAsync<string>(offlineChargerSql, new { machineIds = machineIds })).ToList();
                 foreach (var charger in result)
                 {
                     string txSql = "SELECT TOP(1) [Id] from [dbo].[TransactionRecord] where ChargeBoxId=@ChargeBoxId and StopTime = '1991-01-01 00:00:00.000'; ";
-                    var txId = conn.ExecuteScalar<Int64>(txSql, new { ChargeBoxId = charger });
+                    var txId = await conn.ExecuteScalarAsync<Int64>(txSql, new { ChargeBoxId = charger });
                     if (txId > 0)
                     {
                         string ratedPowerSql = "Select Sum(RatedPower) from [dbo].[Machine] where ChargeBoxId=@ChargeBoxId and [Online]=0; ";
-                        ratedPowers += conn.ExecuteScalar<int>(ratedPowerSql, new { ChargeBoxId = charger });
+                        ratedPowers += await conn.ExecuteScalarAsync<int>(ratedPowerSql, new { ChargeBoxId = charger });
                     }
                 }
             }
             ratedPowers *= 1000;
-            return result;
+            return (result, ratedPowers);
         }
 
         private decimal GetRatedPowerbyChargeBoxId(string chargeBoxId)
@@ -323,7 +332,7 @@ namespace EVCB_OCPP.WSServer.Service
             using (SqlConnection conn = new SqlConnection(mainConnectionString))
             {
                 var parameters = new DynamicParameters();
-                parameters.Add("@machineId", chargeBoxId, DbType.String, ParameterDirection.Input);
+                parameters.Add("@machineId", chargeBoxId, DbType.String, ParameterDirection.Input, 36);
                 string strSql = "Select RatedPower from [dbo].[Machine] where Id=@machineId; ";
                 ratedPower = conn.ExecuteScalar<Int32>(strSql, parameters);
             }
@@ -336,7 +345,7 @@ namespace EVCB_OCPP.WSServer.Service
             using (SqlConnection conn = new SqlConnection(mainConnectionString))
             {
                 var parameters = new DynamicParameters();
-                parameters.Add("@machineId", machineId, DbType.String, ParameterDirection.Input);
+                parameters.Add("@machineId", machineId, DbType.String, ParameterDirection.Input, 36);
                 string strSql = "Select RatedPower from [dbo].[Machine] where Id=@machineId; ";
                 ratedPower = conn.ExecuteScalar<Int32>(strSql, parameters);
             }

+ 3 - 3
EVCB_OCPP.WSServer/Service/OuterBusinessService.cs

@@ -61,7 +61,7 @@ namespace EVCB_OCPP.WSServer.Service
             set
             {
                 _CustomerId = value;
-                signMaterial = GetSign(_CustomerId);
+                signMaterial = GetSign(_CustomerId).Result;
             }
         }
 
@@ -224,7 +224,7 @@ namespace EVCB_OCPP.WSServer.Service
 
         }
 
-        private CustomerSignMaterial GetSign(string customerId)
+        private async Task<CustomerSignMaterial> GetSign(string customerId)
         {
             Guid Id = new Guid(customerId);
             CustomerSignMaterial _customer = new CustomerSignMaterial();
@@ -233,7 +233,7 @@ namespace EVCB_OCPP.WSServer.Service
             //using (var db = new MainDBContext())
             using (var db = maindbContextFactory.CreateDbContext())
             {
-                _customer = db.Customer.Where(x => x.Id == Id).Select(x => new CustomerSignMaterial() { Id = x.Id.ToString(), APIUrl = x.ApiUrl, SaltKey = x.ApiKey, CallsThirdParty = x.CallPartnerApiOnSchedule }).FirstOrDefault();
+                _customer = await db.Customer.Where(x => x.Id == Id).Select(x => new CustomerSignMaterial() { Id = x.Id.ToString(), APIUrl = x.ApiUrl, SaltKey = x.ApiKey, CallsThirdParty = x.CallPartnerApiOnSchedule }).FirstOrDefaultAsync();
             }
             return _customer;
         }