сделал добавление приемов

This commit is contained in:
Андрей Дувакин 2025-06-01 15:06:27 +05:00
parent 08c3bb5c7b
commit 1dbd83af2e
3 changed files with 22 additions and 36 deletions

View File

@ -1,8 +1,6 @@
import ReactQuill from 'react-quill'; import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css'; import 'react-quill/dist/quill.snow.css';
import dayjs from "dayjs"; import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";
import { import {
Button, Button,
Collapse, Collapse,
@ -24,10 +22,6 @@ import LoadingIndicator from "../../../../../../Widgets/LoadingIndicator.jsx";
import {useMemo} from "react"; import {useMemo} from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.tz.setDefault('Europe/Moscow');
const AppointmentFormModal = ({onCancel}) => { const AppointmentFormModal = ({onCancel}) => {
const appointmentFormModalData = useAppointmentFormModal(); const appointmentFormModalData = useAppointmentFormModal();
const appointmentFormModalUI = useAppointmentFormModalUI( const appointmentFormModalUI = useAppointmentFormModalUI(
@ -37,16 +31,6 @@ const AppointmentFormModal = ({onCancel}) => {
appointmentFormModalData.patients, appointmentFormModalData.patients,
); );
if (appointmentFormModalData.isError) {
return (
<Result
status="error"
title="Ошибка"
subTitle="Произошла ошибка в работе страницы"
/>
);
}
const patientsItems = appointmentFormModalUI.filteredPatients.map((patient) => ({ const patientsItems = appointmentFormModalUI.filteredPatients.map((patient) => ({
key: patient.id, key: patient.id,
label: `${patient.last_name} ${patient.first_name} (${appointmentFormModalUI.getDateString(patient.birthday)})`, label: `${patient.last_name} ${patient.first_name} (${appointmentFormModalUI.getDateString(patient.birthday)})`,
@ -107,7 +91,7 @@ const AppointmentFormModal = ({onCancel}) => {
? { ? {
patient_id: appointmentFormModalUI.selectedAppointment.patient_id, patient_id: appointmentFormModalUI.selectedAppointment.patient_id,
type_id: appointmentFormModalUI.selectedAppointment.type_id, type_id: appointmentFormModalUI.selectedAppointment.type_id,
appointment_datetime: dayjs(appointmentFormModalUI.selectedAppointment.appointment_datetime).tz('Europe/Moscow'), appointment_datetime: appointmentFormModalUI.appo,
days_until_the_next_appointment: appointmentFormModalUI.selectedAppointment.days_until_the_next_appointment, days_until_the_next_appointment: appointmentFormModalUI.selectedAppointment.days_until_the_next_appointment,
results: appointmentFormModalUI.selectedAppointment.results, results: appointmentFormModalUI.selectedAppointment.results,
} }
@ -135,7 +119,7 @@ const AppointmentFormModal = ({onCancel}) => {
label="Время приема" label="Время приема"
rules={[{required: true, message: 'Выберите время'}]} rules={[{required: true, message: 'Выберите время'}]}
> >
<DatePicker showTime format="DD.MM.YYYY HH:mm" style={{width: '100%'}}/> <DatePicker maxDate={dayjs(new Date()).add(1, 'day')} defaultValue={dayjs(new Date())} showTime format="DD.MM.YYYY HH:mm" style={{width: '100%'}}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="days_until_the_next_appointment" name="days_until_the_next_appointment"
@ -168,7 +152,7 @@ const AppointmentFormModal = ({onCancel}) => {
<p><b>Пациент:</b> {patient ? `${patient.last_name} ${patient.first_name}` : 'Не выбран'}</p> <p><b>Пациент:</b> {patient ? `${patient.last_name} ${patient.first_name}` : 'Не выбран'}</p>
<p><b>Тип приема:</b> {appointmentType ? appointmentType.name : 'Не выбран'}</p> <p><b>Тип приема:</b> {appointmentType ? appointmentType.name : 'Не выбран'}</p>
<p><b>Время <p><b>Время
приема:</b> {values.appointment_datetime ? dayjs(values.appointment_datetime).tz('Europe/Moscow').format('DD.MM.YYYY HH:mm') : 'Не указано'} приема:</b> {values.appointment_datetime ? dayjs(values.appointment_datetime).format('DD.MM.YYYY HH:mm') : 'Не указано'}
</p> </p>
<p><b>Дней до следующего приема:</b> {values.days_until_the_next_appointment || 'Не указано'}</p> <p><b>Дней до следующего приема:</b> {values.days_until_the_next_appointment || 'Не указано'}</p>
<p><b>Результаты приема:</b></p> <p><b>Результаты приема:</b></p>
@ -192,6 +176,16 @@ const AppointmentFormModal = ({onCancel}) => {
}, },
]; ];
if (appointmentFormModalData.isError) {
return (
<Result
status="error"
title="Ошибка"
subTitle="Произошла ошибка в работе страницы"
/>
);
}
return ( return (
<> <>
{appointmentFormModalData.isLoading ? ( {appointmentFormModalData.isLoading ? (

View File

@ -16,6 +16,7 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
const [selectedPatient, setSelectedPatient] = useState(null); const [selectedPatient, setSelectedPatient] = useState(null);
const [currentStep, setCurrentStep] = useState(0); const [currentStep, setCurrentStep] = useState(0);
const [appointmentDate, setAppointmentDate] = useState(dayjs(new Date()));
const [searchPatientString, setSearchPatientString] = useState(""); const [searchPatientString, setSearchPatientString] = useState("");
const [formValues, setFormValues] = useState({}); const [formValues, setFormValues] = useState({});
@ -30,7 +31,7 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
const stepsContentStyle = {marginBottom: 16}; const stepsContentStyle = {marginBottom: 16};
const stepsIndicatorStyle = {marginBottom: 16}; const stepsIndicatorStyle = {marginBottom: 16};
const footerRowStyle = {marginTop: 16}; const footerRowStyle = {marginTop: 16};
const footerButtonStyle = {marginLeft: 8}; const footerButtonStyle = {marginRight: 8};
const screenXS = !screens.sm; const screenXS = !screens.sm;
const direction = screenXS ? "vertical" : "horizontal"; const direction = screenXS ? "vertical" : "horizontal";
@ -58,7 +59,7 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
patient_id: selectedAppointment.patient_id, patient_id: selectedAppointment.patient_id,
type_id: selectedAppointment.type_id, type_id: selectedAppointment.type_id,
appointment_datetime: selectedAppointment.appointment_datetime appointment_datetime: selectedAppointment.appointment_datetime
? dayjs(selectedAppointment.appointment_datetime).tz('Europe/Moscow') ? dayjs(selectedAppointment.appointment_datetime)
: null, : null,
days_until_the_next_appointment: selectedAppointment.days_until_the_next_appointment, days_until_the_next_appointment: selectedAppointment.days_until_the_next_appointment,
results: selectedAppointment.results, results: selectedAppointment.results,
@ -84,6 +85,7 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
form.setFieldsValue({patient_id: undefined}); form.setFieldsValue({patient_id: undefined});
}; };
const handleSetAppointmentDate = (date) => setAppointmentDate(date);
const modalWidth = useMemo(() => screenXS ? 700 : "90%", [screenXS]); const modalWidth = useMemo(() => screenXS ? 700 : "90%", [screenXS]);
const handleClickNextButton = async () => { const handleClickNextButton = async () => {
@ -125,11 +127,10 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
try { try {
const values = formValues; const values = formValues;
// Проверка пересечения времени
const appointmentTime = values.appointment_datetime; const appointmentTime = values.appointment_datetime;
const hasConflict = appointments.some(app => const hasConflict = appointments.some(app =>
app.id !== selectedAppointment?.id && app.id !== selectedAppointment?.id &&
dayjs(app.appointment_datetime).tz('Europe/Moscow').isSame(appointmentTime, 'minute') dayjs(app.appointment_datetime).isSame(appointmentTime, 'minute')
); );
if (hasConflict) { if (hasConflict) {
@ -142,23 +143,13 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
} }
const data = { const data = {
patient_id: values.patient_id, patient_id: selectedPatient.id,
type_id: values.type_id, type_id: values.type_id,
appointment_datetime: appointmentTime.toISOString(), appointment_datetime: appointmentTime.format("YYYY-MM-DD HH:mm:ss"),
days_until_the_next_appointment: values.days_until_the_next_appointment, days_until_the_next_appointment: values.days_until_the_next_appointment,
results: values.results, results: values.results,
doctor_id: localStorage.getItem('doctor_id'),
}; };
if (!data.doctor_id) {
notification.error({
message: 'Ошибка',
description: 'ID доктора не найден. Пожалуйста, войдите в систему.',
placement: 'topRight',
});
return;
}
if (selectedAppointment) { if (selectedAppointment) {
await updateAppointment({id: selectedAppointment.id, data}).unwrap(); await updateAppointment({id: selectedAppointment.id, data}).unwrap();
notification.success({ notification.success({
@ -209,6 +200,7 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
setSelectedPatient, setSelectedPatient,
currentStep, currentStep,
searchPatientString, searchPatientString,
appointmentDate,
handleSetSearchPatientString, handleSetSearchPatientString,
filteredPatients, filteredPatients,
handleOk, handleOk,
@ -218,6 +210,7 @@ const useAppointmentFormModalUI = (onCancel, createAppointment, updateAppointmen
getSelectedPatientBirthdayString, getSelectedPatientBirthdayString,
handleClickNextButton, handleClickNextButton,
handleClickBackButton, handleClickBackButton,
handleSetAppointmentDate,
modalWidth, modalWidth,
disableBackButton, disableBackButton,
disableNextButton, disableNextButton,

View File

@ -5,7 +5,6 @@ const initialState = {
collapsed: true, collapsed: true,
siderWidth: 250, siderWidth: 250,
hovered: false, hovered: false,
selectedDate: dayjs().format('YYYY-MM-DD'),
modalVisible: false, modalVisible: false,
selectedAppointments: [], selectedAppointments: [],
selectedAppointment: null, selectedAppointment: null,