Skip to content

Commit af556df

Browse files
authored
Merge pull request #2047 from steve-community/2046-add-query-param-to-show-all-meter-values-for-a-transaction
add query param to show all meter values for a transaction
2 parents f3be3fa + 3fa7f15 commit af556df

8 files changed

Lines changed: 53 additions & 25 deletions

File tree

src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public interface TransactionRepository {
4040

4141
List<Integer> getActiveTransactionIds(String chargeBoxId);
4242

43-
TransactionDetails getDetails(int transactionPk);
43+
TransactionDetails getDetails(int transactionPk, boolean energyValuesOnly);
4444

4545
Result<TransactionRecord> getStoppedTransactions(@NotNull DateTime from, @NotNull DateTime to);
4646
}

src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public List<Integer> getActiveTransactionIds(String chargeBoxId) {
149149
}
150150

151151
@Override
152-
public TransactionDetails getDetails(int transactionPk) {
152+
public TransactionDetails getDetails(int transactionPk, boolean energyValuesOnly) {
153153

154154
// -------------------------------------------------------------------------
155155
// Step 1: Collect general data about transaction
@@ -210,10 +210,6 @@ public TransactionDetails getDetails(int transactionPk) {
210210
timestampCondition = CONNECTOR_METER_VALUE.VALUE_TIMESTAMP.between(startTimestamp, stopTimestamp);
211211
}
212212

213-
// https://github.com/steve-community/steve/issues/1514
214-
Condition unitCondition = CONNECTOR_METER_VALUE.UNIT.isNull()
215-
.or(CONNECTOR_METER_VALUE.UNIT.in("", UnitOfMeasure.WH.value(), UnitOfMeasure.K_WH.value()));
216-
217213
// Case 1: Ideal and most accurate case. Station sends meter values with transaction id set.
218214
//
219215
// Case 2: Fall back to filtering according to time windows. Timestamp fallback only considers rows
@@ -227,10 +223,20 @@ public TransactionDetails getDetails(int transactionPk) {
227223
)
228224
);
229225

226+
List<Condition> conditions = new ArrayList<>();
227+
conditions.add(selectionCriteria);
228+
229+
if (energyValuesOnly) {
230+
// https://github.com/steve-community/steve/issues/1514
231+
Condition unitCondition = CONNECTOR_METER_VALUE.UNIT.isNull()
232+
.or(CONNECTOR_METER_VALUE.UNIT.in("", UnitOfMeasure.WH.value(), UnitOfMeasure.K_WH.value()));
233+
234+
conditions.add(unitCondition);
235+
}
236+
230237
List<TransactionDetails.MeterValues> values =
231238
ctx.selectFrom(CONNECTOR_METER_VALUE)
232-
.where(unitCondition)
233-
.and(selectionCriteria)
239+
.where(conditions)
234240
.orderBy(CONNECTOR_METER_VALUE.VALUE_TIMESTAMP)
235241
.fetch()
236242
.map(r -> TransactionDetails.MeterValues.builder()
@@ -244,7 +250,12 @@ public TransactionDetails getDetails(int transactionPk) {
244250
.phase(r.getPhase())
245251
.build())
246252
.stream()
247-
.filter(TransactionStopServiceHelper::isEnergyValue)
253+
.filter(v -> {
254+
if (energyValuesOnly) {
255+
return TransactionStopServiceHelper.isEnergyValue(v);
256+
}
257+
return true;
258+
})
248259
.toList();
249260

250261
return new TransactionDetails(transaction, values, nextTx);

src/main/java/de/rwth/idsg/steve/service/TransactionService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,18 @@ public void writeTransactionsCSV(TransactionQueryForm form, Writer writer) {
7171
transactionRepository.writeTransactionsCSV(form, writer);
7272
}
7373

74-
public void writeTransactionMeterValuesCSV(int transactionPk, Writer writer) {
74+
public void writeTransactionMeterValuesCSV(int transactionPk, boolean energyValuesOnly, Writer writer) {
7575
try (var seqWriter = csvMapper.writer(schema).writeValues(writer)) {
76-
seqWriter.writeAll(getDetails(transactionPk).getValues());
76+
seqWriter.writeAll(getDetails(transactionPk, energyValuesOnly).getValues());
7777
}
7878
}
7979

8080
public List<Integer> getActiveTransactionIds(String chargeBoxId) {
8181
return transactionRepository.getActiveTransactionIds(chargeBoxId);
8282
}
8383

84-
public TransactionDetails getDetails(int transactionPk) {
85-
return transactionRepository.getDetails(transactionPk);
84+
public TransactionDetails getDetails(int transactionPk, boolean energyValuesOnly) {
85+
return transactionRepository.getDetails(transactionPk, energyValuesOnly);
8686
}
8787

8888
public Transaction getTransaction(int transactionPk) {
@@ -125,7 +125,7 @@ public void stop(List<Integer> transactionPkList) {
125125
}
126126

127127
public void stop(Integer transactionPk) {
128-
TransactionDetails thisTxDetails = transactionRepository.getDetails(transactionPk);
128+
TransactionDetails thisTxDetails = transactionRepository.getDetails(transactionPk, true);
129129
Transaction thisTx = thisTxDetails.getTransaction();
130130

131131
// early exit, if transaction is already stopped

src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.web.bind.annotation.PatchMapping;
4141
import org.springframework.web.bind.annotation.PathVariable;
4242
import org.springframework.web.bind.annotation.RequestMapping;
43+
import org.springframework.web.bind.annotation.RequestParam;
4344
import org.springframework.web.bind.annotation.RestController;
4445

4546
import jakarta.servlet.http.HttpServletResponse;
@@ -94,8 +95,9 @@ public List<Transaction> get(@Valid @ParameterObject TransactionQueryForm.Transa
9495
The details are the intermediate values of the transaction.
9596
""")
9697
@GetMapping(value = "/{transactionPk}")
97-
public TransactionDetails getTransactionDetails(@PathVariable("transactionPk") int transactionPk) {
98-
return transactionService.getDetails(transactionPk);
98+
public TransactionDetails getTransactionDetails(@PathVariable("transactionPk") int transactionPk,
99+
@RequestParam(value = "energyValuesOnly", defaultValue = "true") boolean energyValuesOnly) {
100+
return transactionService.getDetails(transactionPk, energyValuesOnly);
99101
}
100102

101103
@Operation(description = """

src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.web.bind.annotation.PostMapping;
3535
import org.springframework.web.bind.annotation.RequestMapping;
3636
import org.springframework.web.bind.annotation.RequestMethod;
37+
import org.springframework.web.bind.annotation.RequestParam;
3738

3839
import jakarta.servlet.http.HttpServletResponse;
3940
import jakarta.validation.Valid;
@@ -90,20 +91,24 @@ public String stopTransaction(@PathVariable("transactionPk") int transactionPk)
9091
}
9192

9293
@RequestMapping(value = TRANSACTIONS_DETAILS_PATH)
93-
public String getTransactionDetails(@PathVariable("transactionPk") int transactionPk, Model model) {
94-
model.addAttribute("details", transactionService.getDetails(transactionPk));
94+
public String getTransactionDetails(@PathVariable("transactionPk") int transactionPk,
95+
@RequestParam(value = "energyValuesOnly", defaultValue = "true") boolean energyValuesOnly,
96+
Model model) {
97+
model.addAttribute("details", transactionService.getDetails(transactionPk, energyValuesOnly));
98+
model.addAttribute("energyValuesOnly", energyValuesOnly);
9599
return "data-man/transactionDetails";
96100
}
97101

98102
@RequestMapping(value = TRANSACTIONS_DETAILS_METER_VALUES_CSV_PATH)
99103
public void getTransactionDetailsMeterValuesCsv(@PathVariable("transactionPk") int transactionPk,
104+
@RequestParam(value = "energyValuesOnly", defaultValue = "true") boolean energyValuesOnly,
100105
HttpServletResponse response) throws IOException {
101106
String fileName = "transaction_%s_meter_values.csv".formatted(transactionPk);
102107
String headerKey = "Content-Disposition";
103108
String headerValue = "attachment; filename=\"%s\"".formatted(fileName);
104109
response.setContentType("text/csv");
105110
response.setHeader(headerKey, headerValue);
106-
transactionService.writeTransactionMeterValuesCSV(transactionPk, response.getWriter());
111+
transactionService.writeTransactionMeterValuesCSV(transactionPk, energyValuesOnly, response.getWriter());
107112
}
108113

109114
@RequestMapping(value = TRANSACTIONS_QUERY_PATH)

src/main/webapp/WEB-INF/views/data-man/transactionDetails.jsp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,19 @@
4343
</center>
4444
<br>
4545
<section><span>Intermediate Meter Values</span></section>
46-
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}/meterValues.csv" method="get">
47-
<input type="submit" value="Download CSV">
48-
</form>
46+
<div style="text-align: center;">
47+
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}" method="get" style="display: inline-block;">
48+
<select name="energyValuesOnly" style="width: 180px;">
49+
<option value="true" <c:if test="${energyValuesOnly}">selected</c:if>>Energy values only</option>
50+
<option value="false" <c:if test="${not energyValuesOnly}">selected</c:if>>All meter values</option>
51+
</select>
52+
<input type="submit" value="Apply">
53+
</form>
54+
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}/meterValues.csv" method="get" style="display: inline-block;">
55+
<input type="hidden" name="energyValuesOnly" value="${energyValuesOnly}">
56+
<input type="submit" value="Download CSV">
57+
</form>
58+
</div>
4959
<br>
5060
<table class="res">
5161
<thead>

src/test/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImplIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void getDetails() {
8787
.fetchOne()
8888
.getTransactionPk();
8989

90-
var details = assertNoDatabaseException(() -> repository.getDetails(txId));
90+
var details = assertNoDatabaseException(() -> repository.getDetails(txId, true));
9191
Assertions.assertNotNull(details);
9292
Assertions.assertEquals(txId, details.getTransaction().getId());
9393
}
@@ -121,7 +121,7 @@ public void getDetailsForZombieTransactionDoesNotIncludeNextTransactionStartValu
121121
.set(CONNECTOR_METER_VALUE.UNIT, "Wh")
122122
.execute();
123123

124-
var details = assertNoDatabaseException(() -> repository.getDetails(firstTxId));
124+
var details = assertNoDatabaseException(() -> repository.getDetails(firstTxId, true));
125125

126126
Assertions.assertEquals(1, details.getValues().size());
127127
Assertions.assertEquals("150", details.getValues().getFirst().getValue());

src/test/java/de/rwth/idsg/steve/utils/__DatabasePreparer__.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public List<ConnectorStatus> getChargePointConnectorStatus() {
133133

134134
public TransactionDetails getDetails(int transactionPk) {
135135
TransactionRepositoryImpl impl = new TransactionRepositoryImpl(dslContext);
136-
return impl.getDetails(transactionPk);
136+
return impl.getDetails(transactionPk, true);
137137
}
138138

139139
public OcppTagActivityRecord getOcppTagRecord(String idTag) {

0 commit comments

Comments
 (0)