powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите по планировщику заданий: как хранить время (распорядок дня)?
5 сообщений из 5, страница 1 из 1
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
    #36448332
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Нарезали мне задачку - сделать автоматическое предварительное планирование работникам неких заданий по дням и часам, что-то типа планировщика задач. Суть: поступает заявка на выполнение некоего задания - необходимо подобрать работника под это задание и назначить примерное время исполнения. Средние сроки исполнения задач - известны. Скажем, покурить - 15 минут :)

Первое что понятно - надо сохранить глобальный распорядок работы конторы по дням недели. "Глобальные" настройки хранятся в отдельной таблице с одной записью и мильёном полей, туда же предполагается и распорядок записать, но вот в каком виде?

К примеру, фирма работает Пнд/Втр/Срд/Чтв с 9-00 до 17-30 с перерывом на обед с 12-00 до 12-30, Птн с 9-00 до 15-00 с обедом с 11-30 до 12-00 и/или + там еще в субботу с 10-00 до 13-00 без обеда.
Еще и случаются сокращенные дни перед праздниками, что тоже как-то надо учитывать... Ну, допустим, я заведу для этого отдельную таблицу и буду туда вносить только такие дни и все. Проверить по дате будет нетрудно, но опять же - как индивидуально для такого дня распорядок сохранить? И это еще не учитывая таких "приятных" мелочей как отпуск, праздники и тп...

Плюс еще стоит требование определенные задания планировать только на определенные дни недели (как бы глобально для заданий), а некоторые - индивидуально по работникам, с приоритетом индивидуального по отношению к глобальному, т.е. если не задано индивидуально - берем из глобальной таблицы. Например, задание - курьер, глобально задано выполнять по средам с 10-00 до 12-00, но Иванову назначать - по понедельникам с 14-00 до 16-00, а Петрову - по вторникам с 13-00 до 15-00 и тд и тп. А если нигде ничего по заданию не задано - значит в любой день любому челу. Еще предполагаю что будет мулька типа "а эти задания можно нарезать только Сидорову"...
Ясно что надо делать кучу таблиц: таблицу видов заданий, таблицу распределения этих заданий глобально по дням недели и часам, таблицу работников и потом еще таблицу для порядка распределения заданий инд. по работникам по дням и часам недели...

Для выполнения задачи, как мне представляется, необходимо будет делать выборку как-то так, чтобы в выборку попали только "пробелы" рабочего времени в минутах(было бы вообще супер!) либо еще как-то, я не представляю как. Кроме того видно что необходимо еще и сопоставление в выборке DOW(), данные о которых тоже непонятно как хранить чтобы в условиях выборки задавать...

Т.е. получается что распорядок в виде поминутного списка должен быть или как? Для одного 8-часового рабочего дня это будет 480 записей... Как-то тупо получается...

Помогите, пожалуйста, дельным советом/идеей!

спасибо!
...
Рейтинг: 0 / 0
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
    #36449714
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KO,
Из написанного следует, что мы имеем некоторое логистическое распределение задач. Конечно, поминутное распределение здесь не делается, нужно хорошо распределить все данные по таблицам и правильно их связать.
Чтобы кто-то из форумчан взялся сделать все как нужно, необходимо как минимум:
а) подробное техзадание;
б) договор об оплате и сроках работ.
Если это нереально, то рекомендую срочно браться за дело самому: через некоторое количество времени, необходимое на созревание, будет все ясно с логистикой, структурами и связями таблиц.
Иначе в этой жизни ничего не выходит.
...
Рейтинг: 0 / 0
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
    #36450042
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще, практический пример:
Представьте себе некий крупный Сервисный Центр. Вы в понедельник принесли в СЦ, скажем, ноутбук, который вышел из строя в течении гарантийного срока.
Приемщик берет Ваш ноут и выдает Вам квитанцию, но Вы ведь хотите не только поменять ноут на бумажку, но хотябы примерно узнать когда следующий раз перезвонить/наведаться.
Теперь смотрим в СЦ - в СЦ работает 15 мастеров, в т.ч. Иванов, Петров и Сидоров - специалисты по ноутам.
Дальше - в любом случае ноуту, как и любому другому устройству, надо провести предварительную диагностику, включить там, продуть, подергать и тд и тп, возможно установить предполагаемую причину поломки или ее место и тп. На эту первичную диагностику обычно много времени не уходит, пусть это будет предварительно задано, типа "Первичная диагностика ноутбуков", средняя продолжительность выполнения - 20 мин, дни - Втр/Чтв.
Теперь надо среди 3х мастеров по ноутам поискать ближайшее окно в 20 минут, начиная с завтрашнего дня, учитывая что такую работу мастера обычно делают каждые вторник и четверг. Кроме того необходимо учесть что есть закон о правах потребителя, согласно которому предварительный ответ нужно дать не позже чем через 14 дней, т.е. если Иванов на 2 недели вперед занят, выбираем среди Петрова и Сидорова :).
Итог, например, находим окно в 20 минут у Петрова, через 3 дня, т.е. в пятницу. Сообщаем это Вам и все довольны.
Далее в пятницу проведется преварительный тест ноута и выяснится что у него накрылась мать. Значит отправляем ноут курьером поставщику. Курьерами у нас Васечкин и Калабашкин. Отправки они осуществляют в понедельники и пятницы. ну и тд

Я не прошу решить задачу за меня, я прошу совета: каким образом организовать хранение времени и дней недели чтобы эти данные можно было давать в SQL-запросах в условиях выборки.
В данный момент у меня все зашито просто в программный код, т.е. ненастраиваемо и негибко. Мало что учитывается - только праздники.
Дни недели по работникам задал хранить строкой-списком DowList (типа 2,3,4 для Пнд/Втр/Срд) для WHERE DOW(d) IN(SELECT DoWList FROM WorkersDoWsLists WHERE WorkerID=wid). Но возникла проблема, когда инд. список по работнику не задан, т.е. надо использовать глобальный, а хз как это задать в выборке.

спасибо.
...
Рейтинг: 0 / 0
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
    #36467204
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, поскольку ответов хоть отбавляй напишу сам:
Первая идея состоит в том, что я сохраняю рабочее расписание в виде таблицы с 3мя полями
WDate (DateTime) (для удобства взял даты от 1го января 2001г, т.к. 01.01.2001-пнд)
WDuration (integer) - длительность отрезка рабочего времени в минутах
WDOW (integer) - день недели, опционально (добавил потом, т.к. и DOW() прекрасно справляется)
В ней расписание, для примера, на понедельник, если рабочий распорядок 9:00-17:00 с перерывом с 12:00 до 12:30, выглядит так
01.01.2001 09:00:00 180 1
01.01.2001 12:30:00 270 1
Конец куска высчитывается как WDate+WDuration*60
Еще есть доп. таблица точно такой же структуры, в которую попадают даты с исключительным распорядком, например предпраздничные сокращенные дни и тп
Ну и таблица в которой есть только дата и признак выходной, для отсечения выходных при выборке.

Самое большое неудобство этого способа - это в полученной выборке искать вхождение отрезка времени в рабочий отрезок, т.к. данных типа время, наряду с типом дата нет (удивляюсь до сих пор, трудно что ли было реализовать?) приходится извращаться неподецки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
* ищем сначала эксклюзивный распорядок дня на первую дату
SELECT (m.lsWorkDTsCursor)
LOCATE FOR TTOD(WDate)=EVALUATE(m.lsSchedule+".Date")
IF NOT FOUND()
   * если нету эксклюзива - ищем по дню недели
   LOCATE FOR DOW(WDate)=DOW(EVALUATE(m.lsSchedule+".Date"))
ENDIF
* собираем дату+время
ltDate = this.MixDateTime(EVALUATE(m.lsSchedule+".Date"),EVALUATE(m.lsWorkDTsCursor+".WDate"))
ENDIF
ENDIF
m.lsSchedule - курсор с расписанными заданиями от сегодня до последнего, m.lsWorkDTsCursor - курсор с распорядками работы, первых 10 записей с датой от 2001г соотв. обычному недельному распорядку и там же все кастомные распорядки от сегодня до последнего, которых ожидается еденицы в год.
Да, пришлось для удобства создавать функцию MixDateTime:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LPARAMETERS tdDate,ttTime
************************************************************
* Mix Date and Time
* функция возвращает как результат DateTime полученный как 
* Date из первого параметра, а Time - из второго
************************************************************
IF VARTYPE(ttDateTime)="T"
   tdDate = TTOD(m.tdDate)
ENDIF
IF EMPTY(CTOT(TTOC(m.ttTime)))
   RETURN CTOT(DTOC(tdDate)+" 00:00")
ELSE
   RETURN CTOT(DTOC(tdDate)+SUBSTR(TTOC(m.ttTime),AT(" ",TTOC(m.ttTime))))
ENDIF
но это еще не менингит, вот поиск вхождения отрезка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
* для этого ищем дату в распорядках, вдруг на этот день эксклюзивный распорядок?
* проверяем вхождение в рабочее время как предполагаемого начала
* так и его окончания. Для длительности  0  мин. можно назначать
* и на самую последнюю минуту рабочего дня, типа там на  17 - 15 
SELECT (m.lsWorkDTsCursor)
LOCATE FOR TTOD(WDate)=TTOD(m.ltPrevEnd)
IF FOUND(m.lsWorkDTsCursor)
  * будем проверять по эксклюзивному распорядку
   LOCATE FOR BETWEEN(m.ltPrevEnd,WDate,WDate+WDuration* 60 );
   AND BETWEEN(m.ltPrevEnd+m.tnAssignDuration,WDate,WDate+WDuration* 60 );
   AND TTOD(WDate)=TTOD(m.ltPrevEnd)
ELSE
   * будем проверять по обычному распорядку дня недели. распорядок задается датами  2001  года
   LOCATE FOR BETWEEN(m.ltPrevEnd,this.MixDateTime(m.ltPrevEnd,WDate),this.MixDateTime(m.ltPrevEnd,WDate)+WDuration* 60 );
   AND BETWEEN(m.ltPrevEnd+m.tnAssignDuration,this.MixDateTime(m.ltPrevEnd,WDate),this.MixDateTime(m.ltPrevEnd,WDate)+WDuration* 60 );
   AND DOW=DOW(m.ltPrevEnd) &&AND YEAR(WDate)= 2001 
ENDIF


После чего возникла вторая идея хранить немного иначе, а именно - начало каждого отрезка задавать в виде количества минут от полуночи, а дальше точно так же.
Пока размышляю над тем какой способ будет выгоднее в плане построения запросов и последующей обработке полученных данных...
...
Рейтинг: 0 / 0
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
    #36467854
HouseManager
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CTAC-KO,

Смотри в сторону Cron-формат
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите по планировщику заданий: как хранить время (распорядок дня)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]