logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
หน้าหลัก
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
หน้าหลัก
logologo

บทนำ

FlowEngine คืออะไร
ความสัมพันธ์ระหว่าง FlowEngine และปลั๊กอิน
เริ่มต้นใช้งานอย่างรวดเร็ว
แผนผังการเรียนรู้

คู่มือ

ลงทะเบียน FlowModel
สร้าง FlowModel
เรนเดอร์ FlowModel
กระแสเหตุการณ์และการกำหนดค่าของ FlowModel
การทำให้ FlowModel คงอยู่ถาวร
วงจรชีวิตของ FlowModel
ระบบบริบทของ FlowModel
กลไกการตอบสนอง: Observable
FlowModel vs React.Component
จุดขยายปลั๊กอิน RunJS

Definitions

ModelDefinition
FlowDefinition
EventDefinition
ActionDefinition
StepDefinition
Previous Pageวงจรชีวิตของ FlowModel
Next Pageกลไกการตอบสนอง: Observable
การแจ้งเตือนการแปลด้วย AI

เอกสารนี้แปลโดย AI สำหรับข้อมูลที่ถูกต้อง กรุณาดูเวอร์ชันภาษาอังกฤษ

#ภาพรวมระบบบริบท (Context)

ระบบบริบท (Context) ของ NocoBase Flow Engine แบ่งออกเป็น 3 ชั้น ซึ่งสอดคล้องกับขอบเขตการทำงานที่แตกต่างกัน การใช้งานอย่างเหมาะสมจะช่วยให้สามารถแชร์และแยกส่วนบริการ, การตั้งค่า และข้อมูลได้อย่างยืดหยุ่น ช่วยเพิ่มความสามารถในการบำรุงรักษาและขยายระบบของธุรกิจได้ครับ

  • FlowEngineContext (บริบทส่วนกลาง): มีเพียงหนึ่งเดียวทั่วโลก ทุกโมเดลและเวิร์กโฟลว์สามารถเข้าถึงได้ เหมาะสำหรับการลงทะเบียนบริการและการตั้งค่าระดับส่วนกลาง เป็นต้น
  • FlowModelContext (บริบทโมเดล): ใช้สำหรับแชร์บริบทภายในแผนผังโมเดล (Model Tree) โดยโมเดลย่อยจะทำหน้าที่แทน (Delegate) บริบทของโมเดลหลักโดยอัตโนมัติ และรองรับการเขียนทับด้วยชื่อเดียวกัน เหมาะสำหรับการแยกตรรกะและข้อมูลในระดับโมเดล
  • FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์): สร้างขึ้นทุกครั้งที่มีการรันเวิร์กโฟลว์ และคงอยู่ตลอดวงจรการทำงานของเวิร์กโฟลว์ เหมาะสำหรับการส่งผ่านข้อมูล, การจัดเก็บตัวแปร และการบันทึกสถานะการทำงานภายในเวิร์กโฟลว์ เป็นต้น รองรับโหมด mode: 'runtime' | 'settings' สองรูปแบบ ซึ่งสอดคล้องกับสถานะการรัน (Runtime) และสถานะการตั้งค่า (Settings) ตามลำดับ

FlowEngineContext (บริบทส่วนกลาง), FlowModelContext (บริบทโมเดล) และ FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์) ทั้งหมดนี้ล้วนเป็นคลาสย่อยหรืออินสแตนซ์ของ FlowContext ครับ


#🗂️ แผนภาพโครงสร้างลำดับชั้น

FlowEngineContext (บริบทส่วนกลาง)
│
├── FlowModelContext (บริบทโมเดล)
│     ├── FlowModelContext ย่อย (โมเดลย่อย)
│     │     ├── FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์)
│     │     └── FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์)
│     └── FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์)
│
├── FlowModelContext (บริบทโมเดล)
│     └── FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์)
│
└── FlowModelContext (บริบทโมเดล)
      ├── FlowModelContext ย่อย (โมเดลย่อย)
      │     └── FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์)
      └── FlowRuntimeContext (บริบทขณะรันไทม์ของเวิร์กโฟลว์)
  • FlowModelContext สามารถเข้าถึงคุณสมบัติและเมธอดของ FlowEngineContext ได้ผ่านกลไกตัวแทน (Delegate) เพื่อให้บรรลุการแชร์ความสามารถระดับส่วนกลาง
  • FlowModelContext ของโมเดลย่อยสามารถเข้าถึงบริบทของโมเดลหลัก (ความสัมพันธ์แบบซิงโครนัส) ได้ผ่านกลไกตัวแทน (Delegate) และรองรับการเขียนทับด้วยชื่อเดียวกัน
  • โมเดลหลักและโมเดลย่อยแบบอะซิงโครนัสจะไม่สร้างความสัมพันธ์แบบตัวแทน (Delegate) เพื่อหลีกเลี่ยงการปนเปื้อนสถานะ
  • FlowRuntimeContext จะเข้าถึง FlowModelContext ที่เกี่ยวข้องผ่านกลไกตัวแทน (Delegate) เสมอ แต่จะไม่ส่งข้อมูลกลับขึ้นไปด้านบน

#🧭 สถานะการรันและสถานะการตั้งค่า (mode)

FlowRuntimeContext รองรับสองโหมด โดยแยกความแตกต่างด้วยพารามิเตอร์ mode ดังนี้ครับ:

  • mode: 'runtime' (สถานะการรัน): ใช้ในขั้นตอนการรันเวิร์กโฟลว์จริง คุณสมบัติและเมธอดจะคืนค่าข้อมูลจริง ตัวอย่างเช่น:

    console.log(runtimeCtx.steps.step1.result); // 42
  • mode: 'settings' (สถานะการตั้งค่า): ใช้ในขั้นตอนการออกแบบและตั้งค่าเวิร์กโฟลว์ การเข้าถึงคุณสมบัติจะคืนค่าเป็นสตริงเทมเพลตตัวแปร เพื่อความสะดวกในการเลือกนิพจน์และตัวแปร ตัวอย่างเช่น:

    console.log(settingsCtx.steps.step1.result); // '{{ ctx.steps.step1.result }}'

การออกแบบสองโหมดนี้ช่วยรับประกันความพร้อมใช้งานของข้อมูลในขณะรันไทม์ และอำนวยความสะดวกในการอ้างอิงตัวแปรและการสร้างนิพจน์ในขณะตั้งค่า ช่วยเพิ่มความยืดหยุ่นและใช้งานง่ายให้กับ Flow Engine ครับ


#🤖 ข้อมูลบริบทสำหรับเครื่องมือ/โมเดลภาษาขนาดใหญ่ (LLM)

ในบางสถานการณ์ (เช่น การแก้ไขโค้ด RunJS ของ JS*Model, AI coding) จำเป็นต้องให้ "ผู้เรียก" เข้าใจข้อมูลต่อไปนี้โดยไม่ต้องรันโค้ด:

  • ภายใต้ ctx ปัจจุบันมี ความสามารถแบบสแตติก อะไรบ้าง (เอกสาร API, พารามิเตอร์, ตัวอย่าง, ลิงก์เอกสาร เป็นต้น)
  • ในอินเทอร์เฟซ/สถานะการรันปัจจุบันมี ตัวแปรที่เลือกได้ อะไรบ้าง (เช่น โครงสร้างไดนามิกอย่าง "บันทึกปัจจุบัน", "บันทึกในหน้าต่างป๊อปอัปปัจจุบัน" เป็นต้น)
  • สแนปชอตขนาดเล็ก ของสภาพแวดล้อมการรันปัจจุบัน (สำหรับใช้ใน prompt)

#1) await ctx.getApiInfos(options?) (ข้อมูล API แบบสแตติก)

#2) await ctx.getVarInfos(options?) (ข้อมูลโครงสร้างตัวแปร)

  • สร้างโครงสร้างตัวแปรตาม defineProperty(...).meta (รวมถึง meta factory)
  • รองรับการตัดเส้นทางด้วย path และการควบคุมความลึกด้วย maxDepth
  • จะขยายลงด้านล่างเมื่อจำเป็นเท่านั้น

พารามิเตอร์ที่ใช้บ่อย:

  • maxDepth: ระดับการขยายสูงสุด (ค่าเริ่มต้นคือ 3)
  • path: string | string[]: การตัดข้อมูล โดยจะแสดงเฉพาะทรีที่อยู่ภายใต้เส้นทางที่ระบุ

#3) await ctx.getEnvInfos() (สแนปชอตสภาพแวดล้อมขณะรันไทม์)

โครงสร้างโหนด (แบบย่อ):

type EnvNode = {
  description?: string;
  getVar?: string; // สามารถใช้ได้โดยตรงสำหรับ await ctx.getVar(getVar) โดยขึ้นต้นด้วย "ctx."
  value?: any; // ค่าสแตติกที่แยกวิเคราะห์แล้ว/สามารถทำเป็นซีเรียลไลซ์ได้
  properties?: Record<string, EnvNode>;
};