Example #1
0
		/// <summary>
		/// Creates an instance of BlockEditor viewModel for an existing fpcState model
		/// </summary>
		/// <param name="stateModel">state model to create a block (can be obtained from a different context)</param>
		public BlockEditorVm(Model.State stateModel)
		{
			_uow = new Dal.SoheilEdmContext();
			_blockDataService = new DataServices.BlockDataService(_uow);
			Message = new Common.SoheilException.EmbeddedException();

			var stateEntity = new Soheil.Core.DataServices.StateDataService(_uow).GetSingle(stateModel.Id);
			State = new StateVm(stateEntity);
			SelectedStateStation = State.StateStationList.FirstOrDefault();
			EditorStartDate = DateTime.Now.Date;
			EditorStartTime = DateTime.Now.TimeOfDay;

			initOperatorManager();
			initializeCommands();
		}
Example #2
0
		/// <summary>
		/// Creates an instance of BlockEditor viewModel for an existing block model
		/// <para>Each instance has an exclusive uow</para>
		/// </summary>
		/// <param name="blockModel">block containing some (or no) tasks to edit (must be obtained from the same context)</param>
		public BlockEditorVm(Model.Block blockModel)
		{
			_isInitializing = true;
			_uow = new Dal.SoheilEdmContext();
			_blockDataService = new DataServices.BlockDataService(_uow);
			Message = new Common.SoheilException.EmbeddedException();

			//change context graph
			Model = _blockDataService.GetSingle(blockModel.Id);
			State = new StateVm(Model.StateStation.State);
			StateStation = State.StateStationList.First(x => x.StateStationId == Model.StateStation.Id);
            SelectedStateStation = StateStation;
			BlockTargetPoint = Model.BlockTargetPoint;

			initOperatorManager();
			initTask();
			initializeCommands();
			_isInitializing = false;
		}
Example #3
0
		private void initializeActions()
		{
			#region Items(Blocks/NPTs) actions
			//-----------------------	ADD BLOCK	-------------------------------
			_actionLoadItem = (object data) =>
			{
				try
				{
					var actionData = data as PPRange;
					if (!actionData.IsValidRange()) return;

					#region Load blockInfos
					var blockInfos = new DataServices.BlockDataService()
						.GetInRange(actionData.Start, actionData.End).ToArray();

					//add each blockInfo to cache
					foreach (var blockInfo in blockInfos)
					{
						//find b in cache
						PPItemBlock b;
						lock (_cacheLock)
							b = _blocks[blockInfo.StationIndex].FirstOrDefault(x => x.Id == blockInfo.Id);

						if (b == null)
						{
							//new block (not in cache) is found
							//create the PPItemBlock and load full data
							//set HasVm to false
							b = new PPItemBlock(blockInfo.Id);
							lock (_cacheLock)
							{
								//add to cache
								_blocks[blockInfo.StationIndex].Add(b);
							}
						}
						else
						{
							//newer version (of an existing block in cache) is found
							lock (_cacheLock)
							{
								if (b.Model.ModifiedDate != blockInfo.ModifiedDate)
								{
									//reload b
									//set HasVm to false
									b.Reload();
								}
							}
						}
						if (!_force && !_qThreadAlive) return;
						Thread.Sleep(10);
					}
					#endregion

					#region Load NptInfos
					//find npt Ids within the range
					var nptInfos = new DataServices.NPTDataService()
						.GetInRange(actionData.Start, actionData.End).ToArray();

					//add each nptInfo to cache
					foreach (var nptInfo in nptInfos)
					{
						//find n in cache
						PPItemNpt n;
						lock (_cacheLock)
							n = _npts[nptInfo.StationIndex].FirstOrDefault(x => x.Id == nptInfo.Id);

						if (n == null)
						{
							//new npt (not in cache) is found
							//create the PPItemNPT and load full data
							//set HasVm to false
							n = new PPItemNpt(nptInfo.Id);
							lock (_cacheLock)
							{
								//add to cache
								_npts[nptInfo.StationIndex].Add(n);
							}
						}
						else
						{
							//newer version (of an existing block in cache) is found
							//check for newer version???
						}

						if (!_force && !_qThreadAlive) return;
						Thread.Sleep(5);
					}
					#endregion

					#region find VIndex of each item in cache
					for (int st = 0; st < _stations; st++)
					{
						lock (_cacheLock)
						{
							if (_blocks[st].Any() || _npts[st].Any())
							{
								//find VIndexes for station[st] (row)
								var row = (_blocks[st].Concat<PPItemBase>(_npts[st]))
									.OrderBy(x => x.Start)
									.ToArray();

								int maxV = 1;
								for (int i = 0; i < row.Length; i++)
								{
									//block (b)
									var item = row[i];

									//find VIndex of block (b)
									if (i == 0)
									{
										item.VIndex = 0;
									}
									else
									{
										//search through previous blocks
										var targetRow = row
											.Take(i)
											.GroupBy(g => g.VIndex)
											.FirstOrDefault(g => g
												.All(x => (x.End - item.Start < TimeSpan.FromSeconds(1))));

										if (targetRow == null)
										{
											//non of rows has space
											item.VIndex = maxV;
											maxV++;
										}
										else
										{
											//nom is the row
											item.VIndex = targetRow.First().VIndex;
										}
									}

									//fire event to add it
									if (!PPItemBase.IsNull(item))
									{
										if (item is PPItemBlock)
											_dispatcher.Invoke(() =>
											{
												//set HasVm to true
												if (BlockAddedOrUpdated != null)
													BlockAddedOrUpdated(item as PPItemBlock);
											});
										else if (item is PPItemNpt)
											//fire event to add it
											_dispatcher.Invoke(() =>
											{
												if (NptAddedOrUpdated != null)
													NptAddedOrUpdated(item as PPItemNpt);
											});
									}
								}

								//sleep if station[st] contains some block
								if (!_force && !_qThreadAlive) return;
								Thread.Sleep(10);
							}
						}
					}
					#endregion

					#region Delete outside Items
					//widen the range
					var actionData2 = new PPRange(actionData.Start.Add(-_rangeMargin), actionData.End.Add(_rangeMargin));
					for (int st = 0; st < _stations; st++)
					{
						//find outside blocks
						PPItemBlock[] outsideBlocks;
						lock (this)
						{
							outsideBlocks = _blocks[st].Where(x => !actionData2.IsInRange(x) || x.Id == 0).ToArray();
						}
						foreach (var item in outsideBlocks)
						{
							//remove from list
							lock (this) { _blocks[st].Remove(item); }

							//remove from Vm
							_dispatcher.Invoke(() =>
							{
								if (BlockRemoved != null)
									BlockRemoved(item);
							});
						}

						if (!_force && !_qThreadAlive) return;
						Thread.Sleep(5);

						//find outside NPTs
						PPItemNpt[] outsideNpts;
						lock (this) { outsideNpts = _npts[st].Where(x => !actionData2.IsInRange(x)).ToArray(); }
						foreach (var item in outsideNpts)
						{
							//remove from list
							lock (this) { _npts[st].Remove(item); }

							//remove from Vm
							_dispatcher.Invoke(() =>
							{
								if (NptRemoved != null)
									NptRemoved(item);
							});
						}

						if (!_force && !_qThreadAlive) return;
						Thread.Sleep(5);
					}
					#endregion
				}
				catch (Exception e)
				{
					if (!LoginInfo.IsDebugMode) return;

					_qThreadAlive = false;
					using (var log = new System.IO.StreamWriter(System.IO.Path.Combine(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Soheil"), "Exceptions.log"), append: true))
					{
						log.WriteLine(DateTime.Now.ToShortTimeString());
						log.Write("Ex = ");
						log.WriteLine(e.Message);
						if (e.InnerException != null)
						{
							log.Write("InnerEx = ");
							log.WriteLine(e.InnerException.Message);
						}
						log.Write("Source = ");
						log.WriteLine(e.Source);
						log.Write("Trace = ");
						log.WriteLine(e.StackTrace);
						log.WriteLine();
						log.Close();
					}
					System.Windows.MessageBox.Show("Fatal error.\nfor more info see %appdata%\\Soheil\\Exceptions.Log");
				}
				finally
				{
					if(_force)
					{
						_force = false;
						Pause = false;
					}
				}
			};
			#endregion

			#region WorkTimes actions
			//-----------------------	ADD WORK TIME	-------------------------------
			_actionLoadWorkTimes = (object data) =>
			{
				//retreive data
				var actionData = data as PPRange;
				if (!actionData.IsValidRange()) return;
				var _workProfilePlanDataService = new DataServices.WorkProfilePlanDataService();

				lock (this)
				{
					//remove all from Vm
					_dispatcher.Invoke(() =>
					{
						if (WorkTimesRemoved != null)
							WorkTimesRemoved();
					});
					_shifts.Clear();
				}


				//find workprofiles
				var workTimes = _workProfilePlanDataService.GetShiftsInRange(actionData.Start, actionData.End)
					.Where(x => x.Item1.IsOpen);

				foreach (var tuple in workTimes)
				{
					//keep updated with _shiftsDates
					//if (_shifts.Any(x => x.Id == tuple.Item1.Id && x.DayStart == tuple.Item2)) continue;

					//create PPItemWorkTime
					var shiftItem = new PPItemWorkTime(tuple.Item1, tuple.Item2);

					//add PPItemWorkTime
					lock (this) { _shifts.Add(shiftItem); }

					//fire event to add it and its breaks
					_dispatcher.Invoke(() =>
					{
						if (WorkTimeAdded != null)
							WorkTimeAdded(shiftItem);
					});
				}

				//find day colors
				var dayColors = _workProfilePlanDataService.GetBusinessDayColorsInRange(actionData.Start, actionData.End).ToArray();

				//change colors of Days
				_dispatcher.Invoke(() =>
				{
					if (DayColorsUpdated != null)
						DayColorsUpdated(actionData.Start, dayColors);
				});

				_workProfilePlanDataService.Dispose();
			};
			#endregion
		}
Example #4
0
		DateTime? lastestTime()
		{
			var next = new DataServices.BlockDataService(UOW).FindNextBlock(Model.Warmup.Station.Id, StartDateTime.AddSeconds(1));
			if (next.Item1 != null) return next.Item1.StartDateTime.AddSeconds(-DurationSeconds);
			return null;
		}
Example #5
0
		DateTime? earliestTime()
		{
			var prev = new DataServices.BlockDataService(UOW).FindPreviousBlock(Model);
			if (prev.Item1 != null) return prev.Item1.EndDateTime;
			return null;
		}