From 0de162fce31ca8213019e7c7400ba7ed5fbbba42 Mon Sep 17 00:00:00 2001 From: Gary Sharp Date: Tue, 19 Aug 2014 10:53:59 +1000 Subject: [PATCH] Update: Update Job Identifiers --- Disco.Models/Disco.Models.csproj | 6 +- .../Interop/DiscoServices/UpdateRequestV2.cs | 60 +++++--- Disco.Models/packages.config | 4 + .../Interop/DiscoServices/UpdateQuery.cs | 130 ++++++++++-------- 4 files changed, 128 insertions(+), 72 deletions(-) create mode 100644 Disco.Models/packages.config diff --git a/Disco.Models/Disco.Models.csproj b/Disco.Models/Disco.Models.csproj index 1e218837..0212db6f 100644 --- a/Disco.Models/Disco.Models.csproj +++ b/Disco.Models/Disco.Models.csproj @@ -34,6 +34,9 @@ false + + ..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll + @@ -176,12 +179,13 @@ + - + diff --git a/Disco.Models/Services/Interop/DiscoServices/UpdateRequestV2.cs b/Disco.Models/Services/Interop/DiscoServices/UpdateRequestV2.cs index 5ed60d54..ae317def 100644 --- a/Disco.Models/Services/Interop/DiscoServices/UpdateRequestV2.cs +++ b/Disco.Models/Services/Interop/DiscoServices/UpdateRequestV2.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; namespace Disco.Models.Services.Interop.DiscoServices @@ -21,18 +22,31 @@ namespace Disco.Models.Services.Interop.DiscoServices public List InstalledPlugins { get; set; } + public List Stat_JobIdentifiers { get; set; } public List Stat_Jobs { get; set; } + public class StatisticIntPair + { + [JsonProperty("B")] + public int Begin; + [JsonProperty("E")] + public int End; + } + public class StatisticInt { - public string K; - public int V; + [JsonProperty("K")] + public string Key; + [JsonProperty("V")] + public int Value; } public class StatisticString { - public string K; - public string V; + [JsonProperty("K")] + public string Key; + [JsonProperty("V")] + public string Value; } public class StatisticJob @@ -40,62 +54,74 @@ namespace Disco.Models.Services.Interop.DiscoServices /// /// Job Identifier /// - public int I { get; set; } + [JsonProperty("I")] + public int Identifier { get; set; } /// /// Opened Date /// - public DateTime OD { get; set; } + [JsonProperty("OD")] + public DateTime OpenedDate { get; set; } /// /// Closed Date /// - public DateTime? CD { get; set; } + [JsonProperty("CD", NullValueHandling = NullValueHandling.Ignore)] + public DateTime? ClosedDate { get; set; } /// /// Job Type /// - public string T { get; set; } + [JsonProperty("T")] + public string Type { get; set; } /// /// Job Sub Types (Semicolon Separated) /// - public string ST { get; set; } + [JsonProperty("ST")] + public string SubTypes { get; set; } /// /// Deployment-Unique Device Serial Identifier (Device Serial Number anonymized via hashing salted with Deployment Secret) /// - public string D { get; set; } + [JsonProperty("D", NullValueHandling = NullValueHandling.Ignore)] + public string DeviceIdentifier { get; set; } /// /// Deployment-Unique Job User Identifier (Job User Id anonymized via hashing salted with Deployment Secret) /// - public string U { get; set; } + [JsonProperty("U", NullValueHandling = NullValueHandling.Ignore)] + public string UserIdentifier { get; set; } /// /// Deployment-Unique Job Technician Identifier (Job Technician Id anonymized via hashing salted with Deployment Secret) /// - public string TI { get; set; } + [JsonProperty("TI")] + public string TechnicianIdentifier { get; set; } /// /// Device Model /// - public string DM { get; set; } + [JsonProperty("DM", NullValueHandling = NullValueHandling.Ignore)] + public string DeviceModel { get; set; } /// /// External Repairer /// - public string R { get; set; } + [JsonProperty("R", NullValueHandling = NullValueHandling.Ignore)] + public string Repairer { get; set; } /// /// External Repairer Logged /// - public DateTime? RL { get; set; } + [JsonProperty("RL", NullValueHandling = NullValueHandling.Ignore)] + public DateTime? RepairerLogged { get; set; } /// /// External Repairer Completed /// - public DateTime? RC { get; set; } + [JsonProperty("RC", NullValueHandling = NullValueHandling.Ignore)] + public DateTime? RepairerCompleted { get; set; } } } } diff --git a/Disco.Models/packages.config b/Disco.Models/packages.config new file mode 100644 index 00000000..945d431f --- /dev/null +++ b/Disco.Models/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Disco.Services/Interop/DiscoServices/UpdateQuery.cs b/Disco.Services/Interop/DiscoServices/UpdateQuery.cs index 23829bec..1f1e000d 100644 --- a/Disco.Services/Interop/DiscoServices/UpdateQuery.cs +++ b/Disco.Services/Interop/DiscoServices/UpdateQuery.cs @@ -17,6 +17,7 @@ namespace Disco.Services.Interop.DiscoServices using StatisticInt = UpdateRequestV2.StatisticInt; using StatisticJob = UpdateRequestV2.StatisticJob; using StatisticString = UpdateRequestV2.StatisticString; + using StatisticIntPair = UpdateRequestV2.StatisticIntPair; public static class UpdateQuery { @@ -63,7 +64,6 @@ namespace Disco.Services.Interop.DiscoServices Status.UpdateStatus(10, "Gathering statistics and building update request"); var updateRequest = BuildRequest(Database); - var updateRequestJson = JsonConvert.SerializeObject(updateRequest); Status.UpdateStatus(40, "Sending statistics and update request"); @@ -87,7 +87,9 @@ namespace Disco.Services.Interop.DiscoServices { using (var requestStreamWriter = new StreamWriter(compressedStream, Encoding.UTF8)) { - requestStreamWriter.Write(updateRequestJson); + JsonSerializer serializer = new JsonSerializer(); + serializer.Serialize(requestStreamWriter, updateRequest); + requestStreamWriter.Flush(); } } @@ -143,65 +145,85 @@ namespace Disco.Services.Interop.DiscoServices if (whoAmIResponse != null && !string.IsNullOrWhiteSpace(whoAmIResponse.Item1)) m.VicEduDeptWanId = whoAmIResponse.Item1; - m.Stat_JobCounts = Database.Jobs.GroupBy(j => j.JobTypeId).Select(g => new StatisticInt() { K = g.Key, V = g.Count() }).ToList(); - m.Stat_OpenJobCounts = Database.Jobs.Where(j => j.ClosedDate == null).GroupBy(j => j.JobTypeId).Select(g => new StatisticInt() { K = g.Key, V = g.Count() }).ToList(); - m.Stat_DeviceModelCounts = Database.DeviceModels.Select(dm => new StatisticInt() { K = dm.Manufacturer + ";" + dm.Model, V = dm.Devices.Count(d => d.DecommissionedDate == null) }).ToList(); + m.Stat_JobCounts = Database.Jobs.GroupBy(j => j.JobTypeId).Select(g => new StatisticInt() { Key = g.Key, Value = g.Count() }).ToList(); + m.Stat_OpenJobCounts = Database.Jobs.Where(j => j.ClosedDate == null).GroupBy(j => j.JobTypeId).Select(g => new StatisticInt() { Key = g.Key, Value = g.Count() }).ToList(); + m.Stat_DeviceModelCounts = Database.DeviceModels.Select(dm => new StatisticInt() { Key = dm.Manufacturer + ";" + dm.Model, Value = dm.Devices.Count(d => d.DecommissionedDate == null) }).ToList(); var activeThreshold = DateTime.Now.AddDays(-60); - m.Stat_ActiveDeviceModelCounts = Database.DeviceModels.Select(dm => new StatisticInt() { K = dm.Manufacturer + ";" + dm.Model, V = dm.Devices.Count(d => d.DecommissionedDate == null && (d.LastNetworkLogonDate == null || d.LastNetworkLogonDate > activeThreshold)) }).ToList(); + m.Stat_ActiveDeviceModelCounts = Database.DeviceModels.Select(dm => new StatisticInt() { Key = dm.Manufacturer + ";" + dm.Model, Value = dm.Devices.Count(d => d.DecommissionedDate == null && (d.LastNetworkLogonDate == null || d.LastNetworkLogonDate > activeThreshold)) }).ToList(); m.Stat_UserCounts = new List() { - new StatisticInt() { K = "All", V = Database.Users.Count() }, - new StatisticInt() { K = "Assigned Current", V = Database.Users.Where(u => u.DeviceUserAssignments.Any(dua => !dua.UnassignedDate.HasValue)).Count() }, - new StatisticInt() { K = "Assigned Ever", V = Database.Users.Where(u => u.DeviceUserAssignments.Any()).Count() }, - new StatisticInt() { K = "Job Technicians", V = Database.Jobs.Select(j => j.OpenedTechUserId).Distinct().ToList().Concat(Database.Jobs.Select(j => j.ClosedTechUserId).Distinct().ToList()).Distinct().Count() }, - new StatisticInt() { K = "Job Users", V = Database.Jobs.Where(j => j.UserId != null).Select(j => j.UserId).Distinct().Count() } + new StatisticInt() { Key = "All", Value = Database.Users.Count() }, + new StatisticInt() { Key = "Assigned Current", Value = Database.Users.Where(u => u.DeviceUserAssignments.Any(dua => !dua.UnassignedDate.HasValue)).Count() }, + new StatisticInt() { Key = "Assigned Ever", Value = Database.Users.Where(u => u.DeviceUserAssignments.Any()).Count() }, + new StatisticInt() { Key = "Job Technicians", Value = Database.Jobs.Select(j => j.OpenedTechUserId).Distinct().ToList().Concat(Database.Jobs.Select(j => j.ClosedTechUserId).Distinct().ToList()).Distinct().Count() }, + new StatisticInt() { Key = "Job Users", Value = Database.Jobs.Where(j => j.UserId != null).Select(j => j.UserId).Distinct().Count() } }; - IQueryable jobs; - if (lastUpdate == null) - jobs = Database.Jobs; - else + var jobIds = Database.Jobs.OrderBy(j => j.Id).Select(j => j.Id).ToList(); + if (jobIds.Count > 0) { - var lastUpdateDate = lastUpdate.UpdateResponseDate.Date; - jobs = Database.Jobs.Where(j => j.OpenedDate >= lastUpdateDate || (j.ClosedDate.HasValue && j.ClosedDate.Value >= lastUpdateDate)); + m.Stat_JobIdentifiers = new List(); + var jobIdSequenceBegin = jobIds.First(); + jobIds.Skip(1).Aggregate(jobIdSequenceBegin, (last, current) => + { + if (current == last + 1) + return current; + else + { + m.Stat_JobIdentifiers.Add(new StatisticIntPair() { Begin = jobIdSequenceBegin, End = last }); + jobIdSequenceBegin = current; + } + + return current; + }); + m.Stat_JobIdentifiers.Add(new StatisticIntPair() { Begin = jobIdSequenceBegin, End = jobIds.Last() }); + + IQueryable jobs; + if (lastUpdate == null) + jobs = Database.Jobs; + else + { + var lastUpdateDate = lastUpdate.UpdateResponseDate.Date; + jobs = Database.Jobs.Where(j => j.OpenedDate >= lastUpdateDate || (j.ClosedDate.HasValue && j.ClosedDate.Value >= lastUpdateDate)); + } + + var reportedJobs = jobs.Select(j => new + { + Id = j.Id, + OpenedDate = j.OpenedDate, + ClosedDate = j.ClosedDate, + JobType = j.JobTypeId, + JobSubTypes = j.JobSubTypes.Select(jst => jst.Id), + DeviceModelManufacturer = j.Device.DeviceModel.Manufacturer, + DeviceModelModel = j.Device.DeviceModel.Model, + DeviceSerialNumber = j.DeviceSerialNumber, + UserId = j.UserId, + JobTechnicianId = j.OpenedTechUserId, + WarrantyRepairer = j.JobMetaWarranty.ExternalName, + WarrantyRepairerLoggedDate = j.JobMetaWarranty.ExternalLoggedDate, + WarrantyRepairerCompletedDate = j.JobMetaWarranty.ExternalCompletedDate, + Repairer = j.JobMetaNonWarranty.RepairerName, + RepairerLoggedDate = j.JobMetaNonWarranty.RepairerLoggedDate, + RepairerCompletedDate = j.JobMetaNonWarranty.RepairerCompletedDate, + }).ToList(); + + m.Stat_Jobs = reportedJobs.Select(j => new StatisticJob() + { + Identifier = j.Id, + OpenedDate = j.OpenedDate, + ClosedDate = j.ClosedDate, + Type = j.JobType, + SubTypes = j.JobSubTypes == null ? null : string.Join(";", j.JobSubTypes), + DeviceIdentifier = HashDeploymentData(Database, j.DeviceSerialNumber), + UserIdentifier = HashDeploymentData(Database, j.UserId), + TechnicianIdentifier = HashDeploymentData(Database, j.JobTechnicianId), + DeviceModel = string.Format("{0};{1}", j.DeviceModelManufacturer, j.DeviceModelModel), + Repairer = j.JobType == JobType.JobTypeIds.HWar ? j.WarrantyRepairer : j.Repairer, + RepairerLogged = j.JobType == JobType.JobTypeIds.HWar ? j.WarrantyRepairerLoggedDate : j.RepairerLoggedDate, + RepairerCompleted = j.JobType == JobType.JobTypeIds.HWar ? j.WarrantyRepairerCompletedDate : j.RepairerCompletedDate + }).ToList(); } - var reportedJobs = jobs.Select(j => new - { - Id = j.Id, - OpenedDate = j.OpenedDate, - ClosedDate = j.ClosedDate, - JobType = j.JobTypeId, - JobSubTypes = j.JobSubTypes.Select(jst => jst.Id), - DeviceModelManufacturer = j.Device.DeviceModel.Manufacturer, - DeviceModelModel = j.Device.DeviceModel.Model, - DeviceSerialNumber = j.DeviceSerialNumber, - UserId = j.UserId, - JobTechnicianId = j.OpenedTechUserId, - WarrantyRepairer = j.JobMetaWarranty.ExternalName, - WarrantyRepairerLoggedDate = j.JobMetaWarranty.ExternalLoggedDate, - WarrantyRepairerCompletedDate = j.JobMetaWarranty.ExternalCompletedDate, - Repairer = j.JobMetaNonWarranty.RepairerName, - RepairerLoggedDate = j.JobMetaNonWarranty.RepairerLoggedDate, - RepairerCompletedDate = j.JobMetaNonWarranty.RepairerCompletedDate, - }).ToList(); - - m.Stat_Jobs = reportedJobs.Select(j => new StatisticJob() - { - I = j.Id, - OD = j.OpenedDate, - CD = j.ClosedDate, - T = j.JobType, - ST = j.JobSubTypes == null ? null : string.Join(";", j.JobSubTypes), - D = HashDeploymentData(Database, j.DeviceSerialNumber), - U = HashDeploymentData(Database, j.UserId), - TI = HashDeploymentData(Database, j.JobTechnicianId), - DM = string.Format("{0};{1}", j.DeviceModelManufacturer, j.DeviceModelModel), - R = j.JobType == JobType.JobTypeIds.HWar ? j.WarrantyRepairer : j.Repairer, - RL = j.JobType == JobType.JobTypeIds.HWar ? j.WarrantyRepairerLoggedDate : j.RepairerLoggedDate, - RC = j.JobType == JobType.JobTypeIds.HWar ? j.WarrantyRepairerCompletedDate : j.RepairerCompletedDate - }).ToList(); - - m.InstalledPlugins = Disco.Services.Plugins.Plugins.GetPlugins().Select(manifest => new StatisticString() { K = manifest.Id, V = manifest.VersionFormatted }).ToList(); + m.InstalledPlugins = Disco.Services.Plugins.Plugins.GetPlugins().Select(manifest => new StatisticString() { Key = manifest.Id, Value = manifest.VersionFormatted }).ToList(); return m; }