using POSV.Business; using POSV.Cef.Client.ClientComm; using POSV.Entity; using POSV.Shift; using POSV.ShoppingCart; using POSV.Utils; using POSV; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using POSV.Component; using POSV.MsgCenter; using POSV.MessageEvent; using System.Collections.ObjectModel; using Newtonsoft.Json; using POSV.Cef.FastTemplate.PayMent; namespace POSV.Cef.FastTemplate { public partial class FastTemplate : BaseForm { //================= construct function ================== #region construct function public FastTemplate() { CheckForIllegalCrossThreadCalls = false; this.InitializeComponent(); this.Initialize(); //zhangy 2020-03-13 Add 添加小程序订单支持 Proxy.Mqtt.MqttClientUtils.Instance.Startup(); ////初始化推送事件 Proxy.Mqtt.MqttClientUtils.Instance.OnMessageReceived += OnMessageReceived; } #endregion //zhangy 2020-03-13 Add 添加小程序订单支持 private void OnMessageReceived(object sender, Proxy.Mqtt.MessageEventArgs e) { try { var _data = JsonUtils.Deserialize>(e.Message); if (_data == null) { this.ShowToastNotify(this, "订单推送数据解析可能出现问题"); return; } LOGGER.Info("接收到巨为小程序订单:{0}",e.Message); if (_data.ContainsKey("program") && _data.ContainsKey("date") && !"".Equals(_data["program"])) { //如果发送的时间和本机相差15分钟,证明是无效消息 if (DateTimeUtils.ExecDateDiff(DateTime.Now, DateTime.Parse(_data["date"])) < 15) { Dictionary messageMap = JsonUtils.Deserialize>(e.Message); if (messageMap.ContainsKey("program") && !"".Equals(messageMap["program"])) { //订单数量 string[] orderIds = _data["program"].Split(','); //是否开启小程序订单 var enableAppletOrder = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ENABLEAPPLETORDER,false); var data = new Dictionary(); data.Add("enable", enableAppletOrder ? 1:0); data.Add("count", orderIds.Length); //发送界面通知 this.m_CefClient.CallbackJsfunction("ShowWxProgramOrderNotify", JsonConvert.SerializeObject(data)); } } else { } } else { LOGGER.Info("巨为小程序接收的数据不合法"); } } catch (Exception ex) { LOGGER.Error(ex, "巨为小程序订单异常"); } } //================== private fields ===================== #region fields //当前订单对象 private OrderObject _orderObject = new OrderObject(); //当前选中的单品行记录 private OrderItem _orderItem = null; //当前支付订单 private List orderObjects = new List(); //当前取消支付订单 private List m_cancelorders = new List(); // private List IsPayList = new List(); /// /// cef /// private CefClientModule m_CefClient = null; /// /// 全局重新结账表示 /// public bool m_IsAnewPay = false; /// /// 加载界面 /// private Loading loading = null; #endregion //================== public function ======================= /// /// 输入金额更新行数据 /// /// public void OnInputValueChanged(string strprice) { try { decimal price = 0; decimal.TryParse(strprice, out price); if (price > 0) { if (this._orderItem != null && this._orderItem.RowState == OrderRowState.普通) { this._orderItem.Price = price; this._orderItem.MemberPrice = price; this._orderItem.SalePrice = this._orderItem.Price - (this._orderItem.Price - this._orderItem.MemberPrice); //食堂自动加菜逻辑 if (!this.MaxSaleMoney(_orderItem)) { return; } /* 显示数据 */ this.m_CefClient.CallbackJsfunction("UpdateShoppingRow", JsonConvert.SerializeObject(this._orderItem)); //通知副屏,选中指定行 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.UPDATEORDERITEM, this._orderItem)); } } else { var product = this.BuilderProductExt(price); // 商品点餐逻辑判断 var _data = this.IsOrderItemRule(product); //查询购物车最大值加1 _data.OrderNo = (this._orderObject.Items == null || this._orderObject.Items.Count == 0) ? 1 : this._orderObject.Items.Max(f => f.OrderNo) + 1; _data.Quantity = 1; _data.SalePrice = _data.Price; //食堂自动加菜逻辑 this.MaxSaleMoney(_data); this._orderItem = _data; /* 显示数据 */ this.m_CefClient.CallbackJsfunction("AddNewShoppintRow", JsonConvert.SerializeObject(_data)); //通知副屏 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.ADDORDERITEM, this._orderItem)); } ////通知副屏,选中指定行 //if (Global.Instance.EnableVice) //{ // MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.UPDATEORDERITEM, this._orderItem)); //} } } else { //金额为0删除行 this.m_CefClient.CallbackJsfunction("DeleteShoppintRow", JsonConvert.SerializeObject(this._orderItem)); //通知副屏 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.DELETESINGLEITEM, this._orderItem)); } this._orderItem = null; } } finally { } } /// /// 订单操作统一方法 /// /// public void OrderOperateBtn_Click(string name) { //是否启用授权窗口 var isAuthz = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_AUTO_LOCK_DISABLE, false); //模块授权控制 if (!this.IsAccredit(name)) { return; } this.Invoke((EventHandler)delegate { switch (name) { case "消单": this.m_CefClient.CallbackJsfunction("DeleteAllShoppintRow", "true"); break; case "微信订单"://zhangy 2020-03-13 Add 小程序订单 { var form = Application.OpenForms["JwWeiXinOrderFrom"]; if (form == null) { form = new JwWeiXinOrder.JwWeiXinOrderFrom(); } form.WindowState = FormWindowState.Maximized; TransparentForm trans = new TransparentForm(this, 0.30, form as BusinessForm); trans.ShowDialog(); } break; case "功能": { var form = Application.OpenForms["MoreDialogForm"]; if (form == null) { form = new MoreDialogForm(); } TransparentForm trans = new TransparentForm(this, 0.30, form as BusinessForm); trans.ShowDialog(); } 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.ShowDialog(); if (Global.Instance.Restart) { OrderOperateBtn_Click("退出"); return; } } else { var dialogForm = new FastShitForm(); dialogForm.AcceptButtonClick += (o, args) => { }; dialogForm.CancelButtonClick += (o, args) => { }; TransparentForm trans = new TransparentForm(this, 0.30, dialogForm); trans.ShowDialog(); if (Global.Instance.Restart) { OrderOperateBtn_Click("退出"); return; } } } break; case "注销": { //重启收银程序 Global.Instance.Restart = true; this.m_CefClient.CloseBrowser(); Application.ExitThread(); } break; case "最小化": { this.WindowState = FormWindowState.Minimized; } break; case "退出": { this.Invoke((EventHandler)delegate { LOGGER.Info("手动退出系统"); this.m_CefClient.CloseBrowser(); }); } break; case "AddItem"://添加点菜项 { this.AddOrderItem(); } break; default: break; } }); } /// /// 结账 /// /// public void FunctionBtn_Click(string name) { this.AddOrderItem(); this._orderObject = PromotionDispose(); if (this._orderObject.Items.Count == 0) { this.ShowToastNotify(this, "请先点餐"); return; } //是否启用授权窗口 var isAuthz = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_AUTO_LOCK_DISABLE, false); //模块授权控制 if (!this.IsAccredit(name)) { return; } //支付失败强提示 //if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISPAYDEFEATEDREMING)) //{ // //判断是否有挂起的订单 // var _data = this.orderObjects.Select(f => f.Id); // var _paydata = this.IsPayList.Where(f => _data.Contains(f)); // if (this.orderObjects.Count > 0) // { // if (this.orderObjects.Count > _paydata.Count()) // { // this.ShowToastNotify(this, "请稍等,上一单还未支付成功。"); // return; // } // } //} //else //{ // if (this.orderObjects == null) // { // return; // } // int _count = this.orderObjects.Count; // if (_count > 2) // { // this.ShowToastNotify(this, "已超过3单没有支付成功,请处理后操作"); // return; // } //} this.m_IsAnewPay = false; switch (name) { case "现金": { this.ShowCashPay(); } break; case "离线支付": { this.ShowOfflinePay(); } break; case "会员卡": { this.ShowMemberPay(); } break; case "扫码支付": { this.ShowScanCodePay(); } break; default: break; } } /// /// 删除选中项 /// /// public bool OrderNoDeleteShoppintRow(string OrderNo) { if (string.IsNullOrEmpty(OrderNo)) { this.ShowToastNotify(this, "传入的订单号为null"); return false; } int _no = 0; if (!int.TryParse(OrderNo, out _no)) { this.ShowToastNotify(this, string.Format("传入的订单号不正确 [{0}]", OrderNo)); return false; } if (this._orderItem?.OrderNo == _no) { //通知副屏 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.DELETESINGLEITEM, this._orderItem)); } this._orderItem = null; return true; } var _data = this._orderObject.Items.Where(f => f.OrderNo == _no).FirstOrDefault(); if (_data == null) { this.ShowToastNotify(this, string.Format("传入的订单号未集合中")); return false; } this._orderObject.Items.Remove(_data); //通知副屏 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.DELETESINGLEITEM, _data)); } return true; } /// /// 消单 /// public bool DeleteAllShoppintRow(bool isDialogForm = true) { bool _return = true; this.Invoke((EventHandler)delegate { if (isDialogForm) { if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ORDER_CANCEL_NOTIFY)) { MDialogForm dialog = new MDialogForm("操作提醒", "您确定是要进行取消全单操作吗?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel); if (DialogResult.OK != dialog.ShowDialog(this)) { _return = false; } } } if(_return) { this._orderItem = null; this._orderObject.Items = new List(); //通知副屏 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.CLEARALLITEMS, null)); } } }); return _return; } /// /// 模块授权控制 /// 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(this); if (authForm.IsAccredit) { return true; } else { return false; } } /// /// 查询当前订单 /// /// public string GetOrderObject() { if (this._orderObject == null) { return null; } try { decimal _val = 0M; if (_orderItem != null) { _val = _orderItem.Amount; } GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Total, (_val + this._orderObject.Amount).ToString("#.00")); } catch (Exception e) { LOGGER.Error(e); } var _order = PromotionDispose(); foreach (var item in _order.Items) { this.m_CefClient.CallbackJsfunction("UpdateShoppingRow", JsonConvert.SerializeObject(item)); } return JsonConvert.SerializeObject(_order); } /// /// 查询当前项 /// public string GetThisItme() { if (this._orderItem == null) { return null; } return JsonConvert.SerializeObject(GetOrderItemPromotion(this._orderItem)); } /// /// 重新结账 /// 注意:该方法可以调起支付界面 也可以调起扣款逻辑,主要通过 payCode参数判断 /// /// 重新结账单号 /// 支付码,可以用来辨别重新结账方式,具体请看代码 public void AnewPay(string TradeNo, string payCode = null) { LOGGER.Info("" + payCode); if (string.IsNullOrEmpty(TradeNo)) { this.ShowToastNotify(this, "订单号为空,如果无法操作请重新点单操作!"); return; } //查询挂起订单 var _data = this.orderObjects.FirstOrDefault(f => f.TradeNo == TradeNo); if (_data == null) { this.ShowToastNotify(this, "该订单已经不在挂起集合中,请重新点单操作!"); return; } if (_data.PayQueryQuantity > 0) { this.ShowToastNotify(this, "订单还在查询中请稍等再试!"); return; } //调起支付界面 if (this.ShowAnewPay(_data, payCode)) { return; } } /// /// 订单号支付 /// /// public void TradeNoAnewPay(string TradeNo) { if (string.IsNullOrEmpty(TradeNo)) { this.ShowToastNotify(this, "订单号为空,如果无法操作请重新点单操作!"); return; } //查询挂起订单 var _data = this.orderObjects.FirstOrDefault(f => f.TradeNo == TradeNo); if (_data == null) { return; } if (_data.PayQueryQuantity > 0) { return; } if (_data.ErrorMessage.Contains("支付中")) { if (_data.PayCountDown.Day == 1) { _data.PayCountDown = DateTime.Now; } var _midTime = DateTime.Now - _data.PayCountDown; var _InPayMentData = new { _data.TradeNo, Date = 60 - _midTime.Seconds }; //用户正在输入密码提示 this.m_CefClient.CallbackJsfunction("ShowInPayMent", JsonConvert.SerializeObject(_InPayMentData)); } else { var _json = new { _data.ErrorMessage, _data.TradeNo }; this.m_CefClient.CallbackJsfunction("ShowAnewPayView", JsonConvert.SerializeObject(_json)); } } public bool GetIsAnewPay() { return this.m_IsAnewPay; } /// /// html调用的支付 /// public void InitiatePay(string PayCode) { string message = ""; if (string.IsNullOrEmpty(PayCode)) { message = "支付码错误!"; } if (this._orderItem != null) { this._orderObject.Items.Add(this._orderItem); } if (this._orderObject.Items == null || this._orderObject.Items.Count == 0) { message = "无商品数据"; } //以上判断有错误信息则提示 if (!string.IsNullOrEmpty(message)) { this.m_CefClient.CallbackJsfunction("SetPayViewMessage", message); return; } PayOperation pay = new PayOperation(this._orderObject, PayCode); if (!pay.VerifyParameter()) { this.m_CefClient.CallbackJsfunction("SetPayViewMessage", pay.m_Message); return; } pay.AsyncPayResult = this.PayResultAsyncCallBack; this.orderObjects.Add(this._orderObject); pay.AsyncPayStart(); var _paylistjson = new { no = this._orderObject.TradeNo, Time = this._orderObject.SaleDate, Money = this._orderObject.ReceivableAmount, PayType = pay.m_CurrentPayMode == null ? "移动支付" : pay.m_CurrentPayMode.Name }; this.m_CefClient.CallbackJsfunction("AddOrderPayList", JsonConvert.SerializeObject(_paylistjson)); this.m_CefClient.CallbackJsfunction("PayViewClose", JsonConvert.SerializeObject(_paylistjson)); this.DestoryOrderObject(false); this.InitOrderData(); } /// /// 初始化 /// public void Init() { this.InitOrderData(); //副屏 this.LoadingViceScreen(); this.DestoryOrderObject(false); //登录班次 BusinessUtils.Instance.WorkerLogin(); //初始化收银员权限 BusinessUtils.Instance.InitPermission(); //当前未登录状态 Global.Instance.IsLogin = true; //初始化底部门店信息 var _StoreInfoName = Global.Instance.Worker.StoreInfo.Name; var _posNo = Global.Instance.Authc.PosNo; var _No = Global.Instance.Worker.No; var _loginDate = Global.Instance.Worker.LastDate; var _StaffData = new { StoreInfoName = Global.Instance.Worker.StoreInfo.Name, posNo = Global.Instance.Authc.PosNo, No = Global.Instance.Worker.No, loginDate = Global.Instance.Worker.LastDate }; this.m_CefClient.CallbackJsfunction("StaffData", JsonConvert.SerializeObject(_StaffData)); //zhangy 2020-03-13 Add //是否开启小程序订单 var enableAppletOrder = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ENABLEAPPLETORDER, false); var data = new Dictionary(); data.Add("enable", enableAppletOrder ? 1 : 0); data.Add("count", 0); //发送界面通知 this.m_CefClient.CallbackJsfunction("ShowWxProgramOrderNotify", JsonConvert.SerializeObject(data)); #if DEBUG this.m_CefClient.ShowDevTools(); #endif } /// /// 打开核销 /// public void ShowPayTicket(string _TradeNo = null) { this.Invoke((EventHandler)delegate { OrderObject oj = new OrderObject(); if (_TradeNo == null) { oj = this._orderObject; } else { oj = this.orderObjects.FirstOrDefault(f => f.TradeNo == _TradeNo); if (oj == null) { return; } } //打开提示界面 var form = new FastMPayChckForm(oj, oj.ReceivableAmount - oj.ReceivedAmount); TransparentForm trans = new TransparentForm(this, 0.08, form); trans.ShowDialog(); if (oj.Pays.Count > 0) { //保存数据 var _result = BusinessUtils.Instance.OrderFinished(oj); if (_result.Item1) { oj.PayState = "支付成功"; var _json = new { orderObject = oj, Message = "核销成功", PayType = oj.Pays.FirstOrDefault().Name }; //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); this.orderObjects.Remove(this.orderObjects.FirstOrDefault(f => f.TradeNo == oj.TradeNo)); } else { oj.PayState = "支付失败"; var _json = new { orderObject = oj, Message = "核销成功但数据保存失败", PayType = oj.Pays.FirstOrDefault().Name }; //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); } } }); } /// /// 网络连接状态 /// /// /// protected override void NetworkEventNotify(object sender, MsgEventArgs args) { base.NetworkEventNotify(sender, args); if (IsDisposed || !this.IsHandleCreated) return; this.m_CefClient.CallbackJsfunction("ChangNetworkStatus", this.ChangNetworkStatus()); } /// /// 当前网络状态 /// /// public string ChangNetworkStatus() { return Global.Instance.Online ? "网络正常" : "网络异常"; } #region 商品信息 public string GetItemData() { //var _data = new //{ // size, // current, // total = (int)Math.Ceiling((decimal)(Global.Product._productList.Count / size)), // data = Global.Product._productList.Skip((current - 1) * size).Take(size) //}; return JsonConvert.SerializeObject(Global.Product._productList); } public string AddItemData(string id) { if (string.IsNullOrEmpty(id)) { return null; } var _data = Global.Product._productList.FirstOrDefault(f => f.Id == id); if (_data == null) { return null; } IsOrderItemRule(_data); var _item = BusinessUtils.Instance.NewOrderItem(this._orderObject, _data, OrderRowState.普通); _item.OrderNo = (this._orderObject.Items == null || this._orderObject.Items.Count == 0) ? 1 : this._orderObject.Items.Max(f => f.OrderNo) + 1; _item.Quantity = 1; _item.SalePrice = _item.Price; this._orderObject.Items.Add(_item); /* 显示数据 */ this.m_CefClient.CallbackJsfunction("AddNewShoppintRow", JsonConvert.SerializeObject(_item)); //通知副屏,选中指定行 if (Global.Instance.EnableVice) { MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.UPDATEORDERITEM, this._orderItem)); } return ""; } #endregion /// /// 用户关闭用户支付界面 /// /// public void IsPayOrderList(string id) { if (string.IsNullOrEmpty(id)) { return; } var _data = this.orderObjects.FirstOrDefault(f => f.TradeNo == id); if (_data == null) { return; } this.IsPayList.Add(_data.Id); } //================== private function ====================== /// /// 显示支付界面 /// /// /// /// private bool ShowAnewPay(OrderObject _order, string payCode) { var _Is = false; this.m_IsAnewPay = true; switch (payCode) { case "现金": { this.ShowCashPay(_order); } _Is = true; break; case "会员卡": { this.ShowMemberPay(_order); _Is = true; } break; case "取消订单": { var _data = this.orderObjects.FirstOrDefault(f => f.TradeNo == _order.TradeNo); this.m_IsAnewPay = false; this.PayResultAsyncCallBack(_data, null, "", "订单取消", 0); if (_data != null) { this.m_cancelorders.Add(_data); this.orderObjects.Remove(_data); } _Is = true; } break; case null: { //显示扫码支付界面 this.m_CefClient.CallbackJsfunction("ShowPayView", JsonConvert.SerializeObject(_order)); _Is = true; } break; default: { this.ShowScanCodePay(_order, payCode); } break; } return _Is; } /// /// 初始化销售数据 /// private void InitOrderData() { //初始化订单对象 this._orderObject = BusinessUtils.Instance.NewOrderObject(); this._orderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo(); if (this._orderObject.Pays == null) this._orderObject.Pays = new List(); if (this._orderObject.Items == null) this._orderObject.Items = new List(); if (this._orderObject.Promotions == null) this._orderObject.Promotions = new List(); this._orderItem = null; this.m_CefClient.CallbackJsfunction("DeleteAllShoppintRow", "false"); } /// /// 初始化控件 /// private void Initialize() { //登录班次 BusinessUtils.Instance.WorkerLogin(); //初始化收银员权限 BusinessUtils.Instance.InitPermission(); //窗口初始化 this.WindowState = FormWindowState.Maximized; //初始化cef m_CefClient = new CefClientModule(this); m_CefClient.LoadingStateEvent += this.LoadingStateEvent; } /// /// 根据金额初始化商品数据 /// /// 金额 /// private ProductExt BuilderProductExt(decimal price) { 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(json); product.TenantId = Global.Instance.Worker.TenantId; product.Price = price; product.MemberPrice = price; return product; } /// /// 现金结账 /// private void QuickPay(OrderObject order, decimal inputMoney = -9999) { LOGGER.Info("操作现金结账"); //食堂版本的速结不采用数据金额模式,直接按单结账 if (inputMoney == -9999) { inputMoney = order.ReceivableAmount; } if (!this.m_IsAnewPay) { var _paylistjson = new { no = order.TradeNo, Time = order.SaleDate, Money = order.ReceivableAmount, PayType = "现金支付" }; this.m_CefClient.CallbackJsfunction("AddOrderPayList", JsonConvert.SerializeObject(_paylistjson)); this.DestoryOrderObject(false); } var result = BusinessUtils.Instance.QuickPay(order, inputMoney); //现金支付成功 if (result.Item1) { #region 通知界面 order.PayState = "支付成功"; //通知界面 var _json = new { orderObject = order, Message = "支付成功", PayType = order.Pays.FirstOrDefault()?.Name }; //关闭重新结账标识 this.m_IsAnewPay = false; this.orderObjects.Remove(this.orderObjects.FirstOrDefault(f => f.OrderNo == order.OrderNo)); //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); #endregion this.DestoryOrderObject(false); this.InitOrderData(); } else { #region 通知界面 order.PayState = "支付失败"; //通知界面 var _json = new { orderObject = order, Message = result.Item2, PayType = "人民币" }; //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); #endregion this.ShowToastNotify(this, result.Item2); } } /// /// 离线支付结账 /// private void OfflinePay(OrderObject order, decimal inputMoney = -9999) { LOGGER.Info("操作离线支付"); //自动弹出桌号 if (!ProcessAutoDeskNo()) { return; } //食堂版本的离线支付 inputMoney = _orderObject.ReceivableAmount; var result = BusinessUtils.Instance.OfflinePay(_orderObject, inputMoney); if (result.Item1) { #region 通知界面 var _paylistjson = new { no = order.TradeNo, Time = order.SaleDate, Money = order.ReceivableAmount, PayType = "离线支付" }; this.m_CefClient.CallbackJsfunction("AddOrderPayList", JsonConvert.SerializeObject(_paylistjson)); order.PayState = "支付成功"; //通知界面 var _json = new { orderObject = order, Message = "支付成功", PayType = order.Pays.FirstOrDefault()?.Name }; //关闭重新结账标识 this.m_IsAnewPay = false; this.orderObjects.Remove(this.orderObjects.FirstOrDefault(f => f.OrderNo == order.OrderNo)); //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); #endregion this.DestoryOrderObject(false); this.InitOrderData(); } else { this.ShowToastNotify(this, result.Item2); } } /// /// 自动弹出桌号 /// /// 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; } } #region private SetDeskNo 显示选择桌台 /// /// 显示桌台 /// /// private DialogResult SetDeskNo() { var form = new DeskNoForm(this._orderObject); form.AcceptButtonClick += (o, args) => { var desk = args.Data as Tuple; 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.数量, _orderObject.TableName) }); } }; return form.ShowDialog(this); } #endregion #region private DestoryOrderObject 结账完成后流出 /// /// 结账完成后流出 /// 1、推送 关闭会员优惠通知 /// 2、清理副屏 /// 3、默认初始化订单列表 /// /// 强制清除结账后数据 /// /// private void DestoryOrderObject(bool forced, bool newOrder = true) { //关闭会员优惠提醒 MsgEvent.Send(Constant.HISTORY_CHANGED_NOTIFY, new Tuple(HistoryMsgType.会员优惠, 0)); //禁止交易完成后立即清除单据信息,显示已结账 bool allowShowPreOrder = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_SHOW_PREORDER); MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.CLEARALLITEMS, null)); MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.FINISHEDORDER, null)); MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple(ViceNotifyType.CREATEORDER, this._orderObject)); } #endregion #region private NewOrderObject 创建一个订单对象,本单交易完成前,对象唯一存在 /// /// 创建一个订单对象,本单交易完成前,对象唯一存在 /// /// private OrderObject NewOrderObject() { if (this._orderObject == null) { this._orderObject = BusinessUtils.Instance.NewOrderObject(); //会员卡号 //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.数量, _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.名称, 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.名称, OrderType.外带.ToString()) }); } } this._orderItem = null; return this._orderObject; } #endregion #region private IsOrderItemRule 点菜逻辑过滤方法 /// /// 商品业务逻辑过滤 /// 该方法决定本次点的菜是否成功 /// private OrderItem IsOrderItemRule(ProductExt product) { //1、允许销售售价为零的商品 var allowPriceZero = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_PRICE_ZERO, false); if (product.Price <= 0 && !allowPriceZero) { this.ShowToastNotify(this, "不允许售卖价格为零的商品"); return null; } //2、售价为零的商品时提示 var priceZeroNotify = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_PRICE_ZERO_NOTIFY, false); if (product.Price <= 0 && priceZeroNotify) { var dialog = new MDialogForm("提示信息", "您是否要售卖零售价的单品", MessageBoxIcon.Warning, MessageBoxButtons.YesNo); //操作员选择了 是 if (DialogResult.Yes != dialog.ShowDialog(this)) return null; } //创建新的OrderItem var master = BusinessUtils.Instance.NewOrderItem(this._orderObject, product, OrderRowState.普通); return master; } #endregion #region private AddOrderItem 累加菜品项 /// /// 累加点菜项 /// private void AddOrderItem() { if (this._orderItem == null) { return; } if (this._orderObject.Items == null) { this._orderObject.Items = new List(); } this._orderItem.OrderId = this._orderObject.Id; this._orderObject.Items.Add(this._orderItem); this._orderItem = null; } #endregion #region private LoadingViceScreen 加载副屏 /// /// 加载副屏 /// private void LoadingViceScreen() { try { 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) { this.Invoke((EventHandler)delegate { 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, "副屏显示异常"); } } #endregion #region private 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 private 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") + "]"); _orderItem.MemberPrice = Money; _orderItem.Price = Money; _orderItem.SalePrice = _orderItem.Price - (_orderItem.Price - _orderItem.MemberPrice); this.m_CefClient.CallbackJsfunction("UpdateShoppingRow", JsonConvert.SerializeObject(_orderItem)); this.m_CefClient.CallbackJsfunction("SetTxt", Money.ToString()); return false; } return true; } #endregion #region 支付回掉 /// /// 异步通知方法 /// /// /// /// /// /// private void PayResultAsyncCallBack(OrderObject _orderObject, PayItem _paymodel, string _payCode, string message, int _QueryQuantity) { if (this.orderObjects == null || this.orderObjects.Count == 0) { //提示 return; } //查询挂起集合 OrderObject orderdata = this.orderObjects.FirstOrDefault(f => f.TradeNo == _orderObject.TradeNo); if (orderdata == null) { orderdata = this.m_cancelorders.FirstOrDefault(f => f.TradeNo == _orderObject.TradeNo); } if (orderdata == null) { LOGGER.Info("有支付成功,但在内存集合中找不到相关订单!"); return; } //修改剩余查询次数 if (this.orderObjects.Remove(orderdata)) { orderdata.PayQueryQuantity = _QueryQuantity; orderdata.ErrorMessage = message; this.orderObjects.Add(orderdata); } //支付结果 if (_paymodel != null) { //整单状态 orderdata.OrderStatus = OrderStatus.已完成; //整单支付状态 orderdata.PaymentStatus = OrderPaymentStatus.已付款; _paymodel.OrderId = orderdata.Id; if (_paymodel.No == "02") { //会员卡支付特殊处理,因为调用了原来的会员卡支付逻辑,支付数据在原来的逻辑里生成了,所以无需再此再生成一次 var _Pay = orderdata.Pays.FirstOrDefault(f => f.No == "02"); if (_Pay == null) { //插入 orderdata.Pays.Add(_paymodel); } } else { orderdata.Pays.Add(_paymodel); } //关闭重新结账标识 this.m_IsAnewPay = false; if (Global.Instance.IsStudyMode()) { this.ShowToastNotify(this, "注意:练习模式不会保存销售流水!"); return; } //保存数据 var _result = BusinessUtils.Instance.OrderFinished(orderdata); //界面信息 if (_result.Item1) { _QueryQuantity = 0; orderdata.PayState = "支付成功"; message = "支付成功"; this.orderObjects.Remove(orderdata); } else { //报错订单失败 orderdata.PayState = "保存失败"; message += "\\t\\n已支付成功,但数据保存失败!"; } } else { //按钮文案 { if (message.Contains("支付中")) { orderdata.PayState = "正在支付"; } else if (message.Contains("订单取消")) { orderdata.PayState = "订单取消"; } else { orderdata.PayState = "支付失败"; } } //强行提示 { if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISPAYDEFEATEDREMING)) { if (!message.Contains("支付中")) { this.m_CefClient.CallbackJsfunction("InPayMentHide", orderdata.TradeNo); if (orderdata.PayState != "订单取消") { this.IsPayList.Remove(orderdata.Id); //重新结账 this.m_CefClient.CallbackJsfunction("ShowAnewPayView", JsonConvert.SerializeObject(new { ErrorMessage = message, orderdata.TradeNo })); } } } //用户需要输入密码,直到支付渠道关闭支付 if (message.Contains("支付中")) { if (this.IsPayList.FirstOrDefault(l => l == orderdata.Id) == null) { if (orderdata.PayCountDown.Day == 1) { orderdata.PayCountDown = DateTime.Now; } var _midTime = DateTime.Now - orderdata.PayCountDown; var _InPayMentData = new { orderdata.TradeNo, Date = 60 - _midTime.Seconds }; //用户正在输入密码提示 this.m_CefClient.CallbackJsfunction("ShowInPayMent", JsonConvert.SerializeObject(_InPayMentData)); } } } //浮动提示文案 { if (message.Contains("支付中")) { message = "用户正在输入密码"; } else { if (!message.Equals("订单已被取消")) { message += (_QueryQuantity == 0 ? "" : " \\t\\n查询剩余次数:" + _QueryQuantity); } } } } var _json = new { orderObject = orderdata, Message = message, PayType = _paymodel?.Name }; //修改当前弹出正在支付界面的状态,无弹出不是该订单则不会影响 this.m_CefClient.CallbackJsfunction("InPayMentStatusUpdate", JsonConvert.SerializeObject(_json)); //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); } #endregion private OrderObject PromotionDispose() { var _amy1 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT1, ""); var _amy2 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT2, ""); var _amy3 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT3, ""); var _amy4 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT4, ""); var _amy5 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT5, ""); var _amy6 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT6, ""); var _oi = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(_orderObject)); if (!string.IsNullOrEmpty(_amy1) || !string.IsNullOrEmpty(_amy2) || !string.IsNullOrEmpty(_amy3)) { var _kta1 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_KNOCK_THE_AMOUNT1, ""); var _kta2 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_KNOCK_THE_AMOUNT2, ""); var _kta3 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_KNOCK_THE_AMOUNT3, ""); Dictionary _ktas = new Dictionary(); if (!string.IsNullOrEmpty(_amy1)) { _ktas.Add(decimal.Parse(_amy1), decimal.Parse(_kta1)); } if (!string.IsNullOrEmpty(_amy2)) { _ktas.Add(decimal.Parse(_amy2), decimal.Parse(_kta2)); } if (!string.IsNullOrEmpty(_amy3)) { _ktas.Add(decimal.Parse(_amy3), decimal.Parse(_kta3)); } _ktas = _ktas.OrderByDescending(f => f.Key).ToDictionary(f => f.Key, o => o.Value); if (_orderItem != null) { _oi.Items.Add(_orderItem); } foreach (var item in _ktas) { if (item.Key <= _oi.Amount) { //满足促销 KnocktheAmountDispose(_oi, item.Value, PromotionType.整单立减); return _oi; } } } else if(!string.IsNullOrEmpty(_amy4) || !string.IsNullOrEmpty(_amy5) || !string.IsNullOrEmpty(_amy6)) { var _da1 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_DISCOUNT_AMOUNT1, ""); var _da2 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_DISCOUNT_AMOUNT2, ""); var _da3 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_DISCOUNT_AMOUNT3, ""); Dictionary _ktas = new Dictionary(); if (!string.IsNullOrEmpty(_amy4)) { _ktas.Add(decimal.Parse(_amy4), decimal.Parse(_da1)); } if (!string.IsNullOrEmpty(_amy5)) { _ktas.Add(decimal.Parse(_amy5), decimal.Parse(_da2)); } if (!string.IsNullOrEmpty(_amy6)) { _ktas.Add(decimal.Parse(_amy6), decimal.Parse(_da3)); } _ktas = _ktas.OrderByDescending(f => f.Key).ToDictionary(f => f.Key, o => o.Value); if (_orderItem != null) { _oi.Items.Add(_orderItem); } foreach (var item in _ktas) { if (item.Key <= _oi.Amount) { //满足促销 KnocktheAmountDispose(_oi, _oi.Amount - ((_oi.Amount ) * (item.Value / 100)) , PromotionType.整单折扣); return _oi; } } } return _oi; } private OrderItem GetOrderItemPromotion(OrderItem _item) { var _oi = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(_item)); var _amy1 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT1, ""); var _amy2 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT2, ""); var _amy3 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT3, ""); var _amy4 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT4, ""); var _amy5 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT5, ""); var _amy6 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_ORDER_AMOUNT6, ""); if (!string.IsNullOrEmpty(_amy1) || !string.IsNullOrEmpty(_amy2) || !string.IsNullOrEmpty(_amy3)) { var _kta1 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_KNOCK_THE_AMOUNT1, ""); var _kta2 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_KNOCK_THE_AMOUNT2, ""); var _kta3 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_KNOCK_THE_AMOUNT3, ""); Dictionary _ktas = new Dictionary(); if (!string.IsNullOrEmpty(_amy1)) { _ktas.Add(decimal.Parse(_amy1), decimal.Parse(_kta1)); } if (!string.IsNullOrEmpty(_amy2)) { _ktas.Add(decimal.Parse(_amy2), decimal.Parse(_kta2)); } if (!string.IsNullOrEmpty(_amy3)) { _ktas.Add(decimal.Parse(_amy3), decimal.Parse(_kta3)); } _ktas = _ktas.OrderByDescending(f => f.Key).ToDictionary(f => f.Key, o => o.Value); foreach (var item in _ktas) { if (item.Key <= _oi.Amount + _orderObject.Amount) { if (_orderObject.Items.Sum(f=>f.DiscountAmount) >= item.Value ) { return _oi; } PromotionItem promotionItem = new PromotionItem(); promotionItem.Amount = _oi.Amount + _orderObject.Amount; promotionItem.DiscountAmount = item.Value;//优惠金额 if (promotionItem.DiscountAmount != 0) { promotionItem.DiscountRate = DecimalUtils.ToRound(promotionItem.DiscountAmount / promotionItem.Amount, 2);//优惠率 } promotionItem.Enabled = true; promotionItem.FinishDate = _orderObject.CreateDate;//完成时间 promotionItem.Id = IdWorkerUtils.Instance.NextId(); promotionItem.ItemId = _orderObject.Id;//行ID promotionItem.OrderId = _orderObject.Id;// promotionItem.PlanName = "促销立减";//班次编号 promotionItem.PromotionType = PromotionType.外卖扣费; promotionItem.ReceivableAmount = _orderObject.ReceivableAmount; promotionItem.RelationId = ""; promotionItem.TenantId = Global.Instance.Authc.TenantId;//租户ID promotionItem.TradeNo = _orderObject.TradeNo;//订单编号 promotionItem.CreateDate = _orderObject.CreateDate;//创建时间 promotionItem.CreateUser = "1001";//创建人 _oi.Promotions.Add(promotionItem); return _oi; } } } else if (!string.IsNullOrEmpty(_amy4) || !string.IsNullOrEmpty(_amy5) || !string.IsNullOrEmpty(_amy6)) { var _da1 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_DISCOUNT_AMOUNT1, ""); var _da2 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_DISCOUNT_AMOUNT2, ""); var _da3 = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_PROMOTION_DISCOUNT_AMOUNT3, ""); Dictionary _ktas = new Dictionary(); if (!string.IsNullOrEmpty(_amy4)) { _ktas.Add(decimal.Parse(_amy4), decimal.Parse(_da1)); } if (!string.IsNullOrEmpty(_amy5)) { _ktas.Add(decimal.Parse(_amy5), decimal.Parse(_da2)); } if (!string.IsNullOrEmpty(_amy6)) { _ktas.Add(decimal.Parse(_amy6), decimal.Parse(_da3)); } _ktas = _ktas.OrderByDescending(f => f.Key).ToDictionary(f => f.Key, o => o.Value); foreach (var item in _ktas) { if (item.Key <= this._orderObject.Amount + _orderItem.Amount) { if (item.Key <= _oi.Amount + _orderObject.Amount) { if (_orderObject.Items.Sum(f => f.DiscountAmount) >= item.Value ) { return _oi; } PromotionItem promotionItem = new PromotionItem(); promotionItem.Amount = _oi.Amount + _orderObject.Amount; promotionItem.DiscountAmount =( _oi.Amount + _orderObject.Amount) - ((this._orderObject.Amount + _orderItem.Amount) * (item.Value / 100));//优惠金额 if (promotionItem.DiscountAmount != 0) { promotionItem.DiscountRate = DecimalUtils.ToRound(promotionItem.DiscountAmount / promotionItem.Amount, 2);//优惠率 } promotionItem.Enabled = true; promotionItem.FinishDate = _orderObject.CreateDate;//完成时间 promotionItem.Id = IdWorkerUtils.Instance.NextId(); promotionItem.ItemId = _orderObject.Id;//行ID promotionItem.OrderId = _orderObject.Id;// promotionItem.PlanName = "促销立减";//班次编号 promotionItem.PromotionType = PromotionType.外卖扣费; promotionItem.ReceivableAmount = _orderObject.ReceivableAmount; promotionItem.RelationId = ""; promotionItem.TenantId = Global.Instance.Authc.TenantId;//租户ID promotionItem.TradeNo = _orderObject.TradeNo;//订单编号 promotionItem.CreateDate = _orderObject.CreateDate;//创建时间 promotionItem.CreateUser = "1001";//创建人 _oi.Promotions.Add(promotionItem); return _oi; } } } } return _oi; } private void KnocktheAmountDispose(OrderObject orderObject, decimal _amy, PromotionType promotionType) { var i = 0; orderObject.Items.ForEach(f => f.Promotions = new List()); foreach (var order in orderObject.Items) { if (i == orderObject.Items.Count() - 1) { order.Discount = Math.Abs(_amy) - orderObject.DiscountAmount; } else { order.Discount = (order.Amount / orderObject.Amount) * Math.Abs(_amy); } if (order.Promotions == null) { order.Promotions = new List(); } i++; PromotionItem promotionItem = new PromotionItem(); promotionItem.Amount = order.Amount; promotionItem.DiscountAmount = order.Discount;//优惠金额 if (promotionItem.DiscountAmount != 0) { promotionItem.DiscountRate = DecimalUtils.ToRound(promotionItem.DiscountAmount / promotionItem.Amount, 2);//优惠率 } promotionItem.Enabled = true; promotionItem.FinishDate = orderObject.CreateDate;//完成时间 promotionItem.Id = IdWorkerUtils.Instance.NextId(); promotionItem.ItemId = order.Id;//行ID promotionItem.OrderId = orderObject.Id;// promotionItem.PlanName = "促销立减";//班次编号 promotionItem.PromotionType = promotionType; promotionItem.ReceivableAmount = order.ReceivableAmount; promotionItem.RelationId = ""; promotionItem.TenantId = Global.Instance.Authc.TenantId;//租户ID promotionItem.TradeNo = orderObject.TradeNo;//订单编号 promotionItem.CreateDate = orderObject.CreateDate;//创建时间 promotionItem.CreateUser = "ShiTan";//创建人 order.Promotions.Add(promotionItem); } } //================== 会员、现金、扫码支付 ===================== #region 支付接口 private void ShowMemberPay(OrderObject order = null) { this.Invoke((EventHandler)delegate { OrderObject _data = null; if (order != null) { _data = order; } else { _data = ObjectUtils.Copy(this._orderObject); } var dialogForm = new MCardDialogForm(_data); dialogForm.AcceptButtonClick += (o, args) => { if (order == null) { if (this.orderObjects.FirstOrDefault(f => f.TradeNo == _data.TradeNo) == null) { this.orderObjects.Add(_data); var _paylistjson = new { no = _data.TradeNo, Time = _data.SaleDate, Money = _data.ReceivableAmount, PayType = "会员卡" }; this.m_CefClient.CallbackJsfunction("AddOrderPayList", JsonConvert.SerializeObject(_paylistjson)); this.DestoryOrderObject(false); this.InitOrderData(); } } }; dialogForm.CancelButtonClick += (o, args) => { }; TransparentForm trans = new TransparentForm(this, 0.08, dialogForm); trans.ShowDialog(); var _paymodel = _data.Pays.FirstOrDefault(f => f.No == "02"); if (_paymodel != null) { #region 通知界面 _data.PayState = "支付成功"; //通知界面 var _json = new { orderObject = _data, Message = "支付成功", PayType = "会员卡" }; //关闭重新结账标识 this.m_IsAnewPay = false; this.PayResultAsyncCallBack(_data, _paymodel, "", "", 0); //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); this.orderObjects = new List(); this.InitOrderData(); #endregion } else { #region 通知界面 _data.PayState = "支付失败"; //通知界面 var _json = new { orderObject = _data, Message = "支付失败", PayType = "会员卡" }; //修改界面状态 this.m_CefClient.CallbackJsfunction("UpdateAddOrderPayList", JsonConvert.SerializeObject(_json)); #endregion } }); } private void ShowCashPay(OrderObject order = null) { OrderObject _data = null; if (order != null) { _data = order; } else { _data = ObjectUtils.Copy(this._orderObject); } //var dialogForm = new CashDialogForm(_data); //dialogForm.AcceptButtonClick += (o, args) => //{ //decimal inputMoney = Convert.ToDecimal(args.Data); if (order == null) this.orderObjects.Add(_data); if (Global.Instance.IsStudyMode()) { this.ShowToastNotify(this, "注意:练习模式不会保存销售流水!"); } this.QuickPay(_data); //}; //dialogForm.CancelButtonClick += (o, args) => { }; //TransparentForm trans = new TransparentForm(this, 0.08, dialogForm); //trans.ShowDialog(this); } private void ShowOfflinePay(OrderObject order = null) { this.OfflinePay(this._orderObject); } private void ShowScanCodePay(OrderObject _data = null, string payCode = null) { if (_data == null) { this.m_CefClient.CallbackJsfunction("ShowPayView", JsonConvert.SerializeObject(this._orderObject)); return; } PayOperation pay = new PayOperation(_data, payCode); if (!pay.VerifyParameter()) { this.m_CefClient.CallbackJsfunction("SetPayViewMessage", pay.m_Message); return; } pay.AsyncPayResult = this.PayResultAsyncCallBack; pay.AsyncPayStart(); var _paylistjson = new { no = _data.TradeNo, Money = _data.ReceivableAmount, PayType = pay.m_CurrentPayMode == null ? "移动支付" : pay.m_CurrentPayMode.Name }; this.m_CefClient.CallbackJsfunction("PayViewClose", JsonConvert.SerializeObject(_paylistjson)); } #endregion #region 加载界面动画 private void LoadingStateEvent(bool IsLoadStatus, string Message) { this.Invoke((EventHandler)delegate { try { if (loading == null) { loading = new Loading(); } if (IsLoadStatus) { loading.BringToFront(); loading.Show(this); } else { loading.Dispose(); loading.Close(); } } catch { } }); } #endregion } }