|
|
|
|
using DevComponents.DotNetBar;
|
|
|
|
|
using DevComponents.DotNetBar.SuperGrid;
|
|
|
|
|
using POS.Language.Language;
|
|
|
|
|
using POSV.Component;
|
|
|
|
|
using POSV.Entity;
|
|
|
|
|
using POSV.ShoppingCart;
|
|
|
|
|
using POSV.Utils;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace POSV.Report
|
|
|
|
|
{
|
|
|
|
|
public partial class RefundItemForm : BusinessForm
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
|
|
|
|
|
|
|
|
|
private OrderObject _orderObject = null;
|
|
|
|
|
|
|
|
|
|
public RefundItemForm()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
this.controlBox1.Text = LangProxy.ToLang("退货");
|
|
|
|
|
this.controlBox1.ShowApplicationVersion = false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnLoad(e);
|
|
|
|
|
|
|
|
|
|
if (this.DesignMode) return;
|
|
|
|
|
|
|
|
|
|
DefaultGridStyle.setDefaultGridStyle(this.gridControl);
|
|
|
|
|
|
|
|
|
|
this.gridControl.PrimaryGrid.AllowEdit = true;
|
|
|
|
|
|
|
|
|
|
var panel = this.gridControl.PrimaryGrid;
|
|
|
|
|
//设置单元格小数位数
|
|
|
|
|
GridColumn quantity = panel.Columns["count"];
|
|
|
|
|
(quantity.EditControl as GridDoubleInputEditControl).DisplayFormat = "F3";
|
|
|
|
|
(quantity.RenderControl as GridDoubleInputEditControl).DisplayFormat = "F3";
|
|
|
|
|
|
|
|
|
|
//设置单元格小数位数
|
|
|
|
|
GridColumn price = panel.Columns["price"];
|
|
|
|
|
(price.EditControl as GridDoubleInputEditControl).DisplayFormat = "F2";
|
|
|
|
|
|
|
|
|
|
GridColumn discountPrice = panel.Columns["discountPrice"];
|
|
|
|
|
(discountPrice.EditControl as GridDoubleInputEditControl).DisplayFormat = "F2";
|
|
|
|
|
|
|
|
|
|
//设置单元格小数位数
|
|
|
|
|
GridColumn amount = panel.Columns["totalReceivableAmount"];
|
|
|
|
|
(amount.EditControl as GridDoubleInputEditControl).DisplayFormat = "F2";
|
|
|
|
|
|
|
|
|
|
GridColumn discountAmount = panel.Columns["totalDiscountAmount"];
|
|
|
|
|
(discountAmount.EditControl as GridDoubleInputEditControl).DisplayFormat = "F2";
|
|
|
|
|
|
|
|
|
|
this.lblAmount.Text = string.Format(this.lblAmount.Tag.ToString(), "0");
|
|
|
|
|
this.lblQuantity.Text = string.Format(this.lblQuantity.Tag.ToString(), "0");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RefreshUi(OrderObject orderObject)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
this._orderObject = orderObject;
|
|
|
|
|
this.labelX8.Text = string.Format(this.labelX8.Tag.ToString(), this._orderObject.TradeNo);
|
|
|
|
|
this.gridControl.PrimaryGrid.Rows.Clear();
|
|
|
|
|
|
|
|
|
|
if (this._orderObject.Items != null && this._orderObject.Items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var outDetails = this._orderObject.Items.FindAll(x => x.RowState != OrderRowState.套餐明);
|
|
|
|
|
var outDetailsBak = ObjectUtils.Copy(outDetails);
|
|
|
|
|
|
|
|
|
|
outDetailsBak.ForEach(x =>
|
|
|
|
|
{
|
|
|
|
|
decimal _quantity = x.UsableRefundQuantity;
|
|
|
|
|
decimal _price = x.DiscountPrice;
|
|
|
|
|
decimal flavorAmount = decimal.Zero;
|
|
|
|
|
if (x.Flavors != null && x.Flavors.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
foreach (var flavor in x.Flavors)
|
|
|
|
|
{
|
|
|
|
|
flavorAmount += (flavor.QtyFlag == 1) ? flavor.BaseQuantity * flavor.Price : _quantity * flavor.Price;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (x.RowState == OrderRowState.套餐主)
|
|
|
|
|
{
|
|
|
|
|
var detailList = this._orderObject.Items.FindAll(y => y.ParentId == x.Id);
|
|
|
|
|
if (detailList != null && detailList.Count > 0 && detailList.Exists(y => y.Flavors != null && y.Flavors.Count > 0))
|
|
|
|
|
{
|
|
|
|
|
var flavorDetail = detailList.FindAll(y => y.Flavors != null && y.Flavors.Count > 0);
|
|
|
|
|
foreach (var detail in flavorDetail)
|
|
|
|
|
{
|
|
|
|
|
foreach (var flavor in detail.Flavors)
|
|
|
|
|
{
|
|
|
|
|
flavorAmount += (flavor.QtyFlag == 1) ? flavor.BaseQuantity * flavor.Price : _quantity * flavor.Price;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//重新计算退金额显示
|
|
|
|
|
x.UsableRefundAmount = _quantity * _price + flavorAmount;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.gridControl.PrimaryGrid.DataSource = outDetailsBak;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
logger.Error(ex, "获取订单明细异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 单行选中
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
private void OnGridCellClick(object sender, GridCellClickEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var row = e.GridCell.GridRow;
|
|
|
|
|
if (row != null)
|
|
|
|
|
{
|
|
|
|
|
var isChecked = row["Checked"].Value;
|
|
|
|
|
if (isChecked != null)
|
|
|
|
|
{
|
|
|
|
|
if (Convert.ToBoolean(isChecked) == true)
|
|
|
|
|
{
|
|
|
|
|
row["Checked"].Value = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
row["Checked"].Value = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
row["Checked"].Value = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnGridControlCellValueChanged(object sender, GridCellValueChangedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
GridRow row = e.GridCell.GridRow;
|
|
|
|
|
|
|
|
|
|
GridColumn column = e.GridCell.GridColumn;
|
|
|
|
|
|
|
|
|
|
switch (column.Name)
|
|
|
|
|
{
|
|
|
|
|
case "count":
|
|
|
|
|
{
|
|
|
|
|
var itemId = Convert.ToString(row["itemId"].Value);
|
|
|
|
|
if (this._orderObject.Items.Exists(x => x.Id == itemId))
|
|
|
|
|
{
|
|
|
|
|
var item = this._orderObject.Items.Find(x => x.Id == itemId);
|
|
|
|
|
|
|
|
|
|
var copyItem = ObjectUtils.Copy(item);
|
|
|
|
|
|
|
|
|
|
decimal oldValue = 0;
|
|
|
|
|
decimal.TryParse(e.OldValue.ToString(), out oldValue);
|
|
|
|
|
|
|
|
|
|
decimal newValue = 0;
|
|
|
|
|
decimal.TryParse(e.NewValue.ToString(), out newValue);
|
|
|
|
|
|
|
|
|
|
if (oldValue > 0 && (newValue <= 0 || newValue > (item.Quantity - item.MiddleRefundQuantity)))
|
|
|
|
|
{
|
|
|
|
|
e.GridCell.Value = oldValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
decimal _quantity = Convert.ToDecimal(e.GridCell.Value);
|
|
|
|
|
decimal _price = Convert.ToDecimal(row["discountPrice"].Value);
|
|
|
|
|
decimal flavorAmount = decimal.Zero;
|
|
|
|
|
if (item.Flavors != null && item.Flavors.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
foreach (var flavor in item.Flavors)
|
|
|
|
|
{
|
|
|
|
|
flavorAmount += (flavor.QtyFlag == 1) ? flavor.BaseQuantity * flavor.Price : _quantity * flavor.Price;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (item.RowState == OrderRowState.套餐主)
|
|
|
|
|
{
|
|
|
|
|
var detailList = this._orderObject.Items.FindAll(y => y.ParentId == item.Id);
|
|
|
|
|
if (detailList != null && detailList.Count > 0 && detailList.Exists(y => y.Flavors != null && y.Flavors.Count > 0))
|
|
|
|
|
{
|
|
|
|
|
var flavorDetail = detailList.FindAll(y => y.Flavors != null && y.Flavors.Count > 0);
|
|
|
|
|
foreach (var detail in flavorDetail)
|
|
|
|
|
{
|
|
|
|
|
foreach (var flavor in detail.Flavors)
|
|
|
|
|
{
|
|
|
|
|
flavorAmount += (flavor.QtyFlag == 1) ? flavor.BaseQuantity * flavor.Price : _quantity * flavor.Price;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
row["totalReceivableAmount"].Value = _quantity * _price + flavorAmount;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GridPanel panel = e.GridPanel;
|
|
|
|
|
|
|
|
|
|
decimal quantity = 0;
|
|
|
|
|
decimal amount = 0;
|
|
|
|
|
|
|
|
|
|
foreach (GridRow r in panel.Rows)
|
|
|
|
|
{
|
|
|
|
|
var isChecked = r["Checked"].Value;
|
|
|
|
|
|
|
|
|
|
if (Convert.ToBoolean(isChecked) == true)
|
|
|
|
|
{
|
|
|
|
|
quantity += Convert.ToDecimal(r["count"].Value);
|
|
|
|
|
|
|
|
|
|
amount += Convert.ToDecimal(r["totalReceivableAmount"].Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.lblQuantity.Text = string.Format(this.lblQuantity.Tag.ToString(), DecimalUtils.ToRound(quantity, 0));
|
|
|
|
|
this.lblAmount.Text = string.Format(this.lblAmount.Tag.ToString(), DecimalUtils.ToRound(amount, 2));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnControlBoxCloseClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
OnCloseTouchClick(sender, e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnCloseTouchClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (this.Owner != null)
|
|
|
|
|
{
|
|
|
|
|
this.Owner.DialogResult = this.DialogResult;
|
|
|
|
|
this.Owner.Close();
|
|
|
|
|
}
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnSelectAllClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (this.buttonX1.Text == "全选")
|
|
|
|
|
{
|
|
|
|
|
SelectAllItems(true);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SelectAllItems(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 全选/全不选
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SelectAllItems(bool selectFlag)
|
|
|
|
|
{
|
|
|
|
|
var panel = this.gridControl.PrimaryGrid;
|
|
|
|
|
|
|
|
|
|
foreach (GridRow row in panel.Rows)
|
|
|
|
|
{
|
|
|
|
|
row["Checked"].Value = selectFlag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.buttonX1.Text = selectFlag ? "全不选" : "全选";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 检查是否有要退货的商品以及退货数量
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private Tuple<bool, decimal> CheckExistRefundProduct()
|
|
|
|
|
{
|
|
|
|
|
// 是否有退款项
|
|
|
|
|
bool existRefundRow = false;
|
|
|
|
|
// 退货数量
|
|
|
|
|
decimal returnQuantity = decimal.Zero;
|
|
|
|
|
foreach (GridRow row in this.gridControl.PrimaryGrid.Rows)
|
|
|
|
|
{
|
|
|
|
|
var isRefund = Convert.ToBoolean(row["Checked"].Value);
|
|
|
|
|
if (isRefund)
|
|
|
|
|
{
|
|
|
|
|
decimal quantity = Convert.ToDecimal(row["count"].Value);
|
|
|
|
|
returnQuantity += quantity;
|
|
|
|
|
|
|
|
|
|
existRefundRow = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return new Tuple<bool, decimal>(existRefundRow, returnQuantity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 确认退货
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
private void OnAcceptClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (!CheckExistRefundProduct().Item1)
|
|
|
|
|
{
|
|
|
|
|
this.ShowToastNotify(this, "请选择要退货的商品");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (CheckExistRefundProduct().Item2 <= 0)
|
|
|
|
|
{
|
|
|
|
|
this.ShowToastNotify(this, "没有需要退货的商品");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<OrderItem> refundItems = new List<OrderItem>();
|
|
|
|
|
foreach (GridRow row in this.gridControl.PrimaryGrid.Rows)
|
|
|
|
|
{
|
|
|
|
|
var isRefund = Convert.ToBoolean(row["Checked"].Value);
|
|
|
|
|
|
|
|
|
|
if (isRefund)
|
|
|
|
|
{
|
|
|
|
|
//退数量
|
|
|
|
|
decimal quantity = Convert.ToDecimal(row["count"].Value);
|
|
|
|
|
//价格
|
|
|
|
|
decimal price = Convert.ToDecimal(row["discountPrice"].Value);
|
|
|
|
|
//退金额
|
|
|
|
|
decimal amount = DecimalUtils.ToRound(Convert.ToDecimal(row["totalReceivableAmount"].Value), 2);
|
|
|
|
|
|
|
|
|
|
var id = Convert.ToString(row["itemId"].Value);
|
|
|
|
|
if (this._orderObject.Items.Exists(x => x.Id == id))
|
|
|
|
|
{
|
|
|
|
|
//原单-行对象
|
|
|
|
|
var refundOrderItem = this._orderObject.Items.Find(x => x.Id == id);
|
|
|
|
|
|
|
|
|
|
//有效数量
|
|
|
|
|
var _effectiveQuantity = refundOrderItem.Quantity - refundOrderItem.MiddleRefundQuantity;
|
|
|
|
|
if (_effectiveQuantity <= 0)
|
|
|
|
|
{
|
|
|
|
|
//排除不可退的商品
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//退数量
|
|
|
|
|
refundOrderItem.Quantity = quantity;
|
|
|
|
|
refundOrderItem.Amount = amount;
|
|
|
|
|
|
|
|
|
|
refundItems.Add(refundOrderItem);
|
|
|
|
|
|
|
|
|
|
if (refundOrderItem.RowState == OrderRowState.套餐主)
|
|
|
|
|
{
|
|
|
|
|
//捆绑商品处理
|
|
|
|
|
var subItems = this._orderObject.Items.FindAll(x => x.ParentId == id && x.Group == refundOrderItem.Group);
|
|
|
|
|
|
|
|
|
|
foreach (var oldSubItem in subItems)
|
|
|
|
|
{
|
|
|
|
|
//新单-行对象,将参与退货的单品记入退货新单中
|
|
|
|
|
var newSubItem = ObjectUtils.Copy(oldSubItem);
|
|
|
|
|
|
|
|
|
|
//有效数量
|
|
|
|
|
var _subEffectiveQuantity = oldSubItem.Quantity - oldSubItem.MiddleRefundQuantity;
|
|
|
|
|
if (_subEffectiveQuantity <= 0)
|
|
|
|
|
{
|
|
|
|
|
//排除不可退的商品
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//退数量
|
|
|
|
|
newSubItem.Quantity = quantity;
|
|
|
|
|
|
|
|
|
|
refundItems.Add(newSubItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (refundItems.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
DialogForm.ShowAlert(this, "操作提示", "请选择可退数量大于0的销售记录");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.OnAcceptButtonClick(new TransparentEventArgs(TransparentAction.Accept, LangProxy.ToLang("退货"), refundItems));
|
|
|
|
|
|
|
|
|
|
OnCloseTouchClick(sender, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|