Пример #1
0
        protected void UpdateReportDays(MoodReport report, IEnumerable <GlobalMoodReportModel> days)
        {
            Console.WriteLine("Update report days");
            var allMoods = Mood.All().ToList();

            NSDictionary userInfo = NSDictionary.FromObjectAndKey(NSObject.FromObject("Saving data ..."), new NSString("Status"));

            NSNotificationCenter.DefaultCenter.PostNotificationName("RequestingReportStatus", null, userInfo);
            int count             = 1;
            var insertSnapshotSql = "insert into Snapshot (Id, MoodReportId, TimeOfSnapshot, TimeOfSnapshotLocal, TotalResponses, CreatedOn) " +
                                    " values (@Id, @MoodReportId, @TimeOfSnapshot, @TimeOfSnapshotLocal, @TotalResponses,  @CreatedOn)";

            var insertMoodSnapshotSql = "insert into MoodSnapshot (Id, SnapshotId, MoodId, ResponseCount, ResponsePercentage) " +
                                        " values (@Id, @SnapshotId, @MoodId, @ResponseCount, @ResponsePercentage)";

            foreach (var day in days)
            {
                foreach (var s in day.Snapshots)
                {
                    userInfo = NSDictionary.FromObjectAndKey(NSObject.FromObject(string.Format("Saving snapshot {0}", count)), new NSString("Status"));
                    NSNotificationCenter.DefaultCenter.PostNotificationName("RequestingReportStatus", null, userInfo);
                    count++;

                    var snapshotId = System.Guid.NewGuid().ToString();
                    CSDatabase.ExecuteNonQuery(insertSnapshotSql, new{ Id                  = snapshotId,
                                                                       MoodReportId        = report.Id,
                                                                       TimeOfSnapshot      = s.t,
                                                                       TimeOfSnapshotLocal = s.t.ToLocalTime(ApplicationState.Current.EventTimeOffset),
                                                                       TotalResponses      = s.r,
                                                                       CreatedOn           = DateTime.UtcNow });



//					Snapshot snap = Snapshot.New ();
//					snap.Id = System.Guid.NewGuid ().ToString ();
//					snap.MoodReport = report;
//					snap.TimeOfSnapshot = s.t;
//					snap.TimeOfSnapshotLocal = s.t.ToLocalTime (ApplicationState.Current.EventTimeOffset);
//					snap.TotalResponses = s.r;
//					snap.IsFirstGlance = false;
//					snap.CreatedOn = DateTime.UtcNow;
//					snap.Save ();
                    //make sure a snapshot is recorde for all moods even if no data provided
                    var snapMoods = from m in allMoods
                                    join d in s.d
                                    on m.DisplayIndex equals d.i into gm
                                    from subm in gm.DefaultIfEmpty()
                                    select new {
                        Mood = m,

                        ResponseCount      = subm == null ? 0 : subm.c,
                        ResponsePercentage = subm == null ? 0 : subm.p,
                        MoodType           = m.MoodType
                    };


                    foreach (var d in snapMoods)
                    {
                        CSDatabase.ExecuteNonQuery(insertMoodSnapshotSql, new {
                            Id                 = System.Guid.NewGuid().ToString(),
                            SnapshotId         = snapshotId,
                            MoodId             = d.Mood.Id,
                            ResponseCount      = d.ResponseCount,
                            ResponsePercentage = d.ResponsePercentage
                        });


//						MoodSnapshot ms = MoodSnapshot.New ();
//						ms.Id = System.Guid.NewGuid ().ToString ();
//						ms.Snapshot = snap;
//						ms.Mood = d.Mood;
//						//ms.Name = d.Mood.Name;
//						//ms.DisplayIndex = d.Mood.DisplayIndex;
//						ms.ResponseCount = d.ResponseCount;
//						ms.ResponsePercentage = d.ResponsePercentage;
//						ms.Save ();
                    }
                }
            }
        }
Пример #2
0
        public static void GenerateReportImages(MoodReport report, RenderLevel renderLevel)
        {
            Console.WriteLine("Generate report images - {0} / {1}", report.Id, renderLevel.Index);
            if (report != null)
            {
                string        imagesFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Reports", report.Id.ToString());
                DirectoryInfo imagesDir    = new DirectoryInfo(imagesFolder);
                if (!imagesDir.Exists)
                {
                    imagesDir.Create();
                }


                var nowLocal         = DateTime.UtcNow.ToLocalTime(ApplicationState.Current.EventTimeOffset);
                var reportStartLocal = GetReportStartLocal(report);
                var reportEndLocal   = GetReportEndLocal(report);
                //var finalSnapshotTime = nowLocal > reportEndLocal ? reportEndLocal : nowLocal;
                var finalSnapshotTime = reportEndLocal;

                var dayStart = reportStartLocal;
                var dayEnd   = reportStartLocal.Date.Add(DayEndTime);
                //var dayHours = dayEnd.Subtract (dayStart).TotalHours;
                if (dayEnd > reportEndLocal)
                {
                    dayEnd = reportEndLocal;
                }

                var allMoods          = Mood.All().ToList();
                var lastSnapshot      = GenerateEmptyMoodList(allMoods);
                var lastSnapshotAdded = dayStart;

                //var days = (float)reportEndLocal.Date.Subtract (reportStartLocal.Date).Days + 1;
                var dayIndex = 0;

                while (dayStart < reportEndLocal)
                {
                    var  imageFrame = new RectangleF(0f, 0f, renderLevel.DayImageWidth, renderLevel.DayImageHeight);
                    var  imager     = new GlobalMoodMapImager(dayStart, dayEnd);
                    bool lastAdded  = false;
                    var  snapshots  = Snapshot.OrderedList("TimeOfSnapshotLocal",
                                                           "MoodReport.Id = @ReportId and TimeOfSnapshotLocal >= @Start and TimeOfSnapshotLocal <= @End",
                                                           new { ReportId = report.Id, Start = lastSnapshotAdded, End = dayEnd }).ToList();

                    var addedFirst = false;
                    foreach (var snapshot in snapshots)
                    {
                        if (snapshot.TimeOfSnapshotLocal < dayStart)
                        {
                            lastSnapshot = GetMoods(snapshot);
                        }
                        else
                        {
                            if (!addedFirst && dayStart <= finalSnapshotTime)
                            {
                                addedFirst = true;
                                if (snapshot.TimeOfSnapshotLocal != dayStart)
                                {
                                    if (dayStart == finalSnapshotTime)
                                    {
                                        lastAdded = true;
                                    }
                                    imager.AddSnapshot(dayStart, lastSnapshot, lastAdded);
                                    lastSnapshotAdded = dayStart;
                                }
                            }
                            if (!lastAdded && snapshot.TimeOfSnapshotLocal <= finalSnapshotTime && snapshot.TimeOfSnapshotLocal <= dayEnd)
                            {
                                //if last snapshot more than 10 mins ago then add a pre-datapoint using last snapshot data
                                if (snapshot.TimeOfSnapshotLocal.Subtract(lastSnapshotAdded).TotalMinutes > 10)
                                {
                                    imager.AddSnapshot(snapshot.TimeOfSnapshotLocal.AddMinutes(-10), lastSnapshot, false);
                                }

                                if (snapshot.TimeOfSnapshotLocal == finalSnapshotTime)
                                {
                                    lastAdded = true;
                                }
                                lastSnapshot = GetMoods(snapshot);
                                imager.AddSnapshot(snapshot.TimeOfSnapshotLocal, lastSnapshot, lastAdded);
                                lastSnapshotAdded = snapshot.TimeOfSnapshotLocal;
                            }
                        }
                    }
                    //always make sure there is a snapshot at the start of the day
                    if (!addedFirst)
                    {
                        addedFirst = true;
                        imager.AddSnapshot(dayStart, lastSnapshot, lastAdded);
                        lastSnapshotAdded = dayStart;
                    }



                    if (!lastAdded && lastSnapshot != null && lastSnapshotAdded < dayEnd)
                    {
                        if (dayStart.AddDays(1) > reportEndLocal)
                        {
                            imager.AddSnapshot(finalSnapshotTime, lastSnapshot, true);
                            lastSnapshotAdded = finalSnapshotTime;
                        }
                        else
                        {
                            imager.AddSnapshot(dayEnd, lastSnapshot, false);
                            lastSnapshotAdded = dayEnd;
                        }
                    }


                    using (var img = imager.DrawMapImage(imageFrame)){
                        string  filename = Path.Combine(imagesFolder, GetDayImageFileName(renderLevel, dayIndex));
                        NSError err;
                        img.AsPNG().Save(filename, true, out err);
                    }


                    Console.WriteLine("Image drawn");

                    dayStart = dayStart.AddDays(1);
                    dayEnd   = dayEnd.AddDays(1);
                    if (dayEnd > reportEndLocal)
                    {
                        dayEnd = reportEndLocal;
                    }

                    dayIndex++;
                }
                Console.WriteLine("Images generated");
            }
        }