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.

431 lines
18 KiB
C#

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<string> _tradeNoList = new List<string>();
public DeliverySubmitForm(List<string> 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;
}
/// <summary>
/// 初始化其他支付方式
/// </summary>
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, "打开屏幕键盘异常");
}
}
/// <summary>
/// 交单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<string> sqlQueue = new ConcurrentQueue<string>();
//变更外送单状态
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<string> _orderids = new List<string>();
//明细
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<OrderItem>(_sql);
_item.RefundQuantity = decimal.Parse(_data.Cells[3].Value.ToString());
var _flavor = _db.FirstOrDefault<FlavorItem>(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<OrderObject>(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<OrderObject>(string.Format("where tradeNo = '{0}'", item));
var _item = _db.Query<OrderItem>(string.Format("where orderId = '{0}'", _order.Id));
var _pay = _db.FirstOrDefault<OrderPay>(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<string> sqlQueue = new ConcurrentQueue<string>();
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);
}
}
}