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.

2810 lines
106 KiB
C#

9 months ago
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Rendering;
using DevComponents.DotNetBar.SuperGrid;
using DevComponents.DotNetBar.SuperGrid.Style;
using POSV.Bean;
using POSV.Business;
using POSV.Card;
using POSV.Component;
using POSV.Entity;
using POSV.Helper;
using POSV.MessageEvent;
using POSV.MsgCenter;
using POSV.Proxy.GuoPan;
using POSV.Shift;
using POSV.ShoppingCart;
using POSV.Utils;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace POSV
{
public partial class FastTemplate : BaseForm
{
/// <summary>
/// 计时器
/// </summary>
private System.Timers.Timer timer;
//当前订单对象
private OrderObject _orderObject = null;
//当前选中的单品行记录
private OrderItem _orderItem = null;
private object _promLock = new object();
//是否正在计算促销,防止操作过快
private bool _PromCalculateIng = false;
public FastTemplate()
{
InitializeComponent();
InitializeGrid();
this.txtCash.Multiline = false;
this.txtCash.GotFocus += this.OnInputGotFocus;
this.categoryControl.CategoryXCheckedChanged += OnCategoryXCheckedChanged;
this.productControl.ProductXClick += OnProductXClick;
//注册结算支付事件通知
MsgEvent.RemoveListener(Constant.ORDER_PAYMENT_NOTIFY, this.OrderPaymentEventNotify);
MsgEvent.Receive(Constant.ORDER_PAYMENT_NOTIFY, this.OrderPaymentEventNotify);
}
/// <summary>
/// 结账通知事件
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
protected virtual void OrderPaymentEventNotify(object sender, MsgEventArgs args)
{
if (args.Data is OrderObject)
{
var oldMember = this._orderObject.Member;
var newOrderObject = args.Data as OrderObject;
if (newOrderObject.Member != null && oldMember == null)
{
//复制出来之前的gridrow
foreach (var item in newOrderObject.Items)
{
var oldItem = this._orderObject.Items.FirstOrDefault(x => x.Id == item.Id);
if (oldItem != null)
{
item.GridRow = oldItem.GridRow;
}
}
this._orderObject = newOrderObject;
this.Invoke(new Action(() =>
{
//修改会员卡号显示
string showCardNo = string.IsNullOrEmpty(this._orderObject.Member.CurrentCard.FaceNo) ? this._orderObject.Member.CurrentCard.CardNo : newOrderObject.Member.CurrentCard.FaceNo;
//会员卡号
//this.lblMemberCardNo.Text = string.Format(this.lblMemberCardNo.Tag.ToString(), CardUtils.CardNoEncrypt(showCardNo));
//会员姓名
//this.lblMemberName.Text = string.Format(this.lblMemberName.Tag.ToString(), this._orderObject.Member.Name);
//会员余额
//this.lblMemberAmount.Text = string.Format(this.lblMemberAmount.Tag.ToString(), this._orderObject.Member.CurrentCard.AvailableAmount);
//会员积分
//this.lblMemberPoint.Text = string.Format(this.lblMemberPoint.Tag.ToString(), this._orderObject.Member.CurrentCard.TotalPoint);
foreach (var item in this._orderObject.Items)
{
RefreshRow(item);
}
RefreshUiEx();
}));
}
else
{
this._orderObject = newOrderObject;
}
this.Invoke(new Action(() =>
{
var result = BusinessUtils.Instance.OrderFinished(_orderObject);
if (result.Item1)
{
this.DestoryOrderObject(false);
}
else
{
ShowToastNotify(this, result.Item2);
}
}));
}
}
private void InitializeGrid()
{
try
{
GridPanel panel = gridControl.PrimaryGrid;
gridControl.GetDetailRowHeight -= GridControlRowGetDetailHeight;
gridControl.GetDetailRowHeight += GridControlRowGetDetailHeight;
gridControl.PostRenderRow -= GridControlPostRenderRow;
gridControl.PostRenderRow += GridControlPostRenderRow;
gridControl.RowActivated -= GridControlRowActivated;
gridControl.RowActivated += GridControlRowActivated;
gridControl.CellClick -= GridControlCellClick;
gridControl.CellClick += GridControlCellClick;
//行最小高度
panel.MinRowHeight = 40;
panel.DefaultRowHeight = 0;
panel.Footer.Visible = false;
panel.Footer.RowHeight = 0;
panel.InitialSelection = RelativeSelection.None;
panel.InitialActiveRow = RelativeRow.None;
//滚动条
//this.gridControl.Width = this.leftContainer.Width + 16;
this.gridControl.HScrollBarVisible = false;
this.gridControl.VScrollBarVisible = true;
this.gridControl.VScrollBar.Width = 0;
}
catch (Exception ex)
{
LOGGER.Error(ex, "初始化购物车界面异常");
}
finally
{
this.leftContainer.Invalidate();
}
}
void GridControlRowGetDetailHeight(object sender, GridGetDetailRowHeightEventArgs e)
{
GridRow row = e.GridRow;
if (row != null)
{
OrderItem item = row.Tag as OrderItem;
int isFlavor = (int)row["flavor"].Value;
if (isFlavor == 1)
{
string text = item.FlavorNames;
Rectangle r = row.FirstVisibleCell.ContentBounds;
Rectangle t = row.LastVisibleCell.ContentBounds;
Size rsize = e.SizeNeeded;
rsize.Height = 0;
rsize.Width = (t.Right - r.Left);
var sf = TextFormatFlags.Left | TextFormatFlags.NoPadding | TextFormatFlags.WordBreak;
Size size = TextRenderer.MeasureText(text, Constant.DEFAULT_FONT, rsize, sf);
e.PostDetailHeight = size.Height;
}
}
}
void GridControlPostRenderRow(object sender, GridPostRenderRowEventArgs e)
{
GridRow row = e.GridRow as GridRow;
if (row != null)
{
OrderItem item = row.Tag as OrderItem;
//是否下划线
int isUnderline = (int)row["underline"].Value;
//是否包含口味
int isFlavor = (int)row["flavor"].Value;
Rectangle r = row.FirstVisibleCell.ContentBounds;
Rectangle t = row.LastVisibleCell.ContentBounds;
string text = item.FlavorNames;
r.Width = t.Right - r.X;// - Dpi.Width5;
r.Y = e.Bounds.Bottom - row.EffectivePostDetailRowHeight;// - Dpi.Height5;
r.Height = row.EffectivePostDetailRowHeight;
if (isFlavor == 1)
{
//e.Graphics.FillRectangle(Brushes.LightPink , r);
//e.Graphics.DrawRectangle(Pens.RosyBrown , r);
r.Inflate(-2, 1);
var sf = TextFormatFlags.Left | TextFormatFlags.NoPadding | TextFormatFlags.WordBreak;
TextRenderer.DrawText(e.Graphics, text, Constant.DEFAULT_FONT, r,
row.IsSelected ? Color.DimGray : Color.DimGray, sf);
}
//绘制下边线
if (isUnderline == 1)
{
System.Drawing.Pen pen1 = new System.Drawing.Pen(System.Drawing.Color.DarkGray);//画笔
e.Graphics.DrawLine(pen1, new Point(r.Left, t.Bottom + row.EffectivePostDetailRowHeight), new Point(t.Right, t.Bottom + row.EffectivePostDetailRowHeight));
pen1.Dispose();
}
//绘制右边线
System.Drawing.Pen pen = new System.Drawing.Pen(SystemColors.ControlDark);//画笔
e.Graphics.DrawLine(pen, new Point(t.Right, t.Top - 1), new Point(t.Right, row.EffectivePostDetailRowHeight + t.Bottom));
pen.Dispose();
}
}
private void GridControlRowActivated(object sender, GridRowActivatedEventArgs e)
{
if (e.NewActiveRow != null)
{
GridPanel panel = e.GridPanel;
panel.SetSelected(e.OldActiveRow, false);
panel.SetSelected(e.NewActiveRow, true);
panel.SetActiveRow(e.NewActiveRow);
//当前行的对象
OrderItem orderItem = e.NewActiveRow.Tag as OrderItem;
//设置当前活跃行
this._orderItem = orderItem;
//通知副屏,选中指定行
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.UPDATEORDERITEM, orderItem));
}
}
}
/// <summary>
/// 点击点单列表中任意单元格事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void GridControlCellClick(object sender, GridCellClickEventArgs e)
{
if (e.MouseEventArgs.Button == MouseButtons.Left)
{
OrderItem orderItem = e.GridCell.GridRow.Tag as OrderItem;
//设置当前活跃行
this._orderItem = orderItem;
}
}
/// <summary>
/// 更新购物车列表当前活跃行
/// </summary>
private void UpdateGridRow()
{
this.Invoke(new Action(() =>
{
if (this._orderItem == null) return;
RefreshRow(this._orderItem);
}));
}
private void RefreshRow(OrderItem orderItem)
{
GridRow row = orderItem.GridRow;
//删除订单项时,判空
if (row == null || row["name"] == null)
{
return;
}
//商品名称显示规格
string _productName = orderItem.DisplayName;
decimal _quantity = orderItem.Quantity;
string _unit = orderItem.ProductUnitName;
//列表是否显示折后价
bool showDiscountPrice = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_SHOW_DISCOUNTPRICE, false);
decimal _salePrice = orderItem.Price;
if (showDiscountPrice)
{
_salePrice = orderItem.DiscountPrice;
}
decimal _amount = orderItem.Amount;
decimal _detailMain = 0.00M;
//if (orderItem.RowState == OrderRowState.套餐主)
//{
// _detailMain = this._orderObject.Items.FindAll(x=>x.RowState == OrderRowState.套餐明 && orderItem.Id.Equals(x.ParentId)).Sum(m => m.FlavorDiscountAmount); ;
//}
if (showDiscountPrice)
{
_amount = orderItem.Amount - (orderItem.TotalDiscountAmount + _detailMain);
}
decimal _promotion = orderItem.TotalDiscountAmount + _detailMain;
row["name"].Value = _productName;
row["quantity"].Value = _quantity;
row["price"].Value = OrderUtils.ToRound(_salePrice);
row["unit"].Value = _unit;
row["amount"].Value = OrderUtils.ToRound(_amount);
row["discount"].Value = _promotion;
this._orderItem.Discount = _promotion;
if (orderItem.RowState == OrderRowState.)
{
row["quantity"].Value = orderItem.Quantity;
row["price"].Value = "";
row["amount"].Value = orderItem.SuitAmount > 0 ? ("+" + orderItem.SuitAmount) : "";
row["discount"].Value = "";
this._orderItem.Discount = 0;
}
if (orderItem.Flavors.Count() > 0)
{
row["flavor"].Value = 1;
}
else
{
row["flavor"].Value = 0;
}
row.InvalidateRender();
row.InvalidateLayout();
//通知副屏
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.UPDATEORDERITEM, orderItem));
}
}
/// <summary>
/// 更新套餐主信息
/// </summary>
/// <param name="item"></param>
private void UpdateSuitMain(OrderItem item)
{
if (item.RowState == OrderRowState. || item.RowState == OrderRowState.)
{
var mainItem = this._orderObject.Items.Find(x => x.Group == item.Group && x.RowState == OrderRowState.);
var subItems = this._orderObject.Items.FindAll(x => x.Group == item.Group && x.RowState == OrderRowState.);
if (mainItem != null && subItems != null)
{
mainItem.FlavorCount = subItems.Sum(x => x.FlavorCount);
mainItem.FlavorAmount = subItems.Sum(x => x.FlavorAmount);
mainItem.FlavorDiscountAmount = subItems.Sum(x => x.FlavorDiscountAmount);
mainItem.FlavorReceivableAmount = subItems.Sum(x => x.FlavorReceivableAmount);
//刷新购物车
this.RefreshRow(mainItem);
}
}
}
/// <summary>
/// 刷新整个点单列表
/// </summary>
private void UpdateGrid()
{
this.Invoke(new Action(() =>
{
foreach (var item in this._orderObject.Items)
{
RefreshRow(item);
}
}));
}
/// <summary>
/// 刷新点单列表指定行
/// </summary>
/// <param name="item"></param>
private void UpdateGridRow(OrderItem item)
{
this.Invoke(new Action(() =>
{
//设置当前活跃行
this._orderItem = item;
GridPanel panel = gridControl.PrimaryGrid;
panel.SetSelected(panel.ActiveRow, false);
if (this._orderItem != null)
{
panel.SetSelected(this._orderItem.GridRow, true);
panel.SetActiveRow(this._orderItem.GridRow);
//刷新购物车
this.RefreshRow(this._orderItem);
}
}));
}
private void BuildGridRow(ProductExt product, OrderRowState rowState = OrderRowState.None)
{
//0、添加点单过快提示
if (_PromCalculateIng)
{
this.ShowToastNotify(this, "操作过快,请重新操作");
return;
}
bool isGo = true;
//1、先判断是否已经完成
if (isGo && (this._orderObject.OrderType == OrderType. && this._orderObject.OrderStatus == OrderStatus.) || this._orderObject.OrderStatus == OrderStatus.)
{
this.DestoryOrderObject(true);
isGo = true;
}
//2、判断订单号是否正常
if (isGo && string.IsNullOrEmpty(this._orderObject.TradeNo))
{
//尝试重新获取一次单号
var ticket = OrderUtils.Instance.GenerateTicketNoEx();
if (ticket.Item1)
{
this._orderObject.TradeNo = ticket.Item3;
}
//重新判断是否获取到单号
if (string.IsNullOrEmpty(this._orderObject.TradeNo))
{
//是否提醒收银员
var isNofity = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_TICKET_NO_NOFITY, true);
//是否采用本机单号
var isLocalTicketNo = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_LOCAL_TICKET_NO, false);
string notifyMessage = "获取全局单号失败,收银参数禁止使用本机单号,请重新操作";
if (isNofity)
{
MDialogForm dialog = null;
//采用本机单号
if (isLocalTicketNo)
{
notifyMessage = "获取全局单号失败,采用本机单号可能出现重复,是否继续?";
dialog = new MDialogForm("提示信息", notifyMessage, MessageBoxIcon.Warning, MessageBoxButtons.YesNo);
}
else
{
dialog = new MDialogForm("提示信息", notifyMessage, MessageBoxIcon.Warning, MessageBoxButtons.OK);
}
//操作员选择了 是
if (DialogResult.Yes == dialog.ShowDialog())
{
this._orderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo();
isGo = true;
}
else
{
isGo = false;
}
}
else
{
if (isLocalTicketNo)
{
this._orderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo();
isGo = true;
}
else
{
isGo = false;
this.ShowToastNotify(this, "获取全局单号失败,设置禁止使用本机单号,请重试");
}
}
}
else
{
isGo = true;
}
}
//3、如果有整单优惠禁止点单操作
if (isGo && this._orderObject.Promotions != null && this._orderObject.Promotions.Count > 0)
{
this.ShowToastNotify(this, "享受整单优惠,不允许继续点单");
isGo = false;
}
//4、允许销售售价为零的商品
var allowPriceZero = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_PRICE_ZERO, false);
if (isGo && product.Price <= 0 && !allowPriceZero)
{
this.ShowToastNotify(this, "不允许售卖价格为零的商品");
isGo = false;
}
//5、售价为零的商品时提示
var priceZeroNotify = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_PRICE_ZERO_NOTIFY, false);
if (isGo && product.Price <= 0 && priceZeroNotify)
{
var dialog = new MDialogForm("提示信息", "您是否要售卖零售价的单品", MessageBoxIcon.Warning, MessageBoxButtons.YesNo);
//操作员选择了 是
if (DialogResult.Yes == dialog.ShowDialog())
{
isGo = true;
}
else
{
isGo = false;
}
}
//**********************开始点单*******************************
if (isGo)
{
var newProduct = ObjectUtils.Copy<ProductExt>(product);
AddGridRow(newProduct, rowState);
}
}
private void OnProductXClick(object sender, ProductXEventArgs e)
{
var product = e.Product;
this.BuildGridRow(product);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
//网络状态
ChangNetworkStatus();
//加载副屏
LoadingViceScreen();
//登录班次
BusinessUtils.Instance.WorkerLogin();
//初始化收银员权限
BusinessUtils.Instance.InitPermission();
//刷练习模式
StudyModeChangedNotify(this, null);
//创建默认订单
NewOrderObject();
//刷新界面
this.RefreshUi();
//定时器
this.timer = new System.Timers.Timer(60000);//定时周期2秒
this.timer.Elapsed += TimerElapsed;//到60秒了做的事件
this.timer.AutoReset = true; //是否不断重复定时器操作
this.timer.Start();
Task.Factory.StartNew(() =>
{
this.Invoke(new Action(() =>
{
try
{
var lists = Global.Product._productList;
this.productControl.PageNumber = 1;
this.productControl.BindDataSource(lists, PriceTypeEnum.);
}
catch (Exception ex)
{
LOGGER.Error(ex, "加载商品信息异常");
}
}));
});
//当前未登录状态
Global.Instance.IsLogin = true;
//门店名称
this.lblStoreName.Text = string.Format(this.lblStoreName.Tag.ToString(), Global.Instance.Authc.TenantId, Global.Instance.Authc.StoreNo, Global.Instance.Worker.StoreInfo.Name);
//POS编号
this.lblPosNo.Text = string.Format(this.lblPosNo.Tag.ToString(), Global.Instance.Authc.PosNo);
//操作员工号
this.lblWorkerNo.Text = string.Format(this.lblWorkerNo.Tag.ToString(), Global.Instance.Worker.No);
//登录日期
this.lblLoginDate.Text = string.Format(this.lblLoginDate.Tag.ToString(), Global.Instance.Worker.LastDate);
//系统日期
this.lblSystemDate.Text = string.Format(this.lblSystemDate.Tag.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
}
/// <summary>
/// 创建一个订单对象,本单交易完成前,对象唯一存在
/// </summary>
/// <returns></returns>
private OrderObject NewOrderObject()
{
if (this._orderObject == null)
{
this._orderObject = BusinessUtils.Instance.NewOrderObject();
//订单商品明细
var observableCollection = new ObservableCollection<OrderItem>();
observableCollection.CollectionChanged += OrderItemCollectionChanged;
this._orderObject.Maps = observableCollection;
//会员卡号
//this.lblMemberCardNo.Text = string.Format(this.lblMemberCardNo.Tag.ToString(), string.Empty);
//会员余额
//this.lblMemberAmount.Text = string.Format(this.lblMemberAmount.Tag.ToString(), string.Empty);
//会员积分
//this.lblMemberPoint.Text = string.Format(this.lblMemberPoint.Tag.ToString(), string.Empty);
//刷新桌号
MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode..ToString(), Operate = MsgEntityOperate., Data = new Tuple<ModuleKeyCode, MenuTileNotifyType, string>(ModuleKeyCode., MenuTileNotifyType., _orderObject.TableName) });
//默认营业模式
bool ts = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ORDERTYPEDEFAULTTS, true);
if (ts)
{
this._orderObject.OrderType = OrderType.;
MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode..ToString(), Operate = MsgEntityOperate., Data = new Tuple<ModuleKeyCode, MenuTileNotifyType, string>(ModuleKeyCode., MenuTileNotifyType., OrderType..ToString()) });
}
else
{
this._orderObject.OrderType = OrderType.;
MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode..ToString(), Operate = MsgEntityOperate., Data = new Tuple<ModuleKeyCode, MenuTileNotifyType, string>(ModuleKeyCode., MenuTileNotifyType., OrderType..ToString()) });
}
}
this._orderItem = null;
return this._orderObject;
}
private void OrderItemCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
GridPanel panel = gridControl.PrimaryGrid;
int i = 0;
foreach (var item in this._orderObject.Maps)
{
GridRow row = (GridRow)panel.Rows[i];
item.OrderNo = (++i);
//修改行序号
row["order"].Value = item.OrderNo;
}
}
private OrderObject DestoryOrderObject(bool forced, bool newOrder = true)
{
//关闭会员优惠提醒
MsgEvent.Send(Constant.HISTORY_CHANGED_NOTIFY, new Tuple<HistoryMsgType, object>(HistoryMsgType., 0));
//禁止交易完成后立即清除单据信息,显示已结账
bool allowShowPreOrder = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_SHOW_PREORDER);
if (forced || !allowShowPreOrder)
{
//清理GridPanel
GridPanel panel = this.gridControl.PrimaryGrid;
panel.Rows.Clear();
this.checkoutControl.Visible = false;
this.txtCash.Text = "0";
this._orderObject = null;
//通知副屏
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.CLEARALLITEMS, null));
}
if (newOrder)
{
return NewOrderObject();
}
else
{
return null;
}
}
else
{
this.checkoutControl.Visible = true;
//重置会员信息,默认情况下,支付完成后支持刷卡
this._orderObject.Member = null;
//通知副屏
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.FINISHEDORDER, null));
}
return this._orderObject;
}
}
/// <summary>
/// 刷新点单列表,更新界面元素
/// </summary>
private void RefreshUi()
{
this.BeginInvoke(new Action(() =>
{
RefreshUiEx();
}));
Task.Factory.StartNew(() =>
{
try
{
_PromCalculateIng = true;
lock (this._promLock)
{
this.CalPromotion();
}
}
catch (Exception ex)
{
LOGGER.Error(ex, "计算优惠发生异常");
Global.Instance.BugReport(ex, "计算优惠发生异常");
}
finally
{
_PromCalculateIng = false;
}
});
}
private void RefreshUiEx()
{
//数量合计
this.lblTotalQuantity.Text = string.Format(this.lblTotalQuantity.Tag.ToString(), this._orderObject.TotalQuantity.ToString());
//优惠合计
this.lblTotalDiscount.Text = string.Format(this.lblTotalDiscount.Tag.ToString(), this._orderObject.DiscountAmount.ToString());
//应收金额
this.lblReceivableAmount.Text = string.Format(this.lblReceivableAmount.Tag.ToString(), this._orderObject.ReceivableAmount.ToString());
//客显
try
{
GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Total, this._orderObject.ReceivableAmount.ToString("f2"));
}
catch (Exception ex)
{
LOGGER.Error(ex, "客显异常");
}
}
private void CalPromotion()
{
//套餐,自动找到套餐主菜进行优惠计算
if (this._orderItem != null && this._orderItem.RowState == OrderRowState.)
{
//套餐明细,找到套餐主菜进行优惠计算
var mainItem = this._orderObject.Items.Find(x => x.Group == this._orderItem.Group && x.RowState == OrderRowState.);
if (mainItem != null)
{
CalItemPromEngine(mainItem);
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(this._orderObject, mainItem);
}
}
else
{
CalItemPromEngine(this._orderItem);
}
CalOrderPromEngine();
}
private void CalItemPromEngine(OrderItem item)
{
//先计算当前单品优惠,取最优
if (item != null)
{
if (item.Promotions != null && item.Promotions.Count > 0)
{
//有优惠,不计算单品优惠
return;
}
var promResult = PromotionEngine.Instance.CalItemPromotion(this._orderObject, item);
if (promResult.Count > 0)
{
if (promResult.Exists(x => x.Type == PromotionType. || x.Type == PromotionType.))
{
ApplyDoublePromMain(promResult, item);
}
else
{
var fineProm = promResult.OrderByDescending(x => x.DiscountAmount).ToList()[0];
var needUpdate = BusinessUtils.Instance.ApplyItemFinePromotion(this._orderObject, item, fineProm);
if (needUpdate)
{
this.Invoke(new Action(() =>
{
RefreshRow(item);
RefreshUiEx();
}));
}
}
}
}
}
#region 双数特价
/// <summary>
/// 双数特价优惠入口
/// </summary>
/// <param name="promResult"></param>
/// <param name="item"></param>
private void ApplyDoublePromMain(List<PromotionEntity> promResult, OrderItem item)
{
var fineProm = promResult.FirstOrDefault(x => x.Type == PromotionType. || x.Type == PromotionType.);
//优先处理双数促销
if (fineProm.Type == PromotionType.)
{
ApplyDoublePromGive(fineProm, item);
}
else if (fineProm.Type == PromotionType.)
{
ApplyDoublePromDiscount(fineProm, item);
}
}
/// <summary>
/// 双数特价优惠处理
/// </summary>
/// <param name="fineProm"></param>
/// <param name="item"></param>
private void ApplyDoublePromDiscount(PromotionEntity fineProm, OrderItem item)
{
//优惠商品
var product = fineProm.Products[0];
//满足双数特价的主商品数量
var masterList = this._orderObject.Items.FindAll(x => x.SpecId == product.SpecId && x.Promotions.Count == 0 && string.IsNullOrEmpty(x.ParentId));
//已参与满足双数特价的子商品数量
var subList = this._orderObject.Items.FindAll(x => x.SpecId == product.SpecId && x.Promotions.Count == 1
&& x.Promotions[0].PromotionType == PromotionType.
&& x.Promotions[0].PlanNo == fineProm.PromotionId);
//主商品数量
var totalMasterQuantity = masterList.Sum(x => x.Quantity);
//子商品数量
var totalSubQuantity = subList.Sum(x => x.Quantity);
//应优惠商品数量
var shouldQuantity = product.Quantity;
if (shouldQuantity > totalSubQuantity)
{
//新增优惠商品
var dQuantity = (shouldQuantity - totalSubQuantity);
bool isSucc = false;
//假如是子商品
if (item.Quantity == dQuantity)
{
isSucc = DoublePromPart3(item, masterList, subList, dQuantity, fineProm);
}
if (!isSucc)
{
//假如是主商品
isSucc = DoublePromPart2(item, masterList, subList, dQuantity, fineProm);
if (!isSucc)
{
//主商品需要拆行
if (item.Quantity > dQuantity)
{
item.Quantity -= dQuantity;
//套餐主数量变更,同步更新子商品数量
UpdateSuitSubQuantity(item);
//沽清
//创建新的OrderItem
var newItem = BusinessUtils.Instance.NewOrderItem(_orderObject, ObjectUtils.Copy(item.ProductExt));
newItem.Quantity = dQuantity;
newItem.ParentId = item.Id;
//新Item加入促销
BusinessUtils.Instance.ApplyPromotionEntity(this._orderObject, newItem, fineProm);
//新数据定位
int orderNo = BusinessUtils.Instance.AppendItemPosition(this._orderObject, item);
this.Invoke(new Action(() =>
{
AddGridRowExt(newItem.ProductExt, newItem, orderNo);
RefreshRow(item);
RefreshUiEx();
}));
}
else
{
LOGGER.Error("未能成功处理双数特价优惠的UI商品调整");
}
}
}
}
else if (shouldQuantity < totalSubQuantity)
{
//减少商品
var specs = _orderObject.Items.FindAll(x => x.SpecId == product.SpecId);
if (specs.Count > 1)
{
var quantity = (totalSubQuantity - shouldQuantity);
List<OrderItem> updateItems = new List<OrderItem>();
List<OrderItem> deleteItems = new List<OrderItem>();
foreach (var sub in subList)
{
if (quantity > 0)
{
if (sub.ParentId == item.Id)
{
if (sub.Quantity > quantity)
{
sub.Quantity -= quantity;
quantity = 0;
updateItems.Add(sub);
break;
}
else if (sub.Quantity <= quantity)
{
quantity -= sub.Quantity;
deleteItems.Add(sub);
}
}
}
else
{
break;
}
}
if (quantity > 0)
{
//计算异常
this.ShowToastNotify(this, "双数促销执行错误,请消单后重新点单!");
}
foreach (var del in deleteItems)
{
this.Invoke(new Action(() =>
{
DoRemoveOrderItem(del);
}));
}
foreach (var up in updateItems)
{
//更新促销
RefreshPromotionEntityItem(up, fineProm);
}
}
}
}
/// <summary>
/// 双数特价赠送处理
/// </summary>
/// <param name="fineProm"></param>
/// <param name="item"></param>
private void ApplyDoublePromGive(PromotionEntity fineProm, OrderItem item)
{
var p = fineProm.Products[0];
//已赠送商品集
var giveItems = _orderObject.Items.FindAll(x => x.SpecId == p.SpecId && x.Promotions.Count == 1
&& x.Promotions[0].PromotionType == PromotionType.
&& x.Promotions[0].PlanNo == fineProm.PromotionId);
//已赠送商品总数
var giveQuantity = giveItems.Sum(x => x.Quantity);
//差值
var dQuantity = p.Quantity - giveQuantity;
if (dQuantity > 0)
{
var childItem = _orderObject.Items.FirstOrDefault(x => x.SpecId == p.SpecId && x.ParentId == item.Id && x.Promotions.Count == 1 && x.Promotions[0].PromotionType == PromotionType. && x.Promotions[0].PlanNo == fineProm.PromotionId);
if (childItem != null)
{
//已经存在双数特价赠送的商品,直接将赠送的商品数量置为当前商品数量,适用于操作数量增加
childItem.Quantity += dQuantity;
RefreshPromotionEntityItem(childItem, fineProm);
}
else
{
//新增一行商品
//沽清
//创建新的OrderItem
var newItem = BusinessUtils.Instance.NewOrderItem(_orderObject, ObjectUtils.Copy(item.ProductExt));
newItem.Quantity = dQuantity;
//新Item加入促销
newItem.ParentId = item.Id;
BusinessUtils.Instance.ApplyPromotionEntity(this._orderObject, newItem, fineProm);
var orderNo = BusinessUtils.Instance.AppendItemPosition(this._orderObject, item);
this.Invoke(new Action(() =>
{
AddGridRowExt(newItem.ProductExt, newItem, orderNo);
}));
}
}
else if (dQuantity < 0)
{
//减少赠送
decimal delQuantity = dQuantity * -1;
if (delQuantity > 0)
{
var childItem = this._orderObject.Items.FirstOrDefault(x => x.ParentId == item.Id && x.RowState != OrderRowState.);
if (childItem.Quantity > delQuantity)
{
childItem.Quantity -= delQuantity;
RefreshPromotionEntityItem(childItem, fineProm);
}
}
}
}
/// <summary>
/// 双数特价,判定当前商品为主商品,寻找子商品
/// </summary>
/// <param name="masterItem"></param>
/// <param name="masterList"></param>
/// <param name="subList"></param>
/// <param name="dQuantity"></param>
/// <param name="fineProm"></param>
/// <returns></returns>
private bool DoublePromPart2(OrderItem masterItem, List<OrderItem> masterList, List<OrderItem> subList, decimal dQuantity, PromotionEntity fineProm)
{
bool result = false;
var currItemSub = subList.FindAll(x => x.ParentId == masterItem.Id);
//当前主菜对应的子菜数量,判断是否饱和,饱和找其他主
var currItemQuantity = currItemSub.Sum(x => x.Quantity);
if (currItemSub.Count > 0 && (currItemQuantity + dQuantity) < masterItem.Quantity)
{
//不饱和,可以接受
var tempItem = currItemSub[0];
tempItem.Quantity += dQuantity;
masterItem.Quantity -= dQuantity;
//套餐主数量变更,同步更新子商品数量
UpdateSuitSubQuantity(masterItem);
RefreshPromotionEntityItem(tempItem, fineProm);
this.Invoke(new Action(() =>
{
RefreshRow(masterItem);
RefreshRow(tempItem);
RefreshUiEx();
}));
result = true;
}
else
{
//查找正好符合数量的未被使用的商品作为子商品
var subItem = masterList.FirstOrDefault(x => x.Id != masterItem.Id && x.Quantity == dQuantity && (!_orderObject.Items.Exists(y => y.ParentId == x.Id) || (x.RowState == OrderRowState. && !_orderObject.Items.Exists(y => y.ParentId == x.Id && y.RowState != OrderRowState.))));
if (subItem != null)
{
//应用优惠
BusinessUtils.Instance.ApplyPromotionEntity(this._orderObject, subItem, fineProm);
subItem.ParentId = masterItem.Id;
BusinessUtils.Instance.ApplyPromotionEntity(this._orderObject, subItem, fineProm);
//移动至主商品下方
int orderNo = BusinessUtils.Instance.AppendItemPosition(this._orderObject, masterItem);
MoveItemPosition(subItem, orderNo);
this.Invoke(new Action(() =>
{
RefreshRow(subItem);
RefreshUiEx();
}));
result = true;
}
}
return result;
}
/// <summary>
/// 双数特价,判断当前商品为子商品,寻找主商品
/// </summary>
/// <param name="item"></param>
/// <param name="masterList"></param>
/// <param name="subList"></param>
/// <param name="dQuantity"></param>
/// <param name="fineProm"></param>
/// <returns></returns>
private bool DoublePromPart3(OrderItem item, List<OrderItem> masterList, List<OrderItem> subList, decimal dQuantity, PromotionEntity fineProm)
{
bool result = false;
//查找正好符合数量的未被使用的商品作为主商品
//符合数量有两种1、一个主商品下已有子商品但是该主商品还可以接纳当前数量的商品
OrderItem masterItem = null;
foreach (var tmp in masterList)
{
if (tmp.Id != item.Id)
{
if (tmp.RowState == OrderRowState.)
{
var currItemSub = subList.FindAll(x => x.ParentId == tmp.Id);
var currItemQuantity = currItemSub.Sum(x => x.Quantity);
if (tmp.Quantity - currItemQuantity >= dQuantity)
{
masterItem = tmp;
break;
}
}
else if (tmp.RowState == OrderRowState.)
{
var currItemSub = subList.FindAll(x => x.ParentId == tmp.Id && x.RowState == OrderRowState.);
var currItemQuantity = currItemSub.Sum(x => x.Quantity);
if (tmp.Quantity - currItemQuantity >= dQuantity)
{
masterItem = tmp;
break;
}
}
}
}
if (masterItem != null)
{
//应用优惠
item.ParentId = masterItem.Id;
BusinessUtils.Instance.ApplyPromotionEntity(this._orderObject, item, fineProm);
//移动至主商品下方
int orderNo = BusinessUtils.Instance.AppendItemPosition(this._orderObject, masterItem);
MoveItemPosition(item, orderNo);
this.Invoke(new Action(() =>
{
RefreshRow(item);
RefreshUiEx();
}));
result = true;
}
return result;
}
#endregion
private void MoveItemPosition(OrderItem item, int orderNo)
{
if (item.RowState == OrderRowState.)
{
//移动到父商品下方
this._orderObject.Maps.Move(item.OrderNo - 1, orderNo);
this.Invoke(new Action(() =>
{
this.gridControl.PrimaryGrid.Rows.Remove(item.GridRow);
this.gridControl.PrimaryGrid.Rows.Insert(orderNo, item.GridRow);
}));
}
else if (item.RowState == OrderRowState.)
{
//套餐整体移动到父商品下方
this._orderObject.Maps.Move(item.OrderNo - 1, orderNo);
this.Invoke(new Action(() =>
{
this.gridControl.PrimaryGrid.Rows.Remove(item.GridRow);
this.gridControl.PrimaryGrid.Rows.Insert(orderNo, item.GridRow);
}));
var subItems = this._orderObject.Items.FindAll(x => x.RowState == OrderRowState. && x.ParentId == item.Id);
foreach (var sub in subItems)
{
var targetCount = ++orderNo;
this._orderObject.Maps.Move(sub.OrderNo - 1, targetCount);
this.Invoke(new Action(() =>
{
this.gridControl.PrimaryGrid.Rows.Remove(sub.GridRow);
this.gridControl.PrimaryGrid.Rows.Insert(targetCount, sub.GridRow);
}));
}
}
}
/// <summary>
/// 更新促销信息
/// </summary>
/// <param name="item"></param>
/// <param name="fineProm"></param>
private void RefreshPromotionEntityItem(OrderItem item, PromotionEntity fineProm)
{
var p = fineProm.Products[0];
var promotion = item.Promotions[0];
//优惠金额
promotion.DiscountAmount = OrderUtils.ToRound(fineProm.DiscountAmount / p.Quantity * item.Quantity);
//折扣率
if (item.Amount != 0)
{
promotion.DiscountRate = OrderUtils.ToRound((item.Amount - promotion.DiscountAmount) / item.Amount);
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(this._orderObject, item, promotion);
if (item.RowState == OrderRowState.)
{
//同步更改套餐明细数量
UpdateSuitSubQuantity(item);
}
else
{
this.Invoke(new Action(() =>
{
RefreshRow(item);
}));
}
this.Invoke(new Action(() =>
{
RefreshUiEx();
}));
}
/// <summary>
/// 套餐主数量变更,同步更新子商品数量变更
/// </summary>
/// <param name="item"></param>
private void UpdateSuitSubQuantity(OrderItem item)
{
if (item.RowState == OrderRowState.)
{
var details = this._orderObject.Items.FindAll(x => x.ParentId == item.Id && x.Group == item.Group);
foreach (var detail in details)
{
//道菜加价金额
detail.SuitAmount = item.Quantity * detail.SuitAddPrice;
//道菜数量随主菜变化而增加
detail.Quantity = item.Quantity * detail.SuitQuantity;
//将更改后的行数据同步到订单列表
var inx = this._orderObject.Maps.IndexOf(detail);
this._orderObject.Maps[inx] = detail;
this.Invoke(new Action(() =>
{
RefreshRow(detail);
}));
}
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(this._orderObject, item);
//套餐主特殊处理
this.Invoke(new Action(() =>
{
UpdateSuitMain(item);
}));
}
}
private void CalOrderPromEngine()
{
//计算整单优惠
var orderPromResult = PromotionEngine.Instance.CalOrderPromotion(this._orderObject);
this.Invoke(new Action(() =>
{
MsgEvent.Send(Constant.HISTORY_CHANGED_NOTIFY, new Tuple<HistoryMsgType, object>(HistoryMsgType., orderPromResult));
}));
}
public void AddGridRow(ProductExt product, OrderRowState rowState = OrderRowState.None)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(product.Id))
{
saleClear = SaleClearUtils.Instance.Maps[product.Id];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
if (isSaleClear && saleClear.Quantity <= 0)
{
this.ShowToastNotify(this, "已经销售完了!");
return;
}
//创建新的OrderItem
var master = BusinessUtils.Instance.NewOrderItem(this._orderObject, product, rowState);
//多规格选择
if (product.SpecCount > 1)
{
//规格权限控制码 10007
string permissionCode = "10007";
bool isGo = true;
//是否启用授权窗口
var isAuthz = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_AUTO_LOCK_DISABLE, false);
//没有按钮权限
if (isGo && !isAuthz)
{
this.ShowToastNotify(this, "您没有多规格选择权限!");
isGo = false;
}
if (isGo)
{
var autoSelectSpec = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_AUTO_SELECT_SPEC, true);
//有规格操作权限
if (Global.Instance.HasPermission(permissionCode))
{
if (autoSelectSpec)
{
SelectSpecDialog(master, product, permissionCode, saleClear);
}
else
{
AddGridRow(product, master, saleClear);
}
}
else
{
var authForm = new AuthDialogForm("规格", permissionCode, this._orderObject);
authForm.ExpectValidate(permissionCode);
authForm.AcceptButtonClick += (o, args) =>
{
if (args.Data is Tuple<decimal, decimal, List<string>, Worker>)
{
if (autoSelectSpec)
{
this.SelectSpecDialog(master, product, permissionCode, saleClear);
}
else
{
AddGridRow(product, master, saleClear);
}
}
};
authForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, authForm);
trans.Show(this);
}
}
}
else
{
AddGridRow(product, master, saleClear);
}
}
private void SelectSpecDialog(OrderItem master, ProductExt product, string permissionCode, SaleClear saleClear = null)
{
var dialogForm = new MSpecDialogForm(master, permissionCode);
dialogForm.AcceptButtonClick += (sender, args) =>
{
AddGridRow(product, master, saleClear);
};
dialogForm.CancelButtonClick += (sender, args) => { };
TransparentForm trans = new TransparentForm(this, 0.01, dialogForm);
trans.Show(this);
}
private void AddGridRow(ProductExt product, OrderItem master, SaleClear saleClear = null)
{
//判断是否需要输入售价
var priceZeroInput = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_PRICE_ZERO_INPUT, false);
if (priceZeroInput && product.Price <= 0)
{
var dialogForm = new InputPriceDialogForm(product);
dialogForm.AcceptButtonClick += (o, args) =>
{
var inputValue = Convert.ToDecimal(args.Data);
product.Price = inputValue;
product.MemberPrice = inputValue;
product.OtherPrice = inputValue;
//售价
master.SalePrice = product.Price;
//单品最低售价
master.MinPrice = product.MinPrice;
//会员价
master.MemberPrice = product.MemberPrice;
//会员价(元)
master.MemberSalePrice = product.MemberPrice;
//批发价
master.DispatchPrice = product.DispatchPrice;
//第三方价
master.OtherPrice = product.OtherPrice;
//默认情况下零售价和售价一样零售价主要解决前台售价为0的商品需要录入的售价
master.Price = product.Price;
//默认情况下,折后单价和零售价一样
master.DiscountPrice = master.Price;
AddGridRowEx(product, master, true, saleClear);
};
dialogForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, 0.01, dialogForm);
trans.Show(this);
}
else
{
AddGridRowEx(product, master, true, saleClear);
}
}
private void AddGridRowEx(ProductExt product, OrderItem master, bool refUI, SaleClear saleClear = null)
{
bool isException = false;
try
{
List<OrderItem> rows = BusinessUtils.Instance.BuildGridRow(_orderObject, product, master);
foreach (var item in rows)
{
if (string.IsNullOrEmpty(item.ProductId))
{
isException = true;
MDialogForm errDialog = new MDialogForm("错误提示", "套餐中的商品当前门店不存在,请联系管理员!", MessageBoxIcon.Error, MessageBoxButtons.OK);
errDialog.ShowDialog();
return;
}
}
GridPanel panel = gridControl.PrimaryGrid;
foreach (var r in rows)
{
GridRow gridRow = null;
switch (r.RowState)
{
case OrderRowState.:
{
//套餐明细不显示售价和优惠
gridRow = new GridRow(r.OrderNo, r.DisplayName, r.Quantity, r.ProductUnitName, /*r.Price*/"", r.SuitAddPrice > 0 ? ("+" + r.SuitAddPrice) : "", /*r.Discount*/"", r.Underline, r.Flavor, r.Group, r.ParentId, r.Scheme);
}
break;
default:
{
gridRow = new GridRow(r.OrderNo, r.DisplayName, r.Quantity, r.ProductUnitName, r.Price, r.Amount, r.Discount, r.Underline, r.Flavor, r.Group, r.ParentId, r.Scheme);
}
break;
}
gridRow.RowHeight = 0;
gridRow.Tag = r;
//将RowIndex映射
r.GridRow = gridRow;
panel.Rows.Add(gridRow);
if (panel.ActiveRow != null)
{
panel.SetSelected(panel.ActiveRow, false);
}
panel.SetSelected(gridRow, true);
panel.SetActiveRow(gridRow);
//压入集合对象
this._orderObject.Maps.Add(r);
//通知副屏
if (Global.Instance.EnableVice)
{
var rowVice = new GridRow(r.DisplayName, r.Quantity, r.SalePrice, r.Amount, r.FlavorNames);
rowVice.Tag = r;
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.ADDORDERITEM, rowVice));
}
}
if (refUI)
{
this.RefreshUi();
}
Application.DoEvents();
int h = panel.Rows.Sum(p => p.Size.Height);
this.gridControl.VScrollOffset = h;
}
catch (Exception ex)
{
isException = true;
LOGGER.Error(ex, "单品加入购物车异常");
}
finally
{
if (!isException)
{
var isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
//沽清处理
if (isSaleClear)
{
saleClear.SaleQuantity += 1;
SaleClearUtils.Instance.Maps[product.Id] = saleClear;
}
//套餐自动打开换菜窗口
if (product.SuitFlag == 1)
{
var showRes = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ADDSUITAUTOOPENCHANGEFORM, false);
if (showRes)
{
//OnShortcutMouseDown(null, new MenuEventArgs("换菜", null, new ModuleMenu() { PermissionCode = "10008" }));
}
}
}
}
}
private void AddGridRowExt(ProductExt product, OrderItem master, int row, SaleClear saleClear = null)
{
bool isException = false;
try
{
List<OrderItem> rows = BusinessUtils.Instance.BuildGridRow(_orderObject, product, master);
foreach (var item in rows)
{
if (string.IsNullOrEmpty(item.ProductId))
{
isException = true;
MDialogForm errDialog = new MDialogForm("错误提示", "套餐中的商品当前门店不存在,请联系管理员!", MessageBoxIcon.Error, MessageBoxButtons.OK);
errDialog.ShowDialog();
return;
}
}
GridPanel panel = gridControl.PrimaryGrid;
foreach (var r in rows)
{
GridRow gridRow = null;
switch (r.RowState)
{
case OrderRowState.:
{
//套餐明细不显示售价和优惠
gridRow = new GridRow(r.OrderNo, r.DisplayName, r.Quantity, r.ProductUnitName, /*r.Price*/"", r.SuitAddPrice > 0 ? ("+" + r.SuitAddPrice) : "", /*r.Discount*/"", r.Underline, r.Flavor, r.Group, r.ParentId, r.Scheme);
}
break;
default:
{
gridRow = new GridRow(r.OrderNo, r.DisplayName, r.Quantity, r.ProductUnitName, r.Price, r.Amount, r.Discount, r.Underline, r.Flavor, r.Group, r.ParentId, r.Scheme);
}
break;
}
gridRow.RowHeight = 0;
gridRow.Tag = r;
//将RowIndex映射
r.GridRow = gridRow;
panel.Rows.Insert(row, gridRow);
panel.SetSelected(gridRow, true);
panel.SetActiveRow(gridRow);
//压入集合对象
this._orderObject.Maps.Insert(row, r);
//套餐一次增加多行,++处理
row++;
//通知副屏
if (Global.Instance.EnableVice)
{
var rowVice = new GridRow(r.DisplayName, r.Quantity, r.SalePrice, r.Amount, r.FlavorNames);
rowVice.Tag = r;
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.ADDORDERITEM, rowVice));
}
}
this.RefreshUi();
Application.DoEvents();
int h = panel.Rows.Sum(p => p.Size.Height);
this.gridControl.VScrollOffset = h;
}
catch (Exception ex)
{
isException = true;
LOGGER.Error(ex, "单品加入购物车异常");
}
finally
{
if (!isException)
{
var isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
//沽清处理
if (isSaleClear)
{
saleClear.SaleQuantity += 1;
SaleClearUtils.Instance.Maps[product.Id] = saleClear;
}
}
}
}
/// <summary>
/// 删除指定订单项
/// </summary>
/// <param name="item"></param>
private void DoRemoveOrderItem(OrderItem item)
{
if (item != null)
{
GridPanel panel = gridControl.PrimaryGrid;
List<OrderItem> rows = new List<OrderItem>();
rows.Add(item);
//依赖
var subRows = this._orderObject.Items.FindAll(x => x.ParentId == item.Id);
rows.AddRange(subRows);
//买一送一套餐时,需要将送的套餐明细同步删除
foreach (var subRow in subRows)
{
if (subRow.RowState == OrderRowState.)
{
var subsubRows = this._orderObject.Items.FindAll(x => x.ParentId == subRow.Id);
rows.AddRange(subsubRows);
}
}
var activeRow = panel.ActiveRow;
if (rows.Count > 0)
{
foreach (var row in rows)
{
if (row.GridRow != null)
{
//删除一条记录前 获取当前记录的下一个可用行记录
activeRow = row.GridRow.NextVisibleRow;
if (activeRow == null)
{
activeRow = row.GridRow.PrevVisibleRow;
}
//删除当前行
panel.Rows.Remove(row.GridRow);
//移除数据存储
this._orderObject.Maps.Remove(row);
//通知副屏
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.DELETESINGLEITEM, row.GridRow.RowIndex));
}
}
Thread.Sleep(5);
}
}
//选择当前活动行
if (activeRow != null)
{
panel.SetSelected(activeRow, true);
panel.SetActiveRow(activeRow);
}
else
{
this._orderItem = null;
}
this.RefreshUi();
}
}
/// <summary>
/// 删除单品
/// </summary>
private void RemoveOrderItem()
{
bool isSuccess = true;
OrderItem item = null;
try
{
GridPanel panel = gridControl.PrimaryGrid;
if (panel.ActiveRow != null)
{
item = panel.ActiveRow.Tag as OrderItem;
if (item.RowState == OrderRowState.)
{
isSuccess = false;
this.ShowToastNotify(this, "请选择套餐删除!");
return;
}
DoRemoveOrderItem(item);
}
}
finally
{
if (isSuccess && item != null)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(item.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[item.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
if (isSaleClear)
{
saleClear.SaleQuantity -= item.Quantity;
SaleClearUtils.Instance.Maps[item.ProductId] = saleClear;
}
}
}
}
/// <summary>
/// 取消全单
/// </summary>
private void CleanOrderObject()
{
bool isSuccess = true;
//消单是否提醒
if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ORDER_CANCEL_NOTIFY))
{
MDialogForm dialog = new MDialogForm("操作提醒", "您确定是要进行取消全单操作吗?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel);
if (DialogResult.OK != dialog.ShowDialog())
{
isSuccess = false;
}
}
if (isSuccess)
{
//处理参与沽清的业务
var rows = this._orderObject.Items;
if (rows.Count > 0)
{
foreach (var row in rows)
{
//套餐明细不处理沽清业务
if (row.RowState == OrderRowState.)
{
continue;
}
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(row.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[row.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
if (isSaleClear)
{
saleClear.SaleQuantity -= row.Quantity;
SaleClearUtils.Instance.Maps[row.ProductId] = saleClear;
}
}
}
//发送消单操作,清理表格数据
GridPanel panel = gridControl.PrimaryGrid;
panel.Rows.Clear();
//消单后,清理订单对象
DestoryOrderObject(true);
this.txtCash.Text = string.Empty;
//刷新界面
this.RefreshUi();
}
}
/// <summary>
/// 确保点击完成后继续,避免连击统一个按钮
/// </summary>
bool isDoubleHit = false;
private void OnMenuClick(object sender, EventArgs e)
{
var button = sender as ButtonXExt;
if (!Global.Instance.AuthLogin)
{
LOGGER.Info("客户端到期禁止使用");
var dialog = new MDialogForm("特别提示", "您的POS使用权限已过期,请联系代理商续费!", MessageBoxIcon.Warning, MessageBoxButtons.OK);
if (DialogResult.OK != dialog.ShowDialog())
{
LOGGER.Info("到期自动退出系统");
}
return;
}
if (isDoubleHit)
{
LOGGER.Info("<{0}>连击事件,忽略本次点击", button.Text);
return;
}
//校验是否继续
var result = BusinessUtils.Instance.STB_MenuOperateValidate(this._orderObject, this._orderItem, button.Text.Trim());
if (!result.Item1)
{
ShowToastNotify(this, result.Item2);
return;
}
isDoubleHit = true;
//是否启用授权窗口
var isAuthz = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_AUTO_LOCK_DISABLE, false);
//模块授权控制
if (!this.IsAccredit(button.Text.Trim()))
{
isDoubleHit = false;
return;
}
try
{
switch (button.Text.Trim())
{
case "速结":
{
QuickPay();
}
break;
case "现金找零":
{
var dialogForm = new CashDialogForm(this._orderObject);
dialogForm.AcceptButtonClick += (o, args) =>
{
decimal inputMoney = Convert.ToDecimal(args.Data);
QuickPay(inputMoney);
};
dialogForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, 0.08, dialogForm);
trans.Show(this);
}
break;
case "会员卡":
{
var dialogForm = new MCardDialogForm(this._orderObject);
dialogForm.AcceptButtonClick += (o, args) =>
{
};
dialogForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, 0.08, dialogForm);
trans.Show(this);
}
break;
case "扫码支付":
{
var dialogForm = new MPayDialogForm(this._orderObject);
dialogForm.AcceptButtonClick += (o, args) =>
{
};
dialogForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, 0.08, dialogForm);
trans.Show(this);
}
break;
case "离线支付":
{
OfflinePay();
}
break;
case "功能":
{
var form = Application.OpenForms["MoreDialogForm"];
if (form == null)
{
form = new MoreDialogForm();
}
TransparentForm trans = new TransparentForm(this, 0.30, form as BusinessForm);
trans.Show(this);
}
break;
case "交班":
{
//是否是盲交模式
bool ShiftMode = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFTMODE, false);
if (ShiftMode)
{
var dialogForm = new FastShitBlindForm();
dialogForm.AcceptButtonClick += (o, args) =>
{
};
dialogForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, 0.30, dialogForm);
trans.Show(this);
}
else
{
var dialogForm = new FastShitForm();
dialogForm.AcceptButtonClick += (o, args) =>
{
};
dialogForm.CancelButtonClick += (o, args) => { };
TransparentForm trans = new TransparentForm(this, 0.30, dialogForm);
trans.Show(this);
}
}
break;
case "注销":
{
//重启收银程序
Global.Instance.Restart = true;
Application.ExitThread();
}
break;
case "锁屏":
{
var locked = new LockForm();
locked.ShowDialog();
}
break;
case "最小化":
{
this.WindowState = FormWindowState.Minimized;
}
break;
case "退出":
{
LOGGER.Info("手动退出系统");
this.Close();
}
break;
}
}
catch (Exception ex)
{
LOGGER.Error(ex, "OnMenuClick异常");
}
finally
{
isDoubleHit = false;
}
}
/// <summary>
/// 离线支付结账
/// </summary>
private void OfflinePay()
{
LOGGER.Info("操作离线支付");
//自动弹出桌号
if (!ProcessAutoDeskNo())
{
return;
}
//食堂版本的离线支付
decimal inputMoney = _orderObject.ReceivableAmount;
var result = BusinessUtils.Instance.OfflinePay(_orderObject, inputMoney);
if (result.Item1)
{
this.DestoryOrderObject(false);
}
else
{
this.ShowToastNotify(this, result.Item2);
}
}
/// <summary>
/// 现金结账
/// </summary>
private void QuickPay(decimal inputMoney = -9999)
{
LOGGER.Info("操作现金结账");
//自动弹出桌号
if (!ProcessAutoDeskNo())
{
return;
}
//食堂版本的速结不采用数据金额模式,直接按单结账
if (inputMoney == -9999)
{
inputMoney = _orderObject.ReceivableAmount;
}
var result = BusinessUtils.Instance.QuickPay(_orderObject, inputMoney);
if (result.Item1)
{
this.DestoryOrderObject(false);
}
else
{
this.ShowToastNotify(this, result.Item2);
}
}
/// <summary>
/// 自动弹出桌号
/// </summary>
/// <returns></returns>
private bool ProcessAutoDeskNo()
{
if (!string.IsNullOrEmpty(this._orderObject.TableNo))
{
//有桌号,不弹
return true;
}
///自动弹出桌号
var autoDeskNo = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_CHECKAUTOOPENDESKNO, false);
if (autoDeskNo)
{
var result = SetDeskNo();
if (result == DialogResult.OK)
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
private DialogResult SetDeskNo()
{
var form = new DeskNoForm(this._orderObject);
form.AcceptButtonClick += (o, args) =>
{
var desk = args.Data as Tuple<string, string, string>;
this._orderObject.TableNo = desk.Item1;
this._orderObject.TableName = desk.Item2;
this._orderObject.Ext1 = desk.Item3;
if (this._orderObject.TableNo != null)
{
//显示桌号
MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode..ToString(), Operate = MsgEntityOperate., Data = new Tuple<ModuleKeyCode, MenuTileNotifyType, string>(ModuleKeyCode., MenuTileNotifyType., _orderObject.TableName) });
}
};
return form.ShowDialog(this);
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
bool isSuccess = false;
bool isGo = true;
//允许有未结账单据(含挂单)存在时退出系统
if (!Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ACCOUNT_EN_ROUTE, false) && this._orderObject != null && this._orderObject.OrderStatus == OrderStatus. && this._orderObject.Items.Count > 0)
{
var dialog = new MDialogForm("操作提醒", "有正在操作的单据,不允许退出系统", MessageBoxIcon.Warning, MessageBoxButtons.OK);
dialog.ShowDialog();
isGo = false;
isSuccess = true;
}
if (isGo && !Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ACCOUNT_EN_ROUTE_NOTIFY, false))
{
var dialog = new MDialogForm("操作提醒", "您确定是要退出系统吗?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel);
if (DialogResult.OK != dialog.ShowDialog())
{
isSuccess = true;
}
else
{
isSuccess = false;
}
}
e.Cancel = isSuccess;
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
base.OnFormClosed(e);
}
/// <summary>
/// 练习模式切换图标显示
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
protected virtual void StudyModeChangedNotify(object sender, MsgEventArgs args)
{
this.studyModeControl.Text = "练习模式";
this.studyModeControl.Visible = Global.Instance.IsStudyMode();
}
private void OnCategoryXCheckedChanged(object sender, CategoryXEventArgs e)
{
var productType = e.Data;
try
{
var lists = Global.Product._productList;
var selectProduct = new List<ProductExt>();
if (!Constant.ALL_PRODUCT_TAG.Equals(productType.No))
{
selectProduct = lists.FindAll(x => !string.IsNullOrEmpty(x.TypePath) && x.TypePath.StartsWith(productType.Path));
}
this.productControl.PageNumber = 1;
this.productControl.BindDataSource(selectProduct, PriceTypeEnum.);
}
catch (Exception ex)
{
LOGGER.Error(ex, "加载商品信息异常");
}
}
void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Task.Factory.StartNew(() =>
{
//每分钟检查一次到期时间
StoreInfo storeInfo = Global.StoreInfo.StoreInfoMessage;
if (storeInfo != null && storeInfo.CostMode == 0)
{
int authDays = DateTimeUtils.DifferentDaysByMillisecond(storeInfo.DueDate, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//租赁模式剩余时间小于0天,禁止登陆系统
if (authDays < 0)
{
Global.Instance.AuthLogin = false;
}
}
});
Task.Factory.StartNew(() =>
{
this.Invoke(new Action(() =>
{
//清理内存
Global.ClearMemory();
//更新系统日期
this.lblSystemDate.Text = string.Format(this.lblSystemDate.Tag.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
//发送收银机工作状态
if (DateTime.Now.Minute % 5 == 0)
{
HttpClientUtils.PosMonitor();
}
//清理过期的沽清数据
SaleClearUtils.Instance.Expired();
}));
});
Task.Factory.StartNew(() =>
{
var status = ServiceHelper.CheckServiceStatus();
LOGGER.Debug("服务中心运行状态:" + status.ToString());
ServiceHelper.StartService();
});
}
/// <summary>
/// 网络连接状态
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
protected override void NetworkEventNotify(object sender, MsgEventArgs args)
{
base.NetworkEventNotify(sender, args);
if (IsDisposed || !this.IsHandleCreated) return;
//呈现联机更新状态
this.BeginInvoke(new MethodInvoker(() =>
{
ChangNetworkStatus();
}));
}
private void ChangNetworkStatus()
{
this.lblNetworkStatus.Text = Global.Instance.Online ? "网络正常" : "网络异常";
this.lblNetworkStatus.ForeColor = Global.Instance.Online ? Color.FromArgb(68, 68, 68) : Color.FromArgb(244, 91, 99);
this.lblNetworkStatus.Invalidate();
Color status = Global.Instance.Online ? Color.FromArgb(0, 199, 186) : Color.FromArgb(244, 91, 99);
this.lblDot1.SymbolColor = this.lblDot2.SymbolColor = this.lblDot3.SymbolColor = this.lblDot4.SymbolColor = this.lblDot5.SymbolColor = status;
}
/// <summary>
/// 加载副屏
/// </summary>
private void LoadingViceScreen()
{
try
{
//Global.Instance.EnableVice = true;
//ViceScreenForm vice2 = new ViceScreenForm();
//vice2.Show();
//return;
var enableVice = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_VICE_ENABLE);
if (enableVice)
{
//启用副屏
Screen[] sc = Screen.AllScreens;
if (sc.Count() > 1)
{
for (int i = 0; i < sc.Count(); i++)
{
if (!sc[i].Primary)
{
ViceScreenForm vice = new ViceScreenForm();
vice.FormBorderStyle = FormBorderStyle.None;
vice.StartPosition = FormStartPosition.Manual;
Point p = new Point(sc[i].Bounds.Location.X, sc[i].Bounds.Location.Y);
vice.Location = p;
vice.WindowState = FormWindowState.Maximized;
vice.Show();
break;
}
}
}
else
{
enableVice = false;
LOGGER.Info("设置启用了副屏,但是当前机器只有一块屏幕,不能启动副屏显示");
}
}
else
{
LOGGER.Info("未启用副屏");
}
Global.Instance.EnableVice = enableVice;
}
catch (Exception ex)
{
LOGGER.Error(ex, "副屏显示异常");
}
}
private void OnKeyboardClick(object sender, EventArgs e)
{
//先判断是否已经完成
if (this._orderObject.OrderStatus == OrderStatus.)
{
this.DestoryOrderObject(true);
}
var button = sender as ButtonXExt;
var keyCode = button.Tag.ToString().Trim();
if (string.IsNullOrEmpty(keyCode)) return;
this.ActiveControl = this.txtCash;
this.txtCash.Focus();
switch (keyCode)
{
case "clear":
{
bool isSuccess = true;
OrderItem item = null;
try
{
GridPanel panel = gridControl.PrimaryGrid;
if (panel.ActiveRow != null)
{
item = panel.ActiveRow.Tag as OrderItem;
if (item.RowState == OrderRowState.)
{
isSuccess = false;
this.ShowToastNotify(this, "请选择套餐删除!");
return;
}
DoRemoveOrderItem(item);
}
}
finally
{
if (isSuccess && item != null)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(item.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[item.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
if (isSaleClear)
{
saleClear.SaleQuantity -= item.Quantity;
SaleClearUtils.Instance.Maps[item.ProductId] = saleClear;
}
}
this.txtCash.Text = string.Empty;
}
}
break;
case "accept":
{
this.UpdateGridRow(null);
this.txtCash.Text = string.Empty;
}
break;
default:
{
InputSimulatorUtils.SendKey(KeyCodes.Map[keyCode]);
}
break;
}
}
private ProductExt builderProductExt(decimal price, OrderItem orderItem = null)
{
var json = "{\"typeName\":\"自选快餐\",\"unitName\":\"份\",\"specName\":\"\",\"specId\":\"999999\",\"chuda\":\"\",\"chudaFlag\":\"1\",\"chupin\":\"\",\"chupinFlag\":\"0\",\"chuDaLabelFlag\":\"0\",\"chuDaLabel\":\"\",\"chuxianTime\":0,\"kdsChupinTime\":0,\"tenantId\":\"\",\"brandId\":\"\",\"typeId\":\"999999\",\"typePath\":\"999999\",\"no\":\"999999\",\"name\":\"自选快餐\",\"shortName\":\"自选快餐\",\"spell\":\"ZXKC\",\"assistNo\":\"\",\"otherNo\":\"\",\"barCode\":\"999999\",\"english\":\"\",\"unitId\":\"\",\"description\":\"\",\"commissionType\":0,\"commissionValue\":0.0,\"discountFlag\":1,\"suitFlag\":0,\"tapleFlag\":1,\"weighFlag\":1,\"currentFlag\":0,\"mebDiscountFlag\":0,\"giveFlag\":1,\"labelPrintFlag\":1,\"promotionFlag\":0,\"type\":0,\"stockFlag\":1,\"pointType\":0,\"pointValue\":0.0,\"purchaseTax\":17.0,\"saleTax\":0.0,\"lyRate\":0.0,\"stopFlag\":0,\"groupName\":\"\",\"picture\":\"\",\"price\":12.0,\"memberPrice\":11.0,\"costPrice\":8.0,\"otherPrice\":0.0,\"purchasePrice\":8.0,\"minPrice\":11.0,\"dispatchPrice\":8.0,\"specCount\":1,\"kdsFlag\":1,\"ext1\":\"\",\"ext2\":\"\",\"ext3\":\"\",\"id\":\"999999\",\"createUser\":\"sync\",\"createDate\":\"2019-01-25 09:41:12\",\"modifyUser\":\"sync\",\"modifyDate\":\"2019-01-25 09:41:17\"}";
var product = JsonUtils.Deserialize<ProductExt>(json);
product.TenantId = Global.Instance.Worker.TenantId;
product.Price = price;
product.MemberPrice = price;
return product;
}
private void OnInputValueChanged(object sender, EnterEventArg e)
{
try
{
if (!string.IsNullOrEmpty(this.txtCash.Text.Trim()))
{
if (this._orderItem != null && this._orderItem.RowState == OrderRowState.)
{
this._orderItem.Price = this.txtCash.DecimalValue;
this._orderItem.MemberPrice = this.txtCash.DecimalValue;
//食堂自动加菜逻辑
if (!this.MaxSaleMoney(_orderItem))
{
return;
}
this.RefreshRow(this._orderItem);
}
else
{
if (this.txtCash.DecimalValue > 0)
{
var product = this.builderProductExt(this.txtCash.DecimalValue);
this.BuildGridRow(product, OrderRowState.);
}
}
}
}
finally
{
//更新表格全部
UpdateGridRow();
RefreshUiEx();
}
}
private void OnShortcutClick(object sender, TouchEventArgs e)
{
var button = sender as TouchButtonX;
//校验是否继续
var result = BusinessUtils.Instance.STB_MenuOperateValidate(this._orderObject, this._orderItem, button.Text.Trim());
if (!result.Item1)
{
ShowToastNotify(this, result.Item2);
return;
}
switch (button.Text.Trim())
{
case "上一页":
{
this.gridControl.Focus();
InputSimulatorUtils.SendKey(KeyCodes.Map["pgup"]);
}
break;
case "下一页":
{
this.gridControl.Focus();
InputSimulatorUtils.SendKey(KeyCodes.Map["pgdn"]);
}
break;
case "删菜":
{
if (!this.IsAccredit("删菜"))
{
return;
}
bool isSuccess = true;
OrderItem item = null;
try
{
GridPanel panel = gridControl.PrimaryGrid;
if (panel.ActiveRow != null)
{
item = panel.ActiveRow.Tag as OrderItem;
if (item.RowState == OrderRowState.)
{
isSuccess = false;
this.ShowToastNotify(this, "请选择套餐删除!");
return;
}
DoRemoveOrderItem(item);
}
}
finally
{
if (isSuccess && item != null)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(item.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[item.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
if (isSaleClear)
{
saleClear.SaleQuantity -= item.Quantity;
SaleClearUtils.Instance.Maps[item.ProductId] = saleClear;
}
}
this.txtCash.Text = string.Empty;
}
}
break;
case "消单":
{
if (!this.IsAccredit("消单"))
{
return;
}
bool isSuccess = true;
//消单是否提醒
if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ORDER_CANCEL_NOTIFY))
{
MDialogForm dialog = new MDialogForm("操作提醒", "您确定是要进行取消全单操作吗?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel);
//var trans = Application.OpenForms["TransparentFormExt"];
//if (trans == null)
//{
// trans = new TransparentFormExt(this, dialog);
//}
//trans.Visible = false;
//((TransparentFormExt)trans).Show(this);
if (DialogResult.OK != dialog.ShowDialog())
{
isSuccess = false;
}
}
if (isSuccess)
{
//处理参与沽清的业务
var rows = this._orderObject.Items;
if (rows.Count > 0)
{
foreach (var row in rows)
{
//套餐明细不处理沽清业务
if (row.RowState == OrderRowState.)
{
continue;
}
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(row.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[row.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
if (isSaleClear)
{
saleClear.SaleQuantity -= row.Quantity;
SaleClearUtils.Instance.Maps[row.ProductId] = saleClear;
}
}
}
//发送消单操作,清理表格数据
GridPanel panel = gridControl.PrimaryGrid;
panel.Rows.Clear();
//消单后,清理订单对象
DestoryOrderObject(true);
//刷新界面
this.RefreshUi();
}
}
break;
}
}
#region IsAccredit
/// <summary>
/// 模块授权控制
/// </summary>
public bool IsAccredit(string permissionName)
{
var permissionCode = this.ToPermissionCode(permissionName);
if (Global.Instance.HasPermission(permissionCode))
{
return true;
}
var authForm = new AuthDialogForm(permissionName, permissionCode, this._orderObject);
authForm.ExpectValidate(permissionCode);
authForm.ShowDialog();
if (authForm.IsAccredit)
{
return true;
}
else
{
return false;
}
}
#endregion
#region ToPermissionCode
private string ToPermissionCode(string permissionName)
{
switch (permissionName)
{
case "现在找零":
return "10019";
case "速结":
return "10019";
case "会员卡":
return "10023";//会员卡查询
case "营业单据":
return "30001";//销售流水
case "销售汇总":
return "30002";
case "收银报表":
return "30003";
case "营业日报":
return "30005";
case "时段报表":
return "30004";
case "交班查询":
return "30008";
case "会员开户":
return "20001";
case "会员充值":
return "20002";
case "会员信息":
return "20005";
case "会员换卡":
return "20004";
case "开钱箱":
return "10020";
case "设置":
return "40001";
case "交班":
return "10036";
case "消单":
return "10001";
case "删菜":
return "10002";
default:
return "";
}
}
#endregion
#region MaxSaleMoney
private bool MaxSaleMoney(OrderItem _orderItem)
{
var _maxMoney = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_CASHIER_MAXSALEMONEY);
decimal Money = 0.00M;
if (string.IsNullOrEmpty(_maxMoney))
{
return true;
}
decimal.TryParse(_maxMoney, out Money);
if (Money == 0)
{
return true;
}
if (_orderItem.Price > Money)
{
this.ShowToastNotify(this, "已超出最大金额,当前设置的最大金额数是:["+ Money.ToString("0.00")+ "]");
this.txtCash.Text = Money.ToString();
return false;
}
return true;
}
#endregion
public void InfoGuoPanDll()
{
var _msid = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_CASHIER_GUOPANMSID, "");
var _key = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_CASHIER_GUOPANKEY, "");
if (Global.Instance.Worker.TenantId.Equals("771200"))
{
return;
}
var _ParenthWnd = FindWindow(null, this.Text);
if (string.IsNullOrEmpty(_msid) || string.IsNullOrEmpty(_key))
{
return;
}
var _data = GuoPanProxy.ApiInit(_msid, _key, _ParenthWnd.ToInt32());
if (!_data.Item1)
{
this.ShowToastNotify(this, _data.Item2, 5000);
return;
DialogForm dialog = new DialogForm("操作提醒", "初始化果盘参数异常,是否继续请求初始化?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel);
if (DialogResult.OK == dialog.ShowDialog())
{
InfoGuoPanDll();
return;
}
}
}
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
protected override void DefWndProc(ref Message m)
{
base.DefWndProc(ref m);
switch (m.Msg)
{
case 2907:
int _LParam = m.LParam.ToInt32();
if (_LParam == 0)
{
return;
}
try
{
var _id = _LParam;
bool openConfirm = Global.Instance.GlobalConfigBoolValue(ConfigConstant.WEIXIN_CONFIRM_PARAMETER, true);
if (openConfirm)
{
GuoPanProxy.AutoConfirmOrder(_id);
}
}
catch (Exception ex)
{
LOGGER.Error(ex, "自动接单失败");
}
MsgEvent.Send(Constant.GuoPan_WEIXIN_UI_UPDATA, _LParam);
break;
default:
break;
}
}
}
}