You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

426 lines
13 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}
}