Files
sisvietnamvn_01/Logic_review_bacsi.md
T

4.7 KiB

Patient Testimonial (Review) Feature Implementation Plan

Mục tiêu: Xây dựng tính năng "Cảm nhận của người bệnh" trên trang chi tiết bác sĩ, cho phép người dùng gửi đánh giá (bắt buộc kèm số điện thoại). Đánh giá sẽ không hiển thị ngay mà phải qua bước kiểm duyệt của admin. Admin phê duyệt/từ chối sẽ được lưu log lại.

User Review Required

Important

  • Về việc lưu log (người duyệt/từ chối): Bạn có đồng ý với phương án thêm 2 trường reviewedBy (lưu username của người duyệt) và reviewedAt (lưu thời gian duyệt) trực tiếp vào bảng đánh giá thay vì tạo một bảng log riêng biệt cho đơn giản không?
  • Về Form đánh giá ở ngoài frontend: Sẽ sử dụng AJAX để gửi dữ liệu về server. Nếu thành công sẽ hiển thị thông báo "Đánh giá của bạn đã được gửi và đang chờ kiểm duyệt."

Proposed Changes


1. Database Entity Models

Thêm mới Entity cho tính năng Đánh giá:

[NEW] src/main/java/com/sisvietnamvn/web/domain/enumeration/ReviewStatus.java

  • Tạo Enum với các trạng thái: PENDING, APPROVED, REJECTED.

[NEW] src/main/java/com/sisvietnamvn/web/domain/PatientReview.java

  • Chứa các trường: id, doctor (ManyToOne), patientName, phoneNumber (bắt buộc), rating (1-5), content, status (mặc định PENDING).
  • Kế thừa AbstractAuditingEntity để tự động có createdBy, createdDate...
  • Bổ sung trường reviewedBy (Lưu ai là người duyệt) và reviewedAt (Lưu thời điểm duyệt).

2. Repository & Service Layer

[NEW] src/main/java/com/sisvietnamvn/web/repository/PatientReviewRepository.java

  • Chứa các hàm query: tìm theo bác sĩ và trạng thái (findByDoctorAndStatus), phân trang cho trang quản trị.

[NEW] src/main/java/com/sisvietnamvn/web/service/PatientReviewService.java

  • Chứa logic:
    • submitReview: Nhận review từ frontend, validate số điện thoại, gán PENDING.
    • approveReview: Đổi trạng thái thành APPROVED, lưu reviewedBy là username hiện tại.
    • rejectReview: Đổi trạng thái thành REJECTED, lưu log.
    • getApprovedReviewsByDoctor: Trả về danh sách review để hiển thị trên trang chi tiết bác sĩ.
    • getReviewStats: Tính trung bình sao và tổng số review.

3. Controllers

[NEW] src/main/java/com/sisvietnamvn/web/controller/PatientReviewPublicController.java

  • API POST /api/public/reviews: Nhận form submit bằng AJAX từ trang chi tiết bác sĩ, validate dữ liệu (số điện thoại, sao đánh giá) và lưu vào database với trạng thái chờ duyệt.

[NEW] src/main/java/com/sisvietnamvn/web/controller/ManagePatientReviewController.java

  • Các endpoint trang quản trị:
    • GET /manage/reviews: Danh sách tất cả các đánh giá.
    • POST /manage/reviews/{id}/approve: Duyệt đánh giá.
    • POST /manage/reviews/{id}/reject: Từ chối đánh giá.

4. Admin UI (Manage)

[MODIFY] src/main/resources/templates/fragments/manage-layout.html

  • Thêm mục menu "Đánh giá người bệnh" vào sidebar.

[NEW] src/main/resources/templates/manage/reviews/list.html

  • Trang hiển thị bảng danh sách các đánh giá.
  • Có các nút "Approve" (Duyệt) và "Reject" (Từ chối).
  • Cột log hiển thị "Người duyệt" và "Thời gian duyệt".

5. Public UI (Doctor Detail)

[MODIFY] src/main/resources/templates/doctor-detail.html

  • Xoá display: none của khối "Cảm nhận của người bệnh".
  • Phần danh sách: Dùng Thymeleaf để loop qua danh sách APPROVED reviews truyền từ controller, hiển thị trung bình sao và các bình luận.
  • Phần Form:
    • Thêm field "Số điện thoại" (Bắt buộc).
    • Thêm field "Họ và tên".
    • Thêm Javascript (AJAX) xử lý gửi form tới /api/public/reviews. Khi thành công sẽ hiện thông báo popup báo chờ duyệt. Khóa nút submit tạm thời tránh spam.

Verification Plan

Automated & Manual Verification

  • Truy cập vào trang chi tiết bác sĩ, thực hiện điền form đánh giá (có validate số điện thoại).
  • Đảm bảo form báo thành công và đánh giá chưa xuất hiện.
  • Đăng nhập vào trang quản trị Admin (/manage/reviews), kiểm tra có đánh giá vừa gửi (trạng thái PENDING).
  • Nhấn "Approve", lúc này hệ thống cập nhật reviewedBy.
  • Quay lại trang bác sĩ xem đánh giá đã được hiển thị công khai cùng với thay đổi về điểm đánh giá trung bình.