fix(plugin-workflow): fix duplicated downstream executions after condition (#2517)

This commit is contained in:
Junyi 2023-08-23 19:38:56 +07:00 committed by GitHub
parent 8b054e6aac
commit 9154e531c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 10 deletions

View File

@ -35,7 +35,6 @@ describe('workflow > instructions > condition', () => {
describe('single calculation', () => {
it('calculation to true downstream', async () => {
const n1 = await workflow.createNode({
title: 'condition',
type: 'condition',
config: {
engine: 'math.js',
@ -44,19 +43,24 @@ describe('workflow > instructions > condition', () => {
});
const n2 = await workflow.createNode({
title: 'true to echo',
type: 'echo',
branchIndex: BRANCH_INDEX.ON_TRUE,
upstreamId: n1.id,
});
const n3 = await workflow.createNode({
title: 'false to echo',
type: 'echo',
branchIndex: BRANCH_INDEX.ON_FALSE,
upstreamId: n1.id,
});
const n4 = await workflow.createNode({
type: 'echo',
upstreamId: n1.id,
});
await n1.setDownstream(n4);
const post = await PostRepo.create({ values: { title: 't1' } });
await sleep(500);
@ -64,9 +68,12 @@ describe('workflow > instructions > condition', () => {
const [execution] = await workflow.getExecutions();
expect(execution.status).toEqual(EXECUTION_STATUS.RESOLVED);
const jobs = await execution.getJobs();
expect(jobs.length).toEqual(2);
const jobs = await execution.getJobs({ order: [['id', 'ASC']] });
expect(jobs.length).toEqual(3);
expect(jobs[1].result).toEqual(true);
expect(jobs[1].nodeId).toEqual(n2.id);
expect(jobs[2].result).toEqual(true);
expect(jobs[2].nodeId).toEqual(n4.id);
});
it('calculation to false downstream', async () => {

View File

@ -3,7 +3,7 @@ import { Registry } from '@nocobase/utils';
import { Instruction } from '.';
import { Processor } from '..';
import { JOB_STATUS } from '../constants';
import type { FlowNodeModel } from '../types';
import type { FlowNodeModel, JobModel } from '../types';
type Comparer = (a: any, b: any) => boolean;
@ -157,16 +157,20 @@ export default {
const savedJob = await processor.saveJob(job);
return processor.run(branchNode, savedJob);
await processor.run(branchNode, savedJob);
return null;
},
async resume(node: FlowNodeModel, branchJob, processor: Processor) {
async resume(node: FlowNodeModel, branchJob: JobModel, processor: Processor) {
const job = processor.findBranchParentJob(branchJob, node) as JobModel;
if (branchJob.status === JOB_STATUS.RESOLVED) {
// return to continue node.downstream
return branchJob;
return job;
}
// pass control to upper scope by ending current scope
return processor.end(node, branchJob);
return processor.exit(branchJob.status);
},
} as Instruction;