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.

2171 lines
80 KiB
C#

This file contains ambiguous Unicode characters!

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

using 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<Dictionary<string, string>>(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<string, string> messageMap = JsonUtils.Deserialize<Dictionary<string, string>>(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<string, object>();
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<OrderObject> orderObjects = new List<OrderObject>();
//当前取消支付订单
private List<OrderObject> m_cancelorders = new List<OrderObject>();
//
private List<string> IsPayList = new List<string>();
/// <summary>
/// cef
/// </summary>
private CefClientModule<FastTemplate> m_CefClient = null;
/// <summary>
/// 全局重新结账表示
/// </summary>
public bool m_IsAnewPay = false;
/// <summary>
/// 加载界面
/// </summary>
private Loading loading = null;
#endregion
//================== public function =======================
/// <summary>
/// 输入金额更新行数据
/// </summary>
/// <param name="price"></param>
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, object>(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, object>(ViceNotifyType.ADDORDERITEM, this._orderItem));
}
////通知副屏,选中指定行
//if (Global.Instance.EnableVice)
//{
// MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(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, object>(ViceNotifyType.DELETESINGLEITEM, this._orderItem));
}
this._orderItem = null;
}
}
finally
{
}
}
/// <summary>
/// 订单操作统一方法
/// </summary>
/// <param name="name"></param>
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;
}
});
}
/// <summary>
/// 结账
/// </summary>
/// <param name="name"></param>
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;
}
}
/// <summary>
/// 删除选中项
/// </summary>
/// <param name="OrderNo"></param>
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, object>(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, object>(ViceNotifyType.DELETESINGLEITEM, _data));
}
return true;
}
/// <summary>
/// 消单
/// </summary>
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<OrderItem>();
//通知副屏
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.CLEARALLITEMS, null));
}
}
});
return _return;
}
/// <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(this);
if (authForm.IsAccredit)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 查询当前订单
/// </summary>
/// <returns></returns>
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);
}
/// <summary>
/// 查询当前项
/// </summary>
public string GetThisItme()
{
if (this._orderItem == null)
{
return null;
}
return JsonConvert.SerializeObject(GetOrderItemPromotion(this._orderItem));
}
/// <summary>
/// 重新结账
/// 注意:该方法可以调起支付界面 也可以调起扣款逻辑,主要通过 payCode参数判断
/// </summary>
/// <param name="TradeNo">重新结账单号</param>
/// <param name="payCode">支付码,可以用来辨别重新结账方式,具体请看代码</param>
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;
}
}
/// <summary>
/// 订单号支付
/// </summary>
/// <param name="TradeNo"></param>
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;
}
/// <summary>
/// html调用的支付
/// </summary>
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();
}
/// <summary>
/// 初始化
/// </summary>
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<string, object>();
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
}
/// <summary>
/// 打开核销
/// </summary>
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));
}
}
});
}
/// <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.m_CefClient.CallbackJsfunction("ChangNetworkStatus", this.ChangNetworkStatus());
}
/// <summary>
/// 当前网络状态
/// </summary>
/// <returns></returns>
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, object>(ViceNotifyType.UPDATEORDERITEM, this._orderItem));
}
return "";
}
#endregion
/// <summary>
/// 用户关闭用户支付界面
/// </summary>
/// <param name="id"></param>
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 ======================
/// <summary>
/// 显示支付界面
/// </summary>
/// <param name="_order"></param>
/// <param name="payCode"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 初始化销售数据
/// </summary>
private void InitOrderData()
{
//初始化订单对象
this._orderObject = BusinessUtils.Instance.NewOrderObject();
this._orderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo();
if (this._orderObject.Pays == null)
this._orderObject.Pays = new List<PayItem>();
if (this._orderObject.Items == null)
this._orderObject.Items = new List<OrderItem>();
if (this._orderObject.Promotions == null)
this._orderObject.Promotions = new List<PromotionOrder>();
this._orderItem = null;
this.m_CefClient.CallbackJsfunction("DeleteAllShoppintRow", "false");
}
/// <summary>
/// 初始化控件
/// </summary>
private void Initialize()
{
//登录班次
BusinessUtils.Instance.WorkerLogin();
//初始化收银员权限
BusinessUtils.Instance.InitPermission();
//窗口初始化
this.WindowState = FormWindowState.Maximized;
//初始化cef
m_CefClient = new CefClientModule<FastTemplate>(this);
m_CefClient.LoadingStateEvent += this.LoadingStateEvent;
}
/// <summary>
/// 根据金额初始化商品数据
/// </summary>
/// <param name="price">金额</param>
/// <returns></returns>
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<ProductExt>(json);
product.TenantId = Global.Instance.Worker.TenantId;
product.Price = price;
product.MemberPrice = price;
return product;
}
/// <summary>
/// 现金结账
/// </summary>
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);
}
}
/// <summary>
/// 离线支付结账
/// </summary>
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);
}
}
/// <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;
}
}
#region private SetDeskNo 显示选择桌台
/// <summary>
/// 显示桌台
/// </summary>
/// <returns></returns>
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);
}
#endregion
#region private DestoryOrderObject 结账完成后流出
/// <summary>
/// 结账完成后流出
/// 1、推送 关闭会员优惠通知
/// 2、清理副屏
/// 3、默认初始化订单列表
/// </summary>
/// <param name="forced">强制清除结账后数据</param>
/// <param name="newOrder"></param>
/// <returns></returns>
private void 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);
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.CLEARALLITEMS, null));
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.FINISHEDORDER, null));
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.CREATEORDER, this._orderObject));
}
#endregion
#region private NewOrderObject 创建一个订单对象,本单交易完成前,对象唯一存在
/// <summary>
/// 创建一个订单对象,本单交易完成前,对象唯一存在
/// </summary>
/// <returns></returns>
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, 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;
}
#endregion
#region private IsOrderItemRule 点菜逻辑过滤方法
/// <summary>
/// 商品业务逻辑过滤
/// 该方法决定本次点的菜是否成功
/// </summary>
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 累加菜品项
/// <summary>
/// 累加点菜项
/// </summary>
private void AddOrderItem()
{
if (this._orderItem == null)
{
return;
}
if (this._orderObject.Items == null)
{
this._orderObject.Items = new List<OrderItem>();
}
this._orderItem.OrderId = this._orderObject.Id;
this._orderObject.Items.Add(this._orderItem);
this._orderItem = null;
}
#endregion
#region private LoadingViceScreen 加载副屏
/// <summary>
/// 加载副屏
/// </summary>
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 功能名称转换授权编码
/// <summary>
/// 功能名称转换授权编码
/// </summary>
/// <param name="permissionName"></param>
/// <returns></returns>
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 限制最大金额
/// <summary>
/// 限制最大金额
/// </summary>
/// <param name="_orderItem"></param>
/// <returns></returns>
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 支付回掉
/// <summary>
/// 异步通知方法
/// </summary>
/// <param name="_orderObject"></param>
/// <param name="_paymodel"></param>
/// <param name="_payCode"></param>
/// <param name="message"></param>
/// <param name="_QueryQuantity"></param>
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<OrderObject>(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<decimal, decimal> _ktas = new Dictionary<decimal, decimal>();
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<decimal, decimal> _ktas = new Dictionary<decimal, decimal>();
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<OrderItem>(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<decimal, decimal> _ktas = new Dictionary<decimal, decimal>();
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<decimal, decimal> _ktas = new Dictionary<decimal, decimal>();
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<PromotionItem>());
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<PromotionItem>();
}
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<OrderObject>();
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
}
}