| | |
| | | using Newtonsoft.Json; |
| | | using LifePayment.Domain.Common; |
| | | using Spire.Pdf.Exporting.XPS.Schema; |
| | | using Nest; |
| | | |
| | | namespace LifePayment.Application.LifePay |
| | | { |
| | |
| | | { |
| | | private readonly IRepository<LifePayRechargeReceipts, Guid> _lifePayRechargeReceiptsRepository; |
| | | private readonly IRepository<LifePayExpensesReceipts, Guid> _lifePayExpensesReceiptsRepository; |
| | | private readonly IRepository<LifePayConsumption, Guid> _lifePayConsumption; |
| | | private readonly IRepository<LifePayChannles, Guid> _lifePayChannlesRep; |
| | | private readonly IRepository<LifePayChannlesRake, Guid> _lifePayChannlesRakeRepository; |
| | | private readonly IRepository<LifePayOrder, Guid> _lifePayOrderRepository; |
| | | private readonly IAliPayApi _aliPayApi; |
| | |
| | | public LifePayOrderService( |
| | | IRepository<LifePayRechargeReceipts, Guid> lifePayRechargeReceiptsRepository, |
| | | IRepository<LifePayExpensesReceipts, Guid> lifePayExpensesReceiptsRepository, |
| | | IRepository<LifePayConsumption, Guid> lifePayConsumptionRepository, |
| | | IRepository<LifePayChannlesRake, Guid> lifePayChannlesRakeRepository, |
| | | IRepository<LifePayChannles, Guid> lifePayChannlesRep, |
| | | IRepository<LifePayOrder, Guid> lifePayOrderRepository, |
| | | IAliPayApi aliPayApi, |
| | | IWxPayApi wxPayApi) |
| | | { |
| | | _lifePayRechargeReceiptsRepository = lifePayRechargeReceiptsRepository; |
| | | _lifePayExpensesReceiptsRepository = lifePayExpensesReceiptsRepository; |
| | | _lifePayConsumption = lifePayConsumptionRepository; |
| | | _lifePayChannlesRakeRepository = lifePayChannlesRakeRepository; |
| | | _lifePayChannlesRep = lifePayChannlesRep; |
| | | _lifePayOrderRepository = lifePayOrderRepository; |
| | | _aliPayApi = aliPayApi; |
| | | _wxPayApi = wxPayApi; |
| | | } |
| | | |
| | | #region 查询 |
| | | |
| | | /// <summary> |
| | | /// 获取消费流水 |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | public async Task<PageOutput<LifePayConsumptionListOutput>> GetLifePayConsumptionPage(LifePayConsumptionPageInput input) |
| | | { |
| | | var channles = await _lifePayChannlesRep.Where(x => x.ChannlesName.Contains(input.KeyWord)).Select(x => x.ChannlesNum).ToListAsync(); |
| | | var list = await _lifePayConsumption.Where(x => x.IsDeleted == false) |
| | | .WhereIf(input.KeyWord.IsNotNullOrEmpty(), x => x.OrderNo.Contains(input.KeyWord) || x.AcoolyOrderNo.Contains(input.KeyWord) || channles.Contains(x.ChannelId)) |
| | | .WhereIf(input.Flow.HasValue, x => x.Flow == input.Flow) |
| | | .WhereIf(input.TimeBegin.HasValue, x => x.FinishTime >= input.TimeBegin) |
| | | .WhereIf(input.TimeEnd.HasValue, x => x.FinishTime <= input.TimeEnd) |
| | | .Select(x => new LifePayConsumptionListOutput() |
| | | { |
| | | Id = x.Id, |
| | | OrderNo = x.OrderNo, |
| | | AcoolyOrderNo = x.AcoolyOrderNo, |
| | | Amount = x.Amount, |
| | | ACOOLYStatus = x.ACOOLYStatus, |
| | | FinishTime = x.FinishTime, |
| | | FrozenStatus = x.FrozenStatus, |
| | | Flow = x.Flow, |
| | | DeductionAmount = x.DeductionAmount, |
| | | FrozenAmount = x.FrozenAmount.Value |
| | | }) |
| | | .GetPageResult(input.PageModel); |
| | | |
| | | var totalDeductionAmount = await _lifePayConsumption.Where(x => x.IsDeleted == false).SumAsync(x => x.DeductionAmount); |
| | | var totalFrozenAmount = await _lifePayConsumption.Where(x => x.IsDeleted == false).SumAsync(x => x.FrozenAmount); |
| | | LifePayConsumptionStatistics objectData = new LifePayConsumptionStatistics(); |
| | | objectData.TotalDeductionAmount = totalDeductionAmount; |
| | | objectData.TotalFrozenAmount = totalFrozenAmount.Value; |
| | | list.ObjectData = objectData; |
| | | return list; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取充值流水 |
| | | /// </summary> |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 插入收支流水 |
| | | /// </summary> |
| | |
| | | var data = new LifePayExpensesReceipts() |
| | | { |
| | | Id = Guid.NewGuid(), |
| | | OrderNo = input.OrderNo, |
| | | OutOrderNo = input.OutOrderNo, |
| | | LifePayType = input.LifePayType, |
| | | ExpensesReceiptsType = input.ExpensesReceiptsType, |
| | |
| | | if (query.Code == AlipayResultCode.Success && (query.TradeStatus == AlipayStatus.TRADESUCCESS |
| | | || query.TradeStatus == AlipayStatus.TRADECLOSED)) |
| | | { |
| | | data.OrderNo = input.OrderNo; |
| | | data.ExtraProperties = JsonConvert.SerializeObject(query); |
| | | data.FinishTime = Convert.ToDateTime(query.SendPayDate); |
| | | data.Amount = Convert.ToDecimal(query.TotalAmount); |
| | |
| | | } |
| | | else |
| | | { |
| | | var query = await _aliPayApi.QueryAlipayTradeRefund(new OrderInQuiryInput() { OutTradeNo = input.OrderNo }); |
| | | var query = await _aliPayApi.QueryAlipayTradeRefund(new OrderInQuiryInput() { OutTradeNo = input.OrderNo, OutRefundNo = input.OutRefundNo }); |
| | | if (query.Code == AlipayResultCode.Success && query.RefundStatus == AlipayRefundStatus.Success) |
| | | { |
| | | data.OrderNo = input.OutRefundNo; |
| | | data.ExtraProperties = JsonConvert.SerializeObject(query); |
| | | data.FinishTime = Convert.ToDateTime(query.GmtRefundPay); |
| | | data.Amount = Convert.ToDecimal(query.RefundAmount); |
| | |
| | | var query = await _wxPayApi.WxPayTradeQuery(input.OrderNo); |
| | | if (query.TradeState == WxPayStatus.支付成功 || query.TradeState == WxPayStatus.转入退款) |
| | | { |
| | | data.OrderNo = input.OrderNo; |
| | | data.ExtraProperties = JsonConvert.SerializeObject(query); |
| | | data.FinishTime = Convert.ToDateTime(query.SuccessTime); |
| | | data.Amount = Convert.ToDecimal(query.Amount.Total) / 100; |
| | | await _lifePayExpensesReceiptsRepository.InsertAsync(data); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var query = await _wxPayApi.WxPayDomesticRefundsQuery(input.OrderNo); |
| | | var query = await _wxPayApi.WxPayDomesticRefundsQuery(input.OutRefundNo); |
| | | if (query.Status == WxPayRefundStatus.退款成功) |
| | | { |
| | | data.OrderNo = input.OutRefundNo; |
| | | data.ExtraProperties = JsonConvert.SerializeObject(query); |
| | | data.FinishTime = Convert.ToDateTime(query.SuccessTime); |
| | | data.Amount = Convert.ToDecimal(query.Amount.Total) / 100; |
| | | await _lifePayExpensesReceiptsRepository.InsertAsync(data); |
| | | } |
| | | } |
| | | break; |
| | | default: break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 统计所有消费流水 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task GetAllLifePayConsumption() |
| | | { |
| | | var orderList = await _lifePayOrderRepository.Where(x => x.PayStatus == LifePayStatusEnum.已支付).ToListAsync(); |
| | | foreach (var item in orderList) |
| | | { |
| | | LifePayConsumption lifePayConsumption = new LifePayConsumption() |
| | | { |
| | | OrderNo = item.OrderNo, |
| | | AcoolyOrderNo = item.ACOOLYOrderNo, |
| | | Amount = item.PlatformDeductionAmount.HasValue? item.PlatformDeductionAmount.Value : 0, |
| | | ChannelId = item.ChannelId, |
| | | }; |
| | | if (item.ACOOLYStatus != null) |
| | | { |
| | | switch (item.ACOOLYStatus) |
| | | { |
| | | case ACOOLYStatusEnum.充值中: |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.充值中, item, lifePayConsumption); |
| | | break; |
| | | case ACOOLYStatusEnum.充值成功: |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.充值中, item, lifePayConsumption); |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.充值成功, item, lifePayConsumption); |
| | | break; |
| | | case ACOOLYStatusEnum.已完成: |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.充值中, item, lifePayConsumption); |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.已完成, item, lifePayConsumption); |
| | | break; |
| | | case ACOOLYStatusEnum.充值失败: |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.充值中, item, lifePayConsumption); |
| | | await CreatLifePayConsumption(ACOOLYStatusEnum.充值失败, item, lifePayConsumption); |
| | | break; |
| | | default: break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | /// 出账 |
| | | if (item.RefundOrderNo.IsNotNullOrEmpty()) |
| | | { |
| | | if (input.LifePayType == LifePayTypeEnum.WxPay) |
| | | { |
| | | input.OrderNo = item.RefundOrderNo; |
| | | } |
| | | input.OutRefundNo = item.OrderNo; |
| | | input.ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts; |
| | | await AddLifePayExpensesReceipts(input); |
| | | |
| | | input.OutRefundNo = item.RefundOrderNo; |
| | | input.ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts; |
| | | await AddLifePayExpensesReceipts(input); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | return list; |
| | | } |
| | | |
| | | private async Task CreatLifePayConsumption(ACOOLYStatusEnum status, LifePayOrder order, LifePayConsumption lifePayConsumption) |
| | | { |
| | | LifePayConsumption repeat = new LifePayConsumption(); |
| | | switch (status) |
| | | { |
| | | case ACOOLYStatusEnum.充值中: |
| | | lifePayConsumption.FinishTime = order.CreationTime; |
| | | lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.充值中; |
| | | lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Frozen; |
| | | lifePayConsumption.Flow = ConsumptionFlowEnum.Unchanged; |
| | | lifePayConsumption.DeductionAmount = 0; |
| | | lifePayConsumption.FrozenAmount = lifePayConsumption.Amount; |
| | | |
| | | repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo |
| | | && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).FirstOrDefaultAsync(); |
| | | if (repeat == null) |
| | | { |
| | | await _lifePayConsumption.InsertAsync(lifePayConsumption); |
| | | } |
| | | |
| | | break; |
| | | case ACOOLYStatusEnum.已完成: |
| | | lifePayConsumption.FinishTime = order.FinishTime.Value; |
| | | lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.已完成; |
| | | lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Thaw; |
| | | lifePayConsumption.Flow = ConsumptionFlowEnum.Out; |
| | | lifePayConsumption.DeductionAmount = lifePayConsumption.Amount; |
| | | lifePayConsumption.FrozenAmount = 0; |
| | | |
| | | repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo |
| | | && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).FirstOrDefaultAsync(); |
| | | if (repeat == null) |
| | | { |
| | | await _lifePayConsumption.InsertAsync(lifePayConsumption); |
| | | } |
| | | |
| | | break; |
| | | case ACOOLYStatusEnum.充值失败: |
| | | lifePayConsumption.FinishTime = order.CreationTime; |
| | | lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.充值失败; |
| | | lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Frozen; |
| | | lifePayConsumption.Flow = ConsumptionFlowEnum.Unchanged; |
| | | lifePayConsumption.DeductionAmount = 0; |
| | | lifePayConsumption.FrozenAmount = lifePayConsumption.Amount; |
| | | |
| | | repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo |
| | | && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).FirstOrDefaultAsync(); |
| | | if (repeat == null) |
| | | { |
| | | await _lifePayConsumption.InsertAsync(lifePayConsumption); |
| | | } |
| | | |
| | | break; |
| | | case ACOOLYStatusEnum.已退款: |
| | | lifePayConsumption.FinishTime = order.FinishTime.Value; |
| | | lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.已退款; |
| | | lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Thaw; |
| | | lifePayConsumption.Flow = ConsumptionFlowEnum.Unchanged; |
| | | lifePayConsumption.DeductionAmount = 0; |
| | | lifePayConsumption.FrozenAmount = 0; |
| | | |
| | | repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo |
| | | && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).FirstOrDefaultAsync(); |
| | | if (repeat == null) |
| | | { |
| | | await _lifePayConsumption.InsertAsync(lifePayConsumption); |
| | | } |
| | | |
| | | break; |
| | | |
| | | //case ACOOLYStatusEnum.部分充值成功: |
| | | // lifePayConsumption.FinishTime = order.CreationTime; |
| | | // lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.部分充值成功; |
| | | // lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Thaw; |
| | | // lifePayConsumption.Flow = ConsumptionFlowEnum.Unchanged; |
| | | // lifePayConsumption.DeductionAmount = 0; |
| | | // lifePayConsumption.FrozenAmount = lifePayConsumption.Amount; |
| | | |
| | | // repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo |
| | | // && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).FirstOrDefaultAsync(); |
| | | // if (repeat == null) |
| | | // { |
| | | // await _lifePayConsumption.InsertAsync(lifePayConsumption); |
| | | // } |
| | | |
| | | // break; |
| | | default: break; |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | } |