From a4a3875a176841be29e54c66e56267094a104972 Mon Sep 17 00:00:00 2001 From: vladfo Date: Thu, 3 Oct 2024 16:02:03 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?utf8?q?=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?utf8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4?= =?utf8?q?=D0=BD=D0=B8=D0=BA=D0=B0=20=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA?= =?utf8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/records/Motivation.php | 46 ++++- ...ata_to_monitvation_from_motivation_buh.php | 180 +++++++++--------- .../task_34_create_request_for_1c_buh.php | 176 ++++++++--------- 3 files changed, 211 insertions(+), 191 deletions(-) diff --git a/erp24/records/Motivation.php b/erp24/records/Motivation.php index 3d486c75..cee618a2 100644 --- a/erp24/records/Motivation.php +++ b/erp24/records/Motivation.php @@ -65,26 +65,50 @@ class Motivation extends \yii\db\ActiveRecord ]; } - public static function getWeekRangeForDate($date = null) - { - - $date = $date ?? strtotime(date('Y-m-d')); - + public static function getWeekRange($date = null, $weekNumber = null, $month = null, $year = null) { + // Если дата передана, извлекаем из неё день, месяц и год + if ($date && !$weekNumber && !$month && !$year) { + $date = is_numeric($date) ? $date : strtotime($date); // Если дата передана как timestamp или строка + $day = date('d', $date); + $month = date('m', $date); + $year = date('Y', $date); + $weekNumber = intdiv($day - 1, 7) + 1; + } + + // Если переданы номер недели, месяц и год, рассчитываем диапазон для указанной недели + if ($weekNumber && $month && $year) { + $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year); + + // Определяем стартовый и конечный день недели + $startDay = ($weekNumber - 1) * 7 + 1; + $endDay = min($weekNumber * 7, $daysInMonth); + + // Форматируем даты + $startDate = sprintf('%04d-%02d-%02d', $year, $month, $startDay); + $endDate = sprintf('%04d-%02d-%02d', $year, $month, $endDay); + + return [ + 'start_time' => $startDate, + 'end_time' => $endDate, + ]; + } + + // Если не переданы параметры, используем текущую дату + $date = strtotime(date('Y-m-d')); $day = date('d', $date); $month = date('m', $date); $year = date('Y', $date); - $weekNumber = intdiv($day - 1, 7) + 1; $startDay = ($weekNumber - 1) * 7 + 1; $endDay = min($weekNumber * 7, date('t')); - $startDate = \DateTime::createFromFormat('Y-m-d', "$year-$month-$startDay"); - $endDate = \DateTime::createFromFormat('Y-m-d', "$year-$month-$endDay"); + $startDate = sprintf('%04d-%02d-%02d', $year, $month, $startDay); + $endDate = sprintf('%04d-%02d-%02d', $year, $month, $endDay); return [ - 'start_time' => $startDate->format('Y-m-d'), - 'end_time' => $endDate->format('Y-m-d'), + 'start_time' => $startDate, + 'end_time' => $endDate, ]; } @@ -96,6 +120,8 @@ class Motivation extends \yii\db\ActiveRecord } + + public static function getAdjustmentEditors() { return array( AdminGroup::GROUP_IT, diff --git a/erp24/scripts/tasks/task_33_insert_data_to_monitvation_from_motivation_buh.php b/erp24/scripts/tasks/task_33_insert_data_to_monitvation_from_motivation_buh.php index 4378cf5c..547e5f85 100644 --- a/erp24/scripts/tasks/task_33_insert_data_to_monitvation_from_motivation_buh.php +++ b/erp24/scripts/tasks/task_33_insert_data_to_monitvation_from_motivation_buh.php @@ -1,7 +1,7 @@ setTaskNum($taskNum) - ->setName('Task ' . $taskNum) - ->setDate($dateTask) - ->setDateStart($dateTaskStart); - $validate = $schedulerTaskLog->validate(); - if ($validate) { - $schedulerTaskLog->save(); - } - - - - + // Проверяем, является ли текущий день одним из указанных $currentDay = date('d', $time); + $specifiedDays = ['08', '15', '22', '29']; + if ( + in_array($currentDay, $specifiedDays) + || $currentDay == '01' + || $force + ) { + + $dateTaskStart = date('Y-m-d H:i:s', $time); + $info = ' ================ test Task ' . $taskNum . ' start ================'; + echo $info; + $log .= $info; + $log .= $time; + + $schedulerTaskLog = new SchedulerTaskLog(); + $schedulerTaskLog->setTaskNum($taskNum) + ->setName('Task ' . $taskNum) + ->setDate($dateTask) + ->setDateStart($dateTaskStart); + $validate = $schedulerTaskLog->validate(); + if ($validate) { + $schedulerTaskLog->save(); + } - if ($currentDay == '01') { - - $monthValue = intval(date('m', strtotime('-1 month', $time))); - $yearValue = intval(date('Y', strtotime('-1 month', $time))); - } else { - - $monthValue = intval(date('m', $time)); - $yearValue = intval(date('Y', $time)); - } - - - - - $month = MotivationBuh::find() - ->select('id') - ->andWhere(['month' => $monthValue]) - ->andWhere(['year' => $yearValue]) - ->asArray() - ->column(); - - - $motivationBuhValue = MotivationBuhValue::find() - ->andWhere(['motivation_buh_id' => $month]) - ->groupBy('store_id, value_id, motivation_buh_id, motivation_group_id') - ->select([ - new Expression( - 'sum(value_float) as value_float, - motivation_buh_id as motivation_buh_id, - value_id as value_id, - store_id as store_id, - motivation_group_id as motivation_group_id' - ) - ]) - ->all(); - - foreach ($motivationBuhValue as $value) { - $motivationBuh = MotivationBuh::findOne([$value->motivation_buh_id]); - - $motivation = Motivation::findOne([ - 'year' => $motivationBuh->year, - 'month' => $motivationBuh->month, - 'store_id' => $value->store_id, - ]); + // Определяем месяц и год для обработки данных + if ($currentDay == '01') { + // 1-го числа обрабатываем данные за предыдущий месяц + $monthValue = intval(date('m', strtotime('-1 month', $time))); + $yearValue = intval(date('Y', strtotime('-1 month', $time))); + } else { + $monthValue = intval(date('m', $time)); + $yearValue = intval(date('Y', $time)); + } - if (!$motivation) { - $motivation = new Motivation(); - $motivation->setAttributes([ + $month = MotivationBuh::find() + ->select('id') + ->andWhere(['month' => $monthValue]) + ->andWhere(['year' => $yearValue]) + ->asArray() + ->column(); + + $motivationBuhValue = MotivationBuhValue::find() + ->andWhere(['motivation_buh_id' => $month]) + ->groupBy('store_id, value_id, motivation_buh_id, motivation_group_id') + ->select([ + new Expression( + 'sum(value_float) as value_float, + motivation_buh_id as motivation_buh_id, + value_id as value_id, + store_id as store_id, + motivation_group_id as motivation_group_id' + ) + ]) + ->all(); + + $motivationVal = []; + foreach ($motivationBuhValue as $value) { + $motivationBuh = MotivationBuh::findOne([$value->motivation_buh_id]); + + $motivation = Motivation::findOne([ 'year' => $motivationBuh->year, 'month' => $motivationBuh->month, - 'store_id' => $value->store_id + 'store_id' => $value->store_id, + ]); + + if (!$motivation) { + $motivation = new Motivation(); + $motivation->setAttributes([ + 'year' => $motivationBuh->year, + 'month' => $motivationBuh->month, + 'store_id' => $value->store_id + ]); + $motivation->save(); + } + + $motivationValue = new MotivationValue(); + $motivationValue->setAttributes([ + 'motivation_id' => $motivation->id, + 'motivation_group_id' => $value->motivation_group_id, + 'value_id' => $value->value_id, + 'value_type' => MotivationCostsItem::DATA_TYPE_FLOAT, + 'value_float' => $value->value_float, ]); - $motivation->save(); + $motivationVal[] = $value->value_float; + $motivationValue->save(); } - $motivationValue = new MotivationValue(); - $motivationValue->setAttributes([ - 'motivation_id' => $motivation->id, - 'motivation_group_id' => $value->motivation_group_id, - 'value_id' => $value->value_id, - 'value_type' => MotivationCostsItem::DATA_TYPE_FLOAT, - 'value_float' => $value->value_float, - ]); - $motivationValue->save(); + $info = ' ================ test Task ' . $taskNum . ' stop ================'; + echo $info; + $log .= $info; + $log .= ' date >= ' . strtotime("-1 week", $time); + $dateTaskStop = date('Y-m-d H:i:s', $time); + } else { + $info = ' Task ' . $taskNum . ' skip '; + echo $info; + $log .= $info; } - - $info = ' ================ test Task ' . $taskNum . ' stop ================'; - echo $info; - $log .= $info; - $log .= ' date >= ' . strtotime("-1 week", time()); - $dateTaskStop = date('Y-m-d H:i:s'); } else { $info = ' Task ' . $taskNum . ' skip '; echo $info; diff --git a/erp24/scripts/tasks/task_34_create_request_for_1c_buh.php b/erp24/scripts/tasks/task_34_create_request_for_1c_buh.php index 42b4aad4..526b4e49 100644 --- a/erp24/scripts/tasks/task_34_create_request_for_1c_buh.php +++ b/erp24/scripts/tasks/task_34_create_request_for_1c_buh.php @@ -1,27 +1,28 @@ setTaskNum($taskNum) ->setName('Task ' . $taskNum) ->setDate($dateTask) - ->setDateStart($dateTaskStart); - - if ($schedulerTaskLog->validate()) { + ->setDateStart($dateTaskStart) + ; + $validate = $schedulerTaskLog->validate(); + if ($validate) { $schedulerTaskLog->save(); } - // Текущий день, месяц и год из переданного времени - $currentDay = date('d', $time); - echo "Текущее время задачи день: " . $currentDay; - $currentMonth = date('m', $time); - echo "Текущее время задачи месяц: " . $currentMonth; - $currentYear = date('Y', $time); - echo "Текущее время задачи год: " . $currentYear; - - // Если это первый день месяца, вычисляем предыдущий месяц - if ($currentDay == 1) { - // Получаем предыдущий месяц и год + $dayOfMonth = date('d', $time); + $month = date('m', $time); + $year = date('Y', $time); + $lastDayOfMonth = date('t', $time); + + // Определяем, за какие недели нужно запросить данные + if ($dayOfMonth == '08') { + $weeksToFetch = [1]; // 1-я неделя текущего месяца + } elseif ($dayOfMonth == '15') { + $weeksToFetch = [1, 2]; // 1-я и 2-я недели текущего месяца + } elseif ($dayOfMonth == '22') { + $weeksToFetch = [1, 2, 3]; // 1-я, 2-я и 3-я недели текущего месяца + } elseif ($dayOfMonth == '29') { + $weeksToFetch = [1, 2, 3, 4]; // 1-я, 2-я, 3-я и 4-я недели текущего месяца + } elseif ($dayOfMonth == '01') { + // 1-го числа запрашиваем данные за весь предыдущий месяц $previousMonth = date('m', strtotime('-1 month', $time)); - echo "Текущее время задачи месяц: " . $previousMonth; $previousYear = date('Y', strtotime('-1 month', $time)); - echo "Текущее время задачи год: " . $previousYear; - for ($week = 1; $week <= 5; $week++) { - $weekRange = Motivation::getWeekRangeForDate($week, $previousMonth, $previousYear); - processFirms($weekRange, $time); - } + + // Определяем количество дней в предыдущем месяце + $lastDayOfPreviousMonth = cal_days_in_month(CAL_GREGORIAN, $previousMonth, $previousYear); + + // Запрашиваем данные за весь предыдущий месяц + $weeksInPreviousMonth = ceil($lastDayOfPreviousMonth / 7); + $weeksToFetch = range(1, $weeksInPreviousMonth); + $month = $previousMonth; + $year = $previousYear; } else { - // Выполняем логику для текущего месяца - processCurrentMonth($currentDay, $currentMonth, $currentYear, $time); + // Если текущий день не попадает под условия, запросы не выполняем + $weeksToFetch = []; + } + + foreach (Firms::getInn() as $key => $firm) { + foreach ($weeksToFetch as $week) { + sleep(1); + // Получаем диапазон дат для указанной недели + $weekRange = Motivation::getWeekRange(null, $week, $month, $year); + createApiCron($key, $weekRange); + } } - echo '=============== Task ' . $taskNum . ' stop ================'; + $info = ' ================ test Task ' . $taskNum . ' stop ================'; + echo $info; + $log .= $info; + $log .= ' date >= ' . strtotime("-1 week", $time); $dateTaskStop = date('Y-m-d H:i:s', $time); } else { - echo 'Task ' . $taskNum . ' skipped'; + $info = ' Task ' . $taskNum . ' skip '; + echo $info; + $log .= $info; } } catch (Exception $e) { - $error = 'Exception: ' . $e->getMessage() . ' in ' . $e->getFile() . ' on line ' . $e->getLine(); - echo $error; + $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine(); } -// Сохраняем лог выполнения задачи if (empty($schedulerTaskLog)) { $schedulerTaskLog = new SchedulerTaskLog(); $schedulerTaskLog->setTaskNum($taskNum) @@ -102,36 +133,25 @@ if (empty($schedulerTaskLog)) { ->setDescription($description) ->setError($error) ->setInfo($infoText) - ->setLog($log); + ->setLog($log) + ; } else { $schedulerTaskLog->setDateStop($dateTaskStop) ->setDescription($description) ->setError($error) ->setInfo($infoText) - ->setLog($log); + ->setLog($log) + ; } - -if ($schedulerTaskLog->validate()) { +$validate = $schedulerTaskLog->validate(); +if ($validate) { $schedulerTaskLog->save(); } -// Функция для обработки фирм по неделям -function processFirms($weekRange, $time) -{ - foreach (Firms::getInn() as $key => $firm) { - createApiCron($key, $weekRange, $time); - } -} - -// Функция для создания и сохранения запроса в API -function createApiCron($key, $weekRange, $time) -{ +function createApiCron($key, $weekRange) { $model = new ApiCronBuh(); - $model->date = date('Y-m-d H:i:s', $time); - echo "время задачи: " . $model->date; - $model->request_id = strval($time . '_' . $key); - - // Формирование правильных дат на основе $weekRange + $model->date = date('Y-m-d H:i:s'); + $model->request_id = strval(strtotime($model->date) . '_' . $key); $model->json_post = Json::encode([ 'request_id' => $model->request_id, 'cost_items' => [ @@ -139,7 +159,6 @@ function createApiCron($key, $weekRange, $time) 'end_time' => date('Y-m-d 23:59:59', strtotime($weekRange['end_time'])), ] ]); - $model->inn = $key; try { $model->save(); @@ -148,36 +167,3 @@ function createApiCron($key, $weekRange, $time) } } -// Логика обработки для текущего месяца -function processCurrentMonth($currentDay, $currentMonth, $currentYear, $time) -{ - if ($currentDay == 8) { - // 1-я неделя - $weekRange = Motivation::getWeekRangeForDate(1, $currentMonth, $currentYear); - processFirms($weekRange, $time); - } elseif ($currentDay == 15) { - // 1-я и 2-я недели - for ($week = 1; $week <= 2; $week++) { - $weekRange = Motivation::getWeekRangeForDate($week, $currentMonth, $currentYear); - processFirms($weekRange, $time); - } - } elseif ($currentDay == 22) { - // 1-я, 2-я и 3-я недели - for ($week = 1; $week <= 3; $week++) { - $weekRange = Motivation::getWeekRangeForDate($week, $currentMonth, $currentYear); - processFirms($weekRange, $time); - } - } elseif ($currentDay == 29) { - // 1-я, 2-я, 3-я и 4-я недели - for ($week = 1; $week <= 4; $week++) { - $weekRange = Motivation::getWeekRangeForDate($week, $currentMonth, $currentYear); - processFirms($weekRange, $time); - } - } elseif (date('t', $time) == $currentDay) { - // Последний день месяца — все 5 недель - for ($week = 1; $week <= 5; $week++) { - $weekRange = Motivation::getWeekRangeForDate($week, $currentMonth, $currentYear); - processFirms($weekRange, $time); - } - } -} \ No newline at end of file -- 2.39.5