ตัวเรียก 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 eventsml: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, requestfrontend/src/lib/query-client.ts:16-111,374-820,1020-1060- endpoint wrappersfrontend/src/lib/sml-query-builder.ts:17-96,136-215,263-330- SQL buildersfrontend/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)