package com.xiaopeng.operation.utils;
|
|
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.xiaopeng.api.dto.order.GetOrderNumDto;
|
import com.xiaopeng.api.feignClient.order.XpOrderClient;
|
import com.xiaopeng.api.vo.order.XpPricingCardVo;
|
import com.xiaopeng.common.core.domain.R;
|
import com.xiaopeng.common.redis.service.RedisService;
|
import com.xiaopeng.operation.utils.holiday.HolidayUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.*;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* 计算价格的工具类
|
*/
|
@Slf4j
|
@Component
|
public class XpPricingUtil {
|
|
@Autowired
|
private HolidayUtil holidayUtil;
|
|
@Autowired
|
private RedisService redisService;
|
|
@Autowired
|
private XpOrderClient xpOrderClient;
|
|
|
/**
|
* 获取起步里程
|
* @param startingFareJsonStr
|
* @return
|
*/
|
public static Integer getStartMileage(String startingFareJsonStr) {
|
Date date = new Date();
|
JSONArray startingFareJson = JSON.parseArray(startingFareJsonStr);
|
for (Object o : startingFareJson) {
|
JSONObject startingFare = (JSONObject) o;
|
Calendar calendarStart = Calendar.getInstance();
|
calendarStart.setTime(date);
|
calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num1").split(":")[0]));
|
calendarStart.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num1").split(":")[1]));
|
|
Calendar calendarEnd = Calendar.getInstance();
|
calendarEnd.setTime(date);
|
calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num2").split(":")[0]));
|
calendarEnd.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num2").split(":")[1]));
|
// 找到符合条件的直接跳出循环
|
if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
|
Integer mileage = startingFare.getInteger("num4");
|
return mileage;
|
}
|
}
|
return null;
|
}
|
|
|
/**
|
* 计算一口价
|
*/
|
public XpPricingCardVo calculationFixedPrice(String uid, JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney, Integer isDynamicPriceStatus, Long openCityId, String dynamicPricingJson) {
|
// 默认费率1
|
double priceRate=1;
|
if(isDynamicPriceStatus==1){
|
// 先判断是否已经调价过了
|
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
|
if(userDynamicPriceObj!=null){
|
// 是否调价过了
|
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
|
}else {
|
// 没有调过
|
//是否触发动态调价 redis获取
|
Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
|
if(dynamicPriceObj!=null){
|
JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
|
// 触发动态调价
|
// value=时间
|
String timeStr = dynamicPriceObj.toString();
|
// 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
|
R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
|
if(r.getData()==200){
|
int num = r.getData();
|
// X单上升一次调价
|
Integer orderNum = getOrderNum(jsonObject, 4);
|
// 需要调价的次数
|
int count = num / orderNum;
|
if(count>0){
|
// 计算每次上升的费率
|
Integer upRate = getOrderNum(jsonObject, 5);
|
BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
|
for (int i = count; i > 0; i--) {
|
// 当前费率+(费率*上升百分比)
|
priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
}
|
|
// 冷却时间
|
Integer time = getOrderNum(jsonObject, 6);
|
// 触发调价了
|
redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
|
}
|
}
|
|
}
|
}
|
|
}
|
|
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
|
double amount = 0;
|
|
double realDistance = distance / 1000;//实际公里
|
double realTime = duration / 60;//实际时间
|
double exceedDistance = (realDistance - rule.getDouble("num2")) < 0 ? 0 : realDistance - rule.getDouble("num2");//超出起步里程的公里
|
double exceedTime = (realTime - rule.getDouble("num3")) < 0 ? 0 : realTime - rule.getDouble("num3");//超过起步分钟数的时间
|
|
// 起步价
|
Double startPrice = rule.getDouble("num1");
|
|
// 超出公里数价格
|
Double distancePrice = rule.getDouble("num4") * exceedDistance;
|
|
// 超出时间价格
|
Double durationPrice = rule.getDouble("num5") * exceedTime;
|
|
startPrice = new BigDecimal(startPrice).multiply(BigDecimal.valueOf(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
|
xpPricingCardVo.setStartPrice(startPrice);
|
xpPricingCardVo.setDistancePrice(distancePrice);
|
xpPricingCardVo.setDurationPrice(durationPrice);
|
xpPricingCardVo.setTotalPrice(startPrice + distancePrice + durationPrice);
|
// 里程
|
xpPricingCardVo.setDistance(realDistance);
|
xpPricingCardVo.setDuration(realTime);
|
|
return xpPricingCardVo;
|
}
|
|
/**
|
* 计算基础价格
|
* @param rule 基础规则
|
* @param distance 里程
|
* @param duration 时间
|
* @param wait 时间
|
* @param waitMoney 等待费
|
* @param openCityId 开通城市id
|
* @param isDynamicPriceStatus 是否开启动态调价
|
* @return
|
* @throws Exception
|
*/
|
public XpPricingCardVo calculationPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
|
|
|
// 默认费率1
|
double priceRate=1;
|
if(isDynamicPriceStatus==1){
|
// 先判断是否已经调价过了
|
Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
|
if(userDynamicPriceObj!=null){
|
// 是否调价过了
|
priceRate = Double.parseDouble(userDynamicPriceObj.toString());
|
}else {
|
// 没有调过
|
//是否触发动态调价 redis获取
|
Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
|
if(dynamicPriceObj!=null){
|
JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
|
// 触发动态调价
|
// value=时间
|
String timeStr = dynamicPriceObj.toString();
|
// 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
|
R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
|
if(r.getData()==200){
|
int num = r.getData();
|
// X单上升一次调价
|
Integer orderNum = getOrderNum(jsonObject, 4);
|
// 需要调价的次数
|
int count = num / orderNum;
|
if(count>0){
|
// 计算每次上升的费率
|
Integer upRate = getOrderNum(jsonObject, 5);
|
BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
|
for (int i = count; i > 0; i--) {
|
// 当前费率+(费率*上升百分比)
|
priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
}
|
|
// 冷却时间
|
Integer time = getOrderNum(jsonObject, 6);
|
// 触发调价了
|
redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
|
}
|
}
|
|
}
|
}
|
|
}
|
|
|
|
XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
|
double amount = 0;
|
//等待费
|
Date date = new Date();
|
// 计算出是在那个时间段内
|
for (Object o : startingFareJson) {
|
JSONObject startingFare = (JSONObject) o;
|
Calendar calendarStart = Calendar.getInstance();
|
calendarStart.setTime(date);
|
calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num1").split(":")[0]));
|
calendarStart.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num1").split(":")[1]));
|
|
Calendar calendarEnd = Calendar.getInstance();
|
calendarEnd.setTime(date);
|
calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num2").split(":")[0]));
|
calendarEnd.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num2").split(":")[1]));
|
// 找到符合条件的直接跳出循环
|
if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
|
rule.put("num1", startingFare.get("num3"));
|
rule.put("num2", startingFare.get("num4"));
|
rule.put("num3", startingFare.get("num5"));
|
rule.put("num4", startingFare.get("num6"));
|
rule.put("num5", startingFare.get("num7"));
|
|
rule.put("startTime", startingFare.getString("num1"));
|
rule.put("endTime", startingFare.getString("num2"));
|
break;
|
}
|
}
|
|
|
double realDistance = distance / 1000;//实际公里
|
double realTime = duration / 60;//实际时间
|
double exceedDistance = (realDistance - rule.getDouble("num2")) < 0 ? 0 : realDistance - rule.getDouble("num2");//超出起步里程的公里
|
double exceedTime = (realTime - rule.getDouble("num3")) < 0 ? 0 : realTime - rule.getDouble("num3");//超过起步分钟数的时间
|
double longDistanceOne = 0;//远途1段
|
double longDistanceTwo = 0;//远途2段
|
double longDistanceThree = 0;//远途3段
|
|
|
//夜间服务处理逻辑
|
Calendar calendarNight = Calendar.getInstance();
|
calendarNight.setTime(date);
|
calendarNight.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num14").split(" - ")[0].split(":")[0]));
|
calendarNight.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num14").split(" - ")[0].split(":")[1]));
|
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(date);
|
calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num14").split(" - ")[1].split(":")[0]));
|
calendar.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num14").split(" - ")[1].split(":")[1]));
|
|
// 先判断今日是否节假日
|
boolean holiday = holidayUtil.isHoliday();
|
if (holiday) {
|
if (realDistance > rule.getDouble("num6")) {
|
longDistanceOne = rule.getDouble("num32") * (realDistance - rule.getDouble("num6"));
|
}
|
if (realDistance > rule.getDouble("num9")) {
|
longDistanceTwo = rule.getDouble("num33") * (realDistance - rule.getDouble("num9"));
|
}
|
if (realDistance > rule.getDouble("num12")) {
|
longDistanceThree = rule.getDouble("num34") * (realDistance - rule.getDouble("num12"));
|
}
|
amount = rule.getDouble("num29") + (exceedDistance * rule.getDouble("num30")) + (exceedTime * rule.getDouble("num31")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
|
|
// 起步价
|
xpPricingCardVo.setStartPrice(rule.getDouble("num29"));
|
// 时间段
|
xpPricingCardVo.setTime("节假日");
|
|
|
// 里程
|
xpPricingCardVo.setDistance(realDistance);
|
|
// 里程费
|
double distancePrice = (exceedDistance * rule.getDouble("num30")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
xpPricingCardVo.setDistancePrice(distancePrice);
|
|
// 时长
|
xpPricingCardVo.setDuration(realTime);
|
|
// 时长费
|
xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num31")));
|
|
|
} else {
|
if (date.getTime() > calendarNight.getTimeInMillis() && date.getTime() < calendar.getTimeInMillis()) {
|
if (realDistance > rule.getDouble("num6")) {
|
longDistanceOne = rule.getDouble("num18") * (realDistance - rule.getDouble("num6"));
|
}
|
if (realDistance > rule.getDouble("num9")) {
|
longDistanceTwo = rule.getDouble("num19") * (realDistance - rule.getDouble("num9"));
|
}
|
if (realDistance > rule.getDouble("num12")) {
|
longDistanceThree = rule.getDouble("num20") * (realDistance - rule.getDouble("num12"));
|
}
|
amount = rule.getDouble("num15") + (exceedDistance * rule.getDouble("num16")) + (exceedTime * rule.getDouble("num17")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
|
|
// 起步价
|
xpPricingCardVo.setStartPrice(rule.getDouble("num15"));
|
// 时间段
|
xpPricingCardVo.setTime(rule.getString("num14"));
|
|
// 里程
|
xpPricingCardVo.setDistance(realDistance);
|
|
// 里程费
|
double distancePrice = (exceedDistance * rule.getDouble("num16")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
xpPricingCardVo.setDistancePrice(distancePrice);
|
|
// 时长
|
xpPricingCardVo.setDuration(realTime);
|
|
// 时长费
|
xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num17")));
|
|
|
} else {
|
|
// 高峰处理
|
Calendar calendarStart = Calendar.getInstance();
|
calendarStart.setTime(date);
|
calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num21").split(" - ")[0].split(":")[0]));
|
calendarStart.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num21").split(" - ")[0].split(":")[1]));
|
|
Calendar calendarEnd = Calendar.getInstance();
|
calendarEnd.setTime(date);
|
calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num21").split(" - ")[1].split(":")[0]));
|
calendarEnd.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num21").split(" - ")[1].split(":")[1]));
|
|
Calendar s2 = Calendar.getInstance();
|
s2.setTime(date);
|
s2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num22").split(" - ")[0].split(":")[0]));
|
s2.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num22").split(" - ")[0].split(":")[1]));
|
|
Calendar e2 = Calendar.getInstance();
|
e2.setTime(date);
|
e2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num22").split(" - ")[1].split(":")[0]));
|
e2.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num22").split(" - ")[1].split(":")[1]));
|
//高峰时段处理逻辑
|
if ((date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) || (date.getTime() > s2.getTimeInMillis() && date.getTime() < e2.getTimeInMillis())) {
|
if (realDistance > rule.getDouble("num6")) {
|
longDistanceOne = rule.getDouble("num26") * (realDistance - rule.getDouble("num6"));
|
}
|
if (realDistance > rule.getDouble("num9")) {
|
longDistanceTwo = rule.getDouble("num27") * (realDistance - rule.getDouble("num9"));
|
}
|
if (realDistance > rule.getDouble("num12")) {
|
longDistanceThree = rule.getDouble("num28") * (realDistance - rule.getDouble("num12"));
|
}
|
amount = rule.getDouble("num23") + (exceedDistance * rule.getDouble("num24")) + (exceedTime * rule.getDouble("num25")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
|
|
// 起步价
|
xpPricingCardVo.setStartPrice(rule.getDouble("num23"));
|
// 时间段
|
if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
|
xpPricingCardVo.setTime(rule.getString("num21"));
|
} else {
|
xpPricingCardVo.setTime(rule.getString("num22"));
|
}
|
|
|
// 里程
|
xpPricingCardVo.setDistance(realDistance);
|
|
// 里程费
|
double distancePrice = (exceedDistance * rule.getDouble("num24")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
xpPricingCardVo.setDistancePrice(distancePrice);
|
|
// 时长
|
xpPricingCardVo.setDuration(realTime);
|
|
// 时长费
|
xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num25")));
|
|
} else {
|
//其他时间段的计算
|
if (realDistance > rule.getDouble("num6")) {
|
longDistanceOne = rule.getDouble("num8") * (realDistance - rule.getDouble("num6"));
|
}
|
if (realDistance > rule.getDouble("num9")) {
|
longDistanceTwo = rule.getDouble("num11") * (realDistance - rule.getDouble("num9"));
|
}
|
if (realDistance > rule.getDouble("num12")) {
|
longDistanceThree = rule.getDouble("num13") * (realDistance - rule.getDouble("num12"));
|
}
|
amount = rule.getDouble("num1") + (exceedDistance * rule.getDouble("num4")) + (exceedTime * rule.getDouble("num5")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
|
|
// 起步价
|
xpPricingCardVo.setStartPrice(rule.getDouble("num1"));
|
// 时间段
|
xpPricingCardVo.setTime(rule.getString("startTime") + " - " + rule.getString("endTime"));
|
|
xpPricingCardVo.setDistancePriceNormal(rule.getDouble("num2"));
|
|
xpPricingCardVo.setDurationPriceNormal(rule.getDouble("num3"));
|
|
|
// 里程
|
xpPricingCardVo.setDistance(realDistance);
|
|
// 里程费
|
double distancePrice = (exceedDistance * rule.getDouble("num4")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
xpPricingCardVo.setDistancePrice(distancePrice);
|
|
// 时长
|
xpPricingCardVo.setDuration(realTime);
|
|
// 时长费
|
xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num5")));
|
|
}
|
}
|
}
|
|
// 订单总额
|
Double startPrice = xpPricingCardVo.getStartPrice();
|
// 先减去起步价重新计算
|
amount = amount - startPrice;
|
// 动态计算费用
|
startPrice= new BigDecimal(startPrice).multiply(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
amount = amount+startPrice;
|
xpPricingCardVo.setTotalPrice(amount);
|
|
|
return xpPricingCardVo;
|
}
|
/**
|
* 行程结束后计算费用
|
* @param rule 基础规则
|
* @param distance 里程
|
* @param duration 时间
|
* @param wait 时间
|
* @param waitMoney 等待费
|
* @param openCityId 开通城市id
|
* @param isDynamicPriceStatus 是否开启动态调价
|
* @return
|
* @throws Exception
|
*/
|
// public XpPricingCardVo calculationFinalPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
|
//
|
//
|
// // 默认费率1
|
// double priceRate=1;
|
// if(isDynamicPriceStatus==1){
|
// // 先判断是否已经调价过了
|
// Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
|
// if(userDynamicPriceObj!=null){
|
// // 是否调价过了
|
// priceRate = Double.parseDouble(userDynamicPriceObj.toString());
|
// }else {
|
// // 没有调过
|
// //是否触发动态调价 redis获取
|
// Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
|
// if(dynamicPriceObj!=null){
|
// JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
|
// // 触发动态调价
|
// // value=时间
|
// String timeStr = dynamicPriceObj.toString();
|
// // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
|
// R<Integer> r = xpOrderClient.getOrderNum(timeStr);
|
// if(r.getData()==200){
|
// int num = r.getData();
|
// // X单上升一次调价
|
// Integer orderNum = getOrderNum(jsonObject, 4);
|
// // 需要调价的次数
|
// int count = num / orderNum;
|
// if(count>0){
|
// // 计算每次上升的费率
|
// Integer upRate = getOrderNum(jsonObject, 5);
|
// BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
|
// for (int i = count; i > 0; i--) {
|
// // 当前费率+(费率*上升百分比)
|
// priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
// }
|
//
|
// // 冷却时间
|
// Integer time = getOrderNum(jsonObject, 6);
|
// // 触发调价了
|
// redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
|
// }
|
// }
|
//
|
// }
|
// }
|
//
|
// }
|
//
|
//
|
//
|
// XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
|
// double amount = 0;
|
// //等待费
|
// Date date = new Date();
|
// // 计算出是在那个时间段内
|
// for (Object o : startingFareJson) {
|
// JSONObject startingFare = (JSONObject) o;
|
// Calendar calendarStart = Calendar.getInstance();
|
// calendarStart.setTime(date);
|
// calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num1").split(":")[0]));
|
// calendarStart.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num1").split(":")[1]));
|
//
|
// Calendar calendarEnd = Calendar.getInstance();
|
// calendarEnd.setTime(date);
|
// calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num2").split(":")[0]));
|
// calendarEnd.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num2").split(":")[1]));
|
// // 找到符合条件的直接跳出循环
|
// if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
|
// rule.put("num1", startingFare.get("num3"));
|
// rule.put("num2", startingFare.get("num4"));
|
// rule.put("num3", startingFare.get("num5"));
|
// rule.put("num4", startingFare.get("num6"));
|
// rule.put("num5", startingFare.get("num7"));
|
//
|
// rule.put("startTime", startingFare.getString("num1"));
|
// rule.put("endTime", startingFare.getString("num2"));
|
// break;
|
// }
|
// }
|
//
|
//
|
// double realDistance = distance / 1000;//实际公里
|
// double realTime = duration / 60;//实际时间
|
// double exceedDistance = (realDistance - rule.getDouble("num2")) < 0 ? 0 : realDistance - rule.getDouble("num2");//超出起步里程的公里
|
// double exceedTime = (realTime - rule.getDouble("num3")) < 0 ? 0 : realTime - rule.getDouble("num3");//超过起步分钟数的时间
|
// double longDistanceOne = 0;//远途1段
|
// double longDistanceTwo = 0;//远途2段
|
// double longDistanceThree = 0;//远途3段
|
//
|
//
|
// //夜间服务处理逻辑
|
// Calendar calendarNight = Calendar.getInstance();
|
// calendarNight.setTime(date);
|
// calendarNight.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num14").split(" - ")[0].split(":")[0]));
|
// calendarNight.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num14").split(" - ")[0].split(":")[1]));
|
//
|
// Calendar calendar = Calendar.getInstance();
|
// calendar.setTime(date);
|
// calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num14").split(" - ")[1].split(":")[0]));
|
// calendar.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num14").split(" - ")[1].split(":")[1]));
|
//
|
// // 先判断今日是否节假日
|
// boolean holiday = holidayUtil.isHoliday();
|
// if (holiday) {
|
// if (realDistance > rule.getDouble("num6")) {
|
// longDistanceOne = rule.getDouble("num32") * (realDistance - rule.getDouble("num6"));
|
// }
|
// if (realDistance > rule.getDouble("num9")) {
|
// longDistanceTwo = rule.getDouble("num33") * (realDistance - rule.getDouble("num9"));
|
// }
|
// if (realDistance > rule.getDouble("num12")) {
|
// longDistanceThree = rule.getDouble("num34") * (realDistance - rule.getDouble("num12"));
|
// }
|
// amount = rule.getDouble("num29") + (exceedDistance * rule.getDouble("num30")) + (exceedTime * rule.getDouble("num31")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
//
|
//
|
// // 起步价
|
// xpPricingCardVo.setStartPrice(rule.getDouble("num29"));
|
// // 时间段
|
// xpPricingCardVo.setTime("节假日");
|
//
|
//
|
// // 里程
|
// xpPricingCardVo.setDistance(realDistance);
|
//
|
// // 里程费
|
// double distancePrice = (exceedDistance * rule.getDouble("num30")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
// xpPricingCardVo.setDistancePrice(distancePrice);
|
//
|
// // 时长
|
// xpPricingCardVo.setDuration(realTime);
|
//
|
// // 时长费
|
// xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num31")));
|
//
|
//
|
// } else {
|
// if (date.getTime() > calendarNight.getTimeInMillis() && date.getTime() < calendar.getTimeInMillis()) {
|
// if (realDistance > rule.getDouble("num6")) {
|
// longDistanceOne = rule.getDouble("num18") * (realDistance - rule.getDouble("num6"));
|
// }
|
// if (realDistance > rule.getDouble("num9")) {
|
// longDistanceTwo = rule.getDouble("num19") * (realDistance - rule.getDouble("num9"));
|
// }
|
// if (realDistance > rule.getDouble("num12")) {
|
// longDistanceThree = rule.getDouble("num20") * (realDistance - rule.getDouble("num12"));
|
// }
|
// amount = rule.getDouble("num15") + (exceedDistance * rule.getDouble("num16")) + (exceedTime * rule.getDouble("num17")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
//
|
//
|
// // 起步价
|
// xpPricingCardVo.setStartPrice(rule.getDouble("num15"));
|
// // 时间段
|
// xpPricingCardVo.setTime(rule.getString("num14"));
|
//
|
// // 里程
|
// xpPricingCardVo.setDistance(realDistance);
|
//
|
// // 里程费
|
// double distancePrice = (exceedDistance * rule.getDouble("num16")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
// xpPricingCardVo.setDistancePrice(distancePrice);
|
//
|
// // 时长
|
// xpPricingCardVo.setDuration(realTime);
|
//
|
// // 时长费
|
// xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num17")));
|
//
|
//
|
// } else {
|
//
|
// // 高峰处理
|
// Calendar calendarStart = Calendar.getInstance();
|
// calendarStart.setTime(date);
|
// calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num21").split(" - ")[0].split(":")[0]));
|
// calendarStart.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num21").split(" - ")[0].split(":")[1]));
|
//
|
// Calendar calendarEnd = Calendar.getInstance();
|
// calendarEnd.setTime(date);
|
// calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num21").split(" - ")[1].split(":")[0]));
|
// calendarEnd.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num21").split(" - ")[1].split(":")[1]));
|
//
|
// Calendar s2 = Calendar.getInstance();
|
// s2.setTime(date);
|
// s2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num22").split(" - ")[0].split(":")[0]));
|
// s2.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num22").split(" - ")[0].split(":")[1]));
|
//
|
// Calendar e2 = Calendar.getInstance();
|
// e2.setTime(date);
|
// e2.set(Calendar.HOUR_OF_DAY, Integer.valueOf(rule.getString("num22").split(" - ")[1].split(":")[0]));
|
// e2.set(Calendar.MINUTE, Integer.valueOf(rule.getString("num22").split(" - ")[1].split(":")[1]));
|
// //高峰时段处理逻辑
|
// if ((date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) || (date.getTime() > s2.getTimeInMillis() && date.getTime() < e2.getTimeInMillis())) {
|
// if (realDistance > rule.getDouble("num6")) {
|
// longDistanceOne = rule.getDouble("num26") * (realDistance - rule.getDouble("num6"));
|
// }
|
// if (realDistance > rule.getDouble("num9")) {
|
// longDistanceTwo = rule.getDouble("num27") * (realDistance - rule.getDouble("num9"));
|
// }
|
// if (realDistance > rule.getDouble("num12")) {
|
// longDistanceThree = rule.getDouble("num28") * (realDistance - rule.getDouble("num12"));
|
// }
|
// amount = rule.getDouble("num23") + (exceedDistance * rule.getDouble("num24")) + (exceedTime * rule.getDouble("num25")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
//
|
//
|
// // 起步价
|
// xpPricingCardVo.setStartPrice(rule.getDouble("num23"));
|
// // 时间段
|
// if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()) {
|
// xpPricingCardVo.setTime(rule.getString("num21"));
|
// } else {
|
// xpPricingCardVo.setTime(rule.getString("num22"));
|
// }
|
//
|
//
|
// // 里程
|
// xpPricingCardVo.setDistance(realDistance);
|
//
|
// // 里程费
|
// double distancePrice = (exceedDistance * rule.getDouble("num24")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
// xpPricingCardVo.setDistancePrice(distancePrice);
|
//
|
// // 时长
|
// xpPricingCardVo.setDuration(realTime);
|
//
|
// // 时长费
|
// xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num25")));
|
//
|
// } else {
|
// //其他时间段的计算
|
// if (realDistance > rule.getDouble("num6")) {
|
// longDistanceOne = rule.getDouble("num8") * (realDistance - rule.getDouble("num6"));
|
// }
|
// if (realDistance > rule.getDouble("num9")) {
|
// longDistanceTwo = rule.getDouble("num11") * (realDistance - rule.getDouble("num9"));
|
// }
|
// if (realDistance > rule.getDouble("num12")) {
|
// longDistanceThree = rule.getDouble("num13") * (realDistance - rule.getDouble("num12"));
|
// }
|
// amount = rule.getDouble("num1") + (exceedDistance * rule.getDouble("num4")) + (exceedTime * rule.getDouble("num5")) + (wait * waitMoney) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
//
|
//
|
// // 起步价
|
// xpPricingCardVo.setStartPrice(rule.getDouble("num1"));
|
// // 时间段
|
// xpPricingCardVo.setTime(rule.getString("startTime") + " - " + rule.getString("endTime"));
|
//
|
// xpPricingCardVo.setDistancePriceNormal(rule.getDouble("num2"));
|
//
|
// xpPricingCardVo.setDurationPriceNormal(rule.getDouble("num3"));
|
//
|
//
|
// // 里程
|
// xpPricingCardVo.setDistance(realDistance);
|
//
|
// // 里程费
|
// double distancePrice = (exceedDistance * rule.getDouble("num4")) + longDistanceOne + longDistanceTwo + longDistanceThree;
|
// xpPricingCardVo.setDistancePrice(distancePrice);
|
//
|
// // 时长
|
// xpPricingCardVo.setDuration(realTime);
|
//
|
// // 时长费
|
// xpPricingCardVo.setDurationPrice((exceedTime * rule.getDouble("num5")));
|
//
|
// }
|
// }
|
// }
|
//
|
// // 订单总额
|
// Double startPrice = xpPricingCardVo.getStartPrice();
|
// // 先减去起步价重新计算
|
// amount = amount - startPrice;
|
// // 动态计算费用
|
// startPrice= new BigDecimal(startPrice).multiply(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
// amount = amount+startPrice;
|
// xpPricingCardVo.setTotalPrice(amount);
|
//
|
//
|
// return xpPricingCardVo;
|
// }
|
|
|
/**
|
* 获取配置 4每X单 5上升X% 6冷却
|
*
|
* @param rule
|
* @param num
|
* @return
|
*/
|
private Integer getOrderNum(JSONObject rule, int num) {
|
Integer param = rule.getInteger("num" + num);
|
return param;
|
}
|
}
|