Advertisement
SpeakeazyYT

Untitled

Jul 21st, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 12.80 KB | None | 0 0
  1. <?
  2. $_SERVER['DOCUMENT_ROOT']="/home/bitrix/www";
  3.  
  4. define("NO_KEEP_STATISTIC", true);
  5. define("NOT_CHECK_PERMISSIONS", true);
  6.  
  7. // подгружаем пролог
  8. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
  9.  
  10. // отключаем таймаут
  11. set_time_limit(0);
  12.  
  13. // ограничения по памяти
  14. ini_set('memory_limit', '2048M');
  15.  
  16. // выполняем все действия от админа битрикса
  17. global $USER;
  18. $USER->Authorize(1);
  19. CModule::IncludeModule('iblock');
  20.  
  21. $start = microtime(true);
  22.  
  23. //Считываем инфоблоки в массивы
  24.     $iblock_ids = array(2,1,3,4); // id инфоблоков для считывания
  25.     $arSelect = array(
  26.         "IBLOCK_NAME",
  27.         "ID",
  28.         "NAME",
  29.         "IBLOCK_SECTION_ID",
  30.         "PROPERTY_22", // Код производителя товара ELKO (manufacturerCode)
  31.         "PROPERTY_3", // Артикул Treolan (articul)
  32.         "PROPERTY_31", // Номер партии OCS (PartNumber)
  33.         "PROPERTY_25", // Цена товара ELKO (price)
  34.         "PROPERTY_27", // Количество товара на складе ELKO (quantityInStock)
  35.         "PROPERTY_19", // Идентификатор позиции ELKO (id)
  36.         "PROPERTY_7", // Цена Treolan (price)
  37.         "PROPERTY_1", // Идентификатор позиции Treolan (id)
  38.         "PROPERTY_39", // Цена товара RUR OCS (priceRUR)
  39.         "PROPERTY_30", // Идентификатор позиции OCS (id)
  40.         "PROPERTY_65", // Артикул Market (articul)
  41.         "PROPERTY_68", // Количество на складе OCS (Amount)
  42.         "PROPERTY_14", // Количество на складе Treolan (freenom)
  43.         "PROPERTY_53", // Цена товара Market (price_elko)
  44.         "PROPERTY_54", // Цена товара Market (price_treolan)
  45.         "PROPERTY_55", // Цена товара Market (price_ocs)
  46.         "PROPERTY_56", // Количество на складе Market (amount_elko)
  47.         "PROPERTY_57", // Количество на складе Market (amount_treolan)
  48.         "PROPERTY_58", // Количество на складе Market (amount_ocs)
  49.     );
  50.    
  51.     // Выборка элементов указанных инфоблоков
  52.     $rsElement = CIBlockElement::GetList(array(), array("IBLOCK_ID" => $iblock_ids, "ACTIVE" => "Y", "SECTION_ACTIVE" => "Y", "SECTION_GLOBAL_ACTIVE" => "Y"), false, false, $arSelect);
  53.     while($arElement = $rsElement->Fetch())
  54.     {
  55.         $elems[$arElement["IBLOCK_NAME"]][] = $arElement;
  56.     }
  57.  
  58.     // Массивы с элементами инфоблоков
  59.     $elkoArr = $elems["ELKO"];
  60.     $treolanArr = $elems["Treolan"];
  61.     $ocsArr = $elems["OCS"];
  62.  
  63.     $marketArr = $elems["Market"];
  64.     if (count($marketArr)==0){$marketArr=array();}
  65.  
  66. //Считываем инфоблок market в массив - END
  67.  
  68. $arFilter = array(
  69.     'IBLOCK_ID' => 3,
  70.     'ACTIVE' => 'Y',
  71.     'GLOBAL_ACTIVE' => 'Y',
  72. );
  73. $dbSection = CIBlockSection::GetList(array(), $arFilter, false);
  74. while( $arSection = $dbSection-> GetNext() ){
  75.    $sections[] = $arSection;
  76. }
  77.  
  78. $no_parent = 0;
  79. $parent = 0;
  80. $upd_sect = 0;
  81.  
  82. function getSectionIdByCode($iblock_id, $sCategory) {
  83.    $dbSection = CIBlockSection::GetList(
  84.       Array(),
  85.       Array(
  86.         'IBLOCK_ID' => $iblock_id,
  87.         'ACTIVE' => 'Y',
  88.         'CODE' => $sCategory,
  89.       ),
  90.       false
  91.    );
  92.  
  93.    while( $arSection = $dbSection-> GetNext() ){
  94.        $SID[] = $arSection['ID'];
  95.    }
  96.  
  97.    return ($SID[0]);
  98. }
  99.  
  100. function getSectionCodeByID($sec_id) {
  101.     return CIBlockSection::GetByID($sec_id)->GetNext()['CODE'];
  102. }
  103.  
  104. function createSection($iblock_id, $code, $name, $sCategory) {
  105.     global $ID;
  106.    
  107.     $bs = new CIBlockSection;
  108.     $arFields = Array(
  109.       "ACTIVE" => "Y",
  110.       "CODE" => $code,
  111.       "IBLOCK_ID" => $iblock_id,
  112.       "IBLOCK_SECTION_ID" => (!empty($sCategory) ? getSectionIdByCode($iblock_id, $sCategory) : ""),
  113.       "NAME" => $name,
  114.       "SORT" => "500"
  115.     );
  116.  
  117.     $ID = $bs->Add($arFields);
  118. }
  119.  
  120. // перебор разделов OCS
  121. foreach ($sections as $sec) {
  122.     if (empty(getSectionIdByCode(4, $sec["CODE"]))) {
  123.         if (!$sec["IBLOCK_SECTION_ID"]) {
  124.             $no_parent++;
  125.             createSection(4, $sec["CODE"], $sec["NAME"], "");
  126.         } else {
  127.             $parent++;
  128.             createSection(4, $sec["CODE"], $sec["NAME"], getSectionCodeByID($sec["IBLOCK_SECTION_ID"]));
  129.         }
  130.     } else {
  131.         $upd_sect++;
  132.         $bs = new CIBlockSection;
  133.         $arFields = Array(
  134.           "IBLOCK_SECTION_ID" => (!empty($sec["IBLOCK_SECTION_ID"]) ? getSectionIdByCode(4, $sec["CODE"]) : ""),
  135.           "IBLOCK_ID" => 4,
  136.           "NAME" => $sec["NAME"],
  137.         );
  138.         $res = $bs->Update(getSectionIdByCode(4, $sec["CODE"]), $arFields);
  139.     }
  140. }
  141.  
  142. // Функция поиска товара по свойству - возвращает id битрикс товара
  143. function searchElementArr($prop_id, $value, $array) // ("КОД_СВОЙСТВА_ПО_КОТОРОМУ_ИЩЕМ", "ЗНАЧЕНИЕ_СВОЙСТВА", "МАССИВ_ГДЕ_ИЩЕМ")
  144. {
  145.     foreach ($array as $i => $element) {
  146.         if ($element["PROPERTY_".$prop_id."_VALUE"] == $value) {
  147.             return $element["ID"];
  148.         }
  149.     }
  150. }
  151.  
  152. function getNewAmount($str)
  153. {
  154.     $str = preg_replace('/\s/', '', $str);
  155.     if (preg_match('/>/', $str)) {
  156.         $result = preg_replace('/>/', '', $str);
  157.     } elseif (preg_match('/</', $str)) {
  158.         $result = floor((preg_replace('/</', '', $str))/2);
  159.     } elseif ($str == "много") {
  160.         $result = 100;
  161.     } elseif ($str == "мало") {
  162.         $result = 7;
  163.     } else $result = $str;
  164.     return $result;
  165. }
  166.  
  167. $add_chk=0;
  168. $edit_chk=0;
  169. $dub_chk=0;
  170.  
  171. // Функция перебора товаров для склейки
  172. function main_cycle($vname,$varray) // vname=elco,treolan,ocs
  173. {
  174.     global $marketArr,$add_chk,$edit_chk,$dub_chk;
  175.    
  176.     switch ($vname) {
  177.         case "elko":
  178.             $art_id = "22";
  179.             $price_id = "25";
  180.             $amount_id = "27";
  181.             $api_code_id = "19";
  182.             $vendor_name="ELKO";
  183.             break;
  184.         case "treolan":
  185.             $art_id = "3";
  186.             $price_id = "7";
  187.             $amount_id = "14";
  188.             $api_code_id = "1";
  189.             $vendor_name="TREOLAN";
  190.             break;
  191.         case "ocs":
  192.             $art_id = "31";
  193.             $price_id = "39";
  194.             $amount_id = "68";
  195.             $api_code_id = "30";
  196.             $vendor_name="OCS";
  197.             break;
  198.     }
  199.  
  200.  
  201.     foreach ($varray as $i => $elem) {
  202.         if (!empty($elem["IBLOCK_SECTION_ID"])) {
  203.             $articul = $elem["PROPERTY_".$art_id."_VALUE"];
  204.             $search_id=null;
  205.             $search_id = searchElementArr(65,$articul,$marketArr);
  206.            
  207.             $amount_new = getNewAmount($elem["PROPERTY_".$amount_id."_VALUE"]);
  208.             settype($elem["PROPERTY_".$price_id."_VALUE"],'float');
  209.        
  210.             if ($vname == 'ocs') {
  211.                 $sec_code = getSectionCodeByID($elem["IBLOCK_SECTION_ID"]);
  212.                 $sec_id_market = getSectionIdByCode(4, $sec_code);
  213.                 $sid = $sec_id_market;
  214.             } else {
  215.                 $sid = null;
  216.             }
  217.        
  218.             $el = new CIBlockElement;
  219.            
  220.             $arLoadProductAdd = Array(
  221.                 "IBLOCK_SECTION_ID" => $sid,
  222.                 "IBLOCK_ID" => 4,
  223.                 "PROPERTY_VALUES" => array(
  224.                     "name_".$vname => $elem["NAME"],
  225.                     "price_".$vname => $elem["PROPERTY_".$price_id."_VALUE"],
  226.                     "amount_".$vname => $amount_new,
  227.                     "id_bitrix_".$vname => $elem["ID"],
  228.                     "id_api_".$vname => $elem["PROPERTY_".$api_code_id."_VALUE"],
  229.                     "articul" => $articul,
  230.                 ),
  231.                 (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
  232.                 "ACTIVE" => "Y",
  233.             );
  234.            
  235.             $propsUpdate = Array(
  236.                 "name_".$vname => $elem["NAME"],
  237.                 "price_".$vname => $elem["PROPERTY_".$price_id."_VALUE"],
  238.                 "amount_".$vname => $amount_new,
  239.                 "id_bitrix_".$vname => $elem["ID"],
  240.                 "id_api_".$vname => $elem["PROPERTY_".$api_code_id."_VALUE"],
  241.             );
  242.            
  243.             if (empty($search_id)) {
  244.                 if (!empty($amount_new)) {
  245.                     // добавляем товар
  246.                     $add_chk++;
  247.                     $id = $el->Add($arLoadProductAdd);
  248.                     array_push($marketArr, array(
  249.                         "ID" => $id,
  250.                         (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
  251.                         "IBLOCK_SECTION_ID" => $sid,
  252.                         "PROPERTY_".$price_id."_VALUE" => $elem["PROPERTY_".$price_id."_VALUE"],
  253.                         "PROPERTY_".$amount_id."_VALUE" => $amount_new,
  254.                         "PROPERTY_".$api_code_id."_VALUE" => $elem["PROPERTY_".$api_code_id."_VALUE"],
  255.                         "PROPERTY_65_VALUE" => $articul,
  256.                         "sys_".$vendor_name => 1, // отмечаем в текущем элементе, что текущий артикул уже получен из инфоблока вендора
  257.                     ));
  258.                 }
  259.             } else {
  260.                 // обновляем секцию свойств
  261.                 foreach ($marketArr as $i => $elemArr) {
  262.                     if ($elemArr["ID"] == $search_id) {
  263.                         // если [sys_VENDORNAME] равно 1,то выполняем блок условий для сплита одинаковых артикулов вендора или делаем пуш
  264.                         $el_upd = new CIBlockElement;
  265.                         if ($elemArr["sys_".$vendor_name]<>1) // если не было взаимодействия по текущему артикулу
  266.                         {
  267.                             unset($marketArr[$i]);
  268.                             array_push($marketArr, array(
  269.                                 "ID" => $search_id,
  270.                                 (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
  271.                                 ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
  272.                                 "PROPERTY_".$price_id."_VALUE" => $elem["PROPERTY_".$price_id."_VALUE"],
  273.                                 "PROPERTY_".$amount_id."_VALUE" => $amount_new,
  274.                                 "PROPERTY_".$api_code_id."_VALUE" => $elem["PROPERTY_".$api_code_id."_VALUE"],
  275.                                 "PROPERTY_65_VALUE" => $articul,
  276.                                 "sys_".$vendor_name => 1, // отмечаем в текущем элементе, что текущий артикул уже получен из инфоблока вендора
  277.                             ));
  278.                             $edit_chk++;
  279.                             $el_upd->Update($search_id, [(!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
  280.                                 ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
  281.                             ]);
  282.                             $el->SetPropertyValuesEx($search_id, 4, $propsUpdate);
  283.                         }
  284.                         else
  285.                         {
  286.                             // Блок обработки дубликата товара по артикулу для текущего вендора
  287.                             $dub_chk++;
  288.                            
  289.                             if ($elemArr["PROPERTY_".$amount_id."_VALUE"] < $amount_new) {
  290.                                 unset($marketArr[$i]);
  291.                                 array_push($marketArr, array(
  292.                                     "ID" => $search_id,
  293.                                     (!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
  294.                                     ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
  295.                                     "PROPERTY_".$price_id."_VALUE" => $elem["PROPERTY_".$price_id."_VALUE"],
  296.                                     "PROPERTY_".$amount_id."_VALUE" => $amount_new,
  297.                                     "PROPERTY_".$api_code_id."_VALUE" => $elem["PROPERTY_".$api_code_id."_VALUE"],
  298.                                     "PROPERTY_65_VALUE" => $articul,
  299.                                     "sys_".$vendor_name => 1, // отмечаем в текущем элементе, что текущий артикул уже получен из инфоблока вендора
  300.                                 ));
  301.                                 $edit_chk++;
  302.                                 $el_upd->Update($search_id, [(!is_numeric($elem["NAME"]) ? "NAME" : "") => (!is_numeric($elem["NAME"]) ? html_entity_decode($elem["NAME"]) : ""),
  303.                                     ($vname !== 'ocs' ? "IBLOCK_SECTION_ID" : "") => ($vname !== 'ocs' ? $sid : ""),
  304.                                 ]);
  305.                                 $el->SetPropertyValuesEx($search_id, 4, $propsUpdate);
  306.                             }
  307.                         }
  308.                     }
  309.                 }
  310.             }
  311.         }
  312.        
  313.     }
  314. }
  315.  
  316. main_cycle("ocs",$ocsArr);
  317. main_cycle("elko",$elkoArr);
  318. main_cycle("treolan",$treolanArr);
  319.  
  320. // выборка элементов из инфоблока Market
  321. $updElement = CIBlockElement::GetList(array(), array("IBLOCK_ID" => 4), false, false, $arSelect);
  322. while($arUpdElement = $updElement->Fetch())
  323. {
  324.     $updMarket[] = $arUpdElement;
  325. }
  326.  
  327. // перебор массива Market и изменение кол-ва и цены.
  328. foreach ($updMarket as $i => $product) {
  329.    
  330.     $upd_el = new CIBlockElement;
  331.    
  332.     $numProps1 = [56, 57, 58];
  333.     $amount = array_sum(array_map(function($n) use ($product) {
  334.         return $product['PROPERTY_' . $n . '_VALUE'];
  335.     }, $numProps1));
  336.  
  337.     $numProps2 = [53, 54, 55];
  338.     $price = min(array_filter(array_map(function($n) use ($product) {
  339.         return $product['PROPERTY_' . $n . '_VALUE'];
  340.     }, $numProps2)));
  341.  
  342.     $arLoadUpdProduct = [
  343.         'amount' => $amount,
  344.         'price' => $price
  345.     ];
  346.  
  347.     $upd_el->SetPropertyValuesEx($product["ID"], 4, $arLoadUpdProduct);
  348. }
  349.  
  350. $finish = microtime(true);
  351. $delta = $finish - $start;
  352. echo round($delta, 2)." сек. \n";
  353.  
  354. echo "Создано не родительских разделов: ".$no_parent."\n";
  355. echo "Создано родительских разделов: ".$parent."\n";
  356. echo "Изменено разделов: ".$upd_sect."\n";
  357.  
  358. echo "Добавлено: ".$add_chk."\n";
  359. echo "Изменено: ".$edit_chk."\n";
  360. echo "Дубликатов: ".$dub_chk."\n";
  361.  
  362. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement