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.

4565 lines
196 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 NLog;
using POSV.Card;
using POSV.Dianping;
using POSV.Entity;
using POSV.Entity.Pormotion;
using POSV.Helper;
using POSV.MessageEvent;
using POSV.StoreBusiness;
using POSV.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace POSV.ShoppingCart
{
/// <summary>
/// 订单业务运算工具类
/// </summary>
public class BusinessUtils
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object _lock = new object();
private static BusinessUtils _instance = null;
public static BusinessUtils Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
_instance = new BusinessUtils();
}
}
return _instance;
}
}
#region 做法操作集合
private List<ProductMakeType> _makeTypeList = null;
/// <summary>
/// 做法分类集合
/// </summary>
public List<ProductMakeType> GetMakeTypeList
{
get
{
if (_makeTypeList == null)
{
//做法分类数据源
using (var db = Global.Instance.OpenDataBase)
{
this._makeTypeList = db.Query<ProductMakeType>().OrderBy(x => x.SeqNo).ToList();
}
if (this._makeTypeList == null)
{
this._makeTypeList = new List<ProductMakeType>();
}
}
return this._makeTypeList;
}
}
/// <summary>
/// 根据做法类型ID获取做法类型对象
/// </summary>
/// <param name="typeId"></param>
public ProductMakeType GetMakeTypeById(string typeId)
{
return GetMakeTypeList.Find(x => x.Id == typeId);
}
private List<ProductMakeDetail> _makeDetailList = null;
/// <summary>
/// 获取公共做法
/// </summary>
/// <returns></returns>
public List<ProductMakeDetail> GetCommonMakes()
{
try
{
if (_makeDetailList == null)
{
using (var db = Global.Instance.OpenDataBase)
{
_makeDetailList = db.Query<ProductMakeDetail>().ToList();
}
}
}
catch (Exception ex)
{
logger.Error(ex, "获取公有做法异常");
}
if (_makeDetailList == null)
{
_makeDetailList = new List<ProductMakeDetail>();
}
return _makeDetailList;
}
/// <summary>
/// 根据商品ID获取商品所有做法包含私有做法
/// </summary>
/// <param name="productId"></param>
/// <returns></returns>
public List<ProductMakeDetail> GetMakesByProductId(string productId)
{
var commonMakes = GetCommonMakes();
List<ProductMakeDetail> makeDetailList = new List<ProductMakeDetail>();
makeDetailList.AddRange(commonMakes);
try
{
//做法数据源
List<ProductMakeDetailPrivate> makeDetailPrivateList = null;
using (var db = Global.Instance.OpenDataBase)
{
makeDetailPrivateList = db.Query<ProductMakeDetailPrivate>("where productId = @0", productId).ToList();
}
foreach (var pri in makeDetailPrivateList)
{
var isExist = makeDetailList.Exists(x => x.Id == pri.MakeId);
//不存在,做法列表增加私有做法
if (!isExist)
{
ProductMakeDetail detail = new ProductMakeDetail();
detail.Id = pri.MakeId;
detail.Memo = pri.Memo;
detail.No = pri.No;
detail.Spell = pri.Spell;
detail.TypeId = pri.TypeId;
detail.AddPrice = pri.AddPrice;
detail.QtyFlag = pri.QtyFlag;
detail.OrderNo = pri.OrderNo;
detail.Color = pri.Color;
detail.Ext1 = pri.Ext1;
detail.Ext2 = pri.Ext2;
detail.Ext3 = pri.Ext3;
makeDetailList.Add(detail);
}
}
makeDetailList = makeDetailList.OrderBy(x => x.OrderNo).ToList();
}
catch (Exception ex)
{
logger.Error(ex, "获取商品所有做法异常");
}
if (makeDetailList == null)
{
makeDetailList = new List<ProductMakeDetail>();
}
return makeDetailList;
}
#endregion
/// <summary>
/// 初始化收银员权限
/// </summary>
public void InitPermission()
{
List<WorkerRole> roles = null;
StoreInfo store = null;
using (var db = Global.Instance.OpenDataBase)
{
string sql = string.Format("select [id],[tenantId],[storeId],[workerId],[roleId],[discount],[free],[ext1],[ext2],[ext3],[createUser],[createDate],[modifyUser],[modifyDate] from [pos_worker_role] where [workerId] ='{0}';", Global.Instance.Worker.Id);
roles = db.Fetch<WorkerRole>(sql);
//门店信息不能用员工表中storeId
store = db.FirstOrDefault<StoreInfo>("where id = @0", Global.Instance.Authc.StoreId);
}
//收银员归属门店信息
Global.Instance.Worker.StoreInfo = store;
if (roles != null && roles.Count > 0)
{
Global.Instance.Worker.MaxDiscountRate = roles.Min(x => x.Discount);
Global.Instance.Worker.MaxFreeAmount = roles.Max(x => x.Free);
}
else
{
//参数设置有问题,系统默认不打折
Global.Instance.Worker.MaxDiscountRate = 100;
Global.Instance.Worker.MaxFreeAmount = 0;
}
logger.Info("收银员{0},最大折扣{1},最大免单{2}", Global.Instance.Worker.No, Global.Instance.Worker.MaxDiscountRate, Global.Instance.Worker.MaxFreeAmount);
var permission = new List<string>();
//lock (Global.Instance.SyncLock)
//{
using (var db = Global.Instance.OpenDataBase)
{
string sql = string.Format("select [id] ,[tenantId] ,[storeId] ,[moduleNo] ,[createUser] ,[createDate] ,[modifyUser] ,[modifyDate] from [pos_worker_permissions] where workerId = '{0}';", Global.Instance.Worker.Id);
var lists = db.Fetch<WorkerPermissions>(sql);
if (lists != null && lists.Count > 0)
{
permission = lists.ConvertAll(x => x.ModuleNo);
}
}
//}
Global.Instance.Worker.Permission = permission;
logger.Info("收银员{0},权限{1}", Global.Instance.Worker.No, JsonUtils.Serialize(Global.Instance.Worker.Permission));
//加载门店营业方案
BusinessPlan businessPlan = null;
using (var db = Global.Instance.OpenDataBase)
{
businessPlan = db.FirstOrDefault<BusinessPlan>("where 1=1");
}
if (businessPlan == null)
{
businessPlan = new BusinessPlan();
businessPlan.StartType = 0;
businessPlan.StartTime = "00:00";
businessPlan.EndType = 1;
businessPlan.EndTime = "00:00";
}
Global.Instance.BusinessPlan = businessPlan;
logger.Info("门店营业方案:<{0}>{1}-<{2}>{3}", businessPlan.StartType, businessPlan.StartTime, businessPlan.EndType, businessPlan.EndTime);
}
/// <summary>
/// 获取指定收银员权限
/// </summary>
/// <param name="worker">收银员</param>
/// <returns>MaxDiscountRate、MaxFreeAmount、List<string>、Worker</returns>
public Tuple<decimal, decimal, List<string>, Worker> GetPermission(Worker worker)
{
//最大折扣
decimal maxDiscountRate = 100;
//最高免单
decimal maxFreeAmount = 0;
//权限模块
var permission = new List<string>();
if (worker == null)
{
decimal _maxDiscountRate = (maxDiscountRate / Convert.ToDecimal(100.0));
decimal.TryParse(_maxDiscountRate.ToString("0.##"), out _maxDiscountRate);
new Tuple<decimal, decimal, List<string>, Worker>(_maxDiscountRate, maxFreeAmount, permission, worker);
}
List<WorkerRole> roles = new List<WorkerRole>();
using (var db = Global.Instance.OpenDataBase)
{
string sql = string.Format("select [id],[tenantId],[storeId],[workerId],[roleId],[discount],[free],[ext1],[ext2],[ext3],[createUser],[createDate],[modifyUser],[modifyDate] from [pos_worker_role] where [workerId] ='{0}';", worker.Id);
roles = db.Fetch<WorkerRole>(sql);
sql = string.Format("select [id] ,[tenantId] ,[storeId] ,[moduleNo] ,[createUser] ,[createDate] ,[modifyUser] ,[modifyDate] from [pos_worker_permissions] where workerId = '{0}';", worker.Id);
var lists = db.Fetch<WorkerPermissions>(sql);
if (lists != null && lists.Count > 0)
{
permission = lists.ConvertAll(x => x.ModuleNo);
}
}
if (roles != null && roles.Count > 0)
{
maxDiscountRate = roles.Min(x => x.Discount);
maxFreeAmount = roles.Max(x => x.Free);
}
else
{
//参数设置有问题,系统默认不打折
maxDiscountRate = 100;
maxFreeAmount = 0;
}
decimal v = (maxDiscountRate / Convert.ToDecimal(100.0));
decimal.TryParse(v.ToString("0.##"), out v);
logger.Info("收银员<{0}>,最大折扣<{1}>,最大免单<{2}>,权限<{3}>", worker.No, v, maxFreeAmount, JsonUtils.Serialize(permission));
return new Tuple<decimal, decimal, List<string>, Worker>(v, maxFreeAmount, permission, worker);
}
/// <summary>
/// 新开班次
/// </summary>
public void WorkerLogin()
{
try
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select id,tenantId,status,storeId,storeNo,workerId,workerNo,planId,name,starTime, ");
sqlBuld.Append(" endTime,posNo,loginTime,shiftTime,isLogin,no,workerName,imprest from pos_business_plan_log ");
sqlBuld.Append(" where status = 0 and storeId = '{0}' and workerId ='{1}' and posNo = '{2}'; ");
string sql = string.Format(sqlBuld.ToString(), Global.Instance.Authc.StoreId, Global.Instance.Worker.Id, Global.Instance.Authc.PosNo);
var businessPlanLog = db.FirstOrDefault<BusinessPlanLog>(sql);
if (businessPlanLog != null)
{
Global.Instance.BusinessPlanLog = businessPlanLog;
}
else
{
string shiftNo = OrderUtils.Instance.GenerateBatchNo();
businessPlanLog = new BusinessPlanLog();
businessPlanLog.Id = IdWorkerUtils.Instance.NextId();
businessPlanLog.TenantId = Global.Instance.Authc.TenantId;
businessPlanLog.Status = 0;
businessPlanLog.StoreId = Global.Instance.Authc.StoreId;
businessPlanLog.StoreNo = Global.Instance.Authc.StoreNo;
businessPlanLog.WorkerId = Global.Instance.Worker.Id;
businessPlanLog.WorkerNo = Global.Instance.Worker.No;
businessPlanLog.PlanId = "";
businessPlanLog.Name = "默认班次";
businessPlanLog.StarTime = "";
businessPlanLog.EndTime = "";
businessPlanLog.PosNo = Global.Instance.Authc.PosNo;
businessPlanLog.LoginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
businessPlanLog.ShiftTime = null;
businessPlanLog.IsLogin = 1;
businessPlanLog.No = shiftNo;
businessPlanLog.WorkerName = Global.Instance.Worker.Name;
businessPlanLog.Imprest = 0.00M;
// 没有数据的话新建数据
db.Save(businessPlanLog);
Global.Instance.BusinessPlanLog = businessPlanLog;
}
}
}
}
catch (Exception ex)
{
logger.Error(ex, "处理登录班次异常");
}
}
/// <summary>
/// 建立新的订单项
/// </summary>
/// <param name="orderObject"></param>
/// <param name="product"></param>
/// <returns></returns>
public OrderItem NewOrderItem(OrderObject orderObject, ProductExt product, OrderRowState rowState = OrderRowState.None)
{
var row = new OrderItem();
//系统主键
row.Id = IdWorkerUtils.Instance.NextId();
//租户编码
row.TenantId = Global.Instance.Authc.TenantId;
//订单ID
row.OrderId = orderObject.Id;
//订单编号
row.TradeNo = orderObject.TradeNo;
//行序号,随着行的增加或删除改变
row.OrderNo = orderObject.OrderCount + 1;
//售价
row.SalePrice = product.Price;
//单品最低售价
row.MinPrice = product.MinPrice;
//会员价
row.MemberPrice = product.MemberPrice;
//会员价(原)
row.MemberSalePrice = product.MemberPrice;
//批发价
row.DispatchPrice = product.DispatchPrice;
//第三方价
row.OtherPrice = product.OtherPrice;
//默认情况下零售价和售价一样零售价主要解决前台售价为0的商品需要录入的售价
row.Price = product.Price;
//默认情况下,折后单价和零售价一样
row.DiscountPrice = row.Price;
//商品ID
row.ProductId = product.Id;
//商品编号
row.ProductNo = product.No;
//单品名称
row.Name = product.Name;
//单品简称
row.ShortName = product.ShortName;
//规格ID
row.SpecId = product.SpecId;
//规格名称
row.SpecName = product.SpecName;
//品类ID
row.TypeId = product.TypeId;
//品类名称
row.TypeName = product.TypeName;
//商品单位ID
row.ProductUnitId = product.UnitId;
//商品单位名称
row.ProductUnitName = product.UnitName;
//厨打标识
row.Chuda = product.Chuda;
row.ChudaFlag = product.ChudaFlag;
row.ChudaQty = 0;
//出品标识
row.Chupin = product.Chupin;
row.ChupinFlag = product.ChupinFlag;
row.ChupinQty = 0;
//厨打标签标识
row.ChuDaLabel = product.ChuDaLabel;
row.ChuDaLabelFlag = product.ChuDaLabelFlag;
row.ChuDaLabelQty = 0;
var KDSLists = Global.KdsPlan._kdsPlanList;
if (product.KdsFlag == 1 && (product.Chuxian == null || "".Equals(product.Chuxian)) && KDSLists.Count > 0)
{
KdsPlan kdsPlan = KDSLists[0];
//厨显标识
row.Chuxian = kdsPlan.Id;
row.ChuxianFlag = "1";
row.ChuxianQty = 0;
row.ChuxianTime = 5;
}
else
{
//厨显标识
row.Chuxian = product.Chuxian;
row.ChuxianFlag = product.ChuxianFlag;
row.ChuxianQty = 0;
row.ChuxianTime = product.ChuxianTime;
}
if (product.KdsFlag == 1 && (product.Chuxian == null || "".Equals(product.Chuxian)) && KDSLists.Count > 0)
{
KdsPlan kdsPlan = KDSLists[0];
//厨显标识
row.KdsChupin = kdsPlan.Id;
row.KdsChupinFlag = "1";
row.KdsChupinQty = 0;
row.KdsChupinTime = 5;
}
else
{
//KDS出品标识
row.KdsChupin = product.KdsChupin;
row.KdsChupinFlag = product.KdsChupinFlag;
row.KdsChupinQty = 0;
row.KdsChupinTime = product.KdsChupinTime;
}
//是否可折扣
row.DiscountFlag = product.DiscountFlag;
//是否可议价
row.CurrentFlag = product.CurrentFlag;
//是否主食
row.TapleFlag = product.TapleFlag;
//是否称重
row.WeighFlag = product.WeighFlag;
//打印标签
row.LabelPrintFlag = product.LabelPrintFlag;
row.LabelQty = 0;
//会员折上折
row.MebDiscountFlag = product.MebDiscountFlag;
//允许赠送
row.GiveFlag = product.GiveFlag;
//是否管理库存
row.StockFlag = product.StockFlag;
//允许促销
row.PromotionFlag = product.PromotionFlag;
if (rowState == OrderRowState.None)
{
//是否为套餐
if (product.SuitFlag == 1)
{
row.RowState = OrderRowState.;
}
else
{
row.RowState = OrderRowState.;
}
}
else
{
row.RowState = rowState;
}
//单品优惠列表
row.Promotions = new List<PromotionItem>();
//单品做法口味
row.Flavors = new List<FlavorItem>();
//对应的商品信息
row.ProductExt = product;
return row;
}
/// <summary>
/// 离线支付,顾客扫静态付款码
/// </summary>
public Tuple<bool, string> OfflinePay(OrderObject orderObject, decimal inputMoney)
{
logger.Info("操作离线支付");
//计算抹零金额
decimal malingAmount = OrderUtils.MalingAmount(orderObject.ReceivableAmount, null);
//将抹零金额记入主单对象
orderObject.MalingAmount = malingAmount;
//计算实际应收的金额,扣除抹零
orderObject.PaidAmount = orderObject.ReceivableAmount - orderObject.MalingAmount;
var offlinePayMode = OrderUtils.GetOfflinePayMode();
if (offlinePayMode == null)
{
return new Tuple<bool, string>(false, "门店未绑定离线支付收银方式");
}
//构建离线支付方式
PayItem item = OrderUtils.ToPayItem(offlinePayMode);
//订单ID
item.OrderId = orderObject.Id;
//收银票号
item.TradeNo = orderObject.TradeNo;
//实收金额
item.Amount = orderObject.PaidAmount;
//操作员输入的金额
item.PaidAmount = inputMoney;
//找零金额
item.ChangeAmount = 0;
item.CardNo = "";
item.Memo = "离线支付";
item.Status = (int)OrderPaymentStatus.;
item.StatusDesc = "离线支付结账";
item.PayTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//将支付方式压入整单支付明细中
orderObject.Pays.Add(item);
//确认订单数据是否满足结账逻辑:消费金额 = 实收金额 + 优惠金额 + 抹零金额
if (orderObject.Amount == orderObject.PaidAmount + orderObject.DiscountAmount + orderObject.MalingAmount)
{
//抹零记入支付方式
var malingResult = this.BuilderMalingPayMode(orderObject);
if (!malingResult.Item1)
{
return new Tuple<bool, string>(false, malingResult.Item2);
}
//客显
GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Change, orderObject.ChangeAmount.ToString("f2"));
//支付方式分摊
this.BuilderItemPayShared(orderObject);
//整单状态
orderObject.OrderStatus = OrderStatus.;
//整单支付状态
orderObject.PaymentStatus = OrderPaymentStatus.;
var isException = OrderUtils.Instance.SaveOrderObject(orderObject);
if (!isException)
{
logger.Info("开始打印");
orderObject.PrintType = 0;
orderObject.RPrint = false;
//开始打印
PrintHelper.PrintOrderObject(orderObject);
logger.Info("本单交易完成");
return new Tuple<bool, string>(true, "本单交易完成");
}
else
{
return new Tuple<bool, string>(false, "订单保存异常,请联系管理人员!");
}
}
else
{
//清理掉上面压入到支付方式明细中的item,避免收银员多次点击快速收银造成数据重复
orderObject.Pays.Remove(item);
return new Tuple<bool, string>(false, "结账条件不满足");
}
}
/// <summary>
/// 现金结账
/// </summary>
public Tuple<bool, string> QuickPay(OrderObject orderObject, decimal inputMoney)
{
logger.Info("操作现金结账");
//计算抹零金额
decimal malingAmount = OrderUtils.MalingAmount(orderObject.ReceivableAmount, null);
//将抹零金额记入主单对象
orderObject.MalingAmount = malingAmount;
//计算实际应收的金额,扣除抹零
orderObject.PaidAmount = orderObject.ReceivableAmount - orderObject.MalingAmount;
//实收金额,已经扣除抹零
decimal paidAmount = orderObject.PaidAmount;
//找零金额
decimal changeAmount = inputMoney <= paidAmount ? 0 : (inputMoney - paidAmount);
//前台收银找零不允许超过100元
bool notAllowMoreOneHundred = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_MORE_ONE_HUNDRED);
if (notAllowMoreOneHundred && changeAmount > 100)
{
return new Tuple<bool, string>(false, "找零不允许超过100元");
}
//输入是否满足条件:实收金额 = 输入金额 - 找零金额
bool isVerify = (paidAmount == (inputMoney - changeAmount));
if (isVerify)
{
logger.Info("满足条件现金结账条件");
var cashPayMode = OrderUtils.GetDefaultPayMode();
//构建现金支付方式
PayItem item = OrderUtils.ToPayItem(cashPayMode);
//订单ID
item.OrderId = orderObject.Id;
//收银票号
item.TradeNo = orderObject.TradeNo;
//实收金额
item.Amount = paidAmount;
//操作员输入的金额
item.PaidAmount = inputMoney;
//找零金额
item.ChangeAmount = changeAmount;
item.CardNo = "";
item.Memo = "快速结账";
item.Status = (int)OrderPaymentStatus.;
item.StatusDesc = "现金快速结账";
item.PayTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//将支付方式压入整单支付明细中
orderObject.Pays.Add(item);
//确认订单数据是否满足结账逻辑:消费金额 = 实收金额 + 优惠金额 + 抹零金额
if (orderObject.Amount == orderObject.PaidAmount + orderObject.DiscountAmount + orderObject.MalingAmount)
{
//抹零记入支付方式
var malingResult = this.BuilderMalingPayMode(orderObject);
if (!malingResult.Item1)
{
return new Tuple<bool, string>(false, malingResult.Item2);
}
//会员积分充值
if (orderObject.IsMember == 1)
{
var result = BusinessUtils.Instance.AddCardPoint4Order(orderObject);
if (!result.Item1)
{
return new Tuple<bool, string>(false, result.Item2);
}
}
//核销实体券
var storeCouponResult = ConsumeStoreCoupon(orderObject);
if (!storeCouponResult.Item1)
{
return new Tuple<bool, string>(false, storeCouponResult.Item2);
}
//核销卡券
var couponResult = ConsumeElecCoupon(orderObject);
if (!couponResult.Item1)
{
return new Tuple<bool, string>(false, couponResult.Item2);
}
//美团券核销
var meituanCouponResult = MeituanCouponConsume(orderObject);
if (!meituanCouponResult.Item1)
{
return new Tuple<bool, string>(false, "美团券核销:" + meituanCouponResult.Item2);
}
//客显
GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Change, orderObject.ChangeAmount.ToString("f2"));
//支付方式分摊
this.BuilderItemPayShared(orderObject);
//整单状态
orderObject.OrderStatus = OrderStatus.;
//整单支付状态
orderObject.PaymentStatus = OrderPaymentStatus.;
var isException = OrderUtils.Instance.SaveOrderObject(orderObject);
if (!isException)
{
logger.Info("开始打印");
orderObject.PrintType = 0;
orderObject.RPrint = false;
//开始打印
PrintHelper.PrintOrderObject(orderObject);
logger.Info("本单交易完成");
return new Tuple<bool, string>(true, "本单交易完成");
}
else
{
return new Tuple<bool, string>(false, "订单保存异常,请联系管理人员!");
}
}
else
{
//清理掉上面压入到支付方式明细中的item,避免收银员多次点击快速收银造成数据重复
orderObject.Pays.Remove(item);
return new Tuple<bool, string>(false, "结账条件不满足");
}
}
else
{
return new Tuple<bool, string>(false, "不满足结账条件");
}
}
/// <summary>
/// 美团券结账
/// </summary>
public Tuple<bool, string> MeituanCouponPay(string couponCode, OrderObject orderObject)
{
logger.Info("操作美团券结账");
//将抹零金额记入主单对象
orderObject.MalingAmount = 0;
//计算实际应收的金额,扣除抹零
orderObject.PaidAmount = orderObject.ReceivableAmount - orderObject.MalingAmount;
//实收金额
decimal paidAmount = orderObject.PaidAmount;
logger.Info("满足条件现金结账条件");
var meituanPayMode = OrderUtils.GetMeituanPayMode();
//构建现金支付方式
PayItem item = OrderUtils.ToPayItem(meituanPayMode);
//订单ID
item.OrderId = orderObject.Id;
//收银票号
item.TradeNo = orderObject.TradeNo;
//操作员输入的金额
item.PaidAmount = paidAmount;
//实收金额
item.Amount = item.PaidAmount;
//找零金额
item.ChangeAmount = 0;
item.CardNo = "";
item.Memo = "美团券快速结账";
//美团券码
item.TradeVoucherNo = couponCode;
item.Status = (int)OrderPaymentStatus.;
item.StatusDesc = "美团券快速结账";
item.PayTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//将支付方式压入整单支付明细中
orderObject.Pays.Add(item);
//确认订单数据是否满足结账逻辑:消费金额 = 实收金额 + 优惠金额 + 抹零金额
if (orderObject.Amount == orderObject.PaidAmount + orderObject.DiscountAmount + orderObject.MalingAmount)
{
//抹零记入支付方式
var malingResult = this.BuilderMalingPayMode(orderObject);
if (!malingResult.Item1)
{
return new Tuple<bool, string>(false, malingResult.Item2);
}
//美团券核销
var meituanCouponResult = MeituanCouponConsume(orderObject);
if (!meituanCouponResult.Item1)
{
return new Tuple<bool, string>(false, "美团券核销:" + meituanCouponResult.Item2);
}
//客显
GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Change, orderObject.ChangeAmount.ToString("f2"));
//支付方式分摊
this.BuilderItemPayShared(orderObject);
//整单状态
orderObject.OrderStatus = OrderStatus.;
//整单支付状态
orderObject.PaymentStatus = OrderPaymentStatus.;
var isException = OrderUtils.Instance.SaveOrderObject(orderObject);
if (!isException)
{
logger.Info("开始打印");
orderObject.PrintType = 0;
orderObject.RPrint = false;
//开始打印
PrintHelper.PrintOrderObject(orderObject);
logger.Info("本单交易完成");
return new Tuple<bool, string>(true, "本单交易完成");
}
else
{
return new Tuple<bool, string>(false, "订单保存异常,请联系管理人员!");
}
}
else
{
//清理掉上面压入到支付方式明细中的item,避免收银员多次点击快速收银造成数据重复
orderObject.Pays.Remove(item);
return new Tuple<bool, string>(false, "结账条件不满足");
}
}
/// <summary>
/// 电话外卖结账
/// </summary>
public Tuple<bool, string> DeliveryPay(OrderObject orderObject)
{
logger.Info("操作电话外卖挂账");
//计算抹零金额
decimal malingAmount = OrderUtils.MalingAmount(orderObject.ReceivableAmount, null);
//将抹零金额记入主单对象
orderObject.MalingAmount = malingAmount;
//计算实际应收的金额,扣除抹零
orderObject.PaidAmount = orderObject.ReceivableAmount - orderObject.MalingAmount;
var deliveryPayMode = OrderUtils.GetDeliveryPayMode();
if (deliveryPayMode == null)
{
return new Tuple<bool, string>(false, "门店未绑定电话外卖收银方式,请联系管理员绑定");
}
//构建电话外卖支付方式
PayItem item = OrderUtils.ToPayItem(deliveryPayMode);
//订单ID
item.OrderId = orderObject.Id;
//收银票号
item.TradeNo = orderObject.TradeNo;
//实收金额
item.Amount = orderObject.PaidAmount;
//操作员输入的金额
item.PaidAmount = orderObject.PaidAmount;
//找零金额
item.ChangeAmount = 0;
item.CardNo = "";
item.Memo = "电话外卖挂账";
item.Status = (int)OrderPaymentStatus.;
item.StatusDesc = "电话外卖挂账";
item.PayTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//将支付方式压入整单支付明细中
orderObject.Pays.Add(item);
//确认订单数据是否满足结账逻辑:消费金额 = 实收金额 + 优惠金额 + 抹零金额
if (orderObject.Amount == orderObject.PaidAmount + orderObject.DiscountAmount + orderObject.MalingAmount)
{
//抹零记入支付方式
BusinessUtils.Instance.BuilderMalingPayMode(orderObject);
//客显
GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Change, orderObject.ChangeAmount.ToString("f2"));
//电话外卖单
orderObject.OrderType = OrderType.;
//整单状态
orderObject.OrderStatus = OrderStatus.;
//整单支付状态
orderObject.PaymentStatus = OrderPaymentStatus.;
var isException = OrderUtils.Instance.SaveOrderObject(orderObject);
if (!isException)
{
logger.Info("开始打印");
orderObject.PrintType = 0;
orderObject.RPrint = false;
//开始打印
PrintHelper.PrintOrderObject(orderObject);
logger.Info("本单交易完成");
return new Tuple<bool, string>(true, "本单交易完成");
}
else
{
return new Tuple<bool, string>(false, "订单保存异常,请联系管理人员!");
}
}
else
{
//清理掉上面压入到支付方式明细中的item,避免收银员多次点击快速收银造成数据重复
orderObject.Pays.Remove(item);
return new Tuple<bool, string>(false, "结账条件不满足");
}
}
/// <summary>
/// 耗料库存 带lock
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> OrderBurden(OrderObject orderObject)
{
lock (_lock)
{
try
{
using (var db = Global.Instance.OpenDataBase)
{
//8、保存耗料信息
List<OrderProductBurden> orderBurdenList = new List<OrderProductBurden>();
//第一步组装耗料数量
foreach (var item in orderObject.Items)
{
//第一步先看看商品是否是管理库存的直销品
var lists = Global.Product._productList;
var selectProduct = new List<ProductExt>();
selectProduct = lists.FindAll(x => x.Id.Equals(item.ProductId));
if (selectProduct != null && selectProduct.Count > 0)
{
ProductExt productExt = selectProduct[0];
if (productExt.StockFlag == 1)
{
OrderProductBurden orderProductBurden = new OrderProductBurden();
orderProductBurden.OrderId = orderObject.Id;
orderProductBurden.TenantId = orderObject.TenantId;
orderProductBurden.TradeNo = orderObject.TradeNo;
orderProductBurden.BurdenProductId = item.ProductId;
orderProductBurden.BurdenSpecId = item.SpecId;
orderProductBurden.SalesUnitId = item.ProductUnitId;
orderProductBurden.SalesAmount = item.Quantity - item.RefundQuantity;
orderBurdenList.Add(orderProductBurden);
}
}
//第二步获取门店耗料
StringBuilder sqlBuf = new StringBuilder();
sqlBuf.Append("select burdenProductId,burdenSpecId,salesUnitId,salesAmount from pos_product_burden where productId='{0}' and specId='{1}'");
string productBurdenSql = string.Format(sqlBuf.ToString(), item.ProductId, item.SpecId);
List<ProductBurden> productBurdenList = db.Query<ProductBurden>(productBurdenSql).ToList();
if (productBurdenList != null && productBurdenList.Count > 0)
{
foreach (ProductBurden productBurden in productBurdenList)
{
OrderProductBurden orderProductBurden = new OrderProductBurden();
orderProductBurden.OrderId = orderObject.Id;
orderProductBurden.TenantId = orderObject.TenantId;
orderProductBurden.TradeNo = orderObject.TradeNo;
orderProductBurden.BurdenProductId = productBurden.BurdenProductId;
orderProductBurden.BurdenSpecId = productBurden.BurdenSpecId;
orderProductBurden.SalesUnitId = productBurden.SalesUnitId;
orderProductBurden.SalesAmount = productBurden.SalesAmount * (item.Quantity - item.RefundQuantity);
orderBurdenList.Add(orderProductBurden);
}
}
//做法耗料
foreach (var flavorItem in item.Flavors)
{
StringBuilder sqlBuf1 = new StringBuilder();
sqlBuf1.Append("select burdenProductId,burdenSpecId,salesUnitId,salesAmount from pos_make_burden where makeId='{0}'");
string makeBurdenSql = string.Format(sqlBuf1.ToString(), flavorItem.MakeId);
List<MakeBurden> makeBurdenList = db.Query<MakeBurden>(makeBurdenSql).ToList();
if (makeBurdenList != null && makeBurdenList.Count > 0)
{
foreach (MakeBurden makeBurden in makeBurdenList)
{
OrderProductBurden orderProductBurden = new OrderProductBurden();
orderProductBurden.OrderId = orderObject.Id;
orderProductBurden.TenantId = orderObject.TenantId;
orderProductBurden.TradeNo = orderObject.TradeNo;
orderProductBurden.BurdenProductId = makeBurden.BurdenProductId;
orderProductBurden.BurdenSpecId = makeBurden.BurdenSpecId;
orderProductBurden.SalesUnitId = makeBurden.SalesUnitId;
orderProductBurden.SalesAmount = makeBurden.SalesAmount * (flavorItem.Quantity - flavorItem.RefundQuantity);
orderBurdenList.Add(orderProductBurden);
}
}
}
}
//第二部合并耗料数量
if (orderBurdenList != null && orderBurdenList.Count > 0)
{
List<OrderProductBurden> temList = orderBurdenList.OrderBy(x => x.BurdenSpecId).ToList();
Dictionary<string, Object> typeMap = new Dictionary<string, Object>();
string burdenProductId_temp = "";
string burdenSpecId_temp = "";
string salesUnitId_temp = "";
int i = 0;
List<Dictionary<string, Object>> result = new List<Dictionary<string, Object>>();
decimal salesAmount = 0.00M;
int listLength = temList.Count;
foreach (OrderProductBurden orderProductBurden in temList)
{
string burdenSpecId = orderProductBurden.BurdenSpecId;
if (!burdenSpecId_temp.Equals(burdenSpecId))
{
if (i != 0)
{
typeMap.Add("orderId", orderProductBurden.OrderId);
typeMap.Add("tenantId", orderProductBurden.TenantId);
typeMap.Add("tradeNo", orderProductBurden.TradeNo);
typeMap.Add("burdenProductId", burdenProductId_temp);
typeMap.Add("burdenSpecId", burdenSpecId_temp);
typeMap.Add("salesUnitId", salesUnitId_temp);
typeMap.Add("salesAmount", salesAmount);
result.Add(typeMap);
//分类改变时,清除缓存
typeMap = new Dictionary<string, Object>();
}
salesAmount = 0.00M;
burdenProductId_temp = orderProductBurden.BurdenProductId;
burdenSpecId_temp = orderProductBurden.BurdenSpecId;
salesUnitId_temp = orderProductBurden.SalesUnitId;
}
salesAmount = salesAmount + orderProductBurden.SalesAmount;
i = i + 1;
if (i == listLength)
{
typeMap.Add("orderId", orderProductBurden.OrderId);
typeMap.Add("tenantId", orderProductBurden.TenantId);
typeMap.Add("tradeNo", orderProductBurden.TradeNo);
typeMap.Add("burdenProductId", burdenProductId_temp);
typeMap.Add("burdenSpecId", burdenSpecId_temp);
typeMap.Add("salesUnitId", salesUnitId_temp);
typeMap.Add("salesAmount", salesAmount);
result.Add(typeMap);
//分类改变时,清除缓存
typeMap = new Dictionary<string, Object>();
}
}
List<OrderProductBurden> list = new List<OrderProductBurden>();
foreach (Dictionary<string, Object> map in result)
{
OrderProductBurden entity = new OrderProductBurden();
entity.Id = IdWorkerUtils.Instance.NextId();
entity.StoreId = orderObject.StoreId;
entity.OrderId = StringUtils.GetString(map["orderId"]);
entity.TenantId = StringUtils.GetString(map["tenantId"]);
entity.TradeNo = StringUtils.GetString(map["tradeNo"]);
entity.BurdenProductId = StringUtils.GetString(map["burdenProductId"]);
entity.BurdenSpecId = StringUtils.GetString(map["burdenSpecId"]);
entity.SalesUnitId = StringUtils.GetString(map["salesUnitId"]);
entity.SalesAmount = StringUtils.GetDecimal(map["salesAmount"]);
list.Add(entity);
}
db.InsertBatch<OrderProductBurden>(list);
}
}
return new Tuple<bool, string>(true, "");
}
catch (Exception ex)
{
logger.Info("添加耗料数据异常单号ID" + orderObject.Id + "\t 异常信息:" + ex.Message);
return new Tuple<bool, string>(false, ex.Message);
}
}
}
/// <summary>
/// 收银台完成结账通知处理
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> OrderFinished(OrderObject orderObject)
{
//核销实体券
var storeCouponResult = ConsumeStoreCoupon(orderObject);
if (!storeCouponResult.Item1)
{
return new Tuple<bool, string>(false, storeCouponResult.Item2);
}
//核销卡券
var couponResult = ConsumeElecCoupon(orderObject);
if (!couponResult.Item1)
{
return new Tuple<bool, string>(false, couponResult.Item2);
}
//客显
GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Change, orderObject.ChangeAmount.ToString("f2"));
//抹零附加记入支付方式
this.BuilderMalingPayMode(orderObject);
//支付方式分摊
this.BuilderItemPayShared(orderObject);
//整单状态
orderObject.OrderStatus = OrderStatus.;
//整单支付状态
orderObject.PaymentStatus = OrderPaymentStatus.;
var isException = OrderUtils.Instance.SaveOrderObject(orderObject);
if (!isException)
{
logger.Info("开始打印");
orderObject.PrintType = 0;
orderObject.RPrint = false;
//开始打印
PrintHelper.PrintOrderObject(orderObject);
logger.Info("本单交易完成");
return new Tuple<bool, string>(true, "本单交易完成");
}
else
{
return new Tuple<bool, string>(false, "订单保存异常,请联系管理人员!");
}
}
/// <summary>
/// 创建抹零支付方式
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> BuilderMalingPayMode(OrderObject orderObject)
{
//将抹零记入支付方式列表
if (orderObject.MalingAmount != 0)
{
var malingPayMode = OrderUtils.GetMalingPayMode();
if (malingPayMode == null)
{
return new Tuple<bool, string>(false, "云端未配置抹零支付方式");
}
//构建抹零支付方式
PayItem maling = OrderUtils.ToPayItem(malingPayMode);
maling.OrderId = orderObject.Id;
maling.TradeNo = orderObject.TradeNo;
//抹零金额
maling.Amount = orderObject.MalingAmount;
//实收金额
maling.PaidAmount = orderObject.MalingAmount;
//找零金额
maling.ChangeAmount = 0;
maling.CardNo = "";
maling.Memo = "抹零";
maling.Status = (int)OrderPaymentStatus.;
maling.StatusDesc = "抹零";
maling.PayTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//将支付方式压入整单支付明细中
orderObject.Pays.Add(maling);
}
return new Tuple<bool, string>(true, "处理成功");
}
/// <summary>
/// 构建订单明细支付方式分摊
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> BuilderItemPayShared(OrderObject orderObject)
{
var result = new Tuple<bool, string>(false, "初始错误");
try
{
//找到未分摊的支付方式
var waitSharedPay = orderObject.Pays.FindAll(x => !orderObject.Items.Exists(y => y.ItemPayList != null && y.ItemPayList.Exists(z => z.PayId == x.Id)));
if (waitSharedPay != null && waitSharedPay.Count > 0)
{
foreach (var pay in waitSharedPay)
{
//本次分摊总额
#region 20231213 subin 修改待分摊金额由原先的实收金额改为实收-找零金额
//var waitSharedAmount = pay.PaidAmount;
var waitSharedAmount = pay.PaidAmount - pay.ChangeAmount;
#endregion
//已分摊金额
var alreadyShared = decimal.Zero;
//商品可参与分摊剩余总额(应收-已分摊)
var fineItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.TotalReceivableAmount != decimal.Zero);
var allItemFineAmount = fineItems.Sum(x => x.TotalReceivableAmount - (x.ItemPayList != null ? x.ItemPayList.Sum(y => y.ShareAmount) : decimal.Zero));
int i = 0;
foreach (var item in fineItems)
{
i++;
decimal share = decimal.Zero;
//本商品剩余可分摊的余额
var itemFineAmount = item.TotalReceivableAmount - (item.ItemPayList != null ? item.ItemPayList.Sum(x => x.ShareAmount) : decimal.Zero);
if (i >= fineItems.Count)
{
//最后一个用减法
share = waitSharedAmount - alreadyShared;
}
else
{
//排除整单全赠送的情况
if (allItemFineAmount != 0M)
{
var rate = itemFineAmount / allItemFineAmount;
share = DecimalUtils.ToRound(waitSharedAmount * rate, 2);
}
else
{
share = 0M;
}
}
if (share == 0M)
{
//此商品不分摊,可能是已经分摊的和应收一样了,也就是分摊够了
continue;
}
//计算支付方式分摊
OrderItemPay itemPay = new OrderItemPay()
{
Id = IdWorkerUtils.Instance.NextId(),
TenantId = pay.TenantId,
OrderId = pay.OrderId,
TradeNo = pay.TradeNo,
PayId = pay.Id,
ItemId = item.Id,
No = pay.No,
Name = pay.Name,
ProductId = item.ProductId,
SpecId = item.SpecId,
ShareAmount = share,
ShareCouponLeastCost = decimal.Zero,
RefundAmount = decimal.Zero
};
if (item.ItemPayList == null)
{
item.ItemPayList = new List<OrderItemPay>();
}
item.ItemPayList.Add(itemPay);
alreadyShared += share;
}
}
}
result = new Tuple<bool, string>(true, "分摊完成");
}
catch (Exception ex)
{
result = new Tuple<bool, string>(false, "支付方式分摊发生异常");
logger.Error(ex, "支付方式分摊异常");
Task.Factory.StartNew(() =>
{
Global.Instance.BugReport(ex, "支付方式分摊异常");
});
}
return result;
}
/// <summary>
/// 创建新订单对象
/// </summary>
/// <returns></returns>
public OrderObject NewOrderObject()
{
var orderObject = new OrderObject();
//订单ID
orderObject.Id = IdWorkerUtils.Instance.NextId();
//订单内部ID
orderObject.ObjectId = ObjectId.GenerateNewStringId();
//门店ID
orderObject.StoreId = Global.Instance.Authc.StoreId;
//门店编码
orderObject.StoreNo = Global.Instance.Authc.StoreNo;
//门店名称
orderObject.StoreName = Global.Instance.Worker.StoreInfo?.Name;
//操作员工号
orderObject.WorkerNo = Global.Instance.Worker.No;
//操作员名称
orderObject.WorkerName = Global.Instance.Worker.Name;
//POS编号
orderObject.PosNo = Global.Instance.Authc.PosNo;
//租户ID
orderObject.TenantId = Global.Instance.Authc.TenantId;
//订单销售时间
orderObject.SaleDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//支付明细
orderObject.Pays = new List<PayItem>();
//整单享受的优惠列表
orderObject.Promotions = new List<PromotionOrder>();
//MAC地址
string macAddress = (DeviceUtils.Instance.MacAddress != null ? DeviceUtils.Instance.MacAddress : "").Trim();
logger.Info("mac地址:" + macAddress);
orderObject.MacAddress = string.IsNullOrEmpty(macAddress) ? "" : (macAddress.Length > 32 ? macAddress.Substring(0, 25) : macAddress);
//本地IP地址
orderObject.IpAddress = DeviceUtils.Instance.IPAddress;
//设备名称
orderObject.DeviceName = DeviceUtils.Instance.ComputerName;
//班次名称
orderObject.ShiftName = Global.Instance.BusinessPlanLog.Name;
//班次编号
orderObject.ShiftNo = Global.Instance.BusinessPlanLog.No;
//订单标识为 新建状态
orderObject.OrderStatus = OrderStatus.;
//订单创建时间
orderObject.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//订单创建人
orderObject.CreateUser = Global.Instance.Worker.Name;
string[] day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string weeker = day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString();
//星期
orderObject.Weeker = weeker;
//天气
orderObject.Weather = string.Empty;
//重置刷卡状态
orderObject.Member = null;
//通知副屏
if (Global.Instance.EnableVice)
{
MsgEvent.Send(Constant.VICE_ORDER_NOTIFY, new Tuple<ViceNotifyType, object>(ViceNotifyType.CREATEORDER, orderObject));
}
return orderObject;
}
/// <summary>
/// 构建购物车行
/// </summary>
/// <param name="orderObject"></param>
/// <param name="product"></param>
/// <param name="master"></param>
/// <returns></returns>
public List<OrderItem> BuildGridRow(OrderObject orderObject, ProductExt product, OrderItem master)
{
List<OrderItem> rows = new List<OrderItem>();
//道菜ID
master.SuitId = "";
//道菜基准加价
master.SuitAddPrice = 0;
//道菜基准数量
master.SuitQuantity = 0;
//道菜基准加价后金额
master.SuitAmount = 0;
//主菜默认数量
if (master.Quantity == 0)
{
master.Quantity = 1;
}
//主菜优惠 mod by yangaming 180205 赠送商品
master.Discount = master.DiscountAmount;
//界面行上是否输出下划线
master.Underline = 1;
//如果是套餐,不输出下划线
if (product.SuitFlag == 1)
{
master.Underline = 0;
}
//是否包含做法
master.Flavor = 0;
//当前行的父ID mod by yangaming 180205 赠送商品
//master.ParentId = "";
//当前行组标识
if (string.IsNullOrEmpty(master.Group))
{
master.Group = master.Id;
}
//加料
master.Scheme = "";
//使用会员优惠
//AddMemberPromotion(orderObject, master);
//将当前行记入
rows.Add(master);
//套菜
if (product.SuitFlag == 1)
{
var details = new List<SuitExt>();
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
details = db.Fetch<SuitExt>(string.Format(SqlConstant.SuitExt, product.Id));
}
}
var lists = details.FindAll(x => x.DefaultFlag == 1).ToList();
int inx = 0;
foreach (SuitExt suit in lists)
{
//将当前SuitExt序列化
var _json = JsonUtils.Serialize(suit);
//反序列化为ProductExt对象
var _product = JsonUtils.Deserialize<ProductExt>(_json);
//新建套菜明细
var row = NewOrderItem(orderObject, _product);
//标识为套餐明细
row.RowState = OrderRowState.;
//道菜ID
row.SuitId = suit.SuitId;
//道菜基准数量
row.SuitQuantity = suit.Quantity;
//道菜基准加价
row.SuitAddPrice = suit.AddPrice;
//道菜基准加价 = 主菜数量 * 道菜基准单价
row.SuitAmount = master.Quantity * suit.AddPrice;
//界面-优惠列显示
row.Discount = 0;
//界面-行下划线
row.Underline = (++inx) == lists.Count ? 1 : 0;
//界面-是否有做法
row.Flavor = 0;
//当前行父ID
row.ParentId = master.Id;
//当前行分组
row.Group = master.Group;
//加料
row.Scheme = "";
//道菜数量随主菜数量变化
row.Quantity = master.Quantity * row.SuitQuantity;
rows.Add(row);
}
//套餐价格分摊
PromotionUtils.CalculateSuitShare(orderObject, rows);
}
return rows;
}
/// <summary>
/// 添加会员优惠
/// </summary>
/// <param name="orderObject"></param>
/// <param name="item"></param>
public void AddMemberPromotion(OrderObject orderObject, OrderItem item)
{
//会员价优惠
if (orderObject.IsMember == 1 || orderObject.IsUserMemberPrice)
{
//享受会员优惠的前提是 1、没有整单优惠 2、单品没有享受优惠
bool isGo = true;
if (isGo && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
isGo = false;
}
if (isGo && item.Promotions != null && item.Promotions.Count > 0)
{
if (item.Promotions.Exists(x => x.PromotionType != PromotionType.))
{
//已经存在其他优惠的不能享受会员优惠
isGo = false;
}
}
//验证会员价是否优惠了
if (isGo && item.MemberPrice == item.Price)
{
//会员价不优惠,不添加促销,方便进行其他促销
isGo = false;
}
//会员等级设置禁止享受会员价2020-08-17 Add zhangy
if (isGo && orderObject.IsMember == 1 && orderObject.Member.MemberPriceFlag == 0)
{
isGo = false;
}
//强制使用会员价2020-08-19 Add zhangy
if (orderObject.IsUserMemberPrice)
{
isGo = true;
}
//使用会员卡
//是否存在优惠
if (isGo)
{
//订单不存在优惠
//会员价优惠
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = item.TenantId;
//订单ID
promotion.OrderId = item.OrderId;
//订单编号
promotion.TradeNo = item.TradeNo;
//单品编号
promotion.ItemId = item.Id;
//类型
promotion.PromotionType = PromotionType.;
//折扣率
if (item.Price != 0)
{
promotion.DiscountRate = OrderUtils.ToRound(item.MemberPrice / item.Price);
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(orderObject, item, promotion);
//刷新优惠金额
item.Discount = item.DiscountAmount;
}
}
}
/// <summary>
/// 添加商品优惠券
/// </summary>
/// <param name="orderObject"></param>
/// <param name="item"></param>
public void AddProductCouponPromotion(OrderObject orderObject, OrderItem item, PromotionEntity fineProm)
{
//享受单品优惠的前提是 1、没有整单优惠 2、没有享受过会员价、商品券以外的优惠
bool isGo = true;
if (isGo && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
isGo = false;
}
if (item.Promotions != null && item.Promotions.Count > 0)
{
if (item.Promotions.Exists(x => x.PromotionType != PromotionType. && x.PromotionType != PromotionType.))
{
//已经存在其他优惠的不能享受商品优惠券优惠
isGo = false;
}
}
//如果存在代金券优惠先移除掉原来的代金券
var promotionList = item.Promotions.FindAll(x => x.PromotionType == PromotionType.);
if (promotionList != null)
{
foreach (PromotionItem promotion in promotionList)
{
item.Promotions.Remove(promotion);
}
//重新算折扣价
item.DiscountPrice = OrderUtils.ToRound((item.Amount - item.DiscountAmount) / item.Quantity);
PromotionUtils.UpdateSuitMain(orderObject, item);
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(orderObject, item);
}
//是否存在优惠
if (isGo)
{
//订单不存在优惠
//会员价优惠
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = item.TenantId;
//订单ID
promotion.OrderId = item.OrderId;
//订单编号
promotion.TradeNo = item.TradeNo;
//单品编号
promotion.ItemId = item.Id;
//类型
promotion.PromotionType = PromotionType.;
//优惠金额
if (item.DiscountPrice >= fineProm.DiscountAmount)
{
promotion.DiscountAmount = fineProm.DiscountAmount * item.Quantity;
}
else
{
promotion.DiscountAmount = item.DiscountPrice * item.Quantity;
}
//折扣率
if (item.Price != 0)
{
promotion.DiscountRate = OrderUtils.ToRound(fineProm.DiscountAmount / (item.Price * item.Quantity));
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(orderObject, item, promotion);
//刷新优惠金额
item.Discount = item.DiscountAmount;
}
}
/// <summary>
/// 添加会员等级优惠
/// </summary>
/// <param name="orderObject"></param>
/// <param name="item"></param>
public void AddMemberLevelPromotion(OrderObject orderObject, OrderItem item, PromotionEntity fineProm)
{
//会员等级优惠
if (orderObject.IsMember == 1)
{
//享受会员等级优惠的前提是 1、没有整单优惠 2、单品没有享受优惠
bool isGo = true;
if (isGo && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
isGo = false;
}
if (item.Promotions != null && item.Promotions.Count > 0)
{
if (item.Promotions.Exists(x => x.PromotionType != PromotionType.))
{
//已经存在其他优惠的不能享受会员优惠
isGo = false;
}
}
//验证会员等级不优惠
if (fineProm.DiscountAmount == 0)
{
//会员等级不优惠,不添加促销,方便进行其他促销
isGo = false;
}
//使用会员卡
//是否存在优惠
if (isGo)
{
//订单不存在优惠
//会员价优惠
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = item.TenantId;
//订单ID
promotion.OrderId = item.OrderId;
//订单编号
promotion.TradeNo = item.TradeNo;
//单品编号
promotion.ItemId = item.Id;
//类型
promotion.PromotionType = PromotionType.;
//优惠金额
promotion.DiscountAmount = fineProm.DiscountAmount;
//折扣率
if (item.Price != 0)
{
promotion.DiscountRate = OrderUtils.ToRound(fineProm.DiscountAmount / (item.Price * item.Quantity));
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(orderObject, item, promotion);
//刷新优惠金额
item.Discount = item.DiscountAmount;
}
}
}
/// <summary>
/// 取消会员优惠
/// </summary>
/// <param name="orderObject"></param>
public void RemoveMemberPromotion(OrderObject orderObject)
{
//取消整单会员优惠
if (orderObject.Promotions != null)
{
List<PromotionOrder> promotionList = orderObject.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType.);
if (promotionList != null)
{
foreach (PromotionOrder promotion in promotionList)
{
orderObject.Promotions.Remove(promotion);
}
}
//过滤只有会员才能享受的满减、商品特价等优惠
List<PromotionOrder> proList = new List<PromotionOrder>();
foreach (var prom in orderObject.Promotions)
{
if (!string.IsNullOrEmpty(prom.PlanNo))
{
var res = PromotionEngine.Instance.PromotionTasks.FirstOrDefault(x => x.PromotionSn == prom.PlanNo);
if (res != null && res.IsOnlyMember == 1)
{
proList.Add(prom);
}
}
}
foreach (var rePro in proList)
{
orderObject.Promotions.Remove(rePro);
}
}
//取消单品会员优惠
foreach (var item in orderObject.Items)
{
if (item.Promotions != null)
{
var promotionList = item.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType.);
if (promotionList != null)
{
foreach (PromotionItem promotion in promotionList)
{
item.Promotions.Remove(promotion);
}
}
//过滤只有会员才能享受的满减、商品特价等优惠
List<PromotionItem> proList = new List<PromotionItem>();
foreach (var prom in item.Promotions)
{
if (!string.IsNullOrEmpty(prom.PlanNo))
{
var res = PromotionEngine.Instance.PromotionTasks.FirstOrDefault(x => x.PromotionSn == prom.PlanNo);
if (res != null && res.IsOnlyMember == 1)
{
proList.Add(prom);
}
}
}
foreach (var rePro in proList)
{
item.Promotions.Remove(rePro);
}
}
}
}
/// <summary>
/// 是否包含会员促销
/// </summary>
/// <param name="orderObject"></param>
public bool HavMemberPromotion(OrderObject orderObject)
{
//取消整单会员优惠
if (orderObject.Promotions != null)
{
List<PromotionOrder> promotionList = orderObject.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType.);
if (promotionList != null)
{
return true;
}
}
//取消单品会员优惠
foreach (var item in orderObject.Items)
{
if (item.Promotions != null)
{
var promotionList = item.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType.);
if (promotionList != null)
{
return true;
}
}
}
return false;
}
/// <summary>
/// 取消会员优惠
/// </summary>
/// <param name="orderObject"></param>
public bool HavMemberPromotionCoup(OrderObject orderObject)
{
//取消整单会员优惠
if (orderObject.Promotions != null)
{
List<PromotionOrder> promotionList = orderObject.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType.);
if (promotionList != null && promotionList.Count > 0)
{
return true;
}
}
//取消单品会员优惠
foreach (var item in orderObject.Items)
{
if (item.Promotions != null)
{
var promotionList = item.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType. || x.PromotionType == PromotionType.);
if (promotionList != null && promotionList.Count > 0)
{
return true;
}
}
}
return false;
}
/// <summary>
/// 构建手工做法对象
/// </summary>
/// <param name="orderItem"></param>
/// <param name="name"></param>
/// <returns></returns>
public FlavorItem BuildHandFlavor(OrderItem orderItem, string name)
{
FlavorItem flavor = new FlavorItem();
flavor.Id = IdWorkerUtils.Instance.NextId();
//做法单选或者多选情况下的Key
flavor.Group = flavor.Id;
flavor.TenantId = orderItem.TenantId;
flavor.TradeNo = orderItem.TradeNo;
flavor.OrderId = orderItem.OrderId;
flavor.ItemId = orderItem.Id;
flavor.Name = name;
flavor.MakeId = flavor.Id;
flavor.Code = "000";
flavor.QtyFlag = 1;
flavor.Price = 0.00M;
flavor.Type = 0;
flavor.IsRadio = 1;
flavor.Hand = 1;
//基准数量
flavor.BaseQuantity = 1;
flavor.OrderItemQuantity = orderItem.WeighFlag == 1 ? 1.00M : orderItem.Quantity;
return flavor;
}
#region 食堂版-订单操作前校验
/// <summary>
/// 订单操作前校验
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <param name="keyCode"></param>
/// <returns></returns>
public Tuple<bool, string> STB_MenuOperateValidate(OrderObject orderObject, OrderItem orderItem, string keyData)
{
// 第一步,菜单是否为操作当前订单,不是则放行,是则校验当前订单是否还允许操作
var result = STB_BeforeOrderObjectOperateValidateStep1(orderObject, orderItem, keyData);
return result;
}
/// <summary>
/// 第一步,食堂版校验按钮规则
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <param name="keyCode"></param>
/// <returns></returns>
public Tuple<bool, string> STB_BeforeOrderObjectOperateValidateStep1(OrderObject orderObject, OrderItem orderItem, string keyData)
{
//订单交易完成,系统显示已结账,快速结账禁用
bool result = true;
string message = "校验通过";
//部分功能存在校验特例
switch (keyData)
{
case "上一页":
case "下一页":
case "功能":
case "交班":
case "注销":
case "锁屏":
case "最小化":
case "退出":
{
result = true;
}
break;
default:
{
if (result && orderObject == null)
{
result = false;
message = "请取消订单后重新点单";
}
//订单交易完成,系统显示已结账,快速结账禁用
if (result && ((orderObject.OrderType == OrderType. && orderObject.OrderStatus == OrderStatus.) || orderObject.OrderStatus == OrderStatus.))
{
result = false;
message = "不支持的操作,交易已结账";
}
//是否有点单记录存在
if (result && orderObject.Items.Count == 0)
{
result = false;
message = "请先点单";
}
////是否有选择的商品
//if (result && orderItem == null)
//{
// result = false;
// message = "请选择要操作的商品";
//}
}
break;
}
return new Tuple<bool, string>(result, message);
}
#endregion
#region 订单操作前校验
/// <summary>
/// 订单操作前校验
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <param name="keyCode"></param>
/// <returns></returns>
public Tuple<bool, string> MenuOperateValidate(OrderObject orderObject, OrderItem orderItem, string keyCode)
{
// 第一步,菜单是否为操作当前订单,不是则放行,是则校验当前订单是否还允许操作
var result = BeforeOrderObjectOperateValidateStep1(orderObject, orderItem, keyCode);
if (result.Item1)
{
//第二步,菜单操作是否违反具体业务规则
result = BeforeOrderObjectOperateValidateStep2(orderObject, orderItem, keyCode);
}
return result;
}
/// <summary>
/// 第一步,菜单是否为操作当前订单,不是则放行,是则校验当前订单是否还允许操作
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <param name="keyCode"></param>
/// <returns></returns>
public Tuple<bool, string> BeforeOrderObjectOperateValidateStep1(OrderObject orderObject, OrderItem orderItem, string keyCode)
{
//订单交易完成,系统显示已结账,快速结账禁用
ModuleKeyCode _keyCode = ModuleKeyCode.None;
Enum.TryParse<ModuleKeyCode>(keyCode, out _keyCode);
bool result = true;
string message = "校验通过";
//部分功能存在校验特例
switch (_keyCode)
{
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.://310
case ModuleKeyCode.:
case ModuleKeyCode.://146
case ModuleKeyCode.:
case ModuleKeyCode.QM://307
case ModuleKeyCode.GC://308
case ModuleKeyCode.:
case ModuleKeyCode.饿:
case ModuleKeyCode.:
case ModuleKeyCode.://306
case ModuleKeyCode.://419
case ModuleKeyCode.://401
case ModuleKeyCode.://402
case ModuleKeyCode.://403
case ModuleKeyCode.://404
case ModuleKeyCode.://405
case ModuleKeyCode.退://406
case ModuleKeyCode.://407
case ModuleKeyCode.://408
case ModuleKeyCode.://409
case ModuleKeyCode.://410
case ModuleKeyCode.://411
case ModuleKeyCode.://413
case ModuleKeyCode.://414
case ModuleKeyCode.://414
case ModuleKeyCode.://415
case ModuleKeyCode.://416
case ModuleKeyCode.://417
case ModuleKeyCode.://418
case ModuleKeyCode.://420
case ModuleKeyCode.://421
case ModuleKeyCode.://422
case ModuleKeyCode.://701
case ModuleKeyCode.://702
case ModuleKeyCode.://703
case ModuleKeyCode.://704
case ModuleKeyCode.://705
case ModuleKeyCode.://706
case ModuleKeyCode.://707
case ModuleKeyCode.://708
case ModuleKeyCode.://709
case ModuleKeyCode.://710
case ModuleKeyCode.://711
case ModuleKeyCode.://711
case ModuleKeyCode.://10017
case ModuleKeyCode.://10064
case ModuleKeyCode.://10064
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
{
result = true;
}
break;
default:
{
if (result && orderObject == null)
{
result = false;
message = "请取消订单后重新点单";
}
//订单交易完成,系统显示已结账,快速结账禁用
if (result && ((orderObject.OrderType == OrderType. && orderObject.OrderStatus == OrderStatus.) || orderObject.OrderStatus == OrderStatus.))
{
result = false;
message = "不支持的操作,交易已结账";
}
//是否有点单记录存在
if (result && orderObject.Items.Count == 0)
{
result = false;
message = "请先点单";
}
//是否有选择的商品
if (result && orderItem == null)
{
result = false;
message = "请选择要操作的商品";
}
}
break;
}
return new Tuple<bool, string>(result, message);
}
/// <summary>
/// 第二步,菜单操作是否违反具体业务规则
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <param name="keyCode"></param>
/// <returns></returns>
private Tuple<bool, string> BeforeOrderObjectOperateValidateStep2(OrderObject orderObject, OrderItem orderItem, string keyCode)
{
//订单交易完成,系统显示已结账,快速结账禁用
ModuleKeyCode _keyCode = ModuleKeyCode.None;
Enum.TryParse<ModuleKeyCode>(keyCode, out _keyCode);
bool result = true;
string message = "校验通过";
//部分功能存在校验特例
switch (_keyCode)
{
case ModuleKeyCode.:
{
//禁止单品折扣套餐明细
if (orderItem.RowState == OrderRowState.)
{
result = false;
message = "套餐明细不允许议价操作!";
}
//云端禁止议价
if (result && orderItem.CurrentFlag == 0)
{
result = false;
message = "不支持议价操作!";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
}
break;
case ModuleKeyCode.:
{
//判断是否有不可议价的商品1不可议价2)不是套餐明细
if (orderObject.Items.Count(x => x.CurrentFlag == 0 && x.RowState != OrderRowState.) > 0)
{
result = false;
message = "有不支持议价的商品,请单品议价!";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
}
break;
case ModuleKeyCode.:
{
var notAllowBargain = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_BARGAIN, false);
//禁止收银前台议价
if (result && notAllowBargain)
{
result = false;
message = "禁止收银前台议价!";
}
//禁止单品折扣套餐明细
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "套餐明细不允许议价操作!";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
}
break;
case ModuleKeyCode.:
case ModuleKeyCode.:
{
var notAllowDiscount = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_DISCOUNT, false);
//禁止收银前台折扣
if (result && notAllowDiscount)
{
result = false;
message = "禁止收银前台折扣!";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
if (result && _keyCode == ModuleKeyCode.)
{
//云端禁止折扣
if (orderItem.DiscountFlag == 0)
{
result = false;
message = "不支持折扣操作!";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
//禁止单品折扣套餐明细
if (orderItem.RowState == OrderRowState.)
{
result = false;
message = "套餐明细不允许折扣操作!";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
}
if (result && _keyCode == ModuleKeyCode.)
{
//判断是否有可折扣的商品1可折扣2)不是套餐明细
if (orderObject.Items.Count(x => x.DiscountFlag == 1 && x.RowState != OrderRowState.) == 0)
{
result = false;
message = "没有可折扣的单品!";
}
if (result)
{
foreach (var item in orderObject.Items)
{
//有单品优惠禁止操作
if (item.Promotions != null && item.Promotions.FindAll(x => x.PromotionType != PromotionType.).Count > 0)
{
result = false;
message = "单品享受过优惠,不允许操作";
break;
}
}
}
}
}
break;
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
{
var notAllowDiscount = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_DISCOUNT, false);
//禁止收银前台折扣
if (result && notAllowDiscount)
{
result = false;
message = "禁止收银前台折扣!";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
if (result)
{
switch (_keyCode)
{
case ModuleKeyCode.:
case ModuleKeyCode.:
{
//云端禁止折扣
if (orderItem.DiscountFlag == 0)
{
result = false;
message = "不支持折扣操作!";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
//禁止单品折扣套餐明细
if (orderItem.RowState == OrderRowState.)
{
result = false;
message = "套餐明细不允许折扣操作!";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
}
break;
case ModuleKeyCode.:
case ModuleKeyCode.:
{
//判断是否有可折扣的商品1可折扣2)不是套餐明细
if (orderObject.Items.Count(x => x.DiscountFlag == 1 && x.RowState != OrderRowState.) == 0)
{
result = false;
message = "没有可折扣的单品!";
}
if (result)
{
foreach (var item in orderObject.Items)
{
//有单品优惠禁止操作
if (item.Promotions != null && item.Promotions.FindAll(x => x.PromotionType != PromotionType.).Count > 0)
{
result = false;
message = "单品享受过优惠,不允许操作";
break;
}
}
}
}
break;
}
}
}
break;
case ModuleKeyCode.:
{
var notAllowDiscount = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_DISCOUNT, false);
//禁止收银前台折扣
if (result && notAllowDiscount)
{
result = false;
message = "禁止收银前台折扣!";
}
//禁止单品折扣套餐明细
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "套餐明细不允许折扣操作!";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
}
break;
case ModuleKeyCode.:
case ModuleKeyCode.:
{
var notAllowGive = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_GIVE, false);
//禁止收银前台赠送
if (result && notAllowGive)
{
result = false;
message = "禁止收银前台赠送!";
}
//套餐明细禁止操作
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许赠送套餐明细!";
}
//后台设置不允许赠送
if (result && orderItem.GiveFlag == 0)
{
result = false;
message = "不允许赠送操作";
}
//有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
}
break;
case ModuleKeyCode.:
{
if (result && (orderItem.RowState != OrderRowState. && orderItem.RowState != OrderRowState.))
{
result = false;
message = "不是套餐,不允许操作";
}
//如果有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//if (result && orderItem.RowState == OrderRowState.套餐明)
//{
// //查找套餐主,如果套餐主享受优惠,不允许套餐明细操作
// var master = orderObject.Items.Find(x => x.Id == orderItem.ParentId);
// //有单品优惠禁止操作
// if (result && master.Promotions != null && master.Promotions.Count > 0)
// {
// result = false;
// message = "套餐已优惠,不允许操作";
// }
//}
//else
//{
// //有单品优惠禁止操作
// if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
// {
// result = false;
// message = "享受过优惠,不允许操作";
// }
//}
}
break;
case ModuleKeyCode.:
{
//套餐明细禁止操作
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许调整套餐明细的规格!";
}
//如果有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//单品所属group是否已经享受优惠
if (result)
{
var promGroupItems = orderObject.Items.FindAll(x => x.RowState != OrderRowState. && x.Group == orderItem.Group && x.Id != orderItem.Id && x.Promotions != null && x.Promotions.Count > 0);
if (promGroupItems.Count > 0)
{
result = false;
var promItem = promGroupItems[0];
message = string.Format("<{0}>享受过关联优惠,不允许操作", promItem.Name);
}
}
//有单品优惠禁止操作
//if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
//{
// if(orderItem.Promotions.Exists(x => x.PromotionType != PromotionType.会员价))
// {
// //享受过会员价以外的优惠,不能切换规格
// result = false;
// message = "享受过优惠,不允许操作";
// }
//}
}
break;
case ModuleKeyCode.:
{
//套餐明细禁止操作
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许的操作!";
}
//如果有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许操作";
}
//if (result && orderItem.RowState == OrderRowState.套餐明)
//{
// //查找套餐主,如果套餐主享受优惠,不允许套餐明细操作
// var master = orderObject.Items.Find(x => x.Id == orderItem.ParentId);
// //有单品优惠禁止操作
// if (result && master.Promotions != null && master.Promotions.Count > 0)
// {
// if (orderItem.Promotions.Exists(x => x.PromotionType != PromotionType.会员价))
// {
// //享受过会员价以外的优惠,不能切换规格
// result = false;
// message = "套餐已优惠,不允许操作";
// }
// }
//}
//else
//{
//有单品优惠禁止操作
//if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
//{
// if (orderItem.Promotions.Exists(x => x.PromotionType != PromotionType.会员价))
// {
// //享受过会员价以外的优惠,不能切换规格
// result = false;
// message = "享受过优惠,不允许操作";
// }
//}
//}
}
break;
case ModuleKeyCode.:
{
//套餐明细禁止操作
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许调整套餐明细的数量!";
}
//如果有整单优惠,禁止操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许调整数量";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
}
break;
case ModuleKeyCode.:
{
//套餐明细禁止操作
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许调整套餐明细的数量!";
}
//如果有整单优惠,禁止点单操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许调整数量";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
}
break;
case ModuleKeyCode.:
{
//套餐明细禁止操作
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许调整套餐明细的数量!";
}
//如果有整单优惠,禁止点单操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许调整数量";
}
//有单品优惠禁止操作
if (result && orderItem.Promotions != null && orderItem.Promotions.Count > 0)
{
result = false;
message = "享受过优惠,不允许操作";
}
}
break;
case ModuleKeyCode.:
{
if (result && orderItem.RowState == OrderRowState.)
{
result = false;
message = "不允许调整套餐明细的数量!";
}
//如果有整单优惠,禁止点单操作
if (result && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许删除操作";
}
//享受关联优惠
if (result && !string.IsNullOrEmpty(orderItem.ParentId))
{
result = false;
message = "享受关联优惠,不允许删除操作";
}
}
break;
case ModuleKeyCode.:
{
//练习模式
if (Global.Instance.IsStudyMode())
{
result = false;
message = "练习模式!不允许操作!";
}
if (false && orderObject.Promotions != null && orderObject.Promotions.Count > 0)
{
result = false;
message = "享受整单优惠,不允许挂单操作";
}
}
break;
case ModuleKeyCode.:
{
if (result && orderObject == null)
{
result = false;
message = "请取消订单后重新点单";
}
//订单交易完成,系统显示已结账,快速结账禁用
if (result && ((orderObject.OrderType == OrderType. && orderObject.OrderStatus == OrderStatus.) || orderObject.OrderStatus == OrderStatus.))
{
result = false;
message = "不支持的操作,交易已结账";
}
}
break;
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.退:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
case ModuleKeyCode.:
{
//练习模式
if (Global.Instance.IsStudyMode())
{
result = false;
message = "练习模式!不允许操作!";
}
}
break;
}
return new Tuple<bool, string>(result, message);
}
#endregion
#region 订单优惠计算
/// <summary>
/// 取消整单优惠
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public bool RemoveOrderPromotion(OrderObject orderObject)
{
orderObject.Promotions = null;
orderObject.Promotions = new List<PromotionOrder>();
foreach (var item in orderObject.Items)
{
item.Promotions = null;
item.Promotions = new List<PromotionItem>();
item.DiscountPrice = item.Price;
item.Discount = 0.00M;
foreach (FlavorItem flavorItem in item.Flavors)
{
flavorItem.DiscountPrice = flavorItem.Price;
flavorItem.DiscountAmount = 0;
}
//套餐主、普通菜有parentId证明是优惠关联了取消优惠解除关联
//if(item.RowState != OrderRowState.套餐明 && !string.IsNullOrEmpty(item.ParentId))
//{
// item.ParentId = null;
//}
}
// 如果包含套餐优惠分摊
foreach (var item in orderObject.Items)
{
if (item.RowState == OrderRowState.)
{
PromotionUtils.CalculateSuitShare(orderObject, item);
}
}
return true;
}
/// <summary>
/// 取消单品优惠
/// </summary>
/// <param name="order"></param>
/// <param name="item"></param>
/// <returns></returns>
public List<OrderItem> RemoveOrderItemPromotion(OrderObject order, OrderItem item)
{
List<OrderItem> itemList = new List<OrderItem>();
item.Promotions = null;
item.Promotions = new List<PromotionItem>();
item.DiscountPrice = item.Price;
item.Discount = 0.00M;
itemList.Add(item);
//找关联优惠,同步取消
var subItems = order.Items.FindAll(x => x.ParentId == item.Id && x.RowState != OrderRowState.);
foreach (var sub in subItems)
{
sub.Promotions = null;
sub.Promotions = new List<PromotionItem>();
sub.DiscountPrice = item.Price;
sub.Discount = 0.00M;
sub.ParentId = null;
itemList.Add(sub);
}
return itemList;
}
/// <summary>
/// 赠送
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
public void OrderItemGive(OrderObject orderObject, OrderItem orderItem)
{
//单品赠送
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = orderItem.TenantId;
//订单ID
promotion.OrderId = orderItem.OrderId;
//订单编号
promotion.TradeNo = orderItem.TradeNo;
//单品编号
promotion.ItemId = orderItem.Id;
//类型
promotion.PromotionType = PromotionType.;
//折扣率
promotion.DiscountRate = 1;
//优惠前金额
promotion.Amount = orderItem.Amount;
//优惠金额
promotion.DiscountAmount = orderItem.Amount;
//优惠后金额
promotion.ReceivableAmount = 0;
//优惠生效
promotion.Enabled = false;
//重新计算优惠
PromotionUtils.Calculate(orderObject, orderItem, promotion);
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(orderObject, orderItem);
orderItem.Action = "单品赠送操作";
}
/// <summary>
/// 商品电子兑换券计算
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
public void OrderItemProductGift(OrderObject orderObject, string couponId, string planNo, string planName, OrderItem orderItem)
{
//单品赠送
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = orderItem.TenantId;
//订单ID
promotion.OrderId = orderItem.OrderId;
//订单编号
promotion.TradeNo = orderItem.TradeNo;
//单品编号
promotion.ItemId = orderItem.Id;
//类型
promotion.PromotionType = PromotionType.;
//折扣率
promotion.DiscountRate = 1;
//优惠前金额
promotion.Amount = orderItem.Amount;
//优惠金额
promotion.DiscountAmount = orderItem.Amount;
//优惠后金额
promotion.ReceivableAmount = 0;
//优惠生效
promotion.Enabled = false;
//兑换券code
promotion.PlanNo = planNo;
//兑换券名称
promotion.PlanName = planName;
//兑换券ID
promotion.CouponId = couponId;
PromotionUtils.Calculate(orderObject, orderItem, promotion);
orderItem.Action = "电子兑换券操作";
}
/// <summary>
/// 商品电子券计算
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
public void OrderItemProductProduct(OrderObject orderObject, OrderItem orderItem, PromotionEntity fineProm)
{
//单品赠送
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = orderItem.TenantId;
//订单ID
promotion.OrderId = orderItem.OrderId;
//订单编号
promotion.TradeNo = orderItem.TradeNo;
//单品编号
promotion.ItemId = orderItem.Id;
//类型
promotion.PromotionType = PromotionType.;
//优惠前金额
promotion.Amount = orderItem.Amount;
//优惠金额
promotion.DiscountAmount = fineProm.DiscountAmount;
//优惠后金额
promotion.ReceivableAmount = orderItem.Amount - fineProm.DiscountAmount;
//折扣率
promotion.DiscountRate = OrderUtils.ToRound(fineProm.DiscountAmount / orderItem.Amount); ;
//优惠生效
promotion.Enabled = false;
//兑换券code
promotion.PlanNo = fineProm.PromotionId;
//兑换券名称
promotion.PlanName = fineProm.PromotionDesc;
//兑换券ID
promotion.CouponId = fineProm.CouponId;
PromotionUtils.Calculate(orderObject, orderItem, promotion);
orderItem.Action = "电子兑换券操作";
}
public Tuple<bool, string, List<OrderItem>> OrderItemQuantityPlusEx(OrderObject orderObject, OrderItem orderItem)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(orderItem.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[orderItem.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
bool isSuccess = true;
string message = "操作成功";
List<OrderItem> refreshItems = new List<OrderItem>();
try
{
//参与沽清,已经售完
if (isSaleClear && saleClear.Quantity <= 0)
{
isSuccess = false;
message = "沽清售完了";
}
//验证合法通过
if (isSuccess)
{
//每次添加都是第一次点单的数量为基础
orderItem.Quantity = orderItem.Quantity + 1;
//将更改后的行数据同步到订单列表
var inx = orderObject.Maps.IndexOf(orderItem);
orderObject.Maps[inx] = orderItem;
//判断是否是套餐主,同步更改套餐明细数量
if (orderItem.RowState == OrderRowState.)
{
var details = orderObject.Items.FindAll(x => x.ParentId == orderItem.Id && x.Group == orderItem.Group);
foreach (var item in details)
{
//道菜加价金额
item.SuitAmount = orderItem.Quantity * item.SuitAddPrice;
//道菜数量随主菜变化而增加
item.Quantity = orderItem.Quantity * item.SuitQuantity;
//将更改后的行数据同步到订单列表
var index = orderObject.Maps.IndexOf(item);
orderObject.Maps[index] = item;
refreshItems.Add(item);
}
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(orderObject, orderItem);
}
}
}
catch (Exception ex)
{
isSuccess = false;
logger.Error(ex, "数量加一业务异常");
}
finally
{
if (isSuccess)
{
if (isSaleClear)
{
saleClear.SaleQuantity += 1;
SaleClearUtils.Instance.Maps[orderItem.ProductId] = saleClear;
}
}
}
return new Tuple<bool, string, List<OrderItem>>(isSuccess, message, refreshItems);
}
/// <summary>
/// 商品数量加一
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <returns></returns>
public List<OrderItem> OrderItemQuantityPlus(OrderObject orderObject, OrderItem orderItem)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(orderItem.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[orderItem.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
bool isException = false;
List<OrderItem> refreshItems = new List<OrderItem>();
try
{
//每次添加都是第一次点单的数量为基础
orderItem.Quantity = orderItem.Quantity + 1;
//将更改后的行数据同步到订单列表
var inx = orderObject.Maps.IndexOf(orderItem);
orderObject.Maps[inx] = orderItem;
//判断是否是套餐主,同步更改套餐明细数量
if (orderItem.RowState == OrderRowState.)
{
var details = orderObject.Items.FindAll(x => x.Group == orderItem.Group && x.ParentId == orderItem.Id);
foreach (var item in details)
{
//道菜加价金额
item.SuitAmount = orderItem.Quantity * item.SuitAddPrice;
//道菜数量随主菜变化而增加
item.Quantity = orderItem.Quantity * item.SuitQuantity;
//将更改后的行数据同步到订单列表
var index = orderObject.Maps.IndexOf(item);
orderObject.Maps[index] = item;
refreshItems.Add(item);
}
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(orderObject, orderItem);
}
}
catch (Exception ex)
{
isException = true;
logger.Error(ex, "数量减一业务异常");
}
finally
{
if (!isException)
{
if (isSaleClear)
{
SaleClearUtils.Instance.Maps[orderItem.ProductId] = saleClear;
}
}
}
return refreshItems;
}
/// <summary>
/// 商品数量减一
/// </summary>
/// <param name="orderObject"></param>
/// <param name="orderItem"></param>
/// <returns></returns>
public List<OrderItem> OrderItemQuantityMinus(OrderObject orderObject, OrderItem orderItem)
{
//添加沽清业务规则
SaleClear saleClear = null;
if (SaleClearUtils.Instance.Maps.ContainsKey(orderItem.ProductId))
{
saleClear = SaleClearUtils.Instance.Maps[orderItem.ProductId];
}
//是否参与沽清
bool isSaleClear = SaleClearUtils.Instance.CheckSaleClear(saleClear);
bool isException = false;
List<OrderItem> refreshItems = new List<OrderItem>();
try
{
orderItem.Quantity = orderItem.Quantity - 1;
if (orderItem.Quantity <= 0)
{
orderItem.Quantity = 1;
}
else
{
//沽清数量减 1
if (isSaleClear)
{
saleClear.SaleQuantity -= 1;
}
}
//将更改后的行数据同步到订单列表
var inx = orderObject.Maps.IndexOf(orderItem);
orderObject.Maps[inx] = orderItem;
//判断是否是套餐主,同步更改套餐明细数量
if (orderItem.RowState == OrderRowState.)
{
var details = orderObject.Items.FindAll(x => x.Group == orderItem.Group && x.ParentId == orderItem.Id);
foreach (var item in details)
{
//道菜加价金额
item.SuitAmount = orderItem.Quantity * item.SuitAddPrice;
//道菜数量随主菜变化而增加
item.Quantity = orderItem.Quantity * item.SuitQuantity;
//将更改后的行数据同步到订单列表
var index = orderObject.Maps.IndexOf(item);
orderObject.Maps[index] = item;
refreshItems.Add(item);
}
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(orderObject, orderItem);
}
}
catch (Exception ex)
{
isException = true;
logger.Error(ex, "数量减一业务异常");
}
finally
{
if (!isException)
{
if (isSaleClear)
{
SaleClearUtils.Instance.Maps[orderItem.ProductId] = saleClear;
}
}
}
return refreshItems;
}
/// <summary>
/// 后台促销新建促销记录
/// </summary>
/// <param name="subItem"></param>
/// <param name="fineProm"></param>
public void ApplyPromotionEntity(OrderObject orderObject, OrderItem subItem, PromotionEntity fineProm)
{
//商品促销优惠
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = subItem.TenantId;
//订单ID
promotion.OrderId = subItem.OrderId;
//订单编号
promotion.TradeNo = subItem.TradeNo;
//单品编号
promotion.ItemId = subItem.Id;
//类型
promotion.PromotionType = fineProm.Type;
//方案
promotion.PlanNo = fineProm.PromotionId;
//方案名称
promotion.PlanName = fineProm.Type.ToString();
//优惠金额
promotion.DiscountAmount = OrderUtils.ToRound(fineProm.DiscountAmount / fineProm.Products[0].Quantity * subItem.Quantity);
//折扣率
if (subItem.Amount != 0)
{
promotion.DiscountRate = OrderUtils.ToRound((subItem.Amount - promotion.DiscountAmount) / subItem.Amount);
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(orderObject, subItem, promotion);
//优惠金额
//subItem.Discount = subItem.DiscountAmount;
}
/// <summary>
/// 双数特价优惠新增记录
/// </summary>
/// <param name="_orderObject"></param>
/// <param name="_orderItem"></param>
/// <param name="fineProm"></param>
/// <param name="quantity"></param>
/// <returns></returns>
public Tuple<bool, string, OrderItem> ApplyItemDoubleSpecialPromotion(OrderObject _orderObject, OrderItem _orderItem, PromotionEntity fineProm, decimal quantity)
{
//赠送商品
OrderItem master = null;
PromotionItem promotion = null;
var products = fineProm.Products;
foreach (var pro in products)
{
ProductExt product = null;
using (var db = Global.Instance.OpenDataBase)
{
var sql = string.Format(SqlConstant.ProductExt + " where p.id = '{0}' and s.id = '{1}';", pro.ProductId, pro.SpecId);
product = db.FirstOrDefault<ProductExt>(sql);
}
//沽清
//创建新的
//创建新的OrderItem
master = BusinessUtils.Instance.NewOrderItem(_orderObject, product);
master.Quantity = quantity;
//商品促销优惠
promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = master.TenantId;
//订单ID
promotion.OrderId = master.OrderId;
//订单编号
promotion.TradeNo = master.TradeNo;
//单品编号
promotion.ItemId = master.Id;
//类型
promotion.PromotionType = fineProm.Type;
//方案
promotion.PlanNo = fineProm.PromotionId;
//方案名称
promotion.PlanName = fineProm.Type.ToString();
//优惠金额
promotion.DiscountAmount = OrderUtils.ToRound(fineProm.DiscountAmount / pro.Quantity * quantity);
//折扣率
if (master.Amount != 0)
{
promotion.DiscountRate = OrderUtils.ToRound((master.Amount - promotion.DiscountAmount) / master.Amount);
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(_orderObject, master, promotion);
//优惠金额
master.Discount = master.DiscountAmount;
//依赖ID
master.ParentId = _orderItem.Id;
}
return new Tuple<bool, string, OrderItem>(true, string.Empty, master);
}
/// <summary>
/// 追加至目标行的行号
/// </summary>
/// <param name="order"></param>
/// <param name="item"></param>
/// <returns></returns>
public int AppendItemPosition(OrderObject order, OrderItem item)
{
int orderNo = item.OrderNo;
if (item.RowState == OrderRowState.)
{
//套餐特殊处理orderNo为套餐最后一道菜的序号
var suitItem = order.Items.FindLast(x => x.Group == item.Group && x.RowState == OrderRowState.);
if (suitItem != null)
{
orderNo = suitItem.OrderNo;
}
}
return orderNo;
}
/// <summary>
/// 应用单品优惠
/// </summary>
/// <param name="fineProm"></param>
/// <returns></returns>
public bool ApplyItemFinePromotion(OrderObject _orderObject, OrderItem _orderItem, PromotionEntity fineProm)
{
bool needUpdate = false;
switch (fineProm.Type)
{
case PromotionType.:
{
var pro = PromotionEngine.Instance.Promotions.Find(x => x.Type == PromotionType..ToString());
if (pro != null)
{
var cont = JsonUtils.Deserialize<CardProDay>(pro.Content);
var discountValue = cont.DiscountValue;
// (0-按菜品 1-按整单)都按照整单计算比例
if (cont.ReferType == 0)
{
//按菜品
foreach (var orderItem in _orderObject.Items)
{
if (orderItem.Promotions.Count > 0)
{
continue;
}
var promotionItem = new PromotionItem();
//标识
promotionItem.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotionItem.TenantId = orderItem.TenantId;
//订单ID
promotionItem.OrderId = orderItem.OrderId;
//订单编号
promotionItem.TradeNo = orderItem.TradeNo;
//单品编号
promotionItem.ItemId = orderItem.Id;
promotionItem.PromotionType = PromotionType.;
promotionItem.PlanNo = fineProm.PromotionId;
promotionItem.PlanName = PromotionType..ToString();
if (cont.DiscountType == 0)//(0-按比例 1-固定值)
{
//优惠金额
var discountAmount = OrderUtils.ToRound(orderItem.ReceivableAmount * (100 - discountValue) / 100.00M);
if (discountAmount > orderItem.Amount)
{
discountAmount = orderItem.Amount;
}
promotionItem.DiscountAmount = discountAmount;
}
else
{
//固定值
//(0-按菜品 1-按整单)
if (discountValue <= orderItem.DiscountPrice)
{
//优惠金额
promotionItem.DiscountAmount = OrderUtils.ToRound(discountValue * orderItem.Quantity);
}
else
{
promotionItem.DiscountAmount = orderItem.ReceivableAmount;
}
}
PromotionUtils.Calculate(_orderObject, orderItem, promotionItem);
needUpdate = true;
}
}
}
}
break;
case PromotionType.:
{
BusinessUtils.Instance.AddMemberPromotion(_orderObject, _orderItem);
needUpdate = true;
}
break;
case PromotionType.:
{
BusinessUtils.Instance.AddProductCouponPromotion(_orderObject, _orderItem, fineProm);
needUpdate = true;
}
break;
case PromotionType.:
{
BusinessUtils.Instance.AddMemberLevelPromotion(_orderObject, _orderItem, fineProm);
needUpdate = true;
}
break;
case PromotionType.:
{
//享受优惠的前提是 1、没有整单优惠 2、单品没有享受优惠
bool isGo = true;
if (isGo && _orderObject.Promotions != null && _orderObject.Promotions.Count > 0)
{
isGo = false;
}
if (isGo)
{
//订单不存在优惠
//商品促销优惠
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderItem.TenantId;
//订单ID
promotion.OrderId = _orderItem.OrderId;
//订单编号
promotion.TradeNo = _orderItem.TradeNo;
//单品编号
promotion.ItemId = _orderItem.Id;
//类型
promotion.PromotionType = PromotionType.;
//方案
promotion.PlanNo = fineProm.PromotionId;
//方案名称
promotion.PlanName = PromotionType..ToString();
//优惠金额
promotion.DiscountAmount = fineProm.DiscountAmount;
//折扣率
if (_orderItem.Price != 0)
{
promotion.DiscountRate = OrderUtils.ToRound((_orderItem.Amount - fineProm.DiscountAmount) / _orderItem.Amount);
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(_orderObject, _orderItem, promotion);
needUpdate = true;
}
}
break;
case PromotionType.:
{
//享受优惠的前提是 1、没有整单优惠 2、单品没有享受优惠
bool isGo = true;
if (isGo && _orderObject.Promotions != null && _orderObject.Promotions.Count > 0)
{
isGo = false;
}
if (isGo)
{
//订单不存在优惠
//商品促销优惠
var promotion = new PromotionItem();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderItem.TenantId;
//订单ID
promotion.OrderId = _orderItem.OrderId;
//订单编号
promotion.TradeNo = _orderItem.TradeNo;
//单品编号
promotion.ItemId = _orderItem.Id;
//类型
promotion.PromotionType = PromotionType.;
//方案
promotion.PlanNo = fineProm.PromotionId;
//方案名称
promotion.PlanName = PromotionType..ToString();
//优惠金额
promotion.DiscountAmount = fineProm.DiscountAmount;
//折扣率
if (_orderItem.Price != 0)
{
promotion.DiscountRate = OrderUtils.ToRound((_orderItem.Amount - fineProm.DiscountAmount) / _orderItem.Amount);
}
else
{
promotion.DiscountRate = 0;
}
PromotionUtils.Calculate(_orderObject, _orderItem, promotion);
needUpdate = true;
}
}
break;
}
return needUpdate;
}
public void ApplyOrderPromotionMeituan(OrderObject _orderObject, PromotionEntity fineProm)
{
switch (fineProm.Type)
{
case PromotionType.:
{
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = fineProm.Type;
promotion.DiscountAmount = fineProm.DiscountAmount;
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = fineProm.PromotionDesc;
promotion.CouponId = fineProm.CouponId;
var lists = _orderObject.Items.FindAll(x => x.RowState != OrderRowState.);
//已经分摊金额的合计,用于处理最后一个单品相减的问题
decimal sum = 0;
//有效商品金额
decimal validAmount = lists.Sum(x => x.ReceivableAmount);
for (int i = 0; i < lists.Count; i++)
{
var orderItem = lists[i];
//忽略套餐明细,套餐明细依赖套餐主分摊折扣
if (orderItem.RowState == OrderRowState.)
{
continue;
}
//折扣优惠,相对固定值是输入的 折扣率
var discount = new PromotionItem();
//折扣标识
discount.Id = IdWorkerUtils.Instance.NextId();
//折扣类型
discount.PromotionType = promotion.PromotionType;
//租户ID
discount.TenantId = orderItem.TenantId;
//订单ID
discount.OrderId = orderItem.OrderId;
//订单编号
discount.TradeNo = orderItem.TradeNo;
//单品编号
discount.ItemId = orderItem.Id;
//分摊数据对应整单优惠的行数据ID
discount.RelationId = promotion.Id;
discount.PlanNo = promotion.PlanNo;
discount.PlanName = promotion.PlanName;
//兑换券ID
discount.CouponId = promotion.CouponId;
//分摊的金额
var _amount = OrderUtils.ToRound(orderItem.ReceivableAmount / validAmount * promotion.DiscountAmount);
//如果是最后一条记录,分摊金额采用减法
if (i + 1 == _orderObject.Items.FindAll(x => x.RowState != OrderRowState.).Count)
{
_amount = promotion.DiscountAmount - sum;
}
else
{
sum += _amount;
}
//优惠前金额
discount.Amount = orderItem.ReceivableAmount;
//优惠金额
discount.DiscountAmount = _amount;
//优惠后金额
discount.ReceivableAmount = orderItem.ReceivableAmount - _amount;
//折扣率
if (orderItem.ReceivableAmount == 0)
{
discount.DiscountRate = 0;
}
else
{
discount.DiscountRate = OrderUtils.ToRound(discount.ReceivableAmount / orderItem.ReceivableAmount);
}
//优惠生效
discount.Enabled = true;
//折扣,影响折扣后的单价 = 折扣的总金额 / 购买的数量
orderItem.DiscountPrice = OrderUtils.ToDiscountPrice(discount.ReceivableAmount / orderItem.Quantity);
//添加明细优惠
orderItem.Promotions.Add(discount);
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(_orderObject, orderItem);
}
//添加主单优惠
_orderObject.Promotions.Add(promotion);
}
break;
}
}
/// <summary>
/// 电子代金券单独算优惠
/// </summary>
/// <param name="fineProm"></param>
public void ApplyOrderPromotionDZDJQ(OrderObject _orderObject, PromotionEntity fineProm)
{
switch (fineProm.Type)
{
case PromotionType.:
{
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = fineProm.Type;
promotion.DiscountAmount = fineProm.DiscountAmount;
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = fineProm.PromotionDesc;
promotion.CouponId = fineProm.CouponId;
//PromotionUtils.Calculate(_orderObject, promotion);
//已经分摊金额的合计,用于处理最后一个单品相减的问题
decimal sum = 0;
//有效商品金额
decimal validAmount = _orderObject.Items.FindAll(x => x.RowState != OrderRowState.).Sum(x => x.ReceivableAmount);
for (int i = 0; i < _orderObject.Items.FindAll(x => x.RowState != OrderRowState.).Count; i++)
{
var orderItem = _orderObject.Items.FindAll(x => x.RowState != OrderRowState.)[i];
if (fineProm.Type == PromotionType.)
{
if (!Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_VOUCHER_ALLOWS_DISCOUNT, false))
//服务端禁止单品折扣
if (orderItem.DiscountFlag == 0)
{
orderItem.Action = "云端不允许优惠";
continue;
}
}
else
{
//服务端禁止单品折扣
if (orderItem.DiscountFlag == 0)
{
orderItem.Action = "云端不允许优惠";
continue;
}
}
//忽略套餐明细,套餐明细依赖套餐主分摊折扣
if (orderItem.RowState == OrderRowState.)
{
continue;
}
//折扣优惠,相对固定值是输入的 折扣率
var discount = new PromotionItem();
//折扣标识
discount.Id = IdWorkerUtils.Instance.NextId();
//折扣类型
discount.PromotionType = promotion.PromotionType;
//租户ID
discount.TenantId = orderItem.TenantId;
//订单ID
discount.OrderId = orderItem.OrderId;
//订单编号
discount.TradeNo = orderItem.TradeNo;
//单品编号
discount.ItemId = orderItem.Id;
//分摊数据对应整单优惠的行数据ID
discount.RelationId = promotion.Id;
discount.PlanNo = promotion.PlanNo;
discount.PlanName = promotion.PlanName;
//兑换券ID
discount.CouponId = promotion.CouponId;
//分摊的金额
var _amount = OrderUtils.ToRound(orderItem.ReceivableAmount / validAmount * promotion.DiscountAmount);
//如果是最后一条记录,分摊金额采用减法
if (i + 1 == _orderObject.Items.FindAll(x => x.RowState != OrderRowState.).Count)
{
_amount = promotion.DiscountAmount - sum;
}
else
{
sum += _amount;
}
//优惠前金额
discount.Amount = orderItem.ReceivableAmount;
//优惠金额
discount.DiscountAmount = _amount;
//优惠后金额
discount.ReceivableAmount = orderItem.ReceivableAmount - _amount;
//折扣率
if (orderItem.ReceivableAmount == 0)
{
discount.DiscountRate = 0;
}
else
{
discount.DiscountRate = OrderUtils.ToRound(discount.ReceivableAmount / orderItem.ReceivableAmount);
}
//优惠生效
discount.Enabled = true;
//折扣,影响折扣后的单价 = 折扣的总金额 / 购买的数量
orderItem.DiscountPrice = OrderUtils.ToDiscountPrice(discount.ReceivableAmount / orderItem.Quantity);
//添加明细优惠
orderItem.Promotions.Add(discount);
//套餐道菜分摊
PromotionUtils.CalculateSuitShare(_orderObject, orderItem);
}
//添加主单优惠
_orderObject.Promotions.Add(promotion);
}
break;
}
}
/// <summary>
/// 应用订单优惠
/// </summary>
/// <param name="fineProm"></param>
public void ApplyOrderPromotion(OrderObject _orderObject, PromotionEntity fineProm)
{
switch (fineProm.Type)
{
case PromotionType.:
{
var pro = PromotionEngine.Instance.Promotions.Find(x => x.Type == PromotionType..ToString());
if (pro != null)
{
var cont = JsonUtils.Deserialize<CardProDay>(pro.Content);
var discountValue = cont.DiscountValue;
// (0-按菜品 1-按整单)都按照整单计算比例
if (cont.ReferType == 1)
{
//1-按整单
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = PromotionType.;
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = PromotionType..ToString();
var discountAmount = 0.00M;
//能够参与优惠的金额
var validAmount = PromotionUtils.GetValidPromItemsAmount(_orderObject);
if (cont.DiscountType == 0)//(0-按比例 1-固定值)
{
//优惠金额
discountAmount = OrderUtils.ToRound(validAmount * (100 - discountValue) / 100.00M);
if (discountAmount > validAmount)
{
discountAmount = validAmount;
}
}
else
{
discountAmount = discountValue;
}
promotion.DiscountAmount = discountAmount;
PromotionUtils.Calculate(_orderObject, promotion);
}
}
}
break;
case PromotionType.:
{
var pro = PromotionEngine.Instance.PromotionTasks.FirstOrDefault(x => x.PromotionSn == fineProm.PromotionId);
if (pro != null)
{
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = PromotionType.;
promotion.DiscountAmount = fineProm.DiscountAmount;
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = PromotionType..ToString();
//参与计算的商品
var joinSpecList = PromotionEngine.Instance.PromotionTasks.FindAll(x => x.PromotionSn == fineProm.PromotionId).Select(x => x.ValueId).ToList();
PromotionUtils.Calculate(_orderObject, promotion, joinSpecList, null);
}
}
break;
case PromotionType.:
{
var pro = PromotionEngine.Instance.StoreCoupons.FirstOrDefault(x => x.Id == fineProm.PromotionId);
if (pro != null)
{
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = PromotionType.;
//能够参与优惠的金额
var validAmount = PromotionUtils.GetValidPromItemsAmount(_orderObject);
if (fineProm.DiscountAmount <= validAmount)
{
promotion.DiscountAmount = fineProm.DiscountAmount;
}
else
{
promotion.DiscountAmount = validAmount;
}
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = pro.Name;
//优惠券ID
promotion.Ext1 = fineProm.CouponId;
PromotionUtils.Calculate(_orderObject, promotion);
}
}
break;
case PromotionType.:
{
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = PromotionType.;
promotion.DiscountAmount = fineProm.DiscountAmount;
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = PromotionType..ToString();
PromotionUtils.Calculate(_orderObject, promotion);
}
break;
case PromotionType.:
case PromotionType.:
{
var promotion = new PromotionOrder();
//标识
promotion.Id = IdWorkerUtils.Instance.NextId();
//租户ID
promotion.TenantId = _orderObject.TenantId;
//订单ID
promotion.OrderId = _orderObject.Id;
//订单编号
promotion.TradeNo = _orderObject.TradeNo;
promotion.PromotionType = fineProm.Type;
promotion.DiscountAmount = fineProm.DiscountAmount;
promotion.PlanNo = fineProm.PromotionId;
promotion.PlanName = fineProm.PromotionDesc;
promotion.CouponId = fineProm.CouponId;
PromotionUtils.Calculate(_orderObject, promotion);
}
break;
case PromotionType.:
{
}
break;
}
}
public void OrderMd(OrderObject _orderObject, decimal discountAmount)
{
PromotionEntity prom = new PromotionEntity();
prom.Type = PromotionType.;
prom.DiscountAmount = discountAmount;
prom.IsOrder = true;
prom.PromotionDesc = PromotionType..ToString();
ApplyOrderPromotion(_orderObject, prom);
}
#endregion
#region 会员卡操作
/// <summary>
/// 订单赠送积分,非会员卡支付时使用
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> AddCardPoint4Order(OrderObject orderObject)
{
try
{
if (orderObject.IsMember == 1)
{
logger.Info("会员[{0}]充值消费积分,订单[{1}]", orderObject.Member.Id, orderObject.TradeNo);
var result = CreateOrderCardTrade(orderObject);
if (result.Item1)
{
//记积分金额
var pointAmount = orderObject.Pays.FindAll(x => x.PointFlag == 1).Sum(x => x.Amount);
var request = new CardTradePayRequest();
request.TradeNo = orderObject.TradeNo;
request.MemberId = orderObject.Member == null ? string.Empty : orderObject.Member.Id;
request.Mobile = orderObject.Member == null ? string.Empty : orderObject.Member.Mobile;
request.TradeVoucherNo = result.Item3.TradeVoucherNo;
request.TotalAmount = Convert.ToInt32(orderObject.Amount * 100);
request.RealAmount = Convert.ToInt32(orderObject.PaidAmount * 100);
request.PointAmount = orderObject.Member == null ? 0 : Convert.ToInt32(pointAmount * 100);
request.PayCardAmount = 0;//单独充值积分传0
request.DiscountAmount = Convert.ToInt32(orderObject.DiscountAmount * 100);
request.PointFlag = 2;//以卡系统计算为准
request.PointValue = 0;
request.PayInfo = new List<PayInfo>();
var pays = new List<Pay>();
foreach (var p in orderObject.Pays)
{
var pay = new Pay();
pay.PayTypeNo = p.No;
pay.PayType = p.Name;
pay.Money = Convert.ToInt32(p.Amount * 100);
pay.PointRule = string.Empty;
pay.Point = 0;
pays.Add(pay);
}
request.Pay = pays;
int couponTotalAmount = 0;
var coupons = new List<Coupon>();
if (orderObject.Promotions != null)
{
foreach (PromotionOrder promotionOrder in orderObject.Promotions)
{
if (PromotionType. == promotionOrder.PromotionType)
{
Coupon coupon = new Coupon();
coupon.CouponId = promotionOrder.CouponId;
coupon.CouponType = "CASH";
coupon.Title = promotionOrder.PlanName;
coupon.Code = promotionOrder.PlanNo;
coupon.Discount = String.Format("{0}", promotionOrder.DiscountRate);
coupon.Cash = String.Format("{0}", promotionOrder.DiscountAmount);
coupon.Gift = promotionOrder.PlanName;
coupon.Memo = String.Format("电子代金券,优惠{0}", promotionOrder.DiscountAmount);
couponTotalAmount += Convert.ToInt32(promotionOrder.DiscountAmount * 100);
coupons.Add(coupon);
}
else if (PromotionType. == promotionOrder.PromotionType)
{
Coupon coupon = new Coupon();
coupon.CouponId = promotionOrder.CouponId;
coupon.CouponType = "DISCOUNT";
coupon.Title = promotionOrder.PlanName;
coupon.Code = promotionOrder.PlanNo;
coupon.Discount = String.Format("{0}", promotionOrder.DiscountRate);
coupon.Cash = String.Format("{0}", promotionOrder.DiscountAmount);
coupon.Gift = promotionOrder.PlanName;
coupon.Memo = String.Format("电子折扣券,优惠{0}", promotionOrder.DiscountAmount);
couponTotalAmount += Convert.ToInt32(promotionOrder.DiscountAmount * 100);
coupons.Add(coupon);
}
}
}
if (orderObject.Items != null)
{
foreach (OrderItem orderItem in orderObject.Items)
{
if (orderItem.Promotions != null)
{
foreach (PromotionItem promotionItem in orderItem.Promotions)
{
if (PromotionType. == promotionItem.PromotionType)
{
Coupon coupon = new Coupon();
coupon.CouponId = promotionItem.CouponId;
coupon.CouponType = "GIFT";
coupon.Title = promotionItem.PlanName;
coupon.Code = promotionItem.PlanNo;
coupon.Discount = String.Format("{0}", promotionItem.DiscountRate);
coupon.Cash = String.Format("{0}", promotionItem.DiscountAmount);
coupon.Gift = promotionItem.PlanName;
coupon.Memo = String.Format("电子兑换券,优惠{0}", promotionItem.DiscountAmount);
couponTotalAmount += Convert.ToInt32(promotionItem.DiscountAmount * 100);
coupons.Add(coupon);
}
}
}
}
}
request.Coupon = coupons;
request.CouponTotalAmount = couponTotalAmount;
request.ShopNo = Global.Instance.Authc.StoreNo;
request.WorkerNo = Global.Instance.Worker.No;
request.PosNo = Global.Instance.Authc.PosNo;
var payResult = CardUtils.CardTradePay(request);
if (payResult.Item1)
{
var payRes = payResult.Item3;
//刷卡后积分计入主单
orderObject.PrePoint = OrderUtils.ToRound(payRes.PrePoint / 100.00M);
orderObject.AddPoint = OrderUtils.ToRound(payRes.GiftPoint / 100.00M);
orderObject.AftPoint = OrderUtils.ToRound(payRes.AftPoint / 100.00M);
logger.Info("订单[{0}]充值积分[{1}]成功", orderObject.TradeNo, orderObject.AddPoint);
return new Tuple<bool, string>(true, "充值积分成功");
}
else
{
//会员充值积分失败
logger.Error(string.Format("订单[{0}]充值积分失败,原因{1}", orderObject.TradeNo, payResult.Item2));
return new Tuple<bool, string>(false, payResult.Item2);
}
}
else
{
return new Tuple<bool, string>(false, result.Item2);
}
}
else
{
return new Tuple<bool, string>(true, "非会员订单,不充值积分");
}
}
catch (Exception ex)
{
logger.Error(ex, "订单充值积分发生异常");
return new Tuple<bool, string>(false, "订单充值积分发生异常");
}
}
/// <summary>
/// 创建订单预支付订单
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string, CardTradeCreateVoucherNoResponse> CreateOrderCardTrade(OrderObject orderObject)
{
try
{
var request = new CardTradeCreateVoucherNoRequest();
request.TradeNo = orderObject.TradeNo;
request.BatchNo = "";
request.SerialNo = "";
request.SaleDate = orderObject.SaleDate;
request.Subject = orderObject.StoreName;
request.Body = "";
request.TotalAmount = Convert.ToInt32(orderObject.Amount * 100);
request.DiscountAmount = Convert.ToInt32(orderObject.DiscountAmount * 100);
var goodsDetails = new List<GoodsDetail>();
foreach (OrderItem orderItem in orderObject.Items)
{
GoodsDetail detail = new GoodsDetail();
detail.GoodsId = orderItem.ProductNo;
detail.Name = orderItem.Name;
detail.Spec = orderItem.SpecName;
detail.Quantity = orderItem.Quantity;
detail.Price = orderItem.SalePrice;
detail.DiscountMoney = orderItem.DiscountAmount;
detail.Money = orderItem.ReceivableAmount;
detail.Point = 0.00M;
detail.Promotion = "";
goodsDetails.Add(detail);
}
request.GoodsDetail = goodsDetails;
var proDetails = new List<ProDetail>();
request.ProDetail = proDetails;
request.ShopNo = Global.Instance.Authc.StoreNo;
request.WorkerNo = Global.Instance.Worker.No;
request.PosNo = Global.Instance.Authc.PosNo;
var data = CardUtils.CardTradeCreateVoucherNo(request);
if (data.Item1)
{
logger.Info("订单[{0}]创建卡预支付成功,预支付号[{1}]", orderObject.TradeNo, data.Item3.TradeVoucherNo);
return new Tuple<bool, string, CardTradeCreateVoucherNoResponse>(true, null, data.Item3);
//充值积分
}
else
{
logger.Error(string.Format("订单[{0}]创建卡预支付,原因[{1}]", orderObject.TradeNo, data.Item2));
return new Tuple<bool, string, CardTradeCreateVoucherNoResponse>(false, data.Item2, null);
}
}
catch (Exception ex)
{
logger.Error(ex, "创建订单会员卡预支付订单异常");
return new Tuple<bool, string, CardTradeCreateVoucherNoResponse>(false, "创建订单会员卡预支付订单异常", null);
}
}
/// <summary>
/// 统一收单-卡支付明细
/// </summary>
/// <param name="tradeVoucherNo"></param>
/// <param name="currentCard"></param>
/// <returns></returns>
public Tuple<bool, string, CardTradeCreateCardResponse> CreateCardTrade(string tradeNo, decimal payAmount, string tradeVoucherNo, MemberCard currentCard)
{
Tuple<bool, string, CardTradeCreateCardResponse> result = null;
try
{
var request = new CardTradeCreateCardRequest();
request.TradeVoucherNo = tradeVoucherNo;
request.TradeNo = tradeNo;
request.CardNo = currentCard.CardNo;
request.CardTypeNo = currentCard.CardTypeNo;
request.CardLevelNo = currentCard.CardLevelNo;
request.Amount = Convert.ToInt32(payAmount * 100);
request.ShopNo = Global.Instance.Authc.StoreNo;
request.WorkerNo = Global.Instance.Worker.No;
request.PosNo = Global.Instance.Authc.PosNo;
//会员卡统一下单
var unifiedOrder = CardUtils.CardTradeCreateCard(request);
if (!unifiedOrder.Item1)
{
result = new Tuple<bool, string, CardTradeCreateCardResponse>(false, unifiedOrder.Item2, null);
}
else
{
result = new Tuple<bool, string, CardTradeCreateCardResponse>(true, unifiedOrder.Item2, unifiedOrder.Item3);
}
}
catch (Exception ex)
{
logger.Error(ex, string.Format("订单<{0}>卡<{1}>支付<{2}>统一下单(卡支付明细)异常", tradeNo, currentCard.CardNo, payAmount));
result = new Tuple<bool, string, CardTradeCreateCardResponse>(false, "统一下单(卡支付明细)异常", null);
}
return result;
}
/// <summary>
/// 订单核销实体代金券
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> ConsumeStoreCoupon(OrderObject orderObject)
{
bool status = true;
string message = string.Empty;
try
{
if (orderObject.Promotions != null)
{
var couponPromList = orderObject.Promotions.FindAll(x => x.PromotionType == PromotionType. && !string.IsNullOrEmpty(x.Ext1)).ToList();
if (couponPromList.Count > 0)
{
//逐个核销
foreach (var coupon in couponPromList)
{
logger.Info("订单<{0}>发起实体优惠券核销<{1}>,优惠金额<{2}>", orderObject.TradeNo, coupon.Ext1, coupon.DiscountAmount);
//核销实体券
StoreCouponCheckRequest request = new StoreCouponCheckRequest();
request.CouponCode = coupon.Ext1;
request.BusNo = orderObject.TradeNo;
var result = StoreBusinessUtils.StoreCouponCheck(request);
logger.Info("订单<{0}>实体优惠券<{1}>核销结果:{2}", orderObject.TradeNo, coupon.PlanNo, result.Item2);
if (result.Item1)
{
//成功
logger.Info("订单<{0}>实体优惠券<{1}>核销成功", orderObject.TradeNo, coupon.PlanNo);
}
else
{
//失败
status = false;
message = result.Item2;
break;
}
}
}
}
//兑换券单独核销
}
catch (Exception ex)
{
logger.Error(ex, "实体优惠券核销发生异常");
status = false;
message = "实体优惠券核销发生异常";
}
return new Tuple<bool, string>(status, message);
}
public Tuple<bool, string> MeituanCouponConsume(OrderObject orderObject)
{
bool status = true;
string message = string.Empty;
try
{
if (orderObject.Pays != null)
{
var couponList = orderObject.Pays.FindAll(x => "12".Equals(x.No)).ToList();
if (couponList.Count > 0)
{
//逐个核销
foreach (var coupon in couponList)
{
logger.Info("订单<{0}>发起核销美团券<{1}>", orderObject.TradeNo, coupon.TradeVoucherNo);
var request = new TuangouOrderConsumeRequest();
request.VendorShopId = Global.Instance.Authc.StoreNo;
request.VendorOrderId = orderObject.TradeNo;
request.TotalAmount = orderObject.Amount;
request.CouponCode = coupon.TradeVoucherNo;//美团券码
var skus = new List<OrderSku>();
foreach (var item in orderObject.Items)
{
var sku = new OrderSku();
sku.VendorSkuId = item.SpecId;
sku.VendorSkuName = item.DisplayName;
sku.Unit = item.ProductUnitName;
sku.UnitPrice = item.Price;
sku.Count = 1;
skus.Add(sku);
}
request.OrderSkus = skus;
request.EId = Global.Instance.Worker.No;
request.EName = Global.Instance.Worker.Name;
var result = MeituanCouponUtils.Instance.OrderConsume(request);
logger.Info("订单<{0}>美团券<{1}>核销结果:{2}", orderObject.TradeNo, coupon.TradeVoucherNo, result.Item2);
if (result.Item1)
{
//成功
logger.Info("订单<{0}>电子券<{1}>核销成功", orderObject.TradeNo, coupon.TradeVoucherNo);
}
else
{
//失败
status = false;
message = result.Item2;
break;
}
}
}
}
}
catch (Exception ex)
{
logger.Error(ex, "美团券核销发生异常");
status = false;
message = "美团券核核销发生错误,本次核销无效";
}
return new Tuple<bool, string>(status, message);
}
/// <summary>
/// 订单电子券核销
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, string> ConsumeElecCoupon(OrderObject orderObject)
{
bool status = true;
string message = string.Empty;
try
{
if (orderObject.Promotions != null)
{
var couponPromList = orderObject.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType.).ToList();
if (couponPromList.Count > 0)
{
string mobileNo = null;
string cardNo = null;
if (orderObject.Member != null)
{
mobileNo = orderObject.Member.Mobile;
if (orderObject.Member.CurrentCard != null)
{
cardNo = orderObject.Member.CurrentCard.CardNo;
}
}
//逐个核销
foreach (var coupon in couponPromList)
{
logger.Info("订单<{0}>发起核销电子券<{1}>,优惠金额<{2}>", orderObject.TradeNo, coupon.PlanNo, coupon.DiscountAmount);
var result = CardUtils.ConsumeElecCoupon(orderObject.TradeNo, coupon.PlanNo, mobileNo, cardNo, "saoma", (int)(orderObject.Amount * 100), (int)(coupon.DiscountAmount * 100));
logger.Info("订单<{0}>电子券<{1}>核销结果:{2}", orderObject.TradeNo, coupon.PlanNo, result.Item2);
if (result.Item1)
{
//成功
logger.Info("订单<{0}>电子券<{1}>核销成功", orderObject.TradeNo, coupon.PlanNo);
}
else
{
//失败
status = false;
message = result.Item2;
break;
}
}
}
}
//商品兑换券核销
if (orderObject.Items != null)
{
foreach (OrderItem item in orderObject.Items)
{
if (item.Promotions != null)
{
var couponPromList = item.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType.).ToList();
if (couponPromList.Count > 0)
{
string mobileNo = null;
string cardNo = null;
if (orderObject.Member != null)
{
mobileNo = orderObject.Member.Mobile;
if (orderObject.Member.CurrentCard != null)
{
cardNo = orderObject.Member.CurrentCard.CardNo;
}
}
//逐个核销
foreach (var coupon in couponPromList)
{
logger.Info("订单<{0}>发起核销电子券<{1}>,优惠金额<{2}>", orderObject.TradeNo, coupon.PlanNo, coupon.DiscountAmount);
var result = CardUtils.ConsumeElecCoupon(orderObject.TradeNo, coupon.PlanNo, mobileNo, cardNo, "saoma", (int)(orderObject.Amount * 100), (int)(coupon.DiscountAmount * 100));
logger.Info("订单<{0}>电子券<{1}>核销结果:{2}", orderObject.TradeNo, coupon.PlanNo, result.Item2);
if (result.Item1)
{
//成功
logger.Info("订单<{0}>电子券<{1}>核销成功", orderObject.TradeNo, coupon.PlanNo);
}
else
{
//失败
status = false;
message = result.Item2;
break;
}
}
}
}
}
}
//兑换券单独核销
}
catch (Exception ex)
{
logger.Error(ex, "电子券核销发生异常");
status = false;
message = "电子券核销发生异常";
}
return new Tuple<bool, string>(status, message);
}
#endregion
}
}