From 5255145cd0cf753582b5ed6d55e40b01f5fd62a4 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 29 Dec 2021 20:41:28 +0000 Subject: [PATCH] --- server/AyaNova/biz/ContractBiz.cs | 48 ++++++++++++++++++++---------- server/AyaNova/biz/CustomerBiz.cs | 27 ++++++++++++++--- server/AyaNova/biz/PMBiz.cs | 4 +-- server/AyaNova/biz/QuoteBiz.cs | 18 +++++------ server/AyaNova/biz/WorkOrderBiz.cs | 8 ++--- 5 files changed, 71 insertions(+), 34 deletions(-) diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index 162e012f..490389a0 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -500,29 +500,27 @@ MULTIPLE discount / markup ITEMS .ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; - - //cache enum list - var ContractOverrideTypeEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( - StringUtil.TrimTypeName(typeof(ContractOverrideType).ToString()), - UserTranslationId, - CurrentUserRoles); - //cache translations needed - var PreTrans = await TranslationBiz.GetSubsetStaticAsync(new List { "TimeSpanDays", "TimeSpanHours", "TimeSpanMinutes", "TimeSpanSeconds" }, UserTranslationId); + batchResults=null; foreach (Contract w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; - await PopulateVizFields(w, ContractOverrideTypeEnumList, PreTrans); + await PopulateVizFields(w); var jo = JObject.FromObject(w); if (!JsonUtil.JTokenIsNullOrEmpty(jo["CustomFields"])) jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } + vc.Clear(); return ReportData; } + //request cache for viz fields + private VizCache vc = new VizCache(); + //populate viz fields from provided object - private async Task PopulateVizFields(Contract o, List contractOverrideTypeEnumList = null, Dictionary preTrans = null) + private async Task PopulateVizFields(Contract o) { if (contractOverrideTypeEnumList == null) contractOverrideTypeEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( @@ -548,12 +546,32 @@ MULTIPLE discount / markup ITEMS i.OverrideTypeViz = contractOverrideTypeEnumList.Where(x => x.Id == (long)i.OverrideType).Select(x => x.Name).First(); foreach (var i in o.ContractServiceRateOverrideItems) i.OverrideTypeViz = contractOverrideTypeEnumList.Where(x => x.Id == (long)i.OverrideType).Select(x => x.Name).First(); - foreach (var i in o.ServiceRateItems) - i.ServiceRateViz = await ct.ServiceRate.AsNoTracking().Where(x => x.Id == i.ServiceRateId).Select(x => x.Name).FirstOrDefaultAsync(); - foreach (var i in o.TravelRateItems) - i.TravelRateViz = await ct.TravelRate.AsNoTracking().Where(x => x.Id == i.TravelRateId).Select(x => x.Name).FirstOrDefaultAsync(); - } + // foreach (var i in o.ServiceRateItems) + // i.ServiceRateViz = await ct.ServiceRate.AsNoTracking().Where(x => x.Id == i.ServiceRateId).Select(x => x.Name).FirstOrDefaultAsync(); + foreach (var i in o.ServiceRateItems) + { + if (!vc.Has("servicerate", i.ServiceRateId)) + { + vc.Add(await ct.ServiceRate.AsNoTracking().Where(x => x.Id == i.ServiceRateId).Select(x => x.Name).FirstOrDefaultAsync(), "servicerate", i.ServiceRateId); + } + i.ServiceRateViz = vc.Get("servicerate", i.ServiceRateId); + } + + // foreach (var i in o.TravelRateItems) + // i.TravelRateViz = await ct.TravelRate.AsNoTracking().Where(x => x.Id == i.TravelRateId).Select(x => x.Name).FirstOrDefaultAsync(); + + foreach (var i in o.TravelRateItems) + { + if (!vc.Has("travelrate", i.TravelRateId)) + { + vc.Add(await ct.TravelRate.AsNoTracking().Where(x => x.Id == i.TravelRateId).Select(x => x.Name).FirstOrDefaultAsync(), "travelrate", i.TravelRateId); + } + i.TravelRateViz = vc.Get("travelrate", i.TravelRateId); + } + } + private List contractOverrideTypeEnumList = null; + private Dictionary preTrans = null; //////////////////////////////////////////////////////////////////////////////////////////////// // IMPORT EXPORT diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index 1b2886e9..acb9f0d0 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -341,7 +341,6 @@ namespace AyaNova.Biz //query for this batch, comes back in db natural order unfortunately var batchResults = await ct.Customer.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); - //order the results back into original //What is happening here: //for performance the query is batching a bunch at once by fetching a block of items from the sql server @@ -350,7 +349,7 @@ namespace AyaNova.Biz //This would not be necessary if just fetching each one at a time individually (like in workorder get report data) var orderedList = from id in batch join z in batchResults on id equals z.Id select z; - + batchResults = null; foreach (Customer w in orderedList) { @@ -361,17 +360,34 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } //populate viz fields from provided object private async Task PopulateVizFields(Customer o) { + if (o.HeadOfficeId != null) - o.HeadOfficeViz = await ct.HeadOffice.AsNoTracking().Where(x => x.Id == o.HeadOfficeId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("headoffice", o.HeadOfficeId)) + { + vc.Add(await ct.HeadOffice.AsNoTracking().Where(x => x.Id == o.HeadOfficeId).Select(x => x.Name).FirstOrDefaultAsync(), "headoffice", o.HeadOfficeId); + } + o.HeadOfficeViz = vc.Get("headoffice", o.HeadOfficeId); + } + + if (o.ContractId != null) - o.ContractViz = await ct.Contract.AsNoTracking().Where(x => x.Id == o.ContractId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("contract", o.ContractId)) + { + vc.Add(await ct.Contract.AsNoTracking().Where(x => x.Id == o.ContractId).Select(x => x.Name).FirstOrDefaultAsync(), "contract", o.ContractId); + } + o.ContractViz = vc.Get("contract", o.ContractId); + } //Too slow and complex for EF Core using (var command = ct.Database.GetDbConnection().CreateCommand()) @@ -396,6 +412,9 @@ namespace AyaNova.Biz } } + //request cache for viz fields + private VizCache vc = new VizCache(); + //////////////////////////////////////////////////////////////////////////////////////////////// // IMPORT EXPORT diff --git a/server/AyaNova/biz/PMBiz.cs b/server/AyaNova/biz/PMBiz.cs index b33a266e..2dcb8f0a 100644 --- a/server/AyaNova/biz/PMBiz.cs +++ b/server/AyaNova/biz/PMBiz.cs @@ -822,12 +822,12 @@ namespace AyaNova.Biz var idList = dataListSelectedRequest.SelectedRowIds; JArray ReportData = new JArray(); - + List batchResults = new List(); while (idList.Any()) { var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); - List batchResults = new List(); + batchResults.Clear(); foreach (long batchId in batch) batchResults.Add(await PMGetPartialAsync(dataListSelectedRequest.AType, batchId, dataListSelectedRequest.IncludeWoItemDescendants, true)); diff --git a/server/AyaNova/biz/QuoteBiz.cs b/server/AyaNova/biz/QuoteBiz.cs index 18ddd5de..7e6938bb 100644 --- a/server/AyaNova/biz/QuoteBiz.cs +++ b/server/AyaNova/biz/QuoteBiz.cs @@ -798,12 +798,12 @@ namespace AyaNova.Biz var idList = dataListSelectedRequest.SelectedRowIds; JArray ReportData = new JArray(); - + List batchResults = new List(); while (idList.Any()) { var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); - List batchResults = new List(); + batchResults.Clear(); foreach (long batchId in batch) batchResults.Add(await QuoteGetPartialAsync(dataListSelectedRequest.AType, batchId, dataListSelectedRequest.IncludeWoItemDescendants, true)); @@ -1639,7 +1639,7 @@ namespace AyaNova.Biz // private async Task ItemPopulateVizFields(QuoteItem o, bool populateForReporting) { - + if (o.WorkOrderItemStatusId != null) { string value = vc.Get("woistatname", o.WorkOrderItemStatusId); @@ -1958,7 +1958,7 @@ namespace AyaNova.Biz // private async Task ExpensePopulateVizFields(QuoteItemExpense o, bool calculateTotalsOnly = false) { - + if (calculateTotalsOnly == false) { if (o.UserId != null) @@ -3156,7 +3156,7 @@ namespace AyaNova.Biz private async Task OutsideServicePopulateVizFields(QuoteItemOutsideService o, bool calculateTotalsOnly = false) { if (calculateTotalsOnly == false) - { + { if (o.UnitId != 0) { if (!vc.Has("unitserial", o.UnitId)) @@ -3933,7 +3933,7 @@ namespace AyaNova.Biz // private async Task ScheduledUserPopulateVizFields(QuoteItemScheduledUser o) { - if (o.UserId != null) + if (o.UserId != null) { if (!vc.Has("user", o.UserId)) { @@ -4502,7 +4502,7 @@ namespace AyaNova.Biz // private async Task TravelPopulateVizFields(QuoteItemTravel o, bool calculateTotalsOnly = false) { - if (calculateTotalsOnly == false) + if (calculateTotalsOnly == false) { if (o.UserId != null) { @@ -4903,7 +4903,7 @@ namespace AyaNova.Biz // private async Task UnitPopulateVizFields(QuoteItemUnit o, bool populateForReporting) { - //see if it's in the cache already, populate the cache fully if not + //see if it's in the cache already, populate the cache fully if not bool UnitHasModel = false; if (!vc.Has("unitserial", o.UnitId)) { @@ -4967,7 +4967,7 @@ namespace AyaNova.Biz } o.UnitViz = vc.Get("unitserial", o.UnitId); o.UnitDescriptionViz = vc.Get("unitdesc", o.UnitId); - // o.UnitMeteredViz = vc.GetAsBool("unitmetered", o.UnitId); + // o.UnitMeteredViz = vc.GetAsBool("unitmetered", o.UnitId); if (populateForReporting) { o.AddressViz = vc.Get("unitaddr", o.UnitId); diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index dd85b966..b95b8895 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -949,13 +949,13 @@ namespace AyaNova.Biz var idList = dataListSelectedRequest.SelectedRowIds; JArray ReportData = new JArray(); - + List batchResults = new List(); while (idList.Any()) { if (!ReportRenderManager.KeepGoing(jobId)) return null; var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); - List batchResults = new List(); + batchResults.Clear(); foreach (long batchId in batch) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -986,9 +986,9 @@ namespace AyaNova.Biz } ReportData.Add(jo); } - batchResults.Clear(); + } - + vc.Clear(); oc.Clear(); return ReportData;