MOIT Builder Bộ công cụ MOT

MOIT — làm sao UI linh hoạt lại ghi thẳng được vào DB?

Câu hỏi cốt lõi: một thiết kế nhập liệu linh hoạt như Studio (kéo trường, đặt mấy cột mỗi hàng) làm sao nối thẳng vào DB và đẩy data vào sau khi Submit — chạy thật chứ không chỉ đẹp?

Tin tốt: lớp kết nối đã có sẵn trong DB production — không phải xây mới. Soi schema thật thấy: field_registry, input_form_registry, binding_registry, collection_field_standards, trigger_registry. Việc của ta là cho UI đọc/ghi đúng các registry này.

① Thiết kế (design-time) — Studio/MOIT builder ghi vào 2 registry

field_registry

Mỗi trường = 1 cột DB đã duyệt: collection_code.name · data_type · interface (widget Studio) · validation · is_required · owner=GOV-MOIT.

input_form_registry

1 form = field_set (thứ tự trường) + form_schema (layout: cụm + mấy cột/hàng) + target_collection + routing (direct/queue).

② Lắp ráp — DOT assembly (không phải Nuxt)

DOT đọc 2 registry → render contract

Kiểm field đã duyệt, ghép cấu trúc form + validation + layout. Thiếu field trong registry → không lắp được (chặn ngay từ thiết kế).

③ Chạy (run-time) — Nuxt chỉ render

<MOITForm formId> · zero logic

Nuxt fetch contract → render widget theo layout. Người nhập → Submit → gom { field_code: value }. Nuxt KHÔNG ghi DB (Điều 28).

④ Ghi — DOT executor (DOT-pair, Điều 33/NT12/NT13)

Validate (PG) → map field→cột → ghi

DOT kiểm lại theo field_registry.validation, ánh xạ mỗi field_code → đúng cột, ghi qua DOT-pair (có audit, idempotent). Rẽ theo routing:

direct Ghi thẳng

INSERT thẳng vào target_collection — bảng DB thật. Dùng khi cán bộ chuyên môn nhập số liệu thật.

queue Chờ xử lý

INSERT vào staging + phát event → quy trình MOW duyệt/xử lý → mới nạp vào target_collection.

Vì sao UI linh hoạt vẫn nối thẳng được DB: Layout (form_schema: mấy cột/hàng, cụm) tách rời Binding (field_registry: cột + kiểu + validation). Sắp xếp lại giao diện bao nhiêu tuỳ ý — đường data vào DB không đổi, vì mỗi widget mang theo field_code trỏ cứng tới cột. Đây đúng nguyên lý "khung tách số liệu" của MOUT.

3 câu hỏi của bạn → đã có chỗ trả lời

Vấn đề bạn nêuGiải bằng cái đã có
1.1 Tái dùng Studio nhất quánĐúng. Widget Studio = field_registry.interface + template Điều 28.
1.2 Trường phải có trong DB trướcChính là field_registry (status=active, trỏ cột thật). Chưa đăng ký → không kéo lên form được.
1.3 Lớp kết nối UI ↔ DBfield_registry (field↔cột+widget+validation) + input_form_registry (form=trường+layout+target+routing) + DOT assembly + DOT ghi. Layout tách binding.
1.4 Hai đường ghi nhất quán1 cờ routing (direct/queue) trong form contract — y hệt cơ chế 2 đường của MOT.

Giải từng bước (đề xuất)

Bước 1 — Buộc "Nhập gì?" vào field_registry (UI, làm ngay)
Đổi picker trong MOIT builder: mỗi trường nhập = 1 field đã đăng ký (hiện cột DB + widget + validation + bắt buộc), thay nhãn tự do. Thêm công tắc routing direct/queue + hiện target_collection.
Bước 2 — Layout trong form_schema (tái dùng Studio L1–L4)
Khai mấy cột/hàng + cụm vào form_schema; chứng minh layout ≠ binding.
Bước 3 — Spec DOT assembly + DOT write
Hợp đồng: đọc 2 registry → render contract; executor: {field_code:value}+routing → INSERT direct/staging. (Đặc tả, chưa code.)
Bước 4 — Validation từ field_registry hiện trên form
required/min-max/regex/enum/cross-field chạy ở PG trước khi ghi.
Bước 5 — Trigger → sinh bản ghi → MOT giao việc
Nối ô mô tả trigger với trigger_registry + workflow tạo bản ghi, gán người thực hiện theo tier/role.