Jump to content
Sign in to follow this  
enix

Добавление в атрибуты точки продаж конкретного товара

Recommended Posts

Добрый день.

Прошу помощи у гуру программистов, так как у самого уже не хватает знаний что бы оптимизировать скрипт.

 

В целом логика скрипта следующая: есть интернет-витрина, в котором на данный момент представлено порядка 31,197 активных на данный момент товаров. И есть 20 точек в которых данные товары продаются, но как вы понимаете товар может находиться не во всех этих точках а только в некоторых, и было принять решение используя функционал движка атрибуты реализовать показ товаров в конкретном магазине.

 

Пример того что в итоге получается здесь: http://postelka.tomsk.ru/tekstil/postelnoe-bele-komplekty (слева атрибут наличие - магазин)

 

Скрипт после своего завершения дает примерно 196,305 записей в таблице атрибутов.

 

Среднее время выполнение скрипта 2-3 часа по крону, делается ночью, что бы не кому не мешать.

Проблема в том что до внедрения этого функционала с атрибутами, данный скрипт отрабатывал за 20 минут и писал в каждый товар сколько товара на каком складе находится, пример тут: http://postelka.tomsk.ru/tekstil/postelnoe-bele-komplekty/komplekt-postelnogo-belya-15-spalnyy-om-feya

 

По всей видимости когда дописывал где-то перемудрил и он делает много лишнего раз так существенно возросло время исполнения.

 

Если есть идеи или советы по оптимизации кода прошу помощи.

 

Изначальное авторство кода не мое, за основу в самом начале был взят код costas'а с одноименного модуля CSVPrice

Позже все переросло вот в такое:

 

Код:

<?php
class ModelModuleCSVPrice extends Model {
	private $CSV_SEPARATOR = ';';
	private $CSV_ENCLOSURE = '"';
	private $data = array();
	
	public function update() {
		
		$this->db->query("UPDATE `".DB_PREFIX."setting` SET value='1' WHERE  `group` LIKE  'config' AND  `key` LIKE  'config_maintenance'");
	
		$this->db->query("DELETE FROM `".DB_PREFIX."product_to_sklad`");
		$this->db->query("ALTER TABLE `".DB_PREFIX."product_to_sklad` AUTO_INCREMENT=0");
		$this->db->query("DELETE FROM `".DB_PREFIX."product_special`");
		$this->db->query("ALTER TABLE `".DB_PREFIX."product_special` AUTO_INCREMENT=0");
		$this->db->query("UPDATE `".DB_PREFIX."product` SET stock_status_id=5 WHERE stock_status_id=6 OR stock_status_id=8 OR stock_status_id=7 OR stock_status_id=0 OR stock_status_id=9");
		$this->db->query("UPDATE `".DB_PREFIX."product` SET cost=0,price=0,opt=0,rozn=0,optsp=0,quantity=0,status=0 WHERE stock_status_id=5 OR stock_status_id=6 OR stock_status_id=8 OR stock_status_id=7 OR stock_status_id=0 OR stock_status_id=9");
		$this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id`=177");
		

		if (($handle = fopen("/var/www/postelka/data/www/postelka.tomsk.ru/import/td.csv", "r")) !== FALSE) {
			$row = 0;
		    
		    while (($data = fgetcsv($handle, 1000, $this->CSV_SEPARATOR, $this->CSV_ENCLOSURE)) !== FALSE) {
				$num = count($data);
				$row++;
				$item = array();
				
				$akciya= "";
				
				for ($c=0; $c < $num; $c++) {
					$item[] = $data[$c];
				}

					$quantity = $item[4];
					$rezerv = $item[5];
					$counts = $quantity-$rezerv;

					if ($counts>0) {
					
						$model = $item[0];
						$price = $item[3]; // Опт1 = 2 ; Розница = 3
						$opt = $item[1];
						$rozn = $item[3];
						$optsp = $opt*0.05+$opt;
						$imagaz = $rozn;
					
						$price = round($price,2);
						$opt = round($opt,2);
						$imagaz = round($imagaz,0);
						$optsp = round($optsp,0);
					
						$sklad_num = $item[7];
						
						$tega = $item[6];
						$tega = iconv("CP1251", "UTF-8", $tega);
					
						if ($tega=='1') {$procent=0.1;}
						elseif ($tega=='2') {$procent=0.2;}
						elseif ($tega=='3') {$procent=0.3;}
						elseif ($tega=='4') {$procent=0.4;}
						elseif ($tega=='5') {$procent=0.5;}
						elseif ($tega=='6') {$procent=0.6;}
						elseif ($tega=='7') {$procent=0.7;}
						elseif ($tega=='8') {$procent=0.0;}
						elseif ($tega=='9') {$procent=0.15;}
						elseif ($tega=='0') {$procent=0.25;}
						elseif ($tega=='ц') {$procent=0.0;}
						elseif ($tega=='А') {$procent=0.0;}
						//elseif ($tega=='е') {
						//if ($sklad_num=='145') {$procent=0.20;}
						//else {$procent=0.0;}
						//}
						//elseif ($tega=='ъ') {
						//if ($sklad_num=='48') {$procent=0.10;}
						//else {$procent=0.0;}
						//}
						else { $procent=0.0; }
						
										$product_id = $this->db->query("SELECT product_id as product_id1 FROM `".DB_PREFIX."product` WHERE model='".$model."'");
										$product_id = $product_id->row['product_id1'];
											if ($product_id) {
											$text_attribute = $this->db->query("SELECT text as text_attribute FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id`=177 AND `product_id`='".$product_id."'");
											$text_attribute = $text_attribute->row['text_attribute'];
										
												if ($text_attribute) {
													if ($sklad_num=='41') { $name_sklad='пр. Фрунзе, 77б - Альбом'; }
													elseif ($sklad_num=='141') { $name_sklad='Асино - ул. Станционная, 40/1'; }
													elseif ($sklad_num=='111') { $name_sklad='ул. Дальне-Ключевская, 6'; }
													elseif ($sklad_num=='43') { $name_sklad='пр. Мира, 21в'; }
													elseif ($sklad_num=='48') { $name_sklad='ул. Красноармейская, 122'; }
													elseif ($sklad_num=='136') { $name_sklad='ул. Иркутский тракт, 110'; }
													elseif ($sklad_num=='79') { $name_sklad='ул. Киевская, 76 (Посуда)'; }
													elseif ($sklad_num=='46') { $name_sklad='ул. Иркутский тракт, 142/3'; }
													elseif ($sklad_num=='145') { $name_sklad='пр. Ленина, 200'; }
													elseif ($sklad_num=='125') { $name_sklad='ул. Нахимова, 15'; }
													elseif ($sklad_num=='93') { $name_sklad='пер. Мариинский, 4'; }
													elseif ($sklad_num=='83') { $name_sklad='пр. Фрунзе, 24 - Марка'; }
													elseif ($sklad_num=='94') { $name_sklad='пр. Мира, 72а'; }
													elseif ($sklad_num=='134') { $name_sklad='ул. Новосибирская, 6'; }
													elseif ($sklad_num=='35') { $name_sklad='ул. Киевская, 76 (Одежда)'; }
													elseif ($sklad_num=='57') { $name_sklad='ул. Иркутский тракт, 76'; }
													elseif ($sklad_num=='143') { $name_sklad='Северск - пр. Коммунистический, 120'; }
													elseif ($sklad_num=='180') { $name_sklad='ул. Елизаровых, 22'; }
													elseif ($sklad_num=='176') { $name_sklad='ул. Междугородная, 28'; }
													elseif ($sklad_num=='98') { $name_sklad='Товар в дороге'; }
													elseif ($sklad_num=='26') { $name_sklad='Оптовый склад'; }
													elseif ($sklad_num=='114') { $name_sklad='ул. Богдана Хмельницкого, 43';
													} else {
													}
													//if ($sklad_num!='26') {
														$this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET text=CONCAT(text,';".$name_sklad."') WHERE `attribute_id`=177 AND `product_id`='".$product_id."'");
													//} else {
													//}
												} else {
													if ($sklad_num=='41') { $name_sklad='пр. Фрунзе, 77б - Альбом'; }
													elseif ($sklad_num=='141') { $name_sklad='Асино - ул. Станционная, 40/1'; }
													elseif ($sklad_num=='111') { $name_sklad='ул. Дальне-Ключевская, 6'; }
													elseif ($sklad_num=='43') { $name_sklad='пр. Мира, 21в'; }
													elseif ($sklad_num=='48') { $name_sklad='ул. Красноармейская, 122'; }
													elseif ($sklad_num=='136') { $name_sklad='ул. Иркутский тракт, 110'; }
													elseif ($sklad_num=='79') { $name_sklad='ул. Киевская, 76 (Посуда)'; }
													elseif ($sklad_num=='46') { $name_sklad='ул. Иркутский тракт, 142/3'; }
													elseif ($sklad_num=='145') { $name_sklad='пр. Ленина, 200'; }
													elseif ($sklad_num=='125') { $name_sklad='ул. Нахимова, 15'; }
													elseif ($sklad_num=='93') { $name_sklad='пер. Мариинский, 4'; }
													elseif ($sklad_num=='83') { $name_sklad='пр. Фрунзе, 24 - Марка'; }
													elseif ($sklad_num=='94') { $name_sklad='пр. Мира, 72а'; }
													elseif ($sklad_num=='134') { $name_sklad='ул. Новосибирская, 6'; }
													elseif ($sklad_num=='35') { $name_sklad='ул. Киевская, 76 (Одежда)'; }
													elseif ($sklad_num=='57') { $name_sklad='ул. Иркутский тракт, 76'; }
													elseif ($sklad_num=='143') { $name_sklad='Северск - пр. Коммунистический, 120'; }
													elseif ($sklad_num=='180') { $name_sklad='ул. Елизаровых, 22'; }
													elseif ($sklad_num=='176') { $name_sklad='ул. Междугородная, 28'; }
													elseif ($sklad_num=='98') { $name_sklad='Товар в дороге'; }
													elseif ($sklad_num=='26') { $name_sklad='Оптовый склад'; }
													elseif ($sklad_num=='114') { $name_sklad='ул. Богдана Хмельницкого, 43';
													} else {
													}
													//if ($sklad_num!='26') {
														$this->db->query("INSERT INTO `".DB_PREFIX."product_attribute` (`product_id`,`attribute_id`,`language_id`,`text`) VALUES ($product_id,177,1,'$name_sklad')");
													//} else {
													//}
												}
											}
						
						if ($procent>0) {
							$akciya=$rozn-$rozn*$procent;
							$akciya=round($akciya,0);
							$imagaz=$akciya;
							
							if ($optsp>$akciya) { $optsp=$akciya; }
							
							$this->db->query("INSERT INTO ".DB_PREFIX."product_to_sklad (product_id,sklad_id,count,opt,imagaz,rozn,zakup,optsp) VALUES ('".(int)$model."','".$sklad_num."','".$counts."','".$opt."','".$imagaz."','".$akciya."','0','".$optsp."')");
						
						} else {
							
							if ($tega=='ц' OR $tega=='А') {
							$imagaz = $rozn;
							} else{
							$imagaz = $rozn-($rozn*0.15);
							$imagaz = round($imagaz,0);
							}
							if ($optsp>$rozn) { $optsp=$rozn; }
						
							$this->db->query("INSERT INTO ".DB_PREFIX."product_to_sklad (product_id,sklad_id,count,opt,imagaz,rozn,zakup,optsp) VALUES ('".(int)$model."','".$sklad_num."','".$counts."','".$opt."','".$imagaz."','".$rozn."','0','".$optsp."')");
					
						}

							if ($procent=="0" OR $akciya==$price) {
								
								$this->db->query("UPDATE ".DB_PREFIX."product SET price='".$price."', quantity=`quantity`+".(int)$counts." , cost='0', opt='".$opt."', optsp='".$optsp."', rozn='".$rozn."', status='1', date_modified=NOW() WHERE `stock_status_id`=5 AND model='" .(int)$model. "'");
							
							} else {

								$this->db->query("UPDATE ".DB_PREFIX."product SET price='".$price."', quantity=`quantity`+".(int)$counts." , cost='0', opt='".$opt."', optsp='".$optsp."', rozn='".$rozn."', status='1', date_modified=NOW() WHERE `stock_status_id`=5 AND model='" .(int)$model. "'");
								
								if ($tega=='е' OR $tega=='ъ') {  /*}
								elseif ($tega=='н') {
									if ($sklad_num=='48') {
										
									} else {
										$product_id = $this->db->query("SELECT product_id as product_id1 FROM `".DB_PREFIX."product` WHERE model='".$model."'");
										$product_id = $product_id->row['product_id1'];
											if ($product_id) {
												$product_special_price = $this->db->query("SELECT MIN(price) as product_special_price1 FROM `".DB_PREFIX."product_special` WHERE product_id='".$product_id."'");
												$product_special_price = $product_special_price->row['product_special_price1'];
												if ($product_special_price!=NULL OR $product_special_price>0) {
													if ($product_special_price>$akciya) {
														$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
													} else {
													
													}
												} else {
													$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
												}
											}
									}*/
								} else {
											if ($product_id) {
												$product_special_price = $this->db->query("SELECT MIN(price) as product_special_price1 FROM `".DB_PREFIX."product_special` WHERE product_id='".$product_id."'");
												$product_special_price = $product_special_price->row['product_special_price1'];
												if ($product_special_price!=NULL OR $product_special_price>0) {
													if ($product_special_price>$akciya) {
														$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
													} else {
													
													}
												} else {
													$this->db->query("INSERT INTO `".DB_PREFIX."product_special` (`product_special_id`,`product_id`,`customer_group_id`,`priority`,`price`,`date_start`,`date_end`) VALUES (NULL,$product_id,8,1,$akciya,0000-00-00,0000-00-00)");
												}
											}
								}
							}
					
					}
					
					unset($item);
			
			}
		    fclose($handle);
		}
		
		$this->db->query("UPDATE `".DB_PREFIX."setting` SET value='0' WHERE  `group` LIKE  'config' AND  `key` LIKE  'config_maintenance'");
		
	}
}
?>

Share this post


Link to post
Share on other sites

1. Очистка таблиц делается SQL-запросом TRUNCATE TABLE (он и очищает, и автоинкремент обнуляет)

 

2. INSERT INTO ... заменяем на INSERT DELAYED INTO

 

3. Чтение из CSV надо не по одной строке, а с буфером в 100-1000 строк

 

Ну и это, почитайте про ассоциативные массивы

 

Вот это, в нескольких местах:

if ($sklad_num=='41') { $name_sklad='пр. Фрунзе, 77б - Альбом'; }
elseif ($sklad_num=='141') { $name_sklad='Асино - ул. Станционная, 40/1'; }
elseif ($sklad_num=='111') { $name_sklad='ул. Дальне-Ключевская, 6'; }
elseif ($sklad_num=='43') { $name_sklad='пр. Мира, 21в'; }
elseif ($sklad_num=='48') { $name_sklad='ул. Красноармейская, 122'; }
elseif ($sklad_num=='136') { $name_sklad='ул. Иркутский тракт, 110'; }
...

ну очень сложно читать.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.