diff --git a/server/AyaNova/biz/CustomerNoteBiz.cs b/server/AyaNova/biz/CustomerNoteBiz.cs index 6c5158b8..24c2e63c 100644 --- a/server/AyaNova/biz/CustomerNoteBiz.cs +++ b/server/AyaNova/biz/CustomerNoteBiz.cs @@ -193,7 +193,6 @@ namespace AyaNova.Biz //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; batchResults = null; - foreach (CustomerNote w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -218,8 +217,7 @@ namespace AyaNova.Biz vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.UserId); o.UserViz = vc.Get("user", o.UserId); - } - + } private VizCache vc = new VizCache(); diff --git a/server/AyaNova/biz/CustomerServiceRequestBiz.cs b/server/AyaNova/biz/CustomerServiceRequestBiz.cs index 4392d432..c062fc1c 100644 --- a/server/AyaNova/biz/CustomerServiceRequestBiz.cs +++ b/server/AyaNova/biz/CustomerServiceRequestBiz.cs @@ -317,8 +317,7 @@ namespace AyaNova.Biz } vc.Clear(); return ReportData; - } - + } private VizCache vc = new VizCache(); //populate viz fields from provided object diff --git a/server/AyaNova/biz/PartInventoryDataListBiz.cs b/server/AyaNova/biz/PartInventoryDataListBiz.cs index 5a78fb33..86e39c68 100644 --- a/server/AyaNova/biz/PartInventoryDataListBiz.cs +++ b/server/AyaNova/biz/PartInventoryDataListBiz.cs @@ -6,7 +6,6 @@ using AyaNova.Util; using AyaNova.Api.ControllerHelpers; using AyaNova.Models; using Newtonsoft.Json.Linq; -using System.Collections.Generic; namespace AyaNova.Biz { @@ -48,18 +47,14 @@ namespace AyaNova.Biz //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.PartInventoryId select z; - //cache frequent viz data - var AyaTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( - StringUtil.TrimTypeName(typeof(AyaType).ToString()), - UserTranslationId, - CurrentUserRoles); - + batchResults = null; foreach (ViewPartInventoryList w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; var jo = JObject.FromObject(w); ReportData.Add(jo); } + orderedList = null; } return ReportData; } diff --git a/server/AyaNova/biz/PartInventoryRequestDataListBiz.cs b/server/AyaNova/biz/PartInventoryRequestDataListBiz.cs index a682528e..a1b1adea 100644 --- a/server/AyaNova/biz/PartInventoryRequestDataListBiz.cs +++ b/server/AyaNova/biz/PartInventoryRequestDataListBiz.cs @@ -47,13 +47,7 @@ namespace AyaNova.Biz var batchResults = await ct.ViewPartInventoryRequestList.AsNoTracking().Where(z => batch.Contains(z.RequestId)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.RequestId select z; - - //cache frequent viz data - var AyaTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( - StringUtil.TrimTypeName(typeof(AyaType).ToString()), - UserTranslationId, - CurrentUserRoles); - + batchResults=null; foreach (ViewPartInventoryRequestList w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -61,7 +55,7 @@ namespace AyaNova.Biz var jo = JObject.FromObject(w); ReportData.Add(jo); } - + orderedList=null; } return ReportData; } diff --git a/server/AyaNova/biz/PartWarehouseBiz.cs b/server/AyaNova/biz/PartWarehouseBiz.cs index 4a458aa9..61dc0264 100644 --- a/server/AyaNova/biz/PartWarehouseBiz.cs +++ b/server/AyaNova/biz/PartWarehouseBiz.cs @@ -297,6 +297,7 @@ namespace AyaNova.Biz var batchResults = await ct.PartWarehouse.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults=null; foreach (PartWarehouse w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -305,6 +306,7 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } return ReportData; } diff --git a/server/AyaNova/biz/ProjectBiz.cs b/server/AyaNova/biz/ProjectBiz.cs index e3c2a742..636fe970 100644 --- a/server/AyaNova/biz/ProjectBiz.cs +++ b/server/AyaNova/biz/ProjectBiz.cs @@ -161,7 +161,7 @@ namespace AyaNova.Biz await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; - { + { var IDList = await ct.Review.AsNoTracking().Where(x => x.AType == AyaType.Project && x.ObjectId == id).Select(x => x.Id).ToListAsync(); if (IDList.Count() > 0) { @@ -286,6 +286,7 @@ namespace AyaNova.Biz var batchResults = await ct.Project.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (Project w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -295,16 +296,23 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object private async Task PopulateVizFields(Project o) - { + { if (o.ProjectOverseerId != null) - o.ProjectOverseerViz = await ct.User.AsNoTracking().Where(x => x.Id == o.ProjectOverseerId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("user", o.ProjectOverseerId)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.ProjectOverseerId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.ProjectOverseerId); + o.ProjectOverseerViz = vc.Get("user", o.ProjectOverseerId); + } } @@ -441,7 +449,7 @@ namespace AyaNova.Biz public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; diff --git a/server/AyaNova/biz/PurchaseOrderBiz.cs b/server/AyaNova/biz/PurchaseOrderBiz.cs index cc812dae..40c9dbe7 100644 --- a/server/AyaNova/biz/PurchaseOrderBiz.cs +++ b/server/AyaNova/biz/PurchaseOrderBiz.cs @@ -70,7 +70,7 @@ namespace AyaNova.Biz await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); if (populateDisplayFields) - await SetDisplayFields(newObject, false); + await PopulateVizFields(newObject, false); return newObject; } } @@ -84,7 +84,7 @@ namespace AyaNova.Biz { var ret = await ct.PurchaseOrder.Include(z => z.Items).AsNoTracking().SingleOrDefaultAsync(z => z.Id == id); if (populateDisplayFields) - await SetDisplayFields(ret, false); + await PopulateVizFields(ret, false); if (logTheGetEvent && ret != null) await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); @@ -94,7 +94,7 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //DISPLAY FIELDS // - private async Task SetDisplayFields(PurchaseOrder po, bool forReporting) + private async Task PopulateVizFields(PurchaseOrder po, bool forReporting) { //NOTE: This expects to run AFTER bizActions have been performed if (po == null) return; @@ -112,63 +112,115 @@ namespace AyaNova.Biz if (po.DropShipToCustomerId != null) { - var ds = await ct.Customer.AsNoTracking().Where(x => x.Id == po.DropShipToCustomerId).FirstOrDefaultAsync(); + var pid = po.DropShipToCustomerId; + if (!vc.Has("custname", po.DropShipToCustomerId)) + { + var ds = await ct.Customer.AsNoTracking().Where(x => x.Id == pid).FirstOrDefaultAsync(); + vc.Add(ds.Name, "custname", pid); + vc.Add(ds.Address, "custaddr", pid); + vc.Add(ds.City, "custcity", pid); + vc.Add(ds.Region, "custregion", pid); + vc.Add(ds.Country, "custcountry", pid); + vc.Add(ds.Latitude.ToString(), "custlat", pid); + vc.Add(ds.Longitude.ToString(), "custlong", pid); + vc.Add(ds.PostAddress, "custpostaddr", pid); + vc.Add(ds.PostCity, "custpostcity", pid); + vc.Add(ds.PostRegion, "custpostregion", pid); + vc.Add(ds.PostCountry, "custpostcountry", pid); + vc.Add(ds.PostCode, "custpostcode", pid); + vc.Add(ds.Phone1, "custp1", pid); + vc.Add(ds.Phone2, "custp2", pid); + vc.Add(ds.Phone3, "custp3", pid); + vc.Add(ds.Phone4, "custp4", pid); + vc.Add(ds.Phone5, "custp5", pid); + vc.Add(ds.EmailAddress, "custemail", pid); + } - po.DropShipToCustomerViz = ds.Name; + po.DropShipToCustomerViz = vc.Get("custname", pid); if (forReporting) { - po.DropShipToCustomerAddressViz = ds.Address; - po.DropShipToCustomerCityViz = ds.City; - po.DropShipToCustomerRegionViz = ds.Region; - po.DropShipToCustomerCountryViz = ds.Country; - po.DropShipToCustomerLatitudeViz = ds.Latitude; - po.DropShipToCustomerLongitudeViz = ds.Longitude; - po.DropShipToCustomerPostAddressViz = ds.PostAddress; - po.DropShipToCustomerPostCityViz = ds.PostCity; - po.DropShipToCustomerPostRegionViz = ds.PostRegion; - po.DropShipToCustomerPostCountryViz = ds.PostCountry; - po.DropShipToCustomerPostCodeViz = ds.PostCode; - po.DropShipToCustomerPhone1Viz = ds.Phone1; - po.DropShipToCustomerPhone2Viz = ds.Phone2; - po.DropShipToCustomerPhone3Viz = ds.Phone3; - po.DropShipToCustomerPhone4Viz = ds.Phone4; - po.DropShipToCustomerPhone5Viz = ds.Phone5; - po.DropShipToCustomerEmailAddressViz = ds.EmailAddress; + po.DropShipToCustomerAddressViz = vc.Get("custaddr", pid); + po.DropShipToCustomerCityViz = vc.Get("custcity", pid); + po.DropShipToCustomerRegionViz = vc.Get("custregion", pid); + po.DropShipToCustomerCountryViz = vc.Get("custcountry", pid); + po.DropShipToCustomerLatitudeViz = vc.GetAsDecimal("custlat", pid); + po.DropShipToCustomerLongitudeViz = vc.GetAsDecimal("custlong", pid); + po.DropShipToCustomerPostAddressViz = vc.Get("custpostaddr", pid); + po.DropShipToCustomerPostCityViz = vc.Get("custpostcity", pid); + po.DropShipToCustomerPostRegionViz = vc.Get("custpostregion", pid); + po.DropShipToCustomerPostCountryViz = vc.Get("custpostcountry", pid); + po.DropShipToCustomerPostCodeViz = vc.Get("custpostcode", pid); + po.DropShipToCustomerPhone1Viz = vc.Get("custp1", pid); + po.DropShipToCustomerPhone2Viz = vc.Get("custp2", pid); + po.DropShipToCustomerPhone3Viz = vc.Get("custp3", pid); + po.DropShipToCustomerPhone4Viz = vc.Get("custp4", pid); + po.DropShipToCustomerPhone5Viz = vc.Get("custp5", pid); + po.DropShipToCustomerEmailAddressViz = vc.Get("custemail", pid); } } - var vnd = await ct.Vendor.AsNoTracking().Where(x => x.Id == po.VendorId).FirstOrDefaultAsync(); - - po.VendorViz = vnd.Name; - po.VendorAlertNotesViz = vnd.AlertNotes; + var vid = po.VendorId; + if (!vc.Has("vndname", vid)) + { + var vnd = await ct.Vendor.AsNoTracking().Where(x => x.Id == vid).FirstOrDefaultAsync(); + vc.Add(vnd.Name, "vndname", vid); + vc.Add(vnd.AlertNotes, "vndalert", vid); + if (forReporting) + { + vc.Add(vnd.Address, "vndaddr", vid); + vc.Add(vnd.City, "vndcity", vid); + vc.Add(vnd.Region, "vndregion", vid); + vc.Add(vnd.Country, "vndcountry", vid); + vc.Add(vnd.Latitude.ToString(), "vndlat", vid); + vc.Add(vnd.Longitude.ToString(), "vndlong", vid); + vc.Add(vnd.PostAddress, "vndpostaddr", vid); + vc.Add(vnd.PostCity, "vndpostcity", vid); + vc.Add(vnd.PostRegion, "vndpostregion", vid); + vc.Add(vnd.PostCountry, "vndpostcountry", vid); + vc.Add(vnd.PostCode, "vndpostcode", vid); + vc.Add(vnd.Phone1, "vndp1", vid); + vc.Add(vnd.Phone2, "vndp2", vid); + vc.Add(vnd.Phone3, "vndp3", vid); + vc.Add(vnd.Phone4, "vndp4", vid); + vc.Add(vnd.Phone5, "vndp5", vid); + vc.Add(vnd.EmailAddress, "vndemail", vid); + vc.Add(vnd.Contact, "vndcontact", vid); + vc.Add(vnd.ContactNotes, "vndcontactnotes", vid); + vc.Add(vnd.AccountNumber, "vndacct", vid); + } + } + po.VendorViz = vc.Get("vndname", vid); + po.VendorAlertNotesViz = vc.Get("vndalert", vid); if (forReporting) { - po.VendorAddressViz = vnd.Address; - po.VendorCityViz = vnd.City; - po.VendorRegionViz = vnd.Region; - po.VendorCountryViz = vnd.Country; - po.VendorLatitudeViz = vnd.Latitude; - po.VendorLongitudeViz = vnd.Longitude; - po.VendorPostAddressViz = vnd.PostAddress; - po.VendorPostCityViz = vnd.PostCity; - po.VendorPostRegionViz = vnd.PostRegion; - po.VendorPostCountryViz = vnd.PostCountry; - po.VendorPostCodeViz = vnd.PostCode; - po.VendorPhone1Viz = vnd.Phone1; - po.VendorPhone2Viz = vnd.Phone2; - po.VendorPhone3Viz = vnd.Phone3; - po.VendorPhone4Viz = vnd.Phone4; - po.VendorPhone5Viz = vnd.Phone5; - po.VendorEmailAddressViz = vnd.EmailAddress; - po.VendorContactViz = vnd.Contact; - po.VendorContactNotesViz = vnd.ContactNotes; - po.VendorAccountNumberViz = vnd.AccountNumber; - var PoStatusEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( - StringUtil.TrimTypeName(typeof(PurchaseOrderStatus).ToString()), - UserTranslationId, - CurrentUserRoles); + po.VendorAddressViz = vc.Get("vndaddr", vid); + po.VendorCityViz = vc.Get("vndcity", vid); + po.VendorRegionViz = vc.Get("vndregion", vid); + po.VendorCountryViz = vc.Get("vndcountry", vid); + po.VendorLatitudeViz = vc.GetAsDecimal("vndlat", vid); + po.VendorLongitudeViz = vc.GetAsDecimal("vndlong", vid); + po.VendorPostAddressViz = vc.Get("vndpostaddr", vid); + po.VendorPostCityViz = vc.Get("vndpostcity", vid); + po.VendorPostRegionViz = vc.Get("vndpostregion", vid); + po.VendorPostCountryViz = vc.Get("vndpostcountry", vid); + po.VendorPostCodeViz = vc.Get("vndpostcode", vid); + po.VendorPhone1Viz = vc.Get("vndp1", vid); + po.VendorPhone2Viz = vc.Get("vndp2", vid); + po.VendorPhone3Viz = vc.Get("vndp3", vid); + po.VendorPhone4Viz = vc.Get("vndp4", vid); + po.VendorPhone5Viz = vc.Get("vndp5", vid); + po.VendorEmailAddressViz = vc.Get("vndemail", vid); + po.VendorContactViz = vc.Get("vndcontact", vid); + po.VendorContactNotesViz = vc.Get("vndcontactnotes", vid); + po.VendorAccountNumberViz = vc.Get("vndacct", vid); + + if (PoStatusEnumList == null) + PoStatusEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(PurchaseOrderStatus).ToString()), + UserTranslationId, + CurrentUserRoles); po.StatusViz = PoStatusEnumList.Where(x => x.Id == (long)po.Status).Select(x => x.Name).First(); } @@ -176,33 +228,73 @@ namespace AyaNova.Biz if (po.ProjectId != null) po.ProjectViz = await ct.Project.AsNoTracking().Where(x => x.Id == po.ProjectId).Select(x => x.Name).FirstOrDefaultAsync(); + if (po.ProjectId != null) + { + if (!vc.Has("projname", po.ProjectId)) + vc.Add(await ct.Project.AsNoTracking().Where(x => x.Id == po.ProjectId).Select(x => x.Name).FirstOrDefaultAsync(), "projname", po.ProjectId); + po.ProjectViz = vc.Get("projname", po.ProjectId); + } + + foreach (PurchaseOrderItem item in po.Items) { + if (!vc.Has("partname", item.PartId)) + { + var partInfo = await ct.Part.AsNoTracking().Where(x => x.Id == item.PartId).Select(x => new { x.Description, x.Name, x.UPC, x.UnitOfMeasure, x.ManufacturerNumber }).FirstOrDefaultAsync(); + vc.Add(partInfo.Name, "partname", item.PartId); + vc.Add(partInfo.Description, "partdescription", item.PartId); + vc.Add(partInfo.UPC, "partupc", item.PartId); + vc.Add(partInfo.UnitOfMeasure, "partuofm", item.PartId); + vc.Add(partInfo.ManufacturerNumber, "partmanunum", item.PartId); + } + item.PartDescriptionViz = vc.Get("partdescription", item.PartId); + item.PartNameViz = vc.Get("partname", item.PartId); + item.UpcViz = vc.Get("partupc", item.PartId); + item.PartUnitOfMeasureViz = vc.Get("partuofm", item.PartId); + item.PartManufacturerNumberViz = vc.Get("partmanunum", item.PartId); + + if (item.PartWarehouseId != 0) + { + if (!vc.Has("partwarehouse", item.PartWarehouseId)) + vc.Add(await ct.PartWarehouse.AsNoTracking().Where(x => x.Id == item.PartWarehouseId).Select(x => x.Name).FirstOrDefaultAsync(), "partwarehouse", item.PartWarehouseId); + item.WarehouseViz = vc.Get("partwarehouse", item.PartWarehouseId); + } + - var partInfo = await ct.Part.AsNoTracking().Where(x => x.Id == item.PartId).Select(x => new { PartDescriptionViz = x.Description, partNameViz = x.Name, partUPCViz=x.UPC, partunitofmeasureviz = x.UnitOfMeasure, partmanufacturernumber = x.ManufacturerNumber }).FirstOrDefaultAsync(); - item.PartDescriptionViz = partInfo.PartDescriptionViz; - item.PartNameViz = partInfo.partNameViz; - item.UpcViz=partInfo.partUPCViz; - item.PartUnitOfMeasureViz = partInfo.partunitofmeasureviz; - item.PartManufacturerNumberViz = partInfo.partmanufacturernumber; - item.WarehouseViz = await ct.PartWarehouse.AsNoTracking().Where(x => x.Id == item.PartWarehouseId).Select(x => x.Name).FirstOrDefaultAsync(); if (item.WorkOrderItemPartRequestId != null) { po.HasPartRequest = true; - item.WorkOrderItemPartRequestViz = (await WorkOrderBiz.GetWorkOrderSerialFromRelativeAsync(AyaType.WorkOrderItemPartRequest, (long)item.WorkOrderItemPartRequestId, ct)).ToString(); + + if (!vc.Has("woserial", item.WorkOrderItemPartRequestId)) + vc.Add((await WorkOrderBiz.GetWorkOrderSerialFromRelativeAsync(AyaType.WorkOrderItemPartRequest, (long)item.WorkOrderItemPartRequestId, ct)).ToString(), "woserial", item.WorkOrderItemPartRequestId); + item.WorkOrderItemPartRequestViz = vc.Get("woserial", item.WorkOrderItemPartRequestId); + if (item.PartRequestedById != null) - item.PartRequestedByViz = await ct.User.AsNoTracking().Where(x => x.Id == item.PartRequestedById).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("user", item.PartRequestedById)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == item.PartRequestedById).Select(x => x.Name).FirstOrDefaultAsync(), "user", item.PartRequestedById); + item.PartRequestedByViz = vc.Get("user", item.PartRequestedById); + } } + + TaxCode tax = null; if (item.PurchaseTaxCodeId != null) { - tax = await ct.TaxCode.AsNoTracking().Where(x => x.Id == item.PurchaseTaxCodeId).FirstOrDefaultAsync(); + if (!oc.Has("tax", item.PurchaseTaxCodeId)) + { + tax = await ct.TaxCode.AsNoTracking().FirstOrDefaultAsync(z => z.Id == item.PurchaseTaxCodeId); + oc.Add(tax, "tax", item.PurchaseTaxCodeId); + } + tax = (TaxCode)oc.Get("tax", item.PurchaseTaxCodeId); item.PurchaseTaxCodeViz = tax.Name; po.HasTaxes = true; } + + if (!string.IsNullOrWhiteSpace(item.VendorPartNumber)) po.HasVendorNumber = true; @@ -237,6 +329,9 @@ namespace AyaNova.Biz } } } + List PoStatusEnumList = null; + private VizCache vc = new VizCache(); + private ObjectCache oc = new ObjectCache(); //////////////////////////////////////////////////////////////////////////////////////////////// @@ -289,7 +384,7 @@ namespace AyaNova.Biz await SearchIndexAsync(putObject, false); await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags); await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject); - await SetDisplayFields(putObject, false); + await PopulateVizFields(putObject, false); return putObject; } } @@ -790,16 +885,20 @@ namespace AyaNova.Biz var batchResults = await ct.PurchaseOrder.Include(x => x.Items).AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (PurchaseOrder w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; - await SetDisplayFields(w, true); + await PopulateVizFields(w, true); var jo = JObject.FromObject(w); if (!JsonUtil.JTokenIsNullOrEmpty(jo["CustomFields"])) jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); + oc.Clear(); return ReportData; } diff --git a/server/AyaNova/biz/ReminderBiz.cs b/server/AyaNova/biz/ReminderBiz.cs index 41fc77c2..2d316e76 100644 --- a/server/AyaNova/biz/ReminderBiz.cs +++ b/server/AyaNova/biz/ReminderBiz.cs @@ -289,6 +289,7 @@ namespace AyaNova.Biz var batchResults = await ct.Reminder.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (Reminder w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -298,14 +299,19 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object private async Task PopulateVizFields(Reminder o) - { - o.UserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("user", o.UserId)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.UserId); + o.UserViz = vc.Get("user", o.UserId); } //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/server/AyaNova/biz/ReviewBiz.cs b/server/AyaNova/biz/ReviewBiz.cs index c687071e..cf693cc9 100644 --- a/server/AyaNova/biz/ReviewBiz.cs +++ b/server/AyaNova/biz/ReviewBiz.cs @@ -347,6 +347,7 @@ namespace AyaNova.Biz var batchResults = await ct.Review.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (Review w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -356,21 +357,34 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object public async Task PopulateVizFields(Review o) { - o.UserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync(); - o.AssignedByUserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.AssignedByUserId).Select(x => x.Name).FirstOrDefaultAsync(); - o.ReviewObjectViz = BizObjectNameFetcherDirect.Name(o.AType, o.ObjectId, UserTranslationId, ct); + if (!vc.Has("user", o.UserId)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.UserId); + o.UserViz = vc.Get("user", o.UserId); + + if (!vc.Has("user", o.AssignedByUserId)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.AssignedByUserId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.AssignedByUserId); + o.AssignedByUserViz = vc.Get("user", o.AssignedByUserId); + + if (!vc.Has($"b{o.AType}{o.ObjectId}")) + vc.Add(BizObjectNameFetcherDirect.Name((AyaType)o.AType, (long)o.ObjectId, UserTranslationId, ct), $"b{o.AType}{o.ObjectId}"); + o.ReviewObjectViz = vc.Get($"b{o.AType}{o.ObjectId}"); + if (o.ReviewObjectViz.StartsWith("LT:")) { - o.ReviewObjectViz = await Translate(o.ReviewObjectViz); + if (!vc.Has(o.ReviewObjectViz)) + vc.Add(await Translate(o.ReviewObjectViz), o.ReviewObjectViz); + o.ReviewObjectViz = vc.Get(o.ReviewObjectViz); } - } diff --git a/server/AyaNova/biz/ServiceRateBiz.cs b/server/AyaNova/biz/ServiceRateBiz.cs index c159c66e..53d09a4a 100644 --- a/server/AyaNova/biz/ServiceRateBiz.cs +++ b/server/AyaNova/biz/ServiceRateBiz.cs @@ -314,6 +314,7 @@ namespace AyaNova.Biz var batchResults = await ct.ServiceRate.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults=null; foreach (ServiceRate w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -322,6 +323,7 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } return ReportData; } diff --git a/server/AyaNova/biz/TaskGroupBiz.cs b/server/AyaNova/biz/TaskGroupBiz.cs index 127bd4e2..e250d0c8 100644 --- a/server/AyaNova/biz/TaskGroupBiz.cs +++ b/server/AyaNova/biz/TaskGroupBiz.cs @@ -298,6 +298,7 @@ namespace AyaNova.Biz var batchResults = await ct.TaskGroup.AsNoTracking().Include(z => z.Items).Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults=null; foreach (TaskGroup w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -306,6 +307,7 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } return ReportData; } diff --git a/server/AyaNova/biz/TaxCodeBiz.cs b/server/AyaNova/biz/TaxCodeBiz.cs index 68e7a4ce..0dfe79df 100644 --- a/server/AyaNova/biz/TaxCodeBiz.cs +++ b/server/AyaNova/biz/TaxCodeBiz.cs @@ -343,6 +343,7 @@ namespace AyaNova.Biz var batchResults = await ct.TaxCode.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults=null; foreach (TaxCode w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -351,6 +352,7 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } return ReportData; } diff --git a/server/AyaNova/biz/TravelRateBiz.cs b/server/AyaNova/biz/TravelRateBiz.cs index 0b22e896..e0b0b2bb 100644 --- a/server/AyaNova/biz/TravelRateBiz.cs +++ b/server/AyaNova/biz/TravelRateBiz.cs @@ -310,6 +310,7 @@ namespace AyaNova.Biz var batchResults = await ct.TravelRate.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults=null; foreach (TravelRate w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -318,6 +319,7 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } return ReportData; } diff --git a/server/AyaNova/biz/UnitBiz.cs b/server/AyaNova/biz/UnitBiz.cs index c79361d0..f60517e3 100644 --- a/server/AyaNova/biz/UnitBiz.cs +++ b/server/AyaNova/biz/UnitBiz.cs @@ -65,15 +65,15 @@ namespace AyaNova.Biz // internal async Task CustomerCreateAsync(CustomerPostUnit postObject) { - - Unit newObject=new Unit(); - newObject.Active=true; - newObject.Notes="This unit was added by a Customer"; - newObject.Serial=postObject.Serial; - newObject.Description=postObject.Description; - newObject.CustomerId=postObject.CustomerId; - newObject.UnitModelId=postObject.UnitModelId; + + Unit newObject = new Unit(); + newObject.Active = true; + newObject.Notes = "This unit was added by a Customer"; + newObject.Serial = postObject.Serial; + newObject.Description = postObject.Description; + newObject.CustomerId = postObject.CustomerId; + newObject.UnitModelId = postObject.UnitModelId; await ValidateAsync(newObject, null); if (HasErrors) return null; @@ -159,7 +159,7 @@ namespace AyaNova.Biz await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; - { + { var IDList = await ct.Review.AsNoTracking().Where(x => x.AType == AyaType.Unit && x.ObjectId == id).Select(x => x.Id).ToListAsync(); if (IDList.Count() > 0) { @@ -248,7 +248,7 @@ namespace AyaNova.Biz //(two different manufacturers products could have the same serial easily, but it's less likely for two different units of the same unitmodel) // if (!PropertyHasErrors("Serial")) - { + { //Use Any command is efficient way to check existance, it doesn't return the record, just a true or false if (await ct.Unit.AnyAsync(z => z.Serial == proposedObj.Serial && z.UnitModelId == proposedObj.UnitModelId && z.Id != proposedObj.Id)) { @@ -305,6 +305,7 @@ namespace AyaNova.Biz var batchResults = await ct.Unit.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (Unit w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -314,28 +315,56 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object private async Task PopulateVizFields(Unit o) { - o.CustomerViz = await ct.Customer.AsNoTracking().Where(x => x.Id == o.CustomerId).Select(x => x.Name).FirstOrDefaultAsync(); + if (!vc.Has("customer", o.CustomerId)) + vc.Add(await ct.Customer.AsNoTracking().Where(x => x.Id == o.CustomerId).Select(x => x.Name).FirstOrDefaultAsync(), "customer", o.CustomerId); + o.CustomerViz = vc.Get("customer", o.CustomerId); + if (o.UnitModelId != null) - o.UnitModelNameViz = await ct.UnitModel.AsNoTracking().Where(x => x.Id == o.UnitModelId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("unitmodel", o.UnitModelId)) + vc.Add(await ct.UnitModel.AsNoTracking().Where(x => x.Id == o.UnitModelId).Select(x => x.Name).FirstOrDefaultAsync(), "unitmodel", o.UnitModelId); + o.UnitModelNameViz = vc.Get("unitmodel", o.UnitModelId); + } if (o.ParentUnitId != null) - o.ParentUnitViz = await ct.Unit.AsNoTracking().Where(x => x.Id == o.ParentUnitId).Select(x => x.Serial).FirstOrDefaultAsync(); + { + if (!vc.Has("unitserial", o.ParentUnitId)) + vc.Add(await ct.Unit.AsNoTracking().Where(x => x.Id == o.ParentUnitId).Select(x => x.Serial).FirstOrDefaultAsync(), "unitserial", o.ParentUnitId); + o.ParentUnitViz = vc.Get("unitserial", o.ParentUnitId); + } if (o.ReplacedByUnitId != null) - o.ReplacedByUnitViz = await ct.Unit.AsNoTracking().Where(x => x.Id == o.ReplacedByUnitId).Select(x => x.Serial).FirstOrDefaultAsync(); + { + if (!vc.Has("unitserial", o.ReplacedByUnitId)) + vc.Add(await ct.Unit.AsNoTracking().Where(x => x.Id == o.ReplacedByUnitId).Select(x => x.Serial).FirstOrDefaultAsync(), "unitserial", o.ReplacedByUnitId); + o.ReplacedByUnitViz = vc.Get("unitserial", o.ReplacedByUnitId); + } if (o.PurchasedFromVendorId != null) - o.PurchasedFromVendorViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == o.PurchasedFromVendorId).Select(x => x.Name).FirstOrDefaultAsync(); - + { + if (!vc.Has("vendorname", o.PurchasedFromVendorId)) + vc.Add(await ct.Vendor.AsNoTracking().Where(x => x.Id == o.PurchasedFromVendorId).Select(x => x.Name).FirstOrDefaultAsync(), "vendorname", o.PurchasedFromVendorId); + o.PurchasedFromVendorViz = vc.Get("vendorname", o.PurchasedFromVendorId); + } + 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); + } if (o.Metered) { diff --git a/server/AyaNova/biz/UnitMeterReadingBiz.cs b/server/AyaNova/biz/UnitMeterReadingBiz.cs index e38c8252..d4abf434 100644 --- a/server/AyaNova/biz/UnitMeterReadingBiz.cs +++ b/server/AyaNova/biz/UnitMeterReadingBiz.cs @@ -154,6 +154,7 @@ namespace AyaNova.Biz var batchResults = await ct.UnitMeterReading.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (UnitMeterReading w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -161,17 +162,27 @@ namespace AyaNova.Biz var jo = JObject.FromObject(w); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object private async Task PopulateVizFields(UnitMeterReading o) { - o.UnitViz = await ct.Unit.AsNoTracking().Where(x => x.Id == o.UnitId).Select(x => x.Serial).FirstOrDefaultAsync(); + if (!vc.Has("unitserial", o.UnitId)) + vc.Add(await ct.Unit.AsNoTracking().Where(x => x.Id == o.UnitId).Select(x => x.Serial).FirstOrDefaultAsync(), "unitserial", o.UnitId); + o.UnitViz = vc.Get("unitserial", o.UnitId); + if (o.WorkOrderItemUnitId != null) - o.WorkOrderViz = (await WorkOrderBiz.GetWorkOrderSerialFromRelativeAsync(AyaType.WorkOrderItemUnit, (long)o.WorkOrderItemUnitId, ct)).ToString(); + { + if (!vc.Has("woserial", o.WorkOrderItemUnitId)) + vc.Add((await WorkOrderBiz.GetWorkOrderSerialFromRelativeAsync(AyaType.WorkOrderItemUnit, (long)o.WorkOrderItemUnitId, ct)).ToString(), "woserial", o.WorkOrderItemUnitId); + o.WorkOrderViz = vc.Get("woserial", o.WorkOrderItemUnitId); + } } @@ -199,7 +210,7 @@ namespace AyaNova.Biz ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); - + //SPECIFIC EVENTS FOR THIS OBJECT //UnitMeterReadingMultipleExceeded event diff --git a/server/AyaNova/biz/UnitModelBiz.cs b/server/AyaNova/biz/UnitModelBiz.cs index 697e7dcb..298ff182 100644 --- a/server/AyaNova/biz/UnitModelBiz.cs +++ b/server/AyaNova/biz/UnitModelBiz.cs @@ -213,7 +213,7 @@ namespace AyaNova.Biz { if (obj != null) searchParams.AddText(obj.Notes) - .AddText(obj.Name) + .AddText(obj.Name) .AddText(obj.UPC) .AddText(obj.WarrantyTerms) .AddText(obj.Wiki) @@ -232,7 +232,7 @@ namespace AyaNova.Biz bool isNew = currentObj == null; - //Name required + //Name required if (string.IsNullOrWhiteSpace(proposedObj.Name)) AddError(ApiErrorCode.VALIDATION_REQUIRED, "Name"); @@ -246,7 +246,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_NOT_UNIQUE, "Name"); } } - + //Any form customizations to validate? var FormCustomization = await ct.FormCustom.AsNoTracking().SingleOrDefaultAsync(z => z.FormKey == AyaType.UnitModel.ToString()); @@ -288,6 +288,7 @@ namespace AyaNova.Biz var batchResults = await ct.UnitModel.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults = null; foreach (UnitModel w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -297,15 +298,22 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object private async Task PopulateVizFields(UnitModel o) { if (o.VendorId != null) - o.VendorViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == o.VendorId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("vendorname", o.VendorId)) + vc.Add(await ct.Vendor.AsNoTracking().Where(x => x.Id == o.VendorId).Select(x => x.Name).FirstOrDefaultAsync(), "vendorname", o.VendorId); + o.VendorViz = vc.Get("vendorname", o.VendorId); + } } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -439,7 +447,7 @@ namespace AyaNova.Biz public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; diff --git a/server/AyaNova/biz/UserBiz.cs b/server/AyaNova/biz/UserBiz.cs index 38f441dd..958ccd21 100644 --- a/server/AyaNova/biz/UserBiz.cs +++ b/server/AyaNova/biz/UserBiz.cs @@ -1035,14 +1035,9 @@ namespace AyaNova.Biz //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; - //cache frequent viz data - //usertypes - var UserTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( - StringUtil.TrimTypeName(typeof(UserType).ToString()), - UserTranslationId, - CurrentUserRoles); - //foreach (User w in orderedList) + + batchResults = null; foreach (var w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -1056,24 +1051,48 @@ namespace AyaNova.Biz ReportData.Add(jo); } + orderedList = null; } + vc.Clear(); return ReportData; } + private VizCache vc = new VizCache(); //populate viz fields from provided object private async Task PopulateVizFields(User o, List userTypesEnumList) { + if (userTypesEnumList == null) + userTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(UserType).ToString()), + UserTranslationId, + CurrentUserRoles); + if (o.CustomerId != null) - o.CustomerViz = await ct.Customer.AsNoTracking().Where(x => x.Id == o.CustomerId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("customer", o.CustomerId)) + vc.Add(await ct.Customer.AsNoTracking().Where(x => x.Id == o.CustomerId).Select(x => x.Name).FirstOrDefaultAsync(), "customer", o.CustomerId); + o.CustomerViz = vc.Get("customer", o.CustomerId); + } 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.VendorId != null) - o.VendorViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == o.VendorId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("vendorname", o.VendorId)) + vc.Add(await ct.Vendor.AsNoTracking().Where(x => x.Id == o.VendorId).Select(x => x.Name).FirstOrDefaultAsync(), "vendorname", o.VendorId); + o.VendorViz = vc.Get("vendorname", o.VendorId); + } o.UserTypeViz = userTypesEnumList.Where(x => x.Id == (long)o.UserType).Select(x => x.Name).First(); } + List UserTypesEnumList = null; //////////////////////////////////////////////////////////////////////////////////////////////// // IMPORT EXPORT diff --git a/server/AyaNova/biz/VendorBiz.cs b/server/AyaNova/biz/VendorBiz.cs index 60a61bfb..ed3a4888 100644 --- a/server/AyaNova/biz/VendorBiz.cs +++ b/server/AyaNova/biz/VendorBiz.cs @@ -327,6 +327,7 @@ namespace AyaNova.Biz var batchResults = await ct.Vendor.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); //order the results back into original var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + batchResults=null; foreach (Vendor w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -335,6 +336,7 @@ namespace AyaNova.Biz jo["CustomFields"] = JObject.Parse((string)jo["CustomFields"]); ReportData.Add(jo); } + orderedList=null; } return ReportData; }