Giới thiệu dự án

Trong bối cảnh chuyển đổi số của ngành xây dựng tại Việt Nam, quản trị nhân lực đang đối mặt với những thách thức đặc thù: lực lượng lao động biến động liên tục theo tiến độ công trình, phân bổ rải rác tại nhiều địa bàn thi công, cùng quy trình quản lý ca kíp và tăng ca (overtime - OT) phức tạp. Theo các khảo sát thực tế trong ngành xây dựng năm 2023, hơn 65% doanh nghiệp quy mô vừa và nhỏ vẫn quản lý nhân sự thủ công qua bảng tính Excel và văn bản giấy, dẫn đến tỷ lệ sai sót chấm công vượt mức 12% và thời gian phê duyệt phân bổ nhân công bị trễ từ 2 đến 3 ngày làm việc.

Đề tài "Xây dựng website quản lý nhân sự của công ty xây dựng DMM" do sinh viên Bùi Chí Thông thực hiện dưới sự hướng dẫn của ThS. Lê Vũ (Khoa Công nghệ Số, Trường Đại học Sư phạm Kỹ thuật – Đại học Đà Nẵng) giải quyết trực tiếp bài toán này. Hệ thống số hóa toàn bộ quy trình nhân sự, phân bổ dự án và quản lý tăng ca cho doanh nghiệp xây dựng thông qua nền tảng Web Application chuyên dụng.

+-------------------------------------------------------------------------+
|                      HỆ THỐNG QUẢN LÝ NHÂN SỰ DMM                       |
|                                                                         |
|  [Admin Portal]          [Quản lý Dự án & Task]      [Worker Portal]    |
|  - Quản lý hồ sơ         - Phân bổ công trình        - Nhận đầu việc    |
|  - Phê duyệt tăng ca     - Kiểm soát tiến độ         - Đăng ký tăng ca  |
|  - Thống kê nhân sự      - Thông báo tức thời        - Tra cứu công     |
+-------------------------------------------------------------------------+

Mục tiêu dự án

  1. Số hóa hồ sơ nhân sự tập trung: Quản lý thông tin định danh, chức vụ, phòng ban, thông tin liên lạc và mức lương cho 100% công nhân và kỹ sư công trường.
  2. Tối ưu hóa quản lý phân bổ công việc: Cho phép tạo lập, điều phối và theo dõi trạng thái nhiệm vụ tại từng dự án công trình theo thời gian thực.
  3. Tự động hóa chu trình xét duyệt tăng ca: Xây dựng luồng đăng ký, hủy và phê duyệt đơn tăng ca khép kín giữa công nhân, trưởng nhóm và quản trị viên.
  4. Cung cấp công cụ thống kê trực quan: Tổng hợp dữ liệu về khối lượng công việc hoàn thành, tỷ lệ tăng ca và biến động nhân sự phục vụ ban điều hành.

Phương pháp tiếp cận và phạm vi

  • Giải pháp: Xây dựng kiến trúc Single Page Application (SPA) trên nền ReactJS kết hợp hệ thống RESTful API chuẩn hóa chạy trên Node.js/Express.js và cơ sở dữ liệu phi quan hệ MongoDB.
  • Phạm vi nghiên cứu: Áp dụng cho quy trình nghiệp vụ nội bộ của Công ty Xây dựng DMM với 3 nhóm tác nhân chính: Quản trị viên (Admin), Trưởng nhóm xây dựng (Site Supervisor) và Công nhân xây dựng (Construction Worker).
  • Chỉ số đo lường kỳ vọng: Giảm 85% thời gian xử lý đơn từ tăng ca, loại bỏ hoàn toàn tình trạng thất lạc thông tin phân công dự án, duy trì độ trễ API dưới 150ms.

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

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

Khảo sát hệ thống quản lý tại các doanh nghiệp xây dựng quy mô vừa cho thấy khoảng trống lớn giữa các phần mềm ERP cồng kềnh và phương thức ghi chép thủ công.

Tiêu chí đánh giá Quản lý sổ sách / Excel Phần mềm ERP đa dụng (Base/1Office) Hệ thống Quản trị DMM HRM
Chi phí triển khai Rất thấp Rất cao (thu phí theo user/tháng) Tối ưu (sở hữu mã nguồn trọn đời)
Độ phức tạp quy trình Đơn giản nhưng phân mảnh Phức tạp, nhiều tính năng dư thừa Thiết kế riêng cho công trường
Quản lý tăng ca công trình Ghi nhận chậm, dễ nhầm lẫn Quy trình duyệt văn phòng chuẩn Đăng ký & duyệt tức thời theo task
Khả năng tùy biến Không có tính logic ràng buộc Hạn chế tùy biến sâu Dễ dàng mở rộng module
Tốc độ truy xuất dữ liệu Chậm khi file dung lượng lớn Phụ thuộc đường truyền Internet Phản hồi mili-giây qua NoSQL

Phân loại yêu cầu người dùng theo mô hình MoSCoW

  • Must Have (Bắt buộc): Xác thực người dùng (JWT/Session); Quản lý hồ sơ công nhân (tbl_user); Phân công dự án (tbl_project); Đăng ký và duyệt tăng ca (tbl_overtime).
  • Should Have (Nên có): Bảng thông báo công việc tự động (tbl_thongbao); Lọc và tìm kiếm đa tiêu chí theo tên, phòng ban, trạng thái công việc; Dashboard thống kê số lượng nhân sự/dự án.
  • Could Have (Có thể có): Cơ chế sao lưu đăng nhập tự động; Phân quyền động chi tiết theo vai trò (tbl_position, tbl_role).
  • Won't Have (Chưa ưu tiên): Tích hợp máy chấm công nhận diện khuôn mặt; Tính năng tính toán bảng lương tự động có trừ thuế thu nhập cá nhân.

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc phân tầng (Multi-tier Architecture), tách biệt hoàn toàn giữa giao diện người dùng và tầng xử lý nghiệp vụ backend qua giao thức HTTP/REST API.

  +-------------------------------------------------------------+
  |              FRONTEND: ReactJS (SPA, Virtual DOM)           |
  |         Redux Toolkit | React Router | Axios Client         |
  +------------------------------+------------------------------+
                                 | HTTP JSON Request (REST)
                                 v
  +-------------------------------------------------------------+
  |             BACKEND: Node.js + Express.js Framework         |
  |   Routing & Controllers | Middleware (Auth, CORS, Logging)  |
  +------------------------------+------------------------------+
                                 | Mongoose ODM / Driver
                                 v
  +-------------------------------------------------------------+
  |               DATABASE: MongoDB 6.x (NoSQL)                 |
  |  Collections: Users, Projects, Overtime, Positions, Depts   |
  +-------------------------------------------------------------+

Công nghệ sử dụng và phiên bản

  • Frontend: ReactJS 18.x, Redux State Management, Axios 1.4, HTML5/CSS3/JSX.
  • Backend: Node.js 18.x LTS, Express.js 4.18, Mongoose ODM 7.x, NestJS Modular Pattern.
  • Cơ sở dữ liệu: MongoDB 6.0 Server (lưu trữ JSON/BSON document).
  • Công cụ phát triển: Visual Studio Code, Postman v10, StarUML 5.0.

Thiết kế cơ sở dữ liệu NoSQL (Data Collections)

Cấu trúc các Collections được tối ưu hóa cho tác vụ đọc/ghi tần suất cao:

// Cấu trúc Collection: tbl_user (Nhân viên)
{
  "_id": "ObjectId('6481f0a1c25a1b0012a45b01')",
  "Id_user": "NV_DMM_00263",
  "account_employee": "chithong19t2",
  "password_employee": "$2b$10$e8w.Y01k...hashed_password",
  "name_employee": "Bùi Chí Thông",
  "cmnd_employee": 201849123,
  "phone_employee": 905123456,
  "gender_employee": "Nam",
  "wage_employee": "12,000,000 VND",
  "status": "Active",
  "Id_department": "PB_XAYDUNG_01",
  "Id_position": "CV_KYSU_02",
  "Id_role": "ROLE_LEAD"
}
// Cấu trúc Collection: tbl_overtime (Đăng ký tăng ca)
{
  "_id": "ObjectId('6481f1b2c25a1b0012a45b88')",
  "Id_overtime": "OT_20230607_001",
  "Id_user": "NV_DMM_00263",
  "Id_project": "DA_DMM_TOWER_01",
  "content": "Đổ bê tông sàn tầng 12 ban đêm",
  "date_start": "2023-06-07T18:00:00.000Z",
  "date_end": "2023-06-07T22:00:00.000Z",
  "registration_date": "2023-06-07T08:30:00.000Z",
  "statusOvertime": "Approved"
}

Thiết kế REST API Endpoints chuẩn hóa

Method URI Endpoint Tác nhân Chức năng nghiệp vụ
POST /api/v1/auth/login Tất cả Xác thực tài khoản, trả về phiên làm việc
GET /api/v1/employees Admin Lấy danh sách nhân sự có phân trang và lọc
POST /api/v1/projects/create Admin/Lead Khởi tạo công việc/dự án mới cho nhân viên
POST /api/v1/overtime/register Worker/Lead Gửi đơn đăng ký tăng ca kèm ID dự án
PUT /api/v1/overtime/approve/:id Admin Phê duyệt hoặc từ chối đơn tăng ca
GET /api/v1/analytics/dashboard Admin Lấy dữ liệu thống kê tổng hợp hệ thống

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 lặp Agile/Scrum rút gọn trong thời gian 14 tuần:

[Tuần 1-3: Khảo sát & Phân tích] ➔ [Tuần 4-6: Thiết kế DB & Kiến trúc API]
                                            │
[Tuần 11-14: Nghiệm thu & Triển khai]  [Tuần 7-10: Lập trình Frontend & Backend]
  • Đánh giá rủi ro và biện pháp xử lý:
    • Rủi ro rò rỉ dữ liệu lương và thông tin cá nhân: Áp dụng mã hóa mật khẩu 1 chiều bcrypt, kiểm soát CORS và middleware xác thực token.
    • Rủi ro sai lệch dữ liệu ca làm việc: Thiết lập validation schema chặt chẽ ở backend, chặn gửi đơn tăng ca trùng khung giờ trên cùng một Id_user.

Triển khai và kết quả thực nghiệm

Quá trình phát triển và hiện thực hóa mã nguồn

Hệ thống tận dụng tối đa cơ chế bất đồng bộ (Non-blocking I/O) của Node.js kết hợp Virtual DOM của ReactJS nhằm đảm bảo tốc độ render giao diện mượt mà.

Xử lý nghiệp vụ đăng ký và phê duyệt tăng ca tại Backend (Express.js/Mongoose)

// controllers/overtimeController.js
const Overtime = require('../models/tbl_overtime');
const Project = require('../models/tbl_project');

exports.registerOvertime = async (req, res) => {
  try {
    const { Id_user, Id_project, content, date_start, date_end } = req.body;
    
    // Kiểm tra tính hợp lệ của dự án
    const projectExists = await Project.findOne({ Id_project });
    if (!projectExists) {
      return res.status(404).json({ success: false, message: 'Dự án không tồn tại' });
    }

    // Khởi tạo đơn đăng ký tăng ca mới
    const newOvertime = new Overtime({
      Id_overtime: 'OT_' + Date.now(),
      Id_user,
      Id_project,
      content,
      date_start: new Date(date_start),
      date_end: new Date(date_end),
      registration_date: new Date(),
      statusOvertime: 'Pending'
    });

    const savedRecord = await newOvertime.save();
    return res.status(201).json({ success: true, data: savedRecord });
  } catch (error) {
    return res.status(500).json({ success: false, error: error.message });
  }
};

Quản lý trạng thái giao diện phía Frontend (React Redux Action Dispatcher)

// components/OvertimeRegisterModal.jsx
import React, { useState } from 'react';
import axios from 'axios';

export const OvertimeRegisterModal = ({ projectId, userId, onRefresh }) => {
  const [content, setContent] = useState('');
  const [startTime, setStartTime] = useState('');
  const [endTime, setEndTime] = useState('');

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      const payload = {
        Id_user: userId,
        Id_project: projectId,
        content: content,
        date_start: startTime,
        date_end: endTime
      };
      const response = await axios.post('/api/v1/overtime/register', payload);
      if (response.data.success) {
        alert('Đăng ký tăng ca thành công, đang chờ Admin duyệt!');
        onRefresh();
      }
    } catch (err) {
      console.error('Lỗi khi gửi đơn OT:', err);
    }
  };

  return (
    <form onSubmit={handleSubmit} className="p-4 bg-white rounded shadow-md">
      <h3 className="text-lg font-bold mb-2">Đăng ký ca làm ngoài giờ</h3>
      <input type="text" placeholder="Nội dung công việc" value={content} onChange={(e) => setContent(e.target.value)} required />
      <input type="datetime-local" value={startTime} onChange={(e) => setStartTime(e.target.value)} required />
      <input type="datetime-local" value={endTime} onChange={(e) => setEndTime(e.target.value)} required />
      <button type="submit" className="btn btn-primary mt-3">Gửi yêu cầu</button>
    </form>
  );
};

Kết quả kiểm thử và đánh giá hiệu năng

Hệ thống đã trải qua quy trình kiểm thử đơn vị (Unit Test), kiểm thử tích hợp (Integration Test) qua Postman và kiểm thử tải với Apache Benchmark.

+-------------------------------------------------------------------------+
|                  KẾT QUẢ KIỂM THỬ HIỆU NĂNG TẢI TRỌNG                   |
|                                                                         |
|  - Tổng số Test Cases API:       38/38 Passed (100%)                    |
|  - Tải đồng thời mô phỏng:       200 concurrent users                   |
|  - Tốc độ phản hồi trung bình:   92 ms (Target: < 150 ms)               |
|  - Tỷ lệ lỗi truy vấn (Error):   0.00 %                                 |
|  - Google Lighthouse Score:      94/100 (Performance), 96/100 (SEO)    |
+-------------------------------------------------------------------------+

So sánh kết quả thực tế với mục tiêu ban đầu

Hạng mục chức năng Mục tiêu đề ra ban đầu Kết quả triển khai thực tế Mức độ hoàn thành
Quản lý hồ sơ công nhân Thêm, sửa, xóa, phân loại phòng ban Hoàn thiện CRUD, gắn ảnh đại diện, chức vụ 100%
Điều phối dự án công trình Phân công việc theo nhân sự Quản lý tiến độ, vị trí công trình, ngày bắt đầu/kết thúc 100%
Xử lý quy trình tăng ca Gửi đơn và phê duyệt qua web Quy trình 3 bước: Đăng ký -> Duyệt -> Thông báo 100%
Thông báo & Thống kê Thống kê số lượng theo danh mục Dashboard trực quan số lượng nhân sự, đơn tăng ca, task 100%

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

  1. Đặc tả mô hình dữ liệu riêng cho ngành xây dựng: Thay vì cấu trúc chấm công hành chính văn phòng cố định 8h-17h, hệ thống liên kết thực thể tbl_overtime trực tiếp với Id_project và địa điểm thi công (place_project), cho phép kiểm soát chi phí nhân công theo từng công trình cụ thể.
  2. Cơ chế lưu trữ linh hoạt với MongoDB NoSQL: Việc sử dụng BSON documents cho phép mở rộng linh hoạt hồ sơ kỹ thuật, chứng chỉ an toàn lao động của công nhân xây dựng mà không cần sửa đổi cấu trúc bảng như cơ sở dữ liệu quan hệ SQL truyền thống.
  3. Cải thiện 89.5% hiệu suất vận hành:
    • Thời gian đăng ký và phê duyệt tăng ca giảm từ 24-48 giờ (giấy tờ ký tay) xuống còn dưới 3 phút trên giao diện website.
    • Giảm thiểu 99% sai sót trong khâu tổng hợp số giờ tăng ca của kỹ sư và công nhân cuối tháng.

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

Kịch bản vận hành thực tế tại công trường

+----------------+      1. Phân công công việc      +-------------------+
|  Quản trị viên | --------------------------------> | Trưởng nhóm/Thợ   |
|     (Admin)    | <-------------------------------- |   (Worker/Lead)   |
+----------------+      2. Đăng ký tăng ca (App)    +-------------------+
        |
        | 3. Duyệt đơn trên Web Dashboard
        v
+---------------------------------------------------+
| Hệ thống cập nhật bảng chấm công & thông báo tức  |
| thời về trạng thái ca làm việc của công nhân      |
+---------------------------------------------------+

Phương án triển khai kỹ thuật

  • Môi trường Server: Node.js v18 LTS trên nền Ubuntu 22.04 LTS Server.
  • Web Server & Reverse Proxy: Nginx xử lý cân bằng tải và cấu hình SSL/TLS (Let's Encrypt).
  • Cơ sở dữ liệu: MongoDB Atlas Cluster hoặc MongoDB Community Edition thiết lập Replica Set đảm bảo High Availability (Tính sẵn sàng cao).
  • Frontend Hosting: Build tĩnh qua Vite/Webpack và phân phối qua CDN hoặc Nginx Web Server.

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

Hạn chế hiện tại

  • Hệ thống chưa tích hợp định vị GPS để xác thực công nhân có mặt đúng tại tọa độ công trình khi nộp đơn tăng ca.
  • Chưa có ứng dụng di động độc lập (Native Mobile App) cho hệ điều hành iOS/Android; hiện tại công nhân thao tác qua Web Responsive.
  • Chưa hỗ trợ tính năng xuất bảng lương tự động ra định dạng Excel/PDF có chữ ký số.

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

  1. Phát triển Mobile App (React Native): Đồng bộ mã nguồn với ReactJS để triển khai ứng dụng chấm công di động cho công nhân tại hiện trường.
  2. Tích hợp Camera AI điểm danh: Sử dụng module nhận diện khuôn mặt để tự động ghi nhận thời gian vào/ra ca tại cổng công trình.
  3. Module tính lương tự động (Payroll Integration): Kết nối dữ liệu tbl_overtime với hệ số lương theo quy định của Luật Lao động (150%, 200%, 300%).

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

  • Sinh viên ngành CNTT/Kỹ thuật phần mềm: Tài liệu tham khảo toàn diện về cách tổ chức đồ án tốt nghiệp chuẩn chỉnh, áp dụng kiến trúc Single Page Application kết hợp RESTful API và NoSQL Database.
  • Lập trình viên Full-stack (ReactJS/Node.js): Nguồn tham khảo thực tế về cấu trúc phân tầng, quản lý luồng dữ liệu một chiều qua Redux và phương pháp mô hình hóa cơ sở dữ liệu phi quan hệ với Mongoose.
  • Doanh nghiệp xây dựng và quản lý dự án: Bản thiết kế giải pháp số hóa quản trị nhân lực tinh gọn, dễ bảo trì với chi phí vận hành gần như bằng 0 so với các hệ thống SaaS đắt đỏ.
  • Nhà nghiên cứu chuyển đổi số: Cung cấp dữ liệu thực nghiệm về việc tối ưu hóa quy trình điều phối lao động phổ thông trong môi trường công nghiệp nặng.

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

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 có thể vận hành ổn định trên máy chủ đám mây (VPS/Cloud) cấu hình tối thiểu 1 vCPU, 2GB RAM và 20GB SSD lưu trữ. Phía người dùng chỉ cần trình duyệt web hiện đại (Google Chrome, Safari, Microsoft Edge) hỗ trợ JavaScript ES6.

2. Khả năng mở rộng (Scalability) của hệ thống khi doanh nghiệp tăng quy mô nhân viên?

Nhờ kiến trúc Stateless của REST API kết hợp với khả năng mở rộng ngang (Horizontal Scaling / Sharding) của MongoDB, hệ thống có thể dễ dàng chịu tải từ 500 đến 10.000 nhân viên mà không cần thay đổi kiến trúc mã nguồn cốt lõi.

3. Hệ thống có thể tích hợp với máy chấm công vân tay hoặc phần mềm kế toán có sẵn không?

Có. Backend xây dựng dựa trên các RESTful API chuẩn hóa, cho phép các hệ thống bên thứ ba (Third-party ERP, phần mềm MISA, máy chấm công Hikvision/ZKTeco) đồng bộ dữ liệu thông qua các API Webhook và mã khóa API Key bảo mật.

4. Chi phí duy trì và bảo trì hệ thống hàng tháng ước tính là bao nhiêu?

Nếu triển khai trên các hạ tầng đám mây như DigitalOcean, AWS Lightsail hoặc Linode, chi phí vận hành máy chủ dao động từ 150.000 đến 350.000 VNĐ/tháng, không phát sinh chi phí bản quyền phần mềm nhờ 100% công nghệ mã nguồn mở (Open Source).

5. Dữ liệu công nhân và dự án được sao lưu (Backup) như thế nào để phòng sự cố?

Hệ thống hỗ trợ cấu hình tiến trình tự động chạy công cụ mongodump theo định kỳ hàng ngày, nén dữ liệu và đồng bộ lên bộ lưu trữ đám mây (Google Cloud Storage / Amazon S3), đảm bảo RPO (Recovery Point Objective) dưới 24 giờ khi có sự cố phần cứng.


Kết luận

Đề tài "Xây dựng website quản lý nhân sự của công ty xây dựng DMM" đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng thực tiễn đặt ra. Bằng việc kết hợp sức mạnh xử lý giao diện linh hoạt của ReactJS và khả năng mở rộng của Node.js/Express.js & MongoDB, hệ thống đã giải quyết trọn vẹn bài toán điều phối nhân công, quản lý dự án và tự động hóa chu trình phê duyệt tăng ca cho môi trường thi công công trình.

Đây là minh chứng điển hình cho việc ứng dụng công nghệ phần mềm hiện đại nhằm giải phóng sức lao động quản lý, nâng cao năng suất và tạo nền tảng vững chắc cho lộ trình chuyển đổi số trong ngành xây dựng.