PriceWriter.php
4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/**
* Created by PhpStorm.
* User: Cibermag
* Date: 30.09.2015
* Time: 9:34
*/
namespace common\components;
use yii\base\ErrorException;
use backend\models\ImportersFiles;
use backend\models\Importers;
use backend\models\Details;
/**
* Class PriceWriter
* @package common\components
* записывает в БД отпарсенные данные
* запись происходит в несколько таблиц
*/
class PriceWriter
{
/**
* @var - int - 0 - интерактивный режим, 1 - консольный
*/
public $mode;
/**
* @var - массив с настройками записи
*/
public $configuration;
/**
* @var - массив с данными которые нужно записать
*/
public $data;
function __construct()
{
set_time_limit(300);
}
public function writeDataToDB()
{
// 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
// id загруженного файла получим из конфигурации
$files_model = ImportersFiles::findOne($this->configuration['record_id']);
$update_date = date('Y-m-d H:i:s');
$files_model->time_start = $update_date;
// запишем дату начала загрузки
if (!$files_model->save()) {
throw new \ErrorException(implode(', ', $files_model->getErrors()));
}
// 2. запишем полученные данные в таблицу товаров (Details)
$details_model = new Details();
// только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
if ($this->mode == 0) {
// преобразуем числовые значения
foreach ($this->data as &$row) {
if(isset( $row['PRICE'] ))
$row['PRICE'] = \Yii::$app->converter->convertTo('float',$row['PRICE']);
if(isset( $row['BOX'] ))
$row['BOX'] = \Yii::$app->converter->convertTo('integer',$row['BOX']);
// присвоим полный артикул
if( isset( $row['ARTICLE'] ) ) {
$row['FULL_ARTICLE'] = $row['ARTICLE'];
if ((int)$this->configuration['delete_prefix']) {
$row = \Yii::$app->converter->convertTo('Article', $row, ['importer_id' => $this->configuration['importer_id']]);
} else {
if (isset($row['ARTICLE']))
$row['ARTICLE'] = \Yii::$app->converter->convertTo('Article', $row['ARTICLE']);
}
}
if (isset($row['ADD_BOX']))
$row['ADD_BOX'] = \Yii::$app->converter->convertTo( 'integer', $row['ADD_BOX'] );
// проверим все ли обязательные колонки были указаны пользователем
$details_model->load(['Details' => $row]);
if (!$details_model->validate())
$details_model->throwStringErrorException( key($this->data) );
}
}
// дополним данные значением импортера и даты обновления цены
$this->data = CustomArrayHelper::addColumns( $this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date] );
try {
if ( isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price'] ) {
$details_model->delete_price = true;
}
$transaction = \Yii::$app->db->beginTransaction();
//2. попытаемся вставить данные в БД с апдейтом по ключам
$details_model->ManualInsert($this->data, $this->configuration['importer_id']);
// 3. зафиксируем дату конца загрузки в файлах поставщика
if (!$files_model->save()) {
$transaction->rollBack();
throw new \ErrorException(implode(', ', $files_model->getErrors()));
}
// 4. зафиксируем дату загрузки в таблице поставщиков
$imp_model = Importers::findOne($this->configuration['importer_id']);
$imp_model->price_date_update = $update_date;
if (!$imp_model->save()) {
$transaction->rollBack();
throw new \ErrorException(implode(', ', $imp_model->getErrors()));
}
$transaction->commit();
} catch (ErrorException $e) {
$transaction->rollBack();
throw new \ErrorException($e->getMessage());
}
return true;
}
}