Case study Số 02 · 2025 · Khám từ xa & đặt lịch

Hệ thống y tế

Sepolia Health

Số hóa quy trình phòng khám từ đặt lịch, hồ sơ bệnh án đến tư vấn từ xa qua video và trợ lý AI. Một backend NestJS phục vụ cùng lúc app bệnh nhân, cổng bác sĩ và quầy lễ tân.

Plate II. Cối thuốc, cúc La Mã & ống nghe
Plate II. Cối thuốc, cúc La Mã & ống nghe
Vai trò
Backend Developer
Thời gian
6 tháng · 2025
Đội ngũ
3 người
Nền tảng
Web · Mobile · API
Stack
Next.js · NestJS · Expo · PostgreSQL
01

Bài toán đặt ra

Cần giải quyết điều gì, và vì sao nó khó.

Sổ sách giấy và những file Excel rời rạc khiến quầy tiếp đón quá tải, bác sĩ bị trùng lịch và hồ sơ thất lạc.

Sepolia Health đặt mục tiêu số hóa trọn hành trình: đặt lịch, hồ sơ, thanh toán, và gặp bác sĩ mà không cần tới phòng khám.

Bốn kiểu người dùng, mỗi người một màn hình: bệnh nhân trên điện thoại, bác sĩ và lễ tân trên web, quản trị viên lo khuyến mãi. Tất cả cùng nhìn vào một lịch hẹn, nên cái khó là giữ một source of truth duy nhất đồng bộ giữa họ.

Tôi là Backend Developer: thiết kế database, xây các API cốt lõi, tích hợp third-party service và tối ưu hệ thống cho các flow realtime.

02

Bên trong hệ thống

Vẽ đúng theo hệ thống đã triển khai. Số trên bản vẽ ứng với ghi chú bên dưới.

Ba lớp: hai client, một API, rồi tới dữ liệu và dịch vụ. Mọi client nói chuyện với cùng một NestJS gateway; chatbot chạy thành service riêng và hỏi API lấy lịch thật thay vì tự đoán.

TIER 1 · CLIENTTIER 2 · APITIER 3 · DATA & SERVICESApp bệnh nhânReact Native · ExpoWeb portalNext.jsbác sĩ · lễ tân · quản trịbệnh nhânNestJS APIsingle gateway · DockerAuth & phân quyềnĐặt lịch & lịch trựcBệnh án & kết quảThanh toán & voucherThông báo · push, emailPostgreSQLsource of truthRediscache · hot readsAWS S3kết quả PDF · đính kèmStreamChatchat · phân theo cơ sởZoom Meeting APIkhám qua videoAI chatbot serviceRAG · function callingREST · JWTREST · JWTcachefileschannelsmeetingsfunction calling → lịch trựcDigitalOcean · Docker1234567
Tờ1 / 1Hệ thống y tế Sepolia HealthHình 1. Kiến trúc ba lớp, một backend cho mọi clientNgười vẽV. D. Anh · 2025Tỉ lệkhông theo tỉ lệ

↔ Kéo ngang để xem hết bản vẽ

  1. 1

    App bệnh nhân

    React Native với Expo: đặt lịch, bệnh án, thanh toán, chat và khám qua video.

  2. 2

    Web portal

    Next.js cho bác sĩ, lễ tân và quản trị viên, mỗi vai một quyền và bộ màn hình riêng.

  3. 3

    NestJS gateway

    API duy nhất: auth, đặt lịch, bệnh án, thanh toán, voucher và thông báo.

  4. 4

    PostgreSQL + Redis

    Postgres là source of truth; Redis cache các hot read để database không bị dội tải.

  5. 5

    AWS S3

    File đính kèm y khoa và kết quả PDF, bệnh nhân tải qua app.

  6. 6

    StreamChat & Zoom

    Mua chứ không tự xây: chat realtime phân theo cơ sở, và khám qua video.

  7. 7

    AI chatbot service

    RAG trên tài liệu y khoa cộng function calling gọi về API lấy lịch trực thật. Deploy trên DigitalOcean.

Stack theo từng lớp

Backendlõi dùng chung
NestJSTypeScriptREST API
Dữ liệusource of truth & cache
PostgreSQLRedisAWS S3
Tích hợpmua chứ không tự xây
StreamChatZoom APIAI Chatbot (RAG)
Client & opsnơi người dùng chạm vào
React NativeExpoNext.jsDockerDigitalOcean
03

Tính năng chính

Màn hình thật của sản phẩm. Chọn một tính năng rồi đi qua từng bước.

Đặt lịch khám

Đặt lịch từ ba phía: bệnh nhân đặt qua app, bác sĩ nhận ca realtime trên web, lễ tân đặt hộ khách tại quầy.

Góc nhìn

Bệnh nhân chọn hồ sơ, chuyên khoa, bác sĩ và khung giờ trống trên app di động.

  1. Chọn hồ sơ có sẵn (bản thân hoặc người thân). Họ tên, số điện thoại, ngày sinh tự điền.

Xem video demo
Bước 1/5 · Chọn hồ sơ bệnh nhân

Tờ ảnh liên hoàn

Thêm màn hình từ cổng web và ứng dụng di động.

04

Thách thức & cách giải

Mỗi vấn đề, cách tiếp cận, và con số cho thấy nó hiệu quả.

4.1
3nền tảng chạy chung một backend NestJS

Một lịch hẹn, mọi người cùng thấy, cùng lúc

Vấn đề

Lịch đặt trên điện thoại phải hiện ngay trên cổng bác sĩ và quầy lễ tân, trong khi lượt tra khung giờ từ mọi client cùng dồn vào một bảng.

Cách giải

NestJS là gateway duy nhất nắm việc đặt lịch. Redis cache các hot read để giảm tải cho PostgreSQL, và đặt lịch xong là đẩy thông báo tới bác sĩ ngay.

4.2
4+dịch vụ tích hợp: Zoom, StreamChat, AI, S3

Chat và video mà không cần đội media

Vấn đề

Chat realtime và gọi video tự chúng đã là cả một sản phẩm. Tự xây sẽ nuốt trọn thời gian của một đội ba người.

Cách giải

Mua thứ không phải lõi: StreamChat cho nhắn tin, hội thoại tự phân về đúng cơ sở; Zoom Meeting API cho khám từ xa. Backend giữ identity và permission; vendor lo đường truyền.

4.3

Trợ lý không được bịa lịch khám

Vấn đề

LLM sẵn sàng trả lời 'Bác sĩ X trực thứ Ba' dù chẳng có căn cứ. Trong y tế, một câu trả lời sai mà tự tin còn tệ hơn không trả lời.

Cách giải

Chatbot lai: RAG trên tài liệu y khoa của phòng khám cho câu hỏi chung, và function calling gọi về API cho mọi câu về lịch, nên câu trả lời lấy từ lịch trực thật.

4.4
6nhóm nghiệp vụ chính, từ đặt lịch tới thanh toán QR

Mã QR không thể chuyền tay

Vấn đề

QR voucher tĩnh chỉ cần chụp lại là chia sẻ mãi mãi, rút cạn một chiến dịch.

Cách giải

QR Live sinh từ khuyến mãi và tự làm mới theo chu kỳ admin đặt, cùng với QR thanh toán động mang đúng mã đơn và số tiền.

Kết quả

3

Nền tảng (Web · Mobile · API) chạy chung một backend NestJS duy nhất

6

Nhóm nghiệp vụ chính, từ đặt lịch, bệnh án đến thanh toán QR

4+

Dịch vụ tích hợp: Zoom Video, StreamChat, AI Chatbot, AWS S3

05

Bài học rút ra

  1. I

    Một backend, ba cửa trước

    Khi web, mobile và quầy lễ tân dùng chung một API, API contract chính là sản phẩm cả đội cùng dựa vào. Thống nhất nó sớm tiết kiệm thời gian hơn bất kỳ framework nào.

  2. II

    Tự làm phần lõi, mua phần còn lại

    Lịch hẹn và bệnh án làm nên sự khác biệt của sản phẩm; chat và video thì không. Dồn công sức vào phần lõi là cách một đội nhỏ làm xong một phạm vi lớn.

  3. III

    AI chỉ nên trả lời điều nó tra được

    Retrieval cho kiến thức, function calling cho dữ kiện. Model viết câu chữ; database quyết định điều gì là đúng.

  4. IV

    Thiết kế theo vai, không theo màn hình

    Bệnh nhân, bác sĩ, lễ tân, quản trị viên nhìn cùng một lịch hẹn theo cách khác nhau. Model hóa permission theo role trước làm mọi màn hình sau đó dễ hơn.