支付方法一周年活动时间算法

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

}

 

posted @ 2017-10-17 18:21  JLCUI  阅读(304)  评论(0编辑  收藏  举报