logologo
התחלה
מדריך
פיתוח
תוסף
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
התחלה
מדריך
פיתוח
תוסף
API
logologo
זרימת עבודה
סקירה כללית
התחלה מהירה

טריגר

סקירה כללית
אירועי טבלת נתונים
משימות מתוזמנות
אירוע לפני פעולה
אירוע אחרי פעולה
אירוע פעולה מותאם אישית
אישור
Webhook

צומת

סקירה כללית

AI

LLM

בקרת זרימה

תנאי
ענף רב-תנאי
לולאה
משתנה
ענף מקבילי
קריאה ל-Workflow
פלט זרימה
מיפוי משתני JSON
השהיה
סיום

חישוב

חישוב
חישוב תאריך
חישוב JSON

פעולת נתונים

הוספת נתונים
עדכון נתונים
שאילתת נתונים
מחיקת נתונים
פעולת SQL

טיפול ידני

טיפול ידני
אישור
העתק

סוג הרחבה

בקשת HTTP
סקריפט JavaScript
התראה
שליחת דוא'ל
תגובה
הודעת תגובה
משתנה
יומן ביצוע
ניהול גרסאות
אפשרויות מתקדמות

פיתוח הרחבות

סקירה כללית
הרחבת סוגי טריגרים
הרחבת סוגי צמתים
API Reference
Previous Pageהרחבת סוגי צמתים
TIP

מסמך זה תורגם על ידי בינה מלאכותית. לכל אי דיוק, אנא עיין בגרסה האנגלית

#הפניה ל-API

#צד השרת

ממשקי ה-API הזמינים במבנה חבילת צד השרת מוצגים בקוד הבא:

import PluginWorkflowServer, {
  Trigger,
  Instruction,
  EXECUTION_STATUS,
  JOB_STATUS,
} from '@nocobase/plugin-workflow';

#PluginWorkflowServer

מחלקה של תוסף תהליך עבודה.

בדרך כלל, בזמן ריצת היישום, תוכלו לקרוא ל-app.pm.get<PluginWorkflowServer>(PluginWorkflowServer) בכל מקום שבו ניתן לגשת למופע היישום app, כדי לקבל את מופע תוסף תהליך העבודה (להלן יכונה plugin).

#registerTrigger()

מרחיב ורושם סוג טריגר חדש.

חתימה

registerTrigger(type: string, trigger: typeof Trigger | Trigger })

פרמטרים

פרמטרסוגתיאור
typestringמזהה סוג הטריגר
triggertypeof Trigger | Triggerסוג הטריגר או מופע שלו

דוגמה

import PluginWorkflowServer, { Trigger } from '@nocobase/plugin-workflow';

function handler(this: MyTrigger, workflow: WorkflowModel, message: string) {
  // מפעיל את תהליך העבודה
  this.workflow.trigger(workflow, { data: message.data });
}

class MyTrigger extends Trigger {
  messageHandlers: Map<number, WorkflowModel> = new Map();
  on(workflow: WorkflowModel) {
    const messageHandler = handler.bind(this, workflow);
    // מאזין לאירוע כלשהו כדי להפעיל את תהליך העבודה
    process.on(
      'message',
      this.messageHandlers.set(workflow.id, messageHandler),
    );
  }

  off(workflow: WorkflowModel) {
    const messageHandler = this.messageHandlers.get(workflow.id);
    // מסיר את המאזין
    process.off('message', messageHandler);
  }
}

export default class MyPlugin extends Plugin {
  load() {
    // מקבל את מופע תוסף תהליך העבודה
    const workflowPlugin =
      this.app.pm.get<PluginWorkflowServer>(PluginWorkflowServer);

    // רושם את הטריגר
    workflowPlugin.registerTrigger('myTrigger', MyTrigger);
  }
}

#registerInstruction()

מרחיב ורושם סוג צומת חדש.

חתימה

registerInstruction(type: string, instruction: typeof Instruction | Instruction })

פרמטרים

פרמטרסוגתיאור
typestringמזהה סוג ההוראה
instructiontypeof Instruction | Instructionסוג ההוראה או מופע שלה

דוגמה

import PluginWorkflowServer, { Instruction, JOB_STATUS } from '@nocobase/plugin-workflow';

class LogInstruction extends Instruction {
  run(node, input, processor) {
    console.log('my instruction runs!');
    return {
      status: JOB_STATUS.RESOVLED,
    };
  },
};

export default class MyPlugin extends Plugin {
  load() {
    // מקבל את מופע תוסף תהליך העבודה
    const workflowPlugin = this.app.pm.get<PluginWorkflowServer>(PluginWorkflowServer);

    // רושם את ההוראה
    workflowPlugin.registerInstruction('log', LogInstruction);
  }
}

#trigger()

מפעיל תהליך עבודה ספציפי. משמש בעיקר בטריגרים מותאמים אישית, כדי להפעיל את תהליך העבודה המתאים כאשר מאזינים לאירוע מותאם אישית ספציפי.

חתימה

trigger(workflow: Workflow, context: any)

פרמטרים

פרמטרסוגתיאור
workflowWorkflowModelאובייקט תהליך העבודה להפעלה
contextobjectנתוני הקשר המסופקים בזמן ההפעלה
טיפ

context הוא כרגע פריט חובה. אם לא יסופק, תהליך העבודה לא יופעל.

דוגמה

import { Trigger } from '@nocobase/plugin-workflow';

class MyTrigger extends Trigger {
  timer: NodeJS.Timeout;

  on(workflow) {
    // רושם אירוע
    this.timer = setInterval(() => {
      // מפעיל את תהליך העבודה
      this.plugin.trigger(workflow, { date: new Date() });
    }, workflow.config.interval ?? 60000);
  }
}

#resume()

מחדש את ביצוע תהליך עבודה שהושהה באמצעות משימת צומת ספציפית.

  • רק תהליכי עבודה הנמצאים במצב המתנה (EXECUTION_STATUS.STARTED) יכולים להתחדש.
  • רק משימות צומת הנמצאות במצב ממתין (JOB_STATUS.PENDING) יכולות להתחדש.

חתימה

resume(job: JobModel)

פרמטרים

פרמטרסוגתיאור
jobJobModelאובייקט המשימה המעודכן
טיפ

אובייקט המשימה המועבר הוא בדרך כלל אובייקט מעודכן, ובדרך כלל הסטטוס שלו יעודכן לערך שאינו JOB_STATUS.PENDING, אחרת הוא ימשיך להמתין.

דוגמה

לפרטים נוספים, ראו קוד המקור.

#Trigger

מחלקה בסיסית לטריגרים, המשמשת להרחבת סוגי טריגרים מותאמים אישית.

פרמטרסוגתיאור
constructor(public readonly workflow: PluginWorkflowServer): Triggerבנאי
on?(workflow: WorkflowModel): voidמטפל אירועים לאחר הפעלת תהליך עבודה
off?(workflow: WorkflowModel): voidמטפל אירועים לאחר השבתת תהליך עבודה

on/off משמשים לרישום/ביטול רישום של מאזיני אירועים כאשר תהליך עבודה מופעל/מושבת. הפרמטר המועבר הוא מופע תהליך העבודה המתאים לטריגר, וניתן לטפל בו בהתאם להגדרות. סוגי טריגרים מסוימים שכבר מאזינים לאירועים באופן גלובלי, אינם חייבים לממש את שתי השיטות הללו. לדוגמה, בטריגר מתוזמן, ניתן לרשום טיימר ב-on ולבטל את רישומו ב-off.

#Instruction

מחלקה בסיסית לסוגי הוראות, המשמשת להרחבת סוגי הוראות מותאמים אישית.

פרמטרסוגתיאור
constructor(public readonly workflow: PluginWorkflowServer): Instructionבנאי
runRunnerלוגיקת ביצוע לכניסה ראשונה לצומת
resume?Runnerלוגיקת ביצוע לכניסה לצומת לאחר חידוש משיבוש
getScope?(node: FlowNodeModel, data: any, processor: Processor): anyמספק את תוכן המשתנים המקומיים עבור הענף שנוצר על ידי הצומת המתאים

סוגים קשורים

export type Job =
  | {
      status: JOB_STATUS[keyof JOB_STATUS];
      result?: unknown;
      [key: string]: unknown;
    }
  | JobModel
  | null;

export type InstructionResult = Job | Promise<Job>;

export type Runner = (
  node: FlowNodeModel,
  input: JobModel,
  processor: Processor,
) => InstructionResult;

export class Instruction {
  run: Runner;
  resume?: Runner;
}

עבור getScope, תוכלו לעיין במימוש צומת הלולאה, המשמש לספק תוכן משתנים מקומיים עבור ענפים.

#EXECUTION_STATUS

טבלת קבועים עבור סטטוסי תוכנית ביצוע של תהליך עבודה, המשמשת לזיהוי הסטטוס הנוכחי של תוכנית הביצוע המתאימה.

שם קבועמשמעות
EXECUTION_STATUS.QUEUEINGבתור
EXECUTION_STATUS.STARTEDבביצוע
EXECUTION_STATUS.RESOLVEDהושלם בהצלחה
EXECUTION_STATUS.FAILEDנכשל
EXECUTION_STATUS.ERRORשגיאת ביצוע
EXECUTION_STATUS.ABORTEDהופסק
EXECUTION_STATUS.CANCELEDבוטל
EXECUTION_STATUS.REJECTEDנדחה
EXECUTION_STATUS.RETRY_NEEDEDלא בוצע בהצלחה, נדרש ניסיון חוזר

למעט שלושת הראשונים, כל השאר מייצגים מצב כשל, אך יכולים לשמש לתיאור סיבות שונות לכשל.

#JOB_STATUS

טבלת קבועים עבור סטטוסי משימות צומת בתהליך עבודה, המשמשת לזיהוי הסטטוס הנוכחי של משימת הצומת המתאימה. הסטטוס שנוצר על ידי הצומת משפיע גם על סטטוס תוכנית הביצוע כולה.

שם קבועמשמעות
JOB_STATUS.PENDINGממתין: הביצוע הגיע לצומת זה, אך ההוראה דורשת השהיה והמתנה
JOB_STATUS.RESOLVEDהושלם בהצלחה
JOB_STATUS.FAILEDנכשל: ביצוע צומת זה לא עמד בתנאים שהוגדרו
JOB_STATUS.ERRORשגיאה: אירעה שגיאה שלא נתפסה במהלך ביצוע צומת זה
JOB_STATUS.ABORTEDהופסק: ביצוע צומת זה הופסק על ידי לוגיקה אחרת לאחר שהיה במצב המתנה
JOB_STATUS.CANCELEDבוטל: ביצוע צומת זה בוטל ידנית לאחר שהיה במצב המתנה
JOB_STATUS.REJECTEDנדחה: המשך צומת זה נדחה ידנית לאחר שהיה במצב המתנה
JOB_STATUS.RETRY_NEEDEDלא בוצע בהצלחה, נדרש ניסיון חוזר

#צד הלקוח

ממשקי ה-API הזמינים במבנה חבילת צד הלקוח מוצגים בקוד הבא:

import PluginWorkflowClient, {
  Trigger,
  Instruction,
} from '@nocobase/plugin-workflow/client';

#PluginWorkflowClient

#registerTrigger()

רושם את לוח התצורה המתאים לסוג הטריגר.

חתימה

registerTrigger(type: string, trigger: typeof Trigger | Trigger): void

פרמטרים

פרמטרסוגתיאור
typestringמזהה סוג הטריגר, תואם למזהה המשמש לרישום
triggertypeof Trigger | Triggerסוג הטריגר או מופע שלו

#registerInstruction()

רושם את לוח התצורה המתאים לסוג הצומת.

חתימה

registerInstruction(type: string, instruction: typeof Instruction | Instruction): void

פרמטרים

פרמטרסוגתיאור
typestringמזהה סוג הצומת, תואם למזהה המשמש לרישום
instructiontypeof Instruction | Instructionסוג הצומת או מופע שלו

#registerInstructionGroup()

רושם קבוצת סוגי צמתים. NocoBase מספקת כברירת מחדל 4 קבוצות סוגי צמתים:

  • 'control': בקרת זרימה
  • 'collection': פעולות על אוספים
  • 'manual': טיפול ידני
  • 'extended': הרחבות אחרות

אם אתם צריכים להרחיב קבוצות נוספות, תוכלו להשתמש בשיטה זו לרישום.

חתימה

registerInstructionGroup(type: string, group: { label: string }): void

פרמטרים

פרמטרסוגתיאור
typestringמזהה קבוצת הצמתים, תואם למזהה המשמש לרישום
group{ label: string }מידע על הקבוצה, כרגע כולל רק את הכותרת

דוגמה

export default class YourPluginClient extends Plugin {
  load() {
    const pluginWorkflow = this.app.pm.get(PluginWorkflowClient);

    pluginWorkflow.registerInstructionGroup('ai', { label: `{{t("AI", { ns: "${NAMESPACE}" })}}` });
  }
}

#Trigger

מחלקה בסיסית לטריגרים, המשמשת להרחבת סוגי טריגרים מותאמים אישית.

פרמטרסוגתיאור
titlestringשם סוג הטריגר
fieldset{ [key: string]: ISchema }אוסף פריטי תצורת טריגר
scope?{ [key: string]: any }אוסף אובייקטים שעשויים לשמש בסכימת פריטי התצורה
components?{ [key: string]: React.FC }אוסף רכיבים שעשויים לשמש בסכימת פריטי התצורה
useVariables?(config: any, options: UseVariableOptions ) => VariableOptionsגשש ערכים לנתוני הקשר של הטריגר
  • אם useVariables אינו מוגדר, פירוש הדבר שסוג טריגר זה אינו מספק פונקציית אחזור ערכים, ולא ניתן לבחור את נתוני ההקשר של הטריגר בצמתי תהליך העבודה.

#Instruction

מחלקה בסיסית להוראות, המשמשת להרחבת סוגי צמתים מותאמים אישית.

פרמטרסוגתיאור
groupstringמזהה קבוצת סוגי הצמתים, האפשרויות הזמינות כרגע: control / collection / manual / extended
fieldsetRecord<string, ISchema>אוסף פריטי תצורת צומת
scope?Record<string, Function>אוסף אובייקטים שעשויים לשמש בסכימת פריטי התצורה
components?Record<string, React.FC>אוסף רכיבים שעשויים לשמש בסכימת פריטי התצורה
Component?React.FCרכיב רינדור מותאם אישית לצומת
useVariables?(node, options: UseVariableOptions) => VariableOptionשיטה עבור הצומת לספק אפשרויות משתני צומת
useScopeVariables?(node, options?) => VariableOptionsשיטה עבור הצומת לספק אפשרויות משתנים מקומיים לענף
useInitializers?(node) => SchemaInitializerItemTypeשיטה עבור הצומת לספק אפשרויות אתחול
isAvailable?(ctx: NodeAvailableContext) => booleanשיטה לקביעה אם הצומת זמין

סוגים קשורים

export type NodeAvailableContext = {
  workflow: object;
  upstream: object;
  branchIndex: number;
};
  • אם useVariables אינו מוגדר, פירוש הדבר שסוג צומת זה אינו מספק פונקציית אחזור ערכים, ולא ניתן לבחור את נתוני התוצאה של צומת מסוג זה בצמתי תהליך העבודה. אם ערך התוצאה הוא יחיד (לא ניתן לבחירה), ניתן להחזיר תוכן סטטי המבטא את המידע המתאים (ראו: קוד המקור של צומת חישוב). אם נדרשת בחירה (לדוגמה, מאפיין מסוים באובייקט), ניתן להתאים אישית את פלט רכיב הבחירה המתאים (ראו: קוד המקור של צומת יצירת נתונים).
  • Component הוא רכיב רינדור מותאם אישית עבור הצומת. כאשר רינדור הצומת המוגדר כברירת מחדל אינו מספק, ניתן להחליף אותו לחלוטין ולבצע רינדור תצוגת צומת מותאמת אישית. לדוגמה, אם ברצונכם לספק כפתורי פעולה נוספים או אינטראקציות אחרות עבור צומת ההתחלה של סוג ענף, עליכם להשתמש בשיטה זו (ראו: קוד המקור של ענף מקבילי).
  • useInitializers משמש לספק שיטה לאתחול בלוקים. לדוגמה, בצומת ידני, ניתן לאתחל בלוקי משתמש קשורים בהתבסס על צמתי upstream. אם שיטה זו מסופקת, היא תהיה זמינה בעת אתחול בלוקים בתצורת ממשק הצומת הידני (ראו: קוד המקור של צומת יצירת נתונים).
  • isAvailable משמש בעיקר לקבוע אם ניתן להשתמש (להוסיף) בצומת בסביבה הנוכחית. הסביבה הנוכחית כוללת את תהליך העבודה הנוכחי, צמתי upstream ואינדקס הענף הנוכחי, ועוד.