Skip to content

Commit ae78d6e

Browse files
Finja Averhausswltr
andcommitted
Fix assignment of failed orders in sequences
Properly assign next unfinished transport orders in order sequences and correctly skip all orders in a final state if the sequence is not marked as failure fatal. Reported-by: Toomy576 at GitHub Co-authored-by: Stefan Walter <stefan.walter@iml.fraunhofer.de> Merged-by: Stefan Walter <stefan.walter@iml.fraunhofer.de>
1 parent 0473224 commit ae78d6e

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

opentcs-documentation/src/docs/release-notes/changelog.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ This change log lists the most relevant changes for past releases in reverse chr
2828
* Bugs fixed:
2929
** Avoid `NullPointerException` when trying to assign a vehicle to a reserved transport orders that has been removed in the meantime.
3030
** Actually add given properties to newly-created plant models' visual layouts.
31+
** Ensure failed transport orders in order sequences are skipped correctly.
3132
* Changes affecting developers:
3233
** Update JUnit to 6.0.2.
3334
** Update Mockito to 5.21.0.

opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,11 @@ public void abortOrder(TransportOrder order, boolean immediateAbort) {
314314
/**
315315
* Skips all transport orders in the given order sequence until the first transport order that
316316
* should be dispatched/executed is found.
317-
* A transport order should be dispatched if it is not dispensable or
318-
* if it is the last order in the sequence.
317+
* I.e., this skips transport orders...
318+
* <ul>
319+
* <li>that are in a final state,</li>
320+
* <li>that are dispensable and not the last order in the sequence.</li>
321+
* </ul>
319322
*
320323
* @param sequenceRef The reference to the order sequence
321324
* @return The next transport order that should be dispatched/executed or Optional.empty()
@@ -341,10 +344,11 @@ public Optional<TransportOrder> nextDispatchableOrderInSequence(
341344
return Optional.empty();
342345
}
343346

344-
while (nextUnfinishedOrder.isDispensable()
345-
&& !nextUnfinishedOrder.getReference().equals(seq.getOrders().getLast())) {
346-
//If the transport order is dispensable and not the last order in the sequence,
347-
//it should be skipped.
347+
while (nextUnfinishedOrder.getState().isFinalState()
348+
|| isDispensableAndNotLastInSequence(nextUnfinishedOrder, seq)) {
349+
// A transport order should be skipped if...
350+
// - it is already in a final state OR
351+
// - it is dispensable AND not the last order in the sequence.
348352
skipOrderInSequence(nextUnfinishedOrder);
349353

350354
//Look for next orders, using an up-to-date copy of the sequence.
@@ -449,10 +453,12 @@ private void skipOrderInSequence(TransportOrder order)
449453
);
450454

451455
if (order.getProcessingVehicle() == null) {
452-
transportOrderService.updateTransportOrderState(
453-
order.getReference(),
454-
TransportOrder.State.FAILED
455-
);
456+
if (!order.getState().isFinalState()) {
457+
transportOrderService.updateTransportOrderState(
458+
order.getReference(),
459+
TransportOrder.State.FAILED
460+
);
461+
}
456462
updateSequenceOfFailedTransportOrder(order.getReference());
457463
markNewDispatchableOrders();
458464
}
@@ -574,4 +580,9 @@ private Optional<OrderSequence> extractWrappingSequence(TransportOrder order) {
574580
? Optional.empty()
575581
: transportOrderService.fetch(OrderSequence.class, order.getWrappingSequence());
576582
}
583+
584+
private boolean isDispensableAndNotLastInSequence(TransportOrder order, OrderSequence sequence) {
585+
return order.isDispensable()
586+
&& !order.getReference().equals(sequence.getOrders().getLast());
587+
}
577588
}

opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/AssignFreeOrdersPhase.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ public void run() {
159159
}
160160

161161
private void markFirstDispatchableOrderInUnassignedSequences() {
162+
// In case any orders at the beginning of sequences were withdrawn, update the sequences.
163+
transportOrderUtil.markNewDispatchableOrders();
164+
162165
objectService.fetch(
163166
TransportOrder.class,
164167
order -> order.hasState(TransportOrder.State.DISPATCHABLE)

0 commit comments

Comments
 (0)