Как реализовать сервис услуг «запись к кому-то(доктор, психолог и т.д.)»?

Всем привет! Разрабатываю сервис услуг. Имеются такие таблицы с такими полями:

Table service - таблица содержит настройки для сервиса, который будет создаваться;
mysql> describe service;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int          | NO   | PRI | NULL    | auto_increment |
| name          | varchar(255) | NO   |     | NULL    |                |
| location      | varchar(255) | YES  |     | NULL    |                |
| description   | varchar(255) | YES  |     | NULL    |                |
| event_link    | varchar(255) | NO   |     | NULL    |                |
| event_color   | varchar(100) | YES  |     | NULL    |                |
| start_period  | date         | NO   |     | NULL    |                |
| end_period    | date         | NO   |     | NULL    |                |
| duration      | time         | NO   |     | NULL    |                |
| buffer_after  | time         | NO   |     | NULL    |                |
| buffer_before | time         | NO   |     | NULL    |                |
| max_customer  | int          | NO   |     | NULL    |                |
| is_enable     | tinyint(1)   | NO   |     | NULL    |                |
| type          | varchar(50)  | NO   |     | NULL    |                |
| optimization  | varchar(50)  | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

Пример что содержится в таблице:

mysql> select * from service;
+----+---------+----------+-------------+------------+-------------+--------------+------------+----------+--------------+---------------+--------------+-----------+--------------+--------------+
| id | name    | location | description | event_link | event_color | start_period | end_period | duration | buffer_after | buffer_before | max_customer | is_enable | type         | optimization |
+----+---------+----------+-------------+------------+-------------+--------------+------------+----------+--------------+---------------+--------------+-----------+--------------+--------------+
|  1 | Default | NULL     | NULL        | default    | NULL        | 2020-12-20   | 2021-02-19 | 00:40:00 | 00:00:00     | 00:00:00      |            1 |         1 | organization | distribution |


Table intervals_rule - содержит график работ для сервиса:
mysql> describe intervals_rule;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| service_id | int         | YES  | MUL | NULL    |                |
| start_time | time        | NO   |     | NULL    |                |
| end_time   | time        | NO   |     | NULL    |                |
| name_day   | varchar(50) | NO   |     | NULL    |                |
| type       | varchar(50) | NO   |     | NULL    |                |
| date       | date        | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

Пример что содержится в таблице intervals_rule
mysql> select * from intervals_rule;
+----+------------+------------+----------+----------+------+------+
| id | service_id | start_time | end_time | name_day | type | date |
+----+------------+------------+----------+----------+------+------+
|  1 |          1 | 09:30:00   | 17:00:00 | Mon      | wday | NULL |
|  2 |          1 | 09:30:00   | 17:00:00 | Tue      | wday | NULL |
|  3 |          1 | 09:30:00   | 17:00:00 | Thu      | wday | NULL |
|  4 |          1 | 09:30:00   | 17:00:00 | Wed      | wday | NULL |
|  5 |          1 | 09:30:00   | 17:00:00 | Sat      | wday | NULL |
|  6 |          1 | 09:30:00   | 17:00:00 | Sun      | wday | NULL |
|  7 |          2 | 09:30:00   | 17:00:00 | Sun      | wday | NULL |
+----+------------+------------+----------+----------+------+------+
7 rows in set (0.00 sec)


Table appointment - содержит клиентов, которые записались к сервису:
mysql> describe appointment;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int      | NO   | PRI | NULL    | auto_increment |
| service_id  | int      | YES  | MUL | NULL    |                |
| employee_id | int      | YES  | MUL | NULL    |                |
| id_customer | int      | YES  |     | NULL    |                |
| notes       | longtext | YES  |     | NULL    |                |
| start_time  | time     | NO   |     | NULL    |                |
| end_time    | time     | NO   |     | NULL    |                |
| date        | date     | NO   |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+

Пример что содержится в таблице:
mysql> select * from appointment;
+----+------------+-------------+-------------+--------+------------+----------+------------+
| id | service_id | employee_id | id_customer | notes  | start_time | end_time | date       |
+----+------------+-------------+-------------+--------+------------+----------+------------+
|  1 |          1 |           1 |           5 | String | 12:00:00   | 12:40:00 | 2020-12-31 |
+----+------------+-------------+-------------+--------+------------+----------+------------+


С этими таблицами, с таким содержание, все работает хорошо. Все добавляется. Но проблема вот в чем. С такой бд я не смогу получить интервалы времени, которые заняты или свободны.
Для сведения, сервис содержит поле duration, которое описывает длительность работы "сеанса" с клиентом; на один и тот же момент времени может быть лишь один appointment(клиент).

Таблица intervals_rule имеет поля start_time, end_time это поля, которые показывают со скольки и до скольки работает сервис; name_day это имя дня(Mon, Thu, Tue, Wed,Fri,Sat,Sun). То есть таблица отвечает в какой день работает сервис и время работы сервиса.
Мне нужно как-то получить интервалы времени, которые свободны или заняты для сервиса. Типа... имеется день Mon, у него график работы 09:00-17:00, длительность сеанса с клиентом 30 минут. Получаются интервалы времени: 09:00, 09:30, 10:00,10:30,11:00,11:30,12:00 и т.д.. То есть нужно получить интервалы, но некоторые из них могут быть заняты. Как такое реализовать? Получается, что нужно делать еще одну таблицу? Но в таком случает будет очень много записей. К примеру: 1 сервис, у него 7 записей в intervals_rule и у каждой записи из intervals_rule будет по 20 записей в другой таблице с интервалами. Это не слишком много?

Я придумал лишь одно решение. Это создавать еще одну таблицу с интервалами. По другому можно как-то решить эту проблему? Может у меня изначально реализация неверная? Подскажите, пожалуйста
  • Вопрос задан
  • 281 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Ic2d
Самоучка:)
.Когда-то выполнял такую задачу. Конечный результат так и не могу найти, а вот файлы наброски умудрился найти какимто образом. Может поможет направить в нужное русло.

<?php
$startwork='09:00:00'; //Начало работы
$endwork='9'; //количество часов рабочих

$dayw=date("w", strtotime($_SESSION['startday']));
for($i=0; $i < 7; $i++) {
	if ($dayw>='7') { $dayw='0'; }
	$date = date('d-m-Y', strtotime($_SESSION['startday'].'+'.$i.' day'));
	if ($dayw!="0" or $dayw!="6") {
		if ($dayw=="1")  { $daywt="Понедельник"; 
		} elseif ($dayw=='2') { $daywt="Вторник";
		} elseif ($dayw=='3') { $daywt="Среда";
		} elseif ($dayw=='4') { $daywt="Четверг"; 
		} elseif ($dayw=='5') { $daywt="Пятница"; 
		} elseif ($dayw=='6') { $dayw++; continue; $daywt="Суббота"; 
		} elseif ($dayw=='0') { $dayw++; continue; $daywt="Воскресенье"; 
		}
		echo ($daywt."<br>".$date."<br>");
		
		$a=0; //Переменная для цикла считает часы
		$time=$startwork; //Переменная для цикла начало времени
		while ($a<=$endwork) {
				$STH = $mysqlcon->query("SELECT * from ".$bookdb." WHERE (datestart<='".$datesearch."' AND dateend>='".$datesearch2."')");  
				$num_rows = $STH->rowCount();
				if ($num_rows=='0') {
					echo ('Свободно<br>');
				} else {
					echo ('Занято<br>');
				}
				
				$time = date('H:i:s', strtotime($time.'+30 minute'));
				$a=$a+0.5; // Бронирование ставится на каждые пол часа
			}
		}
		$dayw++;
}
?>
 
Если как-то доработаешь, поделись пожалуйста. Очень жалею что потерял полный исходник :(
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы