/
El_Capulco
/
Clinic
Обзор
Документация
Войти
/
El_Capulco
/
Clinic
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server/src/services/scheduleService.js
92 строки
3 KB
Phofan
Готовый проект
24 мар 2026, 19:09
24 мар 2026, 19:09
4fc54b6
Код
Авторство
О чём код?
import { pool } from "../db/pool.js"; import { HttpError } from "../utils/httpError.js"; import { v4 as uuidv4 } from "uuid"; import { generateSlots } from "../utils/slots.js"; export async function createWorkSchedule(payload) { const { doctorId, date, startTime, endTime, slotMinutes, breakStart = null, breakEnd = null } = payload; if (!doctorId || !date || !startTime || !endTime || !slotMinutes) { throw new HttpError(400, "doctorId, date, startTime, endTime, slotMinutes are required"); } const id = uuidv4(); const slotDateTimes = generateSlots({ date, startTime, endTime, slotMinutes, breakStart, breakEnd }); if (slotDateTimes.length === 0) throw new HttpError(400, "No slots generated"); const conn = await pool.getConnection(); try { await conn.beginTransaction(); const [exists] = await conn.query( "SELECT id FROM work_slots WHERE doctor_id=? AND date=? LIMIT 1", [doctorId, date] ); if (exists.length) throw new HttpError(409, "Schedule for this doctor/date already exists"); await conn.query( `INSERT INTO work_slots (id, doctor_id, date, start_time, end_time, slot_minutes, break_start, break_end) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, doctorId, date, startTime, endTime, slotMinutes, breakStart, breakEnd] ); const values = slotDateTimes.map((dt) => [id, doctorId, dt, 1]); await conn.query( "INSERT INTO slots (work_slot_id, doctor_id, slot_datetime, is_available) VALUES ?", [values] ); await conn.commit(); return { id, slotCount: slotDateTimes.length }; } catch (e) { await conn.rollback(); throw e; } finally { conn.release(); } } export async function getDoctorScheduleDay(doctorId, date) { if (!date) throw new HttpError(400, "date is required"); const [rows] = await pool.query( `SELECT s.slot_datetime, COALESCE(a.status, 'free') AS status, a.patient_code, a.patient_name, a.patient_phone, a.id AS appointment_id FROM slots s LEFT JOIN appointments a ON a.doctor_id = s.doctor_id AND a.slot_datetime = s.slot_datetime AND a.status IN ('booked','canceled','completed') WHERE s.doctor_id = ? AND DATE(s.slot_datetime) = ? ORDER BY s.slot_datetime`, [doctorId, date] ); return rows; } // Получить все слоты всех врачей export async function getAllSlots() { const [rows] = await pool.query( `SELECT ws.id AS workSlotId, ws.doctor_id AS doctorId, ws.date, ws.start_time AS startTime, ws.end_time AS endTime, ws.slot_minutes AS slotMinutes, ws.break_start AS breakStart, ws.break_end AS breakEnd, s.slot_datetime, s.is_available AS isAvailable FROM work_slots ws JOIN slots s ON s.work_slot_id = ws.id ORDER BY ws.date, s.slot_datetime` ); return rows; }