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.

1672 lines
77 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 System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using NLog;
using POSV.Entity;
using POSV.Utils;
using POSV.Entity.Pormotion;
using Newtonsoft.Json.Linq;
using System.Threading.Tasks;
namespace POSV.ShoppingCart
{
public class OrderUtils
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object _lock = new object();
private static OrderUtils _instance = null;
public static OrderUtils Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
_instance = new OrderUtils();
}
}
return _instance;
}
}
/// <summary>
/// 收银小票的前缀<1>,格式为YYMMDDHHMM+POS编码+4位流水号
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public Tuple<bool, string, string> GenerateTicketNoEx(int length = 4)
{
string serialNumber = string.Empty;
string message = string.Empty;
//获取消息中心配置
var messageCenter = Global.Instance.EnableServiceCenter;
//应用了全局票号
var globalTicketNo = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_TICKETNO_ENABLE, false);
if (messageCenter.Item1 && globalTicketNo)
{
//获取消息中心的流水号
var global = MessageCenterUtils.Instance.GetGlobalTicketNo(length);
//获取成功
if (global.Item1)
{
serialNumber = global.Item3;
//将消息中心的流水号更新到本次,避免获取失败时候本地流水相对连续
this.UpdateSerialNumber(ConfigConstant.GROUP_BUSINESS, ConfigConstant.VOUCHER_NO, serialNumber);
}
else
{
//获取流水号失败
serialNumber = string.Empty;
}
message = global.Item2;
}
else
{
//本地数据库获取
serialNumber = GenerateSerialNumber(4, ConfigConstant.GROUP_BUSINESS, ConfigConstant.VOUCHER_NO);
message = "本地流水号获取成功";
}
if (!string.IsNullOrEmpty(serialNumber))
{
string result = string.Format("1{0}{1}{2}", DateTime.Now.ToString("yyMMddHHmm"), Global.Instance.Authc.PosNo, serialNumber);
return new Tuple<bool, string, string>(true, message, result);
}
else
{
return new Tuple<bool, string, string>(false, message, string.Empty);
}
}
/// <summary>
/// 本地收银小票的前缀<1>,格式为YYMMDDHHMM+POS编码+4位流水号
/// </summary>
/// <returns></returns>
public string GenerateTicketNo()
{
string serialNumber = GenerateSerialNumber(4, ConfigConstant.GROUP_BUSINESS, ConfigConstant.VOUCHER_NO);
return string.Format("1{0}{1}{2}", DateTime.Now.ToString("yyMMddHHmm"), Global.Instance.Authc.PosNo, serialNumber);
}
/// <summary>
/// 支付单的前缀<2>,格式为YYMMDDHHMM+POS编码+4位流水号
/// </summary>
/// <returns></returns>
public string GeneratePayNo()
{
return string.Format("2{0}{1}{2}", DateTime.Now.ToString("yyMMddHHmm"), Global.Instance.Authc.PosNo, GenerateSerialNumber(4, ConfigConstant.GROUP_BUSINESS, ConfigConstant.PAY_NO));
}
/// <summary>
/// 交班小票的前缀<3>,格式为YYMMDDHHMM+POS编码+4位流水号
/// </summary>
/// <returns></returns>
public string GenerateShiftNo()
{
return string.Format("3{0}{1}{2}", DateTime.Now.ToString("yyMMddHHmm"), Global.Instance.Authc.PosNo, GenerateSerialNumber(4, ConfigConstant.GROUP_BUSINESS, ConfigConstant.SHIFT_NO));
}
/// <summary>
/// 生成班次编号
/// </summary>
/// <returns></returns>
public string GenerateBatchNo()
{
return string.Format("{0}", GenerateSerialNumber(4, ConfigConstant.GROUP_BUSINESS, ConfigConstant.BATCH_NO));
}
public void UpdateSerialNumber(string group, string key, string val)
{
lock (Global.Instance.SyncLock)
{
string sql = string.Format(SqlConstant.ConfigQueryByGroupAndKey, group, key);
Config config = null;
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
config = db.FirstOrDefault<Config>(sql);
if (config == null)
{
config = new Config();
config.Id = IdWorkerUtils.Instance.NextId();
config.TenantId = Global.Instance.Worker.TenantId;
config.Group = group;
config.Keys = key;
}
config.Values = val;
db.Save<Config>(config);
transaction.Complete();
}
}
}
}
/// <summary>
/// 生成系统流水号
/// </summary>
/// <returns></returns>
public string GenerateSerialNumber(int len, string group, string key)
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
string sql = string.Format(SqlConstant.ConfigQueryByGroupAndKey, group, key);
Config config = db.FirstOrDefault<Config>(sql);
int value = 0;
if (config != null)
{
int.TryParse(config.Values, out value);
if (value >= 9999)
{
value = 0;
}
}
else
{
config = new Config();
config.Id = IdWorkerUtils.Instance.NextId();
config.TenantId = Global.Instance.Worker.TenantId;
config.Group = group;
config.Keys = key;
}
Interlocked.Increment(ref value);
string result = value.ToString().PadLeft(len, '0'); //0003
config.Values = result;
db.Save<Config>(config);
transaction.Complete();
return result;
}
}
}
}
/// <summary>
/// 根据设置的位数获取最大数值
/// </summary>
/// <param name="len"></param>
/// <returns></returns>
private int getMaxValueByLength(int len)
{
int maxVal = 0;
switch (len)
{
case 1:
{
maxVal = 9;
}
break;
case 2:
{
maxVal = 99;
}
break;
case 3:
{
maxVal = 999;
}
break;
case 4:
{
maxVal = 9999;
}
break;
case 5:
default:
{
maxVal = 99999;
}
break;
}
return maxVal;
}
/// <summary>
/// 生成序号
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public Tuple<bool, string, string> GenerateOrderNoEx()
{
string serialNumber = string.Empty;
string message = string.Empty;
//获取消息中心配置
var messageCenter = Global.Instance.EnableServiceCenter;
//应用到全局序号
var globalOrderNo = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_ORDERNO_ENABLE, false);
if (messageCenter.Item1 && globalOrderNo)
{
//序号的设置长度
int length = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_ORDERNO_LENGTH, 0);
//每天生成的序号最小值
var initialValue = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_ORDERNO_BEGIN, 401);//Yao 2023/08/07 流水号更改为201开始
//获取消息中心的序号
var global = MessageCenterUtils.Instance.GetGlobalOrderNo(length, initialValue);
//获取成功
if (global.Item1)
{
serialNumber = global.Item3;
//将消息中心的流水号更新到本次,避免获取失败时候本地流水相对连续
this.UpdateSerialNumber(ConfigConstant.GROUP_BUSINESS, ConfigConstant.ORDER_NO, serialNumber);
}
else
{
//获取流水号失败
serialNumber = string.Empty;
}
message = global.Item2;
}
else
{
//本地数据库获取
serialNumber = GenerateOrderNo();
message = "本地序号获取成功";
}
if (!string.IsNullOrEmpty(serialNumber))
{
return new Tuple<bool, string, string>(true, message, serialNumber);
}
else
{
return new Tuple<bool, string, string>(false, message, string.Empty);
}
}
/// <summary>
/// 生成序号
/// </summary>
/// <returns></returns>
public string GenerateOrderNo()
{
lock (Global.Instance.SyncLock)
{
int val = 0;
//序号的设置长度
int len = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_ORDERNO_LENGTH, 0);
//根据设置的位数获取对应的最大值
int maxVal = getMaxValueByLength(len);
//Yao 2023/08/07 修改最大数为300
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
string sql = string.Format(SqlConstant.ConfigQueryByGroupAndKey, ConfigConstant.GROUP_BUSINESS, ConfigConstant.ORDER_NO);
Config config = db.FirstOrDefault<Config>(sql);
if (config != null)
{
var date = DateTime.Now;
DateTime.TryParse(config.ModifyDate, out date);
//DateTime currentTime = DateTime.Now;
//TimeSpan difference = currentTime - date;
//int differenceInMinutes = (int)difference.TotalMinutes;
//if (differenceInMinutes >= 0 && differenceInMinutes > 30)//Yao 2023/08/07 更改为不在一天相差30分钟就需要重新置
if (DateTime.Now.Date.CompareTo(date.Date) != 0)
{
//val = 0;
//Yao 2023/08/07 修改为200开始
val = 400;
}
else
{
int.TryParse(config.Values, out val);
}
}
else
{
config = new Config();
config.Id = IdWorkerUtils.Instance.NextId();
config.TenantId = Global.Instance.Worker.TenantId;
config.Group = ConfigConstant.GROUP_BUSINESS;
config.Keys = ConfigConstant.ORDER_NO;
}
Interlocked.Increment(ref val);
//循环使用
if (maxVal != 0 && val > maxVal)
{
//val = 1;
//Yao 2023/08/07 修改为401开始
val = 401;
}
//每天生成的序号最小值
var orderNoBegin = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_ORDERNO_BEGIN, 401);//Yao 2023/08/07 1改为401
//忽略最小值设置不正确
if (maxVal >= orderNoBegin && val < orderNoBegin)
{
val = orderNoBegin;
}
config.Values = val.ToString();
db.Save<Config>(config);
transaction.Complete();
return val.ToString().PadLeft(len, '0');
}
}
}
}
/// <summary>
/// 获取支付方式
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static List<PayMode> GetPayModeList()
{
lock (Global.Instance.SyncLock)
{
var result = new List<PayMode>();
using (var db = Global.Instance.OpenDataBase)
{
result = db.Query<PayMode>().ToList();
}
return result;
}
}
/// <summary>
/// 获取充值支付参数
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static List<RechargeParameter> GetRechargeParameterList()
{
lock (Global.Instance.SyncLock)
{
var result = new List<RechargeParameter>();
using (var db = Global.Instance.OpenDataBase)
{
result = db.Query<RechargeParameter>().ToList();
}
return result;
}
}
/// <summary>
///
/// </summary>
/// <param name="no"></param>
/// <returns></returns>
public static PayMode GetPayMode(string no)
{
return GetPayModeList().SingleOrDefault(x => no.Equals(x.No));
}
/// <summary>
///
/// </summary>
/// <param name="no"></param>
/// <returns></returns>
public static RechargeParameter GetRechargeParameter(List<string> signs)
{
RechargeParameter rechargeParameter = null;
foreach (string str in signs)
{
rechargeParameter = GetRechargeParameterList().SingleOrDefault(x => str.Equals(x.Sign));
if (rechargeParameter != null)
{
break;
}
}
return rechargeParameter;
}
/// <summary>
/// 获取支付方式
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static List<PayType> GetPayTypeList()
{
lock (Global.Instance.SyncLock)
{
var result = new List<PayType>();
using (var db = Global.Instance.OpenDataBase)
{
result = db.Query<PayType>().ToList();
}
return result;
}
}
/// <summary>
/// 获取现金
/// </summary>
/// <returns></returns>
public static PayMode GetDefaultPayMode()
{
return GetPayMode("01");
}
/// <summary>
/// 获取电话外卖挂账
/// </summary>
/// <returns></returns>
public static PayMode GetDeliveryPayMode()
{
return GetPayMode("20");
}
/// <summary>
/// 获取离线支付挂账
/// </summary>
/// <returns></returns>
public static PayMode GetOfflinePayMode()
{
return GetPayMode("31");
}
/// <summary>
/// 获取抹零
/// </summary>
/// <returns></returns>
public static PayMode GetMalingPayMode()
{
return GetPayMode("06");
}
/// <summary>
/// 获取美团券支付方式
/// </summary>
/// <returns></returns>
public static PayMode GetMeituanPayMode()
{
return GetPayMode("12");
}
/// <summary>
/// 将选择支付方式 转换 为 PayItem
/// </summary>
/// <returns></returns>
public static PayItem ToPayItem(PayMode type)
{
PayItem item = new PayItem();
item.Id = IdWorkerUtils.Instance.NextId();
item.TenantId = Global.Instance.Authc.TenantId;
item.PayNo = OrderUtils.Instance.GeneratePayNo();
item.ShiftNo = Global.Instance.BusinessPlanLog.No;
item.ShiftName = Global.Instance.BusinessPlanLog.Name;
item.Name = type.Name;
item.No = type.No;
item.PointFlag = type.PointFlag;
return item;
}
public static decimal MalingAmount(decimal receivableAmount, PayType type)
{
decimal maling = Convert.ToDecimal(0.00);
//前台结算以下付款方式全额付款时实款实收:微信、支付宝、银行钱包、储值卡
var allow = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_NOT_ALLOW_MANTISSA);
//会员卡 02
//银联卡 03
//支付宝 04
//微信支付 05
if (allow && type != null)
{
if ("02".Equals(type.No) || "03".Equals(type.No) || "04".Equals(type.No) || "05".Equals(type.No))
{
return maling;
}
}
//默认因数,不扩大不缩小
decimal factor = Convert.ToDecimal(1.00);
string mantissa = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_MANTISSA);
if (string.IsNullOrEmpty(mantissa))
{
mantissa = "4";//抹掉角以下的金额
}
//参与抹零计算的应收金额 = 整单金额合计 - 优惠合计
switch (mantissa)
{
case "0"://0-实款实收
factor = 1;
maling = 0;
break;
case "1"://1-元以下的金额四舍五入
factor = 1;
maling = receivableAmount * factor - Math.Floor(Math.Round(receivableAmount * factor, MidpointRounding.AwayFromZero));
break;
case "2"://2-角以下的金额四舍五入
factor = 10;
maling = receivableAmount * factor - Math.Floor(Math.Round(receivableAmount * factor, MidpointRounding.AwayFromZero));
break;
case "3"://3-抹掉元以下的金额,舍弃小数部分
factor = 1;
maling = receivableAmount * factor - Math.Floor(receivableAmount * factor);
break;
case "4"://4-抹掉角以下的金额
factor = 10;
maling = receivableAmount * factor - Math.Floor(receivableAmount * factor);
break;
default:
factor = 1;
maling = 0;
break;
}
return maling / factor;
}
/// <summary>
/// 转为折后单价保留4位小数位数
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public static decimal ToDiscountPrice(decimal num)
{
return DecimalUtils.ToRound(num, 4);
}
/// <summary>
/// 保留小数位数
/// </summary>
/// <param name="num">数字</param>
/// <param name="length">小数位数</param>
/// <returns></returns>
public static decimal ToRound(decimal num)
{
int scale = Global.Instance.GlobalConfigIntValue(ConfigConstant.CASHIER_PRICE_DIGIT, 2);
return DecimalUtils.ToRound(num, scale);
}
public static decimal ToRound(int num)
{
decimal result;
decimal.TryParse(num.ToString(), out result);
return ToRound(result);
}
/// <summary>
/// 输入的折扣率,转换为友好显示
/// 输入0.8转换为80
/// </summary>
/// <param name="rate"></param>
/// <returns></returns>
public static string ToDisplayRate(decimal rate)
{
int _rate = Convert.ToInt32(rate * 100);
return (int)(_rate / 10) + ((_rate % 10) == 0 ? "" : ("." + _rate % 10));
}
/// <summary>
/// 订单保存前校验
/// </summary>
/// <param name="orderObject"></param>
public void OrderObjectCheck(OrderObject orderObject)
{
logger.Info(JsonUtils.Serialize(orderObject));
int itemGroupCount = orderObject.Items.GroupBy(x => x.Id).ToList().Count;//订单明细数量
int itemCount = orderObject.Items.Count();//订单明细数量
if (itemGroupCount != itemCount)
{
logger.Info(string.Format("订单详情ID重复了:订单编号{0}", orderObject.TradeNo));
foreach (OrderItem item in orderObject.Items)
{
var newItemId = IdWorkerUtils.Instance.NextId();
//做法明细
if (item.Flavors.Count > 0)
{
//修改单品优惠明细完成时间,确保主单的完成时间和单品优惠明细完成时间一致
foreach (var f in item.Flavors)
{
f.ItemId = newItemId;
}
}
//单品优惠
if (item.Promotions.Count > 0)
{
//修改单品优惠明细完成时间,确保主单的完成时间和单品优惠明细完成时间一致
foreach (var p in item.Promotions)
{
p.ItemId = newItemId;
}
}
item.Id = newItemId;
}
}
}
/// <summary>
/// 保存整个订单
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public bool SaveOrderObject(OrderObject orderObject)
{
if (Global.Instance.IsStudyMode())
{
logger.Info("练习模式,订单<{0}>忽略入库保存", orderObject.TradeNo);
return false;
}
lock (Global.Instance.SyncLock)
{
Stopwatch sw = new Stopwatch();
sw.Start();
logger.Info("开始保存订单信息");
bool isException = false;
try
{
if (string.IsNullOrEmpty(orderObject.OrderNo))
{
string orderNo = string.Empty;
var order = OrderUtils.Instance.GenerateOrderNoEx();
if (order.Item1)
{
orderNo = order.Item3;
}
else
{
logger.Info("**采用本机序号**");
orderNo = OrderUtils.Instance.GenerateOrderNo();
}
//订单序号
orderObject.OrderNo = orderNo;
}
var finishDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//订单完成时间
orderObject.FinishDate = finishDate;
//判断门店是否是根据主食统计人数
if (Global.Instance.Worker.StoreInfo.StapleFlag == 1)
{
//获取订单中的主食数量
int people = 0;
foreach (var item in orderObject.Items)
{
if (item.TapleFlag == 1)
{
people += Convert.ToInt32(item.Quantity - item.RefundQuantity);
}
}
orderObject.People = people;
}
OrderObjectCheck(orderObject);
using (var db = Global.Instance.OpenDataBase)
{
using (var trans = db.GetTransaction())
{
//遍历获取成本价
foreach (OrderItem item in orderObject.Items)
{
ProductSpec productSpec = Global.ProductSpec._productSpecList?.Find(x => x.Id.Equals(item.SpecId));
if (productSpec != null)
{
item.CostPrice = productSpec.CostPrice;
}
else
{
item.CostPrice = 0.00M;
}
}
//1、保存主单信息
db.Insert<OrderObject>(orderObject);
//如果是外卖订单更新配送付款状态
if (orderObject.OrderType == OrderType. && orderObject.OrderStatus == OrderStatus.退)
{
string backSql = "update pos_wx_waimai_order set status = 1 where ticketNo ='" + orderObject.OrgTradeNo + "';";
db.Execute(backSql);
}
//整单优惠
if (orderObject.Promotions.Count > 0)
{
//修改整单优惠明细完成时间,确保主单的完成时间和整单优惠明细完成时间一致
foreach (var p in orderObject.Promotions)
{
p.FinishDate = finishDate;
}
//2、保存主单优惠信息
db.InsertBatch<PromotionOrder>(orderObject.Promotions);
}
//单品优惠
foreach (var item in orderObject.Items)
{
item.OrderId = orderObject.Id;
//修改订单明细完成时间,确保主单的完成时间和订单明细完成时间一致
item.FinishDate = finishDate;
//做法明细
if (item.Flavors.Count > 0)
{
//修改单品优惠明细完成时间,确保主单的完成时间和单品优惠明细完成时间一致
foreach (var f in item.Flavors)
{
f.FinishDate = finishDate;
}
//3、保存单品做法信息
db.InsertBatch<FlavorItem>(item.Flavors);
}
//支付分摊
if (item.ItemPayList != null && item.ItemPayList.Count > 0)
{
foreach (var p in item.ItemPayList)
{
p.FinishDate = finishDate;
}
//保存支付分摊明细
db.InsertBatch(item.ItemPayList);
}
//单品优惠
if (item.Promotions.Count > 0)
{
//修改单品优惠明细完成时间,确保主单的完成时间和单品优惠明细完成时间一致
foreach (var p in item.Promotions)
{
p.FinishDate = finishDate;
}
//4、保存单品优惠信息
db.InsertBatch<PromotionItem>(item.Promotions);
}
}
//5、保存单品信息
db.InsertBatch<OrderItem>(orderObject.Items);
//修改支付明细完成时间,确保主单的完成时间和支付明细完成时间一致
foreach (var pay in orderObject.Pays)
{
pay.FinishDate = finishDate;
#region subin 20231003 注释修改
//注释
//zhangy 2020-02-18 Add 档口结算信息赋默认值
//pay.Ext1 = "0";
//pay.Ext2 = "0";
//修改
pay.Ext1 = string.IsNullOrEmpty(pay.Ext1) ? "0" : pay.Ext1;
pay.Ext2 = string.IsNullOrEmpty(pay.Ext2) ? "0" : pay.Ext2;
#endregion
//添加支付汇总的必填字段
var payMode = OrderUtils.GetPayMode(pay.No);
if (payMode == null)
{
pay.IncomeFlag = 1;
pay.OtherRateType = 0;
pay.OtherRateValue = 0.00M;
}
else
{
pay.IncomeFlag = payMode.IncomeFlag;
pay.OtherRateType = payMode.OtherRateType;
pay.OtherRateValue = payMode.OtherRateValue;
//zhangy 2020-02-18 Add 添加结算参数计算
SetPayModeDiscount(pay, payMode);
////zhangy 2020-02-18 Add 添加结算参数计算
#region zhangy 2020-02-18 Add 添加结算参数计算
//string settlement = payMode.Settlement;
//logger.Info(">>>>>>结算参数:"+payMode.Settlement);
//if (!string.IsNullOrEmpty(settlement))
//{
// var lists = JsonUtils.Deserialize<List<PeriodDiscount>>(settlement);
// if(lists.Count > 0)
// {
// string date = Convert.ToDateTime(pay.FinishDate).ToString("yyyy-MM-dd");
// //查找最后一条
// var obj = lists.Where(x=> string.Compare(x.StartDate, date, StringComparison.Ordinal) <= 0 && string.Compare(x.EndDate, date, StringComparison.Ordinal) >= 0).LastOrDefault();
// if (obj != null)
// {
// //
// decimal deductionRate = obj.Discount;
// ///deductionRate
// pay.Ext1 = Convert.ToString(deductionRate);
// decimal chargeBack = DecimalUtils.ToRound(pay.PaidAmount * deductionRate,4);
// pay.Ext2 = Convert.ToString(chargeBack);
// }
// }
//}
#endregion
}
}
//6、保存支付明细信息
db.InsertBatch<PayItem>(orderObject.Pays);
//7、保存外送单信息
if (orderObject.Delivery != null)
{
//订单完成时间
orderObject.Delivery.FinishDate = finishDate;
db.Insert<OrderDelivery>(orderObject.Delivery);
}
//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);
}
//9、保存分账信息
#region subin 2023-07-24 add 分账信息
//var productIds = "";
////var accountIds = "";
//var splitStorePayLst = new List<SplitStorePay>();
//try
//{
// //var productIds=string.Join(this._orderObject.Items)
// var splitFoodList = new List<SplitFoodAccount>();
// var productIdList = orderObject.Items.Select(item => item.ProductId).Distinct();
// if (productIdList != null && productIdList.Count() > 0)
// {
// productIds = string.Join(",", productIdList);
// splitFoodList = db.Query<SplitFoodAccount>($"where goodId in ('{productIds.Replace(",", "','")}');").ToList();
// }
// //if (!string.IsNullOrEmpty(productIds))
// //{
// // //accountIds = string.Join(",", splitFoodList.Select(item => item.AccountId).Distinct());
// //}
// // var splitStoreIds = string.Join(",", splitFoodList.Select(item => item.ShopId).Distinct());
// #region MyRegion
// //foreach (var pay in orderObject.Pays)
// //{
// // foreach (var item in splitStoreIds.Split(','))
// // {
// // splitStorePayLst.Add(new SplitStorePay
// // {
// // ClientId = "",
// // ProgramId = "",
// // TenantId = pay.TenantId,
// // StoreId = orderObject.StoreId,
// // SplitStoreId = item,
// // StoreNo = orderObject.StoreNo,
// // PayNo = pay.PayNo,
// // TicketId = "",
// // BusNo = pay.TradeNo,
// // PayTypeNo = pay.No,
// // PayType = pay.Name,
// // Paid = 0,
// // Rchange = 0,
// // Money = 0,
// // OverAmount = 0,
// // VoucherNo = pay.TradeVoucherNo,
// // PayDate = "",
// // CardNo = "",
// // IncomeFlag = pay.IncomeFlag,
// // OtherRateType = pay.OtherRateType,
// // OtherRateValue = pay.OtherRateValue,
// // OtherRate = pay.OtherRate,
// // PayClientType = -1,
// // PayChannel = (int)pay.PayChannel,
// // DeductionRate = 0,
// // ChargeBack = 0,
// // Memo = orderObject.Ext1,
// // IsInvalid = "0",
// // OrderId = pay.OrderId,
// // PayId = pay.Id
// // });
// // }
// //}
// //foreach (var item in orderObject.Items)
// //{
// // foreach (var s in splitStoreIds.Split(','))
// // {
// // //分店的商品Id集合
// // var splitProductIds = splitFoodList.Where(m => m.ShopId == s).Select(m => m.ProductId).Distinct();
// // //item.ItemPayList.Where()
// // }
// //}
// #endregion
// var splitShopList = db.Fetch<SplitShopAccount>();
// var _fromBizUserId = "";
// if (!string.IsNullOrEmpty(Global.Instance.Worker.StoreInfo.Ext1))
// {
// _fromBizUserId = JsonUtils.Deserialize<StoreAllinParams>(Global.Instance.Worker.StoreInfo.Ext1).BizUserId;
// }
// if (orderObject.OrderType == OrderType.堂食 || orderObject.OrderType == OrderType.外带 || orderObject.OrderType == OrderType.餐桌)
// {
// int i = 0;
// foreach (var item in orderObject.Items)
// {
// foreach (var p in item.ItemPayList)
// {
// var s = splitFoodList.FirstOrDefault(m => m.ProductId == p.ProductId);
// if (s != null)
// {
// //var _fromBizUser = splitShopList.FirstOrDefault(m => m.Id == s.ShopId);
// //_fromBizUserId = _fromBizUser != null ? _fromBizUser.BizUserId : "";
// var pay = orderObject.Pays.FirstOrDefault(m => m.Id == p.PayId);
// var ssp = new SplitStorePay
// {
// Id = IdWorkerUtils.Instance.NextId(),
// ClientId = "",
// ProgramId = "",
// TenantId = p.TenantId,
// StoreId = orderObject.StoreId,
// SplitStoreId = s.ShopId,
// StoreNo = orderObject.StoreNo,
// PayNo = pay.PayNo,
// TicketId = "",
// BusNo = pay.TradeNo,
// PayTypeNo = p.No,
// PayType = p.Name,
// Paid = p.ShareAmount,
// Rchange = 0,
// Money = p.ShareAmount,
// OverAmount = 0,
// VoucherNo = pay.TradeVoucherNo,
// PayDate = pay.PayTime,
// CardNo = pay.CardNo,
// IncomeFlag = pay.IncomeFlag,
// OtherRateType = pay.OtherRateType,
// OtherRateValue = pay.OtherRateValue,
// OtherRate = pay.OtherRate,
// PayClientType = -1,
// PayChannel = (int)pay.PayChannel,
// DeductionRate = 0,
// ChargeBack = 0,
// Memo = orderObject.Ext1,
// IsInvalid = "0",
// OrderId = pay.OrderId,
// OrderItemId = item.Id,
// PayId = p.PayId,
// PayItemId = p.Id,
// SyncStatus = 0,
// UploadErrors = 0,
// UploadStatus = 0,
// UploadMessage = "",
// ProductId = item.ProductId,
// RefundAmount = 0,
// FromBizUserld = _fromBizUserId,
// OrderType = (int)orderObject.OrderType,
// IsRefund = 0,
// Quantity = (orderObject.OrgTradeNo != null && !"".Equals(orderObject.OrgTradeNo)) ? 0 : item.Quantity,
// RefundQuantity = (orderObject.OrgTradeNo != null && !"".Equals(orderObject.OrgTradeNo)) ? item.MiddleRefundQuantity : 0,
// };
// if (i == 0)
// {
// ssp.fee = string.IsNullOrEmpty(pay.Ext2) ? 0 : Convert.ToDecimal(pay.Ext2);
// //ssp.Paid = ssp.Paid - ssp.fee;
// }
// splitStorePayLst.Add(ssp);
// }
// i++;
// }
// }
// }
// else if (orderObject.OrderType == OrderType.微信点餐)
// {
// int i = 0;
// foreach (var pay in orderObject.Pays)
// {
// foreach (var item in orderObject.Items)
// {
// var s = splitFoodList.FirstOrDefault(m => m.ProductId == item.ProductId);
// if (s != null)
// {
// //var _fromBizUser = splitShopList.FirstOrDefault(m => m.Id == s.ShopId);
// //_fromBizUserId = _fromBizUser != null ? _fromBizUser.BizUserId : "";
// var ssp = new SplitStorePay
// {
// Id = IdWorkerUtils.Instance.NextId(),
// ClientId = "",
// ProgramId = "",
// TenantId = item.TenantId,
// StoreId = orderObject.StoreId,
// SplitStoreId = s.ShopId,
// StoreNo = orderObject.StoreNo,
// PayNo = pay.PayNo,
// TicketId = "",
// BusNo = pay.TradeNo,
// PayTypeNo = pay.No,
// PayType = pay.Name,
// Paid = item.TotalReceivableAmount,
// Rchange = 0,
// Money = item.TotalReceivableAmount,
// OverAmount = 0,
// VoucherNo = pay.TradeVoucherNo,
// PayDate = pay.PayTime,
// CardNo = pay.CardNo,
// IncomeFlag = pay.IncomeFlag,
// OtherRateType = pay.OtherRateType,
// OtherRateValue = pay.OtherRateValue,
// OtherRate = pay.OtherRate,
// PayClientType = -1,
// PayChannel = (int)pay.PayChannel,
// DeductionRate = 0,
// ChargeBack = 0,
// Memo = orderObject.Ext1,
// IsInvalid = "0",
// OrderId = orderObject.Id,
// PayId = pay.Id,
// SyncStatus = 0,
// UploadErrors = 0,
// UploadStatus = 0,
// UploadMessage = "",
// ProductId = item.ProductId,
// OrderItemId = item.Id,
// PayItemId = "",
// RefundAmount = 0,
// //FromBizUserld = JsonUtils.Deserialize<StoreAllinParams>(Global.Instance.Worker.StoreInfo.Ext1).BizUserId,
// FromBizUserld = _fromBizUserId,
// OrderType = (int)orderObject.OrderType,
// IsRefund = 0
// };
// splitStorePayLst.Add(ssp);
// if (i == 0)
// {
// ssp.fee = string.IsNullOrEmpty(pay.Ext2) ? 0 : Convert.ToDecimal(pay.Ext2);
// //ssp.Paid = ssp.Paid - ssp.fee;
// }
// }
// i++;
// }
// }
// }
// var splitStoreProductLst = splitStorePayLst.Select(item => item.ProductId).Distinct().ToList();
// if (productIdList.Count() > splitStorePayLst.Count)
// {
// logger.Info($"订单[{orderObject.TradeNo}]分账数据异常!,订单菜品数量({productIds}>分店关联菜品数量({string.Join(",", splitStoreProductLst)})");
// }
// if (splitStorePayLst.Count > 0)
// {
// //增加订单的分账总记录
// var pssp = new SplitStorePay
// {
// Id = IdWorkerUtils.Instance.NextId(),
// ClientId = "",
// ProgramId = "",
// TenantId = Global.Instance.Worker.TenantId,
// StoreId = Global.Instance.Worker.StoreId,
// SplitStoreId = "",
// StoreNo = Global.Instance.Worker.StoreInfo.No,
// PayNo = splitStorePayLst[0].PayNo,
// TicketId = "",
// BusNo = orderObject.TradeNo,
// PayTypeNo = splitStorePayLst.Where(m => m.PayTypeNo == "50").Count() > 0 ? "50" : "0",
// PayType = splitStorePayLst.Where(m => m.PayTypeNo == "50").Count() > 0 ? "通联支付" : "",
// Paid = splitStorePayLst.Sum(m => m.Paid),
// Rchange = splitStorePayLst.Sum(m => m.Rchange),
// Money = splitStorePayLst.Sum(m => m.Money),
// OverAmount = splitStorePayLst.Sum(m => m.OverAmount),
// VoucherNo = splitStorePayLst[0].VoucherNo,
// PayDate = splitStorePayLst[0].PayDate,
// CardNo = "",
// IncomeFlag = 1,
// OtherRateType = 0,
// OtherRateValue = 0,
// OtherRate = splitStorePayLst.Sum(m => m.OtherRate),
// PayClientType = -1,
// PayChannel = 50,
// DeductionRate = 0,
// ChargeBack = splitStorePayLst.Sum(m => m.ChargeBack),
// Memo = orderObject.Ext1,
// IsInvalid = "0",
// OrderId = orderObject.Id,
// PayId = "",
// SyncStatus = 1,
// UploadErrors = 0,
// UploadStatus = 0,
// UploadMessage = "",
// ProductId = "",
// OrderItemId = "",
// PayItemId = "",
// RefundAmount = splitStorePayLst.Sum(m => m.RefundAmount),
// //FromBizUserld = JsonUtils.Deserialize<StoreAllinParams>(Global.Instance.Worker.StoreInfo.Ext1).BizUserId,
// FromBizUserld = _fromBizUserId,
// OrderType = (int)orderObject.OrderType,
// IsRefund = 0,
// fee = splitStorePayLst.Sum(m => m.fee)
// };
// foreach (var item in splitStorePayLst)
// {
// item.Pid = pssp.Id;
// }
// splitStorePayLst.Add(pssp);
// db.InsertBatch<SplitStorePay>(splitStorePayLst);
// logger.Info("有需要上传的营业分账数据,isHaveUpLoadSplitPay = true");
// Global.isHaveUpLoadSplitPay = true;
// }
// else
// {
// logger.Info($"订单[{orderObject.Id}],没有要分账的菜品信息,将不保存分账信息。");
// }
//}
//catch (Exception ex)
//{
// logger.Error(ex, $"保存订单的分账信息异常单号ID{orderObject.Id}");
//}
#endregion
//更新是否有订单需要上传的状态
logger.Info("有需要上传的营业数据,isHaveUpLoadTicket = true");
Global.isHaveUpLoadTicket = true;
Global.isHaveBurdenTicket = true;
logger.Info("有需要同步到服务中心的订单,isHaveCenterTicket = true");
Global.isHaveCenterTicket = true;
//订单保存成功更新核销状态
logger.Info("单号:[{0}]更改扫码支付状态 payStatus==>1......开始", string.Format("{0}_{1}", Global.Instance.BusinessPlanLog.StoreNo, orderObject.TradeNo));
string sql = "update pos_saoma_pay_ticket set payStatus =1 where orderNo = '{0}'";
sql = string.Format(sql, string.Format("{0}_{1}", Global.Instance.BusinessPlanLog.StoreNo, orderObject.TradeNo));
db.Execute(sql, null);
logger.Info("单号:[{0}]更改扫码支付状态 payStatus==>1......更新成功", string.Format("{0}_{1}", Global.Instance.BusinessPlanLog.StoreNo, orderObject.TradeNo));
trans.Complete();
}
}
}
catch (Exception ex)
{
isException = true;
logger.Error(ex, "存储订单信息异常");
}
finally
{
sw.Stop();
logger.Info("保存订单信息结束<{0}>", sw.ElapsedMilliseconds);
//subin 20231025 注释,分账由实时改为交班时分账
//Task.Factory.StartNew(() =>
//{
// SplitPayUtils.Instance.SaveSplitPayInfo(orderObject);
//});
//subin 20231025 注释 end
}
return isException;
}
}
//zhangy 2020-02-18 Add 添加结算参数计算
public static void SetPayModeDiscount(PayItem pay, PayMode payMode)
{
var settlement = payMode.Settlement;
logger.Info(">>>>>>结算参数:" + JsonUtils.Serialize(settlement));
#region subin 20231003 注释修改
//注释
//zhangy 2020-02-18 Add 档口结算信息赋默认值
//pay.Ext1 = "0";
//pay.Ext2 = "0";
//修改
pay.Ext1 = string.IsNullOrEmpty(pay.Ext1) ? "0" : pay.Ext1;
pay.Ext2 = string.IsNullOrEmpty(pay.Ext2) ? "0" : pay.Ext2;
#endregion
if (settlement != null && settlement.Count > 0)
{
//var lists = JsonUtils.Deserialize<List<PeriodDiscount>>(settlement);
string date = Convert.ToDateTime(pay.FinishDate).ToString("yyyy-MM-dd");
//查找最后一条
var obj = settlement.Where(x => string.Compare(x.StartDate, date, StringComparison.Ordinal) <= 0 && string.Compare(x.EndDate, date, StringComparison.Ordinal) >= 0).LastOrDefault();
if (obj != null)
{
//
decimal deductionRate = obj.Discount;
///deductionRate
pay.Ext1 = Convert.ToString(deductionRate);
decimal chargeBack = DecimalUtils.ToRound(pay.PaidAmount * deductionRate, 4);
pay.Ext2 = Convert.ToString(chargeBack);
}
}
}
/// <summary>
/// 获取未上传记录的天数
/// </summary>
/// <param name="tradeNo"></param>
/// <returns></returns>
public static List<string> GetUnUpLoadDay()
{
List<string> newList = new List<string>();
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select strftime('%Y-%m-%d',finishDate) from pos_order where syncStatus = 0 ");
sqlBuld.Append(" and storeId = '{0}' ");
sqlBuld.Append(" group by 1 ");
string sql = string.Format(sqlBuld.ToString(), Global.Instance.Authc.StoreId);
newList = db.Query<string>(sql).ToList();
if (newList == null)
{
newList = new List<string>();
}
}
}
catch (Exception ex)
{
logger.Error(ex, "获取未上传数据天数失败");
}
return newList;
}
public static OrderObject getOrderObjectByTranNo(string tradeNo)
{
OrderObject orderObject = null;
try
{
//单据明细
var items = new List<OrderItem>();
//支付明细
var pays = new List<PayItem>();
//主单优惠明细
var orderPromotions = new List<PromotionOrder>();
//做法明细
var flavors = new List<FlavorItem>();
//单品优惠明细
var itemPromotions = new List<PromotionItem>();
//单品分摊明细
var itemPayList = new List<OrderItemPay>();
//电话外送
OrderDelivery orderDelivery = null;
using (var db = Global.Instance.OpenDataBase)
{
//主单数据
orderObject = db.FirstOrDefault<OrderObject>("where tradeNo =@0;", tradeNo);
if (orderObject == null)
{
return null;
}
var condition = " where orderId = '" + orderObject.Id + "';";
logger.Debug(condition);
//单据明细
items = db.Query<OrderItem>(condition).ToList();
logger.Debug("单据明细<{0}>", (items != null ? items.Count.ToString() : "*****"));
//支付明细
pays = db.Query<PayItem>(condition).ToList();
logger.Debug("支付明细<{0}>", (pays != null ? pays.Count.ToString() : "*****"));
//主单优惠明细
orderPromotions = db.Query<PromotionOrder>(condition).ToList();
logger.Debug("主单优惠明细<{0}>", (orderPromotions != null ? orderPromotions.Count.ToString() : "*****"));
//做法明细
flavors = db.Query<FlavorItem>(condition).ToList();
logger.Debug("做法明细<{0}>", (flavors != null ? flavors.Count.ToString() : "*****"));
//单品优惠明细
itemPromotions = db.Query<PromotionItem>(condition).ToList();
logger.Debug("单品优惠明细<{0}>", (itemPromotions != null ? itemPromotions.Count.ToString() : "*****"));
//外送明细
orderDelivery = db.FirstOrDefault<OrderDelivery>(condition);
//单品分摊明细
itemPayList = db.Query<OrderItemPay>(condition).ToList();
}
//外送详情
orderObject.Delivery = orderDelivery;
//订单明细
orderObject.Items = items;
//将支付方式附加到主单
orderObject.Pays = pays;
//将主单优惠附加到主单
orderObject.Promotions = orderPromotions;
foreach (var item in orderObject.Items)
{
List<FlavorItem> flavorsList = flavors.FindAll(x => x.ItemId == item.Id);
if (orderObject.OrderStatus == OrderStatus.退)
{
foreach (FlavorItem flavorItem in flavorsList)
{
flavorItem.isBackTicket = true;
}
}
item.Flavors = flavorsList;
item.Promotions = itemPromotions.FindAll(x => x.ItemId == item.Id);
//单品支付方式分摊
if (itemPayList != null && itemPayList.Count > 0 && itemPayList.Exists(x => x.ItemId == item.Id))
{
item.ItemPayList = itemPayList.FindAll(x => x.ItemId == item.Id);
}
else
{
item.ItemPayList = new List<OrderItemPay>();
}
}
}
catch (Exception ex)
{
logger.Error(ex, "获取订单信息异常");
}
return orderObject;
}
/// <summary>
/// 保存挂单信息
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
public Tuple<bool, OrderTemp> SaveOrderTemp(OrderObject orderObject)
{
lock (Global.Instance.SyncLock)
{
OrderTemp temp = null;
Stopwatch sw = new Stopwatch();
sw.Start();
logger.Info("开始保存挂单数据");
bool isSucc = false;
try
{
temp = new OrderTemp();
temp.Id = IdWorkerUtils.Instance.NextId();
temp.TenantId = orderObject.TenantId;
temp.StoreId = Global.Instance.Worker.StoreId;
temp.OrderId = orderObject.Id;
temp.TradeNo = orderObject.TradeNo;
temp.TableNo = orderObject.TableNo;
temp.TableName = orderObject.TableName;
temp.Paid = orderObject.PaidAmount;
temp.TotalQuantity = orderObject.TotalQuantity;
temp.WorkerName = Global.Instance.Worker.Name;
temp.WorkerNo = Global.Instance.Worker.No;
temp.OrderJson = JsonUtils.Serialize(orderObject);
temp.SaleDate = orderObject.SaleDate;
temp.PosNo = Global.Instance.Authc.PosNo;
using (var db = Global.Instance.OpenDataBase)
{
using (var trans = db.GetTransaction())
{
db.Save(temp);
trans.Complete();
}
}
isSucc = true;
}
catch (Exception ex)
{
logger.Error(ex, "保存挂单数据异常");
isSucc = false;
}
finally
{
sw.Stop();
logger.Info("保存挂单结束<{0}>", sw.ElapsedMilliseconds);
}
return new Tuple<bool, OrderTemp>(isSucc, temp);
}
}
}
}