Details.php
8.63 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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
<?php
namespace common\models;
use backend\models\Importers;
use common\components\CustomVarDamp;
use Yii;
use backend\components\base\BaseActiveRecord;
use yii\db\Query;
/**
* This is the model class for table "{{%details}}".
*
* @property string $ID
* @property string $IMPORT_ID
* @property string $BRAND
* @property string $ARTICLE
* @property string $FULL_ARTICLE
* @property double $PRICE
* @property string $DESCR
* @property string $BOX
* @property string $ADD_BOX
* @property string $GROUP
* @property string $timestamp
*
*
*/
class Details extends BaseActiveRecord
{
/**
*обязательные колонки
*/
const KEY_COLUMN = 'IMPORT_ID~~BRAND~~ARTICLE';
/**
* int - размер пакета запроса
*/
const BATCH = 500;
/**
* @var bool - признак необходимости удалить префикс Артикула перед вставкой
*/
public $delete_price = false;
/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%details}}';
}
public function getImporter ()
{
$importer = Importers::findOne(['id' => $this->IMPORT_ID]);
if ($importer) {
return $importer->name;
} else {
return null;
}
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required' , 'on' => ['default','form_upload_validation']],
// [['PRICE'], 'number', 'on' => 'default'],
[['PRICE'], \common\components\CommaNumberValidator::className(), 'on' => 'default'],
[['BOX'], 'integer' , 'on' => 'default'],
[['timestamp'], 'safe' , 'on' => 'default'],
[['BRAND', 'ARTICLE'], 'string', 'max' => 100 , 'on' => 'default'],
[['FULL_ARTICLE'], 'string', 'max' => 150 , 'on' => 'default'],
[['DESCR', 'GROUP'], 'string', 'max' => 200 , 'on' => 'default']
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'ID' => Yii::t('app', 'ID'),
'IMPORT_ID' => Yii::t('app', 'ПОСТАВЩИК'),
'Importer' => Yii::t('app', 'ПОСТАВЩИК'),
'BRAND' => Yii::t('app', 'БРЕНД'),
'ARTICLE' => Yii::t('app', 'АРТИКУЛ'),
'FULL_ARTICLE' => Yii::t('app', 'ПОЛНЫЙ АРТИКУЛ'),
'PRICE' => Yii::t('app', 'ЦЕНА'),
'DESCR' => Yii::t('app', 'ОПИСАНИЕ'),
'BOX' => Yii::t('app', 'НАЛИЧИЕ'),
'ADD_BOX' => Yii::t('app', 'В ПУТИ'),
'GROUP' => Yii::t('app', 'ГРУППА RG'),
'timestamp' => Yii::t('app', 'Timestamp'),
];
}
/**
*удаление (если $delete_price установлен)б а затем вставка данных с апдейтом прямымыми запросоми SQL
* @param $data - массив вставляемых данных, вставка будет прозводится пакетами размером указанным в константе BATCH
* @param $importer_id - (int) - идентификатор поставщика у которого будет сперва удалены прайсы а потом вставлены из массива $data
* @throws \yii\db\Exception
*/
public function manualInsert($data, $importer_id)
{
if ($this->delete_price) {
// запустим пакетное удаление всех прайсов поставщика
$conditions = "IMPORT_ID = {$importer_id}";
$this->manualDelete( $conditions );
}
$this->manualInsertWithUpdate($data);
}
/**
* вставка данных с апдейтом прямым запросом SQL
* @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH
* @throws \yii\db\Exception
*/
private function manualInsertWithUpdate($data)
{
$table_name = self::tableName();
$keys_arr = array_keys($data[0]);
// найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
$fields_arr_to_update = array_diff($keys_arr, explode('~~', $this::KEY_COLUMN ));
$query_update = ' on duplicate key update ';
foreach ($fields_arr_to_update as $field) {
$query_update .= "[[{$field}]] = values([[{$field}]]),";
}
// удалим последнюю запятую
$query_update = substr($query_update, 0, strlen($query_update) - 1);
// запросы будем выполнять пакетами
// размер пакета установлен в константе
// разобъем массив на пакеты и будем их проходить
$data = array_chunk($data, $this::BATCH);
foreach ($data as $current_batch_array) {
//воспользуемся пакетной вставкой от фреймворка
$query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql;
// добавим фрагмент с апдейтом при дубляже
$query = "{$query_insert} {$query_update}";
// \common\components\CustomVarDamp::dumpAndDie($query);
Yii::$app->db->createCommand($query)->execute();
}
}
public function manualDelete( $conditions, $params = [] )
{
do {
$query = Yii::$app->db->createCommand()->delete( self::tableName(), $conditions, $params )->sql . ' Limit ' . $this::BATCH;
// try {
$res = Yii::$app->db->createCommand($query)->execute();
// } catch (\Exception $e) {
// throw new \ErrorException('Ошибка удаления товаров '.$e->getMessage());
// }
} while ($res);
return true;
}
public function getTehdocData($id){
$sql = $this->createTehdocQuery();
$connection = \Yii::$app->db;
$data = $connection
->createCommand($sql);
$data->bindValues([':ART_ID'=>$id,':LANG_ID'=>16]);
return $data->queryAll();
}
public function createTehdocQuery(){
$sql = "SELECT
TYP_ID ,
MFA_BRAND,
MFA_ID,
DES_TEXTS7.TEX_TEXT AS MOD_CDS_TEXT,
TYP_MOD_ID as `mod_id`,
DES_TEXTS.TEX_TEXT AS TYP_CDS_TEXT,
TYP_PCON_START,
TYP_PCON_END,
TYP_CCM,
TYP_KW_FROM,TYP_KW_UPTO,
TYP_HP_FROM,TYP_HP_UPTO,
GROUP_CONCAT(distinct ENGINES.ENG_CODE SEPARATOR ' / ') as ENG_CODE,
DES_TEXTS3.TEX_TEXT AS TYP_ENGINE_DES_TEXT
FROM
LINK_ART
INNER JOIN LINK_LA_TYP ON LAT_LA_ID = LA_ID
INNER JOIN TYPES ON TYP_ID = LAT_TYP_ID
INNER JOIN COUNTRY_DESIGNATIONS ON COUNTRY_DESIGNATIONS.CDS_ID = TYP_CDS_ID AND COUNTRY_DESIGNATIONS.CDS_LNG_ID = :LANG_ID
INNER JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = COUNTRY_DESIGNATIONS.CDS_TEX_ID
INNER JOIN MODELS ON MOD_ID = TYP_MOD_ID and
MOD_PCON_START >= 198001
INNER JOIN COUNTRY_DESIGNATIONS AS COUNTRY_DESIGNATIONS2 ON COUNTRY_DESIGNATIONS2.CDS_ID = MOD_CDS_ID and
COUNTRY_DESIGNATIONS2.CDS_LNG_ID = :LANG_ID
INNER JOIN DES_TEXTS AS DES_TEXTS7 ON DES_TEXTS7.TEX_ID = COUNTRY_DESIGNATIONS2.CDS_TEX_ID
INNER JOIN w_manufacturers ON MFA_ID = MOD_MFA_ID and MY_ACTIVE = 1
LEFT JOIN LINK_TYP_ENG ON LTE_TYP_ID = TYP_ID
LEFT JOIN ENGINES ON ENG_ID = LTE_ENG_ID
LEFT JOIN DESIGNATIONS AS DESIGNATIONS3 ON DESIGNATIONS3.DES_ID = TYP_KV_BODY_DES_ID AND DESIGNATIONS3.DES_LNG_ID = :LANG_ID
LEFT JOIN DES_TEXTS AS DES_TEXTS4 ON DES_TEXTS4.TEX_ID = DESIGNATIONS3.DES_TEX_ID
LEFT JOIN DESIGNATIONS AS DESIGNATIONS4 ON DESIGNATIONS4.DES_ID = TYP_KV_MODEL_DES_ID AND DESIGNATIONS4.DES_LNG_ID = :LANG_ID
LEFT JOIN DES_TEXTS AS DES_TEXTS5 ON DES_TEXTS5.TEX_ID = DESIGNATIONS4.DES_TEX_ID
LEFT JOIN DESIGNATIONS AS DESIGNATIONS6 ON DESIGNATIONS6.DES_ID = TYP_KV_DRIVE_DES_ID AND DESIGNATIONS6.DES_LNG_ID = :LANG_ID
LEFT JOIN DES_TEXTS AS DES_TEXTS6 ON DES_TEXTS6.TEX_ID = DESIGNATIONS6.DES_TEX_ID
LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = TYP_KV_FUEL_DES_ID AND DESIGNATIONS2.DES_LNG_ID = :LANG_ID
LEFT JOIN DES_TEXTS AS DES_TEXTS3 ON DES_TEXTS3.TEX_ID = DESIGNATIONS2.DES_TEX_ID
WHERE LA_ART_ID = :ART_ID
group by `TYP_ID`
order by MFA_BRAND,MOD_CDS_TEXT,TYP_CDS_TEXT";
return $sql;
}
}