Browse Source

optimize CheckEVSEOnlineJob
1. remove handle at most 20 records in the same time limit
2. merge offline query

Robert 1 year ago
parent
commit
b76380dee6

+ 3 - 13
EVCB_OCPP.TaskScheduler/Jobs/CheckEVSEOnlineJob.cs

@@ -63,7 +63,7 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
                 {
                     if (g.Key)
                     {
-                        _EVSEs = g.Where(x => !x.Online).Take(20).ToList();
+                        _EVSEs = g.Where(x => !x.Online).ToList();
 
                         for (int evseIndex = 0; evseIndex < _EVSEs.Count; evseIndex++)
                         {
@@ -75,23 +75,13 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
                     }
                     else
                     {
-                        _EVSEs = g.Where(x => x.Online).Take(20).ToList();
-                        var ChargeBoxIdOnlineRecordIdPairs = await GetOnlineRecordId(_EVSEs.Select(x=>x.ChargeBoxId).ToList());
+                        _EVSEs = g.Where(x => x.Online).ToList();
 
                         for (int evseIndex = 0; evseIndex < _EVSEs.Count; evseIndex++)
                         {
                             var evse = _EVSEs[evseIndex];
-                            if (!ChargeBoxIdOnlineRecordIdPairs.ContainsKey(evse.ChargeBoxId))
-                            {
-                                continue;
-                            }
-
                             saveTasks.Add(UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn));
-                            var online_rowId = ChargeBoxIdOnlineRecordIdPairs[evse.ChargeBoxId];
-                            if (online_rowId is not null)
-                            {
-                                saveTasks.Add(onlineLogDbService.UpdateOnlineLog(online_rowId.Value, evse.HeartbeatUpdatedOn));
-                            }
+                            saveTasks.Add(onlineLogDbService.UpdateOnlineLog(evse.ChargeBoxId, evse.HeartbeatUpdatedOn));
                         }
                     }
                 }

+ 16 - 6
EVCB_OCPP.TaskScheduler/Services/OnlineLogDbService.cs

@@ -62,15 +62,15 @@ public class OnlineLogDbService
     private GroupSingleHandler<EVSEOnlineRecord> insertOnlineLogHandler;
     private GroupSingleHandler<EVSEOnlineRecord> updateOnlineLogHandler;
 
-    internal Task UpdateOnlineLog(long rowId, DateTime offlineTime)
+    internal Task UpdateOnlineLog(string chargeBoxId, DateTime offlineTime)
     {
-        return updateOnlineLogHandler.HandleAsync(new EVSEOnlineRecord() { Id = rowId, OfflineTime = offlineTime });
+        return updateOnlineLogHandler.HandleAsync(new EVSEOnlineRecord() { ChargeBoxId = chargeBoxId, OfflineTime = offlineTime });
         //return UpdateOnlineLogDapper(rowId, offlineTime);
     }
 
-    internal Task InsertOnlineLog(string chargeBoxId, DateTime heartbeatUpdatedOn)
+    internal Task InsertOnlineLog(string chargeBoxId, DateTime onlineTime)
     {
-        return insertOnlineLogHandler.HandleAsync(new EVSEOnlineRecord() { ChargeBoxId = chargeBoxId, OnlineTime = heartbeatUpdatedOn });
+        return insertOnlineLogHandler.HandleAsync(new EVSEOnlineRecord() { ChargeBoxId = chargeBoxId, OnlineTime = onlineTime });
         //return InsertOnlineLogDapper(chargeBoxId, heartbeatUpdatedOn);
     }
 
@@ -102,14 +102,24 @@ public class OnlineLogDbService
 
     private async Task BundleUpdateWithDapper(IEnumerable<EVSEOnlineRecord> records)
     {
-        string sqlString = "UPDATE dbo.EVSEOnlineRecord SET OfflineTime=@OfflineTime WHERE Id=@Id";
+        string sqlString = """
+            UPDATE dbo.EVSEOnlineRecord 
+            SET OfflineTime=@OfflineTime 
+            WHERE Id = (
+                SELECT TOP(1) Id
+                FROM dbo.EVSEOnlineRecord
+                WHERE ChargeBoxId = @ChargeBoxId
+                ORDER BY OnlineTime DESC
+            )
+            """;
 
         using var dbConn = await connectionFactory.CreateAsync();
         foreach (var record in records)
         {
             var parameters = new DynamicParameters();
+            parameters.Add("@ChargeBoxId", record.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
             parameters.Add("@OfflineTime", record.OfflineTime, System.Data.DbType.DateTime);
-            parameters.Add("@Id", record.Id, System.Data.DbType.Int64);
+            //parameters.Add("@Id", record.Id, System.Data.DbType.Int64);
             await dbConn.ExecuteAsync(sqlString, parameters);
         }
     }