update-full

This commit is contained in:
TuanVT
2026-06-06 01:02:07 +07:00
parent 7791e1d6a8
commit d4194d6f12
30 changed files with 1018 additions and 391 deletions
@@ -14,6 +14,7 @@ import consultationServices, {
} from "@/services/consultationServices";
import uploadServices from "@/services/uploadServices";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import moment from "moment";
import { useParams, useRouter, useSearchParams } from "next/navigation";
import React, { useEffect, useState } from "react";
@@ -62,6 +63,7 @@ const UpdateSpecialtyClinicId = () => {
res || {
id: "",
patientId: "",
patientName: "",
sessionCode: "",
visitDate: "",
status: 1,
@@ -71,50 +73,34 @@ const UpdateSpecialtyClinicId = () => {
diagnosis: null,
treatmentPlan: null,
doctorNotes: null,
isGlassesDelivered: false,
createdBy: "",
createdByName: "",
isDeleted: false,
specialtyClinics: [
{
id: "",
specialtyId: "",
specialtyName: "",
specialtyNotes: null,
diagnosis: null,
procedureNotes: null,
glassRequired: null,
glassType: null,
examinerName: "",
specialtyStatus: 1,
attachmentUrls: [],
sharedItems: [],
},
],
generalAttachmentUrls: [],
specialtyClinics: [],
aggregatedPrescriptionItems: [],
}
);
},
});
// Khai báo dữ liệu lấy từ Query phục vụ hiển thị
const generalData = consulDetailQuery.data;
// Tìm chuyên khoa hiện tại từ data trả về
const selectedSpecialtyClinic =
consulDetailQuery.data?.specialtyClinics?.find(
(item) => item.id === specialtyClinicId,
);
const selectedSpecialtyClinic = generalData?.specialtyClinics?.find(
(item) => item.id === specialtyClinicId,
);
/**
* ĐIỀU KIỆN KIỂM TRA KHOA MẮT
* Bạn hãy thay đổi điều kiện này tùy thuộc vào database của bạn.
* Ví dụ: selectedSpecialtyClinic?.specialtyId === "MẮT" hoặc kiểm tra theo tên.
*/
const isEyeClinic =
selectedSpecialtyClinic?.specialtyName?.toLowerCase().includes("mắt") ||
selectedSpecialtyClinic?.specialtyId?.toLowerCase().includes("mat");
useEffect(() => {
const consul = consulDetailQuery.data;
if (!consul) return;
if (!generalData) return;
const specialtyClinic = consul.specialtyClinics?.find(
const specialtyClinic = generalData.specialtyClinics?.find(
(item) => item.id === specialtyClinicId,
);
@@ -130,18 +116,17 @@ const UpdateSpecialtyClinicId = () => {
fileUrls: specialtyClinic.attachmentUrls || [],
});
setImages(
(consul.generalAttachmentUrls || []).map((url) => ({
(specialtyClinic.attachmentUrls || []).map((url) => ({
file: null,
img: url,
path: url,
})),
);
}, [consulDetailQuery.data, specialtyClinicId]);
}, [generalData, specialtyClinicId]);
/* =========================
UPDATE MUTATION
========================= */
const specialtyResultsMutation = useMutation({
mutationFn: async (body: { paths: string[] }) => {
if (!consultationId) {
@@ -151,14 +136,13 @@ const UpdateSpecialtyClinicId = () => {
return httpRequest({
showMessageFailed: true,
showMessageSuccess: true,
msgSuccess: "Cập nhật phiên khám thành công!",
msgSuccess: "Cập nhật kết quả khám chuyên khoa thành công!",
http: consultationServices.specialtyResults(
form.specialtyAssignmentId,
{
specialtyNotes: form.specialtyNotes,
diagnosis: form.diagnosis,
procedureNotes: form.procedureNotes,
// Nếu không phải khoa mắt, gán mặc định false và chuỗi rỗng khi gửi API
glassRequired: isEyeClinic ? form.glassRequired : false,
glassType: isEyeClinic ? form.glassType : "",
fileUrls: body.paths,
@@ -177,7 +161,6 @@ const UpdateSpecialtyClinicId = () => {
});
router.back();
router.push(PATH.CONSULTATION || "/consultation");
},
});
@@ -195,12 +178,9 @@ const UpdateSpecialtyClinicId = () => {
if (files.length > 0) {
const uploadResult: any = await uploadServices.uploadImage({
Files: files,
SessionCode: consulDetailQuery.data?.sessionCode,
SessionCode: generalData?.sessionCode,
});
console.log("Cấu trúc log kiểm tra uploadResult:", uploadResult);
// CẬP NHẬT Ở ĐÂY: Lấy trực tiếp từ uploadResult hoặc bóc tách đúng tầng data
const uploadedUrls =
uploadResult?.fileUrls || uploadResult?.data?.fileUrls || [];
@@ -243,26 +223,64 @@ const UpdateSpecialtyClinicId = () => {
</div>
</div>
{/* CHUYÊN KHOA INFO */}
<InputForm
label="Chuyên khoa đảm nhận"
name="specialtyAssignmentId"
type="text"
value={
selectedSpecialtyClinic
? `${selectedSpecialtyClinic.specialtyName}`
: "Chưa có thông tin chuyên khoa"
}
placeholder="Thông tin chuyên khoa"
isRequired
readOnly
/>
{/* KHỐI THÔNG TIN KHÁM CHUNG (Luôn cố định 3 cột đẹp mắt) */}
<div className="mt-2">
<h3 className="mb-4 text-sm font-semibold uppercase tracking-wider text-gray-400">
Thông tin khám chung
{/* THÔNG TIN HÀNH CHÍNH & PHIÊN KHÁM TỔNG QUÁT */}
<div className="rounded-xl border border-gray-200 bg-[#f8fafc] p-5">
<h3 className="mb-4 text-xs font-bold uppercase tracking-wider text-gray-500">
Thông tin tổng quan phiên khám
</h3>
<div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
<div>
<span className="text-xs font-medium text-gray-400 block uppercase">
Tên bệnh nhân
</span>
<span className="text-base font-bold text-gray-700 mt-0.5 block">
{generalData?.patientName || "Chưa có thông tin"}
</span>
</div>
<div>
<span className="text-xs font-medium text-gray-400 block uppercase">
Ngày sinh
</span>
<span className="text-base font-medium text-gray-700 mt-0.5 block">
{generalData?.patientDateOfBirth
? moment(generalData?.patientDateOfBirth).format("DD/MM/YYYY")
: "---"}
</span>
</div>
<div>
<span className="text-xs font-medium text-gray-400 block uppercase">
phiên khám tổng quát
</span>
<span className="text-base font-semibold text-blue-600 mt-0.5 block">
#{generalData?.sessionCode || "Chưa có mã"}
</span>
</div>
</div>
</div>
{/* KHỐI THÔNG TIN KHÁM CHUYÊN KHOA */}
<div className="mt-2">
<h3 className="mb-4 text-xs font-bold uppercase tracking-wider text-gray-500">
Kết quả khám chuyên khoa đm nhận
</h3>
<div className="mb-5">
<InputForm
label="Chuyên khoa tiếp nhận"
name="specialtyAssignmentId"
type="text"
value={
selectedSpecialtyClinic
? `${selectedSpecialtyClinic.specialtyName}`
: "Chưa có thông tin chuyên khoa"
}
placeholder="Thông tin chuyên khoa"
isRequired
readOnly
/>
</div>
<GridColumn col={3}>
<InputForm
label="Ghi chú chuyên khoa"
@@ -277,9 +295,9 @@ const UpdateSpecialtyClinicId = () => {
/>
<InputForm
type="text"
label="Chuẩn đoán chuyên khoa"
label="Chẩn đoán chuyên khoa"
name="diagnosis"
placeholder="Nhập Chuẩn đoán"
placeholder="Nhập chẩn đoán chuyên khoa"
isRequired
value={form.diagnosis}
onChangeValue={(v) =>
@@ -308,7 +326,6 @@ const UpdateSpecialtyClinicId = () => {
</h3>
<div className="flex flex-col gap-5">
{/* Radio Chọn Có/Không */}
<div>
<label className="text-sm font-medium text-gray-700">
Bệnh nhân chỉ đnh đeo kính không?
@@ -342,7 +359,6 @@ const UpdateSpecialtyClinicId = () => {
</div>
</div>
{/* TextArea Loại Kính (Trải rộng ra 100% dòng tạo cảm giác thoáng đãng) */}
{form.glassRequired && (
<div className="mt-2 animate-fadeIn ">
<TextArea
@@ -359,11 +375,12 @@ const UpdateSpecialtyClinicId = () => {
</div>
</div>
)}
<div className="space-y-4">
<label className="text-sm font-medium">Tài liệu đính kèm</label>
<label className="text-sm font-medium">
Tài liệu đính kèm chuyên khoa
</label>
<UploadMultipleFile images={images} setImages={setImages} />
{uploading && (
<p className="text-sm text-blue-500">Đang upload file...</p>
)}