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#

9 months ago
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
}
}