|
@@ -37,192 +37,201 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
|
|
|
public async Task Execute(IJobExecutionContext context)
|
|
|
{
|
|
|
- // logger.Debug(this.ToString() + " :Starting........");
|
|
|
-
|
|
|
-
|
|
|
- List<EVSECurrentStatus> _EVSEs = GetEVSEs();
|
|
|
-
|
|
|
- foreach (var evse in _EVSEs)
|
|
|
+ logger.Debug(this.ToString() + " :Starting........");
|
|
|
+ try
|
|
|
{
|
|
|
- latestHeartbeatTime = evse.HeartbeatUpdatedOn;
|
|
|
- if (IsOnlineNow(evse))
|
|
|
+ List<EVSECurrentStatus> _EVSEs = GetEVSEs();
|
|
|
+ var checktime = DateTime.UtcNow.AddDays(-3);
|
|
|
+ _EVSEs = _EVSEs.Where(x => x.HeartbeatUpdatedOn > checktime).ToList();
|
|
|
+
|
|
|
+ foreach (var evse in _EVSEs)
|
|
|
{
|
|
|
- if (evse.Online)
|
|
|
+ latestHeartbeatTime = evse.HeartbeatUpdatedOn;
|
|
|
+ if (IsOnlineNow(evse))
|
|
|
{
|
|
|
-
|
|
|
- if (latestHeartbeatTime.Minute % 10 == 0)
|
|
|
+ if (evse.Online)
|
|
|
{
|
|
|
- //on-on
|
|
|
- //現在是整點,找上一筆填入end time and insert start time
|
|
|
-
|
|
|
- // var _pickDate = currentTime.AddHours(-1);
|
|
|
- var _pickDate = latestHeartbeatTime;
|
|
|
- bool isCrossDay = false;
|
|
|
- int _startHour = _pickDate.AddHours(-6).Hour; //往回巡視六個小時前紀錄
|
|
|
-
|
|
|
|
|
|
-
|
|
|
- //跨日處理
|
|
|
- if (_startHour > _pickDate.Hour)
|
|
|
+ if (latestHeartbeatTime.Minute % 10 == 0)
|
|
|
{
|
|
|
- isCrossDay = true;
|
|
|
+ //on-on
|
|
|
+ //現在是整點,找上一筆填入end time and insert start time
|
|
|
|
|
|
- }
|
|
|
+ // var _pickDate = currentTime.AddHours(-1);
|
|
|
+ var _pickDate = latestHeartbeatTime;
|
|
|
+ bool isCrossDay = false;
|
|
|
+ int _startHour = _pickDate.AddHours(-6).Hour; //往回巡視六個小時前紀錄
|
|
|
|
|
|
- var _picks =await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, isCrossDay ? 0 : _startHour, _pickDate.Hour);
|
|
|
|
|
|
- if (isCrossDay)
|
|
|
- {
|
|
|
- var _picksCrossData = await GetOnlineRecords(_pickDate.AddHours(-6), evse.CustomerId.ToString(), evse.ChargeBoxId, _startHour, 23);
|
|
|
- _picks.AddRange(_picksCrossData);
|
|
|
- }
|
|
|
|
|
|
- _picks = _picks.OrderBy(x => x.OnlineTime).ToList();
|
|
|
+ //跨日處理
|
|
|
+ if (_startHour > _pickDate.Hour)
|
|
|
+ {
|
|
|
+ isCrossDay = true;
|
|
|
|
|
|
- bool _isIgnore = true;
|
|
|
+ }
|
|
|
|
|
|
- for (int i = 0; i < _picks.Count; i++)
|
|
|
- {
|
|
|
- if (_picks[i].HourIndex != evse.HeartbeatUpdatedOn.Hour && _picks[i].OfflineTime == DefaultSetting.DefaultNullTime)
|
|
|
+ var _picks = await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, isCrossDay ? 0 : _startHour, _pickDate.Hour);
|
|
|
+
|
|
|
+ if (isCrossDay)
|
|
|
{
|
|
|
- _picks[i].OfflineTime = new DateTime(_picks[i].OnlineTime.AddHours(1).Year,
|
|
|
- _picks[i].OnlineTime.AddHours(1).Month, _picks[i].OnlineTime.AddHours(1).Day, _picks[i].OnlineTime.AddHours(1).Hour, 0, 0);
|
|
|
+ var _picksCrossData = await GetOnlineRecords(_pickDate.AddHours(-6), evse.CustomerId.ToString(), evse.ChargeBoxId, _startHour, 23);
|
|
|
+ _picks.AddRange(_picksCrossData);
|
|
|
+ }
|
|
|
|
|
|
- _picks[i].TotalMinute = (int)_picks[i].OfflineTime.Subtract(_picks[i].OnlineTime).TotalMinutes;
|
|
|
- updateData.Add(_picks[i]);
|
|
|
+ _picks = _picks.OrderBy(x => x.OnlineTime).ToList();
|
|
|
|
|
|
- var checkTime = _picks[i].OfflineTime;
|
|
|
- while ((int)latestHeartbeatTime.Subtract(checkTime).TotalHours > 0)
|
|
|
+ bool _isIgnore = true;
|
|
|
+
|
|
|
+ for (int i = 0; i < _picks.Count; i++)
|
|
|
+ {
|
|
|
+ if (_picks[i].HourIndex != evse.HeartbeatUpdatedOn.Hour && _picks[i].OfflineTime == DefaultSetting.DefaultNullTime)
|
|
|
{
|
|
|
- var _existedCount = _picks.Where(x => x.HourIndex == checkTime.Hour).ToList().Count;
|
|
|
+ _picks[i].OfflineTime = new DateTime(_picks[i].OnlineTime.AddHours(1).Year,
|
|
|
+ _picks[i].OnlineTime.AddHours(1).Month, _picks[i].OnlineTime.AddHours(1).Day, _picks[i].OnlineTime.AddHours(1).Hour, 0, 0);
|
|
|
|
|
|
- if (_existedCount == 0)
|
|
|
+ _picks[i].TotalMinute = (int)_picks[i].OfflineTime.Subtract(_picks[i].OnlineTime).TotalMinutes;
|
|
|
+ updateData.Add(_picks[i]);
|
|
|
+
|
|
|
+ var checkTime = _picks[i].OfflineTime;
|
|
|
+ while ((int)latestHeartbeatTime.Subtract(checkTime).TotalHours > 0)
|
|
|
{
|
|
|
- insertData.Add(new EVSEOnlineRecord()
|
|
|
+ var _existedCount = _picks.Where(x => x.HourIndex == checkTime.Hour).ToList().Count;
|
|
|
+
|
|
|
+ if (_existedCount == 0)
|
|
|
{
|
|
|
- CustomerId = evse.CustomerId,
|
|
|
- StationId = "0",
|
|
|
- HourIndex = checkTime.Hour,
|
|
|
- ChargeBoxId = evse.ChargeBoxId,
|
|
|
- OnlineTime = new DateTime(checkTime.Year, checkTime.Month, checkTime.Day, checkTime.Hour, 0, 0),
|
|
|
- OfflineTime = new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0),
|
|
|
- TotalMinute = 60
|
|
|
-
|
|
|
- });
|
|
|
- checkTime = checkTime.AddHours(1);
|
|
|
+ insertData.Add(new EVSEOnlineRecord()
|
|
|
+ {
|
|
|
+ CustomerId = evse.CustomerId,
|
|
|
+ StationId = "0",
|
|
|
+ HourIndex = checkTime.Hour,
|
|
|
+ ChargeBoxId = evse.ChargeBoxId,
|
|
|
+ OnlineTime = new DateTime(checkTime.Year, checkTime.Month, checkTime.Day, checkTime.Hour, 0, 0),
|
|
|
+ OfflineTime = new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0),
|
|
|
+ TotalMinute = 60
|
|
|
+
|
|
|
+ });
|
|
|
+ checkTime = checkTime.AddHours(1);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- _isIgnore = _picks.Where(x => x.HourIndex == latestHeartbeatTime.Hour).ToList().Count == 0 ? false : true;
|
|
|
+ _isIgnore = _picks.Where(x => x.HourIndex == latestHeartbeatTime.Hour).ToList().Count == 0 ? false : true;
|
|
|
|
|
|
- if (!_isIgnore)
|
|
|
- {
|
|
|
- insertData.Add(new EVSEOnlineRecord()
|
|
|
+ if (!_isIgnore)
|
|
|
{
|
|
|
- CustomerId = evse.CustomerId,
|
|
|
- StationId = "0",
|
|
|
- HourIndex = evse.HeartbeatUpdatedOn.Hour,
|
|
|
- ChargeBoxId = evse.ChargeBoxId,
|
|
|
- OnlineTime = new DateTime(latestHeartbeatTime.Year,
|
|
|
- latestHeartbeatTime.Month, latestHeartbeatTime.Day, latestHeartbeatTime.Hour, 0, 0),
|
|
|
- OfflineTime = DefaultSetting.DefaultNullTime
|
|
|
-
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
+ insertData.Add(new EVSEOnlineRecord()
|
|
|
+ {
|
|
|
+ CustomerId = evse.CustomerId,
|
|
|
+ StationId = "0",
|
|
|
+ HourIndex = evse.HeartbeatUpdatedOn.Hour,
|
|
|
+ ChargeBoxId = evse.ChargeBoxId,
|
|
|
+ OnlineTime = new DateTime(latestHeartbeatTime.Year,
|
|
|
+ latestHeartbeatTime.Month, latestHeartbeatTime.Day, latestHeartbeatTime.Hour, 0, 0),
|
|
|
+ OfflineTime = DefaultSetting.DefaultNullTime
|
|
|
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //off - on
|
|
|
- // logger.Debug(string.Format("Chargeboxid:{0} HeartbeatUpdatedOn:{1} Online:{2}", evse.ChargeBoxId, evse.HeartbeatUpdatedOn,true));
|
|
|
- UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, true, DefaultSetting.DefaultNullTime);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- insertData.Add(new EVSEOnlineRecord()
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- CustomerId = evse.CustomerId,
|
|
|
- StationId = "0",
|
|
|
- HourIndex = evse.HeartbeatUpdatedOn.Hour,
|
|
|
- ChargeBoxId = evse.ChargeBoxId,
|
|
|
- OnlineTime = evse.HeartbeatUpdatedOn,
|
|
|
+ //off - on
|
|
|
+ UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, true, DefaultSetting.DefaultNullTime);
|
|
|
|
|
|
- });
|
|
|
+ insertData.Add(new EVSEOnlineRecord()
|
|
|
+ {
|
|
|
+ CustomerId = evse.CustomerId,
|
|
|
+ StationId = "0",
|
|
|
+ HourIndex = evse.HeartbeatUpdatedOn.Hour,
|
|
|
+ ChargeBoxId = evse.ChargeBoxId,
|
|
|
+ OnlineTime = evse.HeartbeatUpdatedOn,
|
|
|
|
|
|
+ });
|
|
|
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
|
|
|
- if (evse.Online)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- Console.WriteLine(string.Format("***** Chargeboxid:{0} HeartbeatUpdatedOn:{1} Online:{2}", evse.ChargeBoxId, evse.HeartbeatUpdatedOn, false));
|
|
|
- //on -off
|
|
|
- UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn);
|
|
|
|
|
|
- var _pickDate = evse.HeartbeatUpdatedOn.Date;
|
|
|
- var _picks = await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, _pickDate.Hour, evse.HeartbeatUpdatedOn.Hour);
|
|
|
- _picks = (List<EVSEOnlineRecord>)_picks.Where(x => x.OfflineTime == DefaultSetting.DefaultNullTime);
|
|
|
-
|
|
|
- foreach (var item in _picks)
|
|
|
+ if (evse.Online)
|
|
|
{
|
|
|
- if (evse.HeartbeatUpdatedOn.Hour - item.OnlineTime.Hour > 0)
|
|
|
- {
|
|
|
- item.OfflineTime = new DateTime(item.OnlineTime.AddHours(1).Year, item.OnlineTime.AddHours(1).Month, item.OnlineTime.AddHours(1).Day, item.OnlineTime.AddHours(1).Hour, 0, 0);
|
|
|
- item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
|
|
|
- updateData.Add(item);
|
|
|
+
|
|
|
+ //on -off
|
|
|
+ UpdateEVSECurrentStatus(evse.CustomerId.ToString(), evse.ChargeBoxId, false, evse.HeartbeatUpdatedOn);
|
|
|
|
|
|
- var checkTime = item.OfflineTime;
|
|
|
- while (evse.HeartbeatUpdatedOn.Hour - checkTime.Hour >= 0)
|
|
|
+ var _pickDate = evse.HeartbeatUpdatedOn.Date;
|
|
|
+ var _picks = await GetOnlineRecords(_pickDate, evse.CustomerId.ToString(), evse.ChargeBoxId, _pickDate.Hour, evse.HeartbeatUpdatedOn.Hour);
|
|
|
+ _picks = _picks.Where(x => x.OfflineTime == DefaultSetting.DefaultNullTime).ToList();
|
|
|
+
|
|
|
+ foreach (var item in _picks)
|
|
|
+ {
|
|
|
+ if (evse.HeartbeatUpdatedOn.Hour - item.OnlineTime.Hour > 0)
|
|
|
{
|
|
|
- insertData.Add(new EVSEOnlineRecord()
|
|
|
+ item.OfflineTime = new DateTime(item.OnlineTime.AddHours(1).Year, item.OnlineTime.AddHours(1).Month, item.OnlineTime.AddHours(1).Day, item.OnlineTime.AddHours(1).Hour, 0, 0);
|
|
|
+ item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
|
|
|
+ updateData.Add(item);
|
|
|
+
|
|
|
+ var checkTime = item.OfflineTime;
|
|
|
+ while (evse.HeartbeatUpdatedOn.Hour - checkTime.Hour >= 0)
|
|
|
{
|
|
|
- CustomerId = evse.CustomerId,
|
|
|
- StationId = "0",
|
|
|
- HourIndex = checkTime.Hour,
|
|
|
- ChargeBoxId = evse.ChargeBoxId,
|
|
|
- OnlineTime = checkTime,
|
|
|
- OfflineTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? evse.HeartbeatUpdatedOn : new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0)
|
|
|
+ insertData.Add(new EVSEOnlineRecord()
|
|
|
+ {
|
|
|
+ CustomerId = evse.CustomerId,
|
|
|
+ StationId = "0",
|
|
|
+ HourIndex = checkTime.Hour,
|
|
|
+ ChargeBoxId = evse.ChargeBoxId,
|
|
|
+ OnlineTime = checkTime,
|
|
|
+ OfflineTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? evse.HeartbeatUpdatedOn : new DateTime(checkTime.AddHours(1).Year, checkTime.AddHours(1).Month, checkTime.AddHours(1).Day, checkTime.AddHours(1).Hour, 0, 0)
|
|
|
+
|
|
|
+ });
|
|
|
+ checkTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? insertData.LastOrDefault().OfflineTime.AddHours(1) : insertData.LastOrDefault().OfflineTime;
|
|
|
+ }
|
|
|
|
|
|
- });
|
|
|
- checkTime = evse.HeartbeatUpdatedOn.Hour == checkTime.Hour ? insertData.LastOrDefault().OfflineTime.AddHours(1) : insertData.LastOrDefault().OfflineTime;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ item.OfflineTime = evse.HeartbeatUpdatedOn;
|
|
|
+ item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
|
|
|
+ updateData.Add(item);
|
|
|
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- item.OfflineTime = evse.HeartbeatUpdatedOn;
|
|
|
- item.TotalMinute = (int)item.OfflineTime.Subtract(item.OnlineTime).TotalMinutes;
|
|
|
- updateData.Add(item);
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //off-off do nothing
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if ((insertData.Count + updateData.Count) % 100 == 0)
|
|
|
{
|
|
|
- //off-off do nothing
|
|
|
+ await UpdateOnlineRecords(updateData, insertData);
|
|
|
+ ClearCache();
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if ((insertData.Count + updateData.Count) % 100 == 0)
|
|
|
- {
|
|
|
- await UpdateOnlineRecords(updateData, insertData);
|
|
|
- ClearCache();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
+ await UpdateOnlineRecords(updateData, insertData);
|
|
|
+
|
|
|
|
|
|
- await UpdateOnlineRecords(updateData, insertData);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ logger.Debug("ERROR "+ this.ToString() + ex.ToString());
|
|
|
+ }
|
|
|
|
|
|
+
|
|
|
|
|
|
- // logger.Debug(this.ToString() + " :Finished........");
|
|
|
+ logger.Debug(this.ToString() + " :Finished........");
|
|
|
|
|
|
}
|
|
|
|
|
@@ -235,7 +244,9 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
using (var dbConn = new SqlConnection(mainDBConnectString))
|
|
|
{
|
|
|
dbConn.Open();
|
|
|
- result = dbConn.Query<EVSECurrentStatus>("SELECT CustomerId,Id,ChargeBoxId,Online,HeartbeatUpdatedOn FROM [dbo].[Machine]").ToList();
|
|
|
+ string sqlstring = "SELECT m.CustomerId,m.Id,m.ChargeBoxId,m.Online,m.HeartbeatUpdatedOn,MachineConfigurations.ConfigureSetting HeartbeatInterval"
|
|
|
+ + " FROM [dbo].[Machine] m,[dbo].[MachineConfigurations] where MachineConfigurations.ConfigureName = 'HeartbeatInterval' and m.ChargeBoxId = MachineConfigurations.ChargeBoxId";
|
|
|
+ result = dbConn.Query<EVSECurrentStatus>(sqlstring).ToList();
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -394,12 +405,15 @@ namespace EVCB_OCPP.TaskScheduler.Jobs
|
|
|
private bool IsOnlineNow(EVSECurrentStatus currentEVSE)
|
|
|
{
|
|
|
bool isOnline = false;
|
|
|
- var checkTime = DateTime.UtcNow.AddSeconds(-120);
|
|
|
+ int heartbeatInterval = int.Parse(currentEVSE.HeartbeatInterval);
|
|
|
+ var checkTime = DateTime.UtcNow.AddSeconds(-(heartbeatInterval * 2));
|
|
|
|
|
|
if (currentEVSE.HeartbeatUpdatedOn > checkTime)
|
|
|
{
|
|
|
isOnline = true;
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
return isOnline;
|
|
|
|
|
|
}
|