NodeJS как выполнить функцию только в рабочее время? - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно вызвать функцию отправки писем пользователям только в рабочее время .

Функция отправки писем работает, и я знаю, как выполнять задания CRON.

У разных пользователей разное рабочее время;например:

Пользователь 1: [9:00; 12:30] и [14:00; 17:30]

Пользователь 2: [8:30; 12:00] и [13:00; 16:30]

и т. д..

и он может отличаться с понедельника по воскресенье.

Если бы все часы были одинаковыми для всех пользователей и всех дней, без перерыва на обед, у меня была бы пара ключей в моемMySQL DB "mailEnableHour" и "mailDisableHour", которые моя функция проверяет перед любым действием ...

Но проблема на самом деле более сложная: 7 дней x 4 раза = 28 ключей ...

Вопрос:

Как бы вы организовали БД для хранения этих 28 ключей для каждого пользователя, пожалуйста?

Знаете ли вы, как сократить 28 ключей до уникального ключа?

Как получить более «гибкий» код (давайте представим, что у меня есть новый перерыв, который можно добавить в будущем, например [10h30; 10h45])?

Спасибо за вашу помощь:)

С уважением.

1 Ответ

0 голосов
/ 12 декабря 2018

В идеале вам нужен ИНТЕРВАЛЬНЫЙ тип данных .Но похоже, что MySQL не имеет поддержки для этого.Но даже с этим типом данных вам понадобится другая таблица.

Если я правильно понимаю, не только эти часы могут меняться для каждого пользователя, но они могут меняться в день для одного и того же пользователя.

Итак

Пользователь 1 Понедельник: [9.00 - 12.30] & [14.00 - 17.30]

Пользователь 1 Вторник: [10.00 - 13.30] & [14.30 - 18.00]

Если этоВ этом случае лучше всего использовать другую таблицу - что-то вроде MailEligibleWorkHours, где вы можете установить эти поля в качестве индексов и оттуда запрашивать пользователей / права на участие.(День является одним из столбцов). Возможно, ваша фактическая таблица пользователей содержит множество других полей, которые могут помочь вам оптимизировать объединение (например, пользователь в отпуске / в отпуске по уходу за ребенком и т. Д.).

Если вы хотитечтобы сделать его еще более гибким, вы можете иметь таблицу interval, с которой вам нужно будет ссылаться interval_id на вашу таблицу MailEligibleWorkHours.Этот дизайн позволит вам

  1. Добавить / удалить временные интервалы в зависимости от ситуации.
  2. Повторно использовать временной интервал, который уже был определен (например, понедельник 09.00 - 12.30 слот)
  3. Скорее всего, TimeIntervals не будут огромной таблицей, поэтому вы можете запрашивать все и кэшировать ids + временные интервалы, что означало бы, что вы можете выяснить это с помощью одного приема без каких-либо объединений , если сотрудникправо на получение почты в это время.

MailEligibleWorkHours table

| employee-id | interval_id |
|:------------|:------------|
| 111         | 1           |
| 111         | 3           |
| 132         | 2           |

TimeIntervals table

| interval_id | dayOfWeek | timestart | timeend |
|:------------|:----------|:----------|:--------|
| 1           |  1        |  12.00    | 13.30   |
| 3           |  4        |  14:00    | 16:30   |
| 2           |  3        |  09:00    | 12:30   |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...