สมอง SML

คลังความรู้ / หน้าจอ Next.js

#frontend#api-client#query#sql#thai-search

ตัวเรียก API และตัวประกอบ SQL ฝั่งเบราว์เซอร์

จอบัญชีเรียก backend ผ่าน 3 ชั้น: api-client.ts (fetch พื้นฐาน + จัดการ session หมดอายุ), query-client.ts (ฟังก์ชันสำเร็จรูปต่อ endpoint) และ sml-query-builder.ts (ประกอบ SQL string แบบเดียวกับ SMLERP เดิม) ข้อมูลหลักอ่าน/เขียนด้วย SQL ที่เบราว์เซอร์ประกอบเอง ส่วนงานที่มีกติกาธุรกิจ (บันทึกเอกสาร, คำนวณยอด, รายงาน) เรียก /api/process/*

ทำงานอย่างไร

api-client.ts

  • ApiResult<T> = {ok:true,data} | {ok:false,error,code?} (บรรทัด 13-24); ฟังก์ชัน apiGet/apiPost/apiPut/apiPatch/apiDelete (บรรทัด 160-185) ห่อ request() ที่ fetch แบบ cache:"no-store" + Content-Type: application/json และ ไม่ throw - ต้องเช็ก res.ok ทุกครั้ง.
  • ถ้าได้ 401 หรือ code อยู่ใน NO_SESSION/NO_TOKEN/SESSION_EXPIRED/UNAUTHORIZED (หรือข้อความ "หมดเวลาใช้งาน") จะบันทึก sessionStorage["sml_return_to"] แล้ว dispatch event sml:session-expired (บรรทัด 77-90, 112-118, 134-141) ให้ PersistentWorkspaceHost แสดง modal (โครงหน้าเว็บและการนำทาง (App shell & routing)). ยกเว้น /api/auth/login.
  • เมื่อ POST ที่เปลี่ยนฐานข้อมูล/ผู้ใช้ (/api/auth/login|demo|google|databases, /api/workspace/select-db) สำเร็จ เรียก invalidateSmlSettings() เพื่อโหลดทศนิยม/ปี พ.ศ. ใหม่ (บรรทัด 10, 146-148) - ดู ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts).
  • 403 ที่ไม่มี body -> "ไม่มีสิทธิ์เข้าถึงข้อมูลส่วนนี้ (403)" (บรรทัด 123-127).

query-client.ts (ฟังก์ชันสำคัญ; ทุกตัวคืน ApiResult)

ฟังก์ชัน endpoint หมายเหตุ
queryList(sql) POST /api/query/list SELECT/WITH ทุกแถว (บรรทัด 16)
queryLimit(sql, limit=50, offset=0, includeTotal=true, source?) /api/query/limit แบ่งหน้า + นับรวม (25)
queryExec(sql) /api/query/exec INSERT/UPDATE/DELETE (44)
queryBatch(sql[]), queryExecBatch(sql[]) /api/query/batch, /api/query/execBatch หลายคำสั่งใน transaction เดียว (54, 63)
saveTrans, deleteTrans, saveDoc, deleteDoc, setDocStatus /api/process/trans/*, /api/process/doc/* บันทึก/ลบ/อนุมัติ/ยกเลิกเอกสาร (374, 679, 774, 791, 801)
transTotals, transGridLine, transGridFormula, transGridShortcut, transGridPriceInfo, transFx, transGridRefImport /api/process/transgrid/* คำนวณตารางรายการ (441-540, 672)
getPartyDefaults, getPartyLookupFilter, getRefDocLookupFilter, getWhLookupFilter, checkWhPick, getWhPermFilter, listOpenDeposits, outstandingBills /api/process/trans/*, lookup/*, doc/bills ค่าตั้งต้นคู่ค้า/คลัง/มัดจำ/ใบค้างชำระ (553-790)
rebuildStock, rebuildGl, itemNextCode, itemMasterSave/Delete `/api/process/stock gl
runBackendReport, fetchBackendReportPdf `/api/process/report/run pdf`

sml-query-builder.ts (ลอกวิธีเดียวกับ SMLERP เดิม MyLib._myScreen.cs)

  • escapeSql (17) แปลง ' -> ''; sqlText/sqlLookup/sqlDecimal/sqlDate/formatSqlFieldValue (24-96) แปลงค่าฟอร์มเป็น literal (ว่าง -> null).
  • buildInsertSql/buildUpdateSql/buildDeleteSql (263/292/321) สร้าง SQL จาก ScreenSchema (เครื่องฟอร์มแบบ schema (SchemaForm, FieldDef, useRecordForm) และจอตั้งค่าระบบ); masterLogSql (35) บันทึก log การ เพิ่ม/แก้/ลบ ลง master_logs.
  • buildSmlSearchWhere(keyword, searchFields=["code","name_1"], strict=false) (136) สร้างเงื่อนไขค้นหา: แยกคำด้วยช่องว่าง, คำที่ขึ้นต้น + = ต้องตรงตัว, ใช้ thai-search.ts ตัดคำไทยเป็นพยางค์/ขยายคำพ้อง/หน่วยนับค้าส่ง และเมื่อคำค้นยาว (>= 3 พยางค์) ยอมให้ตรงบางส่วน (N-1) ยกเว้น strict=true (ใช้กับ lookup) ซึ่งเป็น AND ทุกคำ.

ข้อควรระวัง

  • SQL ถูกประกอบที่เบราว์เซอร์แล้วส่งเป็นข้อความ ({sql}) - ทุกค่าต้องผ่าน escapeSql/sqlText/decimalSql ก่อนต่อเข้า SQL (ไม่มี parameter binding ในชั้นนี้). ตารางที่เกี่ยวกับเงิน/เอกสารใช้ endpoint /api/process/* แทน.
  • ทศนิยมของ SQL ใช้ decimalSql ใน numeric.ts ไม่ใช้ Number() (ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts)).

ที่มาในโค้ด

  • frontend/src/lib/api-client.ts:13-24,76-160 - ApiResult, session expired, request
  • frontend/src/lib/query-client.ts:16-111,374-820,1020-1060 - endpoint wrappers
  • frontend/src/lib/sml-query-builder.ts:17-96,136-215,263-330 - SQL builders
  • frontend/src/lib/thai-search.ts:539-668 - ตัดคำ/ให้คะแนนการค้นหา

ดูเพิ่ม

ภาพรวม Frontend ของ SML Ai Account (Frontend overview) · เส้นทาง API ฝั่ง Next.js ที่ส่งต่อไป Go backend (API proxy routes) · ตารางรายการและหน้าต่างค้นหา (SmlDataList, SmlLookupModal, SmlLookupInput) · ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts) · เครื่องฟอร์มแบบ schema (SchemaForm, FieldDef, useRecordForm) และจอตั้งค่าระบบ · ภาพรวม Backend Go ของ SML Ai Account (Backend overview)