public static DateTime?Project(this DateTime?dt, SubtotalLevel level)
 {
     if (!dt.HasValue)
     {
         return(null);
     }
     if (!level.HasFlag(SubtotalLevel.Day))
     {
         return(null);
     }
     if (!level.HasFlag(SubtotalLevel.Week))
     {
         return(dt);
     }
     if (level.HasFlag(SubtotalLevel.Year))
     {
         return(new(dt !.Value.Year, 1, 1));
     }
     if (level.HasFlag(SubtotalLevel.Month))
     {
         return(new(dt !.Value.Year, dt !.Value.Month, 1));
     }
     // if (level.HasFlag(SubtotalLevel.Week))
     return(dt.Value.DayOfWeek switch
     {
         DayOfWeek.Monday => dt.Value.AddDays(-0),
         DayOfWeek.Tuesday => dt.Value.AddDays(-1),
         DayOfWeek.Wednesday => dt.Value.AddDays(-2),
         DayOfWeek.Thursday => dt.Value.AddDays(-3),
         DayOfWeek.Friday => dt.Value.AddDays(-4),
         DayOfWeek.Saturday => dt.Value.AddDays(-5),
         DayOfWeek.Sunday => dt.Value.AddDays(-6),
         _ => throw new ArgumentOutOfRangeException(),
     });
Exemplo n.º 2
0
        private void BuildChildren(SubtotalResult sub, IEnumerable <Balance> raw, SubtotalLevel level)
        {
            List <ISubtotalResult> Invoke <T>(SubtotalResultFactory <T> f) =>
            raw.GroupBy(f.Selector).Select(g => Build(f.Create(g), g)).Where(g => g != null).ToList();

            switch (level)
            {
            case SubtotalLevel.Title:
                sub.TheItems = Invoke(new SubtotalTitleFactory());
                break;

            case SubtotalLevel.SubTitle:
                sub.TheItems = Invoke(new SubtotalSubTitleFactory());
                break;

            case SubtotalLevel.Content:
                sub.TheItems = Invoke(new SubtotalContentFactory());
                break;

            case SubtotalLevel.Remark:
                sub.TheItems = Invoke(new SubtotalRemarkFactory());
                break;

            case SubtotalLevel.User:
                sub.TheItems = Invoke(new SubtotalUserFactory());
                break;

            case SubtotalLevel.Currency:
                sub.TheItems = Invoke(new SubtotalCurrencyFactory());
                break;

            case SubtotalLevel.Day:
            case SubtotalLevel.Week:
            case SubtotalLevel.Month:
            case SubtotalLevel.Year:
                sub.TheItems = Invoke(new SubtotalDateFactory(level));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        private void BuildChildren(SubtotalResult sub, IEnumerable <Balance> raw, SubtotalLevel level)
        {
            List <ISubtotalResult> Invoke <T>(SubtotalResultFactory <T> f) =>
            raw.GroupBy(f.Selector).Select(g => Build(f.Create(g), g)).Where(g => g != null).ToList();

            m_Flags      = level & SubtotalLevel.Flags;
            sub.TheItems = (level & SubtotalLevel.Subtotal) switch
            {
                SubtotalLevel.Title => Invoke(new SubtotalTitleFactory()),
                SubtotalLevel.SubTitle => Invoke(new SubtotalSubTitleFactory()),
                SubtotalLevel.Content => Invoke(new SubtotalContentFactory()),
                SubtotalLevel.Remark => Invoke(new SubtotalRemarkFactory()),
                SubtotalLevel.User => Invoke(new SubtotalUserFactory()),
                SubtotalLevel.Currency => Invoke(new SubtotalCurrencyFactory()),
                SubtotalLevel.Day => Invoke(new SubtotalDateFactory(level)),
                SubtotalLevel.Week => Invoke(new SubtotalDateFactory(level)),
                SubtotalLevel.Month => Invoke(new SubtotalDateFactory(level)),
                SubtotalLevel.Year => Invoke(new SubtotalDateFactory(level)),
                _ => throw new ArgumentOutOfRangeException(),
            };
        }
        /// <summary>
        ///     格式化日期
        /// </summary>
        /// <param name="value">日期</param>
        /// <param name="level">分类层次</param>
        /// <returns>格式化后的日期</returns>
        public static string AsDate(this DateTime?value, SubtotalLevel level)
        {
            if (!value.HasValue)
            {
                return("[null]");
            }

            switch (level)
            {
            case SubtotalLevel.None:
            case SubtotalLevel.Day:
            case SubtotalLevel.Week:
                return(value.AsDate());

            case SubtotalLevel.Month:
                return($"{value.Value.Year:D4}{value.Value.Month:D2}");

            case SubtotalLevel.Year:
                return($"{value.Value.Year:D4}");

            default:
                throw new ArgumentException("分类层次并非基于日期", nameof(level));
            }
        }
Exemplo n.º 5
0
 public SubtotalDateFactory(SubtotalLevel level) => m_Level = level;
Exemplo n.º 6
0
 public SubtotalDate(DateTime?date, SubtotalLevel level)
 {
     Date  = date;
     Level = level;
 }
 /// <summary>
 ///     建造分类汇总结果
 /// </summary>
 /// <param name="raw">原始数据</param>
 /// <returns>分类汇总结果</returns>
 public ISubtotalResult Build(IEnumerable <Balance> raw)
 {
     m_Depth = 0;
     m_Flags = SubtotalLevel.None;
     return(Build(new SubtotalRoot(), raw));
 }
Exemplo n.º 8
0
 /// <summary>
 ///     建造分类汇总结果
 /// </summary>
 /// <param name="raw">原始数据</param>
 /// <returns>分类汇总结果</returns>
 public ValueTask <ISubtotalResult> Build(IAsyncEnumerable <Balance> raw)
 {
     m_Depth = 0;
     m_Flags = SubtotalLevel.None;
     return(Build(new SubtotalRoot(), raw));
 }
Exemplo n.º 9
0
 /// <summary>
 ///     格式化日期
 /// </summary>
 /// <param name="value">日期</param>
 /// <param name="level">分类层次</param>
 /// <returns>格式化后的日期</returns>
 public static string AsDate(this DateTime?value, SubtotalLevel level)
 => !value.HasValue
         ? "[null]"
         : (level & SubtotalLevel.Subtotal) switch
 {