/// <summary> /// /// </summary> /// <param name="job"></param> /// <param name="currentState">Required some of its Relations loaded</param> /// <param name="parentStep"></param> internal SmartStep(SmartJob job, State currentState, SmartStep parentStep) { _job = job; State = currentState; ParentSteps = new List<SmartStep>(); if (parentStep != null) if (parentStep.State.StateType == Common.StateType.Mid) ParentSteps.Add(parentStep); }
/// <summary> /// Reserves a setup in manager (FindNextFreeSpace will consider this setup as a reserved area) /// </summary> /// <param name="newSetup">reserved smartRange from previous step which has newSetup type</param> /// <param name="job"></param> internal void Reserve(SmartRange newSetup, SmartJob job) { var reserve = _reserve.FirstOrDefault(x => x.Key == newSetup.StationId).Value; var range = SmartRange.NewReserve(newSetup.StartDT, newSetup.DurationSeconds, newSetup.WarmupId, newSetup.ChangeoverId); //insert to reserve (but maintain its order) var insertionPoint = reserve.FirstOrDefault(x => x.StartDT > newSetup.StartDT); if (insertionPoint == null) reserve.Add(range); else { int index = reserve.IndexOf(insertionPoint); reserve.Insert(index, range); } }
/// <summary> /// Reserves a task in manager (FindNextFreeSpace will consider this task as a reserved area) /// </summary> /// <param name="startTime"></param> /// <param name="stateStation"></param> /// <param name="job"></param> internal void Reserve(DateTime startTime, Model.StateStation stateStation, SmartJob job) { var reserve = _reserve.FirstOrDefault(x => x.Key == stateStation.Station.Id).Value; int durationSeconds = (int)Math.Ceiling(job.Quantity * stateStation.MaxCycleTime); var range = SmartRange.NewReserve(startTime, durationSeconds, stateStation); //insert to reserve (but maintain its order) var insertionPoint = reserve.FirstOrDefault(x => x.StartDT > startTime); if (insertionPoint == null) reserve.Add(range); else { int index = reserve.IndexOf(insertionPoint); reserve.Insert(index, range); } }
/// <summary> /// Must save FPC before using this, also this always throws /// </summary> /// <param name="fpcId"></param> public static void AutoRouteCheck(int fpcId) { var sj = new SmartJob(); sj._fpcModel = sj._fpcDs.GetSingleWithStates(fpcId); var stateDs = new DataServices.StateDataService(); var fpcPRs = sj._fpcDs.GetProductReworks(sj._fpcModel, true); List<string> errors = new List<string>(); bool shouldWarnUser = false; foreach (var pr in fpcPRs) { try { var state = stateDs.GetStartingState(fpcId, pr); if (state == null) errors.Add(string.Format("Rework {0} not found in {1}", pr.Rework.Name, pr.Product.Name)); else if (!sj.buildLayers(state)) { shouldWarnUser = true; throw new Exception(string.Format( "Cannot trace FPC for {0}.\n FPC contains too many layers or it has a loop.", pr.Product.Name));//??? } } catch (SoheilExceptionBase exp) { errors.Add(exp.Message); if (exp.Level == ExceptionLevel.Warning) shouldWarnUser = true; } catch (Exception exp) { errors.Add(exp.Message); } } if (errors.Any()) { string msg = string.Format("{0} States have errors:\n", errors.Count); foreach (var err in errors) { msg = string.Format("{0}\n{1}", msg, err); } throw new SoheilExceptionBase( msg, shouldWarnUser ? ExceptionLevel.Warning : ExceptionLevel.Info, "مسیریابی خودکار FPC"); } throw new SoheilExceptionBase("ذخیره و مسیریابی با موفقیت انجام شد", ExceptionLevel.Info, "ذخیره FPC"); }