Skip to content

Commit 5054ccd

Browse files
authored
fix: start node check (#5794)
* fix: start node check * remove log * fix: variables refresh * fix: workflow start check * fix: variables refresh * perf: auto save * perf: add log
1 parent 44e9299 commit 5054ccd

File tree

9 files changed

+157
-177
lines changed

9 files changed

+157
-177
lines changed

packages/global/common/string/time.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const getNextTimeByCronStringAndTimezone = ({
100100

101101
return new Date(date);
102102
} catch (error) {
103-
console.log('getNextTimeByCronStringAndTimezone error', error);
103+
console.log(`getNextTimeByCronStringAndTimezone error: ${cronString}`, error);
104104
return new Date();
105105
}
106106
};

packages/global/core/workflow/runtime/type.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ export type RuntimeNodeItemType = {
108108
flowNodeType: StoreNodeItemType['flowNodeType'];
109109
showStatus?: StoreNodeItemType['showStatus'];
110110
isEntry?: boolean;
111+
isStart?: boolean;
111112
version?: string;
112113

113114
inputs: FlowNodeInputItemType[];

packages/global/core/workflow/runtime/utils.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,11 @@ export const checkNodeRunStatus = ({
294294
runtimeEdges: RuntimeEdgeItemType[];
295295
}) => {
296296
const filterRuntimeEdges = filterWorkflowEdges(runtimeEdges);
297-
298297
const isStartNode = (nodeType: string) => {
299298
const map: Record<any, boolean> = {
300299
[FlowNodeTypeEnum.workflowStart]: true,
301-
[FlowNodeTypeEnum.pluginInput]: true
300+
[FlowNodeTypeEnum.pluginInput]: true,
301+
[FlowNodeTypeEnum.loopStart]: true
302302
};
303303
return !!map[nodeType];
304304
};
@@ -328,10 +328,12 @@ export const checkNodeRunStatus = ({
328328
// Start node
329329
const sourceNode = nodesMap.get(edge.source);
330330
if (!sourceNode) continue;
331-
if (isStartNode(sourceNode.flowNodeType)) {
331+
332+
if (isStartNode(sourceNode.flowNodeType) || sourceNode.isStart) {
332333
commonEdges.push(sourceEdge);
333334
continue;
334335
}
336+
335337
// Circle detected
336338
if (edge.source === targetNode.nodeId) {
337339
recursiveEdgeGroupsMap.set(edge.target, [
@@ -350,6 +352,7 @@ export const checkNodeRunStatus = ({
350352

351353
// 查找目标节点的 source edges 并加入栈中
352354
const nextEdges = filterRuntimeEdges.filter((item) => item.target === edge.source);
355+
353356
for (const nextEdge of nextEdges) {
354357
stack.push({
355358
edge: nextEdge,
@@ -364,7 +367,7 @@ export const checkNodeRunStatus = ({
364367

365368
// Classify edges
366369
const { commonEdges, recursiveEdgeGroups } = splitNodeEdges(node);
367-
370+
console.log(JSON.stringify({ commonEdges, recursiveEdgeGroups }, null, 2));
368371
// Entry
369372
if (commonEdges.length === 0 && recursiveEdgeGroups.length === 0) {
370373
return 'run';

packages/service/core/workflow/dispatch/ai/agent/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,12 @@ export const initToolNodes = (
6262
nodes.forEach((node) => {
6363
if (entryNodeIds.includes(node.nodeId)) {
6464
node.isEntry = true;
65+
node.isStart = true;
6566
if (startParams) {
6667
node.inputs = updateToolInputValue({ params: startParams, inputs: node.inputs });
6768
}
69+
} else {
70+
node.isStart = false;
6871
}
6972
});
7073
};

projects/app/src/components/core/app/ScheduledTriggerConfig.tsx

Lines changed: 81 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
Textarea,
99
HStack
1010
} from '@chakra-ui/react';
11-
import React, { useCallback, useEffect, useMemo } from 'react';
11+
import React, { useCallback, useEffect } from 'react';
1212
import MyIcon from '@fastgpt/web/components/common/Icon';
1313
import { useTranslation } from 'next-i18next';
1414
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
@@ -61,105 +61,91 @@ const ScheduledTriggerConfig = ({
6161
}
6262
}, []);
6363

64-
const Render = useMemo(() => {
65-
return (
66-
<>
67-
<Flex alignItems={'center'}>
68-
<MyIcon name={'core/app/schedulePlan'} w={'20px'} />
69-
<HStack ml={2} flex={1} spacing={1}>
70-
<FormLabel color={'myGray.600'}>{t('common:core.app.Interval timer run')}</FormLabel>
71-
<QuestionTip label={t('common:core.app.Interval timer tip')} />
72-
</HStack>
73-
<MyTooltip label={t('common:core.app.Config schedule plan')}>
74-
<Button
75-
variant={'transparentBase'}
76-
iconSpacing={1}
77-
size={'sm'}
78-
mr={'-5px'}
79-
color={'myGray.600'}
80-
onClick={onOpen}
81-
>
82-
{cronString2Label(value?.cronString ?? '', t)}
83-
</Button>
84-
</MyTooltip>
85-
</Flex>
64+
return (
65+
<>
66+
<Flex alignItems={'center'}>
67+
<MyIcon name={'core/app/schedulePlan'} w={'20px'} />
68+
<HStack ml={2} flex={1} spacing={1}>
69+
<FormLabel color={'myGray.600'}>{t('common:core.app.Interval timer run')}</FormLabel>
70+
<QuestionTip label={t('common:core.app.Interval timer tip')} />
71+
</HStack>
72+
<MyTooltip label={t('common:core.app.Config schedule plan')}>
73+
<Button
74+
variant={'transparentBase'}
75+
iconSpacing={1}
76+
size={'sm'}
77+
mr={'-5px'}
78+
color={'myGray.600'}
79+
onClick={onOpen}
80+
>
81+
{cronString2Label(value?.cronString ?? '', t)}
82+
</Button>
83+
</MyTooltip>
84+
</Flex>
8685

87-
<MyModal
88-
isOpen={isOpen}
89-
onClose={onClose}
90-
iconSrc={'core/app/schedulePlan'}
91-
title={t('common:core.app.Interval timer config')}
92-
overflow={'unset'}
93-
>
94-
<ModalBody>
95-
<Flex justifyContent={'space-between'} alignItems={'center'}>
96-
<FormLabel flex={'0 0 80px'}>{t('common:core.app.schedule.Open schedule')}</FormLabel>
97-
<Switch
98-
isChecked={isOpenSchedule}
99-
onChange={(e) => {
100-
if (e.target.checked) {
101-
onUpdate({ cronString: defaultCronString });
102-
} else {
103-
onUpdate({ cronString: '' });
104-
}
105-
}}
106-
/>
107-
</Flex>
108-
{isOpenSchedule && (
109-
<>
110-
<Flex alignItems={'center'} mt={5}>
111-
<FormLabel flex={'0 0 80px'}>{t('app:execute_time')}</FormLabel>
112-
<Box flex={'1 0 0'}>
113-
<ScheduleTimeSelect
114-
cronString={value?.cronString}
115-
onChange={(e) => {
116-
onUpdate({ cronString: e });
117-
}}
118-
/>
119-
</Box>
120-
</Flex>
121-
<Flex alignItems={'center'} mt={5}>
122-
<FormLabel flex={'0 0 80px'}>{t('app:time_zone')}</FormLabel>
123-
<Box flex={'1 0 0'}>
124-
<TimezoneSelect
125-
value={timezone}
126-
onChange={(e) => {
127-
onUpdate({ timezone: e });
128-
}}
129-
/>
130-
</Box>
131-
</Flex>
132-
<Box mt={5}>
133-
<FormLabel mb={1}>{t('common:core.app.schedule.Default prompt')}</FormLabel>
134-
<Textarea
135-
value={defaultPrompt}
136-
rows={8}
137-
bg={'myGray.50'}
138-
placeholder={t('common:core.app.schedule.Default prompt placeholder')}
86+
<MyModal
87+
isOpen={isOpen}
88+
onClose={onClose}
89+
iconSrc={'core/app/schedulePlan'}
90+
title={t('common:core.app.Interval timer config')}
91+
overflow={'unset'}
92+
>
93+
<ModalBody>
94+
<Flex justifyContent={'space-between'} alignItems={'center'}>
95+
<FormLabel flex={'0 0 80px'}>{t('common:core.app.schedule.Open schedule')}</FormLabel>
96+
<Switch
97+
isChecked={isOpenSchedule}
98+
onChange={(e) => {
99+
if (e.target.checked) {
100+
onUpdate({ cronString: defaultCronString });
101+
} else {
102+
onUpdate({ cronString: '' });
103+
}
104+
}}
105+
/>
106+
</Flex>
107+
{isOpenSchedule && (
108+
<>
109+
<Flex alignItems={'center'} mt={5}>
110+
<FormLabel flex={'0 0 80px'}>{t('app:execute_time')}</FormLabel>
111+
<Box flex={'1 0 0'}>
112+
<ScheduleTimeSelect
113+
cronString={value?.cronString}
139114
onChange={(e) => {
140-
onUpdate({ defaultPrompt: e.target.value });
115+
onUpdate({ cronString: e });
141116
}}
142117
/>
143118
</Box>
144-
</>
145-
)}
146-
</ModalBody>
147-
</MyModal>
148-
</>
149-
);
150-
}, [
151-
defaultPrompt,
152-
isOpen,
153-
isOpenSchedule,
154-
onClose,
155-
onOpen,
156-
onUpdate,
157-
t,
158-
timezone,
159-
value?.cronString
160-
]);
161-
162-
return Render;
119+
</Flex>
120+
<Flex alignItems={'center'} mt={5}>
121+
<FormLabel flex={'0 0 80px'}>{t('app:time_zone')}</FormLabel>
122+
<Box flex={'1 0 0'}>
123+
<TimezoneSelect
124+
value={timezone}
125+
onChange={(e) => {
126+
onUpdate({ timezone: e });
127+
}}
128+
/>
129+
</Box>
130+
</Flex>
131+
<Box mt={5}>
132+
<FormLabel mb={1}>{t('common:core.app.schedule.Default prompt')}</FormLabel>
133+
<Textarea
134+
value={defaultPrompt}
135+
rows={8}
136+
bg={'myGray.50'}
137+
placeholder={t('common:core.app.schedule.Default prompt placeholder')}
138+
onChange={(e) => {
139+
onUpdate({ defaultPrompt: e.target.value });
140+
}}
141+
/>
142+
</Box>
143+
</>
144+
)}
145+
</ModalBody>
146+
</MyModal>
147+
</>
148+
);
163149
};
164150

165151
export default React.memo(ScheduledTriggerConfig);

0 commit comments

Comments
 (0)