jQuery.extend({ calcroute: { ////////////////////////////////////////////////////////////////////////// totals: function(fromTo, cityGeometry, vehicleWeight, isNightlyRate) { var $this = this, dretval = $.Deferred() droute = new $.Deferred(), dfrom = new $.Deferred(), dto = new $.Deferred(), cityCenter = '59.941, 30.331'; // gdovskaya='59.963 30.275'; retval = { totalDistance: 0, extraKmDistance: 0, price: 0, givingFee: 0, regionGivingFee: 0, overtimeFee: 0, kmFee: 0, overtime: 0, overtimeCnt: 0, overtimePrice: 0, nightlyFee: 0 }, // nightlyFee = 500, //Прибавка к ночному тарифу nightlyFee = 0, //Прибавка к ночному тарифу overtimeFee = 400, // rates = [ [2400, 70], //стоимость эвакуатора за 1-ый час (при пробеге до 5км), стоимость за 1км пробега. 50 - это 50руб/км [2900, 90],//стоимость эвакуатора за 1-ый час (при пробеге свыше 5км), стоимость за 1км пробега [3200, 90], [3200, 90]//, // [1700, 50] ], // regionGivingFee = [200, 200, 200, 200], //подача в зависимости от расстояния // regionGivingFee = [0, 0, 0, 0], //подача в зависимости от расстояния vehicleWeight=0;//Это вес машины. (индекс в массиве rates) rate = rates[0]; rate2= rates[1]; ymaps.route(fromTo).then(function (route) { droute.resolve(route); }); ymaps.route([fromTo[0], cityCenter]).then(function (routeSrcToCenter) { dfrom.resolve(routeSrcToCenter); }); ymaps.route([fromTo[1], cityCenter]).then(function (routeDstToCenter) { dto.resolve(routeDstToCenter); }); //определение расстояния от Гдовской, 4 /* ymaps.route([fromTo[0], gdovskaya]).then (function (route) { onRoute(route); function onRoute(route) { // Длина маршрута dlinagdov=route.getLength(); // alert (dlinagdov); } }); ymaps.route([fromTo[1], gdovskaya]).then (function (route) { onRoute(route); function onRoute(route) { // Длина маршрута dlinagdov2=route.getLength(); } }); */ //retval.extraKmDistance=ymaps.formatter.distance( ymaps.coordSystem.geo.getDistance(fromTo[0], gdovskaya)) ); $.when(droute, dfrom, dto).done(function(route, routeSrcToCenter, routeDstToCenter) { var routeDistances = $this.calcDistances(route, cityGeometry, true), srcToCenterDistances = $this.calcDistances(routeSrcToCenter, cityGeometry), dstToCenterDistances = $this.calcDistances(routeDstToCenter, cityGeometry), path = route.getPaths().get(0), maxRegionDistance = Math.max(srcToCenterDistances.regionDistance, dstToCenterDistances.regionDistance); // retval.wayformgdovskaya=ymaps.route([fromTo[0], gdovskaya]); retval.pogruzka = 10; //время на погрузку и разгрузку //Время с пробками. Было - route.getTime() - это без пробок // time_probki=route.getJamsTime()/60; //Время без пробок time_probki=route.getTime()/60; retval.time = time_probki + retval.pogruzka; retval.humanTime = route.getHumanTime(); retval.routeLength = route.getLength()/1000; retval.distanceFromCity = maxRegionDistance; //Если пробег меньше 5км, то цена 1300руб/час и подача. Если больше 5км, то 1500руб/час + подача(2019-10-15 изменил на 1400рубчас) if (retval.routeLength<=5) retval.givingFee = rate[0]; else retval.givingFee = rate2[0]; retval.price_probeg=rates[0][1]; retval.podacha = 0; //стоимость подачи //Если больше одного часа(Не считая времени на разгрузку - 10минут) if (retval.time > 60) retval.nadbavka = retval.givingFee * ((retval.time-60)/60); else retval.nadbavka = 0; //Если подача в пределах 5 000 метров от Гдовской, то подача бесплатная // if ((dlinagdov < 5000)||(dlinagdov2 < 5000) ) { retval.podacha = 0;} //подача эвакуатора /* if (maxRegionDistance > 100) retval.regionGivingFee = regionGivingFee[3]; else if (maxRegionDistance > 50) retval.regionGivingFee = regionGivingFee[2]; else if (maxRegionDistance > 20) retval.regionGivingFee = regionGivingFee[1]; else if (maxRegionDistance > 0) { retval.regionGivingFee = regionGivingFee[0]; } else if (maxRegionDistance == 0) retval.regionGivingFee = retval.podacha; //Если в городе */ // для загорода /* if (maxRegionDistance > 100) { retval.regionGivingFee = regionGivingFee[3];retval.nadbavka = 0; } else if (maxRegionDistance > 50) { retval.regionGivingFee = regionGivingFee[2];retval.nadbavka = 0; } else if (maxRegionDistance > 15) { retval.regionGivingFee = regionGivingFee[1]; retval.nadbavka = 0; } else if (maxRegionDistance > 0) { retval.regionGivingFee = regionGivingFee[0]; retval.nadbavka = 0;} else if (maxRegionDistance == 0) retval.regionGivingFee = retval.podacha; //Если в городе */ /* if (maxRegionDistance > 150) { retval.givingFee=0; retval.regionGivingFee = 0; } else if (maxRegionDistance > 0) { retval.givingFee = 1200; retval.regionGivingFee = 0;} else if (maxRegionDistance == 0) retval.regionGivingFee = retval.podacha; //Если в городе */ if (routeDistances.regionDistance > 0) //если расстояние больше 0км от када, то вычетаем 20км, чтобы считать от када { // retval.extraKmDistance = (routeDistances.regionDistance - 20); retval.extraKmDistance = routeDistances.regionDistance; retval.kmFee = rate[1]; } if (isNightlyRate) // прибавка за работу ночью { retval.nightlyFee = nightlyFee; } // общая цена - это стоимость эвак за 1-ый час + надбавка если больше часа + подача + набавка за ночной режим + оплата за километраж // retval.price = retval.givingFee + retval.nadbavka + retval.regionGivingFee + retval.nightlyFee + retval.extraKmDistance*retval.kmFee; //Общая цена (фиксированная) - фиксированная часть + подача (ноль) + оплата за километраж //alert (retval.extraKmDistance); retval.price = retval.podacha + retval.givingFee + retval.nadbavka + retval.extraKmDistance*retval.kmFee; dretval.resolve(route, retval); }); return dretval.promise(); }, ////////////////////////////////////////////////////////////////////////// calcDistances: function(route, cityGeometry, kkk) { var path = route.getPaths().get(0), segments = path ? path.getSegments() : [], retval = { fromCity: false, cityDistance: 0, regionDistance: 0 }; if (!path) return false; for (var s = 0, segmentCount = segments.length; s < segmentCount; s++) { var segment = segments[s], coords = segment.getCoordinates(); if (s == 0 && cityGeometry.contains(coords[0])) { retval.fromCity = true; } if (kkk && segment.getStreet() == 'РљРђР”') { retval.cityDistance += segment.getLength(); // segment is inside KAD } else if (cityGeometry.contains(coords[0]) && cityGeometry.contains(coords[coords.length-1])) { retval.cityDistance += segment.getLength(); // segment is inside KAD } else if (!cityGeometry.contains(coords[0]) && !cityGeometry.contains(coords[coords.length-1])) { retval.regionDistance += segment.getLength(); // segment is outside KAD } else { var tmpRegionLength = 0; if (cityGeometry.contains(coords[0])) // segment is partially inside/outside KAD { coords = coords.reverse(); } for (var c = 0, coordCount = coords.length; c < coordCount; c++) { if (c > 0) { tmpRegionLength += ymaps.coordSystem.geo.getDistance(coords[c-1], coords[c]); } if (cityGeometry.contains(coords[c])) { retval.regionDistance += tmpRegionLength; retval.cityDistance += segment.getLength() - tmpRegionLength; break; } } } } retval.cityDistance /= 1000; retval.regionDistance /= 1000; return retval; } } });