2edfb901
Mihail
add PriceWriter a...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?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;
|
38a1a201
Mihail
add delete func i...
|
17
18
19
20
21
22
23
24
25
26
27
|
/**
* Class PriceWriter
* @package common\components
* записывает в БД отпарсенные данные
* запись происходит в несколько таблиц
*/
class PriceWriter
{
/**
* @var - int - 0 - интерактивный режим, 1 - консольный
*/
|
40acb401
Mihail
add delete price ...
|
28
|
protected $mode;
|
38a1a201
Mihail
add delete func i...
|
29
30
31
32
|
/**
* @var - массив с настройками записи
*/
|
40acb401
Mihail
add delete price ...
|
33
|
protected $configuration;
|
38a1a201
Mihail
add delete func i...
|
34
35
36
37
|
/**
* @var - массив с данными которые нужно записать
*/
|
40acb401
Mihail
add delete price ...
|
38
|
protected $data;
|
2edfb901
Mihail
add PriceWriter a...
|
39
|
|
38a1a201
Mihail
add delete func i...
|
40
41
42
43
44
|
function __construct()
{
set_time_limit(300);
}
|
40acb401
Mihail
add delete price ...
|
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
|
/**
* @param mixed $mode
*/
public function setMode($mode)
{
$this->mode = $mode;
}
/**
* @param mixed $configuration
*/
public function setConfiguration($configuration)
{
$this->configuration = $configuration;
}
/**
* @param mixed $data
*/
public function setData($data)
{
$this->data = $data;
}
public function writePriceToDB()
|
2edfb901
Mihail
add PriceWriter a...
|
72
73
74
|
{
// 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
// id загруженного файла получим из конфигурации
|
38a1a201
Mihail
add delete func i...
|
75
|
$files_model = ImportersFiles::findOne($this->configuration['record_id']);
|
2edfb901
Mihail
add PriceWriter a...
|
76
|
|
2edfb901
Mihail
add PriceWriter a...
|
77
78
79
80
|
$update_date = date('Y-m-d H:i:s');
$files_model->time_start = $update_date;
// запишем дату начала загрузки
if (!$files_model->save()) {
|
38a1a201
Mihail
add delete func i...
|
81
|
throw new \ErrorException(implode(', ', $files_model->getErrors()));
|
2edfb901
Mihail
add PriceWriter a...
|
82
83
|
}
|
2edfb901
Mihail
add PriceWriter a...
|
84
85
|
// 2. запишем полученные данные в таблицу товаров (Details)
$details_model = new Details();
|
34d480b7
Mihail
temp commit - wor...
|
86
|
// только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
|
df629228
Mihail
console csv parsing
|
87
|
if ($this->mode == 0) {
|
34d480b7
Mihail
temp commit - wor...
|
88
89
|
// преобразуем числовые значения
foreach ($this->data as &$row) {
|
40acb401
Mihail
add delete price ...
|
90
91
|
if (isset($row['PRICE']))
$row['PRICE'] = \Yii::$app->converter->convertTo('float', $row['PRICE']);
|
ae83e13e
Mihail
finish with xml a...
|
92
|
|
40acb401
Mihail
add delete price ...
|
93
94
|
if (isset($row['BOX']))
$row['BOX'] = \Yii::$app->converter->convertTo('integer', $row['BOX']);
|
34d480b7
Mihail
temp commit - wor...
|
95
|
// присвоим полный артикул
|
706a1491
Mihail
add form, model a...
|
96
|
|
40acb401
Mihail
add delete price ...
|
97
|
if (isset($row['ARTICLE'])) {
|
0716cf79
Mihail
fixed testing iss...
|
98
99
|
$row['FULL_ARTICLE'] = $row['ARTICLE'];
|
706a1491
Mihail
add form, model a...
|
100
|
|
0716cf79
Mihail
fixed testing iss...
|
101
102
103
104
105
106
107
|
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']);
}
}
|
706a1491
Mihail
add form, model a...
|
108
|
|
38a1a201
Mihail
add delete func i...
|
109
|
if (isset($row['ADD_BOX']))
|
40acb401
Mihail
add delete price ...
|
110
|
$row['ADD_BOX'] = \Yii::$app->converter->convertTo('integer', $row['ADD_BOX']);
|
34d480b7
Mihail
temp commit - wor...
|
111
112
113
|
// проверим все ли обязательные колонки были указаны пользователем
$details_model->load(['Details' => $row]);
|
34d480b7
Mihail
temp commit - wor...
|
114
|
if (!$details_model->validate())
|
40acb401
Mihail
add delete price ...
|
115
|
$details_model->throwStringErrorException(key($this->data));
|
34d480b7
Mihail
temp commit - wor...
|
116
117
|
}
|
2edfb901
Mihail
add PriceWriter a...
|
118
|
}
|
34d480b7
Mihail
temp commit - wor...
|
119
|
|
38a1a201
Mihail
add delete func i...
|
120
|
// дополним данные значением импортера и даты обновления цены
|
40acb401
Mihail
add delete price ...
|
121
122
|
$this->data = CustomArrayHelper::addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]);
$transaction = \Yii::$app->db->beginTransaction();
|
38a1a201
Mihail
add delete func i...
|
123
|
try {
|
2edfb901
Mihail
add PriceWriter a...
|
124
|
|
40acb401
Mihail
add delete price ...
|
125
|
if (isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price']) {
|
38a1a201
Mihail
add delete func i...
|
126
127
|
$details_model->delete_price = true;
}
|
40acb401
Mihail
add delete price ...
|
128
|
|
38a1a201
Mihail
add delete func i...
|
129
|
//2. попытаемся вставить данные в БД с апдейтом по ключам
|
40acb401
Mihail
add delete price ...
|
130
|
$details_model->manualInsert($this->data, $this->configuration['importer_id']);
|
2edfb901
Mihail
add PriceWriter a...
|
131
|
|
38a1a201
Mihail
add delete func i...
|
132
133
|
// 3. зафиксируем дату конца загрузки в файлах поставщика
if (!$files_model->save()) {
|
0716cf79
Mihail
fixed testing iss...
|
134
|
$transaction->rollBack();
|
38a1a201
Mihail
add delete func i...
|
135
136
|
throw new \ErrorException(implode(', ', $files_model->getErrors()));
}
|
2edfb901
Mihail
add PriceWriter a...
|
137
|
|
38a1a201
Mihail
add delete func i...
|
138
139
140
|
// 4. зафиксируем дату загрузки в таблице поставщиков
$imp_model = Importers::findOne($this->configuration['importer_id']);
$imp_model->price_date_update = $update_date;
|
2edfb901
Mihail
add PriceWriter a...
|
141
|
|
38a1a201
Mihail
add delete func i...
|
142
|
if (!$imp_model->save()) {
|
0716cf79
Mihail
fixed testing iss...
|
143
|
$transaction->rollBack();
|
40acb401
Mihail
add delete price ...
|
144
|
$imp_model->throwStringErrorException();;
|
2edfb901
Mihail
add PriceWriter a...
|
145
|
}
|
0716cf79
Mihail
fixed testing iss...
|
146
147
|
$transaction->commit();
|
38a1a201
Mihail
add delete func i...
|
148
|
} catch (ErrorException $e) {
|
0716cf79
Mihail
fixed testing iss...
|
149
|
$transaction->rollBack();
|
38a1a201
Mihail
add delete func i...
|
150
151
|
throw new \ErrorException($e->getMessage());
}
|
2edfb901
Mihail
add PriceWriter a...
|
152
153
154
155
|
return true;
}
|
df629228
Mihail
console csv parsing
|
156
|
|
40acb401
Mihail
add delete price ...
|
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
public function deletePriceFromDB()
{
$importer_id = '';
$update_date = '';
if (isset($this->configuration['importer_id']))
$importer_id = $this->configuration['importer_id'];
if (isset($this->configuration['update_date']))
$update_date = $this->configuration['update_date'];
if (!$importer_id) {
throw new \ErrorException('Не указан поставщик прайса для удаления');
} elseif (!$update_date) {
throw new \ErrorException('Не указана дата загрузки прайса для удаления');
}
$transaction = \Yii::$app->db->beginTransaction();
try {
// 1. удалим из таблицы файлов поставщика (ImportersFiles)
$rows = ImportersFiles::deleteAll(['importer_id' => $importer_id, 'upload_time' => $update_date]);
if ($rows != 1) {
$transaction->rollBack();
throw new \ErrorException('Ошибка удаления из таблицы фалов поставщиков');
}
$last_upload_time = ImportersFiles::find(['importer_id' => $importer_id])->orderBy(['upload_time' => SORT_DESC])->one()->upload_time;
// 2. удалим прайс из таблицы товаров (Details)
$details_model = new Details();
$conditions = "importer_id = {$importer_id} AND upload_time = {$update_date}";
$details_model->manualDelete($conditions);
// 3. откатимся до старой даты загрузки в таблице поставщиков
$imp_model = Importers::findOne( $importer_id );
$imp_model->price_date_update = $last_upload_time;
if (!$imp_model->save()) {
$transaction->rollBack();
$imp_model->throwStringErrorException();
}
$transaction->commit();
} catch (ErrorException $e) {
$transaction->rollBack();
throw new \ErrorException($e->getMessage());
}
}
|
df629228
Mihail
console csv parsing
|
207
|
|
2edfb901
Mihail
add PriceWriter a...
|
208
|
}
|