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.

667 lines
22 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.Drawing;
using System.Linq;
using System.Windows.Forms;
using POSV.ShoppingCart;
using POSV.Entity;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using POSV.Utils;
using POSV.Component;
using POSV.Template;
using POS.Language.Language;
namespace POSV.Business
{
public partial class FlavorPanelEx : AbstractFlyoutPanelEx
{
private int DefaultCategoryItemWidth = 93;
private Size DefaultMainMenuSize = Size.Empty;
private int DefaultPaddingLeftRight = -2;
/// <summary>
/// 选中行数据
/// </summary>
private readonly OrderItem _orderItem = null;
/// <summary>
/// 权限控制码
/// </summary>
private string _permissionCode = string.Empty;
/// <summary>
/// 授权人权限信息
/// </summary>
private Tuple<decimal , decimal , List<string> , Worker> _authz = null;
/// <summary>
/// 做法类型数据源
/// </summary>
private List<ProductMakeType> _makeTypeList = null;
/// <summary>
/// 做法数据源
/// </summary>
private List<ProductMakeDetail> _makeDetailList = null;
private MetroTileItem _currentFlavorItem = null;
public FlavorPanelEx(OrderItem item , string permissionCode , Tuple<decimal , decimal , List<string> , Worker> authz = null)
{
InitializeComponent();
this._orderItem = item;
this.bottomPanel.Text = this._orderItem.Name;
//当前只有一个分类,暂不显示
this.tabControl.TabsVisible = false;
this.Height = this.Height - 30;
//操作功能的权限码
this._permissionCode = permissionCode;
//授权人综合信息
this._authz = authz;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.SetStyle(ControlStyles.Selectable , true);
if (this.DesignMode) return;
this._makeTypeList = new List<ProductMakeType>();
ProductMakeType productMakeType = new ProductMakeType();
productMakeType.SeqNo = -10;
productMakeType.Name = LangProxy.ToLang("全部");
this._makeTypeList.Add(productMakeType);
//做法分类数据源
using (var db = Global.Instance.OpenDataBase)
{
List<ProductMakeType> makeTypeListTemp = db.Query<ProductMakeType>().OrderBy(x => x.SeqNo).ToList();
if (makeTypeListTemp != null)
{
this._makeTypeList.AddRange(makeTypeListTemp);
}
}
//做法分类
this.mainCategoryPage.OnPageChange += OnMainCategoryPageChange;
DefaultMainMenuSize = new Size(DefaultCategoryItemWidth, this.mainCategoryPage.Height);
//做法数据源
this._makeDetailList = BusinessUtils.Instance.GetMakesByProductId(this._orderItem.ProductId);
//已选择的做法
this.RefreshSelected(this._orderItem.Flavors ,null);
//加载全部做法
this.RefreshMain();
}
private void OnMainCategoryPageChange(object sender, EventArgs e)
{
RefreshMain();
}
private void RefreshMain()
{
ItemContainer ic = new ItemContainer();
MetroTileItem firstItem = null;
if (this._makeTypeList != null && this._makeTypeList.Count > 0)
{
this.mainCategoryPage.TotalCount = this._makeTypeList.Count;
this.mainCategoryPage.itemWidth = DefaultCategoryItemWidth;
//分页
var pageTypeList = this.mainCategoryPage.ListPager<ProductMakeType>(this._makeTypeList);
ic.MultiLine = false;
ic.ItemSpacing = 1;
ic.ResizeItemsToFit = false; //很关键
foreach (var type in pageTypeList)
{
MetroTileItem item = new MetroTileItem();
item.CheckBehavior = eMetroTileCheckBehavior.None;
item.Checked = false;
item.OptionGroup = "MainMenu";
item.TileStyle.TextAlignment = eStyleTextAlignment.Center;
item.Text = type.Name;
item.TileSize = DefaultMainMenuSize;
item.TileStyle.TextColor = Color.White;
item.TileStyle.BackColor = ColorTranslator.FromHtml("#333333");
item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#333333");
item.TileStyle.BorderColor = Color.Transparent;
item.TileStyle.BorderColor2 = Color.Transparent;
item.TileStyle.PaddingLeft = DefaultPaddingLeftRight;
item.TileStyle.PaddingRight = DefaultPaddingLeftRight;
item.Tag = type;
if (firstItem == null)
{
firstItem = item;
}
item.MouseDown += OnMainMenuMouseDown;
item.CheckedChanged += OnMainItemCheckedChange;
ic.SubItems.Add(item);
}
}
this.mainCategoryPage.RefreshUI(ic);
if (firstItem != null)
{
firstItem.Checked = true;
}
}
/// <summary>
/// 加载子菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnMainMenuMouseDown(object sender, MouseEventArgs e)
{
MetroTileItem obj = sender as MetroTileItem;
obj.Checked = true;
}
private void OnMainItemCheckedChange(object sender, EventArgs e)
{
MetroTileItem obj = sender as MetroTileItem;
if (obj.Checked)
{
obj.TileStyle.BackColor = ColorTranslator.FromHtml("#993366");
obj.TileStyle.BackColor2 = ColorTranslator.FromHtml("#993366");
//加载子类
var type = obj.Tag as ProductMakeType;
//加载大类下商品
LoadMaterialDetail(type);
}
else
{
obj.TileStyle.BackColor = ColorTranslator.FromHtml("#333333");
obj.TileStyle.BackColor2 = ColorTranslator.FromHtml("#333333");
}
}
private void LoadMaterialDetail(ProductMakeType type)
{
this.BuilderAll(type);
}
private void BuilderAll(ProductMakeType type)
{
//this.metroTilePanel.Items.Clear();
//ItemContainer itemContainer = new ItemContainer();
//itemContainer.ItemSpacing = 0;
//itemContainer.Orientation = eOrientation.Vertical;
//itemContainer.MultiLine = true;
//itemContainer.TitleStyle.Class = "MetroTileGroupTitle";
//ElementStyle style = (ElementStyle)itemContainer.TitleStyle;
//style.Font = Constant.BIG_FONT;
//style.TextColor = Color.Black;
//style.PaddingBottom = -1;
//style.PaddingLeft = style.PaddingRight = -1;
//if (type!=null && !string.IsNullOrEmpty(type.Id)) {
// BuilderMakeDetail(itemContainer, type);
//}
//else {
// foreach (var makeType in this._makeTypeList)
// {
// BuilderMakeDetail(itemContainer, makeType);
// }
//}
//this.metroTilePanel.Items.Add(itemContainer);
//this.metroTilePanel.Invalidate();
var lists = new List<ProductMakeDetail>();
if (string.IsNullOrEmpty(type.Id))
{
lists = this._makeDetailList;
}
else {
lists = this._makeDetailList.FindAll(x => x.TypeId == type.Id);
}
//做法数据源
//List<ProductMakeDetail> _makeDetailList = BusinessUtils.Instance.GetMakesByProductId(orderItem.ProductId);
this.makeControl.BindDataSource(lists, 1);
}
private void BuilderMakeDetail(ItemContainer itemContainer , ProductMakeType type)
{
if (string.IsNullOrEmpty(type.Id)) {
//如果是全部做法直接返回
return;
}
var lists = this._makeDetailList.FindAll(x => x.TypeId == type.Id);
//是否已经选择该做法
//var flavors = this._orderItem.Flavors;
foreach (var detail in lists)
{
MetroTileItem tileItem = new MetroTileItem();
tileItem.TileStyle.PaddingLeft = tileItem.TileStyle.PaddingRight = -1;
if (type.IsRadio == 1)
{
tileItem.OptionGroup = detail.TypeId;
//做法单选或者多选情况下的Key
tileItem.Description = detail.TypeId;
}
else
{
tileItem.OptionGroup = string.Empty;
//做法单选或者多选情况下的Key
tileItem.Description = detail.Id;
}
tileItem.SymbolColor = Color.Empty;
tileItem.TileSize = new Size(79, 50);
tileItem.TileStyle.CornerType = eCornerType.Square;
tileItem.TileStyle.Font = Constant.NORMAL_FONT;
tileItem.TileStyle.TextAlignment = eStyleTextAlignment.Center;
tileItem.TileStyle.TextLineAlignment = eStyleTextAlignment.Center;
if (detail.AddPrice > 0)
{
tileItem.TitleText = string.Format("{0}{1}" , Constant.CNY , detail.AddPrice);
tileItem.TitleTextAlignment = ContentAlignment.BottomCenter;
tileItem.TitleTextFont = Constant.SMALL_FONT;
tileItem.TileStyle.TextLineAlignment = eStyleTextAlignment.Near;
}
//做法名称
tileItem.Text = detail.Memo;
//做法分类对应的背景颜色
tileItem.TileStyle.BackColor = tileItem.TileStyle.BackColor2 = ColorTranslator.FromHtml(type.Color);
//去除边框颜色
tileItem.TileStyle.BorderColor = tileItem.TileStyle.BorderColor2 = Color.Transparent;
//将当前的对象缓存到Tag中为鼠标操作提供支持
FlavorItem flavor = new FlavorItem();
flavor.Id = IdWorkerUtils.Instance.NextId();
//做法单选或者多选情况下的Key
flavor.Group = tileItem.Description;
flavor.TenantId = this._orderItem.TenantId;
flavor.TradeNo = this._orderItem.TradeNo;
flavor.OrderId = this._orderItem.OrderId;
flavor.ItemId = this._orderItem.Id;
flavor.Name = detail.Memo;
flavor.MakeId = detail.Id;
flavor.Code = detail.No;
flavor.QtyFlag = detail.QtyFlag;
flavor.Price = detail.AddPrice;
flavor.Type = type.Type;
flavor.IsRadio = type.IsRadio;
tileItem.Tag = flavor;
tileItem.MouseDown += TileItemMouseDown;
tileItem.CheckedChanged += TileItemCheckedChanged;
itemContainer.SubItems.Add(tileItem);
}
}
private void RefreshSelected(List<FlavorItem> items,FlavorItem newItem)
{
//清空历史数据
this.itemPanel.Items.Clear();
ItemContainer ic = new ItemContainer();
ic.MultiLine = true;
ic.ItemSpacing = 0;
ic.LayoutOrientation = eOrientation.Horizontal;
foreach(var entity in items)
{
MetroTileItem item = this.GetItemTemplate();
item.TileStyle.Font = Constant.NORMAL_FONT;
item.TitleTextAlignment = ContentAlignment.BottomCenter;
item.TitleTextFont = Constant.SMALL_FONT;
item.TileStyle.TextLineAlignment = eStyleTextAlignment.Near;
item.TileStyle.TextAlignment = eStyleTextAlignment.Center;
if (entity.Price > 0)
{
item.TitleText = string.Format("{0}{1}*{2}" , Constant.CNY, entity.Price , entity.Quantity);
}
else
{
item.TitleText = string.Format("{0}" , entity.Quantity.ToString());
}
item.Text = entity.Name;
//做法分类对应的背景颜色
item.TileStyle.BackColor = item.TileStyle.BackColor2 = ColorTranslator.FromHtml(entity.Color);
//去除边框颜色
item.TileStyle.BorderColor = item.TileStyle.BorderColor2 = Color.Transparent;
item.EnableMarkup = true;
if (newItem != null && newItem.Group.Equals(entity.Group))
{
item.Checked = true;
this._currentFlavorItem = item;
}
item.MouseDown += OnSelectedItemMouseDown;
item.Tag = entity;
ic.SubItems.Add(item);
}
this.itemPanel.Items.Add(ic);
this.itemPanel.Invalidate();
}
private void OnSelectedItemMouseDown(object sender, MouseEventArgs e)
{
if (sender is MetroTileItem)
{
var item = sender as MetroTileItem;
var flavor = item.Tag as FlavorItem;
this._orderItem.Flavors.Remove(flavor);
this._currentFlavorItem = null;
//通知主界面改变
this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify, this._orderItem));
//刷新已选择做法
this.RefreshSelected(this._orderItem.Flavors, null);
}
}
private MetroTileItem GetItemTemplate()
{
MetroTileItem template = new MetroTileItem();
template.TileStyle.PaddingLeft = template.TileStyle.PaddingRight = -2;
template.EnableMarkup = true;
template.OptionGroup = "Flavors";
template.TileStyle.Font = Constant.NORMAL_FONT;
//显示大小
template.TileSize = new Size(79 , 55);
template.MouseDown += OnItemMouseDown;
return template;
}
private void OnItemMouseDown(object sender , MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
MetroTileItem item = (MetroTileItem)sender;
item.Checked = !item.Checked;
//标识为当前活跃,便于数量修改
item.Checked = true;
item.TileColor = eMetroTileColor.Coffee;
this._currentFlavorItem = item;
}
}
private void TileItemMouseDown(object sender , MouseEventArgs e)
{
MetroTileItem item = (MetroTileItem)sender;
var newItem = ObjectUtils.Copy<FlavorItem>(item.Tag as FlavorItem);
//当前的位置
int inx = this._orderItem.Flavors.Count;
//如果做法中已经包含当前操作的,调整数量
if (this._orderItem.Flavors.Exists(x => x.Group == newItem.Group))
{
var _oldItem = this._orderItem.Flavors.Find(x => x.Group == newItem.Group);
//在当前的位置
inx = this._orderItem.Flavors.IndexOf(_oldItem);
//如果单选基准数量重置为1否则基准数量自动加1
if (newItem.IsRadio == 1)
{
newItem.BaseQuantity = 1;
}
else
{
newItem.BaseQuantity = _oldItem.BaseQuantity + 1;
}
//删除
this._orderItem.Flavors.Remove(_oldItem);
}
else
{
//基准数量
newItem.BaseQuantity = 1;
}
newItem.OrderItemQuantity = this._orderItem.Quantity;
//存入新位置
this._orderItem.Flavors.Insert(inx, newItem);
//通知主界面改变
this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify , this._orderItem));
//刷新已选择做法
this.RefreshSelected(this._orderItem.Flavors,newItem);
}
private void TileItemCheckedChanged(object sender , EventArgs e)
{
MetroTileItem item = (MetroTileItem)sender;
}
private void FlavorItemDeleteAll(object sender , EventArgs e)
{
this._currentFlavorItem = null;
this._orderItem.Flavors.Clear();
//通知主界面改变
this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify , this._orderItem));
//刷新已选择做法
this.RefreshSelected(this._orderItem.Flavors,null);
}
private void OnCloseClick(object sender, EventArgs e)
{
this.OnCancelButtonClick(null);
}
//手工做法
private void OnHandClick(object sender, EventArgs e)
{
TxtKeyboardForm txtForm = new TxtKeyboardForm(string.Empty);
txtForm.NotifyChanged += (o, args) =>
{
switch (args.Action)
{
case NotifyAction.Accept:
{
var result = args.Data as string;
BuildHandFlavor(result);
}
break;
}
};
txtForm.ShowDialog();
}
private void BuildHandFlavor(string name)
{
if (string.IsNullOrEmpty(name))
{
return;
}
FlavorItem flavor = new FlavorItem();
flavor.Id = IdWorkerUtils.Instance.NextId();
//做法单选或者多选情况下的Key
flavor.Group = flavor.Id;
flavor.TenantId = this._orderItem.TenantId;
flavor.TradeNo = this._orderItem.TradeNo;
flavor.OrderId = this._orderItem.OrderId;
flavor.ItemId = this._orderItem.Id;
flavor.Name = name;
flavor.MakeId = flavor.Id;
flavor.Code = "000";
flavor.QtyFlag = 1;
flavor.Price = 0.00M;
flavor.Type = 0;
flavor.IsRadio = 1;
flavor.Hand = 1;
//当前的位置
int inx = this._orderItem.Flavors.Count;
//基准数量
flavor.BaseQuantity = 1;
flavor.OrderItemQuantity = this._orderItem.Quantity;
//存入新位置
this._orderItem.Flavors.Insert(inx, flavor);
//通知主界面改变
this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify, this._orderItem));
//刷新已选择做法
this.RefreshSelected(this._orderItem.Flavors, flavor);
}
/// <summary>
/// 选择做法事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnProductMakeCheckedChanged(object sender, Template.Component.ProductMakeEventArgs e)
{
//MetroTileItem item = (MetroTileItem)sender;
var make = e.ProductMakeDetail;
//获取做法类型
var type = BusinessUtils.Instance.GetMakeTypeById(make.TypeId);
if (type == null)
{
return;
}
var newItem = new FlavorItem();
newItem.Id = IdWorkerUtils.Instance.NextId();
newItem.TenantId = this._orderItem.TenantId;
newItem.TradeNo = this._orderItem.TradeNo;
newItem.OrderId = this._orderItem.OrderId;
newItem.ItemId = this._orderItem.Id;
newItem.Name = make.Memo;
newItem.MakeId = make.Id;
newItem.Code = make.No;
newItem.QtyFlag = make.QtyFlag;
newItem.Price = make.AddPrice;
newItem.Type = type.Type;
newItem.IsRadio = type.IsRadio;
//做法单选或者多选情况下的Key
if (newItem.IsRadio == 1)
{
newItem.Group = make.TypeId;
}
else
{
newItem.Group = make.Id;
}
//当前的位置
int inx = this._orderItem.Flavors.Count;
//如果做法中已经包含当前操作的,调整数量
if (this._orderItem.Flavors.Exists(x => x.Group == newItem.Group))
{
var _oldItem = this._orderItem.Flavors.Find(x => x.Group == newItem.Group);
//在当前的位置
inx = this._orderItem.Flavors.IndexOf(_oldItem);
//如果单选基准数量重置为1否则基准数量自动加1
if (newItem.IsRadio == 1)
{
newItem.BaseQuantity = 1;
}
else
{
newItem.BaseQuantity = _oldItem.BaseQuantity + 1;
}
//删除
this._orderItem.Flavors.Remove(_oldItem);
}
else
{
//基准数量
newItem.BaseQuantity = 1;
}
newItem.OrderItemQuantity = this._orderItem.Quantity;
//存入新位置
this._orderItem.Flavors.Insert(inx, newItem);
//通知主界面改变
this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify, this._orderItem));
//刷新已选择做法
this.RefreshSelected(this._orderItem.Flavors, newItem);
}
}
}