Подтвердить что ты не робот

Ежечасный, Ежедневный, Ежемесячный Помощник + Модельные методы

У меня есть веб-портал, анализирующий API, на веб-URL, где он проходит через JSON.

Эти данные настраиваются с использованием диаграмм, и в настоящее время мы используем flot.js

Код для hourlyData уже существует и подключается к диаграмме json.

Я пытаюсь воссоздать это для Ежемесячно и Ежегодно.

Текущий код для hourlyData выглядит следующим образом:

  List<dynamic> hourlyData = new List<dynamic>();
            DateTime hourIterator = StartDate.Value;
            while (hourIterator.Hour <= ddvm.CurrentHour)
            {
                if (ddvm.HourlyPaymentTotal != null && ddvm.HourlyPaymentTotal.Count() > 0 )
                {
                    HourlyPaymentTotalModel hour = ddvm.HourlyPaymentTotal.FirstOrDefault(hpt => hpt.DateTimeStamp == hourIterator);
                    if (hour == null) { hour = new HourlyPaymentTotalModel() { DateTimeStamp = hourIterator }; };
                    hourlyData.Add(new List<dynamic> {hourIterator.Hour,
                                                        hour.Amount, 
                                                        new { tooltip = String.Format("{0} : {1}", hour.Count, hour.Amount.ToString("C")) } });
                }
                hourIterator = hourIterator.AddHours(1);
            }

            ddvm.GraphData.LineChart_HourlyTotal.Add(new
            {
                data = hourlyData,
                color = "#A1345E",
                label = "Total Amount Paid"
            });

Как я могу воссоздать hourlyData в monthData и yeardData?

Изменить:

    public class HourlyPaymentTotalModel : ViewModelBase
    {
        public int Hour 
        {
            get { return DateTimeStamp.Hour; }
            set { DateTimeStamp  = new DateTime(1, 1, 1, value, 0, 0); } 
        }
        public string FormattedHour
        {
            get { return DateTimeStamp.ToShortTimeString().Replace(":00 ", ""); }
            set { DateTimeStamp = DateTime.Parse(value); }
        }
        public DateTime DateTimeStamp { get; set; }
        public decimal Amount { get; set; }
        public int Count { get; set; }
    }
}

Это из решения API:

public IQueryable<PaymentSummary> GetHourlyPaymentTotals(DateTime startDate, DateTime endDate, string PaymentProcessor = null, string merchantID=null)
        {
            transactionRepository = GetTransactionRepository(PaymentProcessor);
            IQueryable<IPayment> allPayments = transactionRepository.GetAllPayments(startDate, endDate, merchantID);
            var retVal = from ap in allPayments
                         group ap by new
                         {
                             PaymentDateYear = ap.PaymentDate.Value.Year,
                             PaymentDateMonth = ap.PaymentDate.Value.Month,
                             PaymentDateDay = ap.PaymentDate.Value.Day,
                             PaymentDateHour = ap.PaymentDate.Value.Hour
                         }
                             into grp_ap
                             select (new
                             {
                                 PaymentDateString = grp_ap.Key.PaymentDateMonth.ToString() + "/" + grp_ap.Key.PaymentDateDay.ToString() + "/" + grp_ap.Key.PaymentDateYear.ToString() + " " + grp_ap.Key.PaymentDateHour + ":00",
                                 Amount = grp_ap.Sum(grp => grp.Amount),
                                 Count = grp_ap.Count()
                             });
            return (IQueryable<PaymentSummary>)retVal.ToList().Select(p => new PaymentSummary()
            {
                PaymentDate = (DateTime?)DateTime.Parse(p.PaymentDateString),
                Amount = p.Amount,
                Count = p.Count
            }).ToList().AsQueryable();
        }

Обновление: я создал больше моделей на основе решения, предложенного Майрадж Ахмад. Это использует модель dailyData.

Я все еще не уверен, почему <canvas> показывает пробел в моих полях диаграммы. Вероятно, это ошибка с данными или параметрами flot.js, сделанными для указанных диаграмм.

var  area_chart_payment_by_day_options = {
        series: {
            lines: {
                show: true,
                fill: .5
            },
            points: { show: true }
        },
        grid: {
            borderWidth: 0,
            hoverable: true
        },
        tooltip: true,
        tooltipOpts: {
            content: "%x : $ %y"
        },
        xaxis: {
            //mode: "categories",
            tickDecimals: 0,
            min:1,
            max:31
        },
        yaxis: {
            tickFormatter: function (y) { return "$ " + y + " "; },
            tickDecimals:0
        }
    }

функция данных

 $(function () {
            var data = [];
            @Html.Raw("data = " + Json.Encode(Model.GraphData.LineChart_DailyTotal) + ";");   //TODO: LineChart_Daily
            $.plot($("#area_chart_payment_by_day"), area_chart_payment_by_day, 

функция обновления

$.plot($("#area_chart_payment_by_day"), area_chart_payment_by_day, area_chart_payment_by_day_options);
4b9b3361

Ответ 1

Вы можете создавать ежедневные, ежемесячные и годовые данные, используя ту же логику. Вам просто нужно заменить Час на День, Месяц или Год.

List<dynamic> dailyData = new List<dynamic>();
        DateTime dayIterator = StartDate.Value;
        while (dayIterator.Hour <= ddvm.CurrentDay)
        {
            if (ddvm.DailyPaymentTotal != null && ddvm.DailyPaymentTotal.Count() > 0 )
            {
                DailyPaymentTotalModel day = ddvm.DailyPaymentTotal.FirstOrDefault(hpt => hpt.DateTimeStamp == dayIterator);
                if (day == null) { hour = new DailyPaymentTotalModel() { DateTimeStamp = dayIterator }; };
                dailyData.Add(new List<dynamic> {dayIterator.Day,
                                                    day.Amount, 
                                                    new { tooltip = String.Format("{0} : {1}", day.Count, day.Amount.ToString("C")) } });
            }
            dayIterator = dayIterator.AddDays(1);
        }

        ddvm.GraphData.LineChart_DailyTotal.Add(new
        {
            data = dailyData,
            color = "#A1345E",
            label = "Total Amount Paid"
        });

И это будет ваш DailyModel.

public class DailyPaymentTotalModel : ViewModelBase
{
    public int Day 
    {
        get { return DateTimeStamp.Day; }
        set { DateTimeStamp  = new DateTime(1, 1, value, 0, 0, 0); } 
    }

    public DateTime DateTimeStamp { get; set; }
    public decimal Amount { get; set; }
    public int Count { get; set; }
}

}

И ваша логика выборки данных выглядит в этой функции, вам нужно внести изменения в нее, чтобы она работала с днем, месяцем, годом

transactionRepository.GetAllPayments(startDate, endDate, merchantID);