|
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
|
|||
---|---|---|---|
#18+
Привет! Нарезали мне задачку - сделать автоматическое предварительное планирование работникам неких заданий по дням и часам, что-то типа планировщика задач. Суть: поступает заявка на выполнение некоего задания - необходимо подобрать работника под это задание и назначить примерное время исполнения. Средние сроки исполнения задач - известны. Скажем, покурить - 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 записей... Как-то тупо получается... Помогите, пожалуйста, дельным советом/идеей! спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2010, 00:03 |
|
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
|
|||
---|---|---|---|
#18+
CTAC-KO, Из написанного следует, что мы имеем некоторое логистическое распределение задач. Конечно, поминутное распределение здесь не делается, нужно хорошо распределить все данные по таблицам и правильно их связать. Чтобы кто-то из форумчан взялся сделать все как нужно, необходимо как минимум: а) подробное техзадание; б) договор об оплате и сроках работ. Если это нереально, то рекомендую срочно браться за дело самому: через некоторое количество времени, необходимое на созревание, будет все ясно с логистикой, структурами и связями таблиц. Иначе в этой жизни ничего не выходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2010, 14:38 |
|
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
|
|||
---|---|---|---|
#18+
Вот еще, практический пример: Представьте себе некий крупный Сервисный Центр. Вы в понедельник принесли в СЦ, скажем, ноутбук, который вышел из строя в течении гарантийного срока. Приемщик берет Ваш ноут и выдает Вам квитанцию, но Вы ведь хотите не только поменять ноут на бумажку, но хотябы примерно узнать когда следующий раз перезвонить/наведаться. Теперь смотрим в СЦ - в СЦ работает 15 мастеров, в т.ч. Иванов, Петров и Сидоров - специалисты по ноутам. Дальше - в любом случае ноуту, как и любому другому устройству, надо провести предварительную диагностику, включить там, продуть, подергать и тд и тп, возможно установить предполагаемую причину поломки или ее место и тп. На эту первичную диагностику обычно много времени не уходит, пусть это будет предварительно задано, типа "Первичная диагностика ноутбуков", средняя продолжительность выполнения - 20 мин, дни - Втр/Чтв. Теперь надо среди 3х мастеров по ноутам поискать ближайшее окно в 20 минут, начиная с завтрашнего дня, учитывая что такую работу мастера обычно делают каждые вторник и четверг. Кроме того необходимо учесть что есть закон о правах потребителя, согласно которому предварительный ответ нужно дать не позже чем через 14 дней, т.е. если Иванов на 2 недели вперед занят, выбираем среди Петрова и Сидорова :). Итог, например, находим окно в 20 минут у Петрова, через 3 дня, т.е. в пятницу. Сообщаем это Вам и все довольны. Далее в пятницу проведется преварительный тест ноута и выяснится что у него накрылась мать. Значит отправляем ноут курьером поставщику. Курьерами у нас Васечкин и Калабашкин. Отправки они осуществляют в понедельники и пятницы. ну и тд Я не прошу решить задачу за меня, я прошу совета: каким образом организовать хранение времени и дней недели чтобы эти данные можно было давать в SQL-запросах в условиях выборки. В данный момент у меня все зашито просто в программный код, т.е. ненастраиваемо и негибко. Мало что учитывается - только праздники. Дни недели по работникам задал хранить строкой-списком DowList (типа 2,3,4 для Пнд/Втр/Срд) для WHERE DOW(d) IN(SELECT DoWList FROM WorkersDoWsLists WHERE WorkerID=wid). Но возникла проблема, когда инд. список по работнику не задан, т.е. надо использовать глобальный, а хз как это задать в выборке. спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2010, 16:14 |
|
Подскажите по планировщику заданий: как хранить время (распорядок дня)?
|
|||
---|---|---|---|
#18+
ну, поскольку ответов хоть отбавляй напишу сам: Первая идея состоит в том, что я сохраняю рабочее расписание в виде таблицы с 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.
Да, пришлось для удобства создавать функцию MixDateTime: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
После чего возникла вторая идея хранить немного иначе, а именно - начало каждого отрезка задавать в виде количества минут от полуночи, а дальше точно так же. Пока размышляю над тем какой способ будет выгоднее в плане построения запросов и последующей обработке полученных данных... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2010, 00:35 |
|
|
start [/forum/topic.php?fid=41&msg=36448332&tid=1585595]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 367ms |
total: | 480ms |
0 / 0 |