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.

382 lines
15 KiB
C#

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);
}
}
}