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?
① Thiết kế (design-time) — Studio/MOIT builder ghi vào 2 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.
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)
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
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)
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:
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.
INSERT vào staging + phát event → quy trình MOW duyệt/xử lý → mới nạp vào target_collection.
| Vấn đề bạn nêu | Giả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ước | Chí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 ↔ DB | field_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án | 1 cờ routing (direct/queue) trong form contract — y hệt cơ chế 2 đường của MOT. |
trigger_registry + workflow tạo bản ghi, gán người thực hiện theo tier/role.