
# Kelionė laiku darbo eigoje

Queuety gali grąžinti darbo eigą į ankstesnį žingsnį ir tęsti vykdymą nuo tos vietos. Tai naudinga, jei žingsnis pateikė netinkamą rezultatą, norite bandyti dar kartą su kita konfigūracija arba reikia atkurti darbo eigą po duomenų sugadinimo nepaleidžiant visos darbo eigos iš naujo.

Grąžinimas į ankstesnį žingsnį priklauso nuo [Darbo eigos įvykių žurnalo](https://queuety.inline0.dev/lt/docs/workflows/event-log). Įvykių žurnale turi būti `state_after` duomenų apie tikslinį žingsnį.

## Darbo eigos grąžinimas į ankstesnį žingsnį

### PHP API

Iškvieskite `Queuety::rewind_workflow()`, nurodydami darbo eigos ID ir žingsnio, į kurį norite grįžti, indeksą:

```php
use Queuety\Queuety;

// Rewind workflow 42 to step 1.
// The state is restored to the snapshot taken after step 1 completed,
// and step 2 is enqueued for re-execution.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
```

Parametras `to_step` yra nulinį indeksą turintis žingsnio, kurio užbaigtą būseną reikia atkurti, indeksas. Vykdymas tęsiamas nuo _kito_ žingsnio (to_step + 1).

### CLI

```bash
wp queuety workflow rewind <id> <step>
```

| Parinktis | Aprašymas |
|---|---|
| `<id>` | Darbo eigos ID (privalomas) |
| `<step>` | Žingsnio, į kurį grąžinama, indeksas, skaičiuojamas nuo 0 (privalomas) |

```bash
wp queuety workflow rewind 42 1
```

## Kaip tai veikia

Kai darbo eigą grąžinate į N žingsnį:

1. Įvykių žurnale ieškoma `state_after` reikšmės, įrašytos užbaigus N žingsnį
2. Jei momentinės kopijos nėra, išmetama `RuntimeException`
3. Užrakinama darbo eigos eilutė
4. Darbo eigos būsena pakeičiama momentine kopija, išsaugant visus rezervuotus raktus (`_steps`, `_queue`, `_priority` ir kt.) iš dabartinės darbo eigos eilutės
5. `current_step` nustatomas į N + 1, o `status` – į `running`
6. Išvalomi visi laukai `error_message` ir `failed_at`
7. Apdoroti įtraukiamas žingsnis, kurio indeksas N + 1
8. Įrašomas žurnalo įvykis `workflow_rewound`

Tuomet darbinis procesas paima į apdorojimo eilę įtrauktą žingsnį ir darbo eiga tęsiama įprastai nuo tos vietos.

## Reikalavimai

Norint grąžinti darbo eigą į ankstesnį žingsnį, įvykių žurnale turi būti `state_after` duomenų. Įvykių žurnalas juos automatiškai įrašo kiekvienam `step_completed` įvykiui. Jei įvykių žurnalas buvo apkarpytas (naudojant `WorkflowEventLog::prune()`) ir tikslinio žingsnio būsena nebeišsaugota, grąžinti darbo eigos nepavyks.

Pasirūpinkite, kad įvykių žurnalo saugojimo laikotarpis apimtų laiką, į kurį gali prireikti grįžti.

## Naudojimo atvejai

### Ištaisykite klaidingai veikiantį žingsnio apdorojimo įrankį

Jei dėl žingsnio apdorojimo įrankio klaidos gautas neteisingas rezultatas, galite įdiegti pataisą ir grąžinti darbo eigą į ankstesnį žingsnį:

```php
// Step 2 (CallLLMHandler) produced garbled output due to a prompt bug.
// After fixing CallLLMHandler, rewind to step 1 so step 2 runs again
// with the corrected handler.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
```

### Bandykite dar kartą su kita konfigūracija

Jei žingsnis nepavyko dėl išorinių veiksnių (API apribojimo, neteisingų prisijungimo duomenų), pataisykite konfigūraciją ir grąžinkite darbo eigą į ankstesnį žingsnį, kad paleistumėte dar kartą:

```php
// Step 3 failed because the API key was expired.
// After updating the key, rewind to step 2 so step 3 retries.
Queuety::rewind_workflow( $workflow_id, to_step: 2 );
```

### Atkurkite po netinkamų duomenų

Jei ankstesnis žingsnis į būseną įrašė netinkamų duomenų, grąžinkite darbo eigą į žinomą tinkamą momentinę kopiją:

```php
// Step 0 fetched correct data, but step 1 corrupted it.
// Rewind to step 0 to restore the good state and re-run step 1.
Queuety::rewind_workflow( $workflow_id, to_step: 0 );
```

## Palyginimas su pakartotiniu bandymu

| Aspektas | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Tęsiama nuo | Nepavykusio žingsnio | Bet kurio ankstesnio žingsnio |
| Būsena | Dabartinė darbo eigos būsena | Atkurta iš įvykių žurnalo `state_after` |
| Reikalavimai | Darbo eigos būsena yra `failed` | Įvykių žurnale yra tikslinio žingsnio momentinė kopija |
| Būsena po veiksmo | `running` | `running` |
| Žurnalo įvykis | nėra | `workflow_rewound` |
