У нас есть общая система управления заказами, заказами управляют операторы, операторы могут приходить\уходить когда им захочется, наша задача это отследить время когда ни один из операторов не был онлайн, что мы имеем:
База данных с такими таблицами:
Operators('id', 'name' ...)
Operator_log('operator_id', 'status(1 = logged, 0 = logout)', 'time')
Operator_log
имеет примерно такие записи:
operator_id | status | time
1 1 1511541300
2 1 1511541800
1 0 1511545876
5 1 1511581300
2 0 1511591300
5 0 1511841300
4 1 1511941300
4 0 1512541300
Из этих записей видно что простой был между
5 0 1511841300 (3 с конца запись)
и
4 1 1511941300 (2 с конца запись)
В этот момент ни один из операторов не был онлайн
И вот вопрос, как получить этот простой программно?
Существует два типа отчётов: отчёт на дату и отчёт за период, у вас отчёт второго типа -- за период. В качестве входных данных вам поступит временной интервал "построить отчёт с 08:00:00 01.12.2017 по 18:00:00 01.12.2017".
Вот уже сразу на выход вашего отчёта можете передавать массив интервалов, когда никого не было: сразу первым же оператором записываете в $result первый элемент, содержащий весь период, который передали на вход.
Данные у вас находятся в виде "оператор - статус", но гораздо удобнее было бы обрабатывать данные в виде "оператор - дата начала смены - дата конца смены", например "Иванов был онлайн с 07:00:00 01.12.2017 по 08:15:00 01.12.2017", "Петров был онлайн с 17:00:00 01.12.2017 по 18:15:00 01.12.2017" и "Иванов был онлайн с 09:00:00 01.12.2017 по 09:15:00 01.12.2017".
Вы должны в цикле для каждого заданного периода активности оператора проделать следующие шаги: найти возможные пересечения с элементами результирующего массива.
Пересечения бывают двух видов: когда интервал активности оператора полностью находится внутри элемента (например, оператор был активен с 09:00 по 09:15) и нужно заменить в ответе один элемент (08:00 - 18:00) на два (08:00 - 09:00 и 09:15 - 18:00) или когда интервал активности убирает часть интервала.
Таких вариантов два:
Все условия тривиальны. Допустим, для случая когда у нас есть интервал (ts1_beg, ts1_end) и (ts2_beg, ts2_end) очевидно, что интервал 1 полностью содержится в интервале 2 при условии что ts1_beg > ts2_beg && ts1_end < ts2_end.
По окончании цикла вернуть $result.
В примере, который я приводил, итогом будет являться два периода простоя:
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть массив, первый параметр id, второй parent id и текст
При сабмите формы, данные отправляются по указанному урлу методом post
Допустим имею данное число: 3985Как мне её превратить в данную строку: 3,9К ?