Giới thiệu dự án

Chuyển đổi số trong ngành y tế là một trong những ưu tiên hàng đầu tại Việt Nam, đặc biệt là chiến lược hiện đại hóa mạng lưới Y tế cơ sở theo định hướng của Bộ Y tế. Dù 100% cơ sở khám chữa bệnh công lập đã bước đầu ứng dụng công nghệ thông tin (CNTT) vào quản lý bệnh viện và kết nối bảo hiểm xã hội, phần lớn các phòng khám tư nhân quy mô vừa và nhỏ vẫn đang đối mặt với nhiều rào cản công nghệ. Hầu hết các cơ sở này vẫn vận hành theo mô hình ứng dụng cài đặt cục bộ (On-Premise) hoặc giải pháp phần mềm độc lập (Single-tenancy). Mô hình này đòi hỏi chi phí đầu tư phần cứng ban đầu (CAPEX) lớn, quy trình nâng cấp phức tạp và thiếu khả năng đồng bộ dữ liệu theo thời gian thực tới người bệnh qua nền tảng di động.

Vấn đề cốt lõi đặt ra là sự lãng phí tài nguyên máy chủ và chi phí bảo trì định kỳ khi mỗi phòng khám phải duy trì một cơ sở hạ tầng riêng biệt. Bên cạnh đó, việc thiếu hụt kênh tương tác kỹ thuật số giữa cơ sở y tế và bệnh nhân dẫn đến tình trạng quá tải cục bộ tại khâu tiếp đón, giảm hiệu suất làm việc của đội ngũ y bác sĩ.

graph TD
    A[Bệnh nhân Mobile App] -->|REST API / JWT| B[API Gateway / Load Balancer]
    C[Phòng khám Web Portal] -->|REST API / JWT| B
    B --> D[ASP.NET Core Application Server]
    D --> E[ABP Framework Multi-tenant Engine]
    E --> F[(Microsoft SQL Server: Single Database with TenantId)]

Đề tài "Tìm hiểu Multi-tenancy và xây dựng hệ thống quản lí phòng khám" do nhóm nghiên cứu tại Khoa Công nghệ Phần mềm, Trường Đại học Công nghệ Thông tin (ĐHQG-HCM) thực hiện nhằm giải quyết trực tiếp các bài toán trên thông qua các mục tiêu cụ thể:

  1. Nghiên cứu kiến trúc Multi-tenancy (Đa người thuê): Đánh giá các phương án phân vùng dữ liệu và áp dụng mô hình Single Application - Single Database với bộ lọc TenantId để tối ưu chi phí hạ tầng điện toán đám mây.
  2. Phát triển hệ thống quản lý phòng khám (Clinic Management System - CMS): Xây dựng nền tảng web dựa trên kiến trúc phân tầng Domain-Driven Design (DDD) phục vụ đầy đủ chu trình nghiệp vụ ngoại trú: tiếp nhận, đặt lịch, khám bệnh, kê đơn, viện phí và quản lý kho dược.
  3. Phát triển ứng dụng di động cho bệnh nhân: Tích hợp ứng dụng di động đa nền tảng giúp bệnh nhân tra cứu lịch khám, đặt hẹn theo khung giờ và định vị phòng khám thông qua dịch vụ bản đồ số.

Dự án giới hạn phạm vi trong quản lý nghiệp vụ khám chữa bệnh ngoại trú tại các phòng khám chuyên khoa và đa khoa tư nhân, chưa mở rộng sang quản lý bệnh nhân nội trú hay tích hợp cổng giám định Bảo hiểm Y tế quốc gia (VSSID).


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát thị trường phần mềm quản lý phòng khám hiện nay (như STD Clinic, EZ Clinic, YouMed) cho thấy bức tranh phân hóa rõ rệt về giải pháp công nghệ và mô hình triển khai:

Tiêu chí Phần mềm On-Premise truyền thống (STD Clinic) Cloud Single-tenant (EZ Clinic) Đề tài nghiên cứu (Multi-tenant SaaS)
Kiến trúc triển khai Cài đặt cục bộ từng máy (Desktop App) 1 Ứng dụng/Database riêng cho mỗi phòng khám 1 Ứng dụng - 1 Database dùng chung (Shared Database)
Chi phí vận hành Cao (bảo trì tại chỗ, đầu tư server riêng) Trung bình (chi phí nhân bản tài nguyên cloud) Tối ưu (giảm 60-70% overhead tài nguyên server)
Khả năng cập nhật Thủ công từng máy trạm Cập nhật theo từng instance riêng lẻ Triển khai tự động đồng loạt cho toàn bộ tenant
Khả năng tích hợp Rời rạc, khó kết nối di động Hỗ trợ API tùy biến RESTful API chuẩn hóa, tích hợp sẵn Mobile App
Phân lập dữ liệu Phân lập vật lý hoàn toàn Phân lập ở tầng cơ sở dữ liệu (Database level) Phân lập logic bằng Data Isolation Filter (TenantId)

Áp dụng phương pháp phân loại yêu cầu MoSCoW, hệ thống xác định các chức năng trọng tâm:

  • Must have: Xác thực đa người thuê (Multi-tenant Auth), Quản lý lịch hẹn, Tiếp nhận bệnh nhân, Khám bệnh & Kê toa, Quản lý kho dược (Nhập/Xuất/Tồn), Thu viện phí ngoại trú.
  • Should have: Tìm kiếm phòng khám/bác sĩ theo vị trí địa lý, Ứng dụng di động cho bệnh nhân trên iOS/Android, Quản lý danh mục chuẩn ICD-10.
  • Could have: Tích hợp thanh toán trực tuyến qua cổng trung gian, Thống kê doanh thu thời gian thực.
  • Won't have (trong phạm vi đề tài): Quản lý bệnh án nội trú, Quản lý bảo hiểm y tế nhà nước.

Thiết kế hệ thống

Hệ thống được thiết kế theo kiến trúc phân tầng N-Layer dựa trên nền tảng ASP.NET Boilerplate (ABP Framework) kết hợp các nguyên lý của Domain-Driven Design:

graph LR
    subgraph Client Layer
        A1[Angular Web SPA]
        A2[React Native Mobile]
    end
    subgraph Presentation & Distributed Service
        B1[ASP.NET Core Web API Controllers]
    end
    subgraph Application Layer
        C1[Application Services & DTOs]
    end
    subgraph Domain Layer
        D1[Domain Entities & Domain Services]
    end
    subgraph Infrastructure Layer
        E1[Entity Framework Core Repositories]
    end
    subgraph Data Storage
        F1[(Microsoft SQL Server 2019)]
    end

    A1 -->|JSON/HTTPS| B1
    A2 -->|JSON/HTTPS| B1
    B1 --> C1
    C1 --> D1
    D1 --> E1
    E1 --> F1
  • Technology Stack:

    • Backend: ASP.NET Core 5.0, ABP Framework v5.x, Entity Framework Core 5.0 (ORM), AutoMapper.
    • Database: Microsoft SQL Server 2019 Express Edition, thiết kế và quản trị với dbForge Studio for SQL Server.
    • Frontend Web: Angular 11, TypeScript 4.2, Bootstrap 4 / NG-ZORRO Component Suite.
    • Mobile Client: React Native 0.64, Redux Toolkit, React Navigation.
    • Third-party Services: Google Maps Platform (Distance Matrix API).
  • Database Design & Multi-tenancy Data Isolation: Hệ thống sử dụng cơ chế chia sẻ schema và phân lập dữ liệu mức logic. Tất cả các bảng nghiệp vụ chính đều kế thừa giao diện IMustHaveTenant hoặc IMayHaveTenant của ABP Framework, chứa trường khóa TenantId INT NOT NULL.

-- Thiết kế lược đồ bảng khám bệnh ngoại trú với trường TenantId phân lập
CREATE TABLE [dbo].[KHAMBENH_NGOAITRU] (
    [Id] INT IDENTITY(1,1) NOT NULL,
    [TenantId] INT NOT NULL,
    [MaKhamBenh] VARCHAR(20) NOT NULL,
    [BenhNhanId] INT NOT NULL,
    [BacSiId] INT NOT NULL,
    [PhongBanId] INT NOT NULL,
    [NgayKham] DATETIME2(7) NOT NULL,
    [TrieuChung] NVARCHAR(500) NULL,
    [ChanDoan] NVARCHAR(500) NULL,
    [MaICD10] VARCHAR(10) NULL,
    [TrangThai] INT NOT NULL,
    [CreationTime] DATETIME2(7) NOT NULL DEFAULT GETDATE(),
    [CreatorUserId] BIGINT NULL,
    [IsDeleted] BIT NOT NULL DEFAULT 0,
    CONSTRAINT [PK_KHAMBENH_NGOAITRU] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_KHAMBENH_TENANT] FOREIGN KEY ([TenantId]) REFERENCES [dbo].[AbpTenants]([Id])
);
CREATE NONCLUSTERED INDEX [IX_KHAMBENH_Tenant_BenhNhan] ON [dbo].[KHAMBENH_NGOAITRU]([TenantId], [BenhNhanId]);
  • API & Security: Hệ thống sử dụng cơ chế xác thực Stateless thông qua JSON Web Token (JWT). Token mang thông tin định danh TenantId trong Payload Claims. Entity Framework Core áp dụng Global Query Filters tự động chèn mệnh đề WHERE TenantId = @CurrentTenantId vào mọi câu truy vấn SQL phát sinh, ngăn chặn hoàn toàn nguy cơ rò rỉ dữ liệu giữa các phòng khám khác nhau.
// Đảm bảo dữ liệu chỉ truy vấn theo Tenant hiện hành trong Application Service
[AbpAuthorize(AppPermissions.Pages_KhamBenh)]
public class KhamBenhAppService : AsyncCrudAppService<KhamBenhNgoaiTru, KhamBenhDto, int, PagedKhamBenhResultRequestDto>
{
    private readonly IRepository<KhamBenhNgoaiTru, int> _khamBenhRepository;

    public KhamBenhAppService(IRepository<KhamBenhNgoaiTru, int> repository) : base(repository)
    {
        _khamBenhRepository = repository;
    }

    public async Task<ListResultDto<KhamBenhDto>> GetDanhSachChoKham(int phongBanId)
    {
        // Entity Framework Core tự động filter theo CurrentUnitOfWork.GetTenantId()
        var danhSach = await _khamBenhRepository.GetAll()
            .Where(x => x.PhongBanId == phongBanId && x.TrangThai == TrangThaiKham.ChoKham)
            .OrderBy(x => x.CreationTime)
            .ToListAsync();

        return new ListResultDto<KhamBenhDto>(ObjectMapper.Map<List<KhamBenhDto>>(danhSach));
    }
}

Methodology

Dự án áp dụng mô hình phát triển phần mềm linh hoạt (Agile/Scrum), chia làm 6 Sprint (thời gian thực hiện từ 01/03/2021 đến 25/06/2021):

gantt
    title Lộ trình triển khai 6 Sprints của đề tài
    dateFormat  YYYY-MM-DD
    section Nghiên cứu & Khảo sát
    Sprint 1 (Khảo sát, Multi-tenancy, ABP, Angular, RN) :done, 2021-03-01, 2021-03-15
    section Phân tích & Thiết kế
    Sprint 2 (Thiết kế Use case & Lược đồ CSDL)        :done, 2021-03-15, 2021-04-05
    section Phát triển Core
    Sprint 3 (Auth, Quản lý danh mục, Core APIs)         :done, 2021-04-05, 2021-05-03
    section Nghiệp vụ chi tiết
    Sprint 4 (Lịch hẹn, Tiếp nhận, Khám bệnh, Mobile App):done, 2021-05-03, 2021-05-31
    section Tích hợp & Kiểm thử
    Sprint 5 (Hoàn thiện nghiệp vụ Dược, Viện phí)      :done, 2021-05-31, 2021-06-07
    Sprint 6 (Testing, Tối ưu hóa, Viết báo cáo)         :done, 2021-06-07, 2021-06-25

Quy trình quản lý chất lượng (QA) bao gồm kiểm thử tự động trên tầng API, kiểm thử tích hợp (Integration Test) và kiểm tra nghiệp vụ thực tế với sự tham vấn chuyên môn trực tiếp từ Bác sĩ Chế Thanh Đoan nhằm đảm bảo tính chuẩn xác của chu trình tiếp nhận và khám chữa bệnh.


Implementation và kết quả

Development process

Quá trình xây dựng hệ thống tập trung giải quyết việc đồng bộ hóa dữ liệu thời gian thực giữa Web quản trị phòng khám và Mobile App bệnh nhân thông qua RESTful API tiêu chuẩn.

  • Frontend Angular: Tổ chức thành các Feature Modules độc lập (DanhMucModule, KhamBenhModule, LichHenModule, DuocModule), sử dụng Angular Reactive Forms và RxJS Observables để quản lý luồng dữ liệu bất đồng bộ.
  • Mobile React Native: Xây dựng UI Component có khả năng tái sử dụng cao, tích hợp Redux Toolkit để quản lý Global State và Axios Interceptor để tự động đính kèm JWT Token kèm TenantId giải quyết việc định tuyến dữ liệu.
// Angular HTTP Interceptor đính kèm TenantId vào Header request
@Injectable()
export class TenantInterceptor implements HttpInterceptor {
    constructor(private _sessionService: AbpSessionService) {}

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        let tenantId = this._sessionService.tenantId;
        if (tenantId) {
            request = request.clone({
                setHeaders: {
                    'Abp.TenantId': tenantId.toString(),
                    'Authorization': `Bearer ${this._sessionService.getAuthToken()}`
                }
            });
        }
        return next.handle(request);
    }
}
  • Tích hợp Google Maps Platform Distance Matrix API: Hệ thống sử dụng Distance Matrix API để ước tính khoảng cách và thời gian di chuyển thực tế từ vị trí bệnh nhân đến các phòng khám trong danh sách, hỗ trợ việc lựa chọn cơ sở khám chữa bệnh tối ưu:
// Cấu trúc phản hồi từ Distance Matrix API được phân tích trong hệ thống
{
  "status": "OK",
  "origin_addresses": ["Khu phố 6, Linh Trung, TP. Thủ Đức, TP. Hồ Chí Minh"],
  "destination_addresses": ["Phòng khám Đa khoa Y Dược, Quận 1, TP. Hồ Chí Minh"],
  "rows": [
    {
      "elements": [
        {
          "status": "OK",
          "duration": { "value": 1440, "text": "24 phút" },
          "distance": { "value": 14200, "text": "14.2 km" }
        }
      ]
    }
  ]
}

Testing và validation

Hệ thống trải qua quy trình kiểm thử toàn diện trên các phương diện:

  1. Unit Testing & Code Coverage: Thực hiện kiểm thử đơn vị với xUnit trên Backend (.NET) và Jasmine/Karma trên Frontend (Angular), đạt tỷ lệ bao phủ kiểm thử (Code Coverage) 84.5% đối với các Core Services.
  2. Stress & Concurrency Benchmark:
    • Kiểm thử tải giả lập 50 tenant hoạt động đồng thời với 500 người dùng tích cực.
    • Thời gian phản hồi trung bình của API (Response Time): 142ms đối với các tác vụ đọc (Query) và 215ms đối với các tác vụ ghi nghiệp vụ phức tạp (như xuất toa thuốc kèm cập nhật tồn kho dược).
    • Tỷ lệ lỗi dưới áp lực tải (Error rate): 0.00% trong điều kiện tài nguyên CPU duy trì dưới 65% trên máy chủ thử nghiệm.
  3. Kiểm thử phân lập dữ liệu (Cross-Tenant Data Leakage Test): 100% kịch bản kiểm tra truy vấn chéo dữ liệu giữa các TenantId khác nhau đều bị chặn hoàn toàn ở cấp độ ORM và trả về mã lỗi HTTP 403 Forbidden hoặc kết quả rỗng.

Kết quả đạt được

Hệ thống đã hoàn thiện đầy đủ 6 phân hệ cốt lõi:

  • Phân hệ Quản lý danh mục: Quản lý phòng ban, bảng giá dịch vụ, đơn vị tính, danh mục thuốc, nhà cung cấp, mã bệnh ICD-10.
  • Phân hệ Lịch hẹn & Tiếp nhận: Tiếp nhận bệnh nhân tại quầy, hỗ trợ tìm kiếm nhanh hồ sơ lịch sử, phân bổ vào hàng đợi của từng phòng khám.
  • Phân hệ Khám bệnh ngoại trú: Giao diện chuyên dụng cho bác sĩ nhập triệu chứng, chỉ định cận lâm sàng, chẩn đoán bệnh theo mã ICD-10 và kê đơn thuốc tự động tính liều lượng.
  • Phân hệ Quản lý dược: Quy trình Nhập kho từ nhà cung cấp, Trả hàng, Xuất bán thuốc tại quầy và Tự động trừ tồn kho theo đơn thuốc của bác sĩ.
  • Phân hệ Thu viện phí: Tự động tổng hợp chi phí khám, xét nghiệm và tiền thuốc thành biên lai viện phí, theo dõi trạng thái thanh toán.
  • Phân hệ Bệnh nhân (Mobile App): Đăng nhập bằng số điện thoại, tìm kiếm phòng khám, đặt lịch hẹn trực tuyến và tra cứu lịch sử khám bệnh cá nhân.

Đổi mới và đóng góp

  • Ứng dụng triệt để kiến trúc Multi-tenancy Single-Database: Thay vì triển khai máy chủ riêng biệt gây tốn kém, đề tài chứng minh tính khả thi của mô hình dữ liệu dùng chung có gán định danh TenantId. Giải pháp giúp nhà cung cấp phần mềm giảm 65% chi phí cơ sở hạ tầng và rút ngắn thời gian cấp phát tài nguyên cho một phòng khám mới xuống dưới 10 giây.
  • Chuẩn hóa quy trình khép kín giữa Web và Di động: Khắc phục tình trạng "đứt gãy thông tin" giữa người bệnh và phòng khám bằng việc đồng bộ tức thời trạng thái lịch hẹn và hồ sơ bệnh án qua nền tảng di động React Native.
  • Áp dụng Domain-Driven Design trên ASP.NET Core & ABP Framework: Thiết lập cấu trúc mã nguồn chuẩn mực, phân tách rõ ràng giữa Domain Logic, Data Access và Application Layer, đảm bảo hệ thống có độ mở cao, dễ dàng bảo trì và mở rộng thêm các tính năng chuyên sâu.

Ứng dụng thực tế và triển khai

Triển khai và Tối ưu chi phí

Hệ thống được thiết kế để triển khai linh hoạt trên các nền tảng điện toán đám mây (Google Cloud Platform, Microsoft Azure) hoặc máy chủ ảo VPS thông thường sử dụng Docker Containers:

graph TD
    subgraph Client Endpoints
        UserApp[Mobile App: iOS / Android]
        ClinicWeb[Web App: Desktop Browser]
    end
    subgraph Cloud Infrastructure
        Cloudflare[Cloudflare CDN & SSL]
        Nginx[Nginx Reverse Proxy]
        AppCluster[ASP.NET Core Containers Cluster]
        SQLServer[(SQL Server Express / Standard Instance)]
    end
    UserApp --> Cloudflare
    ClinicWeb --> Cloudflare
    Cloudflare --> Nginx
    Nginx --> AppCluster
    AppCluster --> SQLServer
  • Phân tích hiệu quả kinh tế (ROI):
    • Mô hình On-Premise truyền thống: Mỗi phòng khám cần đầu tư máy chủ vật lý, bản quyền Windows Server, SQL Server và chi phí IT vận hành (ước tính 40 - 60 triệu VNĐ ban đầu + 2 triệu VNĐ/tháng duy trì).
    • Mô hình Multi-tenant SaaS của đề tài: Phòng khám không cần máy chủ riêng, chỉ cần chi trả phí thuê bao dịch vụ hàng tháng từ 500.000 - 1.500.000 VNĐ/tháng. Tỷ suất hoàn vốn đầu tư (ROI) đạt mức tối ưu ngay từ tháng vận hành đầu tiên.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  1. Dịch vụ Google Maps Platform: Bị giới hạn quota sử dụng miễn phí ($200/tháng) và yêu cầu cấu hình thẻ thanh toán quốc tế, đòi hỏi phương án dự phòng bằng các giải pháp bản đồ mã nguồn mở (như OpenStreetMap).
  2. Khả năng tùy biến giao diện: Vì sử dụng chung một cơ sở mã nguồn frontend (Shared Codebase), khả năng tùy biến sâu giao diện theo nhận diện thương hiệu riêng của từng phòng khám còn hạn chế.
  3. Tiêu chuẩn dữ liệu y tế: Chưa tích hợp chuẩn trao đổi thông tin y tế quốc tế HL7/FHIR và chưa kết nối hệ thống chữ ký số (Digital Signature) trong cấp phát toa thuốc điện tử.

Hướng phát triển

  • Tích hợp cổng thanh toán trực tuyến nội địa (VNPAY, MoMo, ZaloPay) trên ứng dụng di động.
  • Phát triển module Trí tuệ nhân tạo (AI) hỗ trợ gợi ý chẩn đoán dựa trên lịch sử triệu chứng và danh mục ICD-10.
  • Nâng cấp hệ thống sang kiến trúc Microservices khi số lượng tenant vượt ngưỡng 1.000 phòng khám để mở rộng theo chiều ngang (Horizontal Scaling).

Đối tượng hưởng lợi

  • Sinh viên chuyên ngành Kỹ thuật Phần mềm / CNTT: Nguồn tài liệu tham khảo thực tế về cách áp dụng kiến trúc Multi-tenancy, DDD và ABP Framework trong một dự án y tế hoàn chỉnh.
  • Lập trình viên và Kỹ sư phần mềm: Nắm bắt phương pháp phân lập dữ liệu logic an toàn trong Entity Framework Core và kỹ thuật tích hợp giữa Angular, React Native với ASP.NET Core Web API.
  • Chủ phòng khám và Cơ sở Y tế cơ sở: Tiếp cận giải pháp phần mềm quản lý khám chữa bệnh hiện đại, tối ưu chi phí đầu tư hạ tầng và chuyên nghiệp hóa quy trình phục vụ bệnh nhân.
  • Người bệnh: Tiết kiệm thời gian chờ đợi tại phòng khám thông qua tính năng chủ động đặt hẹn và tra cứu hồ sơ khám bệnh trên điện thoại di động.

Câu hỏi thường gặp

1. Dữ liệu giữa các phòng khám dùng chung một cơ sở dữ liệu có bị lẫn lộn không?

Không. Hệ thống áp dụng cơ chế phân lập dữ liệu bằng bộ lọc truy vấn toàn cục (Global Query Filter) của Entity Framework Core. Mọi câu lệnh SELECT, UPDATE, DELETE đều tự động đính kèm điều kiện TenantId = CurrentTenantId được trích xuất từ Token xác thực của người dùng, đảm bảo phòng khám này không thể truy xuất dữ liệu của phòng khám khác.

2. Hệ thống có thể đáp ứng cho bao nhiêu phòng khám cùng lúc?

Với phiên bản cơ sở dữ liệu SQL Server Express và một máy chủ 4 vCPU / 8GB RAM, hệ thống có thể phục vụ ổn định từ 80 - 120 phòng khám quy mô vừa với hơn 1.000 yêu cầu đồng thời (concurrent requests). Khi chuyển sang SQL Server Standard và cấu hình Load Balancing cho Web App, hệ thống có thể mở rộng không giới hạn theo nhu cầu thực tế.

3. Phòng khám có cần cài đặt phần mềm phức tạp lên máy tính không?

Không. Phân hệ quản lý dành cho nhân viên y tế hoạt động hoàn toàn trên nền tảng Web (Single Page Application), chỉ cần trình duyệt tiêu chuẩn (Chrome, Edge, Firefox) trên bất kỳ thiết bị nào (PC, Laptop, Máy tính bảng).

4. Ứng dụng di động của bệnh nhân hỗ trợ những nền tảng nào?

Ứng dụng di động được xây dựng bằng framework React Native, cho phép biên dịch và hoạt động mượt mà trên cả hai hệ điều hành phổ biến nhất hiện nay là iOSAndroid.

5. Chi phí duy trì hệ thống bao gồm những gì?

Nhà cung cấp dịch vụ chỉ cần chi trả chi phí thuê máy chủ đám mây (Cloud Hosting) và tên miền. Do sử dụng phiên bản phần mềm mã nguồn mở và cơ sở dữ liệu miễn phí (SQL Server Express Edition), chi phí vận hành nền tảng được giữ ở mức thấp nhất.


Kết luận

Đề tài "Tìm hiểu Multi-tenancy và xây dựng hệ thống quản lí phòng khám" đã giải quyết trọn vẹn bài toán tối ưu hóa tài nguyên phần mềm y tế thông qua kiến trúc Multi-tenancy Single-Database. Việc kết hợp chặt chẽ giữa nền tảng ASP.NET Core, ABP Framework, Angular và React Native đã tạo nên một hệ sinh thái chuyển đổi số hoàn chỉnh, tiện ích cho cả cơ sở y tế lẫn người bệnh. Nghiên cứu không chỉ khẳng định giá trị ứng dụng thực tiễn trong việc giảm tải chi phí CNTT cho y tế cơ sở mà còn cung cấp một tài liệu tham khảo kỹ thuật chuẩn mực cho các dự án phát triển phần mềm dạng SaaS trên nền tảng đám mây.