|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using DevComponents.DotNetBar;
|
|
|
|
|
using DevComponents.DotNetBar.Metro;
|
|
|
|
|
using POSV.Dianping;
|
|
|
|
|
using POSV.Entity;
|
|
|
|
|
using POSV.ShoppingCart;
|
|
|
|
|
using POSV.Utils;
|
|
|
|
|
|
|
|
|
|
namespace POSV.Component
|
|
|
|
|
{
|
|
|
|
|
public partial class MeituanCouponForm : BusinessForm
|
|
|
|
|
{
|
|
|
|
|
private OrderObject _orderObject = null;
|
|
|
|
|
|
|
|
|
|
public MeituanCouponForm(OrderObject orderObject)
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
|
|
|
|
this.itemPanel.ResizeItemsToFit = false;
|
|
|
|
|
this.itemPanel.BackgroundStyle.Class = "MetroTileGroupTitle";//很关键
|
|
|
|
|
|
|
|
|
|
this.controlBox.Text = "线上卡券核销";
|
|
|
|
|
this.lblCouponName.Text = string.Empty;
|
|
|
|
|
this.ButtonOK.Enabled = false;
|
|
|
|
|
|
|
|
|
|
this.ActiveControl = this.txtCouponCode;
|
|
|
|
|
|
|
|
|
|
_orderObject = orderObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnKeyboardClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (sender is NumericTextBox)
|
|
|
|
|
{
|
|
|
|
|
var obj = sender as NumericTextBox;
|
|
|
|
|
var point = this.PointToScreen(obj.Location);
|
|
|
|
|
var p = NumericKeyboard.CalculateLocation(point, obj.Width);
|
|
|
|
|
NumericKeyboard.ShowKeyboard(this, p);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public delegate void EventHandler(object sender, NotifyEventArgs e);
|
|
|
|
|
|
|
|
|
|
public event EventHandler CouponClick;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnCouponButtonClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var button = sender as ButtonX;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
button.Enabled = false;
|
|
|
|
|
|
|
|
|
|
//zhangy Add 2020-05-21 不存在美团券支付方式,禁止使用
|
|
|
|
|
var meituanPayMode = OrderUtils.GetMeituanPayMode();
|
|
|
|
|
if(meituanPayMode == null)
|
|
|
|
|
{
|
|
|
|
|
DialogForm.ShowAlert(this, "操作提示", "门店没有美团券支付方式,请联系总部");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var obj = button.Tag as Tuple<string, CouponStatusQueryResponse, List<ProductExt>>;
|
|
|
|
|
|
|
|
|
|
var content = obj.Item2;
|
|
|
|
|
|
|
|
|
|
//包含商品并且已经点单
|
|
|
|
|
if (this._dealSkuMappingDetailCount > 0 && this._orderObject.Items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
DialogForm.ShowAlert(this, "操作提示", "该券不支持和其他商品混用");
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//代金券,没有携带商品,需要先点单再核销
|
|
|
|
|
if (content.DealType == 1 && this._dealSkuMappingDetailCount == 0 && this._orderObject.Items.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
DialogForm.ShowAlert(this, "操作提示", "请先点单,然后再核销代金券");
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//可选商品数量和已选商品数量不匹配
|
|
|
|
|
if (this._dealSkuMappingDetailCount != this._selectProduct.Count)
|
|
|
|
|
{
|
|
|
|
|
DialogForm.ShowAlert(this, "操作提示", "请任意选择【"+ this._dealSkuMappingDetailCount + "】款商品");
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var data = new Tuple<string, CouponStatusQueryResponse, List<ProductExt>>(obj.Item1,obj.Item2,this._selectProduct);
|
|
|
|
|
|
|
|
|
|
var args = new NotifyEventArgs(NotifyAction.Accept, data);
|
|
|
|
|
|
|
|
|
|
CouponClick?.Invoke(this, args);
|
|
|
|
|
|
|
|
|
|
this.OnTouchClick(sender, e);
|
|
|
|
|
}
|
|
|
|
|
catch(Exception ex){}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
button.Enabled = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnTouchClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (this.Owner != null)
|
|
|
|
|
{
|
|
|
|
|
this.Owner.Close();
|
|
|
|
|
}
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 已选择商品
|
|
|
|
|
/// </summary>
|
|
|
|
|
private List<ProductExt> _selectProduct = new List<ProductExt>();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 可选的商品数量
|
|
|
|
|
/// </summary>
|
|
|
|
|
private int _dealSkuMappingDetailCount = 0;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 包含的商品数量
|
|
|
|
|
/// </summary>
|
|
|
|
|
private int _vendorSkusCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void DoQueryCouponByCode(string couponCode)
|
|
|
|
|
{
|
|
|
|
|
//清空确认按钮的绑定对象
|
|
|
|
|
this.ButtonOK.Tag = null;
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(couponCode))
|
|
|
|
|
{
|
|
|
|
|
this.ShowToastNotify(this, "请输入券码");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//券码是否已经在优惠清单中
|
|
|
|
|
if(this._orderObject.Promotions.Exists(x => couponCode.Equals(x.PlanNo)))
|
|
|
|
|
{
|
|
|
|
|
this.ShowToastNotify(this, "本单含券码["+couponCode+"],不要重复使用");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var request = new CouponStatusQueryRequest();
|
|
|
|
|
request.CouponCode = couponCode;
|
|
|
|
|
request.VendorShopId = Global.Instance.Authc.StoreNo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var result = MeituanCouponUtils.Instance.CouponQuery(request);
|
|
|
|
|
|
|
|
|
|
if (result.Item1)
|
|
|
|
|
{
|
|
|
|
|
var content = result.Item3;
|
|
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
|
////zhangy 2020-05-09 Add 模拟测试
|
|
|
|
|
//if (content.DealSkuMappingDetail == null)
|
|
|
|
|
//{
|
|
|
|
|
// content.DealSkuMappingDetail = new DealSkuMappingDetail();
|
|
|
|
|
|
|
|
|
|
// content.DealSkuMappingDetail.Count = 2;
|
|
|
|
|
|
|
|
|
|
// content.DealSkuMappingDetail.VendorSkus = new List<string>();
|
|
|
|
|
|
|
|
|
|
// content.DealSkuMappingDetail.VendorSkus.Add("791756554734014465");
|
|
|
|
|
// content.DealSkuMappingDetail.VendorSkus.Add("660654278133813248");
|
|
|
|
|
// content.DealSkuMappingDetail.VendorSkus.Add("690264477832187904");
|
|
|
|
|
//}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.ButtonOK.Enabled = (content.Status == 10);
|
|
|
|
|
string dealTypeName = getDealTypeName(content.DealType);
|
|
|
|
|
|
|
|
|
|
string dealSkuMappingDetailInfo = "不包含商品";
|
|
|
|
|
bool allowChecked = false;
|
|
|
|
|
|
|
|
|
|
//清理已选商品
|
|
|
|
|
this._selectProduct.Clear();
|
|
|
|
|
|
|
|
|
|
if (content.DealSkuMappingDetail != null && content.DealSkuMappingDetail.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
//可选数量
|
|
|
|
|
this._dealSkuMappingDetailCount = content.DealSkuMappingDetail.Count;
|
|
|
|
|
//包含的商品数量
|
|
|
|
|
this._vendorSkusCount = content.DealSkuMappingDetail.VendorSkus.Count;
|
|
|
|
|
|
|
|
|
|
//可选数量和定义数量相同
|
|
|
|
|
if (this._dealSkuMappingDetailCount == this._vendorSkusCount)
|
|
|
|
|
{
|
|
|
|
|
dealSkuMappingDetailInfo = "包含[" + this._dealSkuMappingDetailCount + "]个商品";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//允许任选
|
|
|
|
|
allowChecked = true;
|
|
|
|
|
|
|
|
|
|
dealSkuMappingDetailInfo = "请在["+ this._vendorSkusCount + "]款商品中任选[" + this._dealSkuMappingDetailCount + "]个";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.lblCouponName.Text = string.Format("【{0}】{1},{2}",dealTypeName, content.DealTitle, dealSkuMappingDetailInfo);
|
|
|
|
|
|
|
|
|
|
this.lblCouponStatus.Text = (content.Status == 10 ? "可用" : "不可用");
|
|
|
|
|
|
|
|
|
|
this.lblCouponEndTime.Text = content.CouponEndTime;
|
|
|
|
|
|
|
|
|
|
this.lblDealValue.Text = Convert.ToString(content.DealValue);
|
|
|
|
|
|
|
|
|
|
List<ProductExt> productList = new List<ProductExt>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (content.DealSkuMappingDetail != null && content.DealSkuMappingDetail.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var skus = content.DealSkuMappingDetail.VendorSkus;
|
|
|
|
|
string specIds = "'"+ string.Join("','", skus.ToArray()) + "'";
|
|
|
|
|
|
|
|
|
|
string sql = string.Format(SqlConstant.ProductExtBySpecIds, specIds);
|
|
|
|
|
using (var db = Global.Instance.OpenDataBase)
|
|
|
|
|
{
|
|
|
|
|
productList = db.Fetch<ProductExt>(sql);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(productList.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
BindDataSource(productList,allowChecked);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//代金券,没有携带商品,需要先点单再核销
|
|
|
|
|
this.ButtonOK.Tag = new Tuple<string, CouponStatusQueryResponse, List<ProductExt>>(couponCode, content, productList);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.ButtonOK.Enabled = false;
|
|
|
|
|
this.ShowToastNotify(this, result.Item2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LOGGER.Error(ex, "查询券码["+couponCode+"]发生异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void BindDataSource(List<ProductExt> dataSource, bool allowChecked = false, PriceTypeEnum priceType = PriceTypeEnum.外送价)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (dataSource == null)
|
|
|
|
|
{
|
|
|
|
|
dataSource = new List<ProductExt>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ItemContainer mainContainer = new ItemContainer();
|
|
|
|
|
mainContainer.Name = "productContainer";
|
|
|
|
|
mainContainer.MultiLine = true;
|
|
|
|
|
mainContainer.ItemSpacing = 5;
|
|
|
|
|
mainContainer.LayoutOrientation = eOrientation.Horizontal;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < dataSource.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
ProductExt entity = dataSource[i];
|
|
|
|
|
|
|
|
|
|
MetroTileItem item = new MetroTileItem();
|
|
|
|
|
item.TileStyle.PaddingLeft = item.TileStyle.PaddingRight = 0;
|
|
|
|
|
item.EnableMarkup = true;
|
|
|
|
|
//item.OptionGroup = "product";
|
|
|
|
|
item.TileStyle.BorderWidth = 0;
|
|
|
|
|
item.TileStyle.BackColor = ColorTranslator.FromHtml("#E7EAF1");// Color.White;
|
|
|
|
|
item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#E7EAF1");//Color.White;
|
|
|
|
|
item.TileStyle.BorderColor = ColorTranslator.FromHtml("#E7EAF1");//Color.White;
|
|
|
|
|
item.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#E7EAF1");//Color.White;
|
|
|
|
|
|
|
|
|
|
item.TitleTextAlignment = ContentAlignment.MiddleCenter;
|
|
|
|
|
item.Checked = false;
|
|
|
|
|
|
|
|
|
|
item.CheckBehavior = eMetroTileCheckBehavior.LeftMouseButtonClick;
|
|
|
|
|
|
|
|
|
|
item.TileSize = new Size(116, 76);
|
|
|
|
|
|
|
|
|
|
//显示编码后,调整呈现位置
|
|
|
|
|
item.TileStyle.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
|
|
|
|
|
item.TileStyle.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center;
|
|
|
|
|
|
|
|
|
|
//品名
|
|
|
|
|
item.TileStyle.TextColor = ColorTranslator.FromHtml("#444444");
|
|
|
|
|
//绑定商品名称到Text属性
|
|
|
|
|
string specName = string.IsNullOrEmpty(entity.SpecName) ? "" : Global.Instance.Additional.Item1 + entity.SpecName + Global.Instance.Additional.Item2;
|
|
|
|
|
//附加规格到名称中
|
|
|
|
|
string displayName = entity.Name + specName;
|
|
|
|
|
|
|
|
|
|
item.Text = displayName;
|
|
|
|
|
|
|
|
|
|
//美团线上价格可能和门店价格不一致,采用第三方价确保一致
|
|
|
|
|
entity.Price = entity.OtherPrice > 0 ? entity.OtherPrice : entity.Price;
|
|
|
|
|
|
|
|
|
|
//绑定商品Tag属性
|
|
|
|
|
item.Tag = ObjectUtils.Copy(entity);
|
|
|
|
|
|
|
|
|
|
item.CheckedChanged -= OnProductCheckedChanged;
|
|
|
|
|
item.CheckedChanged += OnProductCheckedChanged;
|
|
|
|
|
|
|
|
|
|
mainContainer.SubItems.Add(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.itemPanel.Items.Insert(0, mainContainer);
|
|
|
|
|
|
|
|
|
|
this.itemPanel.Invalidate();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LOGGER.Error(ex, "构建美团商品内容异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnProductCheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
MetroTileItem item = (MetroTileItem)sender;
|
|
|
|
|
var product = item.Tag as ProductExt;
|
|
|
|
|
|
|
|
|
|
if (item.Checked)
|
|
|
|
|
{
|
|
|
|
|
this._selectProduct.Add(product);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this._selectProduct.RemoveAll(x => product.SpecId.Equals(x.SpecId));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
private string getDealTypeName(int dealType)
|
|
|
|
|
{
|
|
|
|
|
string result = string.Empty;
|
|
|
|
|
switch (dealType)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
result = "代金券";
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
result = "套餐券";
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
result = "霸王餐";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnQueryClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var button = sender as ButtonX;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
button.Enabled = false;
|
|
|
|
|
|
|
|
|
|
DoQueryCouponByCode(this.txtCouponCode.Text.Trim());
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
button.Enabled = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnCouponCodeEnterClick(object sender, EnterEventArg e)
|
|
|
|
|
{
|
|
|
|
|
DoQueryCouponByCode(this.txtCouponCode.Text.Trim());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|