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(), });
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)); } }
public SubtotalDateFactory(SubtotalLevel level) => m_Level = level;
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)); }
/// <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)); }
/// <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 {