/// <summary> /// Recalculates seniority for a specific local area and equipment type /// </summary> public static void RecalculateSeniority(int?localAreaId, int?districtEquipmentTypeId, DbAppContext context, string seniorityScoringRules) { // check if the local area exists bool exists = context.HetLocalArea.Any(a => a.LocalAreaId == localAreaId); if (!exists) { throw new ArgumentException("Local Area is invalid"); } // check if the equipment type exists exists = context.HetDistrictEquipmentType .Any(a => a.DistrictEquipmentTypeId == districtEquipmentTypeId); if (!exists) { throw new ArgumentException("District Equipment Type is invalid"); } // get the local area HetLocalArea localArea = context.HetLocalArea.AsNoTracking() .First(a => a.LocalAreaId == localAreaId); // get the equipment type HetDistrictEquipmentType districtEquipmentType = context.HetDistrictEquipmentType.AsNoTracking() .Include(x => x.EquipmentType) .First(x => x.DistrictEquipmentTypeId == districtEquipmentTypeId); // recalculate the seniority list SeniorityListHelper.CalculateSeniorityList(localArea.LocalAreaId, districtEquipmentType.DistrictEquipmentTypeId, context, seniorityScoringRules); }
/// <summary> /// Recalculate the block assignment for each piece of equipment /// </summary> /// <param name="performContext"></param> /// <param name="seniorityScoringRules"></param> /// <param name="dbContext"></param> /// <param name="systemId"></param> public static void ProcessBlocks(PerformContext performContext, string seniorityScoringRules, DbAppContext dbContext, string systemId) { try { performContext.WriteLine("*** Recalculating Equipment Block Assignment ***"); Debug.WriteLine("Recalculating Equipment Block Assignment"); int ii = 0; string _oldTableProgress = "BlockAssignment_Progress"; string _newTable = "BlockAssignment"; // check if the block assignment has already been completed int startPoint = ImportUtility.CheckInterMapForStartPoint(dbContext, _oldTableProgress, BcBidImport.SigId, _newTable); if (startPoint == BcBidImport.SigId) // this means the assignment job is complete { performContext.WriteLine("*** Recalculating Equipment Block Assignment is complete from the former process ***"); return; } // ************************************************************ // cleanup old block assignment status records // ************************************************************ List <HetImportMap> importMapList = dbContext.HetImportMap .Where(x => x.OldTable == _oldTableProgress && x.NewTable == _newTable) .ToList(); foreach (HetImportMap importMap in importMapList) { dbContext.HetImportMap.Remove(importMap); } dbContext.SaveChangesForImport(); // ************************************************************ // get processing rules // ************************************************************ SeniorityScoringRules scoringRules = new SeniorityScoringRules(seniorityScoringRules); // ************************************************************ // get all local areas // (using active equipment to minimize the results) // ************************************************************ List <HetLocalArea> localAreas = dbContext.HetEquipment.AsNoTracking() .Include(x => x.EquipmentStatusType) .Include(x => x.LocalArea) .Where(x => x.EquipmentStatusType.EquipmentStatusTypeCode == HetEquipment.StatusApproved && x.ArchiveCode == "N") .Select(x => x.LocalArea) .Distinct() .ToList(); // ************************************************************************ // iterate the data and update the assignment blocks // (seniority is already calculated) // ************************************************************************ Debug.WriteLine("Recalculating Equipment Block Assignment - Local Area Record Count: " + localAreas.Count); foreach (HetLocalArea localArea in localAreas) { IQueryable <HetDistrictEquipmentType> equipmentTypes = dbContext.HetEquipment.AsNoTracking() .Include(x => x.EquipmentStatusType) .Include(x => x.DistrictEquipmentType) .Where(x => x.EquipmentStatusType.EquipmentStatusTypeCode == HetEquipment.StatusApproved && x.ArchiveCode == "N" && x.LocalArea.LocalAreaId == localArea.LocalAreaId) .Select(x => x.DistrictEquipmentType) .Distinct(); foreach (HetDistrictEquipmentType districtEquipmentType in equipmentTypes) { // get the associated equipment type HetEquipmentType equipmentTypeRecord = dbContext.HetEquipmentType.AsNoTracking() .FirstOrDefault(x => x.EquipmentTypeId == districtEquipmentType.EquipmentTypeId); if (equipmentTypeRecord == null) { throw new DataException(string.Format("Invalid District Equipment Type. No associated Equipment Type record (District Equipment Id: {0})", districtEquipmentType.DistrictEquipmentTypeId)); } // get rules int blockSize = equipmentTypeRecord.IsDumpTruck ? scoringRules.GetBlockSize("DumpTruck") : scoringRules.GetBlockSize(); int totalBlocks = equipmentTypeRecord.IsDumpTruck ? scoringRules.GetTotalBlocks("DumpTruck") : scoringRules.GetTotalBlocks(); // assign blocks SeniorityListHelper.AssignBlocks(localArea.LocalAreaId, districtEquipmentType.DistrictEquipmentTypeId, blockSize, totalBlocks, dbContext, false); // save change to database if (ii++ % 100 == 0) { try { Debug.WriteLine("Recalculating Equipment Block Assignment - Index: " + ii); ImportUtility.AddImportMapForProgress(dbContext, _oldTableProgress, ii.ToString(), BcBidImport.SigId, _newTable); dbContext.SaveChangesForImport(); } catch (Exception e) { performContext.WriteLine("Error saving data " + e.Message); } } } } // ************************************************************ // save final set of updates // ************************************************************ try { performContext.WriteLine("*** Recalculating Equipment Block Assignment is Done ***"); Debug.WriteLine("Recalculating Equipment Block Assignment is Done"); ImportUtility.AddImportMapForProgress(dbContext, _oldTableProgress, BcBidImport.SigId.ToString(), BcBidImport.SigId, _newTable); dbContext.SaveChangesForImport(); } catch (Exception e) { string temp = string.Format("Error saving data (Record: {0}): {1}", ii, e.Message); performContext.WriteLine(temp); throw new DataException(temp); } } catch (Exception e) { performContext.WriteLine("*** ERROR ***"); performContext.WriteLine(e.ToString()); throw; } }