Files
sisvietnamvn_01/Logic_review_bacsi.md

80 lines
4.7 KiB
Markdown

# 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.