Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/lpost.delivery/lib/agents/ |
Upload File : |
<? namespace Lpost\Delivery\Agents; use Bitrix\Main\Localization\Loc; use Lpost\Delivery\Handlers\Pvz; use Lpost\Delivery\Handlers\Zone; Loc::loadMessages(__FILE__); class Savers { use \Lpost\Delivery\Base; public static function sync() { $pickups = \Lpost\Delivery\Entity\PickupStorageTable::getList([ "select" => ["*"], "order" => [ "id_pickup" => "asc" ] ])->fetchAll(); if(empty($pickups)) return false; $pickupsItems = []; $zoneItems = []; foreach ($pickups as $key => $pickup) { if ($pickup['data']['IsCourier'] == 0) { $pickupsItems[$pickup['id_pickup']] = $pickup['data']; } else { $zoneItems[$pickup['id_pickup']] = $pickup['data']; } } self::setInTable(Pvz::TYPE, $pickupsItems); self::setInTable(Zone::TYPE, $zoneItems); self::setFastDelivery("PvzTable", "address"); self::setFastDelivery("ZoneTable", "city_name"); self::changeActive(); return true; } public static function setInTable($table, array $data = []) { $dateUpdate = \Bitrix\Main\Type\DateTime::createFromTimestamp(time()); if ($table == Pvz::TYPE) { $dataBaseItems = \Lpost\Delivery\Entity\PvzTable::getList([ 'select' => ["id", "id_pickup"/*, "id_zone"*/] ] )->fetchAll(); foreach ($dataBaseItems as $dataBaseItem) { if (isset($data[$dataBaseItem['id_pickup']])) { $pickup = $data[$dataBaseItem['id_pickup']]; $arDataUpd = [ "coord_lat" => $pickup['Latitude'], "coord_long" => $pickup['Longitude'], "address" => $pickup['Address'], "pickup_dop" => $pickup['PickupDop'], "photo" => \Bitrix\Main\Web\Json::encode($pickup['Photo']), "metro" => $pickup['Metro'], "time_work" => \Bitrix\Main\Web\Json::encode($pickup['PickupPointWorkHours']), "city_name" => $pickup['CityName'], "id_region" => $pickup['ID_Region'], "is_cash" => $pickup['IsCash'], "is_card" => $pickup['IsCard'], "data_update" => $dateUpdate, "day_logistic" => $pickup['DayLogistic'], "active" => "Y", "has_fitting_room" => isset($pickup['NumberOfFittingRooms']) ? 'Y' : 'N', ]; if(isset($pickup['Zone'][0]["ZoneNumber"])) $arDataUpd["id_zone"] = $pickup['Zone'][0]["ZoneNumber"]; //elseif(isset($dataBaseItem['id_zone'])) //$arDataUpd["id_zone"] = $dataBaseItem['id_zone']; else $arDataUpd["id_zone"] = 0; //unset($dataBaseItem['id_zone']); $resUpd = \Lpost\Delivery\Entity\PvzTable::update( $dataBaseItem, $arDataUpd ); unset($data[$dataBaseItem['id_pickup']]); } else { //unset($dataBaseItem['id_zone']); \Lpost\Delivery\Entity\PvzTable::update( $dataBaseItem, [ "active" => "N" ] ); unset($data[$dataBaseItem['id_pickup']]); } } foreach ($data as $key => $pickup) { $arAddData = [ "id_pickup" => $pickup['ID_PickupPoint'], "coord_lat" => $pickup['Latitude'] ?: 0, "coord_long" => $pickup['Longitude'] ?: 0, "address" => $pickup['Address'], "pickup_dop" => $pickup['PickupDop'], "photo" => \Bitrix\Main\Web\Json::encode($pickup['Photo']), "metro" => $pickup['Metro'], "time_work" => \Bitrix\Main\Web\Json::encode($pickup['PickupPointWorkHours']), "city_name" => $pickup['CityName'], "id_region" => $pickup['ID_Region'], "is_cash" => $pickup['IsCash'], "is_card" => $pickup['IsCard'], "id_zone" => isset($pickup['Zone'][0]["ZoneNumber"]) ? $pickup['Zone'][0]["ZoneNumber"] : 0, "day_logistic" => $pickup["DayLogistic"], "active" => "Y", "has_fitting_room" => isset($pickup['NumberOfFittingRooms']) ? 'Y' : 'N', ]; $resAdd = \Lpost\Delivery\Entity\PvzTable::add($arAddData); if (!$resAdd->isSuccess()){ $errors = $resAdd->getErrorMessages(); (new static())->setError('error setInTable pvzTableUpdate', true, $errors); } unset($data[$key]); } } else { $dataBaseItems = \Lpost\Delivery\Entity\ZoneTable::getList([ 'select' => ["id", "id_pickup", "coord_lat"] ] )->fetchAll(); foreach ($dataBaseItems as $dataBaseItem) { if (isset($data[$dataBaseItem['id_pickup']])) { $zone = $data[$dataBaseItem['id_pickup']]; $res=\Lpost\Delivery\Entity\ZoneTable::update( ["id"=>$dataBaseItem['id'], "id_pickup"=>$dataBaseItem['id_pickup']], [ "time_work" => \Bitrix\Main\Web\Json::encode($zone['PickupPointWorkHours']), "id_region" => $zone['ID_Region'], "zone" => \Bitrix\Main\Web\Json::encode($zone['Zone']), "active" => "Y", "is_cash" => $zone['IsCash'], "is_card" => $zone['IsCard'], "city_name" => $zone['CityName'], "data_update" => $dateUpdate, "day_logistic" => $zone['DayLogistic'], ] ); if($res->isSuccess() && empty((int) $dataBaseItem['coord_lat'])){ self::addAgentCoordsZoneCity($dataBaseItem['id'],$dataBaseItem['id_pickup'], $zone['CityName']); } unset($data[$dataBaseItem['id_pickup']]); } else { \Lpost\Delivery\Entity\ZoneTable::update( ["id"=>$dataBaseItem['id'], "id_pickup"=>$dataBaseItem['id_pickup']], [ "active" => "N" ] ); unset($data[$dataBaseItem['id_pickup']]); } } foreach ($data as $key => $zone) { $res=\Lpost\Delivery\Entity\ZoneTable::add([ "id_pickup" => $zone['ID_PickupPoint'], "time_work" => \Bitrix\Main\Web\Json::encode($zone['PickupPointWorkHours']), "id_region" => $zone['ID_Region'], "zone" => \Bitrix\Main\Web\Json::encode($zone['Zone']), "active" => "Y", "is_cash" => $zone['IsCash'], "is_card" => $zone['IsCard'], "city_name" => $zone['CityName'], "day_logistic" => $zone['DayLogistic'] ]); //$res->getId(); if ($res->isSuccess()){ self::addAgentCoordsZoneCity($res->getId(), $zone['ID_PickupPoint'], $zone['CityName']); } unset($data[$key]); } } } public static function addAgentCoordsZoneCity($id, $id_pickup, $cityName){ $yandexApiToken = \Lpost\Delivery\Settings::getInstance()->getOption("yandex_map_api_key"); if(!$yandexApiToken) { return false; } \CAgent::AddAgent( "\\Lpost\\Delivery\\Agents\\Savers::agentCoordsZoneCity($id, $id_pickup, '".$cityName."');", \Lpost\Delivery\Settings::getInstance()->getModuleId(), "N", 200, "", "Y" ); } public static function agentCoordsZoneCity($id, $id_pickup, $cityName){ $coords=\Lpost\Delivery\Main\City::requestGeocodeCoords($cityName); if(!empty($coords['coord_lat'])){ \Lpost\Delivery\Entity\ZoneTable::update(['id'=>$id, 'id_pickup'=>$id_pickup], [ "coord_lat" => $coords['coord_lat'], "coord_long" => $coords['coord_long'] ]); } } public static function setFastDelivery($tableName = "PvzTable", $group = "address") { $pickups = []; $className = '\Lpost\Delivery\Entity\\' . $tableName; $res = $className::getList([ "select" => [ new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(%s)', ["id"]), new \Bitrix\Main\Entity\ExpressionField('ids', 'GROUP_CONCAT(%s)', ["id"]), new \Bitrix\Main\Entity\ExpressionField('id_pickups', 'GROUP_CONCAT(%s)', ["id_pickup"]), new \Bitrix\Main\Entity\ExpressionField('day_logistics', 'GROUP_CONCAT(%s)', ["day_logistic"]), $group, ], 'filter' => [ ">CNT" => 1, "active" => true, ], "group" => $group, ]); while ($row = $res->fetch()) { if (!empty($row['id_pickups'])) { $ids = explode(",", $row['ids']); $id_pickups = explode(",", $row['id_pickups']); $day_logistiics = explode(",", $row['day_logistics']); $minIndex = array_search(min($day_logistiics), $day_logistiics); foreach ($id_pickups as $key => $id_pickup) { if ($id_pickups[$key] === $id_pickups[$minIndex]) { continue; } $pickups[] = [ "id_pickup" => $id_pickups[$key], "id" => $ids[$key], "fast_pickup_id" => $id_pickups[$minIndex], "day_delivery" => $day_logistiics[$minIndex] ]; } } } foreach ($pickups as $pickup) { $className::update( [ "id" => $pickup['id'], "id_pickup" => $pickup['id_pickup'], ], [ "params" => [ "deliverySpeed" => [ "fast" => $pickup['fast_pickup_id'], "slow" => $pickup['id_pickup'] ] ], /*"params" => [ "fastDelivery" => [ "fast_pickup_id" => $pickup['fast_pickup_id'], "fast_day_delivery" => $pickup['day_delivery'] ] ]*/ ]); } } public static function changeActive() { \Lpost\Delivery\Entity\PvzTable::deActive(); \Lpost\Delivery\Entity\ZoneTable::deActive(); } } ?>