1
1
import { useCallback } from 'react'
2
2
import {
3
- getIncomers ,
4
3
useReactFlow ,
5
4
useStoreApi ,
6
5
} from 'reactflow'
@@ -9,8 +8,8 @@ import { v4 as uuidV4 } from 'uuid'
9
8
import { usePathname } from 'next/navigation'
10
9
import { useWorkflowStore } from '../store'
11
10
import { useNodesSyncDraft } from '../hooks'
12
- import type { Node } from '../types'
13
11
import {
12
+ BlockEnum ,
14
13
NodeRunningStatus ,
15
14
WorkflowRunningStatus ,
16
15
} from '../types'
@@ -28,6 +27,7 @@ import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player
28
27
import {
29
28
getFilesInLogs ,
30
29
} from '@/app/components/base/file-uploader/utils'
30
+ import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
31
31
32
32
export const useWorkflowRun = ( ) => {
33
33
const store = useStoreApi ( )
@@ -174,6 +174,8 @@ export const useWorkflowRun = () => {
174
174
setIterParallelLogMap,
175
175
} = workflowStore . getState ( )
176
176
const {
177
+ getNodes,
178
+ setNodes,
177
179
edges,
178
180
setEdges,
179
181
} = store . getState ( )
@@ -186,12 +188,20 @@ export const useWorkflowRun = () => {
186
188
status : WorkflowRunningStatus . Running ,
187
189
}
188
190
} ) )
189
-
191
+ const nodes = getNodes ( )
192
+ const newNodes = produce ( nodes , ( draft ) => {
193
+ draft . forEach ( ( node ) => {
194
+ node . data . _waitingRun = true
195
+ } )
196
+ } )
197
+ setNodes ( newNodes )
190
198
const newEdges = produce ( edges , ( draft ) => {
191
199
draft . forEach ( ( edge ) => {
192
200
edge . data = {
193
201
...edge . data ,
194
- _run : false ,
202
+ _sourceRunningStatus : undefined ,
203
+ _targetRunningStatus : undefined ,
204
+ _waitingRun : true ,
195
205
}
196
206
} )
197
207
} )
@@ -311,13 +321,27 @@ export const useWorkflowRun = () => {
311
321
}
312
322
const newNodes = produce ( nodes , ( draft ) => {
313
323
draft [ currentNodeIndex ] . data . _runningStatus = NodeRunningStatus . Running
324
+ draft [ currentNodeIndex ] . data . _waitingRun = false
314
325
} )
315
326
setNodes ( newNodes )
316
- const incomeNodesId = getIncomers ( { id : data . node_id } as Node , newNodes , edges ) . filter ( node => node . data . _runningStatus === NodeRunningStatus . Succeeded ) . map ( node => node . id )
317
327
const newEdges = produce ( edges , ( draft ) => {
318
- draft . forEach ( ( edge ) => {
319
- if ( edge . target === data . node_id && incomeNodesId . includes ( edge . source ) )
320
- edge . data = { ...edge . data , _run : true } as any
328
+ const incomeEdges = draft . filter ( ( edge ) => {
329
+ return edge . target === data . node_id
330
+ } )
331
+
332
+ incomeEdges . forEach ( ( edge ) => {
333
+ const incomeNode = nodes . find ( node => node . id === edge . source ) !
334
+ if (
335
+ ( ! incomeNode . data . _runningBranchId && edge . sourceHandle === 'source' )
336
+ || ( incomeNode . data . _runningBranchId && edge . sourceHandle === incomeNode . data . _runningBranchId )
337
+ ) {
338
+ edge . data = {
339
+ ...edge . data ,
340
+ _sourceRunningStatus : incomeNode . data . _runningStatus ,
341
+ _targetRunningStatus : NodeRunningStatus . Running ,
342
+ _waitingRun : false ,
343
+ }
344
+ }
321
345
} )
322
346
} )
323
347
setEdges ( newEdges )
@@ -336,6 +360,8 @@ export const useWorkflowRun = () => {
336
360
const {
337
361
getNodes,
338
362
setNodes,
363
+ edges,
364
+ setEdges,
339
365
} = store . getState ( )
340
366
const nodes = getNodes ( )
341
367
const nodeParentId = nodes . find ( node => node . id === data . node_id ) ! . parentId
@@ -423,8 +449,31 @@ export const useWorkflowRun = () => {
423
449
const newNodes = produce ( nodes , ( draft ) => {
424
450
const currentNode = draft . find ( node => node . id === data . node_id ) !
425
451
currentNode . data . _runningStatus = data . status as any
452
+ if ( data . status === NodeRunningStatus . Exception ) {
453
+ if ( data . execution_metadata . error_strategy === ErrorHandleTypeEnum . failBranch )
454
+ currentNode . data . _runningBranchId = ErrorHandleTypeEnum . failBranch
455
+ }
456
+ else {
457
+ if ( data . node_type === BlockEnum . IfElse )
458
+ currentNode . data . _runningBranchId = data ?. outputs ?. selected_case_id
459
+
460
+ if ( data . node_type === BlockEnum . QuestionClassifier )
461
+ currentNode . data . _runningBranchId = data ?. outputs ?. class_id
462
+ }
426
463
} )
427
464
setNodes ( newNodes )
465
+ const newEdges = produce ( edges , ( draft ) => {
466
+ const incomeEdges = draft . filter ( ( edge ) => {
467
+ return edge . target === data . node_id
468
+ } )
469
+ incomeEdges . forEach ( ( edge ) => {
470
+ edge . data = {
471
+ ...edge . data ,
472
+ _targetRunningStatus : data . status as any ,
473
+ }
474
+ } )
475
+ } )
476
+ setEdges ( newEdges )
428
477
prevNodeId = data . node_id
429
478
}
430
479
@@ -474,13 +523,20 @@ export const useWorkflowRun = () => {
474
523
const newNodes = produce ( nodes , ( draft ) => {
475
524
draft [ currentNodeIndex ] . data . _runningStatus = NodeRunningStatus . Running
476
525
draft [ currentNodeIndex ] . data . _iterationLength = data . metadata . iterator_length
526
+ draft [ currentNodeIndex ] . data . _waitingRun = false
477
527
} )
478
528
setNodes ( newNodes )
479
529
const newEdges = produce ( edges , ( draft ) => {
480
- const edge = draft . find ( edge => edge . target === data . node_id && edge . source === prevNodeId )
530
+ const incomeEdges = draft . filter ( edge => edge . target === data . node_id )
481
531
482
- if ( edge )
483
- edge . data = { ...edge . data , _run : true } as any
532
+ incomeEdges . forEach ( ( edge ) => {
533
+ edge . data = {
534
+ ...edge . data ,
535
+ _sourceRunningStatus : nodes . find ( node => node . id === edge . source ) ! . data . _runningStatus ,
536
+ _targetRunningStatus : NodeRunningStatus . Running ,
537
+ _waitingRun : false ,
538
+ }
539
+ } )
484
540
} )
485
541
setEdges ( newEdges )
486
542
0 commit comments