package net.joystart.order.service.impl; import java.math.BigDecimal; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import net.joystart.common.util.ConfigUtil; import net.joystart.common.util.HttpRequestUtil; import net.joystart.common.util.JSONProcesser; import net.joystart.common.util.date.UtilTimeFormatter; import net.joystart.common.util.log.Log4jTask; import net.joystart.enterprise.dao.CompanyCostMapper; import net.joystart.enterprise.entity.CompanyCost; import net.joystart.order.dao.CostVehiclePriceMapper; import net.joystart.order.dao.OrderCostItemMapper; import net.joystart.order.dao.OrderInsuranceMapper; import net.joystart.order.dao.OrderMapper; import net.joystart.order.entity.CostVehiclePrice; import net.joystart.order.entity.OrderCostItem; import net.joystart.order.entity.OrderDetail; import net.joystart.order.entity.OrderInsurance; import net.joystart.order.entity.OrderVehicleRuleItem; import net.joystart.order.entity.PriceLog; import net.joystart.order.entity.ResultMilage; import net.joystart.order.service.IOrderDetailedSerivce; import net.joystart.task.vehicleTask.dao.NightshiftIntervalMapper; import net.joystart.task.vehicleTask.entity.NightshiftInterval; import net.joystart.vehicle.dao.BranchMapper; import net.joystart.vehicle.dao.ParkinglotMapper; import net.joystart.vehicle.entity.Branch; import net.joystart.vehicle.entity.Parkinglot; import net.joystart.vehicle.service.IOperationService; import net.joystart.vehicle.service.impl.OperationServiceImpl; /*** * 订单价格计算类 * @author lidc */ @Service(value = "orderDetailedSerivce") @Transactional public class OrderDetailedSerivceImpl implements IOrderDetailedSerivce { @Resource OrderMapper orderMapper; @Resource CostVehiclePriceMapper costVehiclePriceMapper; @Resource OrderInsuranceMapper orderInsuranceMapper; @Resource OrderCostItemMapper orderCostItemMapper; @Resource ParkinglotMapper parkinglotMapper; @Resource BranchMapper branchMapper; @Resource CompanyCostMapper companyCostMapper; @Resource NightshiftIntervalMapper nightshiftIntervalMapper; @Resource @Qualifier("ControlService") IOperationService ControlService; final Logger logger = LoggerFactory.getLogger(OperationServiceImpl.class); private static String ControlUrl = ConfigUtil.pro.getProperty("ControlUrl"); //一周年参数配置 private static String flag = ConfigUtil.pro.getProperty("EnableFlag"); private static String startTimes = ConfigUtil.pro.getProperty("startTimes"); private static String endTimes = ConfigUtil.pro.getProperty("endTimes"); /*** * 计算订单价格明细 */ @Override public List<PriceLog> getPriceLogList(Integer orderId, Long pauseTime) { // 获取订单信息 OrderDetail oDetail = orderMapper.getOrderInfo(orderId); if(oDetail!=null){ Integer parkId = oDetail.getRentparkid(); Integer branchId = oDetail.getReturnbranchid(); return getPriceLogList(orderId, pauseTime, parkId, branchId); } else { return getPriceLogList(orderId, pauseTime, null, null); } } /*** * 计算订单价格明细(带停车费) */ @Override public List<PriceLog> getPriceLogList(Integer orderId, Long pauseTime, Integer parkId, Integer branchId) { List<PriceLog> list = new ArrayList<>(); // 是否计算停车减免 boolean isStopMoney = false; //还车停车费 double returnStopMoney = 0; // 获取订单信息 OrderDetail oDetail = orderMapper.getOrderInfo(orderId); if(oDetail!=null && Integer.valueOf(40).equals(oDetail.getOrderstatus()!=null)){ PriceLog log = new PriceLog(); log.setTypeText("订单已取消"); log.setPrice(0.0); log.setType(1); list.add(log); return list; } //一周年活动 if(flag!=null && "1".equals(flag)){ return onePriceLog(orderId, pauseTime, parkId,branchId); } // 获取计费信息 CostVehiclePrice cvp = costVehiclePriceMapper.selectByVehicleModelId(oDetail); // 获取订单包含的保险 List<OrderInsurance> orderInsuranceList = orderInsuranceMapper.getInsuranceByOrderId(orderId); // 获取活动信息 List<OrderVehicleRuleItem> ruleItemList = orderMapper.getOrderVehicleRuleItem(orderId); // 开始和结束时间不参与计算(算里程使用) Date allStartDate = oDetail.getChargingstartdate(); Date allEndDate = oDetail.getReturnvehicledate(); // 取订单开始时间 Date startDate = oDetail.getChargingstartdate(); if (startDate == null)// 没有开始时间 { return list; } for (OrderVehicleRuleItem ovRuleItem : ruleItemList) { if (ovRuleItem != null) { // 减去活动的开始时间 Date tempStartDate = new Date(startDate.getTime() + (ovRuleItem.getDuration() * 60 * 1000)); list.add(CreatePriceLog( ovRuleItem.getName() + "(" + UtilTimeFormatter.getDatemdhm(startDate.getTime()) + "~" + UtilTimeFormatter.getDatemdhm(tempStartDate.getTime()) + ")", (double) 0, startDate.getTime(), tempStartDate.getTime(), 3, (double) 0)); startDate = tempStartDate; } } // 取订单结束时间 Date endDate = oDetail.getReturnvehicledate(); // 等于1说明是结单的时候用 if (pauseTime == 1 || pauseTime == 2) { isStopMoney = true; } // 如果没有结束时间则取当前时间 if (endDate == null) { endDate = new Date(); } if (allEndDate == null) { allEndDate = new Date(); } long diff = endDate.getTime() - startDate.getTime(); // 减去暂停时间(最后结账时) //diff = diff - pauseTime; // 计算天数 long days = diff / (1000 * 60 * 60 * 24); // 计算是否正好整天 // 计算天数 double dDays = (double) diff / (1000 * 60 * 60 * 24); // 加上全日租后的开始日期 Date aStartDate = UtilTimeFormatter.afterNDay((int) days, startDate); Boolean isNightSale = false; // 是否设置了夜间优惠价格 Boolean isNightOver = false; // 是否订单是在夜间 // 计算全日租 if (days != 0) { list.add(CreatePriceLog( "整日租" + days + "天(" + UtilTimeFormatter.getDatemdhm(startDate.getTime()) + "~" + UtilTimeFormatter.getDatemdhm(aStartDate.getTime()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount() * days), startDate.getTime(), aStartDate.getTime(), 0, (double) 0)); } else { // 夜间特惠价格要求订单开始结束时间必须在当天18点到次日9点之间才可以 // 且设置的夜间特惠价格必须不能为空和大于0 if (null != cvp.getNightsalemoney() && cvp.getNightsalemoney().doubleValue() > 0) { isNightSale = true; } } if (dDays > days) { // 有小数,不是整天 Integer intStart = 17; Integer intEnd = 9; NightshiftInterval ns = nightshiftIntervalMapper.selectByPrimaryKeyType(2); if(ns!= null){ Calendar calendar = Calendar.getInstance(); if(ns.getStarttime() != null) { Date date = ns.getStarttime(); calendar.setTime(date); String strHour = new SimpleDateFormat("HH").format(calendar.getTime()); if(StringUtils.isNoneBlank(strHour)) { intStart = Integer.valueOf(strHour); } } if(ns.getEndtime() != null) { Date date = ns.getEndtime(); calendar.setTime(date); String strHour = new SimpleDateFormat("HH").format(calendar.getTime()); if(StringUtils.isNoneBlank(strHour)) { intEnd = Integer.valueOf(strHour); } } } //endDate = new Date(endDate.getTime() - pauseTime); endDate = new Date(endDate.getTime()); // 开始时间 Calendar calendar_as = Calendar.getInstance(); calendar_as.setTime(aStartDate); // 结束时间 Calendar calendar_e = Calendar.getInstance(); calendar_e.setTime(endDate); String mushroomCarModeId = ConfigUtil.pro.getProperty("mushroomCar.ModeId"); int mushroomCarProvinceId = new Integer(ConfigUtil.pro.getProperty("mushroomCar.ProvinceId")); String vmodeId = cvp.getVehiclemodelid().toString(); //旅游车计价2017.10.1新增 //根据车型和城市规则匹配 if(mushroomCarModeId.contains(vmodeId) && cvp.getProvinceid().intValue() == mushroomCarProvinceId){ // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); //半小时为一个计价单位 long halfHour = (min + cvp.getPricestep() + 1) / cvp.getPricestep(); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * halfHour); // 总价格 double sumMoney = minMoney; // 如果总价格大于整日租价格 if (sumMoney > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } //普通车计价 }else{ // 当天9点 Calendar calendar_9 = Calendar.getInstance(); calendar_9.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE), intEnd, 5, 0); calendar_9.set(Calendar.MILLISECOND, 0); // 当天18点 Calendar calendar_18 = Calendar.getInstance(); calendar_18.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE), intStart, 0, 0); calendar_18.set(Calendar.MILLISECOND, 0); // 隔天9点 Calendar calendar_Add1_9 = Calendar.getInstance(); calendar_Add1_9.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE) + 1, intEnd, 5, 0); calendar_Add1_9.set(Calendar.MILLISECOND, 0); // 隔天18点 Calendar calendar_Add1_18 = Calendar.getInstance(); calendar_Add1_18.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE) + 1, intStart, 0, 0); calendar_Add1_18.set(Calendar.MILLISECOND, 0); // 开始时间小于等于当天9点,结束时间小于等于当天9点 只是夜间 if (calendar_as.compareTo(calendar_9) <= 0 && calendar_e.compareTo(calendar_9) <= 0) { isNightOver = true; // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 总价格 double sumMoney = minMoney; // 如果总价格大于夜间特惠价格 if (sumMoney > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } // 开始时间小于等于当天9点,结束时间小于等于隔天9点且大于当天9点 if (calendar_as.compareTo(calendar_9) <= 0 && calendar_e.compareTo(calendar_Add1_9) <= 0 && calendar_e.compareTo(calendar_9) > 0) { // 总价格 double sumMoney9 = (double) 0; double sumMoney18 = (double) 0; double sumMoneyAdd9 = (double) 0; // 开始时间到9点的时间(夜) Long mdiff = calendar_9.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 9点之前的总价格 sumMoney9 = minMoney9; // 如果总价格大于夜间特惠,夜间特惠 if (sumMoney9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } // 9点到结束时间的时间(小于18点到结束时间) double minMoney9E = (double) 0; if (calendar_e.compareTo(calendar_18) < 0)// 小于18点,结束时间 { // 时间 mdiff = calendar_e.getTimeInMillis() - calendar_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoney9E = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else {// 大于18点 // 时间 mdiff = calendar_18.getTimeInMillis() - calendar_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoney9E = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } // 9点-18点(结束时间)的总价格 sumMoney18 = minMoney9E; if (sumMoney18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } // 18点到第二天9点的时间价格 double minMoney18E = (double) 0; if (calendar_e.compareTo(calendar_18) > 0) { // 时间 mdiff = calendar_e.getTimeInMillis() - calendar_18.getTimeInMillis(); min = mdiff / (1000 * 60); minMoney18E = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoneyAdd9 = minMoney18E; if (sumMoneyAdd9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } if ((cvp.getFulldaymoney() * cvp.getFulldaydiscount()) < (sumMoney9 + sumMoney18 + sumMoneyAdd9)) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { // 开始时间到9点 if (sumMoney9 == (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()) + ")", sumMoney9, calendar_as.getTimeInMillis(), calendar_9.getTimeInMillis(), 0, (double) 0)); } else { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()), minMoney9, calendar_as.getTimeInMillis(), calendar_9.getTimeInMillis(), 0, (double) 0)); } // 9点到18点 if (calendar_e.compareTo(calendar_18) <= 0)// 小于18点,结束时间 { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoney18, calendar_9.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { // 大于18点,到18点 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()), sumMoney18, calendar_9.getTimeInMillis(), calendar_18.getTimeInMillis(), 0, (double) 0)); } // 18点到结束 if (calendar_e.compareTo(calendar_18) > 0) { // 18点到结束 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney18E, calendar_18.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } } // 开始时间大于等于当天9点,结束时间小于等于当天18点 if (calendar_as.compareTo(calendar_9) > 0 && calendar_e.compareTo(calendar_18) <= 0) { // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 总价格 double sumMoney = minMoney; // 如果总价格大于整日租价格 if (sumMoney > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } // 开始时间大于等于当天9点,结束时间大于等于隔天9点,小于隔天18点 if (calendar_as.compareTo(calendar_9) > 0 && calendar_as.compareTo(calendar_18) < 0 && calendar_e.compareTo(calendar_18) > 0 && calendar_e.compareTo(calendar_Add1_18) < 0) { // 总价格 double sumMoney18 = (double) 0; double sumMoneyAdd9 = (double) 0; double sumMoneyAdd18 = (double) 0; // 开始时间至当天18点 double minMoney18 = (double) 0; // 当天18点至隔天9点 double minMoneyAdd9 = (double) 0; // 隔天9点至结束时间 double minMoneyAdd18 = (double) 0; // 开始时间至当天18点 if (calendar_e.compareTo(calendar_18) <= 0)// 小于当天18点,到结束时间(白) { // 开始时间到18点的时间(白) Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoney18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else {// 大于当天18点,到18点 Long mdiff = calendar_18.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoney18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoney18 = minMoney18; if (sumMoney18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } // 当天18点至隔天9点 if (calendar_e.compareTo(calendar_18) > 0)// 大于18点 { if (calendar_e.compareTo(calendar_Add1_9) <= 0)// 小于隔天9点,结束时间 { // 18点到结束时间时间(夜) Long mdiff = calendar_e.getTimeInMillis() - calendar_18.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else// 大于隔天9点,隔天9点 { // 18点到隔天9点时间(夜) Long mdiff = calendar_Add1_9.getTimeInMillis() - calendar_18.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoneyAdd9 = minMoneyAdd9; if (sumMoneyAdd9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } } // 隔天9点至结束时间 if (calendar_e.compareTo(calendar_Add1_9) > 0) { // 隔天9点至结束(白) Long mdiff = calendar_e.getTimeInMillis() - calendar_Add1_9.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); sumMoneyAdd18 = minMoneyAdd18; if (sumMoneyAdd18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoneyAdd18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } } // 列出详细 if ((sumMoney18 + sumMoneyAdd9 + sumMoneyAdd18) > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else if ((sumMoney18 + sumMoneyAdd9) > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { if (calendar_e.compareTo(calendar_18) <= 0)// 小于当天18点,到结束时间(白) { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoney18, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 大于当天18点,到18点 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()), sumMoney18, calendar_as.getTimeInMillis(), calendar_18.getTimeInMillis(), 0, (double) 0)); } // 当天18点至隔天9点 if (calendar_e.compareTo(calendar_Add1_9) <= 0)// 大于隔天9点,到结束 { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAdd9, calendar_18.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 大于隔天9点,隔天9点 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()), sumMoneyAdd9, calendar_18.getTimeInMillis(), calendar_Add1_9.getTimeInMillis(), 0, (double) 0)); } // 隔天9点至结束时间 if (calendar_e.compareTo(calendar_Add1_9) > 0) { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAdd18, calendar_Add1_9.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } } // 开始时间大约18点,结束时间小于等于隔天9点 if (calendar_as.compareTo(calendar_18) >= 0 && calendar_e.compareTo(calendar_Add1_9) <= 0) { isNightOver = true; // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 总价格 double sumMoney = minMoney; // 如果总价格大于夜间特惠价格 if (sumMoney > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } // 开始时间大约18点,结束时间大约隔天9点 if (calendar_as.compareTo(calendar_18) >= 0 && calendar_e.compareTo(calendar_Add1_9) > 0) { // 总价格 double sumMoneyAdd9 = (double) 0; double sumMoneyAdd18 = (double) 0; double sumMoneyAddE = (double) 0; // 开始时间至隔天9点 double minMoneyAdd9 = (double) 0; // 隔天9点至隔天18点 double minMoneyAdd18 = (double) 0; // 隔天18点至结束时间 double minMoneyAddE = (double) 0; // 开始时间至隔天9点 // 开始时间到隔天9点的时间(夜) Long mdiff = calendar_Add1_9.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); sumMoneyAdd9 = minMoneyAdd9; if (sumMoneyAdd9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } // 隔天9点至隔天18点(白) if (calendar_e.compareTo(calendar_Add1_18) <= 0)// 小于等于18点,到结束时间 { // 开始时间到隔天9点的时间(夜) // mdiff = calendar_Add1_18.getTimeInMillis() - // calendar_e.getTimeInMillis(); mdiff = calendar_e.getTimeInMillis() - calendar_Add1_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoneyAdd18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else { // 大于隔天18点,到隔天18点 // 开始时间到隔天9点的时间(夜) mdiff = calendar_Add1_18.getTimeInMillis() - calendar_Add1_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoneyAdd18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoneyAdd18 = minMoneyAdd18; if (sumMoneyAdd18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoneyAdd18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } // 隔天18点至结束时间 if (calendar_e.compareTo(calendar_Add1_18) > 0) { // 开始时间到隔天9点的时间(夜) mdiff = calendar_e.getTimeInMillis() - calendar_Add1_18.getTimeInMillis(); min = mdiff / (1000 * 60); minMoneyAddE = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); sumMoneyAddE = minMoneyAddE; if (sumMoneyAddE > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAddE = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } } if ((sumMoneyAdd9 + sumMoneyAdd18 + sumMoneyAddE) > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 分段详细 // 开始时间至隔天9点 if (sumMoneyAdd9 >= (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + ")", sumMoneyAdd9, calendar_as.getTimeInMillis(), calendar_Add1_9.getTimeInMillis(), 0, (double) 0)); } else { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()), sumMoneyAdd9, calendar_as.getTimeInMillis(), calendar_Add1_9.getTimeInMillis(), 0, (double) 0)); } // 隔天9点至隔天18点(白) if (calendar_e.compareTo(calendar_Add1_18) <= 0)// 小于等于18点,到结束时间 { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAdd18, calendar_Add1_9.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_18.getTimeInMillis()), sumMoneyAdd18, calendar_Add1_9.getTimeInMillis(), calendar_Add1_18.getTimeInMillis(), 0, (double) 0)); } if (calendar_e.compareTo(calendar_Add1_18) > 0) { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAddE, calendar_Add1_18.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } } } } // 计算里程 int milage = GetMilage(oDetail.getSn(), allStartDate.getTime(), allEndDate.getTime()); PriceLog log = new PriceLog(); log.setTypeText(milage + "公里"); BigDecimal b2 = new BigDecimal(milage * cvp.getMileagemoney() * cvp.getMileagediscount()); double f2 = b2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); log.setPrice(f2); log.setStartDate(allStartDate.getTime()); log.setEndDate(allEndDate.getTime()); log.setMilage((long) milage); log.setType(1); list.add(log); Date cstartDate = oDetail.getChargingstartdate(); long nm = 1000*60; //一分钟的毫秒数 long diff2 = new Date().getTime() - cstartDate.getTime(); long min = diff2/nm; //计算差多少分钟 // 计费时间大于1分钟再计算保险费。 lidongchun@bagechuxing.cn if(min>1){ // 记录保险消费 if (days == 0) { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney(), (long) 0, (long) 0, 4, (double) 0)); } } } else { if (dDays > days) { if (dDays - days >= 0.021) { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * (days + 1), (long) 0, (long) 0, 4, (double) 0)); } } } else { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * (days), (long) 0, (long) 0, 4, (double) 0)); } } } } else { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * days, (long) 0, (long) 0, 4, (double) 0)); } } } } } // Double dMoney = ControlService.getStopVehicleMoney(Integer.valueOf(orderId)); // if(dMoney > 0){ // PriceLog logStop = new PriceLog(); // logStop.setTypeText("停车费减免"); // logStop.setPrice(-dMoney); // logStop.setType(4); // list.add(logStop); // } // 计算还车服务费 if(parkId!=null && branchId!=null){ PriceLog logStop = new PriceLog(); returnStopMoney = ControlService.getReturnStopVehicleMoney(parkId, branchId); if(returnStopMoney>0){ logStop.setTypeText("还车服务费"); logStop.setPrice(returnStopMoney); logStop.setType(4); list.add(logStop); } } if (isStopMoney) { // 判断只有用户点击了开锁后,才免除区域停车费 if (oDetail.getIsFirstUnLock() == 1 && oDetail.getLastReturnVehicleDate() != null) { // 计算合计前取是否有小区停车费用 double bigFreeMoney = 0; // 定义免费停车的时间 double FreePrice = 0; // 设置的单价 long FreeTime = 0; // 设置的时间 long MustTime = 0; // 至少行驶时间 int MustMileage = 0; // 至少行驶里程 String parkFeeAmount=""; // 停车费封顶 // 判断车辆是停在车场还是网点,取不同的数据 if (!StringUtils.isBlank(oDetail.getRentbranchid())) { // 网点 Branch branch = this.branchMapper.selectByPrimaryKey(Integer.valueOf(oDetail.getRentbranchid())); // 获取设置的价格和时间 if (branch != null) { int mode = branch.getParkingmode(); if(mode==2){ //if (branch.getParkingFeeMax()!=null){ // parkFeeAmount = branch.getParkingFeeMax().toString(); //} //else //{ parkFeeAmount = "0"; //} } else { // 最少行驶时间 if (branch.getMinimumtime() != null) { MustTime = branch.getMinimumtime(); } if (branch.getMinimummileage() != null) { MustMileage = branch.getMinimummileage(); } if (branch.getBillingunitprice() != null) { FreePrice = Double.valueOf(branch.getBillingunitprice().toString()); } if (branch.getDelaytime() != null) { FreeTime = branch.getDelaytime(); } if (branch.getParkingFeeMax()!=null){ parkFeeAmount = branch.getParkingFeeMax().toString(); } } } } else { // 车场 Parkinglot parkinglot = this.parkinglotMapper.selectByPrimaryKey(oDetail.getRentparkid()); if (parkinglot != null) { int mode = parkinglot.getParkingmode(); //按次收费 if(mode==2){ //if (parkinglot.getParkingFeeMax()!=null){ // parkFeeAmount = parkinglot.getParkingFeeMax().toString(); //} //else //{ parkFeeAmount = "0"; //} } else { if (parkinglot.getMinimumtime() != null) { MustTime = parkinglot.getMinimumtime(); } if (parkinglot.getMinimummileage() != null) { MustMileage = parkinglot.getMinimummileage(); } // 获取设置的价格和时间 if (parkinglot.getBillingunitprice() != null) { FreePrice = Double.valueOf(parkinglot.getBillingunitprice().toString()); } if (parkinglot.getDelaytime() != null) { FreeTime = parkinglot.getDelaytime(); } if (parkinglot.getParkingFeeMax()!=null){ parkFeeAmount = parkinglot.getParkingFeeMax().toString(); } } } } // 分钟 long ordertime = diff / (1000 * 60); // 判断分钟数和里程数都达到要求才可以减免停车费 if (ordertime >= MustTime && milage >= MustMileage) { // 计算时间 long minute = UtilTimeFormatter.minutes(oDetail.getChargingstartdate(), oDetail.getLastReturnVehicleDate(), FreeTime); // 计算有多少个半小时 long halfHour = minute / 30; // 如果剩余分钟还有按半小时算 if ((minute - halfHour * 30) > 0) { halfHour = halfHour + 1; } // 免费的钱 bigFreeMoney = halfHour * FreePrice; if (bigFreeMoney > 0) { if(StringUtils.isNotEmpty(parkFeeAmount)){ if(bigFreeMoney>Double.parseDouble(parkFeeAmount)){//如果免费钱大于停车费封顶 取封顶值 bigFreeMoney = Double.parseDouble(parkFeeAmount); } } Calendar calendar_return = Calendar.getInstance(); calendar_return.setTime(oDetail.getChargingstartdate()); calendar_return.add(Calendar.MINUTE, (int) FreeTime); if(bigFreeMoney>0){ // 如果是个人单计算减免 if (pauseTime == 1) { list.add(CreatePriceLog( "减免停车费(" + UtilTimeFormatter .getDatemdhm(oDetail.getLastReturnVehicleDate().getTime()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_return.getTimeInMillis()) + ")", (Double) bigFreeMoney * -1, (long) oDetail.getLastReturnVehicleDate().getTime(), (long) oDetail.getChargingstartdate().getTime(), 3, (double) 0)); } // 如果是企业单 if (pauseTime == 2) { try { PriceLog priceLog = CreatePriceLog("减免停车费(" + UtilTimeFormatter.getDatemdhm(oDetail.getLastReturnVehicleDate().getTime()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_return.getTimeInMillis()) + ")", (Double) bigFreeMoney * -1, (long) oDetail.getLastReturnVehicleDate().getTime(), (long) oDetail.getChargingstartdate().getTime(), 3, (double) 0); //新逻辑,企业停车费减免费用要参与计算 list.add(priceLog); CompanyCost companyCost = new CompanyCost(); companyCost.setOrderid(orderId); companyCost.setMileage(priceLog.getMilage()); companyCost.setMoney(new BigDecimal(priceLog.getPrice())); companyCost.setTypetext(priceLog.getTypeText()); companyCost.setCosttype( priceLog.getCostType() == null ? 0 : priceLog.getCostType().intValue()); this.companyCostMapper.insertSelective(companyCost); } catch (Exception ex) { logger.error(ex.getMessage()); } } } } } } } Double sumMoneyAll = (double) 0; double sumCostAll = (double) 0; double stopMoney = (double)0; // 计算合计,停车费减免单独提出来 for (PriceLog oi : list) { if (oi.getType().intValue() != 3) { BigDecimal b = new BigDecimal(oi.getPrice()); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); sumCostAll += f1; sumMoneyAll += f1; } else{ BigDecimal b = new BigDecimal(oi.getPrice()); stopMoney = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } } //符合计算夜间特惠价格,判断最后的总价是否大于夜间特惠的价格 if(isNightSale && isNightOver){ if(sumMoneyAll > cvp.getNightsalemoney().doubleValue()){ sumMoneyAll = cvp.getNightsalemoney().doubleValue(); } } //计算完所有的合计之后,再减去停车费减免的金额 sumMoneyAll += stopMoney; if (pauseTime == 2) { if(sumMoneyAll < 0){ sumMoneyAll = 0.0; } } list.add(CreatePriceLog("合计", (Double) sumMoneyAll, (long) 0, (long) 0, 2, sumCostAll)); return list; } /*** * 计算获取行驶里程 */ @Override public Integer GetMilage(String sn, Long startDate, Long endDate) { int milage = 0; try { String url = ControlUrl + "GetMileageTotal.ashx?sn=" + sn + "&startTime=" + startDate + "&endTime=" + endDate + "&customerFlag=" + ConfigUtil.pro.getProperty("CustomerFlag"); String str = HttpRequestUtil.sendGet(url, ""); if (str == null) { return milage; } ResultMilage rm = (ResultMilage) JSONProcesser.jsonProcesser(str, ResultMilage.class); if (rm == null) { return milage; } if (rm.getResult() != 1) { Log4jTask.addLog("获取里程失败:" + rm.getMessage(), System.currentTimeMillis(), Log4jTask.ERROR, OrderDetailedSerivceImpl.class.getName(), new Exception()); return milage; } milage = rm.getCars(); } catch (Exception ex) { Log4jTask.addLog("获取里程接口报错", System.currentTimeMillis(), Log4jTask.ERROR, OrderDetailedSerivceImpl.class.getName(), ex); } //过滤行驶里程小于0的数据 if(milage < 0){ Log4jTask.addLog("车辆{"+sn+"}获取里程小于0:" + milage, System.currentTimeMillis(), Log4jTask.ERROR, OrderDetailedSerivceImpl.class.getName(), new Exception()); milage = 1; } //如果行驶里程大于10000公里,估算里程的数据 int minutes = (int) ((endDate - startDate)/(1000 * 60)); int hours = (int) ((endDate - startDate)/(1000 * 60 * 60)); if(milage > 10000){ if(hours>0){ if(milage/hours>120){ milage = (int) (minutes * 1.5); } } else { milage = (int) (minutes * 1.5); } } return milage; } /*** * 生成订单价格数据 * @param typeText * @param price * @param startDate * @param endDate * @param type * @param cost * @return */ private PriceLog CreatePriceLog(String typeText, Double price, Long startDate, Long endDate, Integer type, Double cost) { PriceLog log = new PriceLog(); log.setTypeText(typeText); BigDecimal b = new BigDecimal(price); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); log.setPrice(f1); log.setStartDate(startDate); log.setEndDate(endDate); log.setType(type); log.setCost(cost); if (typeText.contains("夜间特惠")) { log.setCostType(2); } if (typeText.contains("整日租")) { log.setCostType(1); } return log; } /*** * 根据订单ID获取订单价格详情 */ @Override public List<PriceLog> getPriceDetailByOrderId(Integer orderId) { List<PriceLog> result = new ArrayList<PriceLog>(); List<OrderCostItem> costItems = orderCostItemMapper.selectByOrderId(orderId); if (costItems.isEmpty()) { return new ArrayList<PriceLog>(); } PriceLog priceLog; for (OrderCostItem item : costItems) { priceLog = new PriceLog(); priceLog.setTypeText(item.getTypetext()); priceLog.setPrice(item.getMoney()); priceLog.setMoney(item.getMoney() + ""); priceLog.setType(item.getCostType()); result.add(priceLog); } return result; } /*** * 根据订单ID获取订单项目 */ public List<OrderCostItem> getPriceDetailFromOrderId(Integer orderId) { return orderCostItemMapper.selectByOrderId(orderId); } @Override public CostVehiclePrice getCostVehiclePriceByOrderId(Integer orderId) { // 获取订单信息 OrderDetail oDetail = orderMapper.getOrderInfo(orderId); // 获取计费信息 CostVehiclePrice cvp = costVehiclePriceMapper.selectByVehicleModelId(oDetail); return cvp; } /** * 一周活动使用计费方法 * @param orderId * @param pauseTime * @param parkId * @param branchId * @return */ public List<PriceLog> onePriceLog(Integer orderId, Long pauseTime, Integer parkId, Integer branchId){ List<PriceLog> list = new ArrayList<>(); // 是否计算停车减免 boolean isStopMoney = false; //还车停车费 double returnStopMoney = 0; // 获取订单信息 OrderDetail oDetail = orderMapper.getOrderInfo(orderId); if(oDetail!=null && Integer.valueOf(40).equals(oDetail.getOrderstatus()!=null)){ PriceLog log = new PriceLog(); log.setTypeText("订单已取消"); log.setPrice(0.0); log.setType(1); list.add(log); return list; } // 获取订单包含的保险 List<OrderInsurance> orderInsuranceList = orderInsuranceMapper.getInsuranceByOrderId(orderId); //一周年活动 if(flag!=null && "1".equals(flag)){ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Double sumMoneyAll = (double) 0; double sumCostAll = (double) 0; Date sdate = df.parse(startTimes);//活动开始时间 Date edate = df.parse(endTimes);//活动结束时间 Date allStartDate = oDetail.getChargingstartdate();//订单开始时间 if(allStartDate!=null){ Date allEndDate = oDetail.getReturnvehicledate();//订单结束时间 if (allEndDate == null) { allEndDate = new Date(); } long to = allEndDate.getTime(); long from = allStartDate.getTime(); int hours = (int) (to-from)/(1000*60*60);//结束时间减去开始时间是否小于一小时 if(allStartDate.getTime()>=sdate.getTime() && allStartDate.getTime()<=edate.getTime()){ if(hours<1){ Date tempStartDate = new Date(allStartDate.getTime() + (1000*60*60)); list.add(CreatePriceLog( "限免1小时" + "(" + UtilTimeFormatter.getDatemdhm(allStartDate.getTime()) + "~" + UtilTimeFormatter.getDatemdhm(tempStartDate.getTime()) + ")", (double) 0, allStartDate.getTime(), tempStartDate.getTime(), 3, (double) 0)); // 计算里程 int milage = GetMilage(oDetail.getSn(), allStartDate.getTime(), allEndDate.getTime()); PriceLog log = new PriceLog(); log.setTypeText(milage + "公里"); log.setPrice(0.0); log.setStartDate(allStartDate.getTime()); log.setEndDate(allEndDate.getTime()); log.setMilage((long) milage); log.setType(1); list.add(log); long diff = allEndDate.getTime() - allStartDate.getTime(); long days = diff / (1000 * 60 * 60 * 24); // 计算天数 double dDays = (double) diff / (1000 * 60 * 60 * 24); long nm = 1000*60; //一分钟的毫秒数 long diff2 = new Date().getTime() - allStartDate.getTime(); long min = diff2/nm; //计算差多少分钟 double bxMoney=0.00; // 计费时间大于1分钟再计算保险费。 lidongchun@bagechuxing.cn if(min>1){ // 记录保险消费 if (days == 0) { for (OrderInsurance oi : orderInsuranceList) { bxMoney = (double) oi.getInsurancemoney(); if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney(), (long) 0, (long) 0, 4, (double) 0)); } } } else { if (dDays > days) { if (dDays - days >= 0.021) { for (OrderInsurance oi : orderInsuranceList) { bxMoney = (double) oi.getInsurancemoney(); if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * (days + 1), (long) 0, (long) 0, 4, (double) 0)); } } } else { for (OrderInsurance oi : orderInsuranceList) { bxMoney = (double) oi.getInsurancemoney(); if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * (days), (long) 0, (long) 0, 4, (double) 0)); } } } } else { for (OrderInsurance oi : orderInsuranceList) { bxMoney = (double) oi.getInsurancemoney(); if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * days, (long) 0, (long) 0, 4, (double) 0)); } } } } } list.add(CreatePriceLog("合计", (Double) sumMoneyAll+bxMoney, (long) 0, (long) 0, 2, sumCostAll)); return list; } } } } catch (ParseException e) { e.printStackTrace(); } } if(flag!=null && "1".equals(flag) && oDetail.getChargingstartdate()!=null){ Date sdate = oDetail.getChargingstartdate(); Calendar cal = Calendar.getInstance(); cal.setTime(sdate); cal.add(Calendar.HOUR,-1); //oDetail.setChargingstartdate(cal.getTime()); Date tempStartDate = new Date(sdate.getTime() + (1000*60*60)); list.add(CreatePriceLog( "限免1小时" + "(" + UtilTimeFormatter.getDatemdhm(sdate.getTime()) + "~" + UtilTimeFormatter.getDatemdhm(tempStartDate.getTime()) + ")", (double) 0, sdate.getTime(), tempStartDate.getTime(), 3, (double) 0)); Date now_10 = new Date(sdate.getTime() + (1000*60*60)); //10分钟前的时间 oDetail.setChargingstartdate(now_10); } // 获取计费信 CostVehiclePrice cvp = costVehiclePriceMapper.selectByVehicleModelId(oDetail); // 获取活动信息 List<OrderVehicleRuleItem> ruleItemList = orderMapper.getOrderVehicleRuleItem(orderId); // 开始和结束时间不参与计算(算里程使用) Date allStartDate = oDetail.getChargingstartdate(); Date allEndDate = oDetail.getReturnvehicledate(); Date startDate=null; // 取订单开始时间 startDate = oDetail.getChargingstartdate(); if (startDate == null)// 没有开始时间 { return list; } for (OrderVehicleRuleItem ovRuleItem : ruleItemList) { if (ovRuleItem != null) { // 减去活动的开始时间 Date tempStartDate = new Date(startDate.getTime() + (ovRuleItem.getDuration() * 60 * 1000)); list.add(CreatePriceLog( ovRuleItem.getName() + "(" + UtilTimeFormatter.getDatemdhm(startDate.getTime()) + "~" + UtilTimeFormatter.getDatemdhm(tempStartDate.getTime()) + ")", (double) 0, startDate.getTime(), tempStartDate.getTime(), 3, (double) 0)); startDate = tempStartDate; } } // 取订单结束时间 Date endDate = oDetail.getReturnvehicledate(); // 等于1说明是结单的时候用 if (pauseTime == 1 || pauseTime == 2) { isStopMoney = true; } // 如果没有结束时间则取当前时间 if (endDate == null) { endDate = new Date(); } if (allEndDate == null) { allEndDate = new Date(); } long diff = endDate.getTime() - startDate.getTime(); // 减去暂停时间(最后结账时) //diff = diff - pauseTime; // 计算天数 long days = diff / (1000 * 60 * 60 * 24); // 计算是否正好整天 // 计算天数 double dDays = (double) diff / (1000 * 60 * 60 * 24); // 加上全日租后的开始日期 Date aStartDate = UtilTimeFormatter.afterNDay((int) days, startDate); Boolean isNightSale = false; // 是否设置了夜间优惠价格 Boolean isNightOver = false; // 是否订单是在夜间 // 计算全日租 if (days != 0) { list.add(CreatePriceLog( "整日租" + days + "天(" + UtilTimeFormatter.getDatemdhm(startDate.getTime()) + "~" + UtilTimeFormatter.getDatemdhm(aStartDate.getTime()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount() * days), startDate.getTime(), aStartDate.getTime(), 0, (double) 0)); } else { // 夜间特惠价格要求订单开始结束时间必须在当天18点到次日9点之间才可以 // 且设置的夜间特惠价格必须不能为空和大于0 if (null != cvp.getNightsalemoney() && cvp.getNightsalemoney().doubleValue() > 0) { isNightSale = true; } } if (dDays > days) { // 有小数,不是整天 Integer intStart = 17; Integer intEnd = 9; NightshiftInterval ns = nightshiftIntervalMapper.selectByPrimaryKeyType(2); if(ns!= null){ Calendar calendar = Calendar.getInstance(); if(ns.getStarttime() != null) { Date date = ns.getStarttime(); calendar.setTime(date); String strHour = new SimpleDateFormat("HH").format(calendar.getTime()); if(StringUtils.isNoneBlank(strHour)) { intStart = Integer.valueOf(strHour); } } if(ns.getEndtime() != null) { Date date = ns.getEndtime(); calendar.setTime(date); String strHour = new SimpleDateFormat("HH").format(calendar.getTime()); if(StringUtils.isNoneBlank(strHour)) { intEnd = Integer.valueOf(strHour); } } } //endDate = new Date(endDate.getTime() - pauseTime); endDate = new Date(endDate.getTime()); // 开始时间 Calendar calendar_as = Calendar.getInstance(); calendar_as.setTime(aStartDate); // 结束时间 Calendar calendar_e = Calendar.getInstance(); calendar_e.setTime(endDate); String mushroomCarModeId = ConfigUtil.pro.getProperty("mushroomCar.ModeId"); int mushroomCarProvinceId = new Integer(ConfigUtil.pro.getProperty("mushroomCar.ProvinceId")); String vmodeId = cvp.getVehiclemodelid().toString(); //旅游车计价2017.10.1新增 //根据车型和城市规则匹配 if(mushroomCarModeId.contains(vmodeId) && cvp.getProvinceid().intValue() == mushroomCarProvinceId){ // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); //半小时为一个计价单位 long halfHour = (min + cvp.getPricestep() + 1) / cvp.getPricestep(); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * halfHour); // 总价格 double sumMoney = minMoney; // 如果总价格大于整日租价格 if (sumMoney > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } //普通车计价 }else{ // 当天9点 Calendar calendar_9 = Calendar.getInstance(); calendar_9.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE), intEnd, 5, 0); calendar_9.set(Calendar.MILLISECOND, 0); // 当天18点 Calendar calendar_18 = Calendar.getInstance(); calendar_18.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE), intStart, 0, 0); calendar_18.set(Calendar.MILLISECOND, 0); // 隔天9点 Calendar calendar_Add1_9 = Calendar.getInstance(); calendar_Add1_9.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE) + 1, intEnd, 5, 0); calendar_Add1_9.set(Calendar.MILLISECOND, 0); // 隔天18点 Calendar calendar_Add1_18 = Calendar.getInstance(); calendar_Add1_18.set(calendar_as.get(Calendar.YEAR), calendar_as.get(Calendar.MONTH), calendar_as.get(Calendar.DATE) + 1, intStart, 0, 0); calendar_Add1_18.set(Calendar.MILLISECOND, 0); // 开始时间小于等于当天9点,结束时间小于等于当天9点 只是夜间 if (calendar_as.compareTo(calendar_9) <= 0 && calendar_e.compareTo(calendar_9) <= 0) { isNightOver = true; // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 总价格 double sumMoney = minMoney; // 如果总价格大于夜间特惠价格 if (sumMoney > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } // 开始时间小于等于当天9点,结束时间小于等于隔天9点且大于当天9点 if (calendar_as.compareTo(calendar_9) <= 0 && calendar_e.compareTo(calendar_Add1_9) <= 0 && calendar_e.compareTo(calendar_9) > 0) { // 总价格 double sumMoney9 = (double) 0; double sumMoney18 = (double) 0; double sumMoneyAdd9 = (double) 0; // 开始时间到9点的时间(夜) Long mdiff = calendar_9.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 9点之前的总价格 sumMoney9 = minMoney9; // 如果总价格大于夜间特惠,夜间特惠 if (sumMoney9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } // 9点到结束时间的时间(小于18点到结束时间) double minMoney9E = (double) 0; if (calendar_e.compareTo(calendar_18) < 0)// 小于18点,结束时间 { // 时间 mdiff = calendar_e.getTimeInMillis() - calendar_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoney9E = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else {// 大于18点 // 时间 mdiff = calendar_18.getTimeInMillis() - calendar_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoney9E = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } // 9点-18点(结束时间)的总价格 sumMoney18 = minMoney9E; if (sumMoney18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } // 18点到第二天9点的时间价格 double minMoney18E = (double) 0; if (calendar_e.compareTo(calendar_18) > 0) { // 时间 mdiff = calendar_e.getTimeInMillis() - calendar_18.getTimeInMillis(); min = mdiff / (1000 * 60); minMoney18E = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoneyAdd9 = minMoney18E; if (sumMoneyAdd9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } if ((cvp.getFulldaymoney() * cvp.getFulldaydiscount()) < (sumMoney9 + sumMoney18 + sumMoneyAdd9)) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { // 开始时间到9点 if (sumMoney9 == (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()) + ")", sumMoney9, calendar_as.getTimeInMillis(), calendar_9.getTimeInMillis(), 0, (double) 0)); } else { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()), minMoney9, calendar_as.getTimeInMillis(), calendar_9.getTimeInMillis(), 0, (double) 0)); } // 9点到18点 if (calendar_e.compareTo(calendar_18) <= 0)// 小于18点,结束时间 { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoney18, calendar_9.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { // 大于18点,到18点 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()), sumMoney18, calendar_9.getTimeInMillis(), calendar_18.getTimeInMillis(), 0, (double) 0)); } // 18点到结束 if (calendar_e.compareTo(calendar_18) > 0) { // 18点到结束 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney18E, calendar_18.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } } // 开始时间大于等于当天9点,结束时间小于等于当天18点 if (calendar_as.compareTo(calendar_9) > 0 && calendar_e.compareTo(calendar_18) <= 0) { // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 总价格 double sumMoney = minMoney; // 如果总价格大于整日租价格 if (sumMoney > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } // 开始时间大于等于当天9点,结束时间大于等于隔天9点,小于隔天18点 if (calendar_as.compareTo(calendar_9) > 0 && calendar_as.compareTo(calendar_18) < 0 && calendar_e.compareTo(calendar_18) > 0 && calendar_e.compareTo(calendar_Add1_18) < 0) { // 总价格 double sumMoney18 = (double) 0; double sumMoneyAdd9 = (double) 0; double sumMoneyAdd18 = (double) 0; // 开始时间至当天18点 double minMoney18 = (double) 0; // 当天18点至隔天9点 double minMoneyAdd9 = (double) 0; // 隔天9点至结束时间 double minMoneyAdd18 = (double) 0; // 开始时间至当天18点 if (calendar_e.compareTo(calendar_18) <= 0)// 小于当天18点,到结束时间(白) { // 开始时间到18点的时间(白) Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoney18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else {// 大于当天18点,到18点 Long mdiff = calendar_18.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoney18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoney18 = minMoney18; if (sumMoney18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoney18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } // 当天18点至隔天9点 if (calendar_e.compareTo(calendar_18) > 0)// 大于18点 { if (calendar_e.compareTo(calendar_Add1_9) <= 0)// 小于隔天9点,结束时间 { // 18点到结束时间时间(夜) Long mdiff = calendar_e.getTimeInMillis() - calendar_18.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else// 大于隔天9点,隔天9点 { // 18点到隔天9点时间(夜) Long mdiff = calendar_Add1_9.getTimeInMillis() - calendar_18.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoneyAdd9 = minMoneyAdd9; if (sumMoneyAdd9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } } // 隔天9点至结束时间 if (calendar_e.compareTo(calendar_Add1_9) > 0) { // 隔天9点至结束(白) Long mdiff = calendar_e.getTimeInMillis() - calendar_Add1_9.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); sumMoneyAdd18 = minMoneyAdd18; if (sumMoneyAdd18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoneyAdd18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } } // 列出详细 if ((sumMoney18 + sumMoneyAdd9 + sumMoneyAdd18) > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else if ((sumMoney18 + sumMoneyAdd9) > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { if (calendar_e.compareTo(calendar_18) <= 0)// 小于当天18点,到结束时间(白) { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoney18, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 大于当天18点,到18点 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()), sumMoney18, calendar_as.getTimeInMillis(), calendar_18.getTimeInMillis(), 0, (double) 0)); } // 当天18点至隔天9点 if (calendar_e.compareTo(calendar_Add1_9) <= 0)// 大于隔天9点,到结束 { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAdd9, calendar_18.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 大于隔天9点,隔天9点 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()), sumMoneyAdd9, calendar_18.getTimeInMillis(), calendar_Add1_9.getTimeInMillis(), 0, (double) 0)); } // 隔天9点至结束时间 if (calendar_e.compareTo(calendar_Add1_9) > 0) { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAdd18, calendar_Add1_9.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } } // 开始时间大约18点,结束时间小于等于隔天9点 if (calendar_as.compareTo(calendar_18) >= 0 && calendar_e.compareTo(calendar_Add1_9) <= 0) { isNightOver = true; // 时间价格 Long mdiff = calendar_e.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); double minMoney = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); // 总价格 double sumMoney = minMoney; // 如果总价格大于夜间特惠价格 if (sumMoney > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoney = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", sumMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 否则显示分时记价 // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), minMoney, calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } // 开始时间大约18点,结束时间大约隔天9点 if (calendar_as.compareTo(calendar_18) >= 0 && calendar_e.compareTo(calendar_Add1_9) > 0) { // 总价格 double sumMoneyAdd9 = (double) 0; double sumMoneyAdd18 = (double) 0; double sumMoneyAddE = (double) 0; // 开始时间至隔天9点 double minMoneyAdd9 = (double) 0; // 隔天9点至隔天18点 double minMoneyAdd18 = (double) 0; // 隔天18点至结束时间 double minMoneyAddE = (double) 0; // 开始时间至隔天9点 // 开始时间到隔天9点的时间(夜) Long mdiff = calendar_Add1_9.getTimeInMillis() - calendar_as.getTimeInMillis(); long min = mdiff / (1000 * 60); minMoneyAdd9 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); sumMoneyAdd9 = minMoneyAdd9; if (sumMoneyAdd9 > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } // 隔天9点至隔天18点(白) if (calendar_e.compareTo(calendar_Add1_18) <= 0)// 小于等于18点,到结束时间 { // 开始时间到隔天9点的时间(夜) // mdiff = calendar_Add1_18.getTimeInMillis() - // calendar_e.getTimeInMillis(); mdiff = calendar_e.getTimeInMillis() - calendar_Add1_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoneyAdd18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } else { // 大于隔天18点,到隔天18点 // 开始时间到隔天9点的时间(夜) mdiff = calendar_Add1_18.getTimeInMillis() - calendar_Add1_9.getTimeInMillis(); min = mdiff / (1000 * 60); minMoneyAdd18 = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); } sumMoneyAdd18 = minMoneyAdd18; if (sumMoneyAdd18 > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { sumMoneyAdd18 = (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()); } // 隔天18点至结束时间 if (calendar_e.compareTo(calendar_Add1_18) > 0) { // 开始时间到隔天9点的时间(夜) mdiff = calendar_e.getTimeInMillis() - calendar_Add1_18.getTimeInMillis(); min = mdiff / (1000 * 60); minMoneyAddE = (double) (cvp.getMinutemoney() * cvp.getMinutediscount() * min); sumMoneyAddE = minMoneyAddE; if (sumMoneyAddE > (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAddE = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); } } if ((sumMoneyAdd9 + sumMoneyAdd18 + sumMoneyAddE) > (cvp.getFulldaymoney() * cvp.getFulldaydiscount())) { list.add(CreatePriceLog( "整日租(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()) + ")", (double) (cvp.getFulldaymoney() * cvp.getFulldaydiscount()), calendar_as.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else {// 分段详细 // 开始时间至隔天9点 if (sumMoneyAdd9 >= (cvp.getNightmoney() * cvp.getNightdiscount())) { sumMoneyAdd9 = (double) (cvp.getNightmoney() * cvp.getNightdiscount()); list.add(CreatePriceLog( "夜间特惠(" + UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + ")", sumMoneyAdd9, calendar_as.getTimeInMillis(), calendar_Add1_9.getTimeInMillis(), 0, (double) 0)); } else { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_as.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()), sumMoneyAdd9, calendar_as.getTimeInMillis(), calendar_Add1_9.getTimeInMillis(), 0, (double) 0)); } // 隔天9点至隔天18点(白) if (calendar_e.compareTo(calendar_Add1_18) <= 0)// 小于等于18点,到结束时间 { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAdd18, calendar_Add1_9.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } else { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_9.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_Add1_18.getTimeInMillis()), sumMoneyAdd18, calendar_Add1_9.getTimeInMillis(), calendar_Add1_18.getTimeInMillis(), 0, (double) 0)); } if (calendar_e.compareTo(calendar_Add1_18) > 0) { // 时间 list.add(CreatePriceLog( UtilTimeFormatter.getDatemdhm(calendar_Add1_18.getTimeInMillis()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_e.getTimeInMillis()), sumMoneyAddE, calendar_Add1_18.getTimeInMillis(), calendar_e.getTimeInMillis(), 0, (double) 0)); } } } } } // 计算里程 int milage = GetMilage(oDetail.getSn(), allStartDate.getTime(), allEndDate.getTime()); PriceLog log = new PriceLog(); log.setTypeText(milage + "公里"); BigDecimal b2 = new BigDecimal(milage * cvp.getMileagemoney() * cvp.getMileagediscount()); double f2 = b2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); log.setPrice(f2); log.setStartDate(allStartDate.getTime()); log.setEndDate(allEndDate.getTime()); log.setMilage((long) milage); log.setType(1); list.add(log); Date cstartDate = new Date(oDetail.getChargingstartdate().getTime() -(1000*60*60)); long nm = 1000*60; //一分钟的毫秒数 long diff2 = new Date().getTime() - cstartDate.getTime(); long min = diff2/nm; //计算差多少分钟 // 计费时间大于1分钟再计算保险费。 lidongchun@bagechuxing.cn if(min>1){ // 记录保险消费 if (days == 0) { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney(), (long) 0, (long) 0, 4, (double) 0)); } } } else { if (dDays > days) { if (dDays - days >= 0.021) { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * (days + 1), (long) 0, (long) 0, 4, (double) 0)); } } } else { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * (days), (long) 0, (long) 0, 4, (double) 0)); } } } } else { for (OrderInsurance oi : orderInsuranceList) { if (oi != null) { list.add(CreatePriceLog(oi.getInsurancename(), (double) oi.getInsurancemoney() * days, (long) 0, (long) 0, 4, (double) 0)); } } } } } // Double dMoney = ControlService.getStopVehicleMoney(Integer.valueOf(orderId)); // if(dMoney > 0){ // PriceLog logStop = new PriceLog(); // logStop.setTypeText("停车费减免"); // logStop.setPrice(-dMoney); // logStop.setType(4); // list.add(logStop); // } // 计算还车服务费 if(parkId!=null && branchId!=null){ PriceLog logStop = new PriceLog(); returnStopMoney = ControlService.getReturnStopVehicleMoney(parkId, branchId); if(returnStopMoney>0){ logStop.setTypeText("还车服务费"); logStop.setPrice(returnStopMoney); logStop.setType(4); list.add(logStop); } } if (isStopMoney) { // 判断只有用户点击了开锁后,才免除区域停车费 if (oDetail.getIsFirstUnLock() == 1 && oDetail.getLastReturnVehicleDate() != null) { // 计算合计前取是否有小区停车费用 double bigFreeMoney = 0; // 定义免费停车的时间 double FreePrice = 0; // 设置的单价 long FreeTime = 0; // 设置的时间 long MustTime = 0; // 至少行驶时间 int MustMileage = 0; // 至少行驶里程 String parkFeeAmount=""; // 停车费封顶 // 判断车辆是停在车场还是网点,取不同的数据 if (!StringUtils.isBlank(oDetail.getRentbranchid())) { // 网点 Branch branch = this.branchMapper.selectByPrimaryKey(Integer.valueOf(oDetail.getRentbranchid())); // 获取设置的价格和时间 if (branch != null) { int mode = branch.getParkingmode(); if(mode==2){ //if (branch.getParkingFeeMax()!=null){ // parkFeeAmount = branch.getParkingFeeMax().toString(); //} //else //{ parkFeeAmount = "0"; //} } else { // 最少行驶时间 if (branch.getMinimumtime() != null) { MustTime = branch.getMinimumtime(); } if (branch.getMinimummileage() != null) { MustMileage = branch.getMinimummileage(); } if (branch.getBillingunitprice() != null) { FreePrice = Double.valueOf(branch.getBillingunitprice().toString()); } if (branch.getDelaytime() != null) { FreeTime = branch.getDelaytime(); } if (branch.getParkingFeeMax()!=null){ parkFeeAmount = branch.getParkingFeeMax().toString(); } } } } else { // 车场 Parkinglot parkinglot = this.parkinglotMapper.selectByPrimaryKey(oDetail.getRentparkid()); if (parkinglot != null) { int mode = parkinglot.getParkingmode(); //按次收费 if(mode==2){ //if (parkinglot.getParkingFeeMax()!=null){ // parkFeeAmount = parkinglot.getParkingFeeMax().toString(); //} //else //{ parkFeeAmount = "0"; //} } else { if (parkinglot.getMinimumtime() != null) { MustTime = parkinglot.getMinimumtime(); } if (parkinglot.getMinimummileage() != null) { MustMileage = parkinglot.getMinimummileage(); } // 获取设置的价格和时间 if (parkinglot.getBillingunitprice() != null) { FreePrice = Double.valueOf(parkinglot.getBillingunitprice().toString()); } if (parkinglot.getDelaytime() != null) { FreeTime = parkinglot.getDelaytime(); } if (parkinglot.getParkingFeeMax()!=null){ parkFeeAmount = parkinglot.getParkingFeeMax().toString(); } } } } // 分钟 long ordertime = diff / (1000 * 60); // 判断分钟数和里程数都达到要求才可以减免停车费 if (ordertime >= MustTime && milage >= MustMileage) { // 计算时间 long minute = UtilTimeFormatter.minutes(oDetail.getChargingstartdate(), oDetail.getLastReturnVehicleDate(), FreeTime); // 计算有多少个半小时 long halfHour = minute / 30; // 如果剩余分钟还有按半小时算 if ((minute - halfHour * 30) > 0) { halfHour = halfHour + 1; } // 免费的钱 bigFreeMoney = halfHour * FreePrice; if (bigFreeMoney > 0) { if(StringUtils.isNotEmpty(parkFeeAmount)){ if(bigFreeMoney>Double.parseDouble(parkFeeAmount)){//如果免费钱大于停车费封顶 取封顶值 bigFreeMoney = Double.parseDouble(parkFeeAmount); } } Calendar calendar_return = Calendar.getInstance(); calendar_return.setTime(oDetail.getChargingstartdate()); calendar_return.add(Calendar.MINUTE, (int) FreeTime); if(bigFreeMoney>0){ // 如果是个人单计算减免 if (pauseTime == 1) { list.add(CreatePriceLog( "减免停车费(" + UtilTimeFormatter .getDatemdhm(oDetail.getLastReturnVehicleDate().getTime()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_return.getTimeInMillis()) + ")", (Double) bigFreeMoney * -1, (long) oDetail.getLastReturnVehicleDate().getTime(), (long) oDetail.getChargingstartdate().getTime(), 3, (double) 0)); } // 如果是企业单 if (pauseTime == 2) { try { PriceLog priceLog = CreatePriceLog("减免停车费(" + UtilTimeFormatter.getDatemdhm(oDetail.getLastReturnVehicleDate().getTime()) + "~" + UtilTimeFormatter.getDatemdhm(calendar_return.getTimeInMillis()) + ")", (Double) bigFreeMoney * -1, (long) oDetail.getLastReturnVehicleDate().getTime(), (long) oDetail.getChargingstartdate().getTime(), 3, (double) 0); //新逻辑,企业停车费减免费用要参与计算 list.add(priceLog); CompanyCost companyCost = new CompanyCost(); companyCost.setOrderid(orderId); companyCost.setMileage(priceLog.getMilage()); companyCost.setMoney(new BigDecimal(priceLog.getPrice())); companyCost.setTypetext(priceLog.getTypeText()); companyCost.setCosttype( priceLog.getCostType() == null ? 0 : priceLog.getCostType().intValue()); this.companyCostMapper.insertSelective(companyCost); } catch (Exception ex) { logger.error(ex.getMessage()); } } } } } } } Double sumMoneyAll = (double) 0; double sumCostAll = (double) 0; double stopMoney = (double)0; // 计算合计,停车费减免单独提出来 for (PriceLog oi : list) { if (oi.getType().intValue() != 3) { BigDecimal b = new BigDecimal(oi.getPrice()); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); sumCostAll += f1; sumMoneyAll += f1; } else{ BigDecimal b = new BigDecimal(oi.getPrice()); stopMoney = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } } //符合计算夜间特惠价格,判断最后的总价是否大于夜间特惠的价格 if(isNightSale && isNightOver){ if(sumMoneyAll > cvp.getNightsalemoney().doubleValue()){ sumMoneyAll = cvp.getNightsalemoney().doubleValue(); } } //计算完所有的合计之后,再减去停车费减免的金额 sumMoneyAll += stopMoney; if (pauseTime == 2) { if(sumMoneyAll < 0){ sumMoneyAll = 0.0; } } list.add(CreatePriceLog("合计", (Double) sumMoneyAll, (long) 0, (long) 0, 2, sumCostAll)); return list; } }