
# Darbo eigų priklausomybės

Naudokite laukimą pagal darbo eigos priklausomybes, kai viena aukščiausio lygmens darbo eiga turėtų tęstis tik užbaigus kitas darbo eigas. Taip koordinuojamos skirtingos darbo eigos, nesujungiant visko į vieną milžinišką darbo eigos aprašą.

Šie laukimo žingsniai ypač dera su [asinchroniniais perdavimais](https://queuety.inline0.dev/lt/docs/workflows/async-handoffs): viena darbo eiga pirmiausia paleidžia nepriklausomas antrines darbo eigas, o vėliau jų laukia.

Išsamesnių planuotojo ir vykdytojo pavyzdžių rasite čia: [Agentų orkestravimas](https://queuety.inline0.dev/lt/docs/workflows/agent-orchestration).

Queuety pateikia tris kūrimo grandinės metodus:

- `wait_for_workflow()` – vienai darbo eigai
- `wait_for_workflows()` – kelioms darbo eigoms, naudojant `all`, `any` arba `quorum` semantiką
- `wait_for_workflow_group()` – kai darbo eigos ID gaunami iš anksčiau paleistos grupės

## Laukimas, kol bus užbaigta viena darbo eiga

```php
$research_id = Queuety::workflow( 'research_run' )
    ->then( PlanResearchStep::class )
    ->for_each( 'tasks', ExecuteResearchTask::class, 'results' )
    ->dispatch( [ 'brief_id' => 42 ] );

$editorial_id = Queuety::workflow( 'editorial_run' )
    ->wait_for_workflow( $research_id, 'research' )
    ->then( DraftBriefStep::class )
    ->dispatch();
```

Užbaigus `research_run`, tęsiama `editorial_run`. Nustačius `result_key`, užbaigtos priklausomybės būsena saugoma nurodytu raktu:

```php
$state['research']; // public state from the completed research workflow
```

Nenurodžius `result_key`, priklausomos darbo eigos vieša būsena sujungiama su laukiančios darbo eigos aukščiausio lygmens būsena.

## Laukimas, kol bus užbaigtos kelios darbo eigos

```php
use Queuety\Enums\WaitMode;

Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::All,
        'dependencies'
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
```

- `WaitMode::All` tęsia darbą tik užbaigus visas išvardytas darbo eigas.
- `WaitMode::Any` tęsia darbą užbaigus pirmajai išvardytai darbo eigai.
- `WaitMode::Quorum` tęsia darbą, kai sėkmingai užbaigiamas reikiamas darbo eigų skaičius.

```php
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
```

Naudojant `result_key`, laukiant kelių darbo eigų užbaigtų priklausomybių būsenos saugomos pagal darbo eigos ID:

```php
[
    '42' => [ 'summary' => '...' ],
    '43' => [ 'summary' => '...' ],
]
```

Nenurodžius `result_key`, užbaigtų priklausomybių būsenos sujungiamos su laukiančios darbo eigos aukščiausio lygmens būsena priklausomybių tvarka.

## Priklausomybių ID gavimas iš darbo eigos būsenos

Priklausomybių sąrašą galima sudaryti vykdymo metu, nuskaitant darbo eigos ID iš viešos būsenos:

```php
Queuety::workflow( 'agent_follow_up' )
    ->wait_for_workflow( 'parent_workflow_id', 'parent' )
    ->then( FinalizeAgentRunStep::class )
    ->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
```

Kelioms priklausomybėms:

```php
Queuety::workflow( 'aggregator' )
    ->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
    ->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
```

## Laukimas, kol bus užbaigta paleistų darbo eigų grupė

Jei ankstesnis `start_workflows()` arba `start_agents()` žingsnis išsaugojo patvarų grupės raktą, galite laukti tiesiogiai šios grupės ir neperduoti darbo eigų ID per viešą būseną.

```php
Queuety::workflow( 'brief_research' )
    ->then( PlanTopicsStep::class )
    ->start_agents( 'agent_tasks', $agent_run, group_key: 'researchers' )
    ->wait_for_agent_group( 'researchers', WaitMode::Quorum, 2, 'agent_results' )
    ->then( SynthesizeBriefStep::class )
    ->dispatch();
```

## Kas vyksta laukiant

Pasiekusi vieną iš šių žingsnių, darbo eiga pereina į `waiting_for_workflows` būseną. Laukimo metu joks darbuotojas jai nepriskiriamas.

```php
$state = Queuety::workflow_status( $workflow_id );
echo $state->status->value; // 'waiting_for_workflows'
echo $state->wait_type;     // 'workflow'
print_r( $state->waiting_for ); // ['42', '43']
```

Jei priklausomybė užbaigta dar prieš pasiekiant laukimo žingsnį, darbo eiga tęsiama iš karto.

## Nesėkmės semantika

Laukimas pagal darbo eigos priklausomybes orientuotas į sėkmę:

- `wait_for_workflow()` ir `WaitMode::All` nepavyksta, jei kuri nors būtina priklausomybė nepavyksta arba atšaukiama.
- `WaitMode::Any` nepavyksta tik tada, kai visos priklausomybės pasiekia galutinę būseną ir nė viena neužbaigiama sėkmingai.
- `WaitMode::Quorum` nepavyksta, kai likusios aktyvios darbo eigos nebegali pasiekti reikiamo kvorumo.

Dėl to darbo eigų laukimas naudingas planuotojo ir vykdytojo sistemose: viena darbo eiga gali parengti kiekvieną užduotį, o kita laukti `all` rezultatų arba pirmosios sėkmingai pasibaigusios šakos.
