diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index b656be19..e503c29f 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -515,7 +515,7 @@ MULTIPLE discount / markup ITEMS vc.Clear(); return ReportData; } - //request cache for viz fields + private VizCache vc = new VizCache(); diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index acb9f0d0..47cf7d57 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -364,7 +364,9 @@ namespace AyaNova.Biz } vc.Clear(); return ReportData; - } + } + private VizCache vc = new VizCache(); + //populate viz fields from provided object private async Task PopulateVizFields(Customer o) @@ -412,9 +414,7 @@ namespace AyaNova.Biz } } - //request cache for viz fields - private VizCache vc = new VizCache(); - + //////////////////////////////////////////////////////////////////////////////////////////////// // IMPORT EXPORT diff --git a/server/AyaNova/biz/CustomerNoteBiz.cs b/server/AyaNova/biz/CustomerNoteBiz.cs index 72addeba..6c5158b8 100644 --- a/server/AyaNova/biz/CustomerNoteBiz.cs +++ b/server/AyaNova/biz/CustomerNoteBiz.cs @@ -219,7 +219,7 @@ namespace AyaNova.Biz o.UserViz = vc.Get("user", o.UserId); } - //request cache for viz fields + private VizCache vc = new VizCache(); diff --git a/server/AyaNova/biz/CustomerServiceRequestBiz.cs b/server/AyaNova/biz/CustomerServiceRequestBiz.cs index d6ca28f3..4392d432 100644 --- a/server/AyaNova/biz/CustomerServiceRequestBiz.cs +++ b/server/AyaNova/biz/CustomerServiceRequestBiz.cs @@ -318,7 +318,7 @@ namespace AyaNova.Biz vc.Clear(); return ReportData; } - //request cache for viz fields + private VizCache vc = new VizCache(); //populate viz fields from provided object diff --git a/server/AyaNova/biz/HeadOfficeBiz.cs b/server/AyaNova/biz/HeadOfficeBiz.cs index 79dd3d76..0ba0d750 100644 --- a/server/AyaNova/biz/HeadOfficeBiz.cs +++ b/server/AyaNova/biz/HeadOfficeBiz.cs @@ -313,7 +313,7 @@ namespace AyaNova.Biz vc.Clear(); return ReportData; } - //request cache for viz fields + private VizCache vc = new VizCache(); //populate viz fields from provided object diff --git a/server/AyaNova/biz/LoanUnitBiz.cs b/server/AyaNova/biz/LoanUnitBiz.cs index e0d3040c..400bf7c1 100644 --- a/server/AyaNova/biz/LoanUnitBiz.cs +++ b/server/AyaNova/biz/LoanUnitBiz.cs @@ -161,7 +161,7 @@ namespace AyaNova.Biz ValidateCanDelete(dbObject); if (HasErrors) return false; - { + { var IDList = await ct.Review.AsNoTracking().Where(x => x.AType == AyaType.LoanUnit && x.ObjectId == id).Select(x => x.Id).ToListAsync(); if (IDList.Count() > 0) { @@ -217,7 +217,7 @@ namespace AyaNova.Biz .AddText(obj.Name) .AddText(obj.Wiki) .AddText(obj.Tags) - .AddText(obj.Serial) + .AddText(obj.Serial) .AddCustomFields(obj.CustomFields); } @@ -285,6 +285,7 @@ namespace AyaNova.Biz var batchResults = await ct.LoanUnit.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 (LoanUnit w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -294,15 +295,26 @@ 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(LoanUnit o) { + if (o.UnitId != null) - 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); + } + } @@ -440,7 +452,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/MemoBiz.cs b/server/AyaNova/biz/MemoBiz.cs index ff8674e2..4e40ad40 100644 --- a/server/AyaNova/biz/MemoBiz.cs +++ b/server/AyaNova/biz/MemoBiz.cs @@ -147,7 +147,7 @@ namespace AyaNova.Biz ValidateCanDelete(dbObject); if (HasErrors) return false; - { + { var IDList = await ct.Review.AsNoTracking().Where(x => x.AType == AyaType.Memo && x.ObjectId == id).Select(x => x.Id).ToListAsync(); if (IDList.Count() > 0) { @@ -215,7 +215,7 @@ namespace AyaNova.Biz { //skip validation if seeding - if(ServerBootConfig.SEEDING ) return; + if (ServerBootConfig.SEEDING) return; //Only can send a memo from your own account //with bypass for import if superuser @@ -290,6 +290,7 @@ namespace AyaNova.Biz var batchResults = await ct.Memo.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 (Memo w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -299,18 +300,29 @@ 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(Memo o) { if (o.ToId != null) - o.ToViz = await ct.User.AsNoTracking().Where(x => x.Id == o.ToId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("user", o.ToId)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.ToId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.ToId); + o.ToViz = vc.Get("user", o.ToId); + } + if (o.FromId != null) - o.FromViz = await ct.User.AsNoTracking().Where(x => x.Id == o.FromId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("user", o.FromId)) + vc.Add(await ct.User.AsNoTracking().Where(x => x.Id == o.FromId).Select(x => x.Name).FirstOrDefaultAsync(), "user", o.FromId); + o.FromViz = vc.Get("user", o.FromId); + } } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -448,7 +460,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/PMBiz.cs b/server/AyaNova/biz/PMBiz.cs index 2dcb8f0a..581c5b45 100644 --- a/server/AyaNova/biz/PMBiz.cs +++ b/server/AyaNova/biz/PMBiz.cs @@ -58,7 +58,7 @@ namespace AyaNova.Biz AuthorizationRoles.BizAdmin, UserType.NotService);//picked not service arbitrarily, probably a non-factor } - //request cache for viz fields + private VizCache vc = new VizCache(); private ObjectCache oc = new ObjectCache(); diff --git a/server/AyaNova/biz/PartAssemblyBiz.cs b/server/AyaNova/biz/PartAssemblyBiz.cs index 108c1355..c1f2c23e 100644 --- a/server/AyaNova/biz/PartAssemblyBiz.cs +++ b/server/AyaNova/biz/PartAssemblyBiz.cs @@ -113,7 +113,7 @@ namespace AyaNova.Biz { var partIdList = ret.Items.Select(z => z.PartId).ToArray(); var PickList = PickListFactory.GetAyaPickList(AyaType.Part); - var partNames = await PickListFetcher.GetResponseAsync(PickList, null, null, true, partIdList, null, ct, null,string.Empty); + var partNames = await PickListFetcher.GetResponseAsync(PickList, null, null, true, partIdList, null, ct, null, string.Empty); foreach (PartAssemblyItem pai in ret.Items) { pai.PartNameViz = partNames.Where(z => z.Id == pai.PartId).First().Name; @@ -184,7 +184,7 @@ namespace AyaNova.Biz ValidateCanDelete(dbObject); if (HasErrors) return false; - { + { var IDList = await ct.Review.AsNoTracking().Where(x => x.AType == AyaType.PartAssembly && x.ObjectId == id).Select(x => x.Id).ToListAsync(); if (IDList.Count() > 0) { @@ -338,6 +338,7 @@ namespace AyaNova.Biz var batchResults = await ct.PartAssembly.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 (PartAssembly w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -347,15 +348,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(PartAssembly pa) { foreach (PartAssemblyItem o in pa.Items) - o.PartNameViz = await ct.Part.AsNoTracking().Where(x => x.Id == o.PartId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("part", o.PartId)) + vc.Add(await ct.Part.AsNoTracking().Where(x => x.Id == o.PartId).Select(x => x.Name).FirstOrDefaultAsync(), "part", o.PartId); + o.PartNameViz = vc.Get("part", o.PartId); + } } @@ -492,7 +501,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/PartBiz.cs b/server/AyaNova/biz/PartBiz.cs index 6646998c..ec353e35 100644 --- a/server/AyaNova/biz/PartBiz.cs +++ b/server/AyaNova/biz/PartBiz.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.Part && x.ObjectId == id).Select(x => x.Id).ToListAsync(); if (IDList.Count() > 0) { @@ -512,6 +512,7 @@ namespace AyaNova.Biz var batchResults = await ct.Part.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 (Part w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; @@ -521,21 +522,37 @@ 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(Part o) { if (o.WholeSalerId != null) - o.WholeSalerViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == o.WholeSalerId).Select(x => x.Name).FirstOrDefaultAsync(); - if (o.ManufacturerId != null) - o.ManufacturerViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == o.ManufacturerId).Select(x => x.Name).FirstOrDefaultAsync(); - if (o.AlternativeWholeSalerId != null) - o.AlternativeWholeSalerViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == o.AlternativeWholeSalerId).Select(x => x.Name).FirstOrDefaultAsync(); + { + if (!vc.Has("vendorname", o.WholeSalerId)) + vc.Add(await ct.Vendor.AsNoTracking().Where(x => x.Id == o.WholeSalerId).Select(x => x.Name).FirstOrDefaultAsync(), "vendorname", o.WholeSalerId); + o.WholeSalerViz = vc.Get("vendorname", o.WholeSalerId); + } + + if (o.ManufacturerId != null) + { + if (!vc.Has("vendorname", o.ManufacturerId)) + vc.Add(await ct.Vendor.AsNoTracking().Where(x => x.Id == o.ManufacturerId).Select(x => x.Name).FirstOrDefaultAsync(), "vendorname", o.ManufacturerId); + o.ManufacturerViz = vc.Get("vendorname", o.ManufacturerId); + } + + if (o.AlternativeWholeSalerId != null) + { + if (!vc.Has("vendorname", o.AlternativeWholeSalerId)) + vc.Add(await ct.Vendor.AsNoTracking().Where(x => x.Id == o.AlternativeWholeSalerId).Select(x => x.Name).FirstOrDefaultAsync(), "vendorname", o.AlternativeWholeSalerId); + o.AlternativeWholeSalerViz = vc.Get("vendorname", o.AlternativeWholeSalerId); + } - //if there turns out to be a situation where there are just too many serials slowing down the reporting always //can look at tying this to the report data list column selection to check if serials are selected to display or not o.PartSerialsViz = string.Join(", ", (await ct.PartSerial.Where(z => z.PartId == o.Id).OrderBy(z => z.Serial).Select(z => z.Serial).ToListAsync())); diff --git a/server/AyaNova/biz/PartInventoryBiz.cs b/server/AyaNova/biz/PartInventoryBiz.cs index d4b60660..22da0c77 100644 --- a/server/AyaNova/biz/PartInventoryBiz.cs +++ b/server/AyaNova/biz/PartInventoryBiz.cs @@ -259,53 +259,76 @@ namespace AyaNova.Biz { var idList = dataListSelectedRequest.SelectedRowIds; JArray ReportData = new JArray(); - while (idList.Any()) + using (var command = ct.Database.GetDbConnection().CreateCommand()) { - var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); - idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); - //query for this batch, comes back in db natural order unfortunately - var batchResults = await ct.PartInventory.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; - - //cache frequent viz data - var AyaTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( - StringUtil.TrimTypeName(typeof(AyaType).ToString()), - UserTranslationId, - CurrentUserRoles); - using (var command = ct.Database.GetDbConnection().CreateCommand()) + ct.Database.OpenConnection(); + while (idList.Any()) { - ct.Database.OpenConnection(); - + var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); + idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); + //query for this batch, comes back in db natural order unfortunately + var batchResults = await ct.PartInventory.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 (PartInventory w in orderedList) { if (!ReportRenderManager.KeepGoing(jobId)) return null; - await PopulateVizFields(w, AyaTypesEnumList, command); + await PopulateVizFields(w, command); 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; } + private VizCache vc = new VizCache(); //populate viz fields from provided object - private async Task PopulateVizFields(PartInventory o, List ayaTypesEnumList, System.Data.Common.DbCommand cmd) + private async Task PopulateVizFields(PartInventory o, System.Data.Common.DbCommand cmd) { - var partInfo = await ct.Part.AsNoTracking().Where(x => x.Id == o.PartId).Select(x => new { PartDescriptionViz = x.Description, partNameViz = x.Name, partUPCViz = x.UPC }).FirstOrDefaultAsync(); - o.PartDescriptionViz = partInfo.PartDescriptionViz; - o.PartNameViz = partInfo.partNameViz; - o.PartUpcViz = partInfo.partUPCViz; + if (ayaTypesEnumList == null) + ayaTypesEnumList = await AyaNova.Api.Controllers.EnumListController.GetEnumList( + StringUtil.TrimTypeName(typeof(AyaType).ToString()), + UserTranslationId, + CurrentUserRoles); + + if (!vc.Has("partname", o.PartId)) + { + var partInfo = await ct.Part.AsNoTracking().Where(x => x.Id == o.PartId).Select(x => new { x.Description, x.Name, x.UPC }).FirstOrDefaultAsync(); + vc.Add(partInfo.Name, "partname", o.PartId); + vc.Add(partInfo.Description, "partdescription", o.PartId); + vc.Add(partInfo.UPC, "partupc", o.PartId); + } + o.PartDescriptionViz = vc.Get("partdescription", o.PartId); + o.PartNameViz = vc.Get("partname", o.PartId); + o.PartUpcViz = vc.Get("partupc", o.PartId); + + if (o.PartWarehouseId != 0) + { + if (!vc.Has("partwarehouse", o.PartWarehouseId)) + vc.Add(await ct.PartWarehouse.AsNoTracking().Where(x => x.Id == o.PartWarehouseId).Select(x => x.Name).FirstOrDefaultAsync(), "partwarehouse", o.PartWarehouseId); + o.PartWarehouseViz = vc.Get("partwarehouse", o.PartWarehouseId); + } - o.PartWarehouseViz = await ct.PartWarehouse.AsNoTracking().Where(x => x.Id == o.PartWarehouseId).Select(x => x.Name).FirstOrDefaultAsync(); if (o.SourceType != null) o.SourceTypeViz = ayaTypesEnumList.Where(x => x.Id == (long)o.SourceType).Select(x => x.Name).First(); + if (o.SourceType != null && o.SourceId != null) o.SourceViz = BizObjectNameFetcherDirect.Name((AyaType)o.SourceType, (long)o.SourceId, UserTranslationId, cmd); + if (o.SourceType != null && o.SourceId != null) + { + if (!vc.Has($"b{o.SourceType}{o.SourceId}")) + vc.Add(BizObjectNameFetcherDirect.Name((AyaType)o.SourceType, (long)o.SourceId, UserTranslationId, cmd), $"b{o.SourceType}{o.SourceId}"); + o.SourceViz = vc.Get($"b{o.SourceType}{o.SourceId}"); + } } + private List ayaTypesEnumList = null; //////////////////////////////////////////////////////////////////////////////////////////////// // IMPORT EXPORT diff --git a/server/AyaNova/biz/QuoteBiz.cs b/server/AyaNova/biz/QuoteBiz.cs index 7e6938bb..874e354d 100644 --- a/server/AyaNova/biz/QuoteBiz.cs +++ b/server/AyaNova/biz/QuoteBiz.cs @@ -61,7 +61,7 @@ namespace AyaNova.Biz } - //request cache for viz fields + private VizCache vc = new VizCache(); private ObjectCache oc = new ObjectCache(); diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index b95b8895..8ec35bec 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -61,7 +61,7 @@ namespace AyaNova.Biz UserType.Service); } - //request cache for viz fields + private VizCache vc = new VizCache(); private ObjectCache oc = new ObjectCache();