/// <summary>
/// 场馆计费
/// </summary>
/// <returns></returns>
private VenueTimeMoney NewCalculateVenueTimingAmount(OrderVenueDetail detail, VenueTimeRuleInfoDto timeRule)
{
VenueTimeMoney timeMoney = new VenueTimeMoney();
if (detail.EndTime > detail.StartTime)
{
DateTime ST = DateTime.Parse(detail.StartTime.ToString().NumberToDate());
DateTime ET = DateTime.Parse(detail.EndTime.ToString().NumberToDate());
TimeSpan ts = ET.Subtract(ST);
if (timeRule.StartMinutes > 0)
{
if (ts.TotalMinutes <= timeRule.StartMinutes + 1)
{
return timeMoney;
}
}
if (ST.ToShortValue() == ET.ToShortValue() || timeRule.SpecialTime == null || timeRule.SpecialTime.Count < 1)
{
timeMoney = NewCalculateCurrentDayVenueTimingAmount(timeRule, ST, ET);
}
else
{
timeMoney.VenueTimeList = new List<OrderVenueTime>();
DateTime _ST = ST;
DateTime _ET = ET;
while (_ST.ToShortValue() <= _ET.ToShortValue())
{
DateTime time_start, time_end;
if (_ST.ToShortValue() == ST.ToShortValue())
{
//第一天
time_start = ST;
time_end = DateTime.Parse(_ST.AddDays(1).ToString("yyyy-MM-dd 00:00:00"));
}
else if (_ST.ToShortValue() == ET.ToShortValue())
{
//最后一天
time_start = DateTime.Parse(_ST.ToString("yyyy-MM-dd 00:00:00"));
time_end = ET;
}
else
{
//中间的一整天
time_start = DateTime.Parse(_ST.ToString("yyyy-MM-dd 00:00:00"));
time_end = DateTime.Parse(_ST.AddDays(1).ToString("yyyy-MM-dd 00:00:00"));
}
var totalMoney = NewCalculateCurrentDayVenueTimingAmount(timeRule, time_start, time_end);
timeMoney.TotalMoney += totalMoney.TotalMoney;
timeMoney.DiscountMoney += totalMoney.DiscountMoney;
_ST = _ST.AddDays(1);
timeMoney.VenueTimeList.AddRange(totalMoney.VenueTimeList);
}
}
if (timeMoney.VenueTimeList != null && timeMoney.VenueTimeList.Count > 0)
{
foreach (var item in timeMoney.VenueTimeList)
{
item.LimitMaxAmount = timeRule.LimitMaxAmount;
item.LimitMinAmount = timeRule.LimitMinAmount;
item.LimitMaxMemberAmount = timeRule.LimitMaxMemberAmount;
item.LimitMinMemberAmount = timeRule.LimitMinMemberAmount;
}
}
}
return timeMoney;
}
/// <summary>
/// 计算一天的费用
/// </summary>
/// <param name="timeRule"></param>
/// <param name="member"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
private VenueTimeMoney NewCalculateCurrentDayVenueTimingAmount(VenueTimeRuleInfoDto timeRule, DateTime startTime, DateTime endTime)
{
VenueTimeMoney timeMoney = new VenueTimeMoney();
List<SpecialTimeDto> specialTimes = NewGetSpecialTimeList(timeRule, startTime);
timeMoney.VenueTimeList = new List<OrderVenueTime>();
foreach (var item in specialTimes)
{
DateTime _ST = DateTime.Parse(startTime.ToString("yyyy-MM-dd") + " " + item.StartTime);
DateTime _ET;
if (item.End == 2400)
{
_ET = DateTime.Parse(startTime.AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
}
else
_ET = DateTime.Parse(startTime.ToString("yyyy-MM-dd") + " " + item.EndTime);
if (_ST >= endTime || _ET <= startTime)
continue;
if (_ST < startTime)
{
_ST = startTime;
}
if (_ET > endTime)
{
_ET = endTime;
}
if (!timeRule.SpecialTime.Any())
{
_ET = endTime;
}
TimeSpan specialTimeSpan = _ET.Subtract(_ST);
if (specialTimeSpan.TotalMinutes < timeRule.StartMinutes)
{
timeMoney.TotalMoney += 0;
timeMoney.DiscountMoney += 0;
}
else
{
if (timeRule.MinCalculateMinutes > 0)
{//最小计费时长 > 0
int limitSecond = timeRule.MinCalculateMinutes * 60;//最小计费秒
double remainderSecond = specialTimeSpan.TotalSeconds % limitSecond;
if (remainderSecond > 0)
{
DateTime End = _ET.AddSeconds(limitSecond - remainderSecond);
specialTimeSpan = End.Subtract(_ST);
}
}
timeMoney.TotalMoney += item.Price * decimal.Parse(specialTimeSpan.TotalHours.ToString());
timeMoney.DiscountMoney += item.Specials * decimal.Parse(specialTimeSpan.TotalHours.ToString());
}
OrderVenueTime ovt = new OrderVenueTime();
ovt.StartTime = _ST.ToLongValue();
ovt.EndTime = _ET.ToLongValue();
ovt.Price = item.Price;
ovt.Specials = item.Specials;
ovt.TotalPrice = item.Price * decimal.Parse(specialTimeSpan.TotalHours.ToString());
ovt.TotalSpecials = item.Specials * decimal.Parse(specialTimeSpan.TotalHours.ToString());
timeMoney.VenueTimeList.Add(ovt);
}
return timeMoney;
}
/// <summary>
/// 补全特殊时段
/// </summary>
/// <param name="timeRule"></param>
/// <returns></returns>
private List<SpecialTimeDto> NewGetSpecialTimeList(VenueTimeRuleInfoDto timeRule, DateTime dateTime)
{
List<SpecialTimeDto> list = new List<SpecialTimeDto>();
if (!timeRule.SpecialTime.Any())
{//没有设置特殊时段,直接00:00-24:00用普通的计费
list.Add(new SpecialTimeDto()
{
Id = 0,
Type = 2,
Weeks = "0、1、2、3、4、5、6",
Solt = "周日、周一、周二、周三、周四、周五、周六",
StartTime = "00:00",
EndTime = "24:00",
Price = timeRule.Price,
Specials = timeRule.Specials
});
}
else
{//有特殊规则
var temp = timeRule.SpecialTime.OrderBy(m => m.StartTime).ToList();//拿到所有的特殊规则
List<SpecialTimeDto> timeArea = new List<SpecialTimeDto>();
foreach (var item in temp)
{
if (item.Type == 0 && string.IsNullOrEmpty(item.Weeks))
{
timeArea.Add(new SpecialTimeDto()
{
Id = 0,
Type = 2,
Weeks = "0、1、2、3、4、5、6",
Solt = "周日、周一、周二、周三、周四、周五、周六",
StartTime = item.StartTime,
EndTime = item.EndTime,
Price = item.Price,
Specials = item.Specials
});
}
else
{
if (item.Type == 0)
{//再取 周 今天在特殊规则中
if (item.Weeks.Contains(((int)dateTime.DayOfWeek).ToString()))
{
timeArea.Add(item);
}
}
else if (item.Type == 1)
{//最后取 年
string[] solt = item.Solt.Split('至');
long oldStartTime = Convert.ToDateTime(solt[0]).ToShortValue();
long oldEndTime = Convert.ToDateTime(solt[1]).ToShortValue();
long nowStartTime = dateTime.ToShortValue();
if (oldStartTime <= nowStartTime && nowStartTime <= oldEndTime)
{
timeArea.Add(item);
}
}
}
}
if (timeArea == null || timeArea.Count == 0)
{
timeArea.Add(new SpecialTimeDto()
{
Id = 0,
Type = 2,
Weeks = "0、1、2、3、4、5、6",
Solt = "周日、周一、周二、周三、周四、周五、周六",
StartTime = "00:00",
EndTime = "24:00",
Price = timeRule.Price,
Specials = timeRule.Specials
});
}
List<SpecialTimeDto> timeArea1 = timeArea.OrderBy(x => x.StartTime).ThenByDescending(x => x.Type).ToList();
int len = timeArea1.Count;
for (int i = 0; i < len - 1; i++)
{
if (timeArea1[i].EndTime.HHMMToInt() >= timeArea1[i + 1].StartTime.HHMMToInt())
{//本次结束时间 >= 下次开始时间
if (timeArea1[i].Type != timeArea1[i + 1].Type)//同一类型的不出现重叠
{
if (timeArea1[i].Type == 1)
{
timeArea1[i + 1].StartTime = timeArea1[i].EndTime;//本次的结束时间给下次的开始
if (timeArea1[i + 1].StartTime.HHMMToInt() > timeArea1[i + 1].EndTime.HHMMToInt())
{//若下次的开始时间 > 下次的结束时间
timeArea1[i + 1].EndTime = timeArea1[i + 1].StartTime;//下次的结束时间=下次的开始时间
}
}
else
{
timeArea1[i].EndTime = timeArea1[i + 1].StartTime;//下次的开始时间给本次的结束时间
if (timeArea1[i].StartTime.HHMMToInt() > timeArea1[i].EndTime.HHMMToInt())
{
timeArea1[i].EndTime = timeArea1[i].StartTime;
}
}
}
}
}
string start = "00:00";
foreach (var item in timeArea1)
{
if (item.Start == start.HHMMToInt())
{
list.Add(item);
start = item.EndTime;
}
else if (item.Start > start.HHMMToInt())
{
list.Add(new SpecialTimeDto()
{
StartTime = start,
EndTime = item.StartTime,
Price = timeRule.Price,
Specials = timeRule.Specials
});
list.Add(item);
start = item.EndTime;
}
}
if (start.HHMMToInt() < 2400)
{
list.Add(new SpecialTimeDto()
{
Type = 0,
StartTime = start,
EndTime = "24:00",
Price = timeRule.Price,
Specials = timeRule.Specials
});
}
}
return list;
}