using DevComponents.DotNetBar; using DevComponents.DotNetBar.Metro; using POSV.Entity; using POSV.MessageEvent; using POSV.ShoppingCart; using POSV.Utils; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; namespace POSV.WaiMai { public partial class DeliverySubmitForm : BusinessForm { private List _tradeNoList = new List(); public DeliverySubmitForm(List tradeNoList, bool Refund = false) { InitializeComponent(); _tradeNoList = tradeNoList; _Refund = Refund; } bool _Refund = false; protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; this.controlBox1.Text = _Refund ? "外送单-退单" : "外送单-交单"; //标题 this.lblTitle.Text = string.Format(this.lblTitle.Tag.ToString(), string.Join(",", _tradeNoList)); InitlizeOrderInfo(); InitlizeOtherPayItem(); } private void InitlizeOrderInfo() { var tradeNos = string.Join("','", _tradeNoList); tradeNos = "'" + tradeNos + "'"; //查询订单信息 string sql = @"select cast(sum(f.[paidAmount]) as text) as paidAmount, cast(sum(f.[amount]) as text) as amount, cast(sum(f.[discountAmount]) as text) as discountAmount, cast(sum(malingAmount) as text) as malingAmount, cast(sum(t.[advanceAmount]) as text) as advanceAmount from pos_order f left join pos_order_delivery t on f.[tradeNo] = t.[tradeNo] where f.[tradeNo] in ({0});"; DataSet ds = SqliteUtils.Query(string.Format(sql, tradeNos), "data"); DataTable dt = ds.Tables["data"]; if (dt != null && dt.Rows.Count > 0) { var row = dt.Rows[0]; //预支 this.lblAdvanceAmount.Text = string.Format(this.lblAdvanceAmount.Tag.ToString(), StringUtils.GetString(row["advanceAmount"])); //应收 this.lblReceivableAmount.Text = string.Format(this.lblReceivableAmount.Tag.ToString(), StringUtils.GetString(row["paidAmount"])); //消费金额 this.lblTotalAmount.Text = string.Format(this.lblTotalAmount.Tag.ToString(), StringUtils.GetString(row["amount"])); //优惠金额 this.lblConcessionaryAmount.Text = string.Format(this.lblConcessionaryAmount.Tag.ToString(), StringUtils.GetString(row["discountAmount"])); //抹零 this.lblMaling.Text = string.Format(this.lblMaling.Tag.ToString(), StringUtils.GetString(row["malingAmount"])); } else { //预支 this.lblAdvanceAmount.Text = string.Format(this.lblAdvanceAmount.Tag.ToString(), "0.00"); //应收 this.lblReceivableAmount.Text = string.Format(this.lblReceivableAmount.Tag.ToString(), "0.00"); //消费金额 this.lblTotalAmount.Text = string.Format(this.lblTotalAmount.Tag.ToString(), "0.00"); //优惠金额 this.lblConcessionaryAmount.Text = string.Format(this.lblConcessionaryAmount.Tag.ToString(), "0.00"); //抹零 this.lblMaling.Text = string.Format(this.lblMaling.Tag.ToString(), "0.00"); } sql = @"select f.id, f.[tradeNo],f.[saleDate], f.[productId], f.[displayName], f.[quantity],f.[rquantity], f.[price], f.[totalDiscountAmount], f.[totalAmount] from [pos_order_item] f where f.[tradeNo] in ({0});"; ds = SqliteUtils.Query(string.Format(sql, tradeNos), "data"); dt = ds.Tables["data"]; this.superGridControl1.PrimaryGrid.DataSource = dt; } /// /// 初始化其他支付方式 /// private void InitlizeOtherPayItem() { var presentation = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_DEFAULT_MODE_FO_PRESENTATION, false); if (presentation) { otherPayModePanel.Visible = false; } else { //获取收银方式列表,获取前台展示 var payModeList = OrderUtils.GetPayModeList().FindAll(x => x.FrontFlag == 1); ItemContainer ic = new ItemContainer(); ic.MultiLine = true; foreach (var entity in payModeList) { //忽略显示的支付方式 会员卡\支付宝\微信支付\抹零 if (entity.No == "02" || entity.No == "04" || entity.No == "05" || entity.No == "06") continue; MetroTileItem template = new MetroTileItem(); template.Checked = false; template.CheckBehavior = eMetroTileCheckBehavior.LeftMouseButtonClick; template.OptionGroup = "otherPayGroup"; template.TileSize = new Size(60, 40); template.TileColor = eMetroTileColor.Coffee; template.TileStyle.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; template.TileStyle.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; template.TitleTextAlignment = System.Drawing.ContentAlignment.TopCenter; template.EnableMarkup = true; if (template.Checked) { template.TileColor = eMetroTileColor.DarkGreen; } template.DisabledBackColor = SystemColors.ControlDarkDark; //绑定Tag template.Tag = entity; template.Text = entity.Name; template.CheckedChanged += (o, args) => { MetroTileItem item = (MetroTileItem)o; item.TileColor = item.Checked ? eMetroTileColor.DarkGreen : eMetroTileColor.Coffee; }; ic.SubItems.Add(template); } this.otherPayModePanel.Items.Add(ic); this.otherPayModePanel.Invalidate(); } } private void OnCloseClick(object sender, EventArgs e) { if (this.Owner != null) { this.Owner.Close(); } this.Close(); } private void OnKeyboardClick(object sender, EventArgs e) { try { KeyboardType keyboardType = KeyboardType.中文; Type type = this.ActiveControl.GetType(); PropertyInfo pinfo = type.GetProperty("Keyboard"); if (pinfo != null) { keyboardType = (KeyboardType)pinfo.GetValue(this.ActiveControl, null); } var keyboard = Application.OpenForms["VirtualKeyboard"]; if (keyboard == null) { keyboard = new VirtualKeyboard(keyboardType); } ((VirtualKeyboard)keyboard).ShowVirtualKeyboard(this, keyboardType); } catch (Exception ex) { LOGGER.Error(ex, "打开屏幕键盘异常"); } } /// /// 交单 /// /// /// private void OnOrderSubmitClick(object sender, EventArgs e) { var isSucc = false; try { PayMode mode = null; var presentation = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_DEFAULT_MODE_FO_PRESENTATION, false); if (!presentation) { if (otherPayModePanel.SelectedItems.Count == 0) { ShowToastNotify(this, "请选择付款方式"); return; } mode = otherPayModePanel.SelectedItems[0].Tag as PayMode; } else { mode = OrderUtils.GetPayModeList().FirstOrDefault(f => f.No.Equals("20")); } lock (Global.Instance.SyncLock) { var tradeNos = string.Join("','", _tradeNoList); tradeNos = "'" + tradeNos + "'"; ConcurrentQueue sqlQueue = new ConcurrentQueue(); //变更外送单状态 string takeOutSqlTem = @"update pos_order_delivery set [status] = 2, [settlementDate] = '{0}' where [tradeNo] in ({1});"; sqlQueue.Enqueue(string.Format(takeOutSqlTem, DateTimeUtils.GetNowFormat(), tradeNos)); //更改订单状态,重新上传 //string orderTem = @"update pos_order set [orderStatus] = '{0}', [paymentStatus] = '{1}', [syncStatus] = 0, [uploadErrors] = 0 where [tradeNo] in ({2});"; //sqlQueue.Enqueue(string.Format(orderTem, (int)OrderStatus.已完成, (int)OrderPaymentStatus.已付款, tradeNos)); List _orderids = new List(); //明细 foreach (var item in this.superGridControl1.PrimaryGrid.Rows) { var _data = item as DevComponents.DotNetBar.SuperGrid.GridRow; if (_data.Cells[3].Value == null) { _data.Cells[3].Value = 0; } var _qty = decimal.Parse(_data.Cells[2].Value.ToString()); var _returnqty = decimal.Parse(_data.Cells[3].Value.ToString()); var _price = decimal.Parse(_data.Cells[4].Value.ToString()); var _discounts = decimal.Parse(_data.Cells[5].Value.ToString()); if (decimal.Parse(_data.Cells[3].Value?.ToString()) > 0) { using (var _db = Global.Instance.OpenDataBase) { using (var _trans = _db.GetTransaction()) { var _sql = string.Format("where id = '{0}'", _data.Cells[0].Value.ToString()); var _item = _db.FirstOrDefault(_sql); _item.RefundQuantity = decimal.Parse(_data.Cells[3].Value.ToString()); var _flavor = _db.FirstOrDefault(string.Format("where itemId = '{0}'", _item.Id)); if (_flavor != null) { _flavor.RefundQuantity = _item.RefundQuantity; _flavor.OrderItemQuantity = (_flavor.Quantity - _flavor.RefundQuantity); _db.Update(_flavor); } _db.Update(_item); _orderids.Add(_item.OrderId); _trans.Complete(); } //var _order = _db.Query(string.Format("where [tradeNo] in ({0});", tradeNos)).ToList(); // foreach (var _orderitem in _order) // { // var condition = " where orderId in ('" + _orderitem.Id + "');"; // _db. // } // var ids = string.Join("','", _order.ConvertAll(x => x.Id).ToArray()); // //var condition = " where orderId in ('" + ids + "');"; } } } foreach (var item in _tradeNoList) { using (var _db = Global.Instance.OpenDataBase) { using (var _trans = _db.GetTransaction()) { var _order = _db.FirstOrDefault(string.Format("where tradeNo = '{0}'", item)); var _item = _db.Query(string.Format("where orderId = '{0}'", _order.Id)); var _pay = _db.FirstOrDefault(string.Format("where orderId = '{0}'", _order.Id)); _order.OrderStatus = OrderStatus.已完成; _order.PayState = ((int)OrderPaymentStatus.已付款).ToString(); _order.UploadStatus = 0; _order.Items = _item.ToList(); _order.SyncStatus = 0; _order.UploadErrors = 0; _pay.PaidAmount = _order.ProductReceivableAmount; _pay.Amount = _order.ProductReceivableAmount; _pay.Status = ((int)OrderPaymentStatus.已付款).ToString() ; _pay.No = mode.No; _pay.Name = mode.Name; _pay.StatusDesc = "电话外卖交单"; _pay.Memo = "电话外卖交单"; _db.Update(_order); _db.Update(_pay); _trans.Complete(); } } } ////更改主单支付方式 //string orderPayTem = @"update pos_order_pay set [no] = '{0}', [name] = '{1}', [status]= '{2}', [statusDesc] = '{3}', [memo] = '{4}',[paidAmount] = {6} , [amount] = {6} where [no] = '20' and [tradeNo] in ({5});"; //sqlQueue.Enqueue(string.Format(orderPayTem, mode.No, mode.Name, (int)OrderPaymentStatus.已付款, "电话外卖交单", "电话外卖交单", tradeNos, money)); SqliteUtils.ExecuteTransaction(sqlQueue); Thread.Sleep(20); isSucc = true; } } catch (Exception ex) { LOGGER.Error(ex, "外送交单结账异常"); } if (isSucc) { DialogForm tempDialog = new DialogForm("交单提醒", "交单成功!", MessageBoxIcon.Information, MessageBoxButtons.OK); tempDialog.ShowDialog(); this.OnAcceptButtonClick(new TransparentEventArgs(TransparentAction.Accept, null, null)); //关闭 this.OnCloseClick(sender, e); } else { DialogForm tempDialog = new DialogForm("交单提醒", "交单失败!", MessageBoxIcon.Error, MessageBoxButtons.OK); tempDialog.ShowDialog(); } } private void OnCancelClick(object sender, EventArgs e) { this.OnCloseClick(sender, null); } private void superGridControl1_FilterEndEdit(object sender, DevComponents.DotNetBar.SuperGrid.GridFilterEndEditEventArgs e) { } private void superGridControl1_CellValueChanged(object sender, DevComponents.DotNetBar.SuperGrid.GridCellValueChangedEventArgs e) { var _sales = decimal.Parse(e.GridCell.GridRow.Cells[2].Value.ToString()); var _return = decimal.Parse(e.GridCell.GridRow.Cells[3].Value.ToString()); if (_return < 0) { this.ShowToastNotify(this, "请输入整数"); e.GridCell.GridRow.Cells[3].Value = 0; return; } if (_return > _sales) { this.ShowToastNotify(this, "退菜数量不能大于销售数量"); e.GridCell.GridRow.Cells[3].Value = e.GridCell.GridRow.Cells[2].Value; return; } } private bool Returndishes() { ConcurrentQueue sqlQueue = new ConcurrentQueue(); foreach (var item in this.superGridControl1.PrimaryGrid.Rows) { var _data = item as DevComponents.DotNetBar.SuperGrid.GridRow; if (decimal.Parse(_data.Cells[3].Value.ToString()) > 0) { sqlQueue.Enqueue(string.Format("update pos_order_item set rquantity = '{0}' where id = '{1}';", _data.Cells[3].Value.ToString(), _data.Cells[0].Value.ToString())); } } SqliteUtils.ExecuteTransaction(sqlQueue); return false; } private void buttonX2_Click(object sender, EventArgs e) { foreach (var item in this.superGridControl1.PrimaryGrid.Rows) { var _data = item as DevComponents.DotNetBar.SuperGrid.GridRow; _data.Cells[3].Value = _data.Cells[2].Value; } OnOrderSubmitClick(this.buttonX1, e); } } }