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, "获取订单明细异常"); } } /// /// 单行选中 /// /// /// 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); } } /// /// 全选/全不选 /// private void SelectAllItems(bool selectFlag) { var panel = this.gridControl.PrimaryGrid; foreach (GridRow row in panel.Rows) { row["Checked"].Value = selectFlag; } this.buttonX1.Text = selectFlag ? "全不选" : "全选"; } /// /// 检查是否有要退货的商品以及退货数量 /// /// private Tuple 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(existRefundRow, returnQuantity); } /// /// 确认退货 /// /// /// private void OnAcceptClick(object sender, EventArgs e) { if (!CheckExistRefundProduct().Item1) { this.ShowToastNotify(this, "请选择要退货的商品"); return; } if (CheckExistRefundProduct().Item2 <= 0) { this.ShowToastNotify(this, "没有需要退货的商品"); return; } List refundItems = new List(); 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); } } }