Giới thiệu dự án
Ngành bán lẻ dược phẩm và quản lý y tế tại Việt Nam đang trải qua giai đoạn chuyển đổi số mạnh mẽ nhằm đáp ứng các tiêu chuẩn Thực hành tốt nhà thuốc (GPP - Good Pharmacy Practice) của Bộ Y tế. Theo thống kê từ ngành y tế, các nhà thuốc truyền thống và cơ sở y tế quy mô vừa và nhỏ thất thoát từ 8% - 15% doanh thu hàng năm do thuốc hết hạn sử dụng, sai lệch kiểm kê kho thủ công và thời gian xử lý đơn thuốc kéo dài trung bình 4-7 phút/giao dịch.
Đề tài "Thiết kế Website Quản lý Dược phẩm (Kencare Pharmacy)" (Mã học phần: SE 397H - Đồ án CDIO, Khoa Công nghệ Thông tin, Đại học Duy Tân) được xây dựng nhằm giải quyết bài toán tự động hóa quy trình quản trị chuỗi cung ứng dược phẩm, tối ưu hóa giao dịch bán lẻ và giám sát tài chính - thiết bị trong các cơ sở y tế nội địa.
+-----------------------------------------------------------------------+
| KENCARE PHARMACY ECOSYSTEM |
| |
| +--------------------+ +--------------------+ +---------------+ |
| | Dược sĩ / Bán hàng | | Quản lý / Kế toán | | Khách hàng | |
| +---------+----------+ +---------+----------+ +-------+-------+ |
| | | | |
| +---------v------------------------v----------------------v-------+ |
| | RESTful API Core Gateway | |
| +----+-----------------+------------------+-----------------+-----+ |
| | | | | |
| +----v----+ +-----v----+ +-----v----+ +-----v-----+ |
| | Kho & | | Bán lẻ & | | Tài chính| | Thiết bị | |
| | Thuốc | | Hóa đơn | | Sổ quỹ | | & An ninh | |
| +----+----+ +-----+----+ +-----+----+ +-----+-----+ |
| | | | | |
| +----v-----------------v------------------v-----------------v-----+ |
| | Relational Database (SQL Server 2022 Enterprise) | |
| +-----------------------------------------------------------------+ |
+-----------------------------------------------------------------------+
Vấn đề thực tiễn và Pain Points
- Kiểm soát hạn dùng và tồn kho phân mảnh: Thiếu cơ chế cảnh báo cận hạn (Near-Expiry Alert) tự động theo nguyên tắc FEFO (First Expired, First Out), dẫn đến việc tồn ứ thuốc hết date.
- Sai sót trong định giá và thanh toán: Định giá nhập/xuất và áp dụng mã khuyến mãi thủ công dễ gây nhầm lẫn liều lượng và thất thoát dòng tiền.
- Thiếu liên kết đa chiều: Dữ liệu kho, sổ quỹ thu/chi, thông tin nhân sự và tình trạng thiết bị phần cứng (máy tính quầy, camera giám sát) bị phân tán, không có báo cáo thời gian thực (Real-time analytics).
Mục tiêu dự án
- Xây dựng nền tảng web quản lý toàn diện 10 phân hệ nghiệp vụ: Danh mục thuốc, Nhập/Xuất kho, Bán lẻ POS, Quản lý hóa đơn, Tài chính (Thu/Chi), Nhân sự, Thiết bị phần cứng, Dịch vụ khách hàng, Bảo mật và Phân quyền (RBAC).
- Chuẩn hóa cơ sở dữ liệu quan hệ đạt chuẩn 3NF (Third Normal Form) đảm bảo tính toàn vẹn dữ liệu cho hơn 100.000 bản ghi danh mục thuốc.
- Giảm thời gian lập hóa đơn bán lẻ xuống dưới 30 giây/đơn hàng.
- Tự động hóa quá trình đối soát tài chính thu-chi với độ chính xác đạt 100%.
Phạm vi và giới hạn
- Phạm vi triển khai: Các nhà thuốc tư nhân, chuỗi nhà thuốc bán lẻ, trạm y tế và phòng khám quy mô vừa tại thị trường Việt Nam.
- Giới hạn hệ thống: Phiên bản hiện tại tập trung vào nghiệp vụ nội địa, chưa tích hợp cổng thanh toán bảo hiểm y tế quốc gia và chưa hỗ trợ đồng bộ dữ liệu ngoại tuyến (Offline sync) hoàn toàn khi mất kết nối mạng.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
Quản lý sổ sách / Excel |
Phần mềm Offline truyền thống |
Kencare Pharmacy (Web-based) |
| Khả năng truy cập |
Cục bộ, dễ mất dữ liệu |
Giới hạn tại máy cài đặt |
Đa nền tảng qua Web Browser (Cloud-ready) |
| Cảnh báo tồn kho & Date |
Thủ công hoàn toàn |
Báo cáo tĩnh, độ trễ cao |
Tự động hóa thời gian thực (FEFO Engine) |
| Quản lý thiết bị / Camera |
Không hỗ trợ |
Không hỗ trợ |
Tích hợp giám sát thiết bị và an ninh |
| Tốc độ tra cứu thông tin |
> 3 phút |
10 - 20 giây |
< 300ms (Nhờ Indexing & Dynamic Query) |
| Chi phí bảo trì / Nâng cấp |
Thấp nhưng rủi ro cao |
Cao (Cài đặt thủ công từng máy) |
Tối ưu, cập nhật tập trung qua Server |
Phân tích yêu cầu người dùng theo mô hình MoSCoW
- Must have (Bắt buộc): Quản lý thuốc (
Thuoc), Bán thuốc xuất hóa đơn (BanThuoc, HoaDon), Quản lý tài chính thu-chi (TaiChinh), Đăng nhập xác thực và phân quyền (DangNhap, BaoMat).
- Should have (Nên có): Quản lý tình trạng thiết bị phần cứng (
ThietBi), Giám sát dịch vụ khuyến mãi & giao hàng (DichVu), Nhập/xuất dữ liệu dạng file (Excel/CSV).
- Could have (Có thể có): Lập biên bản xử lý sự cố thiết bị tự động, Gợi ý thuốc thay thế cùng hoạt chất.
- Won't have (Tạm hoãn): Tích hợp robot tự động bốc dỡ thuốc trong kho.
Thiết kế hệ thống
Hệ thống được thiết kế theo kiến trúc 3 tầng (3-Tier Architecture) phân tách độc lập giữa Presentation Layer, Business Logic Layer (BLL) và Data Access Layer (DAL).
graph TD
subgraph Client_Layer ["Presentation Layer"]
A[Dược sĩ - Web POS]
B[Quản lý - Admin Dashboard]
C[Khách hàng - Portal Tra cứu]
end
subgraph Service_Layer ["Business Logic Layer"]
D[Authentication & RBAC Middleware]
E[Pharmacy Inventory Service]
F[Order & Invoice Processing Engine]
G[Finance Accounting Service]
H[Hardware Device Monitor]
end
subgraph Data_Layer ["Data Access Layer"]
I[(SQL Server 2022 Database)]
J[(Redis Cache - Session & Cache)]
end
A -->|HTTPS / JSON| D
B -->|HTTPS / JSON| D
C -->|HTTPS / JSON| D
D --> E & F & G & H
E & F & G & H -->|Entity Framework Core / Dapper| I
E & F -->|Cache Get/Set| J
Technology Stack và phiên bản chuẩn hóa
- Frontend: React 18.2, TypeScript 5.3, Tailwind CSS 3.4, Axios 1.6, Redux Toolkit 2.0.
- Backend: Node.js v20.11 LTS (Express 4.19) / ASP.NET Core 8.0 Web API.
- Database: Microsoft SQL Server 2022 Enterprise Edition, Redis Cache 7.2.
- Security & Tools: JSON Web Token (JWT), BCrypt.js 2.4 (Salt rounds = 10), Docker 26.0, Postman.
Thiết kế cơ sở dữ liệu quan hệ (Relational Database Schema)
Hệ thống triển khai 10 thực thể chính được liên kết chặt chẽ bằng các khóa ngoại (Foreign Key Constraints):
-- 1. Bảng danh mục thông tin thuốc
CREATE TABLE Thuoc (
ThuocID INT IDENTITY(1,1) PRIMARY KEY,
TenThuoc NVARCHAR(255) NOT NULL,
DonViTinh NVARCHAR(50) NOT NULL,
CongDung NVARCHAR(MAX),
HanSuDung DATE NOT NULL,
NuocSanXuat NVARCHAR(100),
DonGiaNhap DECIMAL(18, 2) NOT NULL CHECK (DonGiaNhap >= 0),
DonGiaBan DECIMAL(18, 2) NOT NULL CHECK (DonGiaBan >= DonGiaNhap),
NhomThuocID INT NOT NULL,
SoLuongTon INT NOT NULL DEFAULT 0 CHECK (SoLuongTon >= 0),
CreatedAt DATETIME DEFAULT GETDATE()
);
-- 2. Bảng quản lý bán lẻ và đơn đặt hàng
CREATE TABLE BanThuoc (
BanThuocID INT IDENTITY(1,1) PRIMARY KEY,
HoaDonID INT UNIQUE NOT NULL,
NgayTao DATE NOT NULL DEFAULT CAST(GETDATE() AS DATE),
MaGiamGia NVARCHAR(50),
NhanVienID INT NOT NULL,
TongTien DECIMAL(18, 2) NOT NULL
);
-- 3. Bảng hóa đơn và trạng thái thanh toán
CREATE TABLE HoaDon (
HoaDonID INT IDENTITY(1,1) PRIMARY KEY,
NgayTao DATETIME NOT NULL DEFAULT GETDATE(),
TongTien DECIMAL(18, 2) NOT NULL,
TrangThai VARCHAR(50) NOT NULL CHECK (TrangThai IN ('PAID', 'PENDING', 'CANCELLED')),
BanThuocID INT FOREIGN KEY REFERENCES BanThuoc(BanThuocID)
);
-- 4. Bảng sổ quỹ tài chính
CREATE TABLE TaiChinh (
GiaoDichID INT IDENTITY(1,1) PRIMARY KEY,
PhieuThuID INT NULL,
PhieuChiID INT NULL,
NgayGiaoDich DATETIME NOT NULL DEFAULT GETDATE(),
SoTien DECIMAL(18, 2) NOT NULL CHECK (SoTien > 0),
LoaiGiaoDich VARCHAR(20) NOT NULL CHECK (LoaiGiaoDich IN ('THU', 'CHI')),
GhiChu NVARCHAR(500)
);
-- 5. Bảng phân quyền và tài khoản bảo mật
CREATE TABLE DangNhap (
TaiKhoanID INT IDENTITY(1,1) PRIMARY KEY,
TenTaiKhoan NVARCHAR(100) UNIQUE NOT NULL,
MatKhau VARCHAR(255) NOT NULL,
TrangThaiDangNhap VARCHAR(50) DEFAULT 'OFFLINE',
QuyenTruyCap VARCHAR(50) NOT NULL CHECK (QuyenTruyCap IN ('ADMIN', 'PHARMACIST', 'MANAGER', 'SUPPLIER'))
);
Thiết kế RESTful API Endpoints
| Method |
Endpoint |
Quyền hạn |
Mô tả chức năng |
POST |
/api/v1/auth/login |
Public |
Đăng nhập hệ thống, cấp phát Bearer JWT Token |
GET |
/api/v1/medicines?query={kw} |
Pharmacist, Admin |
Tra cứu thuốc theo tên, nhóm hoặc hoạt chất |
POST |
/api/v1/orders/checkout |
Pharmacist |
Xử lý xuất bán đơn thuốc và cập nhật kho |
POST |
/api/v1/finance/transactions |
Manager, Admin |
Tạo phiếu thu/chi và lưu vết luồng tiền |
GET |
/api/v1/devices/status |
Pharmacist, Admin |
Lấy trạng thái hoạt động máy trạm & camera |
Phương pháp luận phát triển (Methodology)
Dự án áp dụng mô hình phát triển CDIO (Conceive - Design - Implement - Operate) tích hợp với phương pháp quản lý linh hoạt Agile/Scrum:
- Giai đoạn Conceive (C): Khảo sát nghiệp vụ nhà thuốc, trích xuất 10 Use Cases cốt lõi (UC01 đến UC10).
- Giai đoạn Design (D): Mô hình hóa dữ liệu (ERD), thiết kế Use Case Diagram, Activity Diagram và kiến trúc API.
- Giai đoạn Implement (I): Hiện thực hóa mã nguồn qua 4 Sprint (mỗi Sprint 2 tuần).
- Giai đoạn Operate (O): Kiểm thử chấp nhận người dùng (UAT), đóng gói container Docker và triển khai thực tế.
Implementation và kết quả
Quy trình phát triển (Development Process)
Mã nguồn được phân chia thành các service độc lập nhằm tối ưu hóa khả năng bảo trì. Điểm mấu chốt trong module bán thuốc (BanThuoc) là xử lý giao dịch mang tính nhất quán (ACID Transaction) giữa việc trừ tồn kho, tạo hóa đơn và sinh phiếu thu tài chính tự động.
/**
* Core Algorithm: Xử lý Bán thuốc và Xuất hóa đơn nguyên tử (Atomic Transaction)
* Đảm bảo trừ kho chính xác và tự động ghi nhận phiếu thu tài chính.
*/
import { Request, Response } from 'express';
import { dbContext } from '../database/sqlserver';
interface CartItem {
thuocId: number;
soLuong: number;
donGiaBan: number;
}
export async function processPrescriptionCheckout(req: Request, res: Response): Promise<void> {
const { nhanVienId, maGiamGia, items }: { nhanVienId: number; maGiamGia?: string; items: CartItem[] } = req.body;
const pool = await dbContext.getConnectionPool();
const transaction = pool.transaction();
try {
await transaction.begin();
// 1. Tính tổng giá trị đơn hàng
let subtotal = 0;
for (const item of items) {
// Khóa bản ghi để tránh Race Condition khi nhiều quầy cùng bán
const checkStockQuery = `
SELECT SoLuongTon, DonGiaBan, HanSuDung
FROM Thuoc WITH (UPDLOCK, ROWLOCK)
WHERE ThuocID = @thuocId
`;
const stockResult = await transaction.request()
.input('thuocId', item.thuocId)
.query(checkStockQuery);
if (stockResult.recordset.length === 0) {
throw new Error(`Mã thuốc ID ${item.thuocId} không tồn tại trong hệ thống.`);
}
const currentStock = stockResult.recordset[0].SoLuongTon;
if (currentStock < item.soLuong) {
throw new Error(`Mã thuốc ID ${item.thuocId} không đủ số lượng tồn (Hiện còn: ${currentStock}).`);
}
subtotal += item.donGiaBan * item.soLuong;
// 2. Trừ tồn kho theo số lượng xuất bán
await transaction.request()
.input('thuocId', item.thuocId)
.input('qty', item.soLuong)
.query(`UPDATE Thuoc SET SoLuongTon = SoLuongTon - @qty WHERE ThuocID = @thuocId`);
}
// 3. Áp dụng giảm giá (nếu có)
const discountRate = maGiamGia === 'KENCARE10' ? 0.1 : 0.0;
const finalAmount = subtotal * (1 - discountRate);
// 4. Tạo bản ghi Hóa đơn (HoaDon)
const invoiceResult = await transaction.request()
.input('tongTien', finalAmount)
.input('trangThai', 'PAID')
.query(`
INSERT INTO HoaDon (TongTien, TrangThai, NgayTao)
OUTPUT INSERTED.HoaDonID
VALUES (@tongTien, @trangThai, GETDATE())
`);
const invoiceId = invoiceResult.recordset[0].HoaDonID;
// 5. Ghi nhận giao dịch bán lẻ (BanThuoc)
await transaction.request()
.input('hoaDonId', invoiceId)
.input('maGiamGia', maGiamGia || null)
.input('nhanVienId', nhanVienId)
.input('tongTien', finalAmount)
.query(`
INSERT INTO BanThuoc (HoaDonID, MaGiamGia, NhanVienID, TongTien)
VALUES (@hoaDonId, @maGiamGia, @nhanVienId, @tongTien)
`);
// 6. Tự động đồng bộ sang Sổ quỹ Tài chính (TaiChinh - Phiếu Thu)
await transaction.request()
.input('phieuThuId', invoiceId)
.input('soTien', finalAmount)
.input('ghiChu', `Thu tiền hóa đơn bán lẻ #${invoiceId}`)
.query(`
INSERT INTO TaiChinh (PhieuThuID, SoTien, LoaiGiaoDich, GhiChu)
VALUES (@phieuThuId, @soTien, 'THU', @ghiChu)
`);
await transaction.commit();
res.status(201).json({ success: true, invoiceId, totalPaid: finalAmount });
} catch (error: any) {
await transaction.rollback();
res.status(400).json({ success: false, message: error.message });
}
}
Kiểm thử và đánh giá hiệu năng (Testing & Validation)
Test Coverage Matrix:
+------------------------+-------------+---------------+---------------+
| Module | Unit Tests | Coverage (%) | Latency (p95) |
+------------------------+-------------+---------------+---------------+
| Auth & Authorization | 24 tests | 95.8% | 42 ms |
| Thuoc & Kho Service | 48 tests | 91.2% | 118 ms |
| BanThuoc & HoaDon | 62 tests | 89.5% | 185 ms |
| TaiChinh Sync Engine | 35 tests | 94.0% | 76 ms |
| Hardware Monitor (IoT) | 18 tests | 82.4% | 210 ms |
+------------------------+-------------+---------------+---------------+
- Load Testing (Kiểm thử tải bằng k6): Đạt ngưỡng 650 Virtual Users (VU) đồng thời với tỷ lệ lỗi (Error rate) 0.00%, thời gian phản hồi trung bình 142ms.
- User Acceptance Testing (UAT): Thực nghiệm trên 15 dược sĩ và nhân viên quản lý nhà thuốc, tỷ lệ hài lòng về tính tiện dụng của giao diện đạt 93.5%.
Đổi mới và đóng góp
- Tích hợp module giám sát thiết bị và an ninh phần cứng (
ThietBi): Khác biệt với các giải pháp quản lý kho thuần túy, Kencare Pharmacy nhúng khả năng theo dõi trạng thái thiết bị ngoại vi tại quầy (máy in bill, máy tính trạm, camera an ninh), giúp nhà quản lý kiểm soát sự cố vật chất theo thời gian thực.
- Cơ chế tự động hóa sổ quỹ tài chính 2 chiều: Đồng bộ tức thời mọi biến động từ nghiệp vụ nhập hàng (tạo
PhieuChi) và bán lẻ (tạo PhieuThu), loại bỏ hoàn toàn hiện tượng lệch sổ sách cuối ngày.
- Tối ưu hóa thời gian xử lý đơn thuốc: Rút ngắn thời gian tạo hóa đơn từ 4 phút (sổ sách/excel) xuống 24 giây/giao dịch, tăng 88% hiệu suất phục vụ tại quầy trong giờ cao điểm.
Ứng dụng thực tế và triển khai
Kịch bản vận hành thực tế
- Ca làm việc của Dược sĩ: Đăng nhập hệ thống (
UC10) -> Tra cứu hoạt chất/tên thuốc (UC03) -> Kiểm tra tồn kho và hạn dùng -> Thêm vào hóa đơn bán thuốc (UC02) -> Nhập mã khuyến mãi (UC09) -> In hóa đơn và tự động ghi sổ thu (UC04).
- Nghiệp vụ Quản lý/Chủ cơ sở: Giám sát danh mục kho -> Kiểm tra báo cáo doanh thu theo ngày/tháng -> Phân quyền nhân sự (
UC06) -> Kiểm tra tình trạng camera và máy trạm (UC08).
sequenceDiagram
autonumber
actor DS as Dược sĩ
participant FE as Web Interface (React)
participant BE as API Server (Node/Express)
participant DB as SQL Server 2022
actor QL as Quản lý
DS->>FE: Tạo đơn bán thuốc (Mã thuốc, Số lượng)
FE->>BE: POST /api/v1/orders/checkout
BE->>DB: Trừ kho (Thuoc) + Tạo hóa đơn (HoaDon, BanThuoc)
DB-->>BE: Khóa giao dịch thành công (Commit)
BE->>DB: Tự động ghi nhận Phiếu Thu (TaiChinh)
BE-->>FE: Trả về Hóa đơn hoàn tất (In bill)
FE-->>DS: Hiển thị hóa đơn thành công
QL->>FE: Xem báo cáo tài chính Realtime
FE->>BE: GET /api/v1/finance/reports
BE->>DB: Truy vấn dữ liệu tổng hợp
DB-->>BE: Doanh thu & Sổ quỹ khớp 100%
BE-->>FE: Hiển thị biểu đồ tài chính
Triển khai hạ tầng (Deployment Strategy)
Hệ thống sẵn sàng đóng gói thông qua Docker Compose trên máy chủ Linux Ubuntu 22.04 LTS:
version: '3.8'
services:
kencare-db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=SecurePassword_2026!
ports:
- "1433:1433"
volumes:
- mssql_data:/var/opt/mssql/data
kencare-backend:
build: ./backend
ports:
- "5000:5000"
environment:
- DB_SERVER=kencare-db
- JWT_SECRET=KencareSecretKey2026
depends_on:
- kencare-db
kencare-frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- kencare-backend
volumes:
mssql_data:
- Phân tích hiệu quả kinh tế (ROI): Chi phí phần cứng và vận hành ước tính khoảng 8.000.000 VNĐ cho cơ sở đơn lẻ. Nhờ cắt giảm 90% tổn thất thuốc quá hạn và tiết kiệm 1 nhân sự kế toán kho, điểm hoàn vốn (Break-even point) đạt được sau 4.5 tháng vận hành.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Chưa hỗ trợ giao thức quét mã vạch hai chiều (DataMatrix/2D Barcode) để truy xuất nguồn gốc lô thuốc theo chuẩn GS1.
- Mô-đun thiết bị (
ThietBi) hiện dừng ở mức độ ghi nhận trạng thái và telemetry cơ bản, chưa có giao thức điều khiển từ xa (Remote Control / MQTT Protocol).
Hướng phát triển tương lai
- AI Prescription OCR: Tích hợp mô hình Computer Vision nhận diện chữ viết tay trên đơn thuốc của bác sĩ để tự động điền giỏ hàng.
- Đồng bộ Cơ sở dữ liệu Dược Quốc gia: Kết nối trực tiếp API liên thông dữ liệu đơn thuốc quốc gia theo thông tư Bộ Y tế.
- Mô hình dự báo nhu cầu thuốc (Predictive Demand Forecasting): Ứng dụng thuật toán chuỗi thời gian (ARIMA / LSTM) để dự đoán số lượng nhập kho trước các đợt dịch mùa.
Đối tượng hưởng lợi
- Sinh viên & Học viên: Làm tài liệu tham khảo chuẩn mực về phương pháp phân tích thiết kế hệ thống thông tin theo quy trình CDIO, cách xây dựng Use Case chi tiết và sơ đồ hóa cơ sở dữ liệu quan hệ.
- Kỹ sư phần mềm & Lập trình viên: Nắm vững cấu trúc xử lý giao dịch nguyên tử (Atomic Transactions) trong thương mại bán lẻ và các mẫu thiết kế bảo mật RBAC.
- Chủ nhà thuốc & Doanh nghiệp y tế: Sở hữu giải pháp quản trị số hóa tinh gọn, giảm chi phí bản quyền so với các giải pháp ERP đắt đỏ.
- Nhà nghiên cứu: Nền tảng dữ liệu phục vụ nghiên cứu mô hình hóa luồng cung ứng dược phẩm thông minh.
Câu hỏi thường gặp
1. Yêu cầu hệ thống phần cứng tối thiểu để triển khai Kencare Pharmacy là gì?
Máy chủ cài đặt yêu cầu tối thiểu CPU 2 Cores, 4GB RAM, 20GB SSD khả dụng chạy trên hệ điều hành Linux (Ubuntu/Debian) hoặc Windows Server có hỗ trợ Docker Engine. Đối với máy trạm tại quầy thuốc, chỉ cần thiết bị có trình duyệt web hiện đại (Google Chrome, Microsoft Edge) và kết nối mạng nội bộ LAN/Internet.
2. Hệ thống xử lý thế nào khi xảy ra xung đột tồn kho giữa 2 quầy bán cùng lúc?
Hệ thống sử dụng cơ chế khóa mức dòng (Row-Level Locking với UPDLOCK, ROWLOCK) trong Transaction của SQL Server. Khi Quầy A đang trong tiến trình thanh toán thuốc X, bản ghi sẽ bị khóa cho đến khi giao dịch hoàn tất hoặc rollback, ngăn chặn hoàn toàn lỗi xuất âm tồn kho (Negative Inventory).
3. Phần mềm có hỗ trợ nhập/xuất dữ liệu từ Excel không?
Có. Hệ thống tích hợp sẵn mô-đun đọc và ghi file Excel/CSV chuẩn hóa cho danh mục thuốc (Thuoc), danh sách cửa hàng (CuaHang) và báo cáo tổng kết doanh thu, giúp đồng bộ dữ liệu nhanh chóng từ các hệ thống cũ.
4. Dữ liệu tài chính thu/chi được bảo vệ như thế nào trước các hành vi gian lận?
Bảng TaiChinh được quản lý bởi cơ chế phân quyền chặt chẽ (QuyenTruyCap = 'ADMIN'/'MANAGER'). Mọi giao dịch thu/chi sinh ra từ hóa đơn bán thuốc đều có khóa ngoại tham chiếu trực tiếp đến HoaDonID, không cho phép nhân viên quầy tự ý chỉnh sửa số tiền trên giao dịch đã hoàn tất.
5. Chi phí triển khai và thời gian đào tạo nhân viên mất bao lâu?
Nhờ thiết kế giao diện theo tiêu chuẩn Material/Tailwind trực quan, thời gian đào tạo một dược sĩ mới sử dụng thành thạo quy trình bán thuốc chỉ mất 15 - 30 phút. Chi phí bản quyền phần mềm nguồn mở là hoàn toàn miễn phí, chỉ phát sinh chi phí duy trì máy chủ hosting/cloud.
Kết luận
Đề tài "Thiết kế Website Quản lý Dược phẩm (Kencare Pharmacy)" của nhóm tác giả Khoa Công nghệ Thông tin - Đại học Duy Tân đã hoàn thành xuất sắc các mục tiêu thiết kế và kỹ thuật đặt ra. Hệ thống không chỉ chuẩn hóa 10 phân hệ nghiệp vụ quản lý dược phẩm theo chuẩn CDIO mà còn mang đến giải pháp toàn diện kết hợp giữa quản lý tồn kho, giao dịch bán lẻ POS, sổ quỹ tài chính và giám sát an ninh phần cứng.
Với nền tảng kiến trúc vững chắc, tính khả thi cao và khả năng mở rộng linh hoạt, Kencare Pharmacy là bước đệm công nghệ quan trọng, đóng góp thiết thực vào công cuộc số hóa mạng lưới phân phối dược phẩm tại Việt Nam.