2015-04-30 17 views
31

Mam portal internetowy, parsujący API, do adresu URL strony internetowej, gdzie przechodzi przez JSON.Miesięczne, codzienne, miesięczne czynności pomocnicze + metody modelowania

Dane te są konfigurowane za pomocą wykresów i obecnie za pomocą flot.js

Kod dla hourlyData już tam jest i zostanie podłączony do wykresów JSON.

Próbuję odtworzyć to dla miesięcznego i rocznego.

Kod prądu hourlyData wygląda następująco:

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" 
      }); 

Jak mogę odtworzyć hourlyData do monthlyData i yearlyData?

Edit:

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

To z roztworu 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(); 
     } 

Aktualizacja: I stworzył kolejne modele oparte na rozwiązaniu Mairaj Ahmad proponowanej. Używa modelu dailyData.

Nadal nie jestem pewien, dlaczego <canvas> pokazuje puste pole pod polami mojego wykresu. Jest to prawdopodobnie błąd z danymi lub opcjami flot.js wykonanymi na określonych wykresach.

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

funkcja dane

$(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, 

funkcja aktualizacji

$.plot($("#area_chart_payment_by_day"), area_chart_payment_by_day, area_chart_payment_by_day_options); 
+2

można pokazać nam twoje modele? Czy istnieje jakikolwiek powód, dla którego mógłbyś pogrupować po godzinie i zaciekawić sumę kwoty pomiędzy tymi czasami? – Justin

+0

edytuj dodane, daty są zgrupowane w modelu godziny, w którym znajduje się rozwiązanie API. – teachtyler

+0

Czy używasz [tag: asp.net-mvc]? –

Odpowiedz

4

Można tworzyć dzienne, miesięczne i roczne dane przy użyciu tej samej logiki. Trzeba tylko zastąpić godzinę dniem, miesiącem lub rokiem.

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" 
     }); 

A to będzie Twój 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; } 
} 

}

A wy dane pobierania logiki wydaje się być w tej funkcji trzeba dokonać zmian w nim odpowiednie, aby pracować z dzień, miesiąc, rok

transactionRepository.GetAllPayments(startDate, endDate, merchantID); 
+0

Zmieniłem 'while (dayIterator.Hour <= ddvm.CurrentDay)' na 'while (dayIterator.Day <= ddvm.CurrentDay)' A teraz widzę obecnie obszar roboczy, w którym powinien być wykres, ale nic nie wyświetla. – teachtyler

+0

Czy zmieniłeś logikę pobierania danych z DB na podstawie dni? Wygląda to w metodzie getallpayments. – Mairaj

Powiązane problemy