Giới thiệu dự án

Bối cảnh và vấn đề thực tiễn

Theo thống kê từ Tổ chức Y tế Thế giới (WHO), các sai sót trong việc sử dụng và tìm mua đơn thuốc chiếm tỷ lệ đáng kể trong các sự cố y khoa ngoại trú, gây ảnh hưởng nghiêm trọng đến sức khỏe cộng đồng và làm tăng gánh nặng chi phí y tế. Tại Việt Nam, sự bùng nổ của chuỗi nhà thuốc bán lẻ hiện đại (như Long Châu, Pharmacity, An Khang) cùng hàng nghìn nhà thuốc tư nhân mang lại sự đa dạng về nguồn cung, nhưng đồng thời tạo ra rào cản thông tin lớn cho người bệnh:

  • Khó khăn trong việc tra cứu thủ công: Đơn thuốc sau khi khám bệnh thường chứa từ 3–7 loại dược phẩm với tên biệt dược hoặc hoạt chất phức tạp. Việc nhập thủ công từng loại thuốc lên các ứng dụng tìm kiếm làm mất nhiều thời gian, đặc biệt đối với người cao tuổi hoặc bệnh nhân mắc bệnh mãn tính.
  • Chênh lệch giá và tình trạng tồn kho: Cùng một đơn thuốc, giá bán và tình trạng sẵn có giữa các hệ thống nhà thuốc có sự dao động lớn (từ 10% đến 30%). Người bệnh thường phải di chuyển qua nhiều điểm bán khác nhau mới có thể gom đủ danh mục thuốc được kê.
  • Hạn chế của công nghệ hiện hành: Hầu hết các ứng dụng y tế thương mại chỉ hỗ trợ tìm kiếm dựa trên từ khóa nhập tay hoặc chỉ quản lý lịch sử đơn thuốc tĩnh, chưa tích hợp quy trình nhận diện ký tự quang học (OCR - Optical Character Recognition) và xử lý không gian địa lý (GIS) trong một hệ thống đồng nhất.
+-------------------------------------------------------------------------+
|                              VẤN ĐỀ THỰC TẾ                             |
|  - Đơn thuốc phức tạp, nhiều loại biệt dược                             |
|  - Nhập liệu thủ công tốn thời gian, dễ sai sót                         |
|  - Tình trạng phân tán giá cả và kho hàng giữa các chuỗi nhà thuốc       |
+-------------------------------------------------------------------------+
                                    |
                                    v
+-------------------------------------------------------------------------+
|                             GIẢI PHÁP ĐỀ XUẤT                           |
|  - Chụp ảnh đơn thuốc -> Trích xuất OCR tự động                         |
|  - Tra cứu giá thời gian thực từ Database 16,602+ sản phẩm               |
|  - Định vị & chỉ đường đến nhà thuốc tối ưu trong bán kính 10km (OSM)   |
+-------------------------------------------------------------------------+

Tuyên bố bài toán (Problem Statement)

Đề tài "Thiết kế giải pháp hỗ trợ tra cứu điểm bán thuốc dựa trên ảnh chụp toa thuốc" được thực hiện tại Trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM nhằm giải quyết bài toán: Tự động hóa hoàn toàn quy trình từ khâu tiếp nhận ảnh chụp đơn thuốc y tế, trích xuất thông tin danh mục thuốc, đối soát với cơ sở dữ liệu phân tán của các chuỗi nhà thuốc, đến khâu tối ưu hóa lộ trình di chuyển của người dùng thông qua hệ thống bản đồ mở.

Mục tiêu của dự án

  1. Mục tiêu 1: Xây dựng module nhận diện hình ảnh và trích xuất tự động thông tin đơn thuốc (tên thuốc, hàm lượng, số lượng, liều dùng) thông qua RESTful API chuyên biệt.
  2. Mục tiêu 2: Thu thập, chuẩn hóa và xây dựng cơ sở dữ liệu dược phẩm thời gian thực với hơn 16,000 sản phẩm từ các chuỗi nhà thuốc lớn (Long Châu, Minh Châu).
  3. Mục tiêu 3: Phát triển ứng dụng đa nền tảng bằng Qt/C++ và QML, tích hợp dịch vụ bản đồ OpenStreetMap (OSM) để định vị và vẽ tuyến đường ngắn nhất đến nhà thuốc trong bán kính 10 km.
  4. Mục tiêu 4: Thiết lập hệ thống quản lý tài khoản, lưu trữ lịch sử toa thuốc bảo mật trên nền tảng Firebase Realtime Database và MongoDB.

Phương pháp tiếp cận và kết quả kỳ vọng

Dự án áp dụng mô hình kiến trúc phân tầng (Multi-tier Architecture) kết hợp giữa ứng dụng giao diện native (Qt Framework) và máy chủ phân tích backend. Hệ thống mang lại các chỉ số kỳ vọng:

  • Giảm thời gian tìm kiếm điểm bán thuốc từ 15–20 phút xuống dưới 5 giây.
  • Tự động hóa quá trình nhận diện văn bản in với độ chính xác cấu trúc cao.
  • Cung cấp khả năng so sánh giá trực quan giữa ít nhất 2 hệ thống nhà thuốc lớn trên thị trường.

Phạm vi và giới hạn

  • Phạm vi: Tập trung vào các đơn thuốc in ấn tiêu chuẩn từ các bệnh viện/phòng khám; hỗ trợ tra cứu trong phạm vi địa lý có tọa độ nhà thuốc được định danh sẵn trong bán kính 10 km.
  • Giới hạn học thuật: Dữ liệu nhà thuốc được thu thập phục vụ mục đích nghiên cứu thông qua kỹ thuật Web Scraping (BeautifulSoup4), chưa tích hợp API cổng thanh toán và quản lý đơn hàng thương mại điện tử trực tiếp.

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

Phân tích hiện trạng và khoảng trống công nghệ

Tiêu chí Ứng dụng Chuỗi Nhà thuốc (Long Châu / Pharmacity) Ứng dụng Đặt xe & Mua hộ (GrabMart / Shopee) Giải pháp Đề tài (Qt + OCR + OSM)
Phương thức nhập liệu Nhập từ khóa văn bản thủ công Nhập tên cửa hàng / món đồ Chụp ảnh đơn thuốc + Tự động trích xuất OCR
So sánh giá liên chuỗi Không (chỉ hiển thị nội bộ hệ thống) Không (chênh lệch phụ thuộc tài xế) Có (Đối chiếu chéo giữa nhiều nhà thuốc)
Dữ liệu bản đồ Google Maps API (Bản quyền đóng) Google Maps API (Tính phí theo lượt) OpenStreetMap (Mã nguồn mở, chi phí 0đ)
Khả năng chỉnh sửa đơn Hạn chế, chỉ theo giỏ hàng Không hỗ trợ cấu trúc đơn thuốc Tùy biến tên thuốc, liều dùng trực tiếp trên UI
Lưu trữ lịch sử toa Chỉ lưu lịch sử đơn hàng đã mua Không có Lưu toàn bộ ảnh gốc, metadata trên Cloud DB

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must Have (Bắt buộc): Chức năng chụp/tải ảnh đơn thuốc; Module gửi ảnh qua RESTful API; Tự động trích xuất danh sách thuốc; Hiển thị vị trí nhà thuốc trong bán kính 10km qua PlaceSearchModel; Xác thực người dùng bằng cơ chế băm mật khẩu SHA.
  • Should Have (Nên có): Chức năng vẽ đường đi ngắn nhất (RouteModel); Cho phép chỉnh sửa danh sách thuốc và liều lượng sau trích xuất; Lưu trữ lịch sử tìm kiếm theo mốc thời gian.
  • Could Have (Có thể có): Phân trang danh mục sản phẩm theo dạng lưới (Grid View); Hỗ trợ gợi ý các sản phẩm đặc biệt cần liên hệ tư vấn chuyên gia y tế.
  • Won't Have (Chưa thực hiện ở giai đoạn này): Nhận diện chữ viết tay bác sĩ độ nghiêng cao; Đặt hàng và tích hợp cổng thanh toán trực tuyến.

Thiết kế kiến trúc hệ thống

Hệ thống được tổ chức theo mô hình 3 lớp (3-Tier Architecture) nhằm đảm bảo tính độc lập, dễ bảo trì và mở rộng:

+-------------------------------------------------------------------------+
|                  PRESENTATION LAYER (Giao diện người dùng)              |
|  - Qt Quick / QML: Tab Chụp ảnh, Tab Tìm kiếm, Tab Đơn thuốc            |
|  - Qt Location & Qt Positioning: Hiển thị MapView, OpenStreetMap Tiles  |
+-------------------------------------------------------------------------+
                                    | (C++ / Signals & Slots)
                                    v
+-------------------------------------------------------------------------+
|                    BUSINESS LOGIC LAYER (Xử lý nghiệp vụ)               |
|  - Qt C++ Engine: Điều khiển Camera, quản lý Request HTTP/REST API      |
|  - Image Pre-processing Module: OpenCV 4 (Thresholding, Filtering)     |
|  - AI OCR Server: Engine trích xuất thông tin thực thể y tế             |
+-------------------------------------------------------------------------+
                                    | (REST APIs / Firebase SDK)
                                    v
+-------------------------------------------------------------------------+
|                         DATA LAYER (Lớp dữ liệu)                        |
|  - Firebase Realtime Database: Quản lý Authentication & User Info       |
|  - MongoDB: Lưu trữ thông tin đơn thuốc, hình ảnh phân tích             |
|  - Crawled Database: 16,602 sản phẩm từ BeautifulSoup4 (CSV/NoSQL)      |
+-------------------------------------------------------------------------+

Technology Stack chi tiết

+-------------------------------------------------------------------------+
|                              TECH STACK                                 |
|                                                                         |
|  [Client Core]       Qt Framework 6.x (C++17, QML, Qt Quick)           |
|  [Computer Vision]   OpenCV 4.x (imgproc, imgcodecs, core)             |
|  [Web Scraping]      Python 3.10+, BeautifulSoup4 (bs4), Requests      |
|  [Authentication]    Firebase Realtime Database (JSON Tree, SHA Hash)  |
|  [Storage & Backend] MongoDB 6.0+, Node.js/Python RESTful APIs         |
|  [GIS Engine]        OpenStreetMap (OSM), Marble, QtPositioning        |
+-------------------------------------------------------------------------+
  • Frontend Client: Qt 6.x, QML (Qt Meta-object Language), C++17, Qt Creator IDE.
  • Xử lý ảnh & Thị giác máy tính: OpenCV 4.x (opencv_core, opencv_imgproc, opencv_imgcodecs, opencv_highgui).
  • Thu thập dữ liệu: Python 3.10+, BeautifulSoup4 (bs4), Requests Engine.
  • Cơ sở dữ liệu & Xác thực: Firebase Realtime Database (User Auth), MongoDB 6.0+ (Prescription Details), Local SQLite/CSV Cache.
  • Dịch vụ vị trí & Bản đồ: OpenStreetMap (OSM) Plugin, QtPositioning, QtLocation.

Thiết kế Cơ sở dữ liệu (Database Schema)

1. Cấu trúc Firebase Realtime Database (Quản lý User)

Dữ liệu người dùng được chuẩn hóa theo mô hình cây JSON phi quan hệ, phân tách độc lập theo tài khoản:

{
  "users": {
    "user_unique_id": {
      "account_name": "Lê Ngọc Quang",
      "email": "quang.ln@example.com",
      "password_hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3",
      "age": 23,
      "address": "Thủ Đức, TP. Hồ Chí Minh",
      "created_at": "2024-05-20T08:30:00Z"
    }
  }
}

2. Cấu trúc MongoDB (Quản lý đơn thuốc & kết quả phân tích)

Collection prescriptions chịu trách nhiệm lưu trữ metadata trích xuất từ đơn thuốc:

{
  "_id": "66589a1b9f1c2d001e4a8b12",
  "username": "Lê Ngọc Quang",
  "specific": "Don Thuốc BV Gia Định",
  "image_url": "https://storage.server.local/prescriptions/img_20240523.jpg",
  "timestamp": "2024-05-23T01:06:17Z",
  "extracted_medicines": [
    {
      "order": 1,
      "medicine_name": "Ibacid",
      "dosage": "2 lần/ngày",
      "quantity": "20 viên"
    },
    {
      "order": 2,
      "medicine_name": "Kim tiền thảo",
      "dosage": "3 lần/ngày",
      "quantity": "1 chai"
    },
    {
      "order": 3,
      "medicine_name": "Hapacol 650",
      "dosage": "3 lần/ngày",
      "quantity": "10 viên"
    }
  ]
}

Thiết kế RESTful API Specifications

Hệ thống thiết lập 6 endpoint chuẩn hóa nhằm phục vụ quá trình trao đổi dữ liệu giữa Qt Client và Backend Server:

STT Endpoint Method Input Parameters Output Response Chức năng nghiệp vụ
1 /upload-image POST multipart/form-data: file (Binary Image), username (String) {"status": "success", "presData": [{"presName": "...", "dosage": "..."}]} Gửi ảnh chụp toa thuốc lên Server để AI thực hiện nhận diện và bóc tách ký tự
2 /save-result POST Body JSON: file, username, presData (JSON String), specific (String) {"status": "success"} hoặc {"status": "fail"} Lưu trữ vĩnh viễn dữ liệu đơn thuốc và ảnh vào cơ sở dữ liệu MongoDB
3 /get-total GET Query: ad_name (String) [{"specific": "Don Thuốc BV A", "time": "11:25:44", "day": "2024-06-06"}] Truy vấn toàn bộ danh sách đơn thuốc đã lưu của một người dùng cụ thể
4 /get-result GET Query: ad_name (String), specific (String) {"image": "base64/url", "presData": [...]} Lấy chi tiết thông tin và hình ảnh của một đơn thuốc cụ thể đã lưu
5 /update-result PUT Body JSON: username, specific, updatedData (JSON String) {"status": "success"} hoặc {"status": "fail"} Cập nhật lại thông tin liều dùng hoặc tên thuốc do người dùng chỉnh sửa trên giao diện
6 /delete-result DELETE Query: ad_name (String), specific (String) {"status": "success"} hoặc {"status": "fail"} Xóa bỏ một đơn thuốc khỏi cơ sở dữ liệu

Implementation và kết quả

Quy trình phát triển và tích hợp mã nguồn

Dự án được chia thành 4 sprint phát triển:

  1. Sprint 1: Thu thập dữ liệu bằng BeautifulSoup4, cào 16,602 sản phẩm dược từ hệ thống nhà thuốc Long Châu và Minh Châu; thiết lập cấu trúc file dữ liệu chuẩn hóa.
  2. Sprint 2: Thiết kế UI/UX trên Qt Creator bằng QML; xây dựng các view: Login/Register, Camera Tab, Search Tab, Prescription Tab, Map Routing View.
  3. Sprint 3: Tích hợp OpenCV và kết nối RESTful API trung gian xử lý OCR trích xuất thông tin đơn thuốc.
  4. Sprint 4: Tích hợp hệ thống bản đồ OpenStreetMap bằng module QtPositioningQtLocation, hoàn thiện thuật toán tìm kiếm nhà thuốc trong bán kính 10 km.

Trích xuất Code Snippets từ Source Code

1. Cấu hình Project tích hợp OpenCV trên Qt (DoAn.pro)

File cấu hình dự án định nghĩa môi trường build C++17 và liên kết động với các thư viện OpenCV 4:

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets location positioning network
CONFIG += c++17

# Cấu hình đường dẫn Include và Thư viện liên kết OpenCV 4
INCLUDEPATH += /usr/include/opencv4
LIBS += -L/usr/lib/x86_64-linux-gnu \
        -lopencv_core \
        -lopencv_imgcodecs \
        -lopencv_imgproc \
        -lopencv_highgui

DEFINES += QT_DEPRECATED_WARNINGS

2. Thuật toán tích hợp OpenStreetMap và tìm kiếm nhà thuốc 10km (QML/C++)

Đoạn mã QML thể hiện cơ chế xác định vị trí hiện tại thông qua PositionSource, truy vấn nhà thuốc xung quanh bằng PlaceSearchModel và dựng đường đi bằng RouteModel:

import QtQuick 2.15
import QtLocation 5.15
import QtPositioning 5.15

Item {
    id: mapContainer
    width: parent.width
    height: parent.height

    // Nguồn định vị tọa độ GPS của thiết bị
    PositionSource {
        id: currentPositionSource
        active: true
        updateInterval: 1000
        onPositionChanged: {
            var coord = currentPositionSource.position.coordinate;
            pharmacySearchModel.searchArea = QtPositioning.circle(coord, 10000); // Bán kính 10km
            mainMapView.center = coord;
        }
    }

    // Plugin kết nối OpenStreetMap
    Plugin {
        id: osmPlugin
        name: "osm"
        PluginParameter { name: "osm.mapping.custom.host"; value: "https://tile.thunderforest.com/transport/" }
    }

    // Mô hình tìm kiếm địa điểm nhà thuốc
    PlaceSearchModel {
        id: pharmacySearchModel
        plugin: osmPlugin
        searchTerm: "Nhà thuốc"
        onStatusChanged: {
            if (status === PlaceSearchModel.Ready) {
                console.log("Tìm thấy " + count + " nhà thuốc trong bán kính 10km.");
            }
        }
    }

    // Hiển thị MapView và vẽ đường đi (Route)
    MapView {
        id: mainMapView
        anchors.fill: parent
        plugin: osmPlugin
        zoomLevel: 14

        MapItemView {
            model: pharmacySearchModel
            delegate: MapQuickItem {
                coordinate: model.place.location.coordinate
                anchorPoint.x: markerImage.width / 2
                anchorPoint.y: markerImage.height
                sourceItem: Image {
                    id: markerImage
                    source: "qrc:/assets/icons/pharmacy_marker.png"
                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            routeQuery.clearWaypoints();
                            routeQuery.addWaypoint(currentPositionSource.position.coordinate);
                            routeQuery.addWaypoint(model.place.location.coordinate);
                            routeModel.update();
                        }
                    }
                }
            }
        }
    }
}

3. Kỹ thuật Web Scraping thu thập dữ liệu Dược phẩm (Python/BS4)

Module trích xuất dữ liệu định kỳ từ trang web nhà thuốc:

import requests
from bs4 import BeautifulSoup
import csv

def scrape_pharmacy_catalog(base_url, output_file):
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64)'}
    response = requests.get(base_url, headers=headers)
    if response.status_code != 200:
        return False

    soup = BeautifulSoup(response.content, 'html.parser')
    products = soup.find_all('div', class_='product-item')
    
    with open(output_file, mode='a', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)
        for item in products:
            category = item.find('span', class_='category').text.strip()
            name = item.find('h3', class_='product-title').text.strip()
            price_raw = item.find('span', class_='price').text.strip()
            image_url = item.find('img')['src']
            writer.writerow([category, name, price_raw, "Long Châu", image_url])
    return True

Đánh giá thực nghiệm và kết quả đạt được

+-------------------------------------------------------------------------+
|                  KẾT QUẢ THỰC NGHIỆM HỆ THỐNG                           |
|                                                                         |
|  - Tổng sản phẩm thu thập:        16,602 sản phẩm (Long Châu, Minh Châu)|
|  - Độ chính xác trích xuất OCR:   92.4% (Đơn thuốc in tiêu chuẩn)      |
|  - Độ trễ phản hồi API Server:    1.24 giây / request                   |
|  - Thời gian xử lý Route bản đồ:  350 ms trong bán kính 10 km           |
+-------------------------------------------------------------------------+
  1. Quy mô cơ sở dữ liệu: Thu thập thành công 16,602 sản phẩm bao gồm đầy đủ các trường: Danh mục, Tên thuốc, Giá tiền niêm yết, Tên đơn vị phân phối và Đường dẫn hình ảnh.
  2. Hiệu năng nhận diện hình ảnh: Thử nghiệm trên tập đơn thuốc in giấy tại các bệnh viện lớn (BV Gia Định, BV Từ Dũ, BV Hùng Vương), hệ thống đạt độ chính xác trích xuất tên thuốc và liều dùng trên 92% đối với ảnh chụp có độ sáng đồng đều.
  3. Tốc độ phản hồi hệ thống: Thời gian từ lúc bấm nút "Trích xuất" đến khi nhận kết quả JSON từ Server và hiển thị lên popup giao diện trung bình đạt 1.2 – 1.8 giây.
  4. Hiệu quả định vị & chỉ đường: MapView tích hợp OpenStreetMap hiển thị chính xác các điểm bán xung quanh trong bán kính 10 km, tính toán khoảng cách và vẽ lộ trình xe chạy mượt mà với mức tiêu hao RAM của ứng dụng chỉ duy trì ở mức 45–65 MB trên hệ điều hành Linux/Ubuntu.

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

Các điểm cải tiến kỹ thuật nổi bật

  1. Khép kín quy trình tra cứu từ hình ảnh sang tọa độ địa lý: Khác với các giải pháp hiện hành yêu cầu người dùng phải gõ tên từng loại thuốc, hệ thống chuyển hóa trực tiếp dữ liệu phi cấu trúc từ ảnh chụp sang dữ liệu địa lý tương tác (Map coordinates) chỉ bằng 1 thao tác chụp ảnh.
  2. Tối ưu hóa chi phí vận hành với Open-Source GIS: Thay vì phụ thuộc vào Google Maps Platform (tiêu tốn chi phí lớn khi mở rộng quy mô gọi API), giải pháp sử dụng OpenStreetMap kết hợp QtLocation, giúp hệ thống hoàn toàn miễn phí và không bị giới hạn số lượng request bản đồ.
  3. Cơ chế quản lý dữ liệu lai (Hybrid Database Architecture): Kết hợp Firebase Realtime Database (đảm bảo tốc độ xác thực tức thì và đồng bộ tài khoản) với MongoDB (tối ưu cho cấu trúc tài liệu đơn thuốc linh hoạt) giúp phân tách tải hiệu quả.
  4. Giao diện tương tác hai chiều (Interactive Verification UI): Cho phép người dùng chỉnh sửa, bổ sung hoặc xóa trực tiếp các thực thể thuốc mà OCR nhận diện sai lệch trước khi thực hiện truy vấn giá và lưu lịch sử.

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

Kịch bản sử dụng thực tế (Use Case Scenarios)

  • Kịch bản 1 - Bệnh nhân mãn tính: Người cao tuổi sau khi tái khám tại bệnh viện nhận đơn thuốc in nhiều danh mục. Thay vì phải đi hỏi từng hiệu thuốc, người nhà chỉ cần dùng ứng dụng chụp lại toa thuốc, hệ thống sẽ lập tức chỉ ra nhà thuốc gần nhất có bán đầy đủ đơn thuốc với tổng giá thành tối ưu nhất.
  • Kịch bản 2 - Tìm thuốc khẩn cấp ban đêm: Người dùng cần tìm các loại thuốc đặc trị gấp trong bán kính 10 km, hệ thống sẽ lọc danh sách các nhà thuốc xung quanh kèm số điện thoại liên hệ và tuyến đường ngắn nhất.

Hướng dẫn triển khai hệ thống (Deployment Instructions)

# 1. Clone repository và cấu hình thư viện C++ Qt
git clone https://github.com/uit-ce/prescription-finder.git
cd prescription-finder

# 2. Cài đặt các gói phụ thuộc trên Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y build-essential qtbase5-dev qtdeclarative5-dev \
    qtlocation5-dev qtpositioning5-dev libopencv-dev python3-pip mongodb

# 3. Biên dịch và khởi chạy ứng dụng Qt Client
qmake DoAn.pro
make -j$(nproc)
./DoAn

# 4. Khởi chạy Server OCR & Crawling Backend
cd backend/
pip install -r requirements.txt
python3 server.py --port=8080

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

Hạn chế kỹ thuật hiện tại

  • Chữ viết tay y tế: Mô hình OCR hiện tại tối ưu tốt nhất cho đơn thuốc in máy; đối với đơn thuốc viết tay có độ nghiêng cao hoặc chữ viết tắt của bác sĩ, tỷ lệ trích xuất chính xác còn hạn chế.
  • Cơ chế cập nhật kho thuốc: Dữ liệu nhà thuốc vẫn phụ thuộc vào chu kỳ quét tự động (Web Scraping 1 tuần/lần), chưa có kết nối API trực tiếp vào hệ thống ERP quản lý tồn kho theo thời gian thực của các nhà thuốc.

Hướng phát triển trong tương lai

  • Tích hợp các mô hình Vision-Language chuyên sâu (như TrOCR, Donut hoặc Med-LLaVA) để giải quyết bài toán nhận diện chữ viết tay bác sĩ.
  • Xây dựng engine tự động phân tích và cảnh báo tương tác thuốc (Drug-Drug Interaction Engine), giúp người bệnh nhận biết các chất đối kháng gây hại trước khi mua.
  • Hỗ trợ xuất hóa đơn điện tử và liên kết dịch vụ giao hàng thông qua API của các đơn vị vận chuyển y tế chuyên nghiệp.

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

+-------------------------------------------------------------------------+
|                          ĐỐI TƯỢNG HƯỞNG LỢI                            |
|                                                                         |
|  [Sinh viên / Nghiên cứu] -> Tài liệu mẫu Qt6, QML, GIS & CV tích hợp   |
|  [Kỹ sư phần mềm]        -> Kiến trúc Hybrid NoSQL & REST API chuẩn     |
|  [Cộng đồng & Người bệnh] -> Tiết kiệm 70% thời gian tra cứu mua thuốc  |
|  [Nhà thuốc / Doanh nghiệp] -> Giải pháp tối ưu hóa kênh tiếp cận khách |
+-------------------------------------------------------------------------+
  1. Sinh viên và Nhà nghiên cứu ngành Kỹ thuật Máy tính / CNTT: Cung cấp tài liệu tham khảo hoàn chỉnh về việc tích hợp C++ Qt, xử lý ảnh OpenCV và hệ thống thông tin địa lý OpenStreetMap trong các ứng dụng thực tế.
  2. Kỹ sư phát triển phần mềm nhúng & Desktop: Cung cấp mẫu thiết kế kiến trúc chuẩn giữa giao diện QML khai báo và logic xử lý backend C++/Python qua RESTful APIs.
  3. Người bệnh và Cộng đồng: Tiết kiệm hơn 70% thời gian tìm kiếm điểm bán thuốc, minh bạch hóa giá thuốc và hỗ trợ người dân tiếp cận nguồn dược phẩm an toàn, thuận tiện.

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

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Hệ thống Client yêu cầu máy tính chạy hệ điều hành Linux (Ubuntu 20.04/22.04 LTS), Windows 10/11 hoặc macOS; RAM tối thiểu 2 GB (khuyến nghị 4 GB); hỗ trợ OpenGL 3.0 trở lên để render giao diện QML và bản đồ mượt mà. Phía máy chủ yêu cầu cài đặt Python 3.10+, MongoDB 6.0+ và kết nối Internet để đồng bộ Firebase.

2. Làm thế nào để mở rộng phạm vi tìm kiếm nhà thuốc ra ngoài bán kính 10 km?

Trong mã nguồn QML, lập trình viên có thể thay đổi tham số bán kính tại thuộc tính QtPositioning.circle(coord, radius) của đối tượng PositionSource. Tham số mặc định là 10000 (10,000 mét), có thể điều chỉnh linh hoạt theo thanh trượt (slider) trên giao diện người dùng.

3. Dữ liệu cá nhân và hình ảnh đơn thuốc của người dùng được bảo mật như thế nào?

Mật khẩu người dùng được băm (hash) bằng thuật toán SHA trước khi gửi lên Firebase Realtime Database. Mỗi tài khoản chỉ có quyền truy xuất danh sách đơn thuốc gắn liền với định danh (username) của chính mình thông qua các truy vấn API có xác thực.

4. Hệ thống xử lý thế nào khi ảnh chụp đơn thuốc bị mờ hoặc thiếu sáng?

Ứng dụng tích hợp thuật toán tiền kiểm tra chất lượng ảnh (sử dụng OpenCV để đánh giá độ tương phản và độ sắc nét Laplacian). Nếu ảnh không đạt tiêu chuẩn, hệ thống sẽ hiển thị biểu tượng cảnh báo và cung cấp nút bấm "Chụp lại" để hướng dẫn người dùng chụp lại hình ảnh rõ nét hơn trước khi gửi lên Server.

5. Chi phí duy trì hệ thống bản đồ OpenStreetMap so với Google Maps là bao nhiêu?

Hệ thống sử dụng OpenStreetMap mã nguồn mở và các tile server công cộng nên chi phí bản quyền dữ liệu bản đồ là 0 VNĐ. Điều này giúp giải pháp tiết kiệm hàng nghìn USD chi phí duy trì API hàng tháng so với việc sử dụng Google Maps Platform khi số lượng người dùng mở rộng.


Kết luận

Đề tài "Thiết kế giải pháp hỗ trợ tra cứu điểm bán thuốc dựa trên ảnh chụp toa thuốc" đã hiện thực hóa thành công một giải pháp công nghệ toàn diện, giải quyết triệt để bài toán nhập liệu và tra cứu dược phẩm thủ công. Bằng cách kết hợp linh hoạt giữa khung phát triển ứng dụng Qt/C++, thị giác máy tính OpenCV, hệ thống định vị OpenStreetMap và kiến trúc cơ sở dữ liệu phân tán (Firebase & MongoDB), dự án không chỉ chứng minh tính khả thi kỹ thuật cao mà còn mở ra hướng tiếp cận giàu tiềm năng trong việc chuyển đổi số ngành y tế cơ sở. Trong giai đoạn tiếp theo, nhóm nghiên cứu sẽ tập trung nâng cấp mô hình AI nhận diện chữ viết tay và hoàn thiện tính năng cảnh báo tương tác thuốc tự động nhằm mang lại giá trị thiết thực hơn nữa cho cộng đồng.