KB-5C96

MOIT — kiến trúc để input chạy thật vào DB (ghi chú vòng 8)

5 min read Revision 1
designmoitinput-tablefield_registryinput_form_registrydotroutingrunnable

MOIT — Kiến trúc để input CHẠY THẬT vào DB (vòng 8)

Date: 2026-06-18 | Status: DISCUSSION (giải từng bước). Sơ đồ: https://vps.incomexsaigoncorp.vn/ui-preview/mcp-writes/moit-dataflow-v1.html

Vấn đề (Huyên)

Thiết kế nhập liệu đang tách rời, chưa khả thi. Cần lớp kết nối để UI Studio linh hoạt (kéo trường + mấy cột/hàng) ghi thẳng vào DB sau Submit, chạy thật chứ không chỉ UI. 2 đường ghi (direct/queue) phải nhất quán. Trường phải có trong DB trước (điều kiện cần). >95–98% input là từ MOT/DOT/Agent.

Phát hiện then chốt: LỚP KẾT NỐI ĐÃ CÓ TRONG DB PRODUCTION

Soi directus.public (query_pg) — tồn tại thật: field_registry, input_form_registry, tier_registry, binding_registry, forms, block_form, collection_field_standards, collection_registry, field_type_equivalences, trigger_registry, birth_registry, governance_registry. DDL production (doc 01-production-schemas.md, đã chạy live BEGIN..ROLLBACK, 5/5 PASS):

  • field_registry: code · name · collection_code (bảng DB, soft ref) · field_kind · data_type · is_required · interface (widget Directus/Studio) · validation jsonb · owner_mother=GOV-MOIT · status(draft/active/retired). UNIQUE(collection_code,name). → chính là binding field↔cột+widget+validation.
  • input_form_registry: code · name · form_kind · target_collection · design_template_code(Điều 28) · field_set jsonb (thứ tự field codes) · form_schema jsonb (layout) · owner_mother=GOV-MOIT · status. → form contract = trường + layout + target + routing.
  • field/form registry chỉ thuộc GOV-MOIT (capability.can_create) — không trùng sở hữu.

Kiến trúc trả lời câu hỏi (chốt)

Chuỗi design→run:

  1. Design-time: Studio/MOIT builder chọn field_registry.code + xếp layout → ghi 1 dòng input_form_registry (field_set + form_schema + target_collection + routing). Điều kiện cần: field ∈ field_registry status=active (trỏ cột thật) → không đăng ký thì không kéo lên form được (chặn ngay từ thiết kế).
  2. DOT assembly (không phải Nuxt) đọc 2 registry → render contract (fields+widget+validation+layout).
  3. Run-time: Nuxt <MOITForm formId> zero-logic render → Submit gom {field_code: value} (Điều 28, Nuxt không ghi DB).
  4. DOT executor validate ở PG → map field_code→cột → ghi qua DOT-pair (NT12/NT13, audit, idempotent). Rẽ theo routing:
    • direct → INSERT thẳng target_collection (cán bộ chuyên môn nhập thật).
    • queue → INSERT staging + event → MOW duyệt/xử lý → nạp target_collection.

Nguyên lý khả thi: Layout (form_schema) TÁCH RỜI Binding (field_registry). Sắp xếp UI tuỳ ý — đường data vào DB không đổi vì mỗi widget mang field_code trỏ cứng tới cột. Giống "khung tách số liệu" của MOUT.

Analogy MODW: MODW làm workflow chạy được bằng config trên registry + DOT (không code tay). MOIT làm form chạy được bằng config trên field/input_form_registry + DOT. Cùng công thức: registry primitive đã duyệt + assembler chung + DOT thực thi.

Map 4 câu hỏi của Huyên

  • 1.1 tái dùng Studio → widget = field_registry.interface + template Điều 28. ✓
  • 1.2 trường có trước → = field_registry (active, trỏ cột). ✓
  • 1.3 lớp kết nối → field_registry + input_form_registry + DOT assembly + DOT write; layout tách binding. ✓
  • 1.4 hai đường nhất quán → cờ routing direct/queue trong form contract. ✓

Kế hoạch từng bước

  1. (làm ngay, UI) MOIT builder: "Nhập gì?" picker buộc vào field_registry (hiện collection_code.name + interface + validation + required) thay nhãn tự do; thêm công tắc routing direct/queue + hiện target_collection.
  2. Layout vào form_schema (tái dùng Studio L1–L4 cụm/cột).
  3. Spec DOT assembly + DOT write executor (đặc tả).
  4. Validation từ field_registry hiện trên form (PG-side).
  5. Trigger mô tả → trigger_registry + workflow sinh bản ghi → MOT gán người & giao việc.

Open / cần Huyên chốt

  • Bắt đầu Bước 1 luôn? (đổi builder sang bind field_registry — cần một danh mục field demo phản ánh collection_code/interface).
  • routing lưu ở input_form_registry (cột mới) hay trong form_schema?
  • Field demo: lấy theo collection thật (vd phieu_nhap) để minh hoạ bind cột.

Sơ đồ live: moit-dataflow-v1.html. Chưa sửa builder — chờ Huyên chốt bước 1.