ManufacturingPanel.xaml.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Input;
  8. using System.Windows.Media.Imaging;
  9. using System.Windows.Threading;
  10. using Comal.Classes;
  11. using InABox.Clients;
  12. using InABox.Configuration;
  13. using InABox.Core;
  14. using InABox.DynamicGrid;
  15. using InABox.WPF;
  16. using Syncfusion.UI.Xaml.Kanban;
  17. namespace PRSDesktop
  18. {
  19. public partial class ManufacturingPanel : UserControl, IPanel<ManufacturingPacket>
  20. {
  21. private readonly List<IManufacturingPanelColumn> _columns = new();
  22. #region Settings Fields
  23. private bool bIncludeCompleted;
  24. private bool bIncludeHeld;
  25. private bool bIncludeOrders;
  26. private ManufacturingViewType ViewType;
  27. private Guid CurrentFactory = Guid.Empty;
  28. private bool SortByDueDate = true;
  29. private ManufacturingSettings settings = new();
  30. #endregion
  31. private readonly DispatcherTimer columnsizer = new();
  32. private Document[] FactoryImages = Array.Empty<Document>();
  33. private int iCombo;
  34. private bool JobChanging;
  35. private readonly ManufacturingPanelData Data = new();
  36. private CoreTable packets;
  37. private Guid SelectedJob;
  38. public ManufacturingPanel()
  39. {
  40. InitializeComponent();
  41. //columnsizer.Interval = new TimeSpan(0, 0, 0, 0, 500);
  42. //columnsizer.Tick += Columnsizer_Tick;
  43. //columnsizer.IsEnabled = true;
  44. IncludeCompleted.IsChecked = false;
  45. }
  46. //public List<String> CheckedKanbans = new List<string>();
  47. public bool IsReady { get; set; }
  48. public Dictionary<string, object[]> Selected()
  49. {
  50. return new Dictionary<string, object[]> { { typeof(ManufacturingPacket).EntityName(), new CoreRow[] { } } };
  51. }
  52. public void Setup()
  53. {
  54. settings = new UserConfiguration<ManufacturingSettings>().Load();
  55. var FactorySource = new ObservableCollection<Tuple<string, BitmapImage, Guid>>();
  56. FactorySource.Add(new Tuple<string, BitmapImage, Guid>("All Sections", PRSDesktop.Resources.factory.AsBitmapImage(), Guid.Empty));
  57. var tables = ClientFactory.MultiQuery(
  58. new QueryDef<ManufacturingFactory>(null, null, null),
  59. new QueryDef<ManufacturingSection>(null, null, null),
  60. new QueryDef<ManufacturingTemplate>(null, null, null),
  61. new QueryDef<Job>(
  62. LookupFactory.DefineFilter<Job>(),
  63. new Columns<Job>(
  64. x => x.ID,
  65. x => x.JobNumber,
  66. x => x.Name
  67. ),
  68. LookupFactory.DefineSort<Job>()
  69. ),
  70. new QueryDef<JobITP>(null, null, null),
  71. new QueryDef<PurchaseOrderItem>(
  72. new Filter<PurchaseOrderItem>(x => x.Packet).LinkValid()
  73. .And(x => x.Packet.Completed).IsEqualTo(DateTime.MinValue),
  74. new Columns<PurchaseOrderItem>(
  75. x => x.ID,
  76. x => x.ReceivedDate,
  77. x => x.Consignment.EstimatedWarehouseArrival,
  78. x => x.DueDate,
  79. x => x.PurchaseOrderLink.SupplierLink.Code,
  80. x => x.PurchaseOrderLink.PONumber,
  81. x => x.ReceivedReference
  82. ),
  83. null
  84. )
  85. );
  86. Data.Factories = tables[0].Rows.Select(x => x.ToObject<ManufacturingFactory>())
  87. .ToArray(); //new Client<ManufacturingFactory>().Load(null, new SortOrder<ManufacturingFactory>(x=>x.Sequence));
  88. Data.Sections = tables[1].Rows.Select(x => x.ToObject<ManufacturingSection>())
  89. .ToArray(); //new Client<ManufacturingSection>().Load(null, new SortOrder<ManufacturingSection>(x=>x.Sequence));
  90. Data.Templates = tables[2].Rows.Select(x => x.ToObject<ManufacturingTemplate>())
  91. .ToArray(); //new Client<ManufacturingTemplate>().Load(null, new SortOrder<ManufacturingTemplate>(x=>x.Code));
  92. Data.Jobs = tables[3]; //.Rows.Select(x => x.ToObject<Job>()).ToArray();
  93. Data.ITPs = tables[4]; //.Rows.Select(x => x.ToObject<JobITP>()).ToArray();
  94. foreach (var orderrow in tables[5].Rows)
  95. {
  96. var id = orderrow.Get<PurchaseOrderItem, Guid>(x => x.ID);
  97. var receiveddate = orderrow.Get<PurchaseOrderItem, DateTime>(c => c.ReceivedDate);
  98. var estimatedwarehousearrival = orderrow.Get<PurchaseOrderItem, DateTime>(c => c.Consignment.EstimatedWarehouseArrival);
  99. if (estimatedwarehousearrival.IsEmpty())
  100. estimatedwarehousearrival = orderrow.Get<PurchaseOrderItem, DateTime>(c => c.DueDate);
  101. var suppliercode = orderrow.Get<PurchaseOrderItem, string>(c => c.PurchaseOrderLink.SupplierLink.Code);
  102. var ponumber = orderrow.Get<PurchaseOrderItem, string>(c => c.PurchaseOrderLink.PONumber);
  103. var poreference = orderrow.Get<PurchaseOrderItem, string>(c => c.ReceivedReference);
  104. var tag = receiveddate.IsEmpty() ? "ETA" : "RCVD";
  105. Data.OrderItems.Add(new Tuple<Guid, DateTime, string>(
  106. id,
  107. receiveddate,
  108. string.Format("{0} ({1}) {2} {3:dd MMM yy} {4}",
  109. suppliercode,
  110. ponumber,
  111. tag,
  112. receiveddate.IsEmpty() ? estimatedwarehousearrival : receiveddate,
  113. string.IsNullOrWhiteSpace(poreference) ? "" : ": " + poreference
  114. )
  115. ));
  116. }
  117. //OrderItems = tables[5]; //.Rows.Select(x => x.ToObject<PurchaseOrderItem>()).ToArray();
  118. Filter<Document>? imageFilter = null;
  119. foreach (var Factory in Data.Factories)
  120. if (Factory.Thumbnail.IsValid())
  121. imageFilter = imageFilter == null
  122. ? new Filter<Document>(x => x.ID).IsEqualTo(Factory.Thumbnail.ID)
  123. : imageFilter.Or(x => x.ID).IsEqualTo(Factory.Thumbnail.ID);
  124. FactoryImages = new Client<Document>().Load(imageFilter);
  125. var iFact = 1;
  126. foreach (var Factory in Data.Factories)
  127. {
  128. var groups = new List<string>();
  129. if (!FactorySource.Any(x => x.Item1.Equals(Factory.Name)))
  130. {
  131. var image = FactoryImages.FirstOrDefault(x => x.ID.Equals(Factory.Thumbnail.ID));
  132. BitmapImage img;
  133. if (image != null && image.Data != null && image.Data.Length > 0)
  134. {
  135. img = new BitmapImage();
  136. img.LoadImage(image.Data);
  137. }
  138. else
  139. {
  140. img = PRSDesktop.Resources.factory.AsBitmapImage();
  141. }
  142. FactorySource.Add(new Tuple<string, BitmapImage, Guid>(Factory.Name, img, Factory.ID));
  143. if (settings.FactoryID == Factory.ID)
  144. iFact = FactorySource.Count - 1;
  145. }
  146. }
  147. FactoryListBox.ItemsSource = FactorySource;
  148. FactoryListBox.SelectedIndex = iFact < FactorySource.Count ? iFact : 0;
  149. SortBy.SelectedIndex = settings.SortByDueDate ? 1 : 0;
  150. View.SelectedIndex = (int)ViewType;
  151. bIncludeHeld = settings.IncludeHeld;
  152. IncludeHeld.IsChecked = bIncludeHeld;
  153. bIncludeOrders = settings.IncludeOrders;
  154. IncludeOrders.IsChecked = bIncludeOrders;
  155. bIncludeCompleted = settings.IncludeCompleted;
  156. IncludeCompleted.IsChecked = bIncludeCompleted;
  157. //new Client<Job>().Query(
  158. // LookupFactory.DefineFilter<Job>(),
  159. // LookupFactory.DefineColumns<Job>(),
  160. // LookupFactory.DefineSort<Job>(),
  161. // (table, error) =>
  162. // {
  163. // Dictionary<Guid, String> jobs = new Dictionary<Guid, string>() { { CoreUtils.FullGuid, "All Jobs" } };
  164. // foreach (var row in table.Rows)
  165. // jobs[row.Get<Job, Guid>(x => x.ID)] = String.Format("{0}: {1}", row.Get<Job, String>(x => x.JobNumber), row.Get<Job, String>(x => x.Name));
  166. // Dispatcher.Invoke(() =>
  167. // {
  168. // JobChanging = true;
  169. // Job.ItemsSource = jobs;
  170. // Job.SelectedValue = CoreUtils.FullGuid;
  171. // //Level.IsEnabled = false;
  172. // //Zone.IsEnabled = false;
  173. // ITP.IsEnabled = false;
  174. // JobChanging = false;
  175. // });
  176. // });
  177. var jobs = new Dictionary<Guid, string> { { CoreUtils.FullGuid, "All Jobs" } };
  178. foreach (var row in Data.Jobs.Rows)
  179. jobs[row.Get<Job, Guid>(c => c.ID)] =
  180. string.Format("{0}: {1}", row.Get<Job, string>(c => c.JobNumber), row.Get<Job, string>(c => c.Name));
  181. JobChanging = true;
  182. Job.ItemsSource = jobs;
  183. Job.SelectedValue = CoreUtils.FullGuid;
  184. SelectedJob = CoreUtils.FullGuid;
  185. ITP.IsEnabled = false;
  186. JobChanging = false;
  187. }
  188. public void Shutdown()
  189. {
  190. }
  191. public void CreateToolbarButtons(IPanelHost host)
  192. {
  193. }
  194. public string SectionName => "Manufacturing Packets";
  195. public DataModel DataModel(Selection selection)
  196. {
  197. var ids = new List<Guid>();
  198. foreach (var column in _columns)
  199. {
  200. var rows = selection == Selection.None
  201. ? Enumerable.Empty<ManufacturingPacket>()
  202. : selection == Selection.Selected
  203. ? column.GetSelectedPackets()
  204. : column.GetPackets();
  205. ids.AddRange(rows.Select(r => r.ID));
  206. }
  207. return new ManufacturingPacketDataModel(new Filter<ManufacturingPacket>(x => x.ID).InList(ids.ToArray()));
  208. }
  209. public void Refresh()
  210. {
  211. Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = Cursors.Wait; });
  212. var now = DateTime.Now;
  213. ReloadFactories();
  214. var elapsed = DateTime.Now - now;
  215. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Refreshed Factories in {0}ms", elapsed.TotalMilliseconds));
  216. now = DateTime.Now;
  217. ReloadPackets();
  218. elapsed = DateTime.Now - now;
  219. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Refreshed Packets in {0}ms", elapsed.TotalMilliseconds));
  220. Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = null; });
  221. }
  222. public event DataModelUpdateEvent? OnUpdateDataModel;
  223. //private void ChangeDate_Click(object sender, RoutedEventArgs e)
  224. //{
  225. // MenuItem item = (MenuItem)sender;
  226. // KanbanModel model = (KanbanModel)item.Tag;
  227. // var pkts = GetSelectedPackets(model.ID);
  228. // DateTime? date = null;
  229. // foreach (var pkt in pkts)
  230. // {
  231. // if (!date.HasValue)
  232. // date = pkt.DueDate;
  233. // else if (!date.Value.Equals(pkt.DueDate))
  234. // date = date > pkt.DueDate ? date : pkt.DueDate;
  235. // }
  236. // DateTime date2 = !date.HasValue ? DateTime.Today.AddDays(14) : date.Value;
  237. // if (InABox.WPF.DateEdit.Execute("Required Completion Date", ref date2))
  238. // {
  239. // Progress.SetMessage("Updating Packets");
  240. // foreach (var pkt in pkts)
  241. // pkt.DueDate = date2;
  242. // new Client<ManufacturingPacket>().Save(pkts, String.Format("Changed Due Date To {0:dd MMM yy}", date2));
  243. // CheckedKanbans.Clear();
  244. // Progress.Close();
  245. // Refresh();
  246. // }
  247. //}
  248. //private void UpdatePriority(object sender, bool priority)
  249. //{
  250. // MenuItem item = (MenuItem)sender;
  251. // KanbanModel model = (KanbanModel)item.Tag;
  252. // Progress.Show("");
  253. // var pkts = GetSelectedPackets(model.ID);
  254. // for (int i = 0; i < pkts.Length; i++)
  255. // {
  256. // var packet = pkts[i];
  257. // packet.Priority = priority;
  258. // }
  259. // Progress.SetMessage("Updating Packets");
  260. // new Client<ManufacturingPacket>().Save(pkts, "Priority Flag "+ (priority ? "Set" : "Cleared"));
  261. // CheckedKanbans.Clear();
  262. // Progress.Close();
  263. // Refresh();
  264. //}
  265. //private void SetPriority_Click(object sender, RoutedEventArgs e)
  266. //{
  267. // UpdatePriority(sender, true);
  268. //}
  269. //private void ClearPriority_Click(object sender, RoutedEventArgs e)
  270. //{
  271. // UpdatePriority(sender, false);
  272. //}
  273. //private void UpdateHold(object sender, bool hold)
  274. //{
  275. // MenuItem item = (MenuItem)sender;
  276. // KanbanModel model = (KanbanModel)item.Tag;
  277. // Progress.Show("");
  278. // var pkts = GetSelectedPackets(model.ID);
  279. // for (int i = 0; i < pkts.Length; i++)
  280. // {
  281. // var packet = pkts[i];
  282. // packet.OnHold = hold;
  283. // }
  284. // Progress.SetMessage("Updating Packets");
  285. // new Client<ManufacturingPacket>().Save(pkts, "Hold Flag " + (hold ? "Set" : "Cleared"));
  286. // CheckedKanbans.Clear();
  287. // Progress.Close();
  288. // Refresh();
  289. //}
  290. //private void SetHold_Click(object sender, RoutedEventArgs e)
  291. //{
  292. // UpdateHold(sender, true);
  293. //}
  294. //private void ClearHold_Click(object sender, RoutedEventArgs e)
  295. //{
  296. // UpdateHold(sender, false);
  297. //}
  298. //private void CompeteItem_Click(object sender, RoutedEventArgs e)
  299. //{
  300. // MenuItem item = (MenuItem)sender;
  301. // KanbanModel model = (KanbanModel)item.Tag;
  302. // Progress.Show("");
  303. // var pkts = GetSelectedPackets(model.ID);
  304. // Progress.SetMessage("Loading Stages");
  305. // Filter<ManufacturingPacketStage> stgflt = null;
  306. // foreach (var pkt in pkts)
  307. // stgflt = stgflt == null ? new Filter<ManufacturingPacketStage>(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID) : stgflt.Or(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID);
  308. // ManufacturingPacketStage[] stgs = new Client<ManufacturingPacketStage>().Load(stgflt, new SortOrder<ManufacturingPacketStage>(x => x.Sequence));
  309. // while (pkts.Any(x => x.Completed.IsEmpty()))
  310. // {
  311. // ManufacturingPacket.Progress(pkts, stgs);
  312. // }
  313. // Progress.SetMessage("Progressing Items");
  314. // new Client<ManufacturingPacketStage>().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
  315. // new Client<ManufacturingPacket>().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
  316. // Progress.Close();
  317. // CheckedKanbans.Clear();
  318. // Refresh();
  319. //}
  320. public void Heartbeat(TimeSpan time)
  321. {
  322. }
  323. private void Job_SelectionChanged(object sender, SelectionChangedEventArgs e)
  324. {
  325. var oldID = SelectedJob;
  326. var newID = Job.SelectedValue != null ? (Guid)Job.SelectedValue : Guid.Empty;
  327. SelectedJob = newID;
  328. //Dictionary<Guid, String> Levels = new Dictionary<Guid, string>() { { CoreUtils.FullGuid, "All Levels" } };
  329. //Dictionary<Guid, String> Zones = new Dictionary<Guid, string>() { { CoreUtils.FullGuid, "All Zones" } };
  330. var itps = new Dictionary<Guid, string> { { CoreUtils.FullGuid, "All ITPs" } };
  331. if (SelectedJob == Guid.Empty || SelectedJob == CoreUtils.FullGuid)
  332. {
  333. iCombo = 1;
  334. //Level.ItemsSource = Levels;
  335. //Level.SelectedValue = CoreUtils.FullGuid;
  336. //Level.IsEnabled = false;
  337. //Zone.ItemsSource = Zones;
  338. //Zone.SelectedValue = CoreUtils.FullGuid;
  339. //Zone.IsEnabled = false;
  340. ITP.ItemsSource = itps;
  341. ITP.SelectedValue = CoreUtils.FullGuid;
  342. ITP.IsEnabled = false;
  343. iCombo = 0;
  344. }
  345. else
  346. {
  347. iCombo = 1;
  348. foreach (var row in Data.ITPs.Rows.Where(r => r.Get<JobITP, Guid>(c => c.Job.ID).Equals(SelectedJob)))
  349. itps[row.Get<JobITP, Guid>(c => c.Job.ID)] =
  350. string.Format("{0}: {1}", row.Get<JobITP, string>(c => c.Code), row.Get<JobITP, string>(c => c.Description));
  351. ITP.ItemsSource = itps;
  352. ITP.SelectedValue = CoreUtils.FullGuid;
  353. ITP.IsEnabled = true;
  354. iCombo--;
  355. }
  356. if (newID != CoreUtils.FullGuid && ViewType == ManufacturingViewType.Job)
  357. {
  358. View.SelectedIndex = (int)ManufacturingViewType.Full;
  359. }
  360. else
  361. {
  362. if (!JobChanging && iCombo == 0)
  363. {
  364. ReloadPackets();
  365. }
  366. }
  367. }
  368. private void Unit_SelectionChanged(object sender, SelectionChangedEventArgs e)
  369. {
  370. if (JobChanging || iCombo > 0)
  371. return;
  372. ReloadPackets();
  373. }
  374. private void AddColumn<TColumn>(string title, Guid category, TColumn column)
  375. where TColumn : FrameworkElement, IManufacturingPanelColumn
  376. {
  377. column.Margin = new Thickness(_columns.Any() ? 2 : 0, 0, 0, 0);
  378. column.Title = title;
  379. column.Data = Data;
  380. column.Category = category;
  381. column.SetValue(Grid.ColumnProperty, _columns.Count);
  382. column.OnCollapsed += Column_OnCollapsed;
  383. Columns.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  384. Columns.Children.Add(column);
  385. _columns.Add(column);
  386. }
  387. private void CreateColumn(string title, Guid category)
  388. {
  389. var job = SelectedJob;
  390. if (ViewType == ManufacturingViewType.Job)
  391. {
  392. var column = new ManufacturingPanelJobColumn();
  393. column.OnSelectJob += Column_OnSelectJob;
  394. AddColumn(title, category, column);
  395. }
  396. else
  397. {
  398. var column = new ManufacturingPanelColumn();
  399. column.CompactView = ViewType == ManufacturingViewType.Compact;
  400. column.OnChanged += Column_OnChanged;
  401. AddColumn(title, category, column);
  402. }
  403. }
  404. private void Column_OnSelectJob(Guid jobID)
  405. {
  406. Job.SelectedValue = jobID;
  407. }
  408. private void Column_OnCollapsed(object sender, bool collapsed)
  409. {
  410. var index = _columns.IndexOf((IManufacturingPanelColumn)sender);
  411. Columns.ColumnDefinitions[index].Width = new GridLength(1, collapsed ? GridUnitType.Auto : GridUnitType.Star);
  412. }
  413. private void Column_OnChanged(object? sender, EventArgs e)
  414. {
  415. Refresh();
  416. }
  417. private void ReloadFactories()
  418. {
  419. columnsizer.IsEnabled = false;
  420. Columns.Children.Clear();
  421. _columns.Clear();
  422. Columns.ColumnDefinitions.Clear();
  423. CreateColumn("To Be Issued", Guid.Empty);
  424. //Kanban.Columns.Clear();
  425. //Kanban.Columns.Add(new KanbanColumn() { Title = "To be Issued", Categories = Guid.Empty.ToString() });
  426. foreach (var factory in Data.Factories)
  427. if (CurrentFactory.Equals(Guid.Empty) || CurrentFactory.Equals(factory.ID))
  428. foreach (var section in Data.Sections)
  429. if (section.Factory.ID.Equals(factory.ID) && !section.Hidden)
  430. CreateColumn(section.Factory.Name + ":" + section.Name, section.ID);
  431. //Kanban.Columns.Add(new KanbanColumn() { Title = Section.Factory.Name + ":" + Section.Name, Categories = Section.ID.ToString() });
  432. if (bIncludeCompleted)
  433. CreateColumn("Completed", CoreUtils.FullGuid);
  434. //Kanban.Columns.Add(new KanbanColumn() { Title = "Completed", Categories = CoreUtils.FullGuid.ToString() });
  435. //foreach (KanbanColumn column in Kanban.Columns)
  436. //{
  437. // ContextMenu menu = new ContextMenu();
  438. // menu.Tag = column;
  439. // MenuItem item = new MenuItem() { Header = "Select All " + column.Title + " Tasks", Tag = column };
  440. // item.Click += SelectAll_Click;
  441. // menu.Items.Add(item);
  442. // item = new MenuItem() { Header = "Unselect All " + column.Title + " Tasks", Tag = column };
  443. // item.Click += UnSelectAll_Click;
  444. // menu.Items.Add(item);
  445. // column.ContextMenu = menu;
  446. // column.AllowDrag = false;
  447. // column.AllowDrop = false;
  448. //}
  449. //ResizeColumns();
  450. //columnsizer.IsEnabled = true;
  451. }
  452. //private void SetSelectedItems(KanbanColumn column, bool selected)
  453. //{
  454. // foreach (ManufacturingKanban model in Kanbans)
  455. // {
  456. // if ((string)model.Category == column.Categories)
  457. // {
  458. // if (!CheckedKanbans.Contains(model.ID))
  459. // CheckedKanbans.Add(model.ID);
  460. // model.Checked = selected;
  461. // }
  462. // }
  463. // Kanban.ItemsSource = null;
  464. // Kanban.ItemsSource = Kanbans;
  465. //}
  466. //private void UnSelectAll_Click(object sender, RoutedEventArgs e)
  467. //{
  468. // KanbanColumn column = ((MenuItem)sender).Tag as KanbanColumn;
  469. // SetSelectedItems(column, false);
  470. //}
  471. //private void SelectAll_Click(object sender, RoutedEventArgs e)
  472. //{
  473. // KanbanColumn column = ((MenuItem)sender).Tag as KanbanColumn;
  474. // SetSelectedItems(column, true);
  475. //}
  476. private void CheckBox_Checked(object sender, RoutedEventArgs e)
  477. {
  478. //ManufacturingKanban task = ((CheckBox)sender).Tag as ManufacturingKanban;
  479. //if (CheckedKanbans.Contains(task.ID))
  480. // CheckedKanbans.Remove(task.ID);
  481. //else
  482. // CheckedKanbans.Add(task.ID);
  483. }
  484. private string GetQualityStatus(QualityStatus status)
  485. {
  486. if (status == QualityStatus.Passed)
  487. return "PASSED";
  488. if (status == QualityStatus.Skipped)
  489. return "SKIPPED";
  490. if (status == QualityStatus.PassedWithIssues)
  491. return "ISSUES";
  492. if (status == QualityStatus.Failed)
  493. return "FAILED";
  494. return " ";
  495. }
  496. private void ReloadPackets()
  497. {
  498. var filter = GenerateFilter();
  499. var columns = GenerateColumns();
  500. using var profiler = new Profiler(false);
  501. packets = new Client<ManufacturingPacket>().Query(
  502. filter,
  503. columns,
  504. SortBy.SelectedIndex == 0
  505. ? new SortOrder<ManufacturingPacket>(x => x.SetoutLink.Number)
  506. : new SortOrder<ManufacturingPacket>(x => x.DueDate).ThenBy(x => x.Priority, SortDirection.Descending)
  507. .ThenBy(x => x.SetoutLink.Number));
  508. Logger.Send(LogType.Information, ClientFactory.UserID,
  509. string.Format("Retrieved {0} packets in {1}ms", packets.Rows.Count, profiler.Restart()));
  510. var objects = packets.ToObjects<ManufacturingPacket>();
  511. var groups = objects.GroupBy(x => !x.Completed.IsEmpty() ? CoreUtils.FullGuid : x.StageLink.SectionID);
  512. var results = groups.ToDictionary(x => x.Key, x => x);
  513. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Processed Kanbans in {0}ms", profiler.Restart()));
  514. foreach (var column in _columns)
  515. {
  516. column.SetPackets(results.GetValueOrDefault(column.Category) ?? Enumerable.Empty<ManufacturingPacket>());
  517. }
  518. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Loaded Columns in {0}ms", profiler.Restart()));
  519. }
  520. private Filter<ManufacturingPacket> GenerateFilter()
  521. {
  522. var filter = new Filter<ManufacturingPacket>(x => x.Archived).IsEqualTo(DateTime.MinValue);
  523. if (!bIncludeCompleted)
  524. filter = filter.And(x => x.Completed).IsEqualTo(DateTime.MinValue);
  525. if (!bIncludeHeld)
  526. // filter = filter.And(x => x.OnHold).IsEqualTo(false);
  527. filter = filter.And(x => x.OnHold).IsEqualTo(false);
  528. if (!bIncludeOrders)
  529. {
  530. var orderfilter = new Filter<ManufacturingPacket>(x => x.OrderItem).NotLinkValid().Or(x => x.OrderItem.ReceivedDate)
  531. .IsNotEqualTo(DateTime.MinValue);
  532. filter = filter.And(orderfilter);
  533. }
  534. var bSkipJobCheck = false;
  535. if (ITP.SelectedValue != null && !ITP.SelectedValue.Equals(CoreUtils.FullGuid))
  536. {
  537. filter = filter.And(x => x.ITP.ID).IsEqualTo((Guid)ITP.SelectedValue);
  538. bSkipJobCheck = true;
  539. }
  540. if (!bSkipJobCheck && Job.SelectedValue != null && !Job.SelectedValue.Equals(CoreUtils.FullGuid))
  541. filter = filter.And(x => x.SetoutLink.JobLink.ID).IsEqualTo((Guid)Job.SelectedValue);
  542. var sections = Data.Sections.Where(x => CurrentFactory.Equals(Guid.Empty) || x.Factory.ID.Equals(CurrentFactory)).Select(x => x.ID)
  543. .ToList();
  544. var sctflt = new Filter<ManufacturingPacket>(x => x.StageLink.SectionID).IsEqualTo(Guid.Empty)
  545. .Or(x => x.StageLink.SectionID).InList(sections.ToArray());
  546. /*
  547. var sctflt = new Filter<ManufacturingPacket>(x => x.StageLink).NotLinkValid();
  548. foreach (var section in Data.Sections.Where(x => CurrentFactory.Equals(Guid.Empty) || x.Factory.ID.Equals(CurrentFactory)))
  549. sctflt = sctflt.Or(x => x.StageLink.SectionID).IsEqualTo(section.ID);
  550. */
  551. filter.Ands.Add(sctflt);
  552. if (CurrentFactory != Guid.Empty)
  553. {
  554. var templatefilter = new Filter<ManufacturingPacket>(x => x.ManufacturingTemplateLink.Factory.ID).IsEqualTo(CurrentFactory)
  555. .Or(x => x.StageLink).LinkValid();
  556. filter.Ands.Add(templatefilter);
  557. }
  558. if (!string.IsNullOrWhiteSpace(SearchBox.Text))
  559. filter = filter.TextSearch(
  560. SearchBox.Text,
  561. x => x.SetoutLink.JobLink.JobNumber,
  562. x => x.SetoutLink.JobLink.Name,
  563. x => x.SetoutLink.Number,
  564. x => x.SetoutLink.Description,
  565. //x => x.SetoutLink.Reference,
  566. x => x.SetoutLink.Location,
  567. //x => x.Unit.Code,
  568. //x => x.Unit.Description,
  569. x => x.ITP.Code,
  570. x => x.ITP.Description,
  571. x => x.Title,
  572. x => x.Serial,
  573. x => x.Location,
  574. x => x.WaterMark,
  575. x => x.ManufacturingTemplateLink.Code
  576. );
  577. return filter;
  578. }
  579. private static Columns<ManufacturingPacket> GenerateColumns()
  580. {
  581. var columns = new Columns<ManufacturingPacket>();
  582. columns.Add(x => x.ID);
  583. //columns.Add(x => x.OnHold);
  584. columns.Add(x => x.OnHold);
  585. columns.Add(x => x.Issues);
  586. columns.Add(x => x.Priority);
  587. columns.Add(x => x.Distributed);
  588. columns.Add(x => x.BarcodeQty);
  589. columns.Add(x => x.Quantity);
  590. columns.Add(x => x.Title);
  591. columns.Add(x => x.Serial);
  592. columns.Add(x => x.WaterMark);
  593. columns.Add(x => x.EstimatedDate);
  594. columns.Add(x => x.Created);
  595. columns.Add(x => x.DueDate);
  596. columns.Add(x => x.Location);
  597. columns.Add(x => x.BarcodePrinted);
  598. columns.Add(x => x.BarcodeType);
  599. columns.Add(x => x.Completed);
  600. //columns.Add(x => x.TimeRemaining);
  601. columns.Add(x => x.Group);
  602. columns.Add(x => x.SetoutLink.ID);
  603. columns.Add(x => x.SetoutLink.Number);
  604. columns.Add(x => x.SetoutLink.Description);
  605. columns.Add(x => x.SetoutLink.Location);
  606. columns.Add(x => x.SetoutLink.JobLink.ID);
  607. columns.Add(x => x.SetoutLink.Group.ID);
  608. columns.Add(x => x.SetoutLink.Group.Name);
  609. columns.Add(x => x.SetoutLink.Group.Job.JobNumber);
  610. columns.Add(x => x.OrderItem.ID);
  611. //columns.Add(x => x.OrderItem.ReceivedDate);
  612. //columns.Add(x => x.OrderItem.Consignment.EstimatedWarehouseArrival);
  613. //columns.Add(x => x.OrderItem.PurchaseOrderLink.SupplierLink.Code);
  614. //columns.Add(x => x.OrderItem.PurchaseOrderLink.PONumber);
  615. columns.Add(x => x.ManufacturingTemplateLink.ID);
  616. columns.Add(x => x.ITP.ID);
  617. columns.Add(x => x.StageLink.ID);
  618. columns.Add(x => x.StageLink.SectionID);
  619. columns.Add(x => x.StageLink.Station);
  620. columns.Add(x => x.StageLink.Time);
  621. columns.Add(x => x.StageLink.PercentageComplete);
  622. columns.Add(x => x.StageLink.Deleted);
  623. return columns;
  624. }
  625. private void Factories_SelectionChanged(object sender, SelectionChangedEventArgs e)
  626. {
  627. if (e.AddedItems.Count == 0 || e.AddedItems[0] is not Tuple<string, BitmapImage, Guid> selected)
  628. return;
  629. CurrentFactory = selected.Item3;
  630. if (IsReady)
  631. SaveSettings();
  632. if (IsReady)
  633. Refresh();
  634. }
  635. private void SortBy_SelectionChanged(object sender, SelectionChangedEventArgs e)
  636. {
  637. if (e.AddedItems.Count == 0 || e.AddedItems[0] is not ComboBoxItem selected)
  638. return;
  639. SortByDueDate = selected.Content.Equals("Due Date");
  640. if (IsReady)
  641. SaveSettings();
  642. if (IsReady)
  643. Refresh();
  644. }
  645. private void View_SelectionChanged(object sender, SelectionChangedEventArgs e)
  646. {
  647. if (e.AddedItems.Count == 0 || e.AddedItems[0] is not ComboBoxItem selected)
  648. return;
  649. ViewType = (ManufacturingViewType)View.SelectedIndex;
  650. if (IsReady)
  651. SaveSettings();
  652. if (ViewType == ManufacturingViewType.Job && SelectedJob != CoreUtils.FullGuid)
  653. {
  654. SelectedJob = CoreUtils.FullGuid;
  655. JobChanging = true;
  656. Job.SelectedValue = SelectedJob;
  657. JobChanging = false;
  658. }
  659. if (IsReady)
  660. Refresh();
  661. }
  662. private void SearchBox_KeyUp(object sender, KeyEventArgs e)
  663. {
  664. if (string.IsNullOrWhiteSpace(SearchBox.Text) || e.Key == Key.Return)
  665. Refresh();
  666. }
  667. private void IncludeCompleted_Click(object sender, RoutedEventArgs e)
  668. {
  669. bIncludeCompleted = IncludeCompleted.IsChecked == true;
  670. if (IsReady)
  671. {
  672. SaveSettings();
  673. Refresh();
  674. }
  675. }
  676. private void IncludeHeld_Click(object sender, RoutedEventArgs e)
  677. {
  678. bIncludeHeld = IncludeHeld.IsChecked == true;
  679. if (IsReady)
  680. {
  681. SaveSettings();
  682. Refresh();
  683. }
  684. }
  685. private void IncludeOrders_Click(object sender, RoutedEventArgs e)
  686. {
  687. bIncludeOrders = IncludeOrders.IsChecked == true;
  688. if (IsReady)
  689. {
  690. SaveSettings();
  691. Refresh();
  692. }
  693. }
  694. private void SaveSettings()
  695. {
  696. var user = new ManufacturingSettings
  697. {
  698. FactoryID = CurrentFactory,
  699. SortByDueDate = SortByDueDate,
  700. ViewType = ViewType,
  701. IncludeHeld = bIncludeHeld,
  702. IncludeOrders = bIncludeOrders,
  703. IncludeCompleted = bIncludeCompleted
  704. };
  705. new UserConfiguration<ManufacturingSettings>().Save(user);
  706. }
  707. private void Export_Click(object sender, RoutedEventArgs e)
  708. {
  709. IEnumerable<string> columns = string.IsNullOrWhiteSpace(settings.ExportColumns) ? Array.Empty<string>() : settings.ExportColumns.Split(',');
  710. if (!columns.Any())
  711. columns = packets.Columns.Select(x => x.ColumnName);
  712. var form = new DynamicExportForm(typeof(ManufacturingPacket), columns);
  713. if (form.ShowDialog() != true)
  714. return;
  715. settings.ExportColumns = string.Join(",", form.Fields);
  716. new UserConfiguration<ManufacturingSettings>().Save(settings);
  717. var export = new Client<ManufacturingPacket>().Query(
  718. GenerateFilter(),
  719. new Columns<ManufacturingPacket>(form.Fields),
  720. LookupFactory.DefineSort<ManufacturingPacket>()
  721. );
  722. ExcelExporter.DoExport<ManufacturingPacket>(export, string.Format("Manufacturing {0:dd-MMM-yy}", DateTime.Today));
  723. }
  724. }
  725. }