/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Helper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 退款单表 接口实现
///
public class CoreCmsBillRefundServices : BaseServices, ICoreCmsBillRefundServices
{
private readonly ICoreCmsBillRefundRepository _dal;
private readonly ICoreCmsBillPaymentsServices _billPaymentsServices;
private readonly ICoreCmsMessageCenterServices _messageCenterServices;
private readonly ICoreCmsPaymentsServices _paymentsServices;
private readonly IBalancePayServices _balancePayServices;
private readonly IAliPayServices _aliPayServices;
private readonly IWeChatPayServices _weChatPayServices;
private readonly ICoreCmsPlanOrderServices _planOrderServices;
//private readonly ICoreCmsOrderServices _orderServices;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsBillRefundServices(IUnitOfWork unitOfWork, ICoreCmsBillRefundRepository dal, ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsPaymentsServices paymentsServices, IBalancePayServices balancePayServices, IAliPayServices aliPayServices, IWeChatPayServices weChatPayServices
, ICoreCmsPlanOrderServices planOrderServices
//, ICoreCmsOrderServices orderServices
)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_billPaymentsServices = billPaymentsServices;
_messageCenterServices = messageCenterServices;
_paymentsServices = paymentsServices;
_balancePayServices = balancePayServices;
_aliPayServices = aliPayServices;
_weChatPayServices = weChatPayServices;
_planOrderServices = planOrderServices;
//_orderServices = orderServices;
}
///
/// 创建退款单
///
///
///
///
///
///
///
public async Task ToAdd(int userId, string sourceId, int type, decimal money, string aftersalesId)
{
var jm = new WebApiCallBack();
if (money == 0)
{
jm.data = jm.code = 13208;
jm.msg = GlobalErrorCodeVars.Code13208;
return jm;
}
//创建退款单
var billRefund = new CoreCmsBillRefund();
billRefund.refundId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.退款单编号);
billRefund.aftersalesId = aftersalesId;
billRefund.money = money;
billRefund.userId = userId;
billRefund.sourceId = sourceId;
billRefund.type = type;
//取支付成功的支付单号
var paymentsInfo = await _billPaymentsServices.QueryByClauseAsync(p=>p.sourceId==sourceId && p.type==type && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed);
if (paymentsInfo != null)
{
billRefund.paymentCode = paymentsInfo.paymentCode;
billRefund.tradeNo = paymentsInfo.tradeNo;
}
billRefund.status = (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND;
billRefund.createTime = DateTime.Now;
await _dal.InsertAsync(billRefund);
jm.status = true;
jm.msg = "创建成功";
return jm;
}
///
/// 退款单去退款或者拒绝
///
/// 退款单id
/// 2或者4,通过或者拒绝
/// 退款方式,如果和退款单上的一样,说明没有修改,原路返回,否则只记录状态,不做实际退款,如果为空是原路返回
///
public async Task ToRefund(string refundId, int status, string paymentCodeStr = "")
{
var jm = new WebApiCallBack();
var info = await _dal.QueryByClauseAsync(p => p.refundId == refundId && p.status == (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND);
if (info == null)
{
jm.status = false;
jm.msg = GlobalErrorCodeVars.Code13210;
return jm;
}
if (paymentCodeStr == "")
{
paymentCodeStr = info.paymentCode;
}
if (status == (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND)
{
//如果前端传过来的退款方式和退款单上的退款方式一样的话,就说明是原路返回,试着调用支付方式的退款方法,如果不一样的话,就直接做退款单的退款状态为已退款就可以了
if (paymentCodeStr == info.paymentCode && paymentCodeStr != "offline")
{
jm = await PaymentRefund(refundId);
}
else
{
//只修改状态,不做实际退款,实际退款线下去退。
await _dal.UpdateAsync(p => new CoreCmsBillRefund()
{
status = (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND,
paymentCode = paymentCodeStr,
updateTime = DateTime.Now
},
p => p.refundId == refundId && p.status == (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND);
jm.status = true;
}
//退款同意,先发退款消息和钩子,下面原路返回可能失败,但是在业务上相当于退款已经退过了,只是实际的款项可能还没到账
//发送退款消息
if (jm.status)
{
await _messageCenterServices.SendMessage(info.userId, GlobalEnumVars.PlatformMessageTypes.RefundSuccess.ToString(), JObject.FromObject(info));
//退款完成后的钩子
jm.msg = "退款单退款成功";
}
return jm;
}
else if (status == (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUSE)
{
//退款拒绝
await _dal.UpdateAsync(
p => new CoreCmsBillRefund()
{
status = status,
paymentCode = paymentCodeStr,
updateTime = DateTime.Now
},
p => p.refundId == refundId && p.status == (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND);
jm.status = true;
jm.msg = "退款单拒绝成功";
}
else
{
jm.status = false;
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
return jm;
}
///
/// 如果是在线支付的原路退还,去做退款操作
///
public async Task PaymentRefund(string refundId)
{
var jm = new WebApiCallBack();
var info = await _dal.QueryByClauseAsync(p =>
p.refundId == refundId && p.status != (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND);
if (info == null)
{
jm.status = false;
jm.msg = GlobalErrorCodeVars.Code13210;
return jm;
}
//取支付成功的支付单号
var panyMentsInfo = await _billPaymentsServices.QueryByClauseAsync(p => p.sourceId == info.sourceId && p.type == info.type && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed);
if (panyMentsInfo == null)
{
jm.msg = "没有找到支付成功的支付单号";
return jm;
}
if (panyMentsInfo.paymentCode != info.paymentCode)
{
jm.msg = "退款单退款方式和支付方式不一样,原路退还失败";
return jm;
}
//取此支付方式的信息
var paymentsModel = await _paymentsServices.QueryByClauseAsync(p => p.code == info.paymentCode && p.isEnable == true);
if (paymentsModel == null)
{
jm.msg = GlobalErrorCodeVars.Code10050;
return jm;
}
//去退款
//微信退款
if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.wechatpay.ToString())
{
jm = await _weChatPayServices.Refund(info, panyMentsInfo);
}
//支付宝退款
else if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.alipay.ToString())
{
jm = await _aliPayServices.Refund(info, panyMentsInfo);
}
//余额退款
else if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.balancepay.ToString())
{
jm = await _balancePayServices.Refund(info, panyMentsInfo);
}
////计划订单退款
else if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.planorderpay.ToString())
{
// //查询订单
// var order = await _orderServices.QueryByIdAsync(info.sourceId);
var order = await _unitOfWork.GetDbClient().Queryable().Where(p => p.orderId == info.sourceId).FirstAsync();
if (order == null)
{
_unitOfWork.RollbackTran();
jm.msg = "订单获取失败";
return jm;
}
//查询计划订单
var planOrder = await _planOrderServices.QueryByIdAsync(order.planorderId);
//上面保存好订单表,下面保存订单的其他信息
if (planOrder == null || planOrder.isdelete == true)
{
_unitOfWork.RollbackTran();
jm.msg = "计划订单获取失败";
return jm;
}
planOrder.huaFeiAmount = planOrder.huaFeiAmount - panyMentsInfo.money;
//修改计划订单的已花费金额
await _planOrderServices.UpdateAsync(planOrder);
}
if (jm.status)
{
var res = JsonConvert.SerializeObject(jm.data);
await _dal.UpdateAsync(p => new CoreCmsBillRefund() { status = (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND, memo = res }, p => p.refundId == refundId);
}
else
{
var res = JsonConvert.SerializeObject(jm.data);
await _dal.UpdateAsync(p => new CoreCmsBillRefund() { status = (int)GlobalEnumVars.BillRefundStatus.STATUS_FAIL, memo = res }, p => p.refundId == refundId);
}
return jm;
}
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}