Skip to content

Commit cc60a24

Browse files
Finalize ChargeReport and some redesign plus fixes
1 parent de1e25b commit cc60a24

26 files changed

+772
-229
lines changed

OCPP.Core.Database/OCPP.Core.Database.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>net8.0</TargetFramework>
5-
<Version>1.3.2</Version>
5+
<Version>1.4.0</Version>
66
<Company>dallmann consulting GmbH</Company>
77
<Product>OCPP.Core</Product>
88
<Authors>Ulrich Dallmann</Authors>

OCPP.Core.Database/OCPPCoreContext.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,12 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
114114
.IsRequired()
115115
.HasMaxLength(100);
116116

117+
entity.Property(e => e.StartTagId).HasMaxLength(50);
118+
117119
entity.Property(e => e.StartResult).HasMaxLength(100);
118120

121+
entity.Property(e => e.StopTagId).HasMaxLength(50);
122+
119123
entity.Property(e => e.StopReason).HasMaxLength(100);
120124

121125
entity.HasOne(d => d.ChargePoint)
@@ -124,14 +128,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
124128
.OnDelete(DeleteBehavior.ClientSetNull)
125129
.HasConstraintName("FK_Transactions_ChargePoint");
126130

127-
entity.HasOne(d => d.StartTag)
128-
.WithMany()
129-
.HasForeignKey("StartTagId");
130-
131-
entity.HasOne(d => d.StopTag)
132-
.WithMany()
133-
.HasForeignKey("StopTagId");
134-
135131
entity.HasIndex(e => new { e.ChargePointId, e.ConnectorId });
136132
});
137133

OCPP.Core.Database/Transaction.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
3-
* Copyright (C) 2020-2021 dallmann consulting GmbH.
3+
* Copyright (C) 2020-2024 dallmann consulting GmbH.
44
* All Rights Reserved.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -30,11 +30,11 @@ public partial class Transaction
3030
public string Uid { get; set; }
3131
public string ChargePointId { get; set; }
3232
public int ConnectorId { get; set; }
33-
public ChargeTag StartTag { get; set; }
33+
public string StartTagId { get; set; }
3434
public DateTime StartTime { get; set; }
3535
public double MeterStart { get; set; }
3636
public string StartResult { get; set; }
37-
public ChargeTag StopTag { get; set; }
37+
public string StopTagId { get; set; }
3838
public DateTime? StopTime { get; set; }
3939
public double? MeterStop { get; set; }
4040
public string StopReason { get; set; }
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
3+
* Copyright (C) 2020-2024 dallmann consulting GmbH.
4+
* All Rights Reserved.
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
20+
namespace OCPP.Core.Database
21+
{
22+
public class TransactionExtended : Transaction
23+
{
24+
public virtual string StartTagName { get; set; }
25+
public virtual string StartTagParentId { get; set; }
26+
public virtual string StopTagName { get; set; }
27+
public virtual string StopTagParentId { get; set; }
28+
}
29+
}

OCPP.Core.Management/Controllers/HomeController.ChargeReport.cs

Lines changed: 246 additions & 83 deletions
Large diffs are not rendered by default.

OCPP.Core.Management/Controllers/HomeController.Export.cs

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
using OCPP.Core.Management.Models;
3030
using ClosedXML.Excel;
3131
using Microsoft.EntityFrameworkCore;
32+
using DocumentFormat.OpenXml.InkML;
3233

3334
namespace OCPP.Core.Management.Controllers
3435
{
@@ -49,7 +50,7 @@ public IActionResult Export(string Id, string ConnectorId)
4950
string.Join(DefaultCSVSeparator, row.Cells(1, row.LastCellUsed(XLCellsUsedOptions.AllContents).Address.ColumnNumber)
5051
.Select(cell => EscapeCsvValue(cell.GetValue<string>(), DefaultCSVSeparator))));
5152

52-
using (var writer = new StreamWriter(memoryStream, Encoding.GetEncoding("ISO-8859-1"), 1024, true))
53+
using (var writer = new StreamWriter(memoryStream, Encoding.GetEncoding("ISO-8859-1"), 4096, true))
5354
{
5455
foreach (var line in lines)
5556
{
@@ -102,7 +103,7 @@ private TransactionListViewModel LoadTransactionListViewModel(string Id, string
102103
CurrentChargePointId = Id,
103104
CurrentConnectorId = currentConnectorId,
104105
ConnectorStatuses = new List<ConnectorStatus>(),
105-
Transactions = new List<Transaction>()
106+
Transactions = new List<TransactionExtended>()
106107
};
107108

108109
string ts = Request.Query["t"];
@@ -119,25 +120,45 @@ private TransactionListViewModel LoadTransactionListViewModel(string Id, string
119120
_ => 1,
120121
};
121122

122-
Logger.LogTrace("Export: Loading charge points...");
123+
Logger.LogTrace("Export: Loading charge points and connectors...");
123124
tlvm.ConnectorStatuses = DbContext.ConnectorStatuses.Include(cs => cs.ChargePoint).ToList();
124125

125126
tlvm.CurrentConnectorName = tlvm.ConnectorStatuses
126127
.FirstOrDefault(cs => cs.ChargePointId == Id && cs.ConnectorId == currentConnectorId)?.ToString() ?? $"{Id}:{currentConnectorId}";
127128

128-
// load charge tags for id/name resolution
129-
Logger.LogTrace("Export: Loading charge tags...");
130-
tlvm.ChargeTags = DbContext.ChargeTags.ToList<ChargeTag>();
131-
132129
if (!string.IsNullOrEmpty(tlvm.CurrentChargePointId))
133130
{
134131
Logger.LogTrace("Export: Loading charge point transactions...");
135-
tlvm.Transactions = DbContext.Transactions
136-
.Where(t => t.ChargePointId == tlvm.CurrentChargePointId &&
137-
t.ConnectorId == tlvm.CurrentConnectorId &&
138-
t.StartTime >= DateTime.UtcNow.AddDays(-1 * days))
139-
.OrderByDescending(t => t.TransactionId)
140-
.ToList<Transaction>();
132+
tlvm.Transactions = (from t in DbContext.Transactions
133+
join startCT in DbContext.ChargeTags on t.StartTagId equals startCT.TagId into ft_tmp
134+
from startCT in ft_tmp.DefaultIfEmpty()
135+
join stopCT in DbContext.ChargeTags on t.StopTagId equals stopCT.TagId into ft
136+
from stopCT in ft.DefaultIfEmpty()
137+
where (t.ChargePointId == tlvm.CurrentChargePointId &&
138+
t.ConnectorId == tlvm.CurrentConnectorId &&
139+
t.StartTime >= DateTime.UtcNow.AddDays(-1 * days))
140+
select new TransactionExtended
141+
{
142+
TransactionId = t.TransactionId,
143+
Uid = t.Uid,
144+
ChargePointId = t.ChargePointId,
145+
ConnectorId = t.ConnectorId,
146+
StartTagId = t.StartTagId,
147+
StartTime = t.StartTime,
148+
MeterStart = t.MeterStart,
149+
StartResult = t.StartResult,
150+
StopTagId = t.StopTagId,
151+
StopTime = t.StopTime,
152+
MeterStop = t.MeterStop,
153+
StopReason = t.StopReason,
154+
StartTagName = startCT.TagName,
155+
StartTagParentId = startCT.ParentTagId,
156+
StopTagName = stopCT.TagName,
157+
StopTagParentId = stopCT.ParentTagId
158+
})
159+
.OrderByDescending(t => t.TransactionId)
160+
.AsNoTracking()
161+
.ToList();
141162
}
142163

143164
return tlvm;
@@ -160,15 +181,15 @@ private XLWorkbook CreateSpreadsheet(TransactionListViewModel tlvm)
160181
if (tlvm?.Transactions != null)
161182
{
162183
int row = 2;
163-
foreach (var t in tlvm.Transactions)
184+
foreach (TransactionExtended t in tlvm?.Transactions)
164185
{
165186
worksheet.Cell(row, 1).Value = tlvm.CurrentConnectorName;
166187
worksheet.Cell(row, 2).SetValue(t.StartTime.ToLocalTime());
167-
worksheet.Cell(row, 3).Value = t.StartTag?.ToString();
188+
worksheet.Cell(row, 3).Value = string.IsNullOrEmpty(t.StartTagName) ? t.StartTagId : t.StartTagName;
168189
worksheet.Cell(row, 4).SetValue(t.MeterStart);
169190
if (t.StopTime.HasValue)
170191
worksheet.Cell(row, 5).SetValue(t.StopTime?.ToLocalTime());
171-
worksheet.Cell(row, 6).Value = t.StopTag?.ToString();
192+
worksheet.Cell(row, 6).Value = string.IsNullOrEmpty(t.StopTagName) ? t.StopTagId : t.StopTagName;
172193
if (t.MeterStop.HasValue)
173194
{
174195
worksheet.Cell(row, 7).SetValue(t.MeterStop);

OCPP.Core.Management/Controllers/HomeController.Index.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,11 @@ public async Task<IActionResult> Index()
156156
LastMeter = x.cs.LastMeter,
157157
LastMeterTime = x.cs.LastMeterTime,
158158
TransactionId = (int?)transaction.TransactionId,
159-
StartTagId = transaction.StartTag.TagId,
159+
StartTagId = transaction.StartTagId,
160160
StartTime = transaction.StartTime,
161161
MeterStart = transaction.MeterStart,
162162
StartResult = transaction.StartResult,
163-
StopTagId = transaction.StopTag.TagId,
163+
StopTagId = transaction.StopTagId,
164164
StopTime = transaction.StopTime,
165165
MeterStop = transaction.MeterStop,
166166
StopReason = transaction.StopReason

OCPP.Core.Management/Controllers/HomeController.Transactions.cs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public IActionResult Transactions(string Id, string ConnectorId)
4646
tlvm.CurrentChargePointId = Id;
4747
tlvm.CurrentConnectorId = currentConnectorId;
4848
tlvm.ConnectorStatuses = new List<ConnectorStatus>();
49-
tlvm.Transactions = new List<Transaction>();
49+
tlvm.Transactions = new List<TransactionExtended>();
5050

5151
try
5252
{
@@ -93,20 +93,39 @@ public IActionResult Transactions(string Id, string ConnectorId)
9393
}
9494
}
9595

96-
97-
// load charge tags for id/name resolution
98-
Logger.LogTrace("Transactions: Loading charge tags...");
99-
tlvm.ChargeTags = DbContext.ChargeTags.ToList<ChargeTag>();
100-
10196
if (!string.IsNullOrEmpty(tlvm.CurrentChargePointId))
10297
{
10398
Logger.LogTrace("Transactions: Loading charge point transactions...");
104-
tlvm.Transactions = DbContext.Transactions
105-
.Where(t => t.ChargePointId == tlvm.CurrentChargePointId &&
99+
tlvm.Transactions = (from t in DbContext.Transactions
100+
join startCT in DbContext.ChargeTags on t.StartTagId equals startCT.TagId into ft_tmp
101+
from startCT in ft_tmp.DefaultIfEmpty()
102+
join stopCT in DbContext.ChargeTags on t.StopTagId equals stopCT.TagId into ft
103+
from stopCT in ft.DefaultIfEmpty()
104+
where (t.ChargePointId == tlvm.CurrentChargePointId &&
106105
t.ConnectorId == tlvm.CurrentConnectorId &&
107106
t.StartTime >= DateTime.UtcNow.AddDays(-1 * days))
108-
.OrderByDescending(t => t.TransactionId)
109-
.ToList<Transaction>();
107+
select new TransactionExtended
108+
{
109+
TransactionId = t.TransactionId,
110+
Uid = t.Uid,
111+
ChargePointId = t.ChargePointId,
112+
ConnectorId = t.ConnectorId,
113+
StartTagId = t.StartTagId,
114+
StartTime = t.StartTime,
115+
MeterStart = t.MeterStart,
116+
StartResult = t.StartResult,
117+
StopTagId = t.StopTagId,
118+
StopTime = t.StopTime,
119+
MeterStop = t.MeterStop,
120+
StopReason = t.StopReason,
121+
StartTagName = startCT.TagName,
122+
StartTagParentId = startCT.ParentTagId,
123+
StopTagName = stopCT.TagName,
124+
StopTagParentId = stopCT.ParentTagId
125+
})
126+
.OrderByDescending(t => t.TransactionId)
127+
.AsNoTracking()
128+
.ToList();
110129
}
111130
}
112131
catch (Exception exp)

OCPP.Core.Management/Models/ChargeReportViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ namespace OCPP.Core.Management.Models
55
{
66
public class ChargeReportViewModel
77
{
8-
public DateTime StartTime { get; set; }
9-
public DateTime StopTime { get; set; }
8+
public DateTime StartDate { get; set; }
9+
public DateTime StopDate { get; set; }
1010
public List<GroupReport> Groups { get; set; }
1111
}
1212

OCPP.Core.Management/Models/TransactionListViewModel.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,13 @@ public class TransactionListViewModel
3131

3232
public List<ConnectorStatus> ConnectorStatuses { get; set; }
3333

34-
public List<ChargeTag> ChargeTags { get; set; }
35-
3634
public string CurrentChargePointId { get; set; }
3735

3836
public int CurrentConnectorId { get; set; }
3937

4038
public string CurrentConnectorName { get; set; }
4139

42-
public List<Transaction> Transactions { get; set; }
40+
public List<TransactionExtended> Transactions { get; set; }
4341

4442
public int Timespan { get; set; }
4543

OCPP.Core.Management/OCPP.Core.Management.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>net8.0</TargetFramework>
5-
<Version>1.3.2</Version>
5+
<Version>1.4.0</Version>
66
<Company>dallmann consulting GmbH</Company>
77
<Authors>Ulrich Dallmann</Authors>
88
<Product>OCPP.Core</Product>

OCPP.Core.Management/Resources/Controllers.HomeController.de.resx

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,18 @@
126126
<data name="ChargePointIdRequired" xml:space="preserve">
127127
<value>Bitte geben Sie die Kennung der Ladestation an.</value>
128128
</data>
129+
<data name="ChargeReport" xml:space="preserve">
130+
<value>RFID Auswertung</value>
131+
</data>
132+
<data name="ChargeReportEnergy" xml:space="preserve">
133+
<value>Energie</value>
134+
</data>
135+
<data name="ChargeReportGroup" xml:space="preserve">
136+
<value>Gruppe</value>
137+
</data>
138+
<data name="ChargeReportTag" xml:space="preserve">
139+
<value>RFID-Karte</value>
140+
</data>
129141
<data name="ChargeSum" xml:space="preserve">
130142
<value>Geladen</value>
131143
</data>
@@ -138,14 +150,23 @@
138150
<data name="Connector" xml:space="preserve">
139151
<value>Anschluss</value>
140152
</data>
153+
<data name="Energy-kWh" xml:space="preserve">
154+
<value>Energie (kWh)</value>
155+
</data>
141156
<data name="ErrorOCPPServer" xml:space="preserve">
142157
<value>Es konnte kein aktueller Status vom OCPP-Server abgerufen werden.</value>
143158
</data>
159+
<data name="ReportSheetName" xml:space="preserve">
160+
<value>Transaktionen</value>
161+
</data>
144162
<data name="StartMeter" xml:space="preserve">
145163
<value>Beginn-Zähler</value>
146164
</data>
147165
<data name="StartTag" xml:space="preserve">
148-
<value>Token</value>
166+
<value>RFID-Karte</value>
167+
</data>
168+
<data name="StartTagID" xml:space="preserve">
169+
<value>RFID-Nummer</value>
149170
</data>
150171
<data name="StartTime" xml:space="preserve">
151172
<value>Beginn</value>
@@ -154,9 +175,15 @@
154175
<value>Ende-Zähler</value>
155176
</data>
156177
<data name="StopTag" xml:space="preserve">
157-
<value>Token</value>
178+
<value>RFID-Karte</value>
179+
</data>
180+
<data name="StopTagID" xml:space="preserve">
181+
<value>RFID-Nummer</value>
158182
</data>
159183
<data name="StopTime" xml:space="preserve">
160184
<value>Ende</value>
161185
</data>
186+
<data name="TransactionID" xml:space="preserve">
187+
<value>Transaktions-ID</value>
188+
</data>
162189
</root>

0 commit comments

Comments
 (0)