using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Data; using SSWMS.Common; namespace SSWMS.Client.UC { public partial class ucStoreCell : UserControl { public delegate void DelegateCellClick(WH_CELL wc); public event DelegateCellClick U_CellDoubleClick; public event DelegateCellClick U_CellClick; public Border SelectedBorder = null; private const int iHignLowDiff = 10; public ucStoreCell() { InitializeComponent(); this.ucWare.U_WareHouseChanged += () => { this.tbCellCode.Text = string.Empty; this.SelectedBorder = null; this.InitCell(); }; this.bRefresh.Click += (sender, e) => { this.InitCell(); }; this.bZoom.Click += (sender, e) => { this.txtZoom.Text = "100"; this.InitCell(); }; this.bZoomIn.PreviewMouseDown += (sender, e) => { int iZoom = Convert.ToInt32(this.txtZoom.Text); if (e.ClickCount == 1) { iZoom += 1; } else if (e.ClickCount == 2) { iZoom += 4; } else if (e.ClickCount > 2) { iZoom += 5; } this.txtZoom.Text = (iZoom < 100 ? iZoom : 100).ToString(); this.InitCell(); }; this.bZoomOut.PreviewMouseDown += (sender, e) => { int iZoom = Convert.ToInt32(this.txtZoom.Text); if (e.ClickCount == 1) { iZoom -= 1; } else if (e.ClickCount == 2) { iZoom -= 4; } else if (e.ClickCount > 2) { iZoom -= 5; } this.txtZoom.Text = (iZoom > 0 ? iZoom : 0).ToString(); this.InitCell(); }; } public void U_InitControl() { this.ucWare.U_InitControl(); } public void InitCell() { try { // 初始化 this.cWarehouseCells.Children.Clear(); this.spCellStatus.Children.Clear(); this.spRunStatus.Children.Clear(); IList lWarehouseCells = WCFChannel._I_CellService.GetCellByCellZ( this.ucWare.U_WAREHOUSE_CODE, this.ucWare.U_CELL_Z, MainApp._USER.USER_ID); if (lWarehouseCells == null || lWarehouseCells.Count == 0) { MessageDialog.ShowException("未找到货位"); return; } double dPercent = Convert.ToDouble(this.txtZoom.Text) / 100; const int iMariginX = 2; const int iMariginY = 2; const int iTotalBottom = 40; const int iTotalLeft = 40; const int iTotalRight = 30; int iMaxX = lWarehouseCells.Max(l => l.CELL_X); int iMinX = lWarehouseCells.Min(l => l.CELL_X); int iMaxY = lWarehouseCells.Max(l => l.CELL_Y); int iMinY = lWarehouseCells.Min(l => l.CELL_Y); int iMinWidth = Convert.ToInt32(lWarehouseCells.Max(l => l.CELL_WIDTH) * dPercent); iMinWidth = iMinWidth > 20 ? iMinWidth : 20; int iMinCellHeigth = lWarehouseCells.Min(l => l.CELL_HEIGHT); int iMinHeight = Convert.ToInt32(iMinCellHeigth * dPercent); int iMaxHeight = Convert.ToInt32(lWarehouseCells.Max(l => l.CELL_HEIGHT) * dPercent); iMinHeight = iMinHeight > 20 ? iMinHeight : 20; iMaxHeight = iMaxHeight > 20 ? iMaxHeight : 20; //int iHighIndex = Int32.MaxValue; //int iHighIndex = lWarehouseCells.Where(l => l.CELL_HEIGHT > iMinCellHeigth).Max(l => l.CELL_Y); IEnumerable iHighCells = lWarehouseCells.Where(l => l.CELL_HEIGHT > iMinCellHeigth); int iHighIndex = iHighCells.Count() > 0 ? iHighCells.Min(l => l.CELL_Y) : 0; int iTotalTop = 20 + (iMaxY - iHighIndex + 1) * (iMaxHeight - iMinHeight); int iCanvasWidth = (iMaxX - iMinX + 1) * iMinWidth + iTotalLeft + iTotalRight; this.cWarehouseCells.Width = iCanvasWidth > 200 ? iCanvasWidth : 200; int iCanvasHeight = (iMaxY - iMinY + 1) * iMinHeight + iTotalTop + iTotalBottom; this.cWarehouseCells.Height = iCanvasHeight > 200 ? iCanvasHeight : 200; // 货位图 for (int i = iMinX; i <= iMaxX; ++i) { Label l = new Label { Content = i.ToString("D2"), Foreground = Brushes.DarkBlue, Width = iMinWidth, Height = 20, HorizontalContentAlignment = HorizontalAlignment.Center, VerticalContentAlignment = VerticalAlignment.Top }; Canvas.SetTop(l, (iMaxY - iMinY + 1) * iMinHeight + iTotalTop); Canvas.SetLeft(l, (i - iMinX) * iMinWidth + iTotalLeft); this.cWarehouseCells.Children.Add(l); } for (int i = iMinY; i <= iMaxY; ++i) { Label l = new Label { Content = i.ToString("D2"), Foreground = Brushes.DarkBlue, Width = 20, Height = iMinHeight, HorizontalContentAlignment = HorizontalAlignment.Right, VerticalContentAlignment = VerticalAlignment.Center }; if (i < iHighIndex) { Canvas.SetTop(l, (iMaxY - i) * iMinHeight + iTotalTop); } else { Canvas.SetTop(l, (iMaxY - i) * iMinHeight + iTotalTop - (i - iHighIndex + 0.5) * (iMaxHeight - iMinHeight)); } Canvas.SetLeft(l, iTotalLeft - l.Width - iMariginX * 2); this.cWarehouseCells.Children.Add(l); } int iSelectedCellID = 0; if (this.SelectedBorder != null) { iSelectedCellID = (this.SelectedBorder.DataContext as WH_CELL).CELL_ID; } foreach (WH_CELL wc in lWarehouseCells) { int iWidth = Convert.ToInt32(wc.CELL_WIDTH * dPercent); int iHeight = Convert.ToInt32(wc.CELL_HEIGHT * dPercent); Border b = new Border { BorderBrush = wc.CELL_ID == iSelectedCellID ? Brushes.Red : Brushes.Black, BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(1), Background = new LinearGradientBrush(SystemCode.WH_CELL_COLOR.GetColor(wc), Colors.White, new Point(0, 0), new Point(0, 1)), Width = (iWidth > iMinWidth ? iWidth : iMinWidth) - 2 * iMariginX, Height = (iHeight > iMinHeight ? iHeight : iMinHeight) - 2 * iMariginY, DataContext = wc, Child = new TextBlock { Text = wc.MANAGE_ID == 0 ? string.Empty : "R", VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center, Foreground = Brushes.Black } }; b.MouseDown += Border_MouseDown; Canvas.SetLeft(b, (wc.CELL_X - iMinX) * iMinWidth + iTotalLeft + iMariginX); if (wc.CELL_Y < iHighIndex) { Canvas.SetTop(b, (iMaxY - wc.CELL_Y) * iMinHeight + iTotalTop + iMariginY); } else { Canvas.SetTop(b, (iMaxY - wc.CELL_Y) * iMinHeight + iTotalTop + iMariginY - (wc.CELL_Y - iHighIndex + 1) * (iMaxHeight - iMinHeight)); } this.cWarehouseCells.Children.Add(b); if (wc.CELL_ID == iSelectedCellID) { this.SelectedBorder = b; } } // 统计数据 this.spRunStatus.Children.Add(new TextBlock { Margin = new Thickness(5), Text = $" - 空闲[{lWarehouseCells.Count(wc => wc.MANAGE_ID == 0)}]" }); this.spRunStatus.Children.Add(new TextBlock { Margin = new Thickness(5), Text = $"R - 运行[{lWarehouseCells.Count(wc => wc.MANAGE_ID > 0)}]" }); foreach (Color color in SystemCode.WH_CELL_COLOR.CellColors) { StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5) }; sp.Children.Add(new Border { Margin = new Thickness(2), CornerRadius = new CornerRadius(2), Width = 25, BorderThickness = new Thickness(1, 1.5, 2, 1), BorderBrush = Brushes.Black, Background = new LinearGradientBrush(color, Colors.White, new Point(0, 0), new Point(0, 1)) }); string sText = string.Empty; if (color == SystemCode.WH_CELL_COLOR.Full) { sText = $" - 物料[{lWarehouseCells.Count(wc => wc.CELL_FLAG == SystemCode.FLAG.Enable && wc.STORAGE_ID > 0 && wc.GOODS_ID > SystemCode.GOODS_ID.MaxStock)}]"; } else if (color == SystemCode.WH_CELL_COLOR.Stock) { sText = $" - 托盘[{lWarehouseCells.Count(wc => wc.CELL_FLAG == SystemCode.FLAG.Enable && wc.STORAGE_ID > 0 && wc.GOODS_ID < SystemCode.GOODS_ID.MaxStock)}]"; } else if (color == SystemCode.WH_CELL_COLOR.Nohave) { sText = $" - 空[{lWarehouseCells.Count(wc => wc.CELL_FLAG == SystemCode.FLAG.Enable && wc.STORAGE_ID == 0)}]"; } else if (color == SystemCode.WH_CELL_COLOR.Exception) { sText = $" - 异常[{lWarehouseCells.Count(wc => wc.CELL_FLAG == SystemCode.FLAG.Disable)}]"; } sp.Children.Add(new TextBlock { VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(1), Text = sText }); this.spCellStatus.Children.Add(sp); } } catch (Exception ex) { MessageDialog.ShowException(ex); } } private void Border_MouseDown(object sender, MouseButtonEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { try { Border b = sender as Border; if (b == null) { return; } WH_CELL wc = b.DataContext as WH_CELL; if (this.SelectedBorder != b) { if (this.SelectedBorder != null) { this.SelectedBorder.BorderBrush = Brushes.Black; } b.BorderBrush = Brushes.Red; this.SelectedBorder = b; this.tbCellCode.Text = wc.CELL_NAME; } switch (e.ClickCount) { case 1: if (this.U_CellClick != null) { this.U_CellClick(wc); } break; case 2: if (this.U_CellDoubleClick != null) { this.U_CellDoubleClick(wc); } break; } } catch (Exception ex) { MessageDialog.ShowException(ex); } } } } }