| | |
| | | |
| | | 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; |
| | | // } |
| | | |
| | | |
| | | /** |