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.

216 lines
7.4 KiB
C#

using POSV.Card;
using POSV.Entity;
using POSV.ShoppingCart;
using POSV.Utils;
using POSV.Voice;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace POSV.Cef.FastTemplate.PayMent.Base
{
public abstract class PayBase
{
public PayBase()
{
logger = NLog.LogManager.GetLogger(this.GetType().FullName);
}
//================== 共有参数 =================
#region 属性
/// <summary>
/// 支付对象
/// </summary>
public OrderObject m_OrderObject;
/// <summary>
/// 支付条码
/// </summary>
public string m_PayCode = "";
/// <summary>
/// 全局异常信息
/// </summary>
public string m_Message = "";
/// <summary>
/// 返回的支付对象
/// </summary>
public PayItem m_Paymodel;
/// <summary>
/// 支付参数
/// </summary>
public PayMode m_CurrentPayMode = null;
/// <summary>
/// 异步通知
/// </summary>
public PayResultAsyncCallBack AsyncPayResult;
/// <summary>
/// 日志
/// </summary>
protected NLog.Logger logger = null;
/// <summary>
/// 支付通道
/// </summary>
PayChannelEnum m_paytype = PayChannelEnum.;
/// <summary>
/// 剩余查询次数
/// </summary>
protected int m_QueryQuantity = 4;
public string SAOBEI_PAYTIME = "";
public string SAOBEI_QRCodeType = "";
public string SAOBEI_OrderId = "";
#endregion
//================== 委托 =====================
/// <summary>
/// 异步回掉
/// </summary>
/// <param name="_orderObject">支付订单</param>
/// <param name="_paymodel">支付对象</param>
/// <param name="_payCode">支付code</param>
/// <param name="message">异常信息</param>
/// <param name="_QueryQuantity">查询剩余次数</param>
public delegate void PayResultAsyncCallBack(OrderObject _orderObject, PayItem _paymodel, string _payCode, string _message, int _QueryQuantity);
//================== 抽象方法 =====================
/// <summary>
/// 验证支付参数
/// </summary>
/// <param name="payCode"></param>
/// <param name="payMode"></param>
/// <returns></returns>
public abstract bool VerifyPay(string payCode, PayMode payMode);
/// <summary>
/// 同步支付
/// </summary>
public abstract PayItem PayStart();
/// <summary>
/// 异步通知
/// </summary>
public abstract void AsyncPayStart();
/// <summary>
/// 接口返回
/// </summary>
protected abstract Tuple<bool, string, decimal> PayResult();
/// <summary>
/// 查询支付
/// </summary>
public abstract PayItem QueryPay();
protected abstract PayItem ToPayObject(object queryParam);
//================== 内部方法 =====================
public virtual bool UpdateSaomaTicket(string orderNo, string serialNo, string payTime)
{
try
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
string sql = "update pos_saoma_pay_ticket set serialNo ='{0}' ,payTime='{1}' where orderNo = '{2}' and busType = 0 and storeId ='{3}'";
sql = string.Format(sql, serialNo, payTime, orderNo, Global.Instance.BusinessPlanLog.StoreId);
db.Execute(sql, null);
transaction.Complete();
return false;
}
}
}
}
catch (Exception ex)
{
logger.Error(ex);
}
return true;
}
public void SaveSaomaTicket(string busNo, string authCode)
{
try
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
//先查询核销记录是否存在
string querySql = "select * from pos_saoma_pay_ticket where orderNo = '{0}' and busType = 0 and storeId ='{1}'";
querySql = string.Format(querySql, busNo, Global.Instance.BusinessPlanLog.StoreId);
SaomaPayTicket saomaPayTicket = db.FirstOrDefault<SaomaPayTicket>(querySql);
//如果插入扫码支付记录
if (saomaPayTicket == null)
{
SaomaPayTicket entity = new SaomaPayTicket();
entity.Id = IdWorkerUtils.Instance.NextId();
entity.TenantId = Global.Instance.BusinessPlanLog.TenantId;
entity.StoreId = Global.Instance.BusinessPlanLog.StoreId;
entity.WorkerId = Global.Instance.BusinessPlanLog.WorkerId;
entity.ShiftNo = Global.Instance.BusinessPlanLog.No;
entity.OrderNo = busNo;
entity.AuthCode = authCode;
entity.Money = this.m_OrderObject.ReceivableAmount - this.m_OrderObject.ReceivedAmount;
entity.SerialNo = null;
entity.PayTime = this.SAOBEI_PAYTIME;
entity.BusType = 0;
entity.PayStatus = 0;
entity.PayChannel = (int)this.m_paytype;
entity.PayTypeNo = this.m_CurrentPayMode.No;
entity.PayTypeName = this.m_CurrentPayMode.Name;
db.Save<SaomaPayTicket>(entity);
}
transaction.Complete();
logger.Info("单号:[{0}]进行扫描支付,付款码{1}", busNo, authCode);
}
}
}
}
catch (Exception ex)
{
logger.Error(ex);
}
}
public void VoiceBroadcast()
{
if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISPAYVOICE))
Task.Factory.StartNew(() =>
{
switch (m_Paymodel.No)
{
case "04"://支付宝
Voice.Pay.PayVoicePlay.PlayReceiveMoney(PayTypeEnum.Alipay, m_Paymodel.PaidAmount);
break;
case "05"://微信
Voice.Pay.PayVoicePlay.PlayReceiveMoney(PayTypeEnum.WeiXinPay, m_Paymodel.PaidAmount);
break;
}
});
}
}
}