示例#1
0
		/// <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);
		}
示例#2
0
		/// <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);
			}
		} 
示例#3
0
		/// <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);
			}
		}
示例#4
0
		/// <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");
		}