【第三十四篇】根据特殊的计时规则,取一天的时间段

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值