$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; } }