Страница 1 из 1

Таймер для подсчёта дней (искл.паузы)

Добавлено: 29 сен 2023, 15:00
RomanS
Здравствуйте.

Подскажите, пожалуйста, как возможно реализовать подсчёт дней заявки в определённом статусе?
Условие в том, что заявка может несколько раз встать на паузу, а подсчёт нужен только дней в работе.

Пришла идея сделать что-то вроде, где 111 - номер поля состояния паузы.
bool [111] = false; //считает дни
[111] == true //не учитывает дни

Но не понимаю как в целое это собрать.

Re: Таймер для подсчёта дней (искл.паузы)

Добавлено: 06 авг 2024, 14:04
RomanS
Возвращаюсь к своему вопросу, чтобы не плодить новых тем.

Дошёл вот до такой кондиции, что заставил работать таймер.
Он не оформлен до конца - в черновом варианте, но работает.
Завернул в сущность c настройкой PHP код.

Код: Выделить всё

if (!isset($_SESSION['start_time'])) {
    $_SESSION['start_time'] = [2992]; // Время начала
    $_SESSION['paused_time'] = [2995]; // Время паузы
    $_SESSION['total_time'] = [2996]; // Общее время  
    $_SESSION['is_paused'] = false; // Флаг паузы
}

// Функция для обновления времени
function updateTotalTime() {
    if ($_SESSION['start_time'] >  0 && !$_SESSION['is_paused']) {
        $elapsed_time = time() - $_SESSION['start_time'];
        $_SESSION['total_time'] = ($_SESSION['paused_time'] + $elapsed_time) / 3600; // Переводим в часы
    } else {
        $_SESSION['total_time'] = $_SESSION['paused_time'] / 3600; // Переводим в часы
    }
}

// Обработка запуска таймера
if (isset($_POST['start'])) {
    if ($_SESSION['start_time'] === 0) {
        $_SESSION['start_time'] = time(); // Устанавливаем стартовое время
        $_SESSION['paused_time'] = 0; // Сбрасываем время паузы
        $_SESSION['is_paused'] = false; // Сбрасываем флаг паузы
    }
}

// Обработка паузы
if (isset($_POST['pause']) && !$_SESSION['is_paused']) {
    $_SESSION['paused_time'] += time() - $_SESSION['start_time']; // Сохраняем время паузы
    $_SESSION['start_time'] = 0; // Сбрасываем стартовое время
    $_SESSION['is_paused'] = true; // Устанавливаем флаг паузы
}

// Обработка продолжения
if (isset($_POST['resume']) && $_SESSION['is_paused']) {
    $_SESSION['start_time'] = time(); // Обновляем время начала
    $_SESSION['is_paused'] = false; // Сбрасываем флаг паузы
}

// Обновляем общее время
updateTotalTime();
?> 

<!DOCTYPE html> 
<html lang="ru"> 
<head> 
    <meta charset="UTF-8"> 
    <title> Таймер</title> 
</head> 
<body> 
    <div id="timeField"> Прошедшие часы: <?php echo number_format($_SESSION['total_time'], 2); ?> </div> 
    <form method="post"> 
        <button type="submit" name="start"> Запустить таймер</button> 
        <button type="submit" name="pause"> Пауза</button> 
        <button type="submit" name="resume"> Продолжить</button> 
    </form> 
</body> 
</html> 
Но в процессе испытаний выяснил, что таймер работает по всей сущности. Поковыряв интернет нашёл вариант вытаскивания через GET ID каждой заявки внутри сущности, и, соответственно, присваивания каждой "сессии" таймера ID заявки, где он активен или, в теории, может быть активен. Только вот не могу понять как вытаскивать сам ID.

Код: Выделить всё

$application_id = isset($_GET['application_id']) ? $_GET['application_id'] : null; 

if (!$application_id) {
    die("Не указан идентификатор заявки.");
}

 // Инициализация сессии для каждой заявки
if (!isset($_SESSION['applications'][$application_id])) {
        $_SESSION['start_time'] = [2992];
        $_SESSION['paused_time'] = [2995];
        $_SESSION['total_time'] = [2996];
        $_SESSION['is_paused'] = false;
}
// Функция для обновления времени
function updateTotalTime($application_id) { 
    if ($_SESSION['applications'][$application_id]['start_time'] >  0 && !$_SESSION['applications'][$application_id]['is_paused']) {
        $elapsed_time = time() - $_SESSION['applications'][$application_id]['start_time'];
        $_SESSION['applications'][$application_id]['total_time'] = ($_SESSION['applications'][$application_id]['paused_time'] + $elapsed_time) / 3600; // Переводим в часы
    } else {
        $_SESSION['applications'][$application_id]['total_time'] = $_SESSION['applications'][$application_id]['paused_time'] / 3600; // Переводим в часы
    }
}

// Обработка запуска таймера
if (isset($_POST['start'])) {
    if ($_SESSION['applications'][$application_id]['start_time'] === 0) {
        $_SESSION['applications'][$application_id]['start_time'] = time(); // Устанавливаем стартовое время
        $_SESSION['applications'][$application_id]['paused_time'] = 0; // Сбрасываем время паузы
        $_SESSION['applications'][$application_id]['is_paused'] = false; // Сбрасываем флаг паузы
    }
}

// Обработка паузы
if (isset($_POST['pause']) && !$_SESSION['applications'][$application_id]['is_paused']) {
    $_SESSION['applications'][$application_id]['paused_time'] += time() - $_SESSION['applications'][$application_id]['start_time']; // Сохраняем время паузы
    $_SESSION['applications'][$application_id]['start_time'] = 0; // Сбрасываем стартовое время
    $_SESSION['applications'][$application_id]['is_paused'] = true; // Устанавливаем флаг паузы
}

// Обработка продолжения
if (isset($_POST['resume']) && $_SESSION['applications'][$application_id]['is_paused']) {
    $_SESSION['applications'][$application_id]['start_time'] = time(); // Обновляем время начала
    $_SESSION['applications'][$application_id]['is_paused'] = false; // Сбрасываем флаг паузы
}

// Обновляем общее время
updateTotalTime($application_id);
?> 

<!DOCTYPE html> 
<html lang="ru"> 
<head> 
    <meta charset="UTF-8"> 
    <title> Таймер для заявки <?php echo htmlspecialchars($application_id); ?> </title> 
</head> 
<body> 
    <div id="timeField"> Прошедшие часы для заявки <?php echo htmlspecialchars($application_id); ?> : <?php echo number_format($_SESSION['applications'][$application_id]['total_time'], 2); ?> </div> 
    <form method="post"> 
        <button type="submit" name="start"> Запустить таймер</button> 
        <button type="submit" name="pause"> Пауза</button> 
        <button type="submit" name="resume"> Продолжить</button> 
    </form> 
    <div> Прошедшие часы (div): <?php echo number_format($_SESSION['applications'][$application_id]['total_time'], 2); ?> </div> 
    <input type="text" value="<?php echo number_format($_SESSION['applications'][$application_id]['total_time'], 2); ?> " readonly /> 
</body> 
</html> 
По сути своей таймер работает, пока работает сервер, на котором расположен сайт.

Уважаемые, есть мысли?

Re: Таймер для подсчёта дней (искл.паузы)

Добавлено: 08 авг 2024, 10:41
remchik
Сделайте подсущность и пишите в нее старт и стоп в одну строку.
Записей n кол-во
Считайте разницу между датами
Сумму по записям

Я так для этапов делал.
Записываю сколько времени на этапе находится заявка.

Re: Таймер для подсчёта дней (искл.паузы)

Добавлено: 08 авг 2024, 13:30
RomanS
Доброго.

Дело в том, что от меня запросили автоматизацию процесса. Чтобы по кнопкам запускался таймер, паузился, возвращался к подсчёту, останавливался и всегда показывал результат. И вопроса бы не возникло, если бы нужен был просто подсчёт разницы между "старт" и "стоп".

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

По Вашей системе как перекидывать информацию из подсущности в саму заявку?