f0dbd829
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;
|
40cac1b6
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 - консольный
*/
|
edfa67b1
Mihail
add delete price ...
|
28
|
protected $mode;
|
40cac1b6
Mihail
add delete func i...
|
29
30
31
32
|
/**
* @var - массив с настройками записи
*/
|
edfa67b1
Mihail
add delete price ...
|
33
|
protected $configuration;
|
40cac1b6
Mihail
add delete func i...
|
34
35
36
37
|
/**
* @var - массив с данными которые нужно записать
*/
|
edfa67b1
Mihail
add delete price ...
|
38
|
protected $data;
|
f0dbd829
Mihail
add PriceWriter a...
|
39
|
|
40cac1b6
Mihail
add delete func i...
|
40
41
42
43
44
|
function __construct()
{
set_time_limit(300);
}
|
edfa67b1
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()
|
f0dbd829
Mihail
add PriceWriter a...
|
72
73
74
|
{
// 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
// id загруженного файла получим из конфигурации
|
40cac1b6
Mihail
add delete func i...
|
75
|
$files_model = ImportersFiles::findOne($this->configuration['record_id']);
|
f0dbd829
Mihail
add PriceWriter a...
|
76
|
|
f0dbd829
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()) {
|
40cac1b6
Mihail
add delete func i...
|
81
|
throw new \ErrorException(implode(', ', $files_model->getErrors()));
|
f0dbd829
Mihail
add PriceWriter a...
|
82
83
|
}
|
f0dbd829
Mihail
add PriceWriter a...
|
84
85
|
// 2. запишем полученные данные в таблицу товаров (Details)
$details_model = new Details();
|
ef41533d
Mihail
temp commit - wor...
|
86
|
// только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
|
ea4ecf3d
Mihail
console csv parsing
|
87
|
if ($this->mode == 0) {
|
ef41533d
Mihail
temp commit - wor...
|
88
89
|
// преобразуем числовые значения
foreach ($this->data as &$row) {
|
edfa67b1
Mihail
add delete price ...
|
90
91
|
if (isset($row['PRICE']))
$row['PRICE'] = \Yii::$app->converter->convertTo('float', $row['PRICE']);
|
d5c6d7e0
Mihail
finish with xml a...
|
92
|
|
edfa67b1
Mihail
add delete price ...
|
93
94
|
if (isset($row['BOX']))
$row['BOX'] = \Yii::$app->converter->convertTo('integer', $row['BOX']);
|
ef41533d
Mihail
temp commit - wor...
|
95
|
// присвоим полный артикул
|
7776ca75
Mihail
add form, model a...
|
96
|
|
edfa67b1
Mihail
add delete price ...
|
97
|
if (isset($row['ARTICLE'])) {
|
61795805
Mihail
fixed testing iss...
|
98
99
|
$row['FULL_ARTICLE'] = $row['ARTICLE'];
|
7776ca75
Mihail
add form, model a...
|
100
|
|
61795805
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']);
}
}
|
7776ca75
Mihail
add form, model a...
|
108
|
|
40cac1b6
Mihail
add delete func i...
|
109
|
if (isset($row['ADD_BOX']))
|
edfa67b1
Mihail
add delete price ...
|
110
|
$row['ADD_BOX'] = \Yii::$app->converter->convertTo('integer', $row['ADD_BOX']);
|
ef41533d
Mihail
temp commit - wor...
|
111
112
113
|
// проверим все ли обязательные колонки были указаны пользователем
$details_model->load(['Details' => $row]);
|
ef41533d
Mihail
temp commit - wor...
|
114
|
if (!$details_model->validate())
|
edfa67b1
Mihail
add delete price ...
|
115
|
$details_model->throwStringErrorException(key($this->data));
|
ef41533d
Mihail
temp commit - wor...
|
116
117
|
}
|
f0dbd829
Mihail
add PriceWriter a...
|
118
|
}
|
ef41533d
Mihail
temp commit - wor...
|
119
|
|
40cac1b6
Mihail
add delete func i...
|
120
|
// дополним данные значением импортера и даты обновления цены
|
edfa67b1
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();
|
40cac1b6
Mihail
add delete func i...
|
123
|
try {
|
f0dbd829
Mihail
add PriceWriter a...
|
124
|
|
edfa67b1
Mihail
add delete price ...
|
125
|
if (isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price']) {
|
40cac1b6
Mihail
add delete func i...
|
126
127
|
$details_model->delete_price = true;
}
|
edfa67b1
Mihail
add delete price ...
|
128
|
|
40cac1b6
Mihail
add delete func i...
|
129
|
//2. попытаемся вставить данные в БД с апдейтом по ключам
|
edfa67b1
Mihail
add delete price ...
|
130
|
$details_model->manualInsert($this->data, $this->configuration['importer_id']);
|
f0dbd829
Mihail
add PriceWriter a...
|
131
|
|
40cac1b6
Mihail
add delete func i...
|
132
133
|
// 3. зафиксируем дату конца загрузки в файлах поставщика
if (!$files_model->save()) {
|
61795805
Mihail
fixed testing iss...
|
134
|
$transaction->rollBack();
|
40cac1b6
Mihail
add delete func i...
|
135
136
|
throw new \ErrorException(implode(', ', $files_model->getErrors()));
}
|
f0dbd829
Mihail
add PriceWriter a...
|
137
|
|
40cac1b6
Mihail
add delete func i...
|
138
139
140
|
// 4. зафиксируем дату загрузки в таблице поставщиков
$imp_model = Importers::findOne($this->configuration['importer_id']);
$imp_model->price_date_update = $update_date;
|
f0dbd829
Mihail
add PriceWriter a...
|
141
|
|
40cac1b6
Mihail
add delete func i...
|
142
|
if (!$imp_model->save()) {
|
61795805
Mihail
fixed testing iss...
|
143
|
$transaction->rollBack();
|
edfa67b1
Mihail
add delete price ...
|
144
|
$imp_model->throwStringErrorException();;
|
f0dbd829
Mihail
add PriceWriter a...
|
145
|
}
|
61795805
Mihail
fixed testing iss...
|
146
147
|
$transaction->commit();
|
40cac1b6
Mihail
add delete func i...
|
148
|
} catch (ErrorException $e) {
|
61795805
Mihail
fixed testing iss...
|
149
|
$transaction->rollBack();
|
40cac1b6
Mihail
add delete func i...
|
150
151
|
throw new \ErrorException($e->getMessage());
}
|
f0dbd829
Mihail
add PriceWriter a...
|
152
153
154
155
|
return true;
}
|
ea4ecf3d
Mihail
console csv parsing
|
156
|
|
edfa67b1
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());
}
}
|
ea4ecf3d
Mihail
console csv parsing
|
207
|
|
f0dbd829
Mihail
add PriceWriter a...
|
208
|
}
|