Skip to main content

แอปสะสมแต้มและรางวัล

ภาพรวม

แอป loyalty คือระบบบัตรสะสมแต้มหรือแสตมป์และการแลกรางวัลผ่าน LINE ประกอบด้วยองค์ประกอบหลักดังนี้

องค์ประกอบความหมาย
Programตัวโปรแกรมหลัก กำหนดโหมดแต้มหรือแสตมป์ ขนาดบัตร และสถานะเปิดปิด
Milestonesเป้าหมายสะสม สะสมครบตามกำหนดแล้วได้รางวัลที่ระบุ
Tiersระดับสมาชิก ใช้ได้เฉพาะโหมดแต้ม จัดอันดับด้วยค่า rank
Branchesสาขาที่ให้แต้มและแลกรางวัลได้
Staffพนักงานที่มีสิทธิ์ให้แต้ม บริหารด้วยระบบคำเชิญ
Activity / Customersประวัติการทำรายการและข้อมูลลูกค้าสมาชิก

โมดูลนี้ใช้ ชุด error code เดียวกับ client-api เพื่อให้ทั้งสองฝั่งสื่อสารด้วยรหัสข้อผิดพลาดชุดเดียวกัน

Business Flow

ตั้งค่าโปรแกรม

  1. GET /api/apps/loyalty/program อ่านโปรแกรมปัจจุบัน หากยังไม่มีจะได้ error LOYALTY_PROGRAM_MISSING
  2. PUT /api/apps/loyalty/program บันทึกโปรแกรม เช่น โหมดและขนาดบัตร หากขนาดบัตรไม่ถูกต้องจะได้ LOYALTY_CARD_SIZE_INVALID
  3. PUT /api/apps/loyalty/program/status เปิดหรือปิดโปรแกรม

สร้างบันไดรางวัล

  1. Milestones จัดการผ่าน GET /api/apps/loyalty/milestones, POST /api/apps/loyalty/milestones, PUT /api/apps/loyalty/milestones/:id และ DELETE /api/apps/loyalty/milestones/:id
  2. Tiers จัดการผ่าน GET /api/apps/loyalty/tiers, POST /api/apps/loyalty/tiers, PUT /api/apps/loyalty/tiers/:id และ DELETE /api/apps/loyalty/tiers/:id
    • ใช้ได้เฉพาะโหมดแต้ม หากโปรแกรมอยู่ในโหมดอื่นจะได้ LOYALTY_TIER_POINT_MODE_ONLY
    • หากตัวเลขไม่สมเหตุสมผลจะได้ LOYALTY_TIER_INVALID
    • หากค่า rank ซ้ำกับระดับที่มีอยู่จะได้ LOYALTY_TIER_RANK_TAKEN
  3. POST /api/apps/loyalty/tiers/recalculate คำนวณระดับสมาชิกใหม่ทันที นอกเหนือจาก job รายคืน endpoint นี้มีไว้เพราะร้านที่เพิ่งตั้งบันไดรางวัลเสร็จไม่ควรต้องรอถึงตีสามเพื่อตรวจว่าตั้งค่าถูกต้องหรือไม่

สาขาและพนักงาน

  1. Branches จัดการผ่าน GET /api/apps/loyalty/branches, POST /api/apps/loyalty/branches และ DELETE /api/apps/loyalty/branches/:id
  2. Staff จัดการผ่าน GET /api/apps/loyalty/staff, POST /api/apps/loyalty/staff/invite สำหรับส่งคำเชิญ, PUT /api/apps/loyalty/staff/:id สำหรับแก้ไข และ DELETE /api/apps/loyalty/staff/:id สำหรับเพิกถอนคำเชิญ

ดูข้อมูลลูกค้า

  1. GET /api/apps/loyalty/activity ดูประวัติการให้แต้มและการแลกรางวัล
  2. GET /api/apps/loyalty/customers ค้นหาลูกค้าสมาชิก
  3. GET /api/apps/loyalty/customer ดูข้อมูลลูกค้ารายคนแบบ lookup

ฝั่งผู้ใช้และพนักงานหน้าร้าน

การให้แต้มและการแลกรางวัลจริงทำผ่าน client-api ในรูปแบบ LIFF ไม่ได้ทำผ่าน endpoint ในเอกสารนี้

ไฟล์และฟังก์ชันหลัก

โค้ดอยู่ที่ internal/modules/loyalty/

ไฟล์บทบาท
controller.goลงทะเบียน route โดยทุก route มี apps.AppEnabledGuard(d)
service_program.goProgramService ดูแลโปรแกรมหลักและนิยาม error code
service_catalog.goCatalogService ดูแลบันไดรางวัล สาขา และ allowlist ของพนักงาน

ทุก route อยู่บน group authed ต่อด้วย appEnabled และ policy (PolicyModuleLineOa)

MethodRouteHandlerPolicy
GET/api/apps/loyalty/programct.getProgramread
PUT/api/apps/loyalty/programct.saveProgramupdate
PUT/api/apps/loyalty/program/statusct.setProgramStatusupdate
GET/api/apps/loyalty/milestonesct.listMilestonesreadAll
POST/api/apps/loyalty/milestonesct.createMilestonecreate
PUT/api/apps/loyalty/milestones/:idct.updateMilestoneupdate
DELETE/api/apps/loyalty/milestones/:idct.deleteMilestonedelete
GET/api/apps/loyalty/tiersct.listTiersreadAll
POST/api/apps/loyalty/tiersct.createTiercreate
PUT/api/apps/loyalty/tiers/:idct.updateTierupdate
DELETE/api/apps/loyalty/tiers/:idct.deleteTierdelete
POST/api/apps/loyalty/tiers/recalculatect.recalculateTiersupdate
GET/api/apps/loyalty/branchesct.listBranchesreadAll
POST/api/apps/loyalty/branchesct.createBranchcreate
DELETE/api/apps/loyalty/branches/:idct.deleteBranchdelete
GET/api/apps/loyalty/activityct.listActivityreadAll
GET/api/apps/loyalty/customersct.searchCustomersreadAll
GET/api/apps/loyalty/customerct.lookupCustomerreadAll
GET/api/apps/loyalty/staffct.listStaffreadAll
POST/api/apps/loyalty/staff/invitect.createInvitecreate
PUT/api/apps/loyalty/staff/:idct.updateStaffupdate
DELETE/api/apps/loyalty/staff/:idct.revokeInvitedelete

Error code ทั้งหมดนิยามใน service_program.go ได้แก่ LOYALTY_PROGRAM_MISSING, LOYALTY_TIER_POINT_MODE_ONLY, LOYALTY_TIER_INVALID, LOYALTY_TIER_RANK_TAKEN และ LOYALTY_CARD_SIZE_INVALID

จุดเชื่อมต่อกับ Service อื่น

  • สิทธิ์การเข้าถึง — ทุก route ผ่าน apps.AppEnabledGuard(d) แอปต้องถูกเปิดให้องค์กรก่อน (ดู ระบบ Apps เสริม) ส่วน policy metadata ใช้ PolicyModuleLineOa
  • ตารางที่เกี่ยวข้อง — กลุ่ม loyalty ที่นิยามใน internal/entities/loyalty.go ครอบคลุม program, milestone, tier, branch, staff, activity หรือ transaction และ customer membership รวมถึง line_oa_app, line_oa และ line_user
  • Job รายคืน — การคำนวณ tier ใหม่รอบ 03:00 ทำที่ worker
  • Cross-serviceline-management-client-api-go ใช้ชุด error code เดียวกัน
  • โมดูลที่เกี่ยวข้องระบบ Apps เสริม, แอปจองคิว/นัดหมาย, แอปกระดานประกาศ และ จัดการผู้ใช้ LINE