Blame view

common/models/Details.php 8.63 KB
f32f4cbc   Mihail   fixed details pag...
1
2
3
4
5
6
7
8
  <?php
  
  namespace common\models;
  
  use backend\models\Importers;
  use common\components\CustomVarDamp;
  use Yii;
  use backend\components\base\BaseActiveRecord;
5fc85d80   Administrator   VItaliy 21.12.2015
9
  use yii\db\Query;
f32f4cbc   Mihail   fixed details pag...
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
  /**
   * 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 ()
      {
83aa6595   Mihail   edit brand-replac...
55
56
57
58
59
60
61
          $importer = Importers::findOne(['id' => $this->IMPORT_ID]);
          if ($importer) {
              return $importer->name;
          } else {
              return null;
          }
  
f32f4cbc   Mihail   fixed details pag...
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
      }
  
      /**
       * @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', 'АРТИКУЛ'),
83aa6595   Mihail   edit brand-replac...
92
              'FULL_ARTICLE' => Yii::t('app', 'ПОЛНЫЙ АРТИКУЛ'),
f32f4cbc   Mihail   fixed details pag...
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
              '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;
      }
  
5fc85d80   Administrator   VItaliy 21.12.2015
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
      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;
      }
  
f32f4cbc   Mihail   fixed details pag...
230
  }