|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using POSV.Entity;
|
|
|
|
|
using POSV.Bean;
|
|
|
|
|
using DevComponents.DotNetBar.Metro;
|
|
|
|
|
using DevComponents.DotNetBar;
|
|
|
|
|
using POSV.Utils;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace POSV.Component
|
|
|
|
|
{
|
|
|
|
|
[ToolboxItem(true)]
|
|
|
|
|
public partial class TableX : BaseUserControl
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 桌台数据源
|
|
|
|
|
/// </summary>
|
|
|
|
|
private List<Table> _dataSource = null;
|
|
|
|
|
|
|
|
|
|
public TableX()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
|
|
|
|
this.BackColor = Color.Transparent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnLoad(e);
|
|
|
|
|
|
|
|
|
|
if (this.DesignMode) return;
|
|
|
|
|
|
|
|
|
|
//当前页码
|
|
|
|
|
this.PageNumber = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 刷新界面元素
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void RefreshUi()
|
|
|
|
|
{
|
|
|
|
|
if (this.itemPanel.Items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var items = this.itemPanel.Items[0].SubItems;
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var lists = this._dataSource.FindAll(x => x.TableExt != null);
|
|
|
|
|
|
|
|
|
|
Parallel.ForEach(lists , table =>
|
|
|
|
|
{
|
|
|
|
|
if (items.Count > 0 && items.Contains(table.Id))
|
|
|
|
|
{
|
|
|
|
|
var item = items[table.Id] as MetroTileItem;
|
|
|
|
|
|
|
|
|
|
this.ChangedStyle(table , item);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void BindDataSource(List<Table> dataSource , KeyboardAction action = KeyboardAction.None)
|
|
|
|
|
{
|
|
|
|
|
this._dataSource = dataSource;
|
|
|
|
|
|
|
|
|
|
if (this._dataSource == null)
|
|
|
|
|
{
|
|
|
|
|
this._dataSource = new List<Table>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//总数量
|
|
|
|
|
this.TotalCount = dataSource.Count;
|
|
|
|
|
|
|
|
|
|
//每页的显示数量
|
|
|
|
|
this.PageSize = this.Rows * this.Columns;
|
|
|
|
|
|
|
|
|
|
//清空历史数据
|
|
|
|
|
this.itemPanel.Items.Clear();
|
|
|
|
|
|
|
|
|
|
this.itemPanel.Font = this.GetSystemFont(this.FontSize);
|
|
|
|
|
|
|
|
|
|
//复制新的数据源,进行分页运算
|
|
|
|
|
var merge = TableMerge.Merge(this.Rows , this.Columns , dataSource , false);
|
|
|
|
|
|
|
|
|
|
var pager = ListPager(merge);
|
|
|
|
|
|
|
|
|
|
ItemContainer ic = new ItemContainer();
|
|
|
|
|
|
|
|
|
|
ic.MultiLine = true;
|
|
|
|
|
ic.ItemSpacing = 0;
|
|
|
|
|
ic.LayoutOrientation = eOrientation.Horizontal;
|
|
|
|
|
|
|
|
|
|
foreach (var entity in pager)
|
|
|
|
|
{
|
|
|
|
|
MetroTileItem item = this.GetItemTemplate();
|
|
|
|
|
|
|
|
|
|
item.EnableMarkup = true;
|
|
|
|
|
|
|
|
|
|
item.Name = entity.Id;
|
|
|
|
|
|
|
|
|
|
//绑定品类ID到Tag属性
|
|
|
|
|
item.Tag = entity;
|
|
|
|
|
|
|
|
|
|
switch (entity.Name)
|
|
|
|
|
{
|
|
|
|
|
case Constant.PREV_PAGER:
|
|
|
|
|
{
|
|
|
|
|
item.Image = POSV.Properties.Resources.left;
|
|
|
|
|
item.ImageTextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
|
|
|
|
|
|
|
|
|
|
item.TileStyle.BackColor = ColorTranslator.FromHtml(this.PagerColor);
|
|
|
|
|
item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.PagerColor);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Constant.NEXT_PAGER:
|
|
|
|
|
{
|
|
|
|
|
item.Image = POSV.Properties.Resources.right;
|
|
|
|
|
item.ImageTextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
|
|
|
|
|
|
|
|
|
|
item.TileStyle.BackColor = ColorTranslator.FromHtml(this.PagerColor);
|
|
|
|
|
item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.PagerColor);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
//绑定人数
|
|
|
|
|
item.Text = string.Format("可供{0}人",entity.Number);
|
|
|
|
|
|
|
|
|
|
//绑定桌名
|
|
|
|
|
item.TitleText = string.Format("{0}" , entity.Name);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.ChangedStyle(entity,item);
|
|
|
|
|
|
|
|
|
|
ic.SubItems.Add(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.itemPanel.Items.Add(ic);
|
|
|
|
|
this.itemPanel.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ChangedStyle(Table entity,MetroTileItem item = null)
|
|
|
|
|
{
|
|
|
|
|
if (entity == null || entity.TableExt == null) return;
|
|
|
|
|
|
|
|
|
|
if(item == null)
|
|
|
|
|
{
|
|
|
|
|
if (this.itemPanel.Items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var items = this.itemPanel.Items[0].SubItems;
|
|
|
|
|
if (items.Count > 0 && items.Contains(entity.Id))
|
|
|
|
|
{
|
|
|
|
|
item = items[entity.Id] as MetroTileItem;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (item == null) return;
|
|
|
|
|
|
|
|
|
|
switch (entity.TableExt.TableStatus)
|
|
|
|
|
{
|
|
|
|
|
case TableStatus.空闲:
|
|
|
|
|
{
|
|
|
|
|
//文字颜色
|
|
|
|
|
item.TileStyle.TextColor = ColorTranslator.FromHtml(this.TextColor0);
|
|
|
|
|
//背景颜色
|
|
|
|
|
item.TileStyle.BackColor = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
//边框颜色
|
|
|
|
|
item.TileStyle.BorderColor = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
item.TileStyle.BorderColor2 = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
|
|
|
|
|
//绑定桌名
|
|
|
|
|
item.TitleText = entity.Name;
|
|
|
|
|
|
|
|
|
|
//绑定人数
|
|
|
|
|
item.Text = string.Format("可供{0}人" , entity.Number);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TableStatus.在用:
|
|
|
|
|
{
|
|
|
|
|
//文字颜色
|
|
|
|
|
item.TileStyle.TextColor = ColorTranslator.FromHtml(this.TextColor1);
|
|
|
|
|
//背景颜色
|
|
|
|
|
item.TileStyle.BackColor = ColorTranslator.FromHtml(this.BackColor1);
|
|
|
|
|
item.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.BackColor1);
|
|
|
|
|
//边框颜色
|
|
|
|
|
item.TileStyle.BorderColor = ColorTranslator.FromHtml(this.BackColor1);
|
|
|
|
|
item.TileStyle.BorderColor2 = ColorTranslator.FromHtml(this.BackColor1);
|
|
|
|
|
|
|
|
|
|
//绑定桌名
|
|
|
|
|
item.TitleText = entity.Name;
|
|
|
|
|
|
|
|
|
|
//已经过去的时间,HH:mm
|
|
|
|
|
var diff = DateTimeUtils.MinuteDiff(DateTime.Now , Convert.ToDateTime(entity.TableExt.OpenTime));
|
|
|
|
|
//绑定人数
|
|
|
|
|
item.Text = string.Format("{0}人 {1} {2}" , entity.TableExt.TableNumber , diff , Constant.CNY + "0.00");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MetroTileItem GetItemTemplate()
|
|
|
|
|
{
|
|
|
|
|
MetroTileItem template = new MetroTileItem();
|
|
|
|
|
template.TileStyle.PaddingLeft = template.TileStyle.PaddingRight = -2;
|
|
|
|
|
|
|
|
|
|
template.EnableMarkup = true;
|
|
|
|
|
template.OptionGroup = "Table";
|
|
|
|
|
|
|
|
|
|
template.TileStyle.Font = this.itemPanel.Font;
|
|
|
|
|
|
|
|
|
|
template.TileStyle.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
|
|
|
|
|
template.TileStyle.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Far;
|
|
|
|
|
template.TitleTextAlignment = System.Drawing.ContentAlignment.TopCenter;
|
|
|
|
|
|
|
|
|
|
template.TileStyle.BorderWidth = 1;
|
|
|
|
|
template.TileStyle.CornerDiameter = 8;
|
|
|
|
|
template.TileStyle.CornerType = eCornerType.Rounded;
|
|
|
|
|
|
|
|
|
|
//桌号文字颜色
|
|
|
|
|
template.TitleTextColor = ColorTranslator.FromHtml(this.TextColor0);
|
|
|
|
|
|
|
|
|
|
//文字颜色
|
|
|
|
|
template.TileStyle.TextColor = ColorTranslator.FromHtml(this.TextColor0);
|
|
|
|
|
//背景颜色
|
|
|
|
|
template.TileStyle.BackColor = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
template.TileStyle.BackColor2 = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
//边框颜色
|
|
|
|
|
template.TileStyle.BorderColor = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
template.TileStyle.BorderColor2 = ColorTranslator.FromHtml(this.BackColor0);
|
|
|
|
|
|
|
|
|
|
//显示大小
|
|
|
|
|
template.TileSize = new Size(this.ItemWidth , this.ItemHeight);
|
|
|
|
|
|
|
|
|
|
template.MouseDown += OnItemMouseDown;
|
|
|
|
|
|
|
|
|
|
template.DoubleClick += OnItemDoubleClick;
|
|
|
|
|
|
|
|
|
|
return template;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnItemMouseDown(object sender , MouseEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
MetroTileItem item = (MetroTileItem)sender;
|
|
|
|
|
var table = item.Tag as Table;
|
|
|
|
|
|
|
|
|
|
switch (table.Name)
|
|
|
|
|
{
|
|
|
|
|
case Constant.PREV_PAGER:
|
|
|
|
|
{
|
|
|
|
|
item.Checked = false;
|
|
|
|
|
|
|
|
|
|
this.PageNumber = table.Pager;
|
|
|
|
|
|
|
|
|
|
this.BindDataSource(this._dataSource);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Constant.NEXT_PAGER:
|
|
|
|
|
{
|
|
|
|
|
item.Checked = false;
|
|
|
|
|
|
|
|
|
|
this.PageNumber = table.Pager;
|
|
|
|
|
|
|
|
|
|
this.BindDataSource(this._dataSource);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
item.Checked = true;
|
|
|
|
|
|
|
|
|
|
this.OnTableCheckedChanged(new TableEventArgs(table));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnItemDoubleClick(object sender , EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
MetroTileItem item = (MetroTileItem)sender;
|
|
|
|
|
var table = item.Tag as Table;
|
|
|
|
|
|
|
|
|
|
this.OnTableDoubleClick(new TableEventArgs(table));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public event TableEventHandler TableDoubleClick;
|
|
|
|
|
protected virtual void OnTableDoubleClick(TableEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
TableDoubleClick?.Invoke(this , e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public event TableEventHandler TableCheckedChanged;
|
|
|
|
|
protected virtual void OnTableCheckedChanged(TableEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
TableCheckedChanged?.Invoke(this , e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 分页List数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="data"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public List<Table> ListPager(List<Table> data)
|
|
|
|
|
{
|
|
|
|
|
var result = new List<Table>();
|
|
|
|
|
|
|
|
|
|
result.AddRange(data.Skip((this.PageNumber - 1) * this.PageSize).Take(this.PageSize));
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 显示的高度
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int ItemHeight { get; set; } = 70;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 显示的宽度
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int ItemWidth { get; set; } = 92;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
///默认行数
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int Rows => this.Height / this.ItemHeight;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 每一行显示的数量
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int Columns { get; set; } = 8;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 字体大小
|
|
|
|
|
/// </summary>
|
|
|
|
|
public SystemFont FontSize { get; set; } = SystemFont.正常;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 空闲状态显示颜色
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string BackColor0 { get; set; } = ColorTranslator.ToHtml(Color.Green);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 在用状态显示颜色
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string BackColor1{ get; set; } = ColorTranslator.ToHtml(Color.OrangeRed);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 分页按钮的颜色
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string PagerColor { get; set; } = ColorTranslator.ToHtml(Color.Green);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 文字显示颜色
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string TextColor0 { get; set; } = ColorTranslator.ToHtml(Color.Black);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 开台模式的文字颜色
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string TextColor1 { get; set; } = ColorTranslator.ToHtml(Color.Blue);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 每页的大小
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int PageSize { get; private set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 总页数
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int PageCount => this.PageSize <= 0 ? 0 : ((this.TotalCount + this.PageSize - 1) / this.PageSize);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前页码
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int PageNumber { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 总数量
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int TotalCount { get; private set; }
|
|
|
|
|
|
|
|
|
|
//是否有上一页
|
|
|
|
|
public bool HasPreviousPage
|
|
|
|
|
{
|
|
|
|
|
get { return PageNumber > 1; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//是否有下一页
|
|
|
|
|
public bool HasNextPage
|
|
|
|
|
{
|
|
|
|
|
get { return PageNumber < this.PageCount; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public delegate void TableEventHandler(object sender , TableEventArgs e);
|
|
|
|
|
|
|
|
|
|
public class TableEventArgs : EventArgs
|
|
|
|
|
{
|
|
|
|
|
public Table Table;
|
|
|
|
|
public TableEventArgs(Table data)
|
|
|
|
|
{
|
|
|
|
|
this.Table = data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|