Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public interface TransactionRepository {

List<Integer> getActiveTransactionIds(String chargeBoxId);

TransactionDetails getDetails(int transactionPk);
TransactionDetails getDetails(int transactionPk, boolean energyValuesOnly);

Result<TransactionRecord> getStoppedTransactions(@NotNull DateTime from, @NotNull DateTime to);
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public List<Integer> getActiveTransactionIds(String chargeBoxId) {
}

@Override
public TransactionDetails getDetails(int transactionPk) {
public TransactionDetails getDetails(int transactionPk, boolean energyValuesOnly) {

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

// https://github.com/steve-community/steve/issues/1514
Condition unitCondition = CONNECTOR_METER_VALUE.UNIT.isNull()
.or(CONNECTOR_METER_VALUE.UNIT.in("", UnitOfMeasure.WH.value(), UnitOfMeasure.K_WH.value()));

// Case 1: Ideal and most accurate case. Station sends meter values with transaction id set.
//
// Case 2: Fall back to filtering according to time windows. Timestamp fallback only considers rows
Expand All @@ -227,10 +223,20 @@ public TransactionDetails getDetails(int transactionPk) {
)
);

List<Condition> conditions = new ArrayList<>();
conditions.add(selectionCriteria);

if (energyValuesOnly) {
// https://github.com/steve-community/steve/issues/1514
Condition unitCondition = CONNECTOR_METER_VALUE.UNIT.isNull()
.or(CONNECTOR_METER_VALUE.UNIT.in("", UnitOfMeasure.WH.value(), UnitOfMeasure.K_WH.value()));

conditions.add(unitCondition);
}

List<TransactionDetails.MeterValues> values =
ctx.selectFrom(CONNECTOR_METER_VALUE)
.where(unitCondition)
.and(selectionCriteria)
.where(conditions)
.orderBy(CONNECTOR_METER_VALUE.VALUE_TIMESTAMP)
.fetch()
.map(r -> TransactionDetails.MeterValues.builder()
Expand All @@ -244,7 +250,12 @@ public TransactionDetails getDetails(int transactionPk) {
.phase(r.getPhase())
.build())
.stream()
.filter(TransactionStopServiceHelper::isEnergyValue)
.filter(v -> {
if (energyValuesOnly) {
return TransactionStopServiceHelper.isEnergyValue(v);
}
return true;
})
.toList();

return new TransactionDetails(transaction, values, nextTx);
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/de/rwth/idsg/steve/service/TransactionService.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,18 +71,18 @@ public void writeTransactionsCSV(TransactionQueryForm form, Writer writer) {
transactionRepository.writeTransactionsCSV(form, writer);
}

public void writeTransactionMeterValuesCSV(int transactionPk, Writer writer) {
public void writeTransactionMeterValuesCSV(int transactionPk, boolean energyValuesOnly, Writer writer) {
try (var seqWriter = csvMapper.writer(schema).writeValues(writer)) {
seqWriter.writeAll(getDetails(transactionPk).getValues());
seqWriter.writeAll(getDetails(transactionPk, energyValuesOnly).getValues());
}
}

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

public TransactionDetails getDetails(int transactionPk) {
return transactionRepository.getDetails(transactionPk);
public TransactionDetails getDetails(int transactionPk, boolean energyValuesOnly) {
return transactionRepository.getDetails(transactionPk, energyValuesOnly);
}

public Transaction getTransaction(int transactionPk) {
Expand Down Expand Up @@ -125,7 +125,7 @@ public void stop(List<Integer> transactionPkList) {
}

public void stop(Integer transactionPk) {
TransactionDetails thisTxDetails = transactionRepository.getDetails(transactionPk);
TransactionDetails thisTxDetails = transactionRepository.getDetails(transactionPk, true);
Transaction thisTx = thisTxDetails.getTransaction();

// early exit, if transaction is already stopped
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import jakarta.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -94,8 +95,9 @@
The details are the intermediate values of the transaction.
""")
@GetMapping(value = "/{transactionPk}")
public TransactionDetails getTransactionDetails(@PathVariable("transactionPk") int transactionPk) {
return transactionService.getDetails(transactionPk);
public TransactionDetails getTransactionDetails(@PathVariable("transactionPk") int transactionPk,
@RequestParam(value = "energyValuesOnly", defaultValue = "true") boolean energyValuesOnly) {

Check failure on line 99 in src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java

View workflow job for this annotation

GitHub Actions / checkstyle

[checkstyle] src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java#L99 <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck>

Line is longer than 120 characters (found 144).
Raw output
/github/workspace/./src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java:99:0: error: Line is longer than 120 characters (found 144). (com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck)
return transactionService.getDetails(transactionPk, energyValuesOnly);
}

@Operation(description = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
Expand Down Expand Up @@ -90,20 +91,24 @@
}

@RequestMapping(value = TRANSACTIONS_DETAILS_PATH)
public String getTransactionDetails(@PathVariable("transactionPk") int transactionPk, Model model) {
model.addAttribute("details", transactionService.getDetails(transactionPk));
public String getTransactionDetails(@PathVariable("transactionPk") int transactionPk,
@RequestParam(value = "energyValuesOnly", defaultValue = "true") boolean energyValuesOnly,

Check failure on line 95 in src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java

View workflow job for this annotation

GitHub Actions / checkstyle

[checkstyle] src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java#L95 <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck>

Line is longer than 120 characters (found 130).
Raw output
/github/workspace/./src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java:95:0: error: Line is longer than 120 characters (found 130). (com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck)
Model model) {
model.addAttribute("details", transactionService.getDetails(transactionPk, energyValuesOnly));
model.addAttribute("energyValuesOnly", energyValuesOnly);
return "data-man/transactionDetails";
}

@RequestMapping(value = TRANSACTIONS_DETAILS_METER_VALUES_CSV_PATH)
public void getTransactionDetailsMeterValuesCsv(@PathVariable("transactionPk") int transactionPk,
@RequestParam(value = "energyValuesOnly", defaultValue = "true") boolean energyValuesOnly,

Check failure on line 104 in src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java

View workflow job for this annotation

GitHub Actions / checkstyle

[checkstyle] src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java#L104 <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck>

Line is longer than 120 characters (found 142).
Raw output
/github/workspace/./src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java:104:0: error: Line is longer than 120 characters (found 142). (com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck)
HttpServletResponse response) throws IOException {
String fileName = "transaction_%s_meter_values.csv".formatted(transactionPk);
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=\"%s\"".formatted(fileName);
response.setContentType("text/csv");
response.setHeader(headerKey, headerValue);
transactionService.writeTransactionMeterValuesCSV(transactionPk, response.getWriter());
transactionService.writeTransactionMeterValuesCSV(transactionPk, energyValuesOnly, response.getWriter());
}

@RequestMapping(value = TRANSACTIONS_QUERY_PATH)
Expand Down
16 changes: 13 additions & 3 deletions src/main/webapp/WEB-INF/views/data-man/transactionDetails.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,19 @@
</center>
<br>
<section><span>Intermediate Meter Values</span></section>
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}/meterValues.csv" method="get">
<input type="submit" value="Download CSV">
</form>
<div style="text-align: center;">
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}" method="get" style="display: inline-block;">
<select name="energyValuesOnly" style="width: 180px;">
<option value="true" <c:if test="${energyValuesOnly}">selected</c:if>>Energy values only</option>
<option value="false" <c:if test="${not energyValuesOnly}">selected</c:if>>All meter values</option>
</select>
<input type="submit" value="Apply">
</form>
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}/meterValues.csv" method="get" style="display: inline-block;">
<input type="hidden" name="energyValuesOnly" value="${energyValuesOnly}">
<input type="submit" value="Download CSV">
</form>
</div>
<br>
<table class="res">
<thead>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public void getDetails() {
.fetchOne()
.getTransactionPk();

var details = assertNoDatabaseException(() -> repository.getDetails(txId));
var details = assertNoDatabaseException(() -> repository.getDetails(txId, true));
Assertions.assertNotNull(details);
Assertions.assertEquals(txId, details.getTransaction().getId());
}
Expand Down Expand Up @@ -121,7 +121,7 @@ public void getDetailsForZombieTransactionDoesNotIncludeNextTransactionStartValu
.set(CONNECTOR_METER_VALUE.UNIT, "Wh")
.execute();

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

Assertions.assertEquals(1, details.getValues().size());
Assertions.assertEquals("150", details.getValues().getFirst().getValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public List<ConnectorStatus> getChargePointConnectorStatus() {

public TransactionDetails getDetails(int transactionPk) {
TransactionRepositoryImpl impl = new TransactionRepositoryImpl(dslContext);
return impl.getDetails(transactionPk);
return impl.getDetails(transactionPk, true);
}

public OcppTagActivityRecord getOcppTagRecord(String idTag) {
Expand Down