Giới thiệu dự án
Bối cảnh và thực trạng ngành
Quá trình đô thị hóa nhanh chóng tại các đô thị loại I và đặc biệt tại Việt Nam (TP. Hồ Chí Minh, Hà Nội) với tốc độ tăng trưởng trên 40% đã thúc đẩy sự chuyển dịch mạnh mẽ từ nhà đất truyền thống sang mô hình căn hộ chung cư cao tầng. Theo thống kê từ Hiệp hội Bất động sản Việt Nam (VNREA), số lượng dự án chung cư thương mại và nhà ở xã hội tăng trưởng trung bình 12 - 15% mỗi năm. Tuy nhiên, hơn 65% ban quản lý (BQL) tại các khu chung cư quy mô vừa và nhỏ (dưới 1.000 căn hộ) vẫn đang vận hành thông qua các phương thức bán thủ công hoặc chắp vá: ghi chỉ số điện nước bằng sổ tay, phát phiếu thu giấy tận cửa, tiếp nhận phản ánh qua nhóm Zalo hoặc bảng tin hành lang.
Mô hình vận hành phân mảnh này dẫn đến tỷ lệ thất thoát dữ liệu lên tới 15 - 20%, kéo dài thời gian đối soát công nợ cuối tháng, đồng thời gia tăng khoảng cách và xung đột thông tin giữa cư dân và đơn vị quản lý vận hành tòa nhà.
+-------------------------------------------------------------------------+
| THỰC TRẠNG QUẢN LÝ CHUNG CƯ HIỆN NAY |
+------------------------------------+------------------------------------+
| PHƯƠNG THỨC THỦ CÔNG | HỆ THỐNG ĐỀ XUẤT |
+------------------------------------+------------------------------------+
| Ghi chỉ số điện nước bằng sổ tay | -> Import batch Excel / API sync |
| Phát phiếu thu, biên nhận giấy | -> Tự động sinh e-Invoice tức thì |
| Tiếp nhận phản hồi qua Zalo/giấy | -> Ticket 4 bước có SLA giám sát |
| Dán bảng tin thông báo hành lang | -> Push notification qua OneSignal |
| Dữ liệu phân mảnh, dễ thất thoát | -> Quản lý tập trung trên MongoDB |
+------------------------------------+------------------------------------+
Vấn đề cốt lõi (Problem Statement)
Đồ án tập trung giải quyết 3 điểm nghẽn kỹ thuật và nghiệp vụ then chốt:
- Quy trình thu thập và tính toán biểu phí thủ công: Nhân sự BQL mất từ 3 đến 5 ngày công mỗi tháng để chốt công tơ điện, nước, nhập liệu bảng tính Excel, đối soát mức giá lũy tiến và phát hành phiếu thu cho từng căn hộ.
- Kênh tương tác bất đồng bộ và thiếu minh bạch: Các yêu cầu bảo trì, đăng ký tiện ích (hồ bơi, sân tennis, phòng sinh hoạt cộng đồng) và đăng ký cấp mới thẻ xe/thẻ cư dân thường bị thất lạc, không có hệ thống định danh trạng thái xử lý rõ ràng.
- Cấu trúc dữ liệu quản lý phân cấp cồng kềnh: Các phần mềm truyền thống phân chia dữ liệu phức tạp theo 3 cấp
Block -> Tầng -> Căn hộ, gây dư thừa các tầng truy vấn (join/lookup overhead) khi mã định danh căn hộ (ví dụ: B101) đã bao hàm thuộc tính tầng và tòa.
Mục tiêu của dự án
- Mục tiêu 1 (Kiến trúc): Xây dựng nền tảng quản lý tập trung đa dự án (Multi-project Management) với mô hình dữ liệu phẳng hóa
Block -> Căn hộ, giảm độ phức tạp truy xuất dữ liệu.
- Mục tiêu 2 (Tự động hóa): Thiết kế pipeline tự động hóa quy trình import chỉ số điện nước, tự động áp biểu phí cấu hình và phát hành hóa đơn đồng loạt cho toàn bộ cư dân.
- Mục tiêu 3 (Giao tiếp thời gian thực): Tích hợp hệ thống hàng đợi thông điệp (Message Queue) và dịch vụ đẩy thông báo đa nền tảng (Push Notification) nhằm kết nối tức thì giữa BQL và cư dân.
- Mục tiêu 4 (Số hóa dịch vụ nội khu): Chuẩn hóa 44 usecase nghiệp vụ bao gồm: quản lý thẻ xe, bãi xe, đăng ký tiện ích, phân luồng xử lý yêu cầu/phản ánh 4 trạng thái (
Tất cả, Mới, Đang xử lý, Hoàn thành).
Giải pháp kỹ thuật và cơ sở lựa chọn
Hệ thống được phát triển theo kiến trúc Client-Server RESTful kết hợp cơ chế hướng sự kiện (Event-Driven Architecture):
- Phía Máy chủ (Backend): Sử dụng Node.js (v18.x LTS) cùng framework Express.js (v4.18.x) giúp xử lý non-blocking I/O hiệu năng cao cho hàng ngàn kết nối đồng thời.
- Cơ sở dữ liệu: Áp dụng MongoDB (v6.0) dạng NoSQL Document-based. Cấu trúc BSON cho phép linh hoạt định nghĩa các trường biểu phí động, cấu trúc căn hộ và danh sách chỉ số phụ trợ mà không cần migrate schema phức tạp như SQL truyền thống.
- Hàng đợi thông điệp: Tích hợp RabbitMQ (v3.11) qua giao thức AMQP nhằm xử lý các tác vụ nền nặng (background jobs) như tính toán biểu phí hàng loạt, gửi email/thông báo diện rộng mà không gây nghẽn Event Loop của Node.js.
- Phía Giao diện (Frontend): Ứng dụng Single-Page Application (SPA) xây dựng trên Vue.js 3, kết hợp HTML5, CSS3, JavaScript (ES6+) và trình biên tập mã nguồn Visual Studio Code (v1.8x).
- Dịch vụ thông báo: Tích hợp OneSignal Push Notification API gửi thông báo thời gian thực đến trình duyệt web và thiết bị di động của cư dân.
Kết quả kỳ vọng và chỉ số đo lường (Measurable Metrics)
- Hiệu năng API: Độ trễ phản hồi (Response Latency) trung bình dưới 120ms với tải 200 concurrent users.
- Tự động hóa thanh toán: Giảm thời gian tính toán và phát hành hóa đơn cho 1.000 căn hộ từ 72 giờ thủ công xuống dưới 45 giây.
- Thời gian xử lý yêu cầu: Tối ưu 75% chu kỳ từ lúc tiếp nhận phản ánh đến khi xác nhận giải quyết giữa BQL và cư dân.
- Độ tin cậy gửi tin: Đảm bảo 99.5% thông báo khẩn cấp được đẩy tới thiết bị người dùng trong vòng dưới 3 giây qua Web Push.
Phạm vi và giới hạn
- Phạm vi: Triển khai toàn bộ cổng thông tin quản trị Web Portal cho BQL và giao diện Web App phản hồi tương tác dành cho cư dân trong một hoặc nhiều dự án chung cư.
- Giới hạn: Chưa tích hợp trực tiếp phần cứng cổng kiểm soát bãi xe RFID vật lý tại barrier và cổng thanh toán trung gian ngân hàng trực tuyến (payment gateway); các giao dịch hiện ghi nhận qua phiếu thu/chi và biên nhận đối soát nội bộ.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
So sánh với các giải pháp trên thị trường
| Tiêu chí |
Phần mềm chuyên biệt đóng gói (Vinhomes/Masterise In-house) |
Giải pháp SaaS bên thứ 3 (Building Care, CyHome) |
Hệ thống Quản lý Đồ án đề xuất |
| Mô hình triển khai |
On-premise / Private Cloud riêng |
Multi-tenant Public SaaS |
Web-based / Dockerized Self-hosted |
| Chi phí bản quyền |
Rất cao (>500.000.000 VNĐ) |
Phí duy trì định kỳ theo đầu căn hộ hàng tháng |
Miễn phí mã nguồn mở, tối ưu chi phí hạ tầng |
| Cấu trúc phân cấp dữ liệu |
Phức tạp: Dự án -> Block -> Tầng -> Căn |
Cố định theo khung phân phối |
Tối ưu phẳng hóa: Dự án -> Block -> Căn hộ |
| Tính linh hoạt biểu phí |
Cấu hình chuyên sâu nhưng khó tùy biến nhanh |
Giới hạn theo công thức định sẵn của vendor |
Tùy biến linh hoạt biểu phí bậc thang qua Schema BSON |
| Khả năng mở rộng đa dự án |
Tích hợp sâu vào ERP tổng thể |
Có hỗ trợ, cấu hình phức tạp |
Tích hợp sẵn cấp độ Root Project Management |
Phân tích yêu cầu theo phương pháp MoSCoW
+-------------------------------------------------------------------------+
| YÊU CẦU HỆ THỐNG (MÔ HÌNH MoSCoW) |
+-------------------------------------------------------------------------+
| [M] MUST HAVE: |
| - Xác thực JWT & phân quyền RBAC (BQL vs Cư dân). |
| - Quản lý Dự án, Block, Căn hộ, Cư dân (mapping CCCD/Passport). |
| - Nhập chỉ số điện/nước hàng loạt qua Excel/CSV & tính tiền bậc thang.|
| - Phát hành hóa đơn, quản lý phiếu thu/chi. |
| - Tiếp nhận và cập nhật trạng thái yêu cầu/phản ánh (4 bước). |
+-------------------------------------------------------------------------+
| [S] SHOULD HAVE: |
| - Quản lý bãi xe, duyệt đăng ký thẻ xe/thẻ cư dân trực tuyến. |
| - Đặt lịch sử dụng tiện ích nội khu (hồ bơi, BBQ, phòng sinh hoạt). |
| - Gửi Push Notification thời gian thực qua OneSignal. |
+-------------------------------------------------------------------------+
| [C] COULD HAVE: |
| - Lọc và tìm kiếm nâng cao (Full-text search căn hộ/cư dân). |
| - Xuất báo cáo tài chính tổng hợp theo chu kỳ tháng/quý. |
+-------------------------------------------------------------------------+
| [W] WON'T HAVE (Phiên bản này): |
| - Cổng thanh toán trực tuyến qua thẻ tín dụng/ATM/VNPay. |
| - Điều khiển IoT Smart Home và đồng hồ điện tử tự động đọc chỉ số. |
+-------------------------------------------------------------------------+
Thiết kế hệ thống
Kiến trúc tổng thể hệ thống (Component Architecture)
+-------------------------------------------------------------------------------+
| CLIENT APPLICATION LAYER |
| +-------------------------------------+ +--------------------------------+ |
| | Admin/BQL Management Portal | | Resident Interactive Web | |
| | (Vue.js 3 + SPA) | | (Vue.js 3 / PWA) | |
| +-------------------------------------+ +--------------------------------+ |
+---------------------------------------+---------------------------------------+
| HTTPS / REST APIs
v
+-------------------------------------------------------------------------------+
| API GATEWAY & SECURITY LAYER |
| Nginx Reverse Proxy / SSL Termination / Rate Limiting |
| JWT Authentication & Role-Based Access Control |
+---------------------------------------+---------------------------------------+
|
v
+-------------------------------------------------------------------------------+
| BACKEND APPLICATION LAYER |
| +-------------------------------------------------------------------------+ |
| | Node.js (v18.x) + Express.js (v4.18.x) RESTful API | |
| | [Project Module] [Resident Module] [Billing Module] [Ticket Service] | |
| +------------------------------------+------------------------------------+ |
+---------------------------------------|---------------------------------------+
| Async Task Messages | Direct BSON Query
v v
+-----------------------+ +---------------------------------------------------+
| MESSAGE BROKER LAYER | | DATA STORAGE LAYER |
| RabbitMQ (v3.11) | | MongoDB (v6.0) Replica Set |
| - Batch Invoicing | | - Projects, Blocks, Apartments, Residents |
| - Notification Queue | | - Utility Meters, Tariffs, Invoices, Tickets |
+-----------+-----------+ +---------------------------------------------------+
|
v
+-----------------------+
| THIRD-PARTY SERVICES |
| OneSignal Push API |
+-----------------------+
Thiết kế Cơ sở dữ liệu (Database Schema)
Dưới đây là thiết kế Data Schema thực tế sử dụng Mongoose ODM cho các thực thể quan trọng nhất: Căn hộ, Cư dân, Chỉ số điện nước và Hóa đơn:
// models/Apartment.js
const mongoose = require('mongoose');
const ApartmentSchema = new mongoose.Schema({
projectId: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true, index: true },
blockId: { type: mongoose.Schema.Types.ObjectId, ref: 'Block', required: true },
apartmentCode: { type: String, required: true, trim: true, unique: true }, // e.g., 'A1204'
apartmentType: { type: String, enum: ['1PN', '2PN', '3PN', 'Penthouse'], default: '2PN' },
areaSquareMeters: { type: Number, required: true },
currentResidents: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Resident' }],
status: { type: String, enum: ['OCCUPIED', 'VACANT', 'MAINTENANCE'], default: 'OCCUPIED' }
}, { timestamps: true });
// models/UtilityIndex.js
const UtilityIndexSchema = new mongoose.Schema({
apartmentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Apartment', required: true, index: true },
billingMonth: { type: String, required: true }, // Format: 'YYYY-MM'
electricity: {
previousIndex: { type: Number, required: true },
currentIndex: { type: Number, required: true },
consumedUnits: { type: Number, required: true }
},
water: {
previousIndex: { type: Number, required: true },
currentIndex: { type: Number, required: true },
consumedUnits: { type: Number, required: true }
},
recordedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
isBilled: { type: Boolean, default: false }
}, { timestamps: true });
module.exports = {
Apartment: mongoose.model('Apartment', ApartmentSchema),
UtilityIndex: mongoose.model('UtilityIndex', UtilityIndexSchema)
};
Thiết kế Giao tiếp API (RESTful API Design)
| Phương thức |
Endpoint |
Tham số đầu vào (Payload/Query) |
Mô tả chức năng |
POST |
/api/v1/auth/login |
{ username, password } |
Xác thực người dùng, trả về JWT Token |
GET |
/api/v1/projects/:id/apartments |
?blockId=&type=&page=1&limit=20 |
Lấy danh sách căn hộ theo bộ lọc |
POST |
/api/v1/residents |
{ fullName, identityNumber, phone, apartmentId } |
Tạo mới cư dân (tự động map CCCD) |
POST |
/api/v1/utilities/import-metrics |
FormData (Multipart/Excel .xlsx) |
Import chỉ số điện nước hàng loạt |
POST |
/api/v1/invoices/generate-batch |
{ projectId, billingMonth } |
Đẩy task tạo hóa đơn vào RabbitMQ |
PATCH |
/api/v1/requests/:id/status |
{ status: 'IN_PROGRESS' | 'RESOLVED', note } |
Cập nhật tiến độ xử lý phản ánh |
POST |
/api/v1/notifications/broadcast |
{ targetBlocks: [], title, message, attachments: [] } |
Gửi thông báo diện rộng qua OneSignal |
Bảo mật và Hiệu năng
- Bảo mật: Mã hóa mật khẩu 100% bằng thuật toán bcrypt (salt rounds = 10). Mọi request đến API nghiệp vụ đều yêu cầu Bearer Token chuẩn JWT được ký bằng secret key 256-bit, kiểm tra quyền truy cập theo mô hình Role-Based Access Control (RBAC).
- Xác thực dữ liệu: Sử dụng schema validation nghiêm ngặt ở tầng controller (Joi validation) ngăn chặn triệt để NoSQL Injection và Cross-Site Scripting (XSS).
Phương pháp luận phát triển (Methodology)
Dự án áp dụng mô hình phát triển phần mềm Thác nước (Waterfall Model) được chuẩn hóa trong chương trình đào tạo Kỹ sư Hệ thống Thông tin tại Trường ĐH Công nghệ Thông tin - ĐHQG TP.HCM, kết hợp các sprint kiểm thử hồi quy linh hoạt.
+-------------------------------------------------------------------------+
| LỘ TRÌNH DỰ ÁN (TIMELINE) |
+-------------------------------------------------------------------------+
| [Tuần 01 - 03] Khảo sát hiện trạng, phân tích nghiệp vụ BQL chung cư |
| [Tuần 04 - 06] Đặc tả Use Case, thiết kế biểu đồ UML & Schema MongoDB |
| [Tuần 07 - 11] Lập trình Backend (Node.js/Express) & Message Queue |
| [Tuần 12 - 14] Lập trình Frontend (Vue.js 3) & Tích hợp OneSignal |
| [Tuần 15] Kiểm thử hộp đen, Stress test API & Đánh giá UAT |
| [Tuần 16] Đóng gói triển khai Docker, hoàn thiện tài liệu khóa luận|
+-------------------------------------------------------------------------+
Ma trận Quản lý Rủi ro (Risk Assessment & Mitigation)
| Rủi ro kỹ thuật |
Mức độ |
Khả năng xảy ra |
Giải pháp kiểm soát (Mitigation Strategy) |
| Nghẽn Event Loop khi tính hóa đơn số lượng lớn |
Cao |
Trung bình |
Đẩy toàn bộ tác vụ batch processing sang worker riêng qua RabbitMQ. |
| Sai lệch chỉ số lũy tiến khi import trùng lặp |
Cao |
Thấp |
Thiết lập Unique Index kép trên MongoDB (apartmentId, billingMonth). |
| Mất kết nối Web Push OneSignal |
Trung bình |
Thấp |
Thiết lập cơ chế fallback lưu thông báo vào Notification In-app Collection. |
Implementation và kết quả
Quy trình phát triển (Development Process)
1. Thuật toán tính cước điện nước bậc thang và phát hành hóa đơn tự động
Module tính cước áp dụng thuật toán phân bổ bậc thang lũy tiến theo cấu hình biểu phí (TariffConfiguration) của dự án:
// services/BillingCalculatorService.js
/**
* Tính toán số tiền theo biểu phí bậc thang lũy tiến
* @param {number} totalUnits - Tổng lượng tiêu thụ (kWh hoặc m3)
* @param {Array<{minUnit: number, maxUnit: number, unitPrice: number}>} brackets - Khung bậc thang
* @returns {number} Tổng tiền chưa thuế
*/
function calculateProgressiveTariff(totalUnits, brackets) {
let remainingUnits = totalUnits;
let totalCost = 0;
for (const tier of brackets) {
if (remainingUnits <= 0) break;
const tierCapacity = (tier.maxUnit !== null ? tier.maxUnit - tier.minUnit + 1 : remainingUnits);
const unitsInThisTier = Math.min(remainingUnits, tierCapacity);
totalCost += unitsInThisTier * tier.unitPrice;
remainingUnits -= unitsInThisTier;
}
return totalCost;
}
// Handler tính tổng hóa đơn định kỳ cho căn hộ
async function generateApartmentInvoice(apartment, utilityData, tariffConfig) {
const electricityCost = calculateProgressiveTariff(
utilityData.electricity.consumedUnits,
tariffConfig.electricityTiers
);
const waterCost = calculateProgressiveTariff(
utilityData.water.consumedUnits,
tariffConfig.waterTiers
);
const managementFee = apartment.areaSquareMeters * tariffConfig.managementFeePerSqm;
const parkingFee = apartment.activeVehiclesCount * tariffConfig.motorcycleFeePerUnit;
const subTotal = electricityCost + waterCost + managementFee + parkingFee;
const vatAmount = subTotal * 0.1; // 10% VAT
const totalAmount = subTotal + vatAmount;
return {
apartmentId: apartment._id,
billingMonth: utilityData.billingMonth,
details: { electricityCost, waterCost, managementFee, parkingFee, vatAmount },
totalAmount,
status: 'UNPAID'
};
}
module.exports = { calculateProgressiveTariff, generateApartmentInvoice };
2. Xử lý bất đồng bộ hàng đợi thông báo qua RabbitMQ
Để tránh block HTTP request khi BQL gửi thông báo đến 1.000 căn hộ, hệ thống sử dụng RabbitMQ Producer-Consumer:
// queues/NotificationQueue.js
const amqp = require('amqplib');
const axios = require('axios');
const QUEUE_NAME = 'BROADCAST_NOTIFICATION_QUEUE';
async function sendToNotificationQueue(payload) {
const connection = await amqp.connect(process.env.RABBITMQ_URI);
const channel = await connection.createChannel();
await channel.assertQueue(QUEUE_NAME, { durable: true });
channel.sendToQueue(QUEUE_NAME, Buffer.from(JSON.stringify(payload)), {
persistent: true
});
setTimeout(() => connection.close(), 500);
}
// Worker Consumer chạy nền độc lập
async function startNotificationWorker() {
const connection = await amqp.connect(process.env.RABBITMQ_URI);
const channel = await connection.createChannel();
await channel.assertQueue(QUEUE_NAME, { durable: true });
channel.prefetch(10); // Xử lý 10 thông báo song song
console.log('[Worker] Đang lắng nghe hàng đợi thông báo...');
channel.consume(QUEUE_NAME, async (msg) => {
if (msg !== null) {
const data = JSON.parse(msg.content.toString());
try {
// Gửi push qua OneSignal REST API v1.0
await axios.post('https://onesignal.com/api/v1/notifications', {
app_id: process.env.ONESIGNAL_APP_ID,
headings: { en: data.title, vi: data.title },
contents: { en: data.message, vi: data.message },
include_external_user_ids: data.residentIds
}, {
headers: { Authorization: `Basic ${process.env.ONESIGNAL_REST_KEY}` }
});
channel.ack(msg);
} catch (err) {
console.error('[Worker Error] Gửi thông báo thất bại:', err.message);
channel.nack(msg, false, true); // Requeue để thử lại
}
}
});
}
module.exports = { sendToNotificationQueue, startNotificationWorker };
Kiểm thử và đánh giá (Testing và Validation)
Thống kê độ bao phủ kiểm thử (Test Coverage)
Hệ thống được kiểm thử toàn diện thông qua bộ test case đơn vị (Unit Test với Jest) và kiểm thử tích hợp (Integration Test với SuperTest):
+-------------------------------------------------------------------------+
| KẾT QUẢ KIỂM THỬ (TEST COVERAGE) |
+-------------------------------------------------------------------------+
| Module Kiểm thử | Số Testcases | Passed | Độ bao phủ (%) |
+--------------------------------+--------------+--------+----------------+
| Authentication & RBAC Service | 24 | 24/24 | 95.8% |
| Tariff & Progressive Billing | 38 | 38/38 | 92.4% |
| Apartment & Block Management | 30 | 30/30 | 88.5% |
| Request Handling Workflow | 26 | 26/26 | 86.2% |
| Notification Queue & Worker | 18 | 18/18 | 82.0% |
| TỔNG TOÀN HỆ THỐNG | 136 | 136 | 88.98% |
+-------------------------------------------------------------------------+
Benchmark hiệu năng hệ thống (Load Testing)
Kiểm thử tải bằng Apache JMeter với kịch bản giả lập 500 yêu cầu đồng thời (500 Concurrent Connections) trong thời gian 60 giây trên máy chủ thử nghiệm (2 vCPU, 4GB RAM):
- Throughput trung bình: 214.5 Requests/giây.
- Thời gian phản hồi trung bình (Avg Response Time): 86.4 ms.
- Thời gian phản hồi 95th Percentile: 118.2 ms.
- Tỷ lệ lỗi (Error Rate): 0.00% (0/12.870 requests thất bại).
+-------------------------------------------------------------------------+
| KẾT QUẢ ĐÁNH GIÁ CHẤP NHẬN NGƯỜI DÙNG (UAT) |
| (Khảo sát 30 cư dân và 5 cán bộ BQL thực nghiệm) |
+-------------------------------------------------------------------------+
| Tiêu chí đánh giá | Điểm trung bình (Thang 5) |
+---------------------------------------------+---------------------------+
| Độ trực quan của giao diện người dùng (UI) | 4.70 / 5.0 |
| Tốc độ tải trang và phản hồi thao tác | 4.80 / 5.0 |
| Tính minh bạch trong tra cứu hóa đơn | 4.65 / 5.0 |
| Sự tiện lợi khi gửi phản hồi/yêu cầu | 4.60 / 5.0 |
| Hiệu quả quản lý công việc của BQL | 4.75 / 5.0 |
| ĐIỂM HÀI LÒNG TRUNG BÌNH CHUNG | 4.70 / 5.0 (94%) |
+-------------------------------------------------------------------------+
Kết quả đạt được
Hệ thống đã hiện thực hóa 100% các chức năng cốt lõi theo đề cương tốt nghiệp:
- Hoàn thiện đầy đủ 44 usecase được mô hình hóa chi tiết thành các biểu đồ tương tác Sequence Diagram và Activity Diagram.
- Loại bỏ 100% giấy tờ thủ công trong việc lập danh sách hóa đơn, in phiếu thu và gửi thông báo hành lang.
- Chuẩn hóa quy trình 4 bước tiếp nhận khiếu nại: Cư dân gửi phản ánh kèm hình ảnh minh chứng -> Hệ thống chuyển trạng thái
Mới -> BQL tiếp nhận chuyển sang Đang xử lý -> Kỹ thuật viên khắc phục và chuyển Hoàn thành.
Đổi mới và đóng góp
Các điểm cải tiến kỹ thuật nổi bật
- Mô hình định danh liên kết CCCD/Passport xuyên suốt đa dự án: Khi cư dân chuyển từ chung cư A sang chung cư B (cùng do đơn vị quản lý vận hành), hệ thống tự động tái sử dụng hồ sơ định danh cũ mà không cần nhập lại từ đầu, giảm 60% thời gian tạo mới tài khoản.
- Tối ưu hóa cấu trúc dữ liệu phẳng: Khác với các giải pháp đóng gói chia tách 3 tầng (
Block -> Floor -> Apartment), hệ thống ánh xạ mã căn hộ trực tiếp vào Block, giảm thiểu các phép aggregate phức tạp trên MongoDB, giúp tăng tốc độ truy vấn danh sách căn hộ lên 40%.
- Kiến trúc phân tán thông điệp bất đồng bộ: Ứng dụng RabbitMQ giúp tách rời luồng tạo hóa đơn và phát thông báo khỏi luồng HTTP server chính, đảm bảo máy chủ không bao giờ bị rơi vào trạng thái nghẽn CPU khi thực hiện tác vụ nặng cuối kỳ thanh toán.
+-------------------------------------------------------------------------+
| SO SÁNH CÁC CHỈ SỐ CẢI TIẾN HIỆU QUẢ |
+------------------------------------+-----------------+------------------+
| Nghiệp vụ vận hành | Phương thức cũ | Hệ thống đề xuất |
+------------------------------------+-----------------+------------------+
| Chốt chỉ số điện nước & tính cước | 3 - 5 ngày công | < 15 phút (Excel)|
| Thời gian phát hành 1.000 hóa đơn | 2 ngày in ấn | 45 giây (Batch) |
| Thời gian xác nhận phản ánh cư dân | 12 - 24 giờ | < 15 phút |
| Chi phí in ấn phiếu thu & giấy báo | 3 - 5 triệu/thg | 0 VNĐ |
+------------------------------------+-----------------+------------------+
Ứng dụng thực tế và triển khai
Trường hợp sử dụng thực tế (Real-World Use Cases)
- Tình huống 1 - Sự cố rò rỉ nước khẩn cấp: Cư dân căn hộ B1204 phát hiện vỡ đường ống tại hành lang tầng 12, chụp ảnh và gửi phản ánh qua ứng dụng. Hệ thống tự động gửi notification tới ban kỹ thuật trực ca. Trạng thái phản ánh được cập nhật trực tiếp cho cư dân theo dõi theo thời gian thực.
- Tình huống 2 - Chốt kỳ chỉ số cuối tháng: Kỹ thuật viên điền file Excel danh sách chỉ số điện/nước toàn bộ Block A, B. Nhân viên BQL upload file lên hệ thống. Server phân tích cú pháp, tính lũy tiến theo bảng giá, tự động tạo 800 hóa đơn và đẩy thông báo qua OneSignal đến từng tài khoản căn hộ chỉ trong 1 thao tác bấm.
Hướng dẫn cài đặt và triển khai hệ thống (Deployment Guide)
Yêu cầu hệ thống (System Requirements)
- Hệ điều hành: Linux (Ubuntu 20.04/22.04 LTS recommended) hoặc macOS/Windows.
- Tài nguyên tối thiểu: 2 Core CPU, 4GB RAM, 20GB SSD Storage.
- Phần mềm môi trường: Node.js v18+, MongoDB v6.0+, RabbitMQ Server v3.11+, Git.
Các bước triển khai qua Docker Compose
Tạo file docker-compose.yml tại thư mục gốc:
version: '3.8'
services:
mongodb:
image: mongo:6.0
container_name: agy_mongodb
restart: always
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: secretpassword
rabbitmq:
image: rabbitmq:3.11-management
container_name: agy_rabbitmq
restart: always
ports:
- "5672:5672"
- "15672:15672"
backend_api:
build: ./backend
container_name: agy_backend
restart: always
ports:
- "5000:5000"
environment:
NODE_ENV: production
PORT: 5000
MONGO_URI: mongodb://admin:secretpassword@mongodb:27017/apartment_db?authSource=admin
RABBITMQ_URI: amqp://rabbitmq:5672
JWT_SECRET: your_super_secret_jwt_key_256bit
ONESIGNAL_APP_ID: your_onesignal_app_id
ONESIGNAL_REST_KEY: your_onesignal_rest_api_key
depends_on:
- mongodb
- rabbitmq
volumes:
mongo_data:
Chạy lệnh khởi tạo dịch vụ:
# Khởi động toàn bộ container nền tảng
docker-compose up -d --build
# Kiểm tra trạng thái hoạt động của các service
docker-compose ps
Hướng dẫn xử lý sự cố thường gặp (Troubleshooting Guide)
| Hiện tượng lỗi |
Nguyên nhân gốc rễ |
Hướng dẫn khắc phục |
MongooseServerSelectionError: connect ECONNREFUSED |
MongoDB chưa khởi động hoàn tất hoặc sai Port/Credential. |
Kiểm tra docker logs agy_mongodb và xác minh lại chuỗi kết nối MONGO_URI. |
Channel closed by broker: 404 NOT_FOUND |
Hàng đợi RabbitMQ chưa được assert khởi tạo trước khi publish. |
Gọi channel.assertQueue('QUEUE_NAME', { durable: true }) trước khi thực hiện gửi/nhận. |
OneSignal 400 Bad Request: external_user_ids not found |
Thiết bị cư dân chưa kích hoạt quyền nhận thông báo trên trình duyệt. |
Kiểm tra console frontend, yêu cầu người dùng cấp quyền Notification.requestPermission(). |
Đánh giá Chi phí - Lợi ích và Thời gian hoàn vốn (Cost-Benefit & ROI)
- Chi phí phát triển & hạ tầng: Tiết kiệm 100% chi phí bản quyền so với việc mua phần mềm đóng gói (khoảng 300 - 500 triệu VNĐ ban đầu). Chi phí vận hành máy chủ Cloud (VPS) chỉ từ 300.000 - 500.000 VNĐ/tháng.
- Lợi ích kinh tế: Tiết kiệm 2 vị trí nhân sự văn phòng phụ trách ghi chỉ số và phân loại hóa đơn (giảm khoảng 16 - 20 triệu VNĐ/tháng/chung cư). Tiết kiệm chi phí in ấn văn phòng phẩm (3 - 5 triệu VNĐ/tháng).
- Thời gian hoàn vốn (ROI): Hệ thống mang lại điểm hòa vốn và tạo ra giá trị thặng dư ngay từ tháng thứ 3 sau khi triển khai vận hành thực tế.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Thiếu liên kết phần cứng đo đạc: Chưa kết nối với công tơ điện nước thông minh (Smart Meters) giao tiếp qua sóng Zigbee/LoRaWAN, vẫn cần nhân viên ghi nhận thủ công trước khi import file.
- Cổng thanh toán điện tử: Chưa tích hợp trực tiếp SDK thanh toán trực tuyến của các ngân hàng nội địa hoặc ví điện tử (MoMo, ZaloPay, VNPay-QR), việc xác nhận đóng tiền vẫn cần BQL bấm đổi trạng thái hóa đơn.
- Môi trường di động Native: Mới chỉ hỗ trợ giao diện Responsive Web/PWA, chưa phát triển ứng dụng di động Native (iOS/Android) trên các kho ứng dụng App Store/Google Play.
Hướng phát triển trong tương lai
- Tích hợp IoT Smart Building: Xây dựng Gateway giao tiếp MQTT kết nối trực tiếp với hệ thống kiểm soát barrier bãi xe tự động (ANPR - Nhận diện biển số xe qua camera AI) và đồng hồ đo điện nước thời gian thực.
- Trí tuệ nhân tạo (AI Chatbot): Tích hợp trợ lý ảo AI hỗ trợ cư dân 24/7, tự động phân loại mức độ khẩn cấp của khiếu nại và giao việc thông minh (Smart Dispatching) cho kỹ thuật viên tòa nhà.
Đối tượng hưởng lợi
+-------------------------------------------------------------------------+
| MA TRẬN ĐỐI TƯỢNG HƯỞNG LỢI |
+-------------------------------------------------------------------------+
| [CƯ DÂN CHUNG CƯ] |
| - Nhận thông báo tức thì, không lo thất lạc thông tin. |
| - Minh bạch hóa 100% các khoản cước phí điện, nước, dịch vụ. |
| - Gửi yêu cầu sửa chữa và theo dõi tiến độ xử lý dễ dàng. |
+-------------------------------------------------------------------------+
| [BAN QUẢN LÝ TÒA NHÀ] |
| - Cắt giảm 70% khối lượng công việc hành chính và nhập liệu thủ công. |
| - Giảm thiểu tối đa sai sót trong quá trình tính toán biểu phí. |
| - Nâng cao tính chuyên nghiệp và mức độ hài lòng của cư dân. |
+-------------------------------------------------------------------------+
| [SINH VIÊN & LẬP TRÌNH VIÊN] |
| - Cung cấp mã nguồn tham khảo chuẩn mực về kiến trúc Node.js/Vue.js. |
| - Tài liệu mẫu về phân tích thiết kế hệ thống theo chuẩn UML. |
+-------------------------------------------------------------------------+
Câu hỏi thường gặp
1. Yêu cầu kỹ thuật tối thiểu để triển khai hệ thống là gì?
Hệ thống yêu cầu máy chủ chạy hệ điều hành Linux (Ubuntu 20.04 LTS trở lên), tối thiểu 2 vCPU, 4GB RAM và 20GB dung lượng ổ cứng SSD. Về mặt phần mềm, cần cài đặt Docker/Docker Compose hoặc môi trường Node.js v18.x LTS, MongoDB v6.0 và RabbitMQ Server v3.11.
2. Khả năng mở rộng (Scalability) của hệ thống khi số lượng căn hộ tăng cao?
Hệ thống được thiết kế theo kiến trúc phi trạng thái (Stateless Backend) kết hợp MongoDB Replica Set và RabbitMQ Queue. Khi quy mô tăng từ 1 dự án (500 căn hộ) lên 10 dự án (5.000 căn hộ), backend có thể mở rộng theo chiều ngang (Horizontal Scaling) bằng cách bổ sung các Node.js worker instance phía sau Nginx Load Balancer mà không cần thay đổi kiến trúc mã nguồn.
3. Hệ thống có thể tích hợp với các hệ thống phần mềm kế toán sẵn có không?
Có. Nhờ thiết kế chuẩn kiến trúc RESTful API và định dạng dữ liệu chuẩn JSON, hệ thống dễ dàng xuất dữ liệu hóa đơn, phiếu thu/chi định kỳ hoặc kết nối trực tiếp qua Webhook/REST API tới các phần mềm kế toán doanh nghiệp như MISA, FAST hay SAP.
4. Chi phí bảo trì và vận hành hệ thống định kỳ như thế nào?
Chi phí vận hành định kỳ bao gồm phí thuê máy chủ đám mây (VPS Cloud) khoảng 300.000 - 800.000 VNĐ/tháng tùy tải lượng truy cập, tên miền (Domain) khoảng 250.000 VNĐ/năm và chứng chỉ SSL miễn phí từ Let's Encrypt. Chi phí dịch vụ OneSignal hoàn toàn miễn phí cho các nhu cầu push notification tiêu chuẩn dưới 10.000 người dùng.
5. Lợi ích kinh tế và thời gian hoàn vốn đầu tư (ROI) ước tính?
Đối với một chung cư quy mô 500 - 1.000 căn hộ, hệ thống giúp tiết kiệm trung bình 15 - 25 triệu VNĐ chi phí nhân sự và in ấn mỗi tháng. Do không mất chi phí mua bản quyền phần mềm đóng gói, ban quản lý hoặc chủ đầu tư có thể thu hồi toàn bộ chi phí đầu tư thiết lập ban đầu chỉ sau 3 đến 6 tháng vận hành.
Kết luận
Đồ án tốt nghiệp "Quản lý căn hộ chung cư kết nối cư dân và ban quản lý" của tác giả Trương Nguyên Ngọc (Khoa Hệ thống Thông tin, Trường Đại học Công nghệ Thông tin - ĐHQG TP.HCM) đã giải quyết thành công bài toán chuyển đổi số trong quản lý vận hành tòa nhà. Bằng việc kết hợp hài hòa giữa công nghệ hiện đại (Node.js, Express.js, MongoDB, RabbitMQ, Vue.js, OneSignal) và phương pháp luận phân tích thiết kế hệ thống chuẩn tắc (UML, Waterfall/Agile), đồ án không chỉ đáp ứng xuất sắc các yêu cầu học thuật của một kỹ sư Hệ thống Thông tin mà còn sở hữu giá trị ứng dụng thực tiễn cao, đóng góp một giải pháp mã nguồn mở hiệu quả cho công cuộc hiện đại hóa đô thị thông minh.