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.

397 lines
14 KiB
C#

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