using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data; namespace SiaSun.LMS.WPFClient.UC { /// /// ucStoreCell.xaml 的交互逻辑 /// public partial class ucStoreCell : UserControl { #region ------变量和属性 #region ------绘图常量 private const int tickFontSpac = 10; //绘制坐标时边界 private const int tickTopBounds = 10; //顶端边界 private const int tickLeftBounds = 60; //左边界 private const int tickClearanceX = 2; //货格间隙 private const int tickClearanceY = 2; private int intXMin = 2, intYMin = 1; //极限值 double dPercent = 0; //缩放比例 #endregion IList listCELL_STATUS = null; //DataTable tableCellSize = null; IList listWH_CELL = null; //选定货位事件代理 public delegate void U_SelectCELLConfirmHandler(SiaSun.LMS.Model.WH_CELL ST_CELL); public event U_SelectCELLConfirmHandler U_SelectCellConfirm; //单击事件代理 public delegate void U_CELLClickHandler(SiaSun.LMS.Model.WH_CELL ST_CELL); public event U_CELLClickHandler U_CellClick; int intWareHouseID = 0; SiaSun.LMS.Model.WH_CELL mWH_CELL_Selected = null; private string SelectCellStatus = Enum.CELL_STATUS.Nohave.ToString(); public string U_SelectCellStatus { get { return this.SelectCellStatus; } set { this.SelectCellStatus = value; } } /// /// 仓库编号 /// public int U_WareHouseID { get { return this.intWareHouseID; } set { intWareHouseID = value; } } /// /// 已经选定的货位 /// public Model.WH_CELL U_SelectedCell { get { return mWH_CELL_Selected; } set { mWH_CELL_Selected = value; } } #endregion public ucStoreCell() { InitializeComponent(); this.ucWare.U_WareHouseChanged += new ucWareHouseQuery.U_WareHouseChangedHandler(ucWare_U_WareHouseChanged); } //初始化控件 public void U_InitControl(string WAREHOUSE_TYPE) { //初始化仓库控件 try { //仓库信息初始化 this.InitWareHouseControl(WAREHOUSE_TYPE); //选定的货位不空 //if (this.mWH_CELL_Selected != null) //{ // //获得仓库编号 // Model.WH_AREA mWH_AREA = MainApp._I_CellService.cellget.AREA_GetModel(mWH_CELL_Selected.AREA_ID); // if (mWH_AREA != null) // { // this.ucWare.U_WAREHOUSE_ID = mWH_AREA.WAREHOUSE_ID; // this.ucWare.U_CELL_Z = mWH_CELL_Selected.CELL_Z; // } //} } catch (Exception ex) { MainApp._MessageDialog.ShowException("初始化仓库控件异常!" + ex.Message); } } #region ------仓库 /// /// 初始化仓库控件 /// private void InitWareHouseControl(string WAREHOUSE_TYPE) { this.ucWare.U_AllowShowArea = true; this.ucWare.U_AllowAreaNull = false; this.ucWare.U_AllowCellZNull = false; if (this.intWareHouseID > 0) { this.ucWare.U_WAREHOUSE_ID = this.intWareHouseID; } this.ucWare.U_InitControl(WAREHOUSE_TYPE); } //选择排显示不同排的货位信息 void ucWare_U_WareHouseChanged() { //初始化货位 this.InitCell(); } #endregion #region ------初始化并绘制货位 //初始化货位数据 private void InitCell() { try { //选定货位 this.mWH_CELL_Selected = null; //获得比例 dPercent = Convert.ToDouble(this.txtZoom.Text) / 100; //获得存储状态 listCELL_STATUS = MainApp._I_SystemService.ITEM_LIST_GetList_ITEM_CODE("CELL_STATUS"); //获得该排货位的尺寸信息 //this.tableCellSize = MainApp._I_WareHouseService.CELL_SIZE_GetTable(this.ucWare.U_WAREHOUSE_ID, this.ucWare.U_AREA_ID, this.ucWare.U_CELL_Z.ToString()); //获得该排的所有货位 this.listWH_CELL = MainApp._I_CellService.CELL_GetList_Z(this.ucWare.U_WAREHOUSE_ID, this.ucWare.U_CELL_Z.ToString()); //获得绘制货位的极限坐标信息 //if (tableCellSize.Rows.Count == 0) // return; //else //{ // this.intXMin = tableCellSize.Rows[0].IsNull("MIN_CELL_X") ? 0 : Convert.ToInt32(tableCellSize.Rows[0]["MIN_CELL_X"]); // this.intYMin = tableCellSize.Rows[0].IsNull("MIN_CELL_Y") ? 0 : Convert.ToInt32(tableCellSize.Rows[0]["MIN_CELL_Y"]); //} } catch (Exception ex) { MainApp._MessageDialog.ShowException("初始化货位数据异常!" + ex.Message); return; } //绘制货位 try { //绘制货位 this.DrawCell(); //绘制货位状态显示颜色 this.DrawCellStatus(); } catch (Exception ex) { MainApp._MessageDialog.ShowException("绘制货位异常!" + ex.Message); return; } } //绘制货位 private void DrawCell() { int currentPosionX = tickLeftBounds; //X坐标值 //清除所有内容 this.canvasCell.U_CleareVisual(); //绘制图形 foreach (var listGroupX in listWH_CELL.GroupBy(l => l.CELL_X)) { //重新初始化绘制坐标 int nextPositionY = tickTopBounds; int currentPositionY = 0; //获得该列最大的Y值 int iMaxGroupY = listGroupX.Max(m => m.CELL_Y); int iMinGroupY = listGroupX.Min(m => m.CELL_Y); ////获得该列最大宽度 int dMaxGroupWidth = Convert.ToInt32(Math.Ceiling(listGroupX.Max(w => w.CELL_WIDTH) * Convert.ToDecimal(this.dPercent))); try { var query = from x in listGroupX orderby x.CELL_Y descending select x; foreach (var mWH_CELL in query) { //坐标 int cell_x = mWH_CELL.CELL_X; int cell_y = mWH_CELL.CELL_Y; //货格占用尺寸 int areaWith = Convert.ToInt32(Convert.ToInt32(mWH_CELL.CELL_WIDTH) * this.dPercent); int areaHeight = Convert.ToInt32(Convert.ToInt32(mWH_CELL.CELL_HEIGHT) * this.dPercent); //判断Y值是否该列最大值 if (cell_y == iMaxGroupY) { currentPositionY = (iMaxGroupY - cell_y) * areaHeight + tickTopBounds; } else { currentPositionY = nextPositionY; } //获得下一个位置 nextPositionY = currentPositionY + areaHeight; //当前区域坐标 int x = currentPosionX; int y = currentPositionY; //判断货位存储状态 SiaSun.LMS.Model.SYS_ITEM_LIST mCELL_STATUS = listCELL_STATUS.Single(r => r.ITEM_LIST_CODE == mWH_CELL.CELL_STATUS); //绘制货位的存储状态 Color colorCellStatus = this.GetCellStatusColor(mCELL_STATUS.ITEM_LIST_REMARK); //绘制图形 DrawCellSquare(mWH_CELL, colorCellStatus, new Pen(Brushes.Black, 1), new Point(x, y), new Size(areaWith, areaHeight), (this.mWH_CELL_Selected != null && this.mWH_CELL_Selected.CELL_ID == mWH_CELL.CELL_ID)); #region ------判断是否站台或工位、并绘制边缘即坐标 //判断货格类型 if (mWH_CELL.CELL_TYPE == Enum.CELL_TYPE.Cell.ToString()) { //绘X坐标 if (cell_y == intYMin) { this.DrawPosition(Colors.DarkBlue, new Point(x + areaWith / 2, y + areaHeight), cell_x.ToString()); } //Y轴坐标 if (cell_x == intXMin) { this.DrawPosition(Colors.DarkBlue, new Point(x - tickClearanceX - tickFontSpac - 25, y + areaHeight / 2 - this.FontSize / 2), cell_y.ToString()); } } #endregion //设置宽度 if (this.canvasCell.Width.Equals(double.NaN) || this.canvasCell.Width < x + areaWith) { this.canvasCell.Width = x + areaWith + tickLeftBounds; } //判断是否超出界限 if (iMinGroupY == cell_y) { this.canvasCell.Height = (this.canvasCell.ActualHeight > y + areaHeight + tickFontSpac) ? this.canvasCell.MinHeight : (y + areaHeight + tickFontSpac); } } currentPosionX += (listGroupX.Key % 5 == 0) ? Convert.ToInt32(dMaxGroupWidth) + tickClearanceX : Convert.ToInt32(dMaxGroupWidth); } catch (Exception ex) { MainApp._MessageDialog.ShowException(ex); } } } //绘制可视对象 private void DrawCellSquare(Model.WH_CELL mWH_CELL, Color drawingColor, Pen drawingPen, Point topLeftCorner, Size squareSize, bool IsSelected) { DrawingVisual visual = new DrawingVisual(); using (DrawingContext dc = visual.RenderOpen()) { //判断是否选中 drawingPen = IsSelected ? new Pen(Brushes.Red, 1) : drawingPen; Point pointCell = new Point(topLeftCorner.X + tickClearanceX, topLeftCorner.Y + tickClearanceY); Size sizeCell = new Size(squareSize.Width - 2 * tickClearanceX, squareSize.Height - 2 * tickClearanceY); LinearGradientBrush brush = new LinearGradientBrush(drawingColor, Colors.White, new Point(0, 0), new Point(0, 1)); Rect rect = new Rect(pointCell, sizeCell); //绘制边框 dc.DrawRoundedRectangle(brush, drawingPen, rect, 1, 1); //运行状态 if (mWH_CELL.CELL_TYPE == Enum.CELL_TYPE.Cell.ToString()) { FormattedText textRunStatus = new FormattedText((mWH_CELL.RUN_STATUS == "Enable" ? string.Empty : mWH_CELL.RUN_STATUS.Substring(0, 1).ToUpper()), this.Language.GetEquivalentCulture(), System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, this.FontStyle, FontWeights.Normal, this.FontStretch), (squareSize.Height - tickClearanceY) / 2, Brushes.Black); textRunStatus.TextAlignment = TextAlignment.Center; dc.DrawText(textRunStatus, new Point(pointCell.X + sizeCell.Width / 2, pointCell.Y + tickClearanceY)); } else { FormattedText textCellName = new FormattedText(mWH_CELL.CELL_NAME, this.Language.GetEquivalentCulture(), System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, this.FontStyle, FontWeights.Normal, this.FontStretch), this.FontSize, Brushes.Black); textCellName.TextAlignment = TextAlignment.Center; dc.DrawText(textCellName, new Point(pointCell.X + sizeCell.Width / 2, pointCell.Y + sizeCell.Height / 2 - this.FontSize / 2)); FormattedText textCellNameS = new FormattedText((mWH_CELL.RUN_STATUS == "Enable" ? string.Empty : mWH_CELL.RUN_STATUS.Substring(0, 1).ToUpper()), this.Language.GetEquivalentCulture(), System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, this.FontStyle, FontWeights.Bold, this.FontStretch), (squareSize.Height - tickClearanceY) / 2, Brushes.Black); textCellNameS.TextAlignment = TextAlignment.Right; dc.DrawText(textCellNameS, new Point(pointCell.X + sizeCell.Width, pointCell.Y + sizeCell.Height / 2 - this.FontSize / 2)); } this.canvasCell.U_AddVisual(visual, new DrawingCellObj(mWH_CELL, rect)); } } /// /// 绘制坐标值 /// private void DrawPosition(Color drawingColor, Point potinPosition, string Value) { DrawingVisual visual = new DrawingVisual(); using (DrawingContext dc = visual.RenderOpen()) { FormattedText text = new FormattedText(Value, this.Language.GetEquivalentCulture(), System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, this.FontStyle, FontWeights.Bold, this.FontStretch), this.FontSize, new SolidColorBrush(drawingColor)); text.TextAlignment = TextAlignment.Center; dc.DrawText(text, potinPosition); this.canvasCell.U_AddVisual(visual, null); } } //绘制可视对象 private void DrawSelectedCellSquare(Visual visual, bool IsSelected) { object objDrawing = this.canvasCell.U_GetObjFromVisual(visual); if (objDrawing != null) { DrawingCellObj obj = objDrawing as DrawingCellObj; Model.WH_CELL mWH_CELL = obj._WH_CELL; Rect rect = obj._Rect; //清除原有的对象 this.canvasCell.U_DeleteVisual(visual); //判断货位存储状态 SiaSun.LMS.Model.SYS_ITEM_LIST mCELL_STATUS = listCELL_STATUS.Single(r => r.ITEM_LIST_CODE == mWH_CELL.CELL_STATUS); //绘制货位的存储状态 Color colorCellStatus = this.GetCellStatusColor(mCELL_STATUS.ITEM_LIST_REMARK); //绘制图形 DrawCellSquare(mWH_CELL, colorCellStatus, new Pen(Brushes.Black, 1), new Point(rect.X - tickClearanceX, rect.Y - tickClearanceY), new Size(rect.Width + 2 * tickClearanceX, rect.Height + 2 * tickClearanceY), IsSelected); //设置选定值 if (IsSelected) { mWH_CELL_Selected = mWH_CELL; //显示 SetCellInfo(mWH_CELL); } } } /// /// 显示坐标指示 /// private void DrawDirection() { int intStartX = 10; int intStartY = 30; int intDistance = 15; DrawingVisual visual = new DrawingVisual(); using (DrawingContext drawContext = visual.RenderOpen()) { Brush brush = new SolidColorBrush(Colors.Gray); Pen pen = new Pen(brush, 1); pen.StartLineCap = PenLineCap.Flat; pen.EndLineCap = PenLineCap.Triangle; drawContext.DrawLine(pen, new Point(intStartX, intStartY), new Point(intStartX, intStartY - intDistance)); drawContext.DrawLine(pen, new Point(intStartX, intStartY), new Point(intStartX + intDistance, intStartY)); FormattedText formateTextY = new FormattedText("层", this.Language.GetEquivalentCulture(), System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, this.FontStyle, FontWeights.Bold, this.FontStretch), this.FontSize, brush); drawContext.DrawText(formateTextY, new Point(intStartX - this.FontSize / 2, intStartY - intDistance - this.FontSize - tickClearanceY)); FormattedText formateTextX = new FormattedText("列", this.Language.GetEquivalentCulture(), System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, this.FontStyle, FontWeights.Bold, this.FontStretch), this.FontSize, brush); drawContext.DrawText(formateTextX, new Point(intStartX + intDistance + tickClearanceX, intStartY - this.FontSize / 2)); this.canvasCell.U_AddVisual(visual, null); } } /// /// 获得颜色值 /// private Color GetCellStatusColor(string ColorName) { Color colorStatus; //判断是否设置颜色 if (!string.IsNullOrEmpty(ColorName)) { ColorConverter colorConvert = new ColorConverter(); colorStatus = (Color)colorConvert.ConvertFrom(ColorName); if (colorStatus == null) colorStatus = (Color)this.Resources["colorDefaultCellStatus"]; } else { colorStatus = (Color)this.Resources["colorDefaultCellStatus"]; } return colorStatus; } /// /// 绘制显示状态 /// private void DrawCellStatus() { try { //初始化显示 this.panelCellStatus.Children.Clear(); this.panelRunStatus.Children.Clear(); //获得状态描述信息 IList list_RUN_STAUTS = MainApp._I_SystemService.ITEM_LIST_GetList_ITEM_CODE("RUN_STATUS"); IList list_CELL_STAUTS = MainApp._I_SystemService.ITEM_LIST_GetList_ITEM_CODE("CELL_STATUS"); //获得运行状态字符串 foreach (SiaSun.LMS.Model.SYS_ITEM_LIST mRUN_STAUTS in list_RUN_STAUTS.OrderBy(r => r.ITEM_LIST_ORDER)) { //获得该运行状态下的货位数量 int intRunStatusCount = this.listWH_CELL.Count(r => r.RUN_STATUS == mRUN_STAUTS.ITEM_LIST_CODE); TextBlock txtRunStatus = new TextBlock(); txtRunStatus.Margin = new Thickness(5); this.panelRunStatus.Children.Add(txtRunStatus); txtRunStatus.Text = string.Format("{0} - {1}[{2}]", (mRUN_STAUTS.ITEM_LIST_CODE.Substring(0, 1).ToUpper()), mRUN_STAUTS.ITEM_LIST_NAME, intRunStatusCount <= 0 ? 0 : intRunStatusCount); } //绘制存储状态 foreach (SiaSun.LMS.Model.SYS_ITEM_LIST mCELL_STATUS in list_CELL_STAUTS.OrderBy(r => r.ITEM_LIST_ORDER)) { StackPanel panelItem = new StackPanel(); panelItem.Orientation = Orientation.Horizontal; panelItem.Margin = new Thickness(5); this.panelCellStatus.Children.Add(panelItem); //获得货位状态颜色 Color colorStatus = this.GetCellStatusColor(mCELL_STATUS.ITEM_LIST_REMARK); //显示颜色 Border border = new Border(); border.Margin = new Thickness(2); border.CornerRadius = new CornerRadius(2); border.Width = 25; border.BorderThickness = new Thickness(1, 1.5, 2, 1); border.BorderBrush = Brushes.Black; border.Background = new LinearGradientBrush(colorStatus, Colors.White, new Point(0, 0), new Point(0, 1)); panelItem.Children.Add(border); //获得该货位状态下的货位数量 int intCellStatusCount = this.listWH_CELL.Count(r => r.CELL_STATUS == mCELL_STATUS.ITEM_LIST_CODE); //显示描述 TextBlock txtCellStatus = new TextBlock(); txtCellStatus.VerticalAlignment = System.Windows.VerticalAlignment.Center; txtCellStatus.Margin = new Thickness(1); txtCellStatus.Text = string.Format(" - {0}[{1}]", mCELL_STATUS.ITEM_LIST_NAME, intCellStatusCount <= 0 ? 0 : intCellStatusCount); panelItem.Children.Add(txtCellStatus); } } catch (Exception ex) { MainApp._MessageDialog.ShowException(string.Format("绘制货位运行状态或存储状态描述失败!") + ex.Message); } } #endregion #region 存储状态设置 private void MenuItem_Click(object sender, RoutedEventArgs e) { string sResult = string.Empty; if (MainApp._USER.USER_CODE.ToUpper() != "SUPER" && MainApp._USER.USER_CODE.ToUpper() != "SA") { return; } MenuItem mi = e.OriginalSource as MenuItem; if (mi != null && mWH_CELL_Selected != null) { if (mWH_CELL_Selected.CELL_FLAG == "0") { return; } MainApp._I_CellService.CellUpdateStatus(mWH_CELL_Selected.CELL_ID, mi.Name, string.Empty, out sResult); this.InitCell(); } } #endregion #region 运行状态设置 private void menuRunStatus_Click(object sender, RoutedEventArgs e) { string sResult = string.Empty; if (MainApp._USER.USER_CODE.ToUpper() != "SUPER" && MainApp._USER.USER_CODE.ToUpper() != "SA") { return; } MenuItem mi = e.OriginalSource as MenuItem; if (mi != null && mWH_CELL_Selected != null) { if (mWH_CELL_Selected.CELL_FLAG == "0") { return; } MainApp._I_CellService.CellUpdateStatus(mWH_CELL_Selected.CELL_ID, string.Empty, mi.Name, out sResult); this.InitCell(); } } #endregion #region ------鼠标事件 /// /// 鼠标事件 /// private void canvasCell_MouseDown(object sender, MouseButtonEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { try { Visual visual = this.canvasCell.U_GetVisual(e.GetPosition(this.canvasCell)); if (visual != null) { Visual visualSelected = null; //取消选中 if (mWH_CELL_Selected != null) { Dictionary dic = this.canvasCell.U_DicVisual; int c = dic.Count(r => r.Value != null && (r.Value as DrawingCellObj)._WH_CELL.CELL_ID == mWH_CELL_Selected.CELL_ID); if (dic.Count(r => r.Value != null && (r.Value as DrawingCellObj)._WH_CELL.CELL_ID == mWH_CELL_Selected.CELL_ID) > 0) { visualSelected = dic.First(r => r.Value != null && (r.Value as DrawingCellObj)._WH_CELL.CELL_ID == mWH_CELL_Selected.CELL_ID).Key; } } //判断是是否相同节点 if (!visual.Equals(visualSelected)) { //取消选中 if (visualSelected != null) { DrawSelectedCellSquare(visualSelected, false); } //选中 DrawSelectedCellSquare(visual, true); } int intClickCount = e.ClickCount; switch (intClickCount) { case 1: //调用事件 if (this.U_CellClick != null) { this.U_CellClick(mWH_CELL_Selected); } break; case 2: if (this.U_SelectCellConfirm != null) { this.U_SelectCellConfirm(mWH_CELL_Selected); } break; } } } catch (Exception ex) { MainApp._MessageDialog.ShowException(ex); } } } /// /// 显示货位信息 /// /// private void SetCellInfo(Model.WH_CELL mWH_CELL) { this.txtCellCode.Text = mWH_CELL.CELL_CODE; } #endregion //按钮事件 private void WrapPanel_Click(object sender, RoutedEventArgs e) { Button btn = e.OriginalSource as Button; if (btn != null) { switch (btn.Name) { case "btnZoomOut": this.txtZoom.Text = (Convert.ToInt32(this.txtZoom.Text) < 100 ? Convert.ToInt32(this.txtZoom.Text) + 1 : 100).ToString(); this.InitCell(); break; case "btnZoomIn": this.txtZoom.Text = (Convert.ToInt32(this.txtZoom.Text) > 1 ? Convert.ToInt32(this.txtZoom.Text) - 1 : 1).ToString(); this.InitCell(); break; case "btnZoom": this.txtZoom.Text = "100"; this.InitCell(); break; case "btnUpdate": this.InitCell(); break; } } } private void ContextMenu_Click(object sender, RoutedEventArgs e) { MenuItem menuItem = e.OriginalSource as MenuItem; if (menuItem == null) { return; } if (mWH_CELL_Selected != null && (mWH_CELL_Selected.CELL_STATUS == Enum.CELL_STATUS.Have.ToString() || mWH_CELL_Selected.CELL_STATUS == Enum.CELL_STATUS.Pallet.ToString())) { switch (menuItem.Name) { case "menuMove": break; } } } } /// /// 绘制对象 /// public class DrawingCellObj { private Model.WH_CELL mWH_CELL; private Rect rec; public Model.WH_CELL _WH_CELL { get { return mWH_CELL; } set { mWH_CELL = value; } } public Rect _Rect { get { return rec; } set { rec = value; } } public DrawingCellObj(Model.WH_CELL _mWH_CELL, Rect _rec) { this.mWH_CELL = _mWH_CELL; this.rec = _rec; } } }