MOIT — kiến trúc để input chạy thật vào DB (ghi chú vòng 8)
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) ·validationjsonb ·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_setjsonb (thứ tự field codes) ·form_schemajsonb (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:
- Design-time: Studio/MOIT builder chọn
field_registry.code+ xếp layout → ghi 1 dònginput_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ế). - DOT assembly (không phải Nuxt) đọc 2 registry → render contract (fields+widget+validation+layout).
- Run-time: Nuxt
<MOITForm formId>zero-logic render → Submit gom{field_code: value}(Điều 28, Nuxt không ghi DB). - 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ạptarget_collection.
- direct → INSERT thẳng
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ờ
routingdirect/queue trong form contract. ✓
Kế hoạch từng bước
- (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.
- Layout vào form_schema (tái dùng Studio L1–L4 cụm/cột).
- Spec DOT assembly + DOT write executor (đặc tả).
- Validation từ field_registry hiện trên form (PG-side).
- 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).
routinglưu ởinput_form_registry(cột mới) hay trongform_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.