From: marina Date: Tue, 24 Dec 2024 08:06:50 +0000 (+0300) Subject: ERP-268 Перевод страницы 1с cron в MVC X-Git-Tag: 1.7~106^2~9 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=2e15cf19d26d3c0f1b103103094343d1739af44a;p=erp24_rep%2Fyii-erp24%2F.git ERP-268 Перевод страницы 1с cron в MVC --- diff --git a/erp24/controllers/CronController.php b/erp24/controllers/CronController.php index f9605554..d04fe80e 100644 --- a/erp24/controllers/CronController.php +++ b/erp24/controllers/CronController.php @@ -6,14 +6,115 @@ use yii\data\ActiveDataProvider; use yii\db\Exception; use yii\helpers\Json; use yii\web\Controller; +use yii_app\records\ApiCron; use yii_app\records\ApiCronBuh; +use yii_app\records\ApiLogs; use yii_app\records\Firms; class CronController extends Controller { public function action1c() { - return $this->render('1c'); + $items = [ + "stores" => ["name" => "Магазины"], + "nomenclature" => ["name" => "Номенклатура"], + "sellers" => ["name" => "Продавцы"], + "balances" => ["name" => "Складские остатки"], + "counteragents" => ["name" => "Контрагенты"], + "employee" => ["name" => "Физ лица в 1с - продавцы"], + "prices" => ["name" => "Типы цен", "array" => ["type_price" => "Розничная цена"]], + "checks_dell" => ["name" => "Удаление чеков"], + "checks" => [ + "name" => "Чеки-продажи", + "array" => [ + "start_time" => date("Y-m-d 00:00:00", time() - 2 * 86400), + "end_time" => date("Y-m-d 00:00:00", time()) + ] + ], + "write_offs" => [ + "name" => "Списания", + "array" => [ + "start_time" => date("Y-m-d 00:00:00", time() - 2 * 86400), + "end_time" => date("Y-m-d 00:00:00", time()) + ] + ], + "self_cost" => [ + "name" => "Себестоимость", + "array" => [ + "start_time" => date("Y-m-d 00:00:00", time() - 2 * 86400), + "end_time" => date("Y-m-d 00:00:00", time()) + ] + ], + "incomings" => [ + "name" => "Документы", + "array" => [ + "start_time" => date("Y-m-d 00:00:00", time() - 2 * 86400), + "end_time" => date("Y-m-d 00:00:00", time()) + ] + ], + "payment_types" => ["name" => "Виды оплат"] + ]; + + // Обработка формы + if (\Yii::$app->request->isPost) { + $m = []; + $request_id = (string)time(); // Преобразуем в строку + $m["request_id"] = $request_id; + + foreach ($_POST['in'] ?? [] as $n => $array5) { + $m3 = []; + foreach ($_POST['in_in'][$n] ?? [] as $t => $ar) { + $m[$n][$t] = "" . $ar; + } + if (empty($m[$n])) { + $m[$n] = true; + } + } + + $json2 = json_encode($m, JSON_UNESCAPED_UNICODE); + + if (!empty($_POST["in"]) && $json2 != "[]") { + $model = new ApiCron(); + $model->date = date('Y-m-d H:i:s'); + $model->date_up = date('Y-m-d H:i:s'); + $model->status = 0; + $model->json_post = $json2; + $model->request_id = $request_id; + + if (!$model->validate()) { + var_dump($model->getErrors()); + die(); + } else { + // Если валидация прошла, сохраняем + $model->save(); + } + } + + return $this->redirect(\Yii::$app->request->referrer); + } + + $status_arr = [0 => "ожидает выполнения", 1 => "выполнено"]; + + $tasksDataProvider = new ActiveDataProvider([ + 'query' => ApiCron::find() + ->orderBy(['date' => SORT_DESC]) + ->limit(30), + 'pagination' => false + ]); + + $logsDataProvider = new ActiveDataProvider([ + 'query' => ApiLogs::find() + ->orderBy(['date' => SORT_DESC]) + ->limit(100), + 'pagination' => false + ]); + + return $this->render('1c', [ + 'items' => $items, + 'status_arr' => $status_arr, + 'tasksDataProvider' => $tasksDataProvider, + 'logsDataProvider' => $logsDataProvider, + ]); } /** @@ -24,10 +125,10 @@ class CronController extends Controller $request = \Yii::$app->request->post(); if ($request && !empty($request['start_date']) && !empty($request['end_date'])) { - foreach (Firms::getInn() as $key => $firm ) { + foreach (Firms::getInn() as $key => $firm) { $model = new ApiCronBuh(); $model->date = date('Y-m-d H:i:s'); - $model->request_id = strval(strtotime($model->date). '_' .$key); + $model->request_id = strval(strtotime($model->date) . '_' . $key); $model->json_post = Json::encode([ 'request_id' => $model->request_id, 'cost_items' => [ diff --git a/erp24/records/ApiCron.php b/erp24/records/ApiCron.php index 45e04203..1469538e 100644 --- a/erp24/records/ApiCron.php +++ b/erp24/records/ApiCron.php @@ -16,6 +16,16 @@ use Yii; */ class ApiCron extends \yii\db\ActiveRecord { + public const AWAITING_COMPLETION = 0; + public const COMPLETE = 1; + + public static function getStatus() { + return [ + self::AWAITING_COMPLETION => 'Ожидает выполнения', + self::COMPLETE => 'Выполнено', + ]; + } + /** * {@inheritdoc} */ diff --git a/erp24/views/cron/1c.php b/erp24/views/cron/1c.php index 4146dcd6..1f1d88ad 100644 --- a/erp24/views/cron/1c.php +++ b/erp24/views/cron/1c.php @@ -1,115 +1,168 @@ Создание задания для 1с'; - -$items=array( - "stores"=>array("name"=>"Магазины"), - "nomenclature"=>array("name"=>"Номенклатура"), - "sellers"=>array("name"=>"Продавцы"), - "balances"=>array("name"=>"Складские остатки"), - "counteragents"=>array("name"=>"Контрагенты"), - "employee"=>array("name"=>"Физ лица в 1с - продавцы"), - "prices"=>array("name"=>"Типы цен", "array"=>array("type_price" =>"Розничная цена")), - "checks_dell"=>array("name"=>"Удаление чеков"), - "checks"=>array("name"=>"Чеки-продажи", "array"=>array("start_time" =>date("Y-m-d 00:00:00",time()-2*86400),"end_time"=>date("Y-m-d 00:00:00",time()))), - "write_offs"=>array("name"=>"Списания", "array"=>array("start_time" =>date("Y-m-d 00:00:00",time()-2*86400),"end_time"=>date("Y-m-d 00:00:00",time()))), - "self_cost"=>array("name"=>"Себестоимость", "array"=>array("start_time" =>date("Y-m-d 00:00:00",time()-2*86400),"end_time"=>date("Y-m-d 00:00:00",time()))), - "incomings"=>array("name"=>"Документы", "array"=>array("start_time" =>date("Y-m-d 00:00:00",time()-2*86400),"end_time"=>date("Y-m-d 00:00:00",time()))), - "payment_types"=>array("name"=>"Виды оплат") - - -//"prices"=>array("name"=>"Цены"), -); - -echo'
'; -echo ''; -foreach($items as $name => $ar) { - echo'
'.$ar["name"].''; - echo""; - foreach($ar["array"] ?? [] as $tip => $val) { -// if($name=="checks") $type="date"; else $type="text"; - echo''; - } - echo '
'.$tip.'
'; -} -echo'
'; -echo'

'; -$m=array(); -$request_id=time(); -$m["request_id"]=$request_id; -foreach($_POST["in"] ?? [] as $n => $array5) { - $m3=array(); - foreach($_POST["in_in"][$n] ?? [] as $t => $ar) { - $m[$n][$t]="".$ar; - } - if(empty($m[$n])) $m[$n]=true; -} - -$json2=json_encode($m,JSON_UNESCAPED_UNICODE); -echo $json2; - -if(!empty($_POST["in"]) and $json2!="[]") { - - - - $db::sql("INSERT INTO api_cron (date, date_up, status,json_post,request_id) VALUES (NOW(), NOW(), 0, ?, ?)",[$json2,$request_id]); - -} - -$status_arr=[0=>"ожидает выполнения",1=>"выполнено"]; -$data = $db::getRows("SELECT * FROM api_cron WHERE 1=1 order by date DESC LIMIT 30 "); -echo"

Здания для 1с

"; -foreach($data as $row) { - echo""; - -} -echo"
".$row["request_id"]."".$row["date"]."".$row["json_post"]."".$status_arr[$row["status"]].""; - - if($row["status"]==1 and $row["date_up"]!="0000-00-00 00:00:00") echo $row["date_up"]; - - echo"
"; - - - - - - - -$data = $db::getRows("SELECT * FROM api_logs WHERE request_id!='' order by date DESC LIMIT 100 "); -echo"

Логи от 1с

- -"; -foreach($data as $row) { - echo""; - -} -echo"
-".$row["request_id"]." ".$row["date"]."".$row["url"]." ".$row["content"]."
"; - - -echo' -

запрос на каждые 12 часов

- -
{"request_id": "'.$request_id.'", "nomenclature":true,"balances":true,"prices":{"type_price":"Розничная цена"},"checks":{"start_time":"'.date("Y-m-d",time()-86400).' 00:00:00","end_time":"'.date("Y-m-d",time()).' 23:59:59"},"write_offs":{"start_time":"'.date("Y-m-d",time()-86400*7).' 00:00:00","end_time":"'.date("Y-m-d",time()).' 23:59:59"}}
'; +use yii\helpers\Html; +use yii\widgets\ActiveForm; +use kartik\grid\GridView; + +$this->title = 'Создание задания для 1с'; +?> + + +

Создание задания для 1с

+ + ['class' => 'form-horizontal']]); ?> + +request->getCsrfToken()) ?> + +
+ $ar): ?> +
+
+
+
+ 'form-check-input']) ?> + +
+ + + + $val): ?> + + + + + + +
+ + + 'form-control', + 'style' => 'width: 100%; max-width: 220px;', + ]) ?> +
+
+
+
+ +
+ +
+ 'btn btn-success btn-lg']) ?> +
+ + + +

Задания для 1с

+ $tasksDataProvider, + 'columns' => [ + [ + 'attribute' => 'request_id', + 'label' => 'ID запроса', + 'format' => 'raw', + 'value' => function ($task) { + return Html::a($task->request_id, "https://api2." . (YII_ENV_PROD ? 'erp.erp-flowers.ru' : 'dev.erp-flowers.ru') + . "/json/upload_request_id_{$task->request_id}", ['target' => '_blank']); + } + ], + [ + 'attribute' => 'date', + 'label' => 'Дата', + ], + [ + 'attribute' => 'json_post', + 'label' => 'JSON данные', + 'format' => 'raw', + 'value' => function ($task) { + if (empty($task->json_post)) { + return ''; + } + $decodedJson = json_decode($task->json_post, true); + if ($decodedJson === null && json_last_error() !== JSON_ERROR_NONE) { + return 'Ошибка в JSON'; + } + $jsonPretty = json_encode($decodedJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + return Html::tag('pre', $jsonPretty); + }, + 'contentOptions' => ['style' => 'white-space: pre-wrap; word-wrap: break-word;'] + ], + [ + 'attribute' => 'status', + 'label' => 'Статус', + 'value' => function ($task) { + return Html::encode(\yii_app\records\ApiCron::getStatus()[$task->status]); + } + ], + [ + 'attribute' => 'date_up', + 'label' => 'Дата обновления', + 'value' => function ($task) { + return $task->status == \yii_app\records\ApiCron::COMPLETE && $task->date_up != '0000-00-00 00:00:00' ? Html::encode($task->date_up) : ''; + } + ], + ], + 'rowOptions' => function ($task) { + $class = ''; + if ($task->status == \yii_app\records\ApiCron::AWAITING_COMPLETION) { + $class = 'bg-warning'; + } + return ['class' => $class]; + }, + 'tableOptions' => ['class' => 'table table-hover table-sm'], + 'pager' => [], + 'layout' => '{items}', +]); +?> + +

Логи от 1с

+ $logsDataProvider, + 'columns' => [ + [ + + 'format' => 'raw', + 'value' => function ($log) { + return Html::a($log->request_id, "https://api2.erp.erp-flowers.ru/json/upload_request_id_{$log->request_id}", ['target' => '_blank']); + } + ], + [ + 'attribute' => 'date', + 'label' => 'Дата', + ], + [ + 'attribute' => 'url', + 'label' => 'URL', + 'value' => function ($log) { + return Html::encode($log->url); + } + ], + [ + 'attribute' => 'content', + 'label' => 'Контент', + 'format' => 'raw', + 'value' => function ($task) { + if (empty($task->content)) { + return ''; + } + $decodedJson = json_decode($task->content, true); + if ($decodedJson === null && json_last_error() !== JSON_ERROR_NONE) { + return 'Ошибка в JSON'; + } + $jsonPretty = json_encode($decodedJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + return Html::tag('pre', $jsonPretty); + }, + 'contentOptions' => ['style' => 'white-space: pre-wrap; word-wrap: break-word;'] // Разрыв слов и переносы + ], + + ], + 'tableOptions' => ['class' => 'table table-hover table-sm'], + 'pager' => [], + 'layout' => '{items}', +]); +?> -//include_once dirname(__DIR__, 2) . '/templates/bottom_light.php';