Example #1
0
        /// <summary>
        /// 是否是无效配送时间点
        /// </summary>
        /// <param name="so">订单</param>
        /// <param name="timestring">时间区域字符串的集合</param>
        /// <param name="holidays">所有假期,如果传值为null,将在程序中重新读取</param>
        /// <returns>无效返回真,否则返回假</returns>
        internal static bool IsInValidDeliveryTime(SOInfo so, string timestring, List <Holiday> holidays, bool isForceAudit)
        {
            bool isInvalid = false;

            //强制审核不用效验
            if (isForceAudit)
            {
                return(isInvalid);
            }

            //未有配送时间无需判断
            if (!so.ShippingInfo.DeliveryDate.HasValue)
            {
                return(isInvalid);
            }

            //订单类型团购不用判断
            if (so.BaseInfo.SOType == SOType.GroupBuy)
            {
                return(isInvalid);
            }

            //配送信息
            var shipType = ExternalDomainBroker.GetShippingTypeBySysNo(so.ShippingInfo.ShipTypeSysNo.Value);

            //配送类型是0,3的不检查
            //只检查1和2
            if (shipType.DeliveryType != ShipDeliveryType.OneDayOnce &&
                shipType.DeliveryType != ShipDeliveryType.OneDayTwice)
            {
                return(isInvalid);
            }

            //节假日
            List <Holiday> shipHolidays = null;

            if (holidays == null)
            {
                shipHolidays = ExternalDomainBroker.GetHolidayAfterToday(so.CompanyCode)
                               .FindAll(x => x.ShipTypeSysNo == shipType.SysNo || !x.ShipTypeSysNo.HasValue);
            }
            else
            {
                shipHolidays = holidays.FindAll(x => x.ShipTypeSysNo == shipType.SysNo || !x.ShipTypeSysNo.HasValue);
            }
            //时间节点
            List <TimeSpan> timepoints = null;

            if (string.IsNullOrEmpty(timestring))
            {
                timepoints = GetDeliveryTimePointBySO(so);
            }
            else
            {
                timepoints = ParseTimeSpot(timestring);
            }

            if (timepoints.Count == 0)
            {
                return(isInvalid);
            }

            //计算器
            DeliveryIteration calculator = new DeliveryIteration(DateTime.Now, (int)shipType.DeliveryType, shipHolidays, timepoints, shipType.IntervalDays ?? 0, null);

            calculator.Roll();

            DateTime latestDate   = calculator.LatestDate;
            int      finalSection = calculator.FinalSection;

            //比较
            if (so.ShippingInfo.DeliveryDate < latestDate)
            {
                isInvalid = true;
            }
            else if (so.ShippingInfo.DeliveryDate == latestDate)
            {
                if (so.ShippingInfo.DeliveryTimeRange < finalSection)
                {
                    isInvalid = true;
                }
            }

            return(isInvalid);
        }