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.

2783 lines
141 KiB
C#

9 months ago
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Controls;
using DevComponents.DotNetBar.SuperGrid;
using POS.Language.Language;
using POSV.Card;
using POSV.Component;
using POSV.Dianping;
using POSV.Entity;
using POSV.Helper;
using POSV.HttpApi;
using POSV.MessageEvent;
using POSV.PayApi;
using POSV.Payment.AllinPay.Models.ResponseModels;
using POSV.Payment.Saobei;
using POSV.Payment.Saobei.Parameter;
using POSV.Printer;
using POSV.Proxy.MIS;
using POSV.Proxy.ThirdPartyPayMent;
using POSV.ServiceCenter;
using POSV.Shift;
using POSV.ShoppingCart;
using POSV.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace POSV.Report
{
public partial class SaleDetail : BusinessForm
{
public int orderType = -1;
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
[DllImport(@"landiccbmispos\MisPos.dll", EntryPoint = "BankTrans")]
public static extern Int32 BankTrans(byte[] ptrIn, byte[] ptrOut);
public SaleDetail()
{
InitializeComponent();
this.controlBox1.Text = "营业单据查询";
this.controlBox1.ShowApplicationVersion = false;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
DefaultGridStyle.setDefaultGridStyle(this.salesListTable, false, false, GridLines.Horizontal, ColumnHeaderClickBehavior.SortAndReorder);
DefaultGridStyle.setDefaultGridStyle(this.productListTable);
DefaultGridStyle.setDefaultGridStyle(this.productMakeListTable);
DefaultGridStyle.setDefaultGridStyle(this.payListTable);
this.startPicker.Value = DateTime.Parse(Global.Instance.BusinessPlan.StartTimeSimple);
this.endPicker.Value = DateTime.Parse(Global.Instance.BusinessPlan.EndTimeSimple);
this.checkBoxX1.Checked = true;
this.Focus();
this.txtTradeNo.Focus();
this.txtTradeNo.SelectAll();
this.ActiveControl = this.txtTradeNo;
//第一步获取订单列表
List<BusinessTicket> detail = getBusTicketList(this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"), this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"));
salesListTable.PrimaryGrid.DataSource = detail;
#region subin 20231025 分账由实时改为交班时分账
MsgEvent.RemoveListener(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify);
MsgEvent.Receive(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify);
#endregion
}
public List<BusinessTicket> getBusTicketList(string startTime, string endTime)
{
List<BusinessTicket> list = null;
string busNo = StringUtils.GetString(this.txtTradeNo.Text);
string orderNo = StringUtils.GetString(this.txtOrderNo.Text);
//20230925 subin 增加桌号查询
string tableNo = StringUtils.GetString(this.txtTableNo.Text);
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select * ");
sqlBuld.Append(" from pos_order ");
sqlBuld.Append(" where finishDate >= '{0}' and finishDate <= '{1}'");
if (busNo != null && !"".Equals(busNo))
{
sqlBuld.Append(" and tradeNo like '%" + busNo + "%' ");
}
if (orderType >= 0)
{
sqlBuld.Append(" and orderType = " + orderType + " ");
}
if (!string.IsNullOrEmpty(orderNo))
{
sqlBuld.Append(" and orderNo = " + orderNo + " ");
}
//20230925 subin 增加桌号查询
if (!string.IsNullOrEmpty(tableNo))
{
sqlBuld.Append(" and tableNo = " + tableNo + " ");
}
sqlBuld.Append(" order by finishDate desc");
string sql = string.Format(sqlBuld.ToString(), startTime, endTime);
list = db.Query<BusinessTicket>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (list == null)
{
list = new List<BusinessTicket>();
}
foreach (BusinessTicket ticket in list)
{
if (!string.IsNullOrEmpty(ticket.OrgTradeNo))
{
ticket.OrderStatus = 2;
}
}
return list;
}
public List<OrderProduct> getOrderProductListByTradeNo(string tradeNo)
{
List<OrderProduct> list = null;
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select * ");
sqlBuld.Append(" from pos_order_item ");
sqlBuld.Append(" where tradeNo = '{0}' ");
sqlBuld.Append(" order by orderNo ");
string sql = string.Format(sqlBuld.ToString(), tradeNo);
list = db.Query<OrderProduct>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (list == null)
{
list = new List<OrderProduct>();
}
return list;
}
public List<OrderPay> getOrderPayListByTradeNo(string tradeNo)
{
List<OrderPay> list = null;
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select * ");
sqlBuld.Append(" from pos_order_pay ");
sqlBuld.Append(" where tradeNo = '{0}' ");
string sql = string.Format(sqlBuld.ToString(), tradeNo);
list = db.Query<OrderPay>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (list == null)
{
list = new List<OrderPay>();
}
return list;
}
public List<OrderMake> getOrderMakeListByItemId(string itemId)
{
List<OrderMake> list = null;
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select * ");
sqlBuld.Append(" from pos_order_item_make ");
sqlBuld.Append(" where itemId = '{0}' ");
string sql = string.Format(sqlBuld.ToString(), itemId);
list = db.Query<OrderMake>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (list == null)
{
list = new List<OrderMake>();
}
return list;
}
public List<OrderInfo> getOrderInfoListByItemId(string orderId)
{
List<OrderInfo> list = null;
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuld = new StringBuilder();
sqlBuld.Append(" select * ");
sqlBuld.Append(" from pos_order_item_promotion ");
sqlBuld.Append(" where orderId = '{0}' ");
string sql = string.Format(sqlBuld.ToString(), orderId);
list = db.Query<OrderInfo>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (list == null)
{
list = new List<OrderInfo>();
}
return list;
}
private void OnControlBoxCloseClick(object sender, EventArgs e)
{
OnCloseTouchClick(sender, e);
}
private void OnCloseTouchClick(object sender, EventArgs e)
{
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
private void OnTicketRowActivated(object sender, GridRowActivatedEventArgs e)
{
GridPanel grid = e.GridPanel;
if (e.NewActiveRow != null)
{
productListTable.PrimaryGrid.Rows.Clear();
payListTable.PrimaryGrid.Rows.Clear();
//先清除其他表数据
GridRow row = e.NewActiveRow as GridRow;
grid.SetSelected(e.NewActiveRow, false);
grid.SetActiveRow(e.NewActiveRow);
var tradeNo = row.Cells["busNo"].Value.ToString();
List<OrderProduct> products = getOrderProductListByTradeNo(tradeNo);
productListTable.PrimaryGrid.DataSource = products;
List<OrderPay> pays = getOrderPayListByTradeNo(tradeNo);
payListTable.PrimaryGrid.DataSource = pays;
}
else
{
productListTable.PrimaryGrid.Rows.Clear();
payListTable.PrimaryGrid.Rows.Clear();
}
}
private void OnOrderRowActivated(object sender, GridRowActivatedEventArgs e)
{
GridPanel grid = e.GridPanel;
if (e.NewActiveRow != null)
{
productMakeListTable.PrimaryGrid.Rows.Clear();
//先清除其他表数据
GridRow row = e.NewActiveRow as GridRow;
grid.SetSelected(e.NewActiveRow, false);
grid.SetActiveRow(e.NewActiveRow);
var itemId = row.Cells["itemId"].Value.ToString();
List<OrderMake> makes = getOrderMakeListByItemId(itemId);
productMakeListTable.PrimaryGrid.DataSource = makes;
}
else
{
productMakeListTable.PrimaryGrid.Rows.Clear();
}
}
private void btn_exit_Click(object sender, EventArgs e)
{
OnCloseTouchClick(sender, e);
}
private void btn_time_Click(object sender, EventArgs e)
{
var obj = sender as ButtonX;
var typeStr = obj.Tag as string;
var type = (ReportQuickDate)Enum.Parse(typeof(ReportQuickDate), typeStr);
var res = DateTimeUtils.CalculateBusinessPlanDate(type, this.startPicker.Value, this.endPicker.Value);
this.startPicker.Value = res.Item1;
this.endPicker.Value = res.Item2;
List<BusinessTicket> detail = getBusTicketList(this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"), this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"));
salesListTable.PrimaryGrid.DataSource = detail;
}
/// <summary>
/// 查询按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_query_Click(object sender, EventArgs e)
{
QueryTicket();
}
public void QueryTicket()
{
//获取选择的订单
List<BusinessTicket> detail = getBusTicketList(this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"), this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"));
salesListTable.PrimaryGrid.DataSource = detail;
}
private void RefundOrderCheck()
{
var panel = salesListTable.PrimaryGrid;
if (panel.ActiveRow == null)
{
this.ShowToastNotify(this, LangProxy.ToLang("请选择要操作的单据"));
return;
}
//练习模式不能进行退单操作
if (Global.Instance.IsStudyMode())
{
this.ShowToastNotify(this, LangProxy.ToLang("练习模式不能退单!"));
return;
}
//提示
var row = panel.ActiveRow as GridRow;
var tradeNo = row.Cells["busNo"].Value.ToString();
bool allowBackPayHistory = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_BACKPAY_HISTORY, true);
//不允许退历史单据
if (!allowBackPayHistory)
{
//判断是否是隔天的单据
var finishDate = row.Cells["finishDate"].Value.ToString();
string ticketDate = DateTime.Parse(finishDate).ToString("yyyy-MM-dd");
if (!ticketDate.Equals(DateTime.Now.ToString("yyyy-MM-dd")))
{
//不是同一天,查询设置
this.ShowToastNotify(this, LangProxy.ToLang("只能退款当日单据!"));
return;
}
}
OrderObject orderObject = OrderUtils.getOrderObjectByTranNo(tradeNo);
bool allowMemberBackTicket = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_MEMBER_BACKTICKET, false);
//不允许退有会员消费的单据
if (allowMemberBackTicket)
{
bool isCoupon = false;
if (orderObject.Promotions != null)
{
var couponPromList = orderObject.Promotions.FindAll(x => x.PromotionType == PromotionType. || x.PromotionType == PromotionType.).ToList();
if (couponPromList.Count > 0)
{
isCoupon = true;
}
}
if (orderObject.Items != null)
{
foreach (OrderItem item in orderObject.Items)
{
if (item.Promotions != null)
{
var couponPromList = item.Promotions.FindAll(x => x.PromotionType == PromotionType.).ToList();
if (couponPromList.Count > 0)
{
isCoupon = true;
}
}
}
}
if (isCoupon)
{
DialogForm dialog = new DialogForm(LangProxy.ToLang("退款提醒"), LangProxy.ToLang("该订单使用了电子卡券,不允许退单!"), MessageBoxIcon.Warning, MessageBoxButtons.OK);
dialog.TopLevel = true;
dialog.ShowDialog(this);
return;
}
}
if (orderObject.OrgTradeNo != null && !"".Equals(orderObject.OrgTradeNo) && orderObject.Items.Sum(x => x.Quantity - x.MiddleRefundQuantity) == decimal.Zero)
{
this.ShowToastNotify(this, LangProxy.ToLang("订单已完全退单"));
return;
}
var causeForm = new RefundCauseSelectForm();
causeForm.AcceptButtonClick += (o, args) =>
{
var partRefundCount = orderObject.Pays.FindAll(x => x.No == "01" || x.No == "02" || ((x.PayChannel == PayChannelEnum. || x.PayChannel == PayChannelEnum. || x.PayChannel == PayChannelEnum.) && (x.No == "04" || x.No == "05" || x.No == "07")) || x.No == "50").Count;
if (partRefundCount != orderObject.Pays.Count)
{
RefundOrder(tradeNo, args.Data.ToString(), null);
}
else
{
var refundItemForm = new RefundItemForm();
refundItemForm.RefreshUi(orderObject);
refundItemForm.AcceptButtonClick += (o2, args2) =>
{
if (args2.Data is List<OrderItem> refundItems)
{
RefundOrder(tradeNo, args.Data.ToString(), refundItems);
}
};
refundItemForm.CancelButtonClick += (o2, args2) => { };
TransparentForm trans1 = new TransparentForm(this, refundItemForm);
trans1.Show(this);
}
};
var trans = new TransparentForm(this, causeForm);
trans.Show(this);
}
private void RefundOrder(string tradeNo, string refundCause, List<OrderItem> refundItems)
{
Task.Factory.StartNew(() =>
{
return DoRefund(tradeNo, refundCause, refundItems);
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException());
}
else
{
if (!task.Result.Item1)
{
this.ShowToastNotify(this, LangProxy.ToLang("退款失败!"));
LOGGER.Info("退单失败![{0}]", task.Result.Item2);
if (this.IsDisposed || !this.IsHandleCreated) return;
this.Invoke(new Action(() =>
{
DialogForm dialog = new DialogForm(LangProxy.ToLang("退款提醒"), LangProxy.ToLang("退款失败!") + task.Result.Item2, MessageBoxIcon.Warning, MessageBoxButtons.OK);
dialog.TopLevel = true;
dialog.ShowDialog(this);
}));
}
else
{
this.ShowToastNotify(this, "退单成功!");
LOGGER.Info("退单交易完成");
if (this.IsDisposed || !this.IsHandleCreated) return;
this.Invoke(new Action(() =>
{
DialogForm dialog = new DialogForm(LangProxy.ToLang("退款提醒"), LangProxy.ToLang("退款成功(金额原路退回)!"), MessageBoxIcon.Warning, MessageBoxButtons.OK);
dialog.TopLevel = true;
dialog.ShowDialog(this);
QueryTicket();
}));
}
}
});
}
/// <summary>
/// 退款,全部按照支付分摊退款
/// </summary>
/// <param name="refundOrderObject"></param>
/// <param name="orgOrderObject"></param>
/// <returns></returns>
private List<PayItem> CalculatePay(OrderObject refundOrderObject, OrderObject orgOrderObject)
{
var newPayList = new List<PayItem>();
foreach (var item in refundOrderObject.Items)
{
if (item.RowState == OrderRowState.)
{
continue;
}
//转正
var tempTotalReceivableAmount = 0 - item.TotalReceivableAmount;
//原订单明细项
var oldOrderItem = orgOrderObject.Items.FirstOrDefault(x => x.Id == item.OrgItemId);
if (oldOrderItem != null && oldOrderItem.ItemPayList != null && oldOrderItem.ItemPayList.Count > 0)
{
//转正
bool allRe = false;
if (oldOrderItem.Quantity == oldOrderItem.MiddleRefundQuantity)
{
//本明细项全退,所有支付都退掉
allRe = true;
}
//明细项
foreach (var pay in oldOrderItem.ItemPayList)
{
//此明细还剩余金额
var balance = pay.ShareAmount - pay.RefundAmount;
//还有可分配的余额
if (balance == decimal.Zero)
{
//本分摊已完全使用
continue;
}
var currentSharedPay = tempTotalReceivableAmount;
if (balance < tempTotalReceivableAmount)
{
currentSharedPay = balance;
}
if (allRe)
{
//全退,余额全部推掉
currentSharedPay = balance;
}
tempTotalReceivableAmount -= currentSharedPay;
var existPay = newPayList.FirstOrDefault(x => x.OrgPayId == pay.PayId);
if (existPay == null)
{
existPay = new PayItem()
{
Id = IdWorkerUtils.Instance.NextId(),
OrgPayId = pay.PayId,
No = pay.No,
Name = pay.Name
};
newPayList.Add(existPay);
}
//每个明细都需要分配支付分摊
OrderItemPay itemPay = new OrderItemPay()
{
Id = IdWorkerUtils.Instance.NextId(),
TenantId = item.TenantId,
OrderId = item.OrderId,
TradeNo = item.TradeNo,
PayId = existPay.Id,
ItemId = item.Id,
No = pay.No,
Name = pay.Name,
ProductId = item.ProductId,
SpecId = item.SpecId,
ShareAmount = 0 - currentSharedPay,
ShareCouponLeastCost = pay.ShareCouponLeastCost,
RefundAmount = decimal.Zero
};
item.ItemPayList.Add(itemPay);
existPay.PaidAmount += (0 - currentSharedPay);
//原分摊记录退款金额
pay.RefundAmount += currentSharedPay;
if (!allRe && tempTotalReceivableAmount <= 0M)
{
//排除全退的情况,全退,需要处理抹零,抹零也要退掉
//该行明细分摊完成
break;
}
}
}
}
return newPayList;
}
/// <summary>
/// 退款,全部按照支付分摊退款
/// </summary>
/// <param name="refundOrderObject"></param>
/// <param name="orgOrderObject"></param>
/// <returns></returns>
private List<PayItem> CalculateWxPay(OrderObject refundOrderObject, OrderObject orgOrderObject)
{
var newPayList = new List<PayItem>();
var orgOrderPay = orgOrderObject.Pays[0];
foreach (var item in refundOrderObject.Items)
{
if (item.RowState == OrderRowState.)
{
continue;
}
//转正
var tempTotalReceivableAmount = 0 - item.TotalReceivableAmount;
//原订单明细项
var oldOrderItem = orgOrderObject.Items.FirstOrDefault(x => x.Id == item.OrgItemId);
if (oldOrderItem != null)
{
//转正
bool allRe = false;
if (oldOrderItem.Quantity == oldOrderItem.MiddleRefundQuantity)
{
//本明细项全退,所有支付都退掉
allRe = true;
}
var tmpBalance = orgOrderPay.PaidAmount - orgOrderPay.RefundAmount;
if (tmpBalance == decimal.Zero)
{
//本分摊已完全使用
continue;
}
var currentSharedPay = tempTotalReceivableAmount;
if (tmpBalance < tempTotalReceivableAmount)
{
currentSharedPay = tmpBalance;
}
if (allRe)
{
//全退,余额全部推掉
currentSharedPay = tmpBalance;
}
tempTotalReceivableAmount -= currentSharedPay;
}
}
return newPayList;
}
private Tuple<bool, string> DoRefund(string tradeNo, string refundCause, List<OrderItem> refundItems)
{
try
{
OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo(tradeNo);
//交班订单不允许退款判断
if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFTISALLOWREFUND, false))
{
if (!_OrderObject.ShiftNo.Equals(Global.Instance.BusinessPlanLog.No))
{
return new Tuple<bool, string>(false, LangProxy.ToLang("系统已设置交班后的订单不允许退款!"));
}
}
if (_OrderObject != null)
{
if (_OrderObject.OrgTradeNo != null && !"".Equals(_OrderObject.OrgTradeNo) && _OrderObject.Items.Sum(x => x.Quantity - x.MiddleRefundQuantity) == decimal.Zero)
{
return new Tuple<bool, string>(false, LangProxy.ToLang("订单已完全退单"));
}
#region subin 20230916 将原始的微信点餐退款条件去掉,将原微信点餐“同意退款"修改为门店销售订单退款。
//if (OrderType.微信点餐 == _OrderObject.OrderType || OrderType.百度外卖 == _OrderObject.OrderType || OrderType.饿了么 == _OrderObject.OrderType)
//{
// return new Tuple<bool, string>(false, LangProxy.ToLang("只有 堂食、外带、餐桌 模式的单据的才能在此退单"));
//}
if (OrderType. == _OrderObject.OrderType || OrderType.饿 == _OrderObject.OrderType)
{
return new Tuple<bool, string>(false, LangProxy.ToLang("只有 堂食、外带、餐桌 模式的单据的才能在此退单"));
}
#endregion
if (OrderType. == _OrderObject.OrderType)
{
return new Tuple<bool, string>(false, LangProxy.ToLang("电话外卖订单请到外送汇总里面退单"));
}
if (OrderType. == _OrderObject.OrderType)
{
if (_OrderObject.Delivery != null && _OrderObject.Delivery.Status == 2)
{
return new Tuple<bool, string>(false, LangProxy.ToLang("电话外卖已交单,退款失败!"));
}
}
#region subin bak
////生成新单
//OrderObject _BackOrderObject = ObjectUtils.Copy(_OrderObject);
//string finishDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
////=========更新原单内容
////录入原单号
//_BackOrderObject.Id = IdWorkerUtils.Instance.NextId();
////操作员工号
//_BackOrderObject.WorkerNo = Global.Instance.Worker.No;
////操作员名称
//_BackOrderObject.WorkerName = Global.Instance.Worker.Name;
//_BackOrderObject.SaleDate = finishDate;
////班次名称
//_BackOrderObject.ShiftName = Global.Instance.BusinessPlanLog.Name;
////班次编号
//_BackOrderObject.ShiftNo = Global.Instance.BusinessPlanLog.No;
////订单标识为 新建状态
//_BackOrderObject.OrderStatus = OrderStatus.已退单;
////订单创建时间
//_BackOrderObject.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
////订单创建人
//_BackOrderObject.CreateUser = Global.Instance.Worker.Name;
//string[] day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
//string weeker = day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString();
////星期
//_BackOrderObject.Weeker = weeker;
////天气
//_BackOrderObject.Weather = string.Empty;
//_BackOrderObject.ObjectId = ObjectId.GenerateNewStringId();
//var ticket = OrderUtils.Instance.GenerateTicketNoEx();
//if (ticket.Item1)
//{
// _BackOrderObject.TradeNo = ticket.Item3;
//}
//else
//{
// return new Tuple<bool, string>(false, LangProxy.ToLang("生成票号失败,退款失败!"));
//}
//_BackOrderObject.FinishDate = finishDate;
//_BackOrderObject.Amount = 0 - _OrderObject.Amount;
//_BackOrderObject.DiscountAmount = 0 - _OrderObject.DiscountAmount;
//_BackOrderObject.ReceivableAmount = 0 - _OrderObject.ReceivableAmount;
//_BackOrderObject.PaidAmount = 0 - _OrderObject.PaidAmount;
//_BackOrderObject.ReceivedAmount = 0 - _OrderObject.ReceivedAmount;
//_BackOrderObject.MalingAmount = 0 - _OrderObject.MalingAmount;
//_BackOrderObject.ChangeAmount = 0 - _OrderObject.ChangeAmount;
//_BackOrderObject.InvoicedAmount = 0 - _OrderObject.InvoicedAmount;
//_BackOrderObject.SyncStatus = 0;
//_BackOrderObject.PrintStatus = 0;
//_BackOrderObject.AddPoint = 0 - _OrderObject.AddPoint;
//_BackOrderObject.UploadStatus = 0;
//_BackOrderObject.UploadMessage = "";
//_BackOrderObject.TicketId = "";
//_BackOrderObject.OrgTradeNo = _OrderObject.TradeNo;
//_BackOrderObject.RefundCause = refundCause;
////电话外送
//if (OrderType.电话外卖 == _BackOrderObject.OrderType)
//{
// _OrderObject.OrderStatus = OrderStatus.已完成;
// _OrderObject.PaymentStatus = OrderPaymentStatus.已付款;
// //电话外卖退单后原单重新上传
// _OrderObject.SyncStatus = 0;
// _OrderObject.UploadErrors = 0;
// var _backDelivery = _BackOrderObject.Delivery;
// if (_backDelivery != null)
// {
// _backDelivery.Id = IdWorkerUtils.Instance.NextId();
// _backDelivery.OrderId = _BackOrderObject.Id;
// _backDelivery.TradeNo = _BackOrderObject.TradeNo;
// _backDelivery.ShiftNo = Global.Instance.BusinessPlanLog.No;
// _backDelivery.ShiftName = Global.Instance.BusinessPlanLog.Name;
// _backDelivery.Status = 2;
// if (!string.IsNullOrEmpty(_backDelivery.SendDate))
// {
// _backDelivery.SendDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// }
// _backDelivery.SettlementDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// }
//}
////整单优惠
//foreach (PromotionOrder promotion in _BackOrderObject.Promotions)
//{
// promotion.Id = IdWorkerUtils.Instance.NextId();
// promotion.OrderId = _BackOrderObject.Id;
// promotion.TradeNo = _BackOrderObject.TradeNo;
// promotion.Amount = 0 - promotion.Amount;
// promotion.DiscountAmount = 0 - promotion.DiscountAmount;
// promotion.ReceivableAmount = 0 - promotion.ReceivableAmount;
// promotion.FinishDate = finishDate;
//}
//List<OrderItem> backOrderItems = new List<OrderItem>();
////====== 更新明细内容
//foreach (OrderItem item in _BackOrderObject.Items)
//{
// OrderItem refundItem = null;
// //部分退商品明细(退的原单)
// if (refundItems != null && refundItems.Count > 0)
// {
// if (!refundItems.Exists(x => x.Id == item.Id))
// {
// continue;
// }
// refundItem = refundItems.FirstOrDefault(x => x.Id == item.Id);
// }
// //有效数量
// var _effectiveQuantity = item.Quantity - item.MiddleRefundQuantity;
// if (_effectiveQuantity <= 0)
// {
// //排除不可退的商品
// continue;
// }
// //退货数量为正数
// var refundQuantity = refundItem != null ? refundItem.Quantity : item.Quantity;
// var refundAmount = refundItem != null ? refundItem.Amount : item.Amount;
// //部分退货情况下的占比,用于处理促销优惠
// decimal rate = refundQuantity / item.Quantity;
// item.OrgItemId = item.Id;
// item.Id = IdWorkerUtils.Instance.NextId();
// item.OrderId = _BackOrderObject.Id;
// item.TradeNo = _BackOrderObject.TradeNo;
// //单品优惠
// foreach (PromotionItem promotion in item.Promotions)
// {
// promotion.Id = IdWorkerUtils.Instance.NextId();
// promotion.OrderId = _BackOrderObject.Id;
// promotion.ItemId = item.Id;
// promotion.TradeNo = _BackOrderObject.TradeNo;
// promotion.Amount = (0 - promotion.Amount) * rate;
// promotion.DiscountAmount = (0 - promotion.DiscountAmount) * rate;
// promotion.ReceivableAmount = (0 - promotion.ReceivableAmount) * rate;
// promotion.FinishDate = finishDate;
// promotion.RelationId = promotion.RelationId == "0" ? string.Empty : promotion.RelationId;
// }
// //做法信息
// foreach (FlavorItem flavor in item.Flavors)
// {
// flavor.Id = IdWorkerUtils.Instance.NextId();
// flavor.OrderId = _BackOrderObject.Id;
// flavor.ItemId = item.Id;
// flavor.TradeNo = _BackOrderObject.TradeNo;
// flavor.isRefund = true;
// flavor.OrderItemQuantity = refundQuantity;
// flavor.RefundQuantity = refundQuantity;
// flavor.Amount = flavor.Amount;
// flavor.Quantity = flavor.Quantity;
// flavor.DiscountAmount = 0 - flavor.DiscountAmount;
// flavor.FinishDate = finishDate;
// flavor.isBackTicket = true;
// }
// //清空支付方式分摊
// item.ItemPayList = new List<OrderItemPay>();
// item.MiddleRefundQuantity = refundQuantity;
// item.RefundQuantity = refundQuantity;
// item.Quantity = 0;
// item.Amount = 0 - refundAmount;
// item.FlavorAmount = 0 - item.FlavorAmount;
// item.FlavorDiscountAmount = 0 - item.FlavorDiscountAmount;
// item.FlavorReceivableAmount = 0 - item.FlavorReceivableAmount;
// item.TotalAmonut = 0 - item.TotalAmonut;
// item.SuitAddPrice = 0 - item.SuitAddPrice;
// item.SuitAmount = 0 - item.SuitAmount;
// item.SaleDate = finishDate;
// item.ChudaQty = 0;
// item.ChupinQty = 0;
// item.ChuxianQty = 0;
// item.KdsChupinQty = 0;
// item.FinishDate = finishDate;
// if (item.RowState == OrderRowState.套餐明)
// {
// var newItem = backOrderItems.FirstOrDefault(x => x.OrgItemId == item.ParentId);
// if (newItem != null)
// {
// item.ParentId = newItem.Id;
// item.Group = newItem.Id;
// }
// }
// else
// {
// item.Group = item.Id;
// }
// //原单-更新退货数量
// var oldItem = _OrderObject.Items.FirstOrDefault(x => x.Id == item.OrgItemId);
// oldItem.MiddleRefundQuantity += refundQuantity;
// if (oldItem.Flavors != null && oldItem.Flavors.Count > 0)
// {
// oldItem.Flavors.ForEach(x =>
// {
// x.RefundQuantity += x.BaseQuantity * refundQuantity;
// });
// }
// //计算套餐主的做法金额
// PromotionUtils.UpdateSuitMain(_BackOrderObject, item);
// backOrderItems.Add(item);
//}
//_BackOrderObject.Items = backOrderItems;
////退款,全部按照支付分摊退款
//var newPayList = CalculatePay(_BackOrderObject, _OrderObject);
//decimal diffAmount = 0 - _BackOrderObject.PaidAmount;
//#region subin 20230916 原本地订单退款中增加小程序退款,包括小程序单品退
////支付方式遍历
//foreach (PayItem pay in _BackOrderObject.Pays)
//{
// //分摊新流程,按照分摊的金额进行扣款
// PayItem sharePay = null;
// if (newPayList != null && newPayList.Count > 0)
// {
// sharePay = newPayList.FirstOrDefault(x => x.OrgPayId == pay.Id);
// if (sharePay == null)
// {
// //存在分摊,但是当前支付方式不在本次应退范围(上面计算的商品分摊),跳过
// continue;
// }
// }
// var oldPay = _OrderObject.Pays.FirstOrDefault(x => x.Id == pay.Id);
// if (sharePay != null)
// {
// //启用了分摊,按照分摊中的支付进行扣款
// pay.Id = sharePay.Id;
// pay.Amount = sharePay.PaidAmount;
// //当前支付方式余额
// var balanceAmount = pay.PaidAmount - pay.RefundAmount;
// if (Math.Abs(balanceAmount) < Math.Abs(pay.Amount))
// {
// //本次扣款不足,余额扣掉即可
// pay.Amount = 0 - balanceAmount;
// }
// //除去代金券的剩余金额,每次应该减去代金券分摊金额
// diffAmount -= (0 - pay.Amount);
// }
// else
// {
// //沿用旧的逻辑,按顺序扣款
// pay.Id = IdWorkerUtils.Instance.NextId();
// //当前支付方式余额
// var balanceAmount = pay.PaidAmount - pay.RefundAmount;
// diffAmount -= balanceAmount;
// if (diffAmount >= 0)
// {
// //当前支付方式的金额不足,全部付款
// pay.Amount = (0 - balanceAmount);
// }
// else
// {
// //足够,将剩余金额扣掉即可
// pay.Amount = (0 - (balanceAmount + diffAmount));
// }
// }
// pay.PaidAmount = pay.Amount;
// pay.RefundAmount = 0M;
// pay.TradeNo = _BackOrderObject.TradeNo;
// pay.PayNo = OrderUtils.Instance.GeneratePayNo();
// pay.OrderId = _BackOrderObject.Id;
// pay.ChangeAmount = 0 - pay.ChangeAmount;
// pay.PayTime = finishDate;
// pay.FinishDate = finishDate;
// pay.OverAmount = 0 - pay.OverAmount;
// pay.ShiftName = _BackOrderObject.ShiftName;
// pay.ShiftNo = _BackOrderObject.ShiftNo;
// //记录当前支付方式的已退款金额
// oldPay.RefundAmount += pay.PaidAmount * -1;
// var tempRefundAmount = pay.PaidAmount * -1;
#endregion
//生成新单
OrderObject _BackOrderObject = ObjectUtils.Copy(_OrderObject);
string finishDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//=========更新原单内容
//录入原单号
_BackOrderObject.Id = IdWorkerUtils.Instance.NextId();
//操作员工号
_BackOrderObject.WorkerNo = Global.Instance.Worker.No;
//操作员名称
_BackOrderObject.WorkerName = Global.Instance.Worker.Name;
_BackOrderObject.SaleDate = finishDate;
//班次名称
_BackOrderObject.ShiftName = Global.Instance.BusinessPlanLog.Name;
//班次编号
_BackOrderObject.ShiftNo = Global.Instance.BusinessPlanLog.No;
//订单标识为 新建状态
_BackOrderObject.OrderStatus = OrderStatus.退;
//订单创建时间
_BackOrderObject.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//订单创建人
_BackOrderObject.CreateUser = Global.Instance.Worker.Name;
string[] day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string weeker = day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString();
//星期
_BackOrderObject.Weeker = weeker;
//天气
_BackOrderObject.Weather = string.Empty;
_BackOrderObject.ObjectId = ObjectId.GenerateNewStringId();
var ticket = OrderUtils.Instance.GenerateTicketNoEx();
if (ticket.Item1)
{
_BackOrderObject.TradeNo = ticket.Item3;
}
else
{
return new Tuple<bool, string>(false, LangProxy.ToLang("生成票号失败,退款失败!"));
}
_BackOrderObject.FinishDate = finishDate;
_BackOrderObject.Amount = 0 - _OrderObject.Amount;
_BackOrderObject.DiscountAmount = 0 - _OrderObject.DiscountAmount;
_BackOrderObject.ReceivableAmount = 0 - _OrderObject.ReceivableAmount;
_BackOrderObject.PaidAmount = 0 - _OrderObject.PaidAmount;
_BackOrderObject.ReceivedAmount = 0 - _OrderObject.ReceivedAmount;
_BackOrderObject.MalingAmount = 0 - _OrderObject.MalingAmount;
_BackOrderObject.ChangeAmount = 0 - _OrderObject.ChangeAmount;
_BackOrderObject.InvoicedAmount = 0 - _OrderObject.InvoicedAmount;
_BackOrderObject.SyncStatus = 0;
_BackOrderObject.PrintStatus = 0;
_BackOrderObject.AddPoint = 0 - _OrderObject.AddPoint;
_BackOrderObject.UploadStatus = 0;
_BackOrderObject.UploadMessage = "";
_BackOrderObject.TicketId = "";
_BackOrderObject.OrgTradeNo = _OrderObject.TradeNo;
_BackOrderObject.RefundCause = refundCause;
//电话外送
if (OrderType. == _BackOrderObject.OrderType)
{
_OrderObject.OrderStatus = OrderStatus.;
_OrderObject.PaymentStatus = OrderPaymentStatus.;
//电话外卖退单后原单重新上传
_OrderObject.SyncStatus = 0;
_OrderObject.UploadErrors = 0;
var _backDelivery = _BackOrderObject.Delivery;
if (_backDelivery != null)
{
_backDelivery.Id = IdWorkerUtils.Instance.NextId();
_backDelivery.OrderId = _BackOrderObject.Id;
_backDelivery.TradeNo = _BackOrderObject.TradeNo;
_backDelivery.ShiftNo = Global.Instance.BusinessPlanLog.No;
_backDelivery.ShiftName = Global.Instance.BusinessPlanLog.Name;
_backDelivery.Status = 2;
if (!string.IsNullOrEmpty(_backDelivery.SendDate))
{
_backDelivery.SendDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
_backDelivery.SettlementDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
}
//整单优惠
foreach (PromotionOrder promotion in _BackOrderObject.Promotions)
{
promotion.Id = IdWorkerUtils.Instance.NextId();
promotion.OrderId = _BackOrderObject.Id;
promotion.TradeNo = _BackOrderObject.TradeNo;
promotion.Amount = 0 - promotion.Amount;
promotion.DiscountAmount = 0 - promotion.DiscountAmount;
promotion.ReceivableAmount = 0 - promotion.ReceivableAmount;
promotion.FinishDate = finishDate;
}
List<OrderItem> backOrderItems = new List<OrderItem>();
//====== 更新明细内容
foreach (OrderItem item in _BackOrderObject.Items)
{
OrderItem refundItem = null;
//部分退商品明细(退的原单)
if (refundItems != null && refundItems.Count > 0)
{
if (!refundItems.Exists(x => x.Id == item.Id))
{
continue;
}
refundItem = refundItems.FirstOrDefault(x => x.Id == item.Id);
}
//有效数量
var _effectiveQuantity = item.Quantity - item.MiddleRefundQuantity;
if (_effectiveQuantity <= 0)
{
//排除不可退的商品
continue;
}
//退货数量为正数
var refundQuantity = refundItem != null ? refundItem.Quantity : item.Quantity;
var refundAmount = refundItem != null ? refundItem.Amount : item.Amount;
//部分退货情况下的占比,用于处理促销优惠
decimal rate = refundQuantity / item.Quantity;
item.OrgItemId = item.Id;
item.Id = IdWorkerUtils.Instance.NextId();
item.OrderId = _BackOrderObject.Id;
item.TradeNo = _BackOrderObject.TradeNo;
//单品优惠
foreach (PromotionItem promotion in item.Promotions)
{
promotion.Id = IdWorkerUtils.Instance.NextId();
promotion.OrderId = _BackOrderObject.Id;
promotion.ItemId = item.Id;
promotion.TradeNo = _BackOrderObject.TradeNo;
promotion.Amount = (0 - promotion.Amount) * rate;
promotion.DiscountAmount = (0 - promotion.DiscountAmount) * rate;
promotion.ReceivableAmount = (0 - promotion.ReceivableAmount) * rate;
promotion.FinishDate = finishDate;
promotion.RelationId = promotion.RelationId == "0" ? string.Empty : promotion.RelationId;
}
//做法信息
foreach (FlavorItem flavor in item.Flavors)
{
flavor.Id = IdWorkerUtils.Instance.NextId();
flavor.OrderId = _BackOrderObject.Id;
flavor.ItemId = item.Id;
flavor.TradeNo = _BackOrderObject.TradeNo;
flavor.isRefund = true;
flavor.OrderItemQuantity = refundQuantity;
flavor.RefundQuantity = refundQuantity;
flavor.Amount = flavor.Amount;
flavor.Quantity = flavor.Quantity;
flavor.DiscountAmount = 0 - flavor.DiscountAmount;
flavor.FinishDate = finishDate;
flavor.isBackTicket = true;
}
//清空支付方式分摊
item.ItemPayList = new List<OrderItemPay>();
item.MiddleRefundQuantity = refundQuantity;
item.RefundQuantity = refundQuantity;
item.Quantity = 0;
item.Amount = 0 - refundAmount;
item.FlavorAmount = 0 - item.FlavorAmount;
item.FlavorDiscountAmount = 0 - item.FlavorDiscountAmount;
item.FlavorReceivableAmount = 0 - item.FlavorReceivableAmount;
item.TotalAmonut = 0 - item.TotalAmonut;
item.SuitAddPrice = 0 - item.SuitAddPrice;
item.SuitAmount = 0 - item.SuitAmount;
item.SaleDate = finishDate;
item.ChudaQty = 0;
item.ChupinQty = 0;
item.ChuxianQty = 0;
item.KdsChupinQty = 0;
item.FinishDate = finishDate;
if (item.RowState == OrderRowState.)
{
var newItem = backOrderItems.FirstOrDefault(x => x.OrgItemId == item.ParentId);
if (newItem != null)
{
item.ParentId = newItem.Id;
item.Group = newItem.Id;
}
}
else
{
item.Group = item.Id;
}
//原单-更新退货数量
var oldItem = _OrderObject.Items.FirstOrDefault(x => x.Id == item.OrgItemId);
oldItem.MiddleRefundQuantity += refundQuantity;
if (oldItem.Flavors != null && oldItem.Flavors.Count > 0)
{
oldItem.Flavors.ForEach(x =>
{
x.RefundQuantity += x.BaseQuantity * refundQuantity;
});
}
//计算套餐主的做法金额
PromotionUtils.UpdateSuitMain(_BackOrderObject, item);
backOrderItems.Add(item);
}
_BackOrderObject.Items = backOrderItems;
#region subin 20230916 原本地订单退款中增加小程序退款,包括小程序单品退
//var newPayList = new List<PayItem>();
//subin 20230922 只有门店点餐[堂食、外带、餐桌]的退款,按照支付分摊退款
//if (OrderType.堂食 == _BackOrderObject.OrderType || OrderType.外带 == _BackOrderObject.OrderType || OrderType.餐桌 == _BackOrderObject.OrderType)
//{
// //退款,全部按照支付分摊退款
// newPayList = CalculatePay(_BackOrderObject, _OrderObject);
//}
////else if (OrderType.微信点餐 == _BackOrderObject.OrderType)
////{
//// newPayList = CalculatePay(_BackOrderObject, _OrderObject);
////}
//退款,全部按照支付分摊退款
//subin 20230922 注释
var newPayList = CalculatePay(_BackOrderObject, _OrderObject);
decimal diffAmount = 0 - _BackOrderObject.PaidAmount;
if (OrderType. == _BackOrderObject.OrderType)
{
diffAmount = 0 - _BackOrderObject.ReceivableAmount;
}
//支付方式遍历
foreach (PayItem pay in _BackOrderObject.Pays)
{
//if (OrderType.微信点餐 == _BackOrderObject.OrderType)
//{
// diffAmount = 0 - pay.PaidAmount;
//}
//分摊新流程,按照分摊的金额进行扣款
PayItem sharePay = null;
if (newPayList != null && newPayList.Count > 0)
{
sharePay = newPayList.FirstOrDefault(x => x.OrgPayId == pay.Id);
if (sharePay == null)
{
//存在分摊,但是当前支付方式不在本次应退范围(上面计算的商品分摊),跳过
continue;
}
}
var oldPay = _OrderObject.Pays.FirstOrDefault(x => x.Id == pay.Id);
if (sharePay != null)
{
//启用了分摊,按照分摊中的支付进行扣款
pay.Id = sharePay.Id;
pay.Amount = sharePay.PaidAmount;
//当前支付方式余额
var balanceAmount = pay.PaidAmount - pay.RefundAmount;
if (Math.Abs(balanceAmount) < Math.Abs(pay.Amount))
{
//本次扣款不足,余额扣掉即可
pay.Amount = 0 - balanceAmount;
}
//除去代金券的剩余金额,每次应该减去代金券分摊金额
diffAmount -= (0 - pay.Amount);
}
else
{
//沿用旧的逻辑,按顺序扣款
pay.Id = IdWorkerUtils.Instance.NextId();
//当前支付方式余额
var balanceAmount = pay.PaidAmount - pay.RefundAmount;
diffAmount -= balanceAmount;
if (diffAmount >= 0)
{
//当前支付方式的金额不足,全部付款
pay.Amount = (0 - balanceAmount);
}
else
{
//足够,将剩余金额扣掉即可
pay.Amount = (0 - (balanceAmount + diffAmount));
}
}
pay.PaidAmount = pay.Amount;
pay.RefundAmount = 0M;
pay.TradeNo = _BackOrderObject.TradeNo;
pay.PayNo = OrderUtils.Instance.GeneratePayNo();
pay.OrderId = _BackOrderObject.Id;
pay.ChangeAmount = 0 - pay.ChangeAmount;
pay.PayTime = finishDate;
pay.FinishDate = finishDate;
pay.OverAmount = 0 - pay.OverAmount;
pay.ShiftName = _BackOrderObject.ShiftName;
pay.ShiftNo = _BackOrderObject.ShiftNo;
//记录当前支付方式的已退款金额
oldPay.RefundAmount += pay.PaidAmount * -1;
var tempRefundAmount = 0M;
tempRefundAmount = pay.PaidAmount * -1;
#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
switch (pay.No)
{
case "49":
case "02"://会员卡
{
this.ShowToastNotify(this, LangProxy.ToLang("正在进行会员卡退款...请勿关闭!"), 30000);
CardTradeCancelRequest cardRequest = new CardTradeCancelRequest();
cardRequest.TradeNo = _OrderObject.TradeNo;
cardRequest.TicketNo = _BackOrderObject.TradeNo;
cardRequest.TradeVoucherNo = pay.TradeVoucherNo;
cardRequest.Reason = "正常退款";
cardRequest.ShopNo = Global.Instance.Authc.StoreNo;
cardRequest.WorkerNo = Global.Instance.Worker.No;
cardRequest.PosNo = Global.Instance.Authc.PosNo;
cardRequest.TotalAmount = (int)(tempRefundAmount * 100);
var pointValue = CalculateRefundMemberPoint(_OrderObject, _BackOrderObject);
cardRequest.TotalPoint = (int)(pointValue * 100);
RefundCardInfo info = new RefundCardInfo();
info.CardNo = pay.CardNo;
info.Amount = (int)(tempRefundAmount * 100);
List<RefundCardInfo> infoList = new List<RefundCardInfo>();
infoList.Add(info);
cardRequest.CardInfo = infoList;
var result = CardUtils.CardTradeRefund(cardRequest);
if (result.Item1)
{
var cancelObj = result.Item3;
pay.TradeVoucherNo = cancelObj.RefNo;
var card1 = cancelObj.CardList.FirstOrDefault(x => x.CardNo == pay.CardNo);
if (card1 != null)
{
_BackOrderObject.PrePoint = card1.PrePoint;
_BackOrderObject.AddPoint = 0 - card1.Point;
_BackOrderObject.AftPoint = card1.AftPoint;
}
//_BackOrderObject.PrePoint = cancelObj.PreTotalPoint;
//_BackOrderObject.AddPoint = 0 - cancelObj.TotalPoint;
//_BackOrderObject.AftPoint = cancelObj.AftTotalPoint;
foreach (var cancelItem in cancelObj.CardList)
{
var card = _BackOrderObject.Pays.Find(x => x.CardNo == cancelItem.CardNo);
if (card != null)
{
card.CardAftAmount = cancelItem.AftAmount;
card.CardBeforeBalance = cancelItem.PreAmount;
}
}
_OrderObject.RefundPoint += pointValue;
}
else
{
return new Tuple<bool, string>(false, result.Item2);
}
}
break;
case "03":
{
}
break;
case "04"://支付宝
{
this.ShowToastNotify(this, LangProxy.ToLang("正在进行支付宝退款...请勿关闭!"), 30000);
switch (pay.PayChannel)
{
case PayChannelEnum.:
{
var result = AlipayApi.RefundAndQuery(AccountTypeEnum., pay.OutTradeNo, pay.Amount, _BackOrderObject.TradeNo, "正常退款");
if (!result.Item1)
{
return new Tuple<bool, string>(false, result.Item2);
}
}
break;
case PayChannelEnum.:
{
var res = SaobeiApi.GetSaobeiParameter(AccountTypeEnum.);
if (res.Item1)
{
var parameter = res.Item3;
//银联商务支付参数
string merchant_no = parameter.ContainsKey("merchant_no") ? parameter["merchant_no"].ToString() : "";
string terminal_id = parameter.ContainsKey("terminal_id") ? parameter["terminal_id"].ToString() : "";
string signKey = parameter.ContainsKey("signKey") ? parameter["signKey"].ToString() : "";
string gatewayUrl = parameter.ContainsKey("gatewayUrl") ? parameter["gatewayUrl"].ToString() : "";
string requestNum = string.Format("{0}_{1}", Global.Instance.Authc.StoreNo, _OrderObject.TradeNo);
SaobeiRefundParam request = new SaobeiRefundParam();
request.Pay_type = "020";
request.Terminal_trace = _BackOrderObject.TradeNo;
request.Refund_fee = string.Format("{0}", Convert.ToInt32(tempRefundAmount * 100));
request.Out_trade_no = pay.TradeVoucherNo;
var upayPayment = SaobeiUtils.SaobeiRefund(merchant_no, terminal_id, signKey, gatewayUrl, request);
if (!upayPayment.Item1)
{
return new Tuple<bool, string>(false, upayPayment.Item2);
}
else
{
pay.Memo = "扫呗支付:该订单已全额退款,";
}
}
else
{
return new Tuple<bool, string>(false, res.Item2);
}
}
break;
case PayChannelEnum.:
{
var _data = PayMentOperation.RefundPay(pay);
if (_data.Item1)
{
pay.Memo = "乐刷支付:该订单已全额退款,";
}
else
{
return new Tuple<bool, string>(false, _data.Item2);
}
}
break;
default:
{
return new Tuple<bool, string>(false, LangProxy.ToLang("暂未开放该渠道退款"));
}
break;
}
}
break;
case "05"://微信支付
{
this.ShowToastNotify(this, LangProxy.ToLang("正在进行微信退款...时间很长预计1-2分钟请勿关闭"), 100000);
switch (pay.PayChannel)
{
case PayChannelEnum.:
{
var result = WeixinApi.RefundAndQuery(AccountTypeEnum., pay.OutTradeNo, pay.Amount, pay.Amount, _BackOrderObject.TradeNo, "正常退款", 100);
if (!result.Item1)
{
return new Tuple<bool, string>(false, result.Item2);
}
}
break;
case PayChannelEnum.:
{
var res = SaobeiApi.GetSaobeiParameter(AccountTypeEnum.);
if (res.Item1)
{
var parameter = res.Item3;
//银联商务支付参数
string merchant_no = parameter.ContainsKey("merchant_no") ? parameter["merchant_no"].ToString() : "";
string terminal_id = parameter.ContainsKey("terminal_id") ? parameter["terminal_id"].ToString() : "";
string signKey = parameter.ContainsKey("signKey") ? parameter["signKey"].ToString() : "";
string gatewayUrl = parameter.ContainsKey("gatewayUrl") ? parameter["gatewayUrl"].ToString() : "";
string requestNum = string.Format("{0}_{1}", Global.Instance.Authc.StoreNo, _OrderObject.TradeNo);
SaobeiRefundParam request = new SaobeiRefundParam();
request.Pay_type = "010";
request.Terminal_trace = _BackOrderObject.TradeNo;
request.Refund_fee = string.Format("{0}", Convert.ToInt32(tempRefundAmount * 100));
request.Out_trade_no = pay.TradeVoucherNo;
var upayPayment = SaobeiUtils.SaobeiRefund(merchant_no, terminal_id, signKey, gatewayUrl, request);
if (!upayPayment.Item1)
{
return new Tuple<bool, string>(false, upayPayment.Item2);
}
else
{
pay.Memo = "扫呗支付:该订单已全额退款,";
}
}
else
{
return new Tuple<bool, string>(false, res.Item2);
}
}
break;
case PayChannelEnum.:
{
var _data = PayMentOperation.RefundPay(pay);
if (_data.Item1)
{
pay.Memo = "乐刷支付:该订单已全额退款,";
}
else
{
return new Tuple<bool, string>(false, _data.Item2);
}
}
break;
default:
{
return new Tuple<bool, string>(false, "暂未开放该渠道退款");
}
}
}
break;
case "07":
{
this.ShowToastNotify(this, LangProxy.ToLang("正在进行云闪付退款...请勿关闭!"), 30000);
switch (pay.PayChannel)
{
case PayChannelEnum.:
{
var res = SaobeiApi.GetSaobeiParameter(AccountTypeEnum.);
if (res.Item1)
{
var parameter = res.Item3;
//银联商务支付参数
string merchant_no = parameter.ContainsKey("merchant_no") ? parameter["merchant_no"].ToString() : "";
string terminal_id = parameter.ContainsKey("terminal_id") ? parameter["terminal_id"].ToString() : "";
string signKey = parameter.ContainsKey("signKey") ? parameter["signKey"].ToString() : "";
string gatewayUrl = parameter.ContainsKey("gatewayUrl") ? parameter["gatewayUrl"].ToString() : "";
string requestNum = string.Format("{0}_{1}", Global.Instance.Authc.StoreNo, _OrderObject.TradeNo);
SaobeiRefundParam request = new SaobeiRefundParam();
request.Pay_type = "110";
request.Terminal_trace = _BackOrderObject.TradeNo;
request.Refund_fee = string.Format("{0}", Convert.ToInt32(tempRefundAmount * 100));
request.Out_trade_no = pay.TradeVoucherNo;
var upayPayment = SaobeiUtils.SaobeiRefund(merchant_no, terminal_id, signKey, gatewayUrl, request);
if (!upayPayment.Item1)
{
return new Tuple<bool, string>(false, upayPayment.Item2);
}
else
{
pay.Memo = "扫呗支付:该订单已全额退款,";
}
}
else
{
return new Tuple<bool, string>(false, res.Item2);
}
}
break;
case PayChannelEnum.:
{
var _data = PayMentOperation.RefundPay(pay);
if (_data.Item1)
{
pay.Memo = "乐刷支付:该订单已全额退款,";
}
else
{
return new Tuple<bool, string>(false, _data.Item2);
}
}
break;
}
}
break;
#region subin 2023-07-10 add 通联退款
case "50":
{
var _payuserId = "";
if (_BackOrderObject.OrderType == OrderType.)
{
_payuserId = pay.OpenId;
}
var result = new Tuple<bool, string, string>(false, "", "");
#region subin 20230918 由前端支付到统一账号,退款从统一账号退款改为分店账号收款分店账号退款
//subin 20230920 门店付款由前端支付到统一账号,退款从统一账号退款,小程序分店账号收款分店账号退款
if (OrderType. == _BackOrderObject.OrderType || OrderType. == _BackOrderObject.OrderType || OrderType. == _BackOrderObject.OrderType)
{
result = AllinApi.RefundAndQuery(AccountTypeEnum., _BackOrderObject.TradeNo, Convert.ToInt32(_OrderObject.PaidAmount * 100), Convert.ToInt32(tempRefundAmount * 100), _OrderObject.TradeNo, _BackOrderObject.RefundCause, _OrderObject.OrderType, _payuserId);
}
else if (OrderType. == _BackOrderObject.OrderType)
{
result = AllinApi.RefundAndQuery(AccountTypeEnum., _BackOrderObject, _OrderObject.TradeNo, Convert.ToInt32(_OrderObject.PaidAmount * 100), _payuserId);
}
//if (result.Item1)
//{
// _BackOrderObject.Pays.First(m => m.No == "50").OtherRate = 3M;
//}
#endregion
if (!result.Item1)
{
return new Tuple<bool, string>(false, result.Item2);
}
else
{
//subin 20230927根据通联退款接口返回手续费并保存至支付信息中
//pay.Ext2=(decimal)result.Item2
var _detail = JsonUtils.Deserialize<OrderDetail>(result.Item3);
pay.Ext2 = ((decimal)_detail.fee) / 100 * -1 + "";
pay.Memo = "通联支付:该订单已退款,";
}
}
break;
#endregion
}
//subin 20231003 注释
//zhangy 2020-02-18 Add,增加退单的门店结算扣率处理逻辑
//档口结算信息赋默认值
//pay.Ext1 = "0";
//pay.Ext2 = "0";
//subin end
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 = 0 - payMode.OtherRateValue;
//zhangy 2020-02-18 Add,退单,扣率金额也退
pay.Ext2 = string.IsNullOrEmpty(pay.Ext2) ? "0" : (pay.Ext2);
}
}
#endregion
//使用会员卡增加了积分,但是没有使用会员卡支付,需要单独调用退积分功能
if (_BackOrderObject.AddPoint < 0 && !_BackOrderObject.Pays.Exists(x => x.No == "02"))
{
var pointValue = CalculateRefundMemberPoint(_OrderObject, _BackOrderObject);
if (pointValue > 0)
{
this.ShowToastNotify(this, LangProxy.ToLang("正在进行会员卡退款...请勿关闭!"), 30000);
CardTradeCancelRequest cardRequest = new CardTradeCancelRequest();
cardRequest.TradeNo = _OrderObject.TradeNo;
cardRequest.TicketNo = _BackOrderObject.TradeNo;
cardRequest.Reason = "正常退款";
cardRequest.ShopNo = Global.Instance.Authc.StoreNo;
cardRequest.WorkerNo = Global.Instance.Worker.No;
cardRequest.PosNo = Global.Instance.Authc.PosNo;
//cardRequest.TotalAmount = 0;
cardRequest.TotalPoint = (int)(pointValue * 100);
//RefundCardInfo info = new RefundCardInfo();
//info.CardNo = _BackOrderObject.MemberNo;
//info.Amount = 0;
//List<RefundCardInfo> infoList = new List<RefundCardInfo>();
//infoList.Add(info);
//cardRequest.CardInfo = infoList;
var result = CardUtils.CardTradeRefund(cardRequest);
if (result.Item1)
{
if (result.Item3 != null)
{
var cancelObj = result.Item3;
_BackOrderObject.PrePoint = cancelObj.PreTotalPoint;
_BackOrderObject.AddPoint = 0 - cancelObj.TotalPoint;
_BackOrderObject.AftPoint = cancelObj.AftTotalPoint;
_OrderObject.RefundPoint += cancelObj.TotalPoint;
}
}
else
{
return new Tuple<bool, string>(false, result.Item2);
}
}
}
//zhangy 2020-04-24 Add 美团券核销,退券
if (_BackOrderObject.Pays != null)
{
var couponList = _BackOrderObject.Pays.FindAll(x => "12".Equals(x.No)).ToList();
if (couponList.Count > 0)
{
//逐个退券
foreach (var coupon in couponList)
{
logger.Info("订单<{0}>发起退回美团券<{1}>", _BackOrderObject.TradeNo, coupon.TradeVoucherNo);
var request = new CouponCancelRequest();
request.VendorShopId = Global.Instance.Authc.StoreNo;
request.CouponCode = coupon.TradeVoucherNo;
request.EId = Global.Instance.Worker.No;
request.EName = Global.Instance.Worker.Name;
var result = MeituanCouponUtils.Instance.OrdeCancel(request);
logger.Info("订单<{0}>美团券<{1}>退回结果:{2}", _BackOrderObject.TradeNo, coupon.TradeVoucherNo, result.Item2);
if (result.Item1)
{
//成功
logger.Info("订单<{0}>美团券<{1}>退回成功", _BackOrderObject.TradeNo, coupon.TradeVoucherNo);
}
else
{
//失败
return new Tuple<bool, string>(false, result.Item2);
}
}
}
}
var isException = OrderUtils.Instance.SaveOrderObject(_BackOrderObject);
if (!isException)
{
_OrderObject.OrgTradeNo = _BackOrderObject.TradeNo;
var oldSplitPay = new SplitStorePay();
//更新订单明细的退货数量
using (var db = Global.Instance.OpenDataBase)
{
#region subin 20230921 退款成功后,更新原分账明细的退款金额
//var splitPayLst = db.Query<SplitStorePay>("where orderId=@0;", _OrderObject.Id);
#endregion
using (var trans = db.GetTransaction())
{
//保存原单更新信息
foreach (var item in _OrderObject.Items)
{
db.Update(item, new string[] { "middleRefundQuantity" });
//原明细支付分摊
if (item.ItemPayList != null && item.ItemPayList.Count > 0)
{
foreach (var itemPay in item.ItemPayList)
{
db.Update(itemPay, new string[] { "ramount" });
#region subin 20230921 退款成功后,更新原分账明细的退款金额
//if (_OrderObject.OrderType == OrderType.堂食 || _OrderObject.OrderType == OrderType.外带 || _OrderObject.OrderType == OrderType.餐桌)
//{
// var splitPay = splitPayLst.FirstOrDefault(m => m.OrderId == _OrderObject.Id && m.OrderItemId == item.Id && m.PayItemId == itemPay.Id);
// if (splitPay != null)
// {
// if (itemPay.RefundAmount > 0)
// {
// splitPay.IsRefund = 1;
// splitPay.RefundAmount += itemPay.RefundAmount;
// splitPay.RefundQuantity += item.MiddleRefundQuantity;
// db.Update(splitPay);
// LOGGER.Info($"堂食、外带、餐桌订餐退款成功后,更新原分账明细:{JsonUtils.Serialize(splitPay)}");
// if (!string.IsNullOrEmpty(splitPay.TicketId))
// {
// if (!string.IsNullOrEmpty(splitPay.Id))
// {
// var api = new SplitPayApi();
// var entity = new SplitStorePayEntity
// {
// Id = splitPay.Id,
// ClientId = splitPay.ClientId,
// ProgramId = splitPay.ProductId,
// TenantId = splitPay.TenantId,
// StoreId = splitPay.StoreId,
// SplitStoreId = splitPay.SplitStoreId,
// StoreNo = splitPay.StoreNo,
// PayNo = splitPay.PayNo,
// TicketId = splitPay.TicketId,
// BusNo = splitPay.BusNo,
// PayTypeNo = splitPay.PayTypeNo,
// PayType = splitPay.PayType,
// Paid = splitPay.Paid,
// Rchange = splitPay.Rchange,
// Money = splitPay.Money,
// OverAmount = splitPay.OverAmount,
// VoucherNo = splitPay.VoucherNo,
// PayDate = splitPay.PayDate,
// CardNo = splitPay.CardNo,
// IncomeFlag = splitPay.IncomeFlag,
// OtherRateType = splitPay.OtherRateType,
// OtherRateValue = splitPay.OtherRateValue,
// OtherRate = splitPay.OtherRate,
// PayClientType = splitPay.PayClientType,
// PayChannel = splitPay.PayChannel,
// DeductionRate = splitPay.DeductionRate,
// ChargeBack = splitPay.ChargeBack,
// Memo = splitPay.Memo,
// IsInvalid = splitPay.IsInvalid,
// OrderId = splitPay.OrderId,
// OrderItemId = splitPay.OrderItemId,
// PayId = splitPay.PayId,
// PayItemId = splitPay.PayItemId,
// SyncStatus = splitPay.SyncStatus,
// UploadErrors = splitPay.UploadErrors,
// UploadStatus = splitPay.UploadStatus,
// UploadMessage = splitPay.UploadMessage,
// ProductId = splitPay.ProductId,
// RefundAmount = splitPay.RefundAmount,
// FromBizUserld = splitPay.FromBizUserld,
// OrderType = splitPay.OrderType,
// IsRefund = splitPay.IsRefund,
// Quantity = splitPay.Quantity,
// RefundQuantity = splitPay.RefundQuantity,
// TableNo = _OrderObject.TableNo,
// People = _OrderObject.People.ToString(),
// OrdTicketId = _OrderObject.TicketId,
// WorkerNo = _OrderObject.WorkerNo,
// UploadErrCode = splitPay.UploadErrCode,
// UploadErrMessage = splitPay.UploadErrMessage,
// UploadTime = splitPay.UploadTime,
// fee = splitPay.fee,
// Goodid = splitPay.ProductId,
// //UnitPrice=""
// };
// var result = api.UpdateSplitPay(entity);
// if (result.Item1)
// {
// LOGGER.Info($"退款成功后,更新服务端原分账信息:成功");
// }
// else
// {
// LOGGER.Info($"退款成功后,更新服务端原分账信息:失败");
// }
// }
// }
// Thread.Sleep(10);
// }
// }
//}
#endregion
}
}
if (item.Flavors != null && item.Flavors.Count > 0)
{
foreach (var flavor in item.Flavors)
{
db.Update(flavor, new string[] { "refund" });
}
}
//明细促销
if (item.Promotions != null && item.Promotions.Count > 0)
{
foreach (var pro in item.Promotions)
{
//db.Update(pro, new string[] { "refundFlag" });
}
}
}
foreach (var pay in _OrderObject.Pays)
{
db.Update(pay, new string[] { "ramount" });
}
db.Update(_OrderObject);
#region subin 20230921 退款成功后,更新原分账明细的退款金额
//if (_OrderObject.OrderType == OrderType.微信点餐)
//{
// foreach (var item in backOrderItems)
// {
// var splitPay = splitPayLst.FirstOrDefault(m => m.OrderId == _OrderObject.Id && m.ProductId == item.ProductId);
// if (splitPay != null)
// {
// splitPay.IsRefund = 1;
// splitPay.RefundAmount += backOrderItems.Find(m => m.ProductId == splitPay.ProductId).TotalAmonut * -1;
// splitPay.RefundQuantity = item.MiddleRefundQuantity;
// db.Update(splitPay);
// LOGGER.Info($"小程序退款成功后,更新原分账明细:{JsonUtils.Serialize(splitPay)}");
// if (!string.IsNullOrEmpty(splitPay.TicketId))
// {
// if (!string.IsNullOrEmpty(splitPay.Id))
// {
// var api = new SplitPayApi();
// var entity = new SplitStorePayEntity
// {
// Id = splitPay.Id,
// ClientId = splitPay.ClientId,
// ProgramId = splitPay.ProductId,
// TenantId = splitPay.TenantId,
// StoreId = splitPay.StoreId,
// SplitStoreId = splitPay.SplitStoreId,
// StoreNo = splitPay.StoreNo,
// PayNo = splitPay.PayNo,
// TicketId = splitPay.TicketId,
// BusNo = splitPay.BusNo,
// PayTypeNo = splitPay.PayTypeNo,
// PayType = splitPay.PayType,
// Paid = splitPay.Paid,
// Rchange = splitPay.Rchange,
// Money = splitPay.Money,
// OverAmount = splitPay.OverAmount,
// VoucherNo = splitPay.VoucherNo,
// PayDate = splitPay.PayDate,
// CardNo = splitPay.CardNo,
// IncomeFlag = splitPay.IncomeFlag,
// OtherRateType = splitPay.OtherRateType,
// OtherRateValue = splitPay.OtherRateValue,
// OtherRate = splitPay.OtherRate,
// PayClientType = splitPay.PayClientType,
// PayChannel = splitPay.PayChannel,
// DeductionRate = splitPay.DeductionRate,
// ChargeBack = splitPay.ChargeBack,
// Memo = splitPay.Memo,
// IsInvalid = splitPay.IsInvalid,
// OrderId = splitPay.OrderId,
// OrderItemId = splitPay.OrderItemId,
// PayId = splitPay.PayId,
// PayItemId = splitPay.PayItemId,
// SyncStatus = splitPay.SyncStatus,
// UploadErrors = splitPay.UploadErrors,
// UploadStatus = splitPay.UploadStatus,
// UploadMessage = splitPay.UploadMessage,
// ProductId = splitPay.ProductId,
// RefundAmount = splitPay.RefundAmount,
// FromBizUserld = splitPay.FromBizUserld,
// OrderType = splitPay.OrderType,
// IsRefund = splitPay.IsRefund,
// Quantity = splitPay.Quantity,
// RefundQuantity = splitPay.RefundQuantity,
// TableNo = _OrderObject.TableNo,
// People = _OrderObject.People.ToString(),
// OrdTicketId = _OrderObject.TicketId,
// WorkerNo = _OrderObject.WorkerNo,
// UploadErrCode = splitPay.UploadErrCode,
// UploadErrMessage = splitPay.UploadErrMessage,
// UploadTime = splitPay.UploadTime,
// fee = splitPay.fee,
// Goodid = splitPay.ProductId,
// //UnitPrice=""
// };
// var result = api.UpdateSplitPay(entity);
// if (result.Item1)
// {
// LOGGER.Info($"退款成功后,更新服务端原分账信息:成功");
// }
// else
// {
// LOGGER.Info($"退款成功后,更新服务端原分账信息:失败");
// }
// }
// }
// Thread.Sleep(10);
// }
// }
//}
#endregion
#region subin 20231008 退款成功后,找到原分账明细中有手续费的数据,更新手续费。
//subin 20231008 退款成功后,找到原分账明细中有手续费的数据,更新手续费。
//var oldSplitPayas = splitPayLst.Where(m => m.OrderId == _OrderObject.Id && m.Pid != null);
//oldSplitPay = oldSplitPayas.FirstOrDefault(m => m.fee > 0);
//if (oldSplitPay != null)
//{
// LOGGER.Info($"退款成功后,返还原分账手续费,原订单手续费:{oldSplitPay.fee},退还手续费:{Math.Abs(Convert.ToDecimal(_BackOrderObject.Pays[0].Ext2))}");
// oldSplitPay.fee -= Math.Abs(Convert.ToDecimal(_BackOrderObject.Pays[0].Ext2));
// db.Update(oldSplitPay);
// LOGGER.Info($"退款成功后,更新本地原分账信息:{JsonUtils.Serialize(oldSplitPay)}");
//}
//var oldPSplitPay = db.First<SplitStorePay>("where (pid is null or pid='') and orderId=@0;", _OrderObject.Id);
//if (oldPSplitPay != null)
//{
// oldPSplitPay.IsRefund = 1;
// oldPSplitPay.fee -= Math.Abs(Convert.ToDecimal(_BackOrderObject.Pays[0].Ext2));
// db.Update(oldPSplitPay);
//}
#endregion
trans.Complete();
}
}
LOGGER.Info("开始打印");
this.ShowToastNotify(this, LangProxy.ToLang("正在打印退款单..."));
//开始打印
_BackOrderObject.PrintType = 1;
_BackOrderObject.RPrint = false;
//退单厨打开关
bool allowChuda = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_KITCHEN_ALLOW_TUIDAN_CHUDA, false);
List<PrintTypeEnum> printList = new List<PrintTypeEnum>();
printList.Add(PrintTypeEnum.);
if (allowChuda)
{
printList.Add(PrintTypeEnum.);
}
//退单出品开关
bool allowChupin = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_KITCHEN_ALLOW_TUIDAN_CHUPIN, false);
if (allowChupin)
{
printList.Add(PrintTypeEnum.);
}
this.PrintOrderObject(_BackOrderObject, printList);
#region subin 20231008 退款成功后,更新服务端分账手续费
//if (oldSplitPay != null)
//{
// if (!string.IsNullOrEmpty(oldSplitPay.TicketId) && oldSplitPay.SyncStatus == 1)
// {
// var api = new SplitPayApi();
// if (!string.IsNullOrEmpty(oldSplitPay.Id))
// {
// var entity = new SplitStorePayEntity
// {
// Id = oldSplitPay.Id,
// ClientId = oldSplitPay.ClientId,
// ProgramId = oldSplitPay.ProductId,
// TenantId = oldSplitPay.TenantId,
// StoreId = oldSplitPay.StoreId,
// SplitStoreId = oldSplitPay.SplitStoreId,
// StoreNo = oldSplitPay.StoreNo,
// PayNo = oldSplitPay.PayNo,
// TicketId = oldSplitPay.TicketId,
// BusNo = oldSplitPay.BusNo,
// PayTypeNo = oldSplitPay.PayTypeNo,
// PayType = oldSplitPay.PayType,
// Paid = oldSplitPay.Paid,
// Rchange = oldSplitPay.Rchange,
// Money = oldSplitPay.Money,
// OverAmount = oldSplitPay.OverAmount,
// VoucherNo = oldSplitPay.VoucherNo,
// PayDate = oldSplitPay.PayDate,
// CardNo = oldSplitPay.CardNo,
// IncomeFlag = oldSplitPay.IncomeFlag,
// OtherRateType = oldSplitPay.OtherRateType,
// OtherRateValue = oldSplitPay.OtherRateValue,
// OtherRate = oldSplitPay.OtherRate,
// PayClientType = oldSplitPay.PayClientType,
// PayChannel = oldSplitPay.PayChannel,
// DeductionRate = oldSplitPay.DeductionRate,
// ChargeBack = oldSplitPay.ChargeBack,
// Memo = oldSplitPay.Memo,
// IsInvalid = oldSplitPay.IsInvalid,
// OrderId = oldSplitPay.OrderId,
// OrderItemId = oldSplitPay.OrderItemId,
// PayId = oldSplitPay.PayId,
// PayItemId = oldSplitPay.PayItemId,
// SyncStatus = oldSplitPay.SyncStatus,
// UploadErrors = oldSplitPay.UploadErrors,
// UploadStatus = oldSplitPay.UploadStatus,
// UploadMessage = oldSplitPay.UploadMessage,
// ProductId = oldSplitPay.ProductId,
// RefundAmount = oldSplitPay.RefundAmount,
// FromBizUserld = oldSplitPay.FromBizUserld,
// OrderType = oldSplitPay.OrderType,
// IsRefund = oldSplitPay.IsRefund,
// Quantity = oldSplitPay.Quantity,
// RefundQuantity = oldSplitPay.RefundQuantity,
// TableNo = _OrderObject.TableNo,
// People = _OrderObject.People.ToString(),
// OrdTicketId = _OrderObject.TicketId,
// WorkerNo = _OrderObject.WorkerNo,
// UploadErrCode = oldSplitPay.UploadErrCode,
// UploadErrMessage = oldSplitPay.UploadErrMessage,
// UploadTime = oldSplitPay.UploadTime,
// fee = oldSplitPay.fee,
// Goodid = oldSplitPay.ProductId,
// //UnitPrice=""
// };
// var result = api.UpdateSplitPay(entity);
// if (result.Item1)
// {
// LOGGER.Info($"退款成功后,更新服务端原分账手续费:成功");
// }
// else
// {
// LOGGER.Info($"退款成功后,更新服务端原分账手续费:失败");
// }
// }
// }
//}
//Task.Factory.StartNew(() =>
//{
// SplitPayUtils.Instance.UpdateRefund(_OrderObject, _BackOrderObject);
//});
#endregion
return new Tuple<bool, string>(true, LangProxy.ToLang("退单完成"));
}
else
{
return new Tuple<bool, string>(false, LangProxy.ToLang("退单保存失败!"));
}
}
else
{
return new Tuple<bool, string>(false, LangProxy.ToLang("获取订单信息异常"));
}
}
catch (Exception ex)
{
logger.Error(ex, "退单发生异常");
if (ex is WebException || ex is SocketException)
{
return new Tuple<bool, string>(false, "连接退款平台失败");
}
return new Tuple<bool, string>(false, LangProxy.ToLang("退单发生异常"));
}
}
/// <summary>
/// 计算退积分数量
/// </summary>
/// <param name="orgOrder"></param>
/// <param name="refundOrder"></param>
/// <returns></returns>
public decimal CalculateRefundMemberPoint(OrderObject orgOrder, OrderObject refundOrder)
{
//判断是否为最后一次退货
bool lastRefund = false;
foreach (var orgItem in orgOrder.Items)
{
var refundItem = refundOrder.Items.FirstOrDefault(x => x.OrgItemId == orgItem.Id);
if (orgItem.Quantity == orgItem.MiddleRefundQuantity)
{
lastRefund = true;
}
else
{
lastRefund = false;
break;
}
}
decimal refundPoint = decimal.Zero;
if (orgOrder.UsableRefundPoint > 0)
{
//最后一次退积分,直接取剩余积分
if (lastRefund)
{
refundPoint = orgOrder.UsableRefundPoint;
}
else
{
foreach (var refundItem in refundOrder.Items)
{
var orgItem = orgOrder.Items.FirstOrDefault(x => x.Id == refundItem.OrgItemId);
if (orgItem != null)
{
var rate = refundItem.Amount * -1 / orgOrder.Amount;
//部分退,按比例退,积分不积小数,向下取整
decimal point = Math.Floor(orgOrder.UsableRefundPoint * rate);
refundPoint += point;
}
}
}
}
return refundPoint;
}
/// <summary>
/// 退单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_backTicket_Click(object sender, EventArgs e)
{
string permissionCode = "10043";
var action = new Action(() =>
{
this.RefundOrderCheck();
});
var ret = AuthzUtils.Instance.CheckAuthz(this, "退单", permissionCode, action);
if (!ret.Item1)
{
this.ShowToastNotify(this, ret.Item2);
}
}
private void Reprinter()
{
var panel = salesListTable.PrimaryGrid;
if (panel.ActiveRow == null)
{
this.ShowToastNotify(this, LangProxy.ToLang("请选择要操作的单据"));
return;
}
//选择补打的内容
RePrintSelectForm form = new RePrintSelectForm();
form.AcceptButtonClick += (o, args) =>
{
var printType = (PrintTypeEnum)Enum.Parse(typeof(PrintTypeEnum), args.Data.ToString());
var row = panel.ActiveRow as GridRow;
var tradeNo = row.Cells["busNo"].Value.ToString();
OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo(tradeNo);
if (_OrderObject.OrderType == OrderType. || _OrderObject.OrderType == OrderType.饿 || _OrderObject.OrderType == OrderType.)
{
this.ShowToastNotify(this, LangProxy.ToLang("第三方外卖的单据请到外卖历史订单补打!"));
return;
}
if (_OrderObject.OrderType == OrderType.)
{
this.ShowToastNotify(this, LangProxy.ToLang("微信点餐的单据请到微信历史订单补打!"));
return;
}
if (_OrderObject != null)
{
_OrderObject.PrintType = 0;
_OrderObject.RPrint = true;
List<PrintTypeEnum> printList = new List<PrintTypeEnum>();
printList.Add(printType);
this.PrintOrderObject(_OrderObject, printList);
}
else
{
this.ShowToastNotify(this, LangProxy.ToLang("获取订单信息异常"));
}
};
form.ShowDialog();
}
/// <summary>
/// 补打账单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_TicketPrint_Click(object sender, EventArgs e)
{
string permissionCode = "10044";
var action = new Action(() =>
{
this.Reprinter();
});
var ret = AuthzUtils.Instance.CheckAuthz(this, "补打", permissionCode, action);
if (!ret.Item1)
{
this.ShowToastNotify(this, ret.Item2);
}
}
private void OnControlBoxMinClick(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
/// <summary>
/// 营业模式变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cb_change_click(object sender, EventArgs e)
{
var obj = sender as CheckBoxX;
var indexT = obj.Tag as string;
if ("全部".Equals(indexT))
{
orderType = -1;
}
if ("堂食".Equals(indexT))
{
orderType = 0;
}
if ("外带".Equals(indexT))
{
orderType = 1;
}
if ("电话外卖".Equals(indexT))
{
orderType = 2;
}
if ("餐桌".Equals(indexT))
{
orderType = 3;
}
if ("美团外卖".Equals(indexT))
{
orderType = 4;
}
if ("饿了么".Equals(indexT))
{
orderType = 5;
}
if ("百度外卖".Equals(indexT))
{
orderType = 6;
}
if ("微信点餐".Equals(indexT))
{
orderType = 7;
}
this.txtTradeNo.Focus();
this.txtTradeNo.SelectAll();
QueryTicket();
}
/// <summary>
/// 输入单号查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnFinishedClick(object sender, Component.EnterEventArg e)
{
QueryTicket();
}
/// <summary>
/// 打印订单
/// </summary>
/// <param name="orderObject"></param>
/// <returns></returns>
private bool PrintOrderObject(OrderObject orderObject, List<PrintTypeEnum> typeList)
{
bool isException = false;
try
{
foreach (var type in typeList)
{
switch (type)
{
case PrintTypeEnum.:
{
logger.Info(string.Format("收银员<{0}>补打订单小票<{1}>", Global.Instance.Worker.No, orderObject.TradeNo));
//收银小票打印
Task.Factory.StartNew(() =>
{
//构建收银小票模版参数
List<VariableValue> vars = null;
if (orderObject.PrintType == 0 && orderObject.OrderType == OrderType.)
{
//补打电话外卖结账单,退单走普通
vars = PrintHelper.BuilderDeliveryTicketVariable(orderObject);
}
else
{
vars = PrintHelper.BuilderTicketVariable(orderObject);
}
//自动切纸
bool cutPager = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_CASHIER_ALLOW_CUT_PAGER, false);
//是否允许打开钱箱 补打单、退单不开钱箱
bool openCashbox = false;
//票头空白行
int headerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_HEADER_EMPTY, 0);
//票尾空白行
int footerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_FOOTER_EMPTY, 0);
if (orderObject.PrintType == 0)
{
//执行收银小票打印
switch (orderObject.OrderType)
{
case OrderType.:
{
logger.Info("开始打印电话外送小票<{0}>", orderObject.TradeNo);
var prt = PrintHelper.PrinterTicket("电话外卖", vars, cutPager, false, headerLine, footerLine);
logger.Info("补打电话外送小票打印结果<{0},{1},{2}>", orderObject.TradeNo, prt.Item1, prt.Item2);
}
break;
default:
{
logger.Info("开始打印收银小票<{0}>", orderObject.TradeNo);
var prt = PrintHelper.PrinterTicket("收银小票", vars, cutPager, openCashbox, headerLine, footerLine);
logger.Info("补打小票打印结果<{0},{1},{2}>", orderObject.TradeNo, prt.Item1, prt.Item2);
}
break;
}
}
else
{
//退单统一走结账单小票模板
logger.Info("开始打印退款收银小票<{0}>", orderObject.TradeNo);
var prt = PrintHelper.PrinterTicket("收银小票", vars, cutPager, openCashbox, headerLine, footerLine);
logger.Info("退款小票打印结果<{0},{1},{2}>", orderObject.TradeNo, prt.Item1, prt.Item2);
}
});
}
break;
case PrintTypeEnum.:
{
//打印标签
logger.Info(string.Format("收银员<{0}>补打订单标签<{1}>", Global.Instance.Worker.No, orderObject.TradeNo));
Task.Factory.StartNew(() =>
{
LabelPrintHelper.PrintOrderLabel(orderObject);
});
}
break;
case PrintTypeEnum.:
{
//厨打小票打印
logger.Info(string.Format("收银员<{0}>补打订单厨打<{1}>", Global.Instance.Worker.No, orderObject.TradeNo));
Task.Factory.StartNew(() =>
{
ChuDaHelper.KitchenPrinter(orderObject);
});
}
break;
case PrintTypeEnum.:
{
//厨打小票打印
logger.Info(string.Format("收银员<{0}>补打订单厨打标签<{1}>", Global.Instance.Worker.No, orderObject.TradeNo));
Task.Factory.StartNew(() =>
{
ChuDaHelper.KitchenLabelPrinter(orderObject);
});
}
break;
case PrintTypeEnum.:
{
//出品小票打印
logger.Info(string.Format("收银员<{0}>补打订单出品<{1}>", Global.Instance.Worker.No, orderObject.TradeNo));
Task.Factory.StartNew(() =>
{
ChuDaHelper.MadePrinter(orderObject);
});
}
break;
case PrintTypeEnum.:
{
//通知厨显
logger.Info(string.Format("收银员<{0}>补打订单厨显<{1}>", Global.Instance.Worker.No, orderObject.TradeNo));
Task.Factory.StartNew(() =>
{
UploadSCNewOrder.UploadNewOrder2SC4KDS(orderObject);
});
}
break;
}
}
}
catch (Exception ex)
{
isException = true;
LOGGER.Error(ex, "打印订单信息异常");
}
return isException;
}
/// <summary>
/// 农商行MIS打印
/// </summary>
private void AbmcsPrint()
{
string fileName = string.Format(@"Abmcs\{0}", "Print.txt");
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
if (File.Exists(filePath))
{
string[] lines = File.ReadAllLines(filePath, System.Text.Encoding.Default);
var sb = new StringBuilder();
var pobject = PrintHelper.GetTicketPrinterObject(true, false); ;
List<PrintContent> content = new List<PrintContent>();
for (int i = 0; i < lines.Length; i++)
{
var str = lines[i];
switch (str)
{
case "CUTPAPER":
{
logger.Info("打印小票切纸动作");
//切纸
var p = new PrintContent();
p.Format = RowFormat.Line;
p.Content = new StringBuilder().Append(ParseEscPosCommand("29,86,66"));
content.Add(p);
}
break;
default:
{
var p = new PrintContent();
p.Format = RowFormat.Line;
p.Content = new StringBuilder().Append(str);
p.AlignStyle = AlignStyle.;
p.FontStyle = Printer.FontStyle.;
p.BitmapFile = string.Empty;
content.Add(p);
logger.Info(str);
}
break;
}
}
if (true)
{
//切纸
var p = new PrintContent();
p.Format = RowFormat.Line;
p.Content = new StringBuilder().Append(ParseEscPosCommand("29,86,66"));
content.Add(p);
}
//启动新任务
Task.Factory.StartNew(() =>
{
PrinterUtils.PrintContent(pobject, content);
});
}
else
{
logger.Warn(filePath + "不存在");
}
}
/// <summary>
/// 建行MIS打印
/// </summary>
private void Print()
{
string fileName = string.Format(@"landiccbmispos\{0}", "P_TackSingle.txt");
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
if (File.Exists(filePath))
{
string[] lines = File.ReadAllLines(filePath, System.Text.Encoding.Default);
var sb = new StringBuilder();
var pobject = PrintHelper.GetTicketPrinterObject(true, false); ;
List<PrintContent> content = new List<PrintContent>();
for (int i = 0; i < lines.Length; i++)
{
var str = lines[i];
switch (str)
{
case "#CUT#":
{
logger.Info("打印小票切纸动作");
//切纸
var p = new PrintContent();
p.Format = RowFormat.Line;
p.Content = new StringBuilder().Append(ParseEscPosCommand("29,86,66"));
content.Add(p);
}
break;
case "#LDSIGN#":
{
logger.Info("打印ElecSign.bmp签名图片");
}
break;
case "#ODBMP#":
{
logger.Info("打印ConsumeOD.bmp图片");
}
break;
case "#QRBMP#":
{
logger.Info("打印PublicQR.bmp图片");
}
break;
default:
{
var p = new PrintContent();
p.Format = RowFormat.Line;
p.Content = new StringBuilder().Append(str);
p.AlignStyle = AlignStyle.;
p.FontStyle = Printer.FontStyle.;
p.BitmapFile = string.Empty;
content.Add(p);
logger.Info(str);
}
break;
}
}
if (true)
{
//切纸
var p = new PrintContent();
p.Format = RowFormat.Line;
p.Content = new StringBuilder().Append(ParseEscPosCommand("29,86,66"));
content.Add(p);
}
//启动新任务
Task.Factory.StartNew(() =>
{
PrinterUtils.PrintContent(pobject, content);
});
}
else
{
logger.Warn(filePath + "不存在");
}
}
private string ParseEscPosCommand(string command)
{
string[] array = command.Split(',');
List<byte> bytList = new List<byte>();
foreach (var s in array)
{
bytList.Add(Convert.ToByte(s.Trim()));
}
return Encoding.Default.GetString(bytList.ToArray());
}
/// <summary>
/// 加载绑定数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnBind(object sender, GridDataBindingCompleteEventArgs e)
{
var panel = e.GridPanel;
foreach (var r in panel.Rows)
{
var row = r as GridRow;
//设置单据内容字体颜色
if ("已退单".Equals(row.Cells["status"].Value.ToString()) && decimal.Parse(row.Cells["amount"].Value.ToString()) <= decimal.Zero)
{
row.CellStyles.Default.TextColor = Color.Red;
}
else
{
row.CellStyles.Default.TextColor = Color.Black;
}
//var payTypeNo = row.Cells["payTypeNo"].Value.ToString();
//if ("合计".Equals(payTypeNo))
//{
// row.CellStyles.Default.Background.Color1 = Color.AliceBlue;
// row.CellStyles.Default.Font = new Font("宋体", 14.75f, FontStyle.Bold, GraphicsUnit.Pixel);
//}
}
}
/// <summary>
/// 中行退款
/// </summary>
/// <param name="_orderObject">订单数据</param>
/// <param name="_paytype">支付类型</param>
/// <param name="Outtrading">退款要素</param>
private void SoftPosAPI(OrderObject _orderObject, string _paytype, string Outtrading)
{
try
{
LOGGER.Info("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓进入中行退款模块↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
SoftPosPay _softPosPay = new SoftPosPay();
RequestData request = new RequestData();
request.PosNo = Global.Instance.BusinessPlanLog.PosNo;
request.PayType = _paytype;
request.PayAmount = _orderObject.ReceivableAmount.ToString();
request.OperatorNo = Global.Instance.Worker.No;
request.Outtrading = Outtrading;
request.ContentType = " R";
var _data = _softPosPay.InitiateConsumption(request);
if (_data.Code == Proxy.Common.ReturnState.Failed)
{
this.ShowToastNotify(this, LangProxy.ToLang("中行退款失败!"));
}
else
{
this.ShowToastNotify(this, LangProxy.ToLang("退款成功!"));
}
LOGGER.Info("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑离开中行退款模块↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
}
catch (Exception ex)
{
LOGGER.Info("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓中行退款异常↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
LOGGER.Info(ex);
LOGGER.Info("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑中行退款异常↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
}
}
private void buttonX11_Click(object sender, EventArgs e)
{
//var isException = SplitPayUtils.Instance.Order2Split(this.startPicker.Value);
//LOGGER.Info($"↑↑↑手动分账[{this.startPicker.Value.ToString("yyyy-MM-dd")}]结果:{isException}↑↑↑");
//var result = SplitPayUtils.Instance.SplitData2Server();
//LOGGER.Info($"↑↑↑手动分账[{this.startPicker.Value.ToString("yyyy-MM-dd")}]上传结果:{result.Item1}↑↑↑");
#region subin 20231025 分账由实时改为交班时分账
splitFrm = new SplitPayUploadForm(0, 100);
this.Invoke(new EventJisuan(SplitHandle), sender, e);
#endregion
}
#region subin 20231025 分账由实时改为交班时分账
delegate void EventJisuan(object sender, EventArgs e);
SplitPayUploadForm splitFrm;
protected virtual void MessageEventNotify(object sender, MsgEventArgs args)
{
int pos = Convert.ToInt32(args.Data);
splitFrm.setPos(pos);//设置进度条位置20%
}
private void SplitHandle(object sender, EventArgs e)
{
splitFrm.Show(this);
splitFrm.setPos(0);//设置进度条位置0%
//需要加载进度的内容
var isException = SplitPayUtils.Instance.Order2Split(this.startPicker.Value);
if (isException)
{
LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]转分账数据失败↓↓↓");
DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据处理失败");
dialog.Show();
}
splitFrm.setPos(20);//设置进度条位置0%
#region 上传分账记录
var result1 = SplitPayUtils.Instance.SplitData2Server(this.startPicker.Value);
if (result1.Item1)
{
LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成完成↓↓↓");
}
else
{
LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成失败↓↓↓");
DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据上传失败");
dialog.Show();
}
splitFrm.setPos(100);//设置进度条位置0%
Thread.Sleep(100);
splitFrm.Close();
#endregion
}
#endregion
}
}