Details.php 8.63 KB
<?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;
    }

}