Blame view

backend/models/Details.php 5.52 KB
33d902b8   Mihail   add converter as ...
1
  <?php
33d902b8   Mihail   add converter as ...
2
3
4
  
  namespace backend\models;
  
66adbd63   Mihail   sinhronize with s...
5
  use common\components\CustomVarDamp;
d7f6bdbb   Mihail   add Importers fil...
6
  use Yii;
1c9309e1   Mihail   add view for deta...
7
  use backend\components\base\BaseActiveRecord;
33d902b8   Mihail   add converter as ...
8
  
1c9309e1   Mihail   add view for deta...
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /**
   * 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
cd79d3f3   Mihail   parser
23
24
   *
   *
1c9309e1   Mihail   add view for deta...
25
26
27
   */
  class Details extends BaseActiveRecord
  {
66adbd63   Mihail   sinhronize with s...
28
29
30
      /**
       *обязательные колонки
       */
811bbfad   Mihail   add custom test f...
31
      const KEY_COLUMN = 'IMPORT_ID~~BRAND~~ARTICLE';
66adbd63   Mihail   sinhronize with s...
32
33
34
35
  
      /**
       * int - размер пакета запроса
       */
811bbfad   Mihail   add custom test f...
36
      const BATCH = 500;
66adbd63   Mihail   sinhronize with s...
37
38
39
40
  
      /**
       * @var bool - признак необходимости удалить префикс Артикула перед вставкой
       */
cb2d2d18   Mihail   merge with server
41
  
66adbd63   Mihail   sinhronize with s...
42
43
      public $delete_price = false;
  
1c9309e1   Mihail   add view for deta...
44
45
46
47
      /**
       * @inheritdoc
       */
      public static function tableName()
d7f6bdbb   Mihail   add Importers fil...
48
      {
1c9309e1   Mihail   add view for deta...
49
          return '{{%details}}';
d7f6bdbb   Mihail   add Importers fil...
50
51
      }
  
1c9309e1   Mihail   add view for deta...
52
53
54
      /**
       * @inheritdoc
       */
d7f6bdbb   Mihail   add Importers fil...
55
56
57
      public function rules()
      {
          return [
66adbd63   Mihail   sinhronize with s...
58
              [['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required'],
1c9309e1   Mihail   add view for deta...
59
              [['PRICE'], 'number'],
ef41533d   Mihail   temp commit - wor...
60
              [['BOX'], 'integer'],
1c9309e1   Mihail   add view for deta...
61
62
63
64
              [['timestamp'], 'safe'],
              [['BRAND', 'ARTICLE'], 'string', 'max' => 100],
              [['FULL_ARTICLE'], 'string', 'max' => 150],
              [['DESCR', 'GROUP'], 'string', 'max' => 200]
d7f6bdbb   Mihail   add Importers fil...
65
66
67
          ];
      }
  
1c9309e1   Mihail   add view for deta...
68
69
70
71
      /**
       * @inheritdoc
       */
      public function attributeLabels()
d7f6bdbb   Mihail   add Importers fil...
72
      {
1c9309e1   Mihail   add view for deta...
73
74
75
76
77
78
79
80
81
82
83
84
85
          return [
              'ID' => Yii::t('app', 'ID'),
              'IMPORT_ID' => Yii::t('app', 'Import  ID'),
              'BRAND' => Yii::t('app', 'Brand'),
              'ARTICLE' => Yii::t('app', 'Article'),
              'FULL_ARTICLE' => Yii::t('app', 'Full  Article'),
              'PRICE' => Yii::t('app', 'Price'),
              'DESCR' => Yii::t('app', 'Descr'),
              'BOX' => Yii::t('app', 'Box'),
              'ADD_BOX' => Yii::t('app', 'Add  Box'),
              'GROUP' => Yii::t('app', 'Group'),
              'timestamp' => Yii::t('app', 'Timestamp'),
          ];
d7f6bdbb   Mihail   add Importers fil...
86
87
      }
  
66adbd63   Mihail   sinhronize with s...
88
89
90
91
92
93
      /**
       *удаление (если $delete_price установлен)б а затем вставка данных с апдейтом прямымыми запросоми SQL
       * @param $data - массив вставляемых данных, вставка будет прозводится пакетами размером указанным в константе BATCH
       * @param $importer_id - (int) - идентификатор поставщика у которого будет сперва удалены прайсы а потом вставлены из массива $data
       * @throws \yii\db\Exception
       */
edfa67b1   Mihail   add delete price ...
94
      public function  manualInsert($data, $importer_id)
66adbd63   Mihail   sinhronize with s...
95
96
97
      {
          if ($this->delete_price) {
              // запустим пакетное удаление всех прайсов поставщика
edfa67b1   Mihail   add delete price ...
98
99
              $conditions = "IMPORT_ID = {$importer_id}";
              $this->manualDelete( $conditions );
6ccb6e69   Mihail   add delete price ...
100
          }
edfa67b1   Mihail   add delete price ...
101
          $this->manualInsertWithUpdate($data);
6ccb6e69   Mihail   add delete price ...
102
  
66adbd63   Mihail   sinhronize with s...
103
104
105
106
107
108
109
      }
  
      /**
       * вставка данных с апдейтом прямым запросом SQL
       * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH
       * @throws \yii\db\Exception
       */
edfa67b1   Mihail   add delete price ...
110
      private function manualInsertWithUpdate($data)
33d902b8   Mihail   add converter as ...
111
      {
d7f6bdbb   Mihail   add Importers fil...
112
          $table_name = self::tableName();
66adbd63   Mihail   sinhronize with s...
113
          $keys_arr = array_keys($data[0]);
d7f6bdbb   Mihail   add Importers fil...
114
          // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
811bbfad   Mihail   add custom test f...
115
          $fields_arr_to_update = array_diff($keys_arr, explode('~~', $this::KEY_COLUMN ));
d7f6bdbb   Mihail   add Importers fil...
116
117
118
  
          $query_update = ' on duplicate key update ';
          foreach ($fields_arr_to_update as $field) {
48b58a13   Mihail   finish with xml a...
119
              $query_update .= "[[{$field}]] = values([[{$field}]]),";
d7f6bdbb   Mihail   add Importers fil...
120
121
122
123
124
125
126
          }
          // удалим последнюю запятую
          $query_update = substr($query_update, 0, strlen($query_update) - 1);
  
          // запросы будем выполнять пакетами
          // размер пакета установлен в константе
          // разобъем массив на пакеты и будем их проходить
66adbd63   Mihail   sinhronize with s...
127
128
          $data = array_chunk($data, $this::BATCH);
          foreach ($data as $current_batch_array) {
d7f6bdbb   Mihail   add Importers fil...
129
  
66adbd63   Mihail   sinhronize with s...
130
              //воспользуемся пакетной вставкой от фреймворка
d7f6bdbb   Mihail   add Importers fil...
131
              $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql;
1fd14fc9   Mihail   fixed errors with...
132
  
d7f6bdbb   Mihail   add Importers fil...
133
134
              // добавим фрагмент с апдейтом при дубляже
              $query = "{$query_insert} {$query_update}";
1c9309e1   Mihail   add view for deta...
135
              // \common\components\CustomVarDamp::dumpAndDie($query);
66adbd63   Mihail   sinhronize with s...
136
              Yii::$app->db->createCommand($query)->execute();
d7f6bdbb   Mihail   add Importers fil...
137
138
  
          }
33d902b8   Mihail   add converter as ...
139
      }
ef41533d   Mihail   temp commit - wor...
140
  
6ccb6e69   Mihail   add delete price ...
141
      public function manualDelete( $conditions, $params = [] )
edfa67b1   Mihail   add delete price ...
142
143
      {
          do {
6ccb6e69   Mihail   add delete price ...
144
145
              $query = Yii::$app->db->createCommand()->delete( self::tableName(), $conditions, $params )->sql . ' Limit ' . $this::BATCH;
  //            try {
edfa67b1   Mihail   add delete price ...
146
                  $res = Yii::$app->db->createCommand($query)->execute();
6ccb6e69   Mihail   add delete price ...
147
148
149
  //            } catch (\Exception $e) {
  //                throw new \ErrorException('Ошибка удаления товаров '.$e->getMessage());
  //            }
edfa67b1   Mihail   add delete price ...
150
151
152
153
154
          } while ($res);
  
          return true;
      }
  
d7f6bdbb   Mihail   add Importers fil...
155
  }