using POSV.Bean; using POSV.Bill; using POSV.Card; using POSV.Cef.FastTemplate.PayMent.Base; using POSV.Entity; using POSV.MessageEvent; using POSV.ShoppingCart; using POSV.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace POSV.Cef.FastTemplate.PayMent { public class Member_Pay : PayBase { //================== 共有参数 ================= /// /// 会员卡参数配置规则 /// private MemberCardItem _currentCardItem = JsonUtils.Deserialize(Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_MEMBER_CARD)); /// /// 会员信息查询应答结果 /// private MemberInfoQueryResponse _currentMemberInfo = null; /// /// 读卡方式 /// private MemberCardOperator _currentOperator = MemberCardOperator.会员刷卡; /// /// 当前会员选择的会员卡 /// private MemberCard _currentCard = null; /// /// 会员卡支付前,请求的交易参考号 /// private CardTradeCreateVoucherNoResponse _newVoucherNo = null; /// /// 扣款结果集,模拟异步查询结果,用户发起支付将结果保存本次内存中。 /// private CardTradeCreateCardResponse createCardResponse = null; /// /// 扣款成功的加密字符 /// private string passwd = ""; /// /// 会员信息查询请求 /// private MemberInfoQueryRequest m_queryRequest = new MemberInfoQueryRequest(); /// /// 统一下单(卡支付明细) /// private CardTradeCreateCardRequest cardTradeCreate = null; public override PayItem PayStart() { var _data = this.PayResult(); if (_data.Item1) { return this.QueryPay(); } else { return null; } } public override void AsyncPayStart() { Task.Factory.StartNew(() => { if (this.AsyncPayResult != null) { this.m_QueryQuantity = 0; var _data = this.PayResult(); var _Query = this.QueryPay(); this.AddMCardPayType(cardTradeCreate, createCardResponse,false, passwd,_Query); this.AsyncPayResult(this.m_OrderObject, _Query, this.m_PayCode, this.m_Message, this.m_QueryQuantity); } }); } protected override Tuple PayResult() { var resp = CardUtils.MemberInfoQuery(m_queryRequest); //查询成功 if (resp.Item1) { //查询返回结果 this._currentMemberInfo = resp.Item3; //读卡方式 this._currentMemberInfo.GetWay = MemberCardNoType.电子卡号; if (this._currentMemberInfo.CardList.Count == 0) { this.m_Message = "没有可用的会员卡..."; return null; } //当前会员 if (this.m_OrderObject.Member == null && this._currentCardItem.Function.Contains(MemberCardFunctions.会员储值及消费)) { this.m_OrderObject.Member = this._currentMemberInfo; //外部未刷卡,新会员,执行订单会员价 foreach (var item in this.m_OrderObject.Items) { //套餐,自动找到套餐主菜进行优惠计算 if (item != null && item.RowState == OrderRowState.套餐明) { //套餐明细,找到套餐主菜进行优惠计算 var mainItem = this.m_OrderObject.Items.Find(x => x.Group == item.Group && x.RowState == OrderRowState.套餐主); if (mainItem != null) { if (item.Promotions != null && item.Promotions.Count > 0) { //有优惠,不计算单品优惠 //return; } else { var promResult = PromotionEngine.Instance.CalItemPromotion(this.m_OrderObject, item); if (promResult.Count > 0) { if (promResult.Exists(x => x.Type == PromotionType.双数特价优惠 || x.Type == PromotionType.双数特价赠送)) { //ApplyDoublePromMain(promResult, item); } else { var fineProm = promResult.OrderByDescending(x => x.DiscountAmount).ToList()[0]; var needUpdate = BusinessUtils.Instance.ApplyItemFinePromotion(this.m_OrderObject, item, fineProm); } } } } } else { if (item != null && item.Promotions != null && item.Promotions.Count > 0) { //有优惠,不计算单品优惠 //return; } else { var promResult = PromotionEngine.Instance.CalItemPromotion(this.m_OrderObject, item); if (promResult.Count > 0) { if (promResult.Exists(x => x.Type == PromotionType.双数特价优惠 || x.Type == PromotionType.双数特价赠送)) { //ApplyDoublePromMain(promResult, item); } else { var fineProm = promResult.OrderByDescending(x => x.DiscountAmount).ToList()[0]; var needUpdate = BusinessUtils.Instance.ApplyItemFinePromotion(this.m_OrderObject, item, fineProm); } } //套餐道菜分摊 PromotionUtils.CalculateSuitShare(this.m_OrderObject, item); } } } } this._currentOperator = MemberCardOperator.会员消费; //只有一张会员卡,自动选择作为当前可用会员卡 this._currentCard = this._currentMemberInfo.CardList[0]; //当前选中的会员卡 if (this.m_OrderObject.Member != null && this.m_OrderObject.Member.Id.Equals(this._currentMemberInfo.Id)) { this.m_OrderObject.Member.CurrentCard = this._currentCard; } //储值卡未0禁止使用 var skipNoMoney = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_CASHIER_CARDPAYSKIPNOMONEY, "0"); if (!BusinessUtils.Instance.HavMemberPromotionCoup(this.m_OrderObject) && this._currentCard != null && this._currentCard.AvailableAmount <= 0 && "1".Equals(skipNoMoney)) { this._currentOperator = MemberCardOperator.会员刷卡; this.m_OrderObject.Member = null; this._currentCard = null; BusinessUtils.Instance.RemoveMemberPromotion(this.m_OrderObject); this.m_Message = "余额为0不允许消费,请充值或选择其他付款方式!"; return new Tuple(false, "余额为0不允许消费,请充值或选择其他付款方式!", 0.00M); } } else { this.m_Message = resp.Item2; return new Tuple(false, resp.Item2, 0.00M); } var cardNo = string.IsNullOrEmpty(this._currentCard.FaceNo) ? this._currentCard.CardNo : this._currentCard.CardNo; //不抹零 this.m_OrderObject.MalingAmount = 0; //不找零 this.m_OrderObject.ChangeAmount = 0; //未收金额 var unpaidAmount = this.m_OrderObject.PaidAmount - this.m_OrderObject.ReceivedAmount; //如果会员余额小于未付金额,将应收金额赋值为会员余额 if (this._currentCard.AvailableAmount < unpaidAmount) { this.m_Message = "会员余额不足"; return new Tuple(false, "会员余额不足", 0.00M); ; } else { //实收金额,操作员录入消费卡金 decimal inputAmount = this.m_OrderObject.PaidAmount - this.m_OrderObject.ReceivedAmount; var PaymentVerify = VerifyInputValue(); //是否启用免密支付,前台收银参数中关闭免密支付 bool notAllowNoPwd = this._currentCardItem.PaymentType == 0; //1)设置开启免密支付;2)开启免密支付,但支付金额大于免密支付额度;3)收银参数关闭免密支付 if (notAllowNoPwd || this._currentCard.IsNoPwd == 0 || (this._currentCard.IsNoPwd == 1 && this._currentCard.NpAmount < inputAmount) || this._currentMemberInfo.GetWay == MemberCardNoType.手机号) { this._currentOperator = MemberCardOperator.支付密码; return new Tuple(false, "用户设置了支付密码", 0.00M); } else { var request = new CardTradeCreateCardRequest(); request.TradeVoucherNo = this._newVoucherNo.TradeVoucherNo; request.TradeNo = this.m_OrderObject.TradeNo; request.CardNo = this._currentCard.CardNo; request.CardTypeNo = this._currentCard.CardTypeNo; request.CardLevelNo = this._currentCard.CardLevelNo; request.Amount = Convert.ToInt32(inputAmount * 100); request.ShopNo = Global.Instance.Authc.StoreNo; request.WorkerNo = Global.Instance.Worker.No; request.PosNo = Global.Instance.Authc.PosNo; //会员卡统一下单 var unifiedOrder = CardUtils.CardTradeCreateCard(request); if (!unifiedOrder.Item1) { this.m_Message = unifiedOrder.Item2; return new Tuple(false, unifiedOrder.Item2, 0.00M); } //构建会员卡支付列表,默认没有支付密码,按免密支付处理,免密支付采用扣款金额RSA加密 string passwd = RSAFromPkcs8.encryptData(request.Amount.ToString(), "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh5zYnahq/k+1NpEF/fs3q31W+PPnb593gs6RP07bFK3Oq84VH45POVT/UkJJZG623sGLLs/TuIoAx6wQqIQRZMtdZEwQA2fcXu9zEHN/sqa8oBeEfFzGdBE21KX8n0KCmP6GfyPUOCzte6ADl/zAfz24Tf1Q/5iB/Xc++BEVglQIDAQAB", "UTF-8"); this.cardTradeCreate = request; this.createCardResponse = unifiedOrder.Item3; this.passwd = passwd; return new Tuple(true, "", unpaidAmount); } } } public override PayItem QueryPay() { VerifyPay(this.m_PayCode, null); var _data = PayResult(); if (_data.Item1) { return ToPayObject(null); } return null; } public override bool VerifyPay(string payCode, PayMode payMode) { m_queryRequest.Keyword = this.m_PayCode; m_queryRequest.Property = "scanCode"; m_queryRequest.ShopNo = Global.Instance.Authc.StoreNo; m_queryRequest.WorkerNo = Global.Instance.Worker.No; m_queryRequest.PosNo = Global.Instance.Authc.PosNo; return true; } protected override PayItem ToPayObject(object queryParam) { //构建支付方式 PayItem item = OrderUtils.ToPayItem(m_CurrentPayMode); //租户ID item.TenantId = Global.Instance.Authc.TenantId; //订单号 item.OrderId = this.m_OrderObject.Id; item.TradeNo = this.m_OrderObject.TradeNo; //支付编号 item.PayNo = OrderUtils.Instance.GeneratePayNo(); item.Id = IdWorkerUtils.Instance.NextId(); item.Name = this.m_CurrentPayMode.Name; item.No = m_CurrentPayMode.No; item.PointFlag = m_CurrentPayMode.PointFlag; //实收金额 item.PaidAmount = (decimal)( this.cardTradeCreate.Amount) /100; //找零金额 item.ChangeAmount = Convert.ToDecimal(0.00); //已收金额,真正意义上实际收款金额 item.Amount = (decimal)(this.cardTradeCreate.Amount) / 100; item.CardNo = cardTradeCreate.CardNo; //加入卡面号,手机号信息 if (this._currentCard != null) { item.CardFaceNo = this._currentCard.FaceNo; } if (this.m_OrderObject.Member != null) { item.MemberMobileNo = this.m_OrderObject.Member.Mobile; } //用户确认输入密码 item.UseConfirmed = false; //会员卡密码加密 item.Passwd = passwd; //预支付编码 item.PrePayNo = createCardResponse.PrePayment; //交易参考号 item.TradeVoucherNo = this._newVoucherNo.TradeVoucherNo; item.Memo = "会员卡支付"; item.Subscribe = string.Empty; //会员卡支付状态,NOT_PAID未扣款 item.Status = (int)OrderPaymentStatus.未付款; item.StatusDesc = "预下单成功,未扣款"; if (item.Amount == 0) { this.m_Message = "支付金额为0"; return null; } return item; } private void AddMCardPayType(CardTradeCreateCardRequest request1, CardTradeCreateCardResponse response, bool useConfirmed, string passwd, PayItem payItem) { if (request1 == null || response == null || this._newVoucherNo == null) return; //构建会员卡支付方式 var payMode = this.m_CurrentPayMode; //构建支付方式 PayItem item = OrderUtils.ToPayItem(payMode); //租户ID item.TenantId = Global.Instance.Authc.TenantId; //订单号 item.OrderId = this.m_OrderObject.Id; item.TradeNo = this.m_OrderObject.TradeNo; //支付编号 item.PayNo = OrderUtils.Instance.GeneratePayNo(); item.Id = IdWorkerUtils.Instance.NextId(); item.Name = payMode.Name; item.No = payMode.No; item.PointFlag = payMode.PointFlag; //实收金额 item.PaidAmount = payItem.Amount; //找零金额 item.ChangeAmount = Convert.ToDecimal(0.00); //已收金额,真正意义上实际收款金额 item.Amount = payItem.Amount; item.CardNo = request1.CardNo; //加入卡面号,手机号信息 if (this._currentCard != null) { item.CardFaceNo = this._currentCard.FaceNo; } if (this.m_OrderObject.Member != null) { item.MemberMobileNo = this.m_OrderObject.Member.Mobile; } //用户确认输入密码 item.UseConfirmed = useConfirmed; //会员卡密码加密 item.Passwd = passwd; //预支付编码 item.PrePayNo = response.PrePayment; //交易参考号 item.TradeVoucherNo = this._newVoucherNo.TradeVoucherNo; item.Memo = "会员卡支付"; item.Subscribe = string.Empty; //会员卡支付状态,NOT_PAID未扣款 item.Status = (int)OrderPaymentStatus.未付款; item.StatusDesc = "预下单成功,未扣款"; if (item.Amount == 0) { return; } //将会员卡压入支付清单 this.m_OrderObject.Pays.Add(item); //刷新界面数据 //this.billSummary1.Refresh(this.m_OrderObject); ////刷新支付列表 //this.billGrid1.RefreshGrid(this.m_OrderObject.Pays); //未收金额 var unpaidAmount = this.m_OrderObject.PaidAmount - this.m_OrderObject.ReceivedAmount; //通知结账 //默认支付成功 bool isPaySuccess = true; //查找会员卡支付列表,如果有会员卡先扣会员卡钱 var cards = this.m_OrderObject.Pays.FindAll(x => x.No.Equals("02")); //包含会员卡支付,构建会员卡扣款列表 if (cards.Count > 0) { //交易参考号 string tradeVoucherNo = string.Empty; //扣款卡列表 var payCards = new List(); foreach (var card in cards) { PayInfo c = new PayInfo(); c.PrePayment = card.PrePayNo; c.CardNo = card.CardNo; c.Amount = Convert.ToInt32(card.Amount * 100); c.IsNoPwd = card.UseConfirmed ? 0 : 1; c.Passwd = card.Passwd; payCards.Add(c); tradeVoucherNo = card.TradeVoucherNo; } //记积分金额 var pointAmount = this.m_OrderObject.Pays.FindAll(x => x.PointFlag == 1).Sum(x => x.Amount); var request = new CardTradePayRequest(); request.TradeNo = this.m_OrderObject.TradeNo; request.MemberId = this.m_OrderObject.Member == null ? string.Empty : this.m_OrderObject.Member.Id; request.Mobile = this.m_OrderObject.Member == null ? string.Empty : this.m_OrderObject.Member.Mobile; request.TradeVoucherNo = tradeVoucherNo; request.TotalAmount = Convert.ToInt32(this.m_OrderObject.Amount * 100); //实收金额 request.RealAmount = Convert.ToInt32(this.m_OrderObject.PaidAmount * 100); request.PointAmount = this.m_OrderObject.Member == null ? 0 : Convert.ToInt32(pointAmount * 100); request.PayCardAmount = payCards.Sum(x => x.Amount); request.DiscountAmount = Convert.ToInt32(this.m_OrderObject.DiscountAmount * 100); request.PointFlag = 2;//以卡系统计算为准 request.PointValue = 0; request.PayInfo = payCards; var pays = new List(); foreach (var p in this.m_OrderObject.Pays) { var pay = new Pay(); pay.PayTypeNo = p.No; pay.PayType = p.Name; pay.Money = Convert.ToInt32(p.Amount * 100); pay.PointRule = string.Empty; pay.Point = 0; pays.Add(pay); } request.Pay = pays; int couponTotalAmount = 0; var coupons = new List(); if (this.m_OrderObject.Promotions != null) { foreach (PromotionOrder promotionOrder in this.m_OrderObject.Promotions) { if (PromotionType.电子代金券 == promotionOrder.PromotionType) { Coupon coupon = new Coupon(); coupon.CouponId = promotionOrder.CouponId; coupon.CouponType = "CASH"; coupon.Title = promotionOrder.PlanName; coupon.Code = promotionOrder.PlanNo; coupon.Discount = String.Format("{0}", promotionOrder.DiscountRate); coupon.Cash = String.Format("{0}", promotionOrder.DiscountAmount); coupon.Gift = promotionOrder.PlanName; coupon.Memo = String.Format("电子代金券,优惠{0}", promotionOrder.DiscountAmount); couponTotalAmount += Convert.ToInt32(promotionOrder.DiscountAmount * 100); coupons.Add(coupon); } else if (PromotionType.电子折扣券 == promotionOrder.PromotionType) { Coupon coupon = new Coupon(); coupon.CouponId = promotionOrder.CouponId; coupon.CouponType = "DISCOUNT"; coupon.Title = promotionOrder.PlanName; coupon.Code = promotionOrder.PlanNo; coupon.Discount = String.Format("{0}", promotionOrder.DiscountRate); coupon.Cash = String.Format("{0}", promotionOrder.DiscountAmount); coupon.Gift = promotionOrder.PlanName; coupon.Memo = String.Format("电子折扣券,优惠{0}", promotionOrder.DiscountAmount); couponTotalAmount += Convert.ToInt32(promotionOrder.DiscountAmount * 100); coupons.Add(coupon); } } } if (this.m_OrderObject.Items != null) { foreach (OrderItem orderItem in this.m_OrderObject.Items) { if (orderItem.Promotions != null) { foreach (PromotionItem promotionItem in orderItem.Promotions) { if (PromotionType.电子兑换券 == promotionItem.PromotionType) { Coupon coupon = new Coupon(); coupon.CouponId = promotionItem.CouponId; coupon.CouponType = "GIFT"; coupon.Title = promotionItem.PlanName; coupon.Code = promotionItem.PlanNo; coupon.Discount = String.Format("{0}", promotionItem.DiscountRate); coupon.Cash = String.Format("{0}", promotionItem.DiscountAmount); coupon.Gift = promotionItem.PlanName; coupon.Memo = String.Format("电子兑换券,优惠{0}", promotionItem.DiscountAmount); couponTotalAmount += Convert.ToInt32(promotionItem.DiscountAmount * 100); coupons.Add(coupon); } } } } } request.Coupon = coupons; request.CouponTotalAmount = couponTotalAmount; request.ShopNo = Global.Instance.Authc.StoreNo; request.WorkerNo = Global.Instance.Worker.No; request.PosNo = Global.Instance.Authc.PosNo; var payResult = CardUtils.CardTradePay(request); if (payResult.Item1) { //会员卡扣款清单,用于打印 this.m_OrderObject.CardPayResult = payResult.Item3; var payRes = payResult.Item3; //刷卡后积分计入主单 this.m_OrderObject.PrePoint = OrderUtils.ToRound(payRes.PrePoint / 100.00M); this.m_OrderObject.AddPoint = OrderUtils.ToRound(payRes.GiftPoint / 100.00M); this.m_OrderObject.AftPoint = OrderUtils.ToRound(payRes.AftPoint / 100.00M); //调整每张卡的扣款状态 foreach (var card in cards) { var payCard = payRes.CardList.Find(x => x.CardNo == card.CardNo); if (payCard == null) { logger.Error(string.Format("会员卡[{0}]支付成功后返回结果未包含该卡支付信息", card.CardNo)); } else { card.CardBeforeBalance = OrderUtils.ToRound(payCard.PreAmount / 100.00M); card.CardAftAmount = OrderUtils.ToRound(payCard.AftAmount / 100.00M); } card.Status = (int)OrderPaymentStatus.已付款; card.StatusDesc = payResult.Item2; card.PayTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); this.m_Message = payResult.Item2; } //会员卡扣款成功 isPaySuccess = true; } else { //会员卡扣款失败 isPaySuccess = false; this.m_Message = payResult.Item2; } } else { //不包含会员卡,进行判断是否使用会员,会员充值积分 if (this.m_OrderObject.IsMember == 1) { var result = BusinessUtils.Instance.AddCardPoint4Order(this.m_OrderObject); if (result.Item1) { isPaySuccess = true; } else { MsgEvent.Send(Constant.PAY_MESSAGE_EVENT_NOTIFY, new Tuple(true, result.Item2)); isPaySuccess = false; } } } //支付成功 if (isPaySuccess) { //整单状态 this.m_OrderObject.OrderStatus = OrderStatus.已完成; //整单支付状态 this.m_OrderObject.PaymentStatus = OrderPaymentStatus.已付款; //通知主界面结账成功 MsgEvent.Send(Constant.ORDER_PAYMENT_NOTIFY, this.m_OrderObject); } } private bool VerifyInputValue() { if (this._currentMemberInfo == null) { this.m_Message = "获取交易参考号失败"; return false; } this.NewVoucherNo(false); //输入是否满足结账条件:消费明细中实收金额的合计 = 主单中的实收金额 var isVerify = this.m_OrderObject.Pays.Sum(x => x.PaidAmount) >= this.m_OrderObject.PaidAmount; //当前选择的会员卡 var cardNo = this._currentCard.CardNo; //实收金额,操作员录入消费卡金 decimal inputAmount = this.m_OrderObject.PaidAmount - this.m_OrderObject.ReceivedAmount; if (inputAmount < 0) { this.m_Message = "付款金额为负数"; return false; } if (inputAmount > this.m_OrderObject.ReceivableAmount) { this.m_Message = "不允许超出应收金额"; return false; } //扣除已经在支付清单的余额 decimal freeze = this.m_OrderObject.Pays.Where(x => x.CardNo == cardNo).Sum(x => x.Amount); //当前卡可用余额 decimal balance = this._currentCard.AvailableAmount - freeze; //操作员录入消费金额大于卡余额 if (inputAmount > balance) { this.m_Message = "卡余额不足,请重新输入"; return false; } return true; } /// /// 统一收单-订单创建(获取交易参考号) /// /// private void NewVoucherNo(bool refresh) { var data = BusinessUtils.Instance.CreateOrderCardTrade(this.m_OrderObject); if (data.Item1) { this._newVoucherNo = data.Item3; } else { this.m_Message = data.Item2; this._newVoucherNo = null; } } } }