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>; 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>(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(); } /// /// 已选择商品 /// private List _selectProduct = new List(); /// /// 可选的商品数量 /// private int _dealSkuMappingDetailCount = 0; /// /// 包含的商品数量 /// 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(); // 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 productList = new List(); 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(sql); } if(productList.Count > 0) { BindDataSource(productList,allowChecked); } } //代金券,没有携带商品,需要先点单再核销 this.ButtonOK.Tag = new Tuple>(couponCode, content, productList); } else { this.ButtonOK.Enabled = false; this.ShowToastNotify(this, result.Item2); } } catch (Exception ex) { LOGGER.Error(ex, "查询券码["+couponCode+"]发生异常"); } } private void BindDataSource(List dataSource, bool allowChecked = false, PriceTypeEnum priceType = PriceTypeEnum.外送价) { try { if (dataSource == null) { dataSource = new List(); } 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()); } } }