Ngoài tính năng gửi thư thông thường sử dụng email thì tính năng thư nội bộ giữa quản trị viên, người dùng với nhau cũng rất hay được sử dụng trong các dự án phần mềm, vậy nên EzyPlatform đã đóng gói tính năng này để các nhà phát triển không cần phải tạo lại nữa.

Thiết kế cơ sở dữ liệu

Cũng gần tương tự như quản lý thông báo, tính năng quản lý thư nội bộ cũng sử dụng 2 bảng:

EzyPlatform quản lý thư nội bộ thế nào - thiet ke bang.png
  1. ezy_letters: Bảng này chứa thông tin của thư nội bộ.
  2. ezy_notification_receivers: Bảng này chứa thông tin người nhận thư nội bộ.

Một thông thư nội bộ có thể gửi đến nhiều người. Một người cũng có thể nhận được nhiều thư nội bộ khác nhau.

Mã nguồn SQL của hai bảng này như sau:

CREATE TABLE IF NOT EXISTS `ezy_letters` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `letter_type` varchar(25) COLLATE utf8mb4_unicode_520_ci,
  `title` varchar(1200) COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `content` varchar(12000) COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `from_admin_id` bigint unsigned,
  `from_user_id` bigint unsigned,
  `parent_id` bigint unsigned DEFAULT 0,
  `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'DRAFT',
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `index_letter_type` (`letter_type`),
  INDEX `index_from_admin_id` (`from_admin_id`),
  INDEX `index_from_user_id` (`from_user_id`),
  INDEX `index_status` (`status`),
  INDEX `index_parent_id` (`parent_id`),
  INDEX `index_created_at` (`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

CREATE TABLE IF NOT EXISTS `ezy_letter_receivers` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `letter_id` bigint unsigned NOT NULL,
  `to_admin_id` bigint unsigned,
  `to_user_id` bigint unsigned,
  `notification_receiver_id` bigint unsigned NOT NULL DEFAULT 0,
  `confidence_level` varchar(25) COLLATE utf8mb4_unicode_520_ci,
  `important_level` varchar(25) COLLATE utf8mb4_unicode_520_ci,
  `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'SENT',
  `sent_at` datetime NOT NULL,
  `received_at` datetime,
  `read_at` datetime,
  PRIMARY KEY (`id`),
  UNIQUE KEY `key_letter_to_admin_id` (`letter_id`, `to_admin_id`),
  UNIQUE KEY `key_letter_to_user_id` (`letter_id`, `to_user_id`),
  INDEX `index_letter_id` (`letter_id`),
  INDEX `index_to_admin_id` (`to_admin_id`),
  INDEX `index_to_user_id` (`to_user_id`),
  INDEX `index_notification_receiver_id` (`notification_receiver_id`),
  INDEX `index_confidence_level` (`confidence_level`),
  INDEX `index_important_level` (`important_level`),
  INDEX `index_status` (`status`),
  INDEX `index_sent_at` (`sent_at`),
  INDEX `index_received_at` (`received_at`),
  INDEX `index_read_at` (`read_at`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Một số trường bạn có thể lưu ý đó là:

  1. letter_type: Là loại thư nội bộ, ví dụ order_approved, order_rejected.
  2. title: Là tiêu đề của thư nội bộ.
  3. content: Là nội dung của thông báo, bạn cũng nên giữ cho nội dung của thông báo ngắn gọn.
  4. parent_id: Là email cha, bạn có thể sử dụng trường này để gom các thư nội bộ vào chung một luồng.
  5. confidence_level: Là mức độ bảo mật của thư nội bộ để người đọc có thể cảnh giác, thông thường bạn sẽ không dùng đến trường này.
  6. important_level: Là mức độ quan trọng của thư nội bộ để người đọc có thể cảnh giác, thông thường bạn sẽ không dùng đến trường này.

Thiết kế lớp

Cũng tương tự như tính năng quản lý thông báo, đây là một thiết kế lớp tương đối phức tạp với sự tham ra của rất nhiều lớp khác nhau:

EzyPlatform quản lý thư nội bộ thế nào - thiet ke lop.png
  1. Letter: Lớp này ánh xạ đến bảng ezy_letters.
  2. LetterReceiver: Lớp này ánh xạ đến bảng ezy_letter_receivers.
  3. LetterRepository: Giao diện để truy vấn bảng ezy_letters.
  4. LetterReceiverRepository: Giao diện để truy vấn bảng ezy_letter_receivers.
  5. LetterService: Giao diện cung cấp các hàm cơ sở cho nghiệp vụ thông báo.
  6. DefaultLetterService: Lớp cài đặt các hàm cơ sở cho nghiệp vụ thông báo.
  7. AdminLetterService: Lớp thừa kế DefaultLetterService để sử dụng cho admin.
  8. WebLetterService: Lớp thừa kế DefaultLetterService để sử dụng cho web.
  9. PaginationLetterRepository: Lớp cung cấp phân trang dữ liệu cho bảng ezy_letters.
  10. AdminPaginationLetterRepository: Lớp thừa kế PaginationLetterRepository và sử dụng cho admin.
  11. WebPaginationLetterRepository: Lớp thừa kế PaginationLetterRepository và sử dụng cho web.
  12. PaginationLetterService: Lớp cung cấp phân trang dữ liệu các thông báo.
  13. AdminPaginationLetterService: Lớp thừa kế PaginationLetterService và sử dụng cho admin.
  14. AdminPaginationLetterService: Lớp thừa kế PaginationLetterService và sử dụng cho web.
  15. Lớp AdminLetterControllerService: Lớp cung cấp các hàm tổng hợp dữ liệu cho nghiệp vụ thông báo dùng cho admin.
  16. Lớp WebLetterControllerService: Lớp cung cấp các hàm tổng hợp dữ liệu cho nghiệp vụ thông báo dùng cho web.
  17. AdminLettersController: Lớp cung cấp các API cho tính năng thông báo phía admin.
  18. WebApiLetterController: Lớp cung cấp các API cho tính năng thông báo phía web, tuy nhiên bạn sẽ cần phải thừa kế lại lớp này và khai báo @Controller("/api/v1") thì mới có API để sử dụng.

Sử dụng trong thực tế

Tại admin bạn có thể truy cập vào hòm thư để xem danh sách các thư:

Screenshot 2024-12-23 at 16.17.56.png

Bạn có thể click vào một thư để xem nội dung, ví dụ:

Screenshot 2024-12-23 at 16.18.09.png

Để sử dụng được tính năng thư nội bộ cho người dùng, bạn có thể cài EzyAccount Plugin, người dùng của bạn có thể xem được thư trong hòm thư của họ, ví dụ:

Screenshot 2024-12-23 at 16.22.01.png

Tổng kết

Quản lý thư nội bộ là tính năng tương đối hữu ích để tránh phụ thuộc vào hoàn toàn email thông thường. Với việc đóng gói lại tính năng này, EzyPlatform sẽ hỗ trợ các nhà phát triển có thêm một lựa chọn trong việc phát triển các phần mềm có sự giao tiếp giữa người dùng hay quản trị viên, ví dụ hệ thống hỗ trợ người dùng qua ticket chẳng hạn.