zhengyuxuan
2025-03-31 18325eda17439bdd76f3b7e3f39cfae312738b2b
LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs
@@ -13,6 +13,7 @@
using ZeroD.Util;
using LifePayment.Domain;
using static LifePayment.Domain.Shared.LifePaymentConstant;
using Newtonsoft.Json;
namespace LifePayment.Application.LifePay
{
@@ -20,17 +21,20 @@
    {
        private readonly IRepository<LifePayRechargeReceipts, Guid> _lifePayRechargeReceiptsRepository;
        private readonly IRepository<LifePayExpensesReceipts, Guid> _lifePayExpensesReceiptsRepository;
        private readonly IRepository<LifePayOrder, Guid> _lifePayOrderRepository;
        private readonly IAliPayApi _aliPayApi;
        private readonly IWxPayApi _wxPayApi;
        public LifePayOrderService(
                              IRepository<LifePayRechargeReceipts, Guid> lifePayRechargeReceiptsRepository,
                              IRepository<LifePayExpensesReceipts, Guid> lifePayExpensesReceiptsRepository,
                              IRepository<LifePayOrder, Guid> lifePayOrderRepository,
                              IAliPayApi aliPayApi,
                              IWxPayApi wxPayApi)
        {
            _lifePayRechargeReceiptsRepository = lifePayRechargeReceiptsRepository;
            _lifePayExpensesReceiptsRepository = lifePayExpensesReceiptsRepository;
            _lifePayOrderRepository = lifePayOrderRepository;
            _aliPayApi = aliPayApi;
            _wxPayApi = wxPayApi;
        }
@@ -101,6 +105,43 @@
        }
        /// <summary>
        /// 获取收支流水
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<LifePayExpensesReceiptsPageOutput<LifePayExpensesReceiptsListOutput>> GetLifePayExpensesReceiptsPage(LifePayExpensesReceiptsPageInput input)
        {
            var list = await _lifePayExpensesReceiptsRepository.Where(x => x.IsDeleted == false)
                .WhereIf(input.KeyWord.IsNotNullOrEmpty(), x => x.OrderNo.Contains(input.KeyWord) || x.OutOrderNo.Contains(input.KeyWord))
                .WhereIf(input.LifePayType.HasValue, x => x.LifePayType == input.LifePayType)
                .WhereIf(input.ExpensesReceiptsType.HasValue, x => x.ExpensesReceiptsType == input.ExpensesReceiptsType)
                .WhereIf(input.TimeBegin.HasValue, x => x.FinishTime >= input.TimeBegin)
                .WhereIf(input.TimeEnd.HasValue, x => x.FinishTime <= input.TimeEnd)
                .Select(x => new LifePayExpensesReceiptsListOutput()
                {
                    Id = x.Id,
                    OrderNo = x.OrderNo,
                    OutOrderNo = x.OutOrderNo,
                    LifePayType = x.LifePayType,
                    ExpensesReceiptsType = x.ExpensesReceiptsType.Value,
                    Amount = x.Amount,
                    FinishTime = x.FinishTime
                })
                .GetPageResult(input.PageModel);
            var totalIncome = await _lifePayExpensesReceiptsRepository.Where(x => x.IsDeleted == false && x.ExpensesReceiptsType == ExpensesReceiptsTypeEnum.Expenses).SumAsync(x => x.Amount);
            var totalRefund = await _lifePayExpensesReceiptsRepository.Where(x => x.IsDeleted == false && x.ExpensesReceiptsType == ExpensesReceiptsTypeEnum.Receipts).SumAsync(x => x.Amount);
            LifePayExpensesReceiptsPageOutput<LifePayExpensesReceiptsListOutput> result = new LifePayExpensesReceiptsPageOutput<LifePayExpensesReceiptsListOutput>();
            result.Data = list.Data;
            result.TotalIncome = totalIncome;
            result.TotalRefund = totalRefund;
            result.RealIncome = totalIncome - totalRefund;
            return result;
        }
        /// <summary>
        /// 插入收支流水
        /// </summary>
        /// <param name="input"></param>
@@ -118,7 +159,7 @@
                    OutOrderNo = input.OutOrderNo,
                    LifePayType = input.LifePayType,
                    ExpensesReceiptsType = input.ExpensesReceiptsType,
                    Amount = input.Amount
                    Amount = input.Amount,
                };
                switch (input.LifePayType)
@@ -127,8 +168,11 @@
                        if (input.ExpensesReceiptsType == ExpensesReceiptsTypeEnum.Expenses)
                        {
                            var query = await _aliPayApi.OrderInQuiry(new OrderInQuiryInput() { OutTradeNo = input.OrderNo });
                            if (query.Code == AlipayResultCode.Success && query.TradeStatus == AlipayStatus.TRADESUCCESS)
                            if (query.Code == AlipayResultCode.Success && (query.TradeStatus == AlipayStatus.TRADESUCCESS
                                || query.TradeStatus == AlipayStatus.TRADECLOSED))
                            {
                                data.ExtraProperties = JsonConvert.SerializeObject(query);
                                data.FinishTime = Convert.ToDateTime(query.SendPayDate);
                                await _lifePayExpensesReceiptsRepository.InsertAsync(data);
                            }
                        }
@@ -137,6 +181,8 @@
                            var query = await _aliPayApi.QueryAlipayTradeRefund(new OrderInQuiryInput() { OutTradeNo = input.OrderNo });
                            if (query.Code == AlipayResultCode.Success && query.RefundStatus == AlipayRefundStatus.Success)
                            {
                                data.ExtraProperties = JsonConvert.SerializeObject(query);
                                //data.FinishTime = Convert.ToDateTime(query.SendPayDate);
                                await _lifePayExpensesReceiptsRepository.InsertAsync(data);
                            }
                        }
@@ -145,25 +191,75 @@
                        if (input.ExpensesReceiptsType == ExpensesReceiptsTypeEnum.Expenses)
                        {
                            var query = await _wxPayApi.WxPayTradeQuery(input.OrderNo);
                            if (query.Code == AlipayResultCode.Success && query.Status == WxPayStatus.支付成功)
                            if (query.TradeState == WxPayStatus.支付成功 || query.TradeState == WxPayStatus.转入退款)
                            {
                                data.ExtraProperties = JsonConvert.SerializeObject(query);
                                data.FinishTime = Convert.ToDateTime(query.SuccessTime);
                                await _lifePayExpensesReceiptsRepository.InsertAsync(data);
                            }
                        }
                        else
                        {
                            var query = await _wxPayApi.WxPayDomesticRefundsQuery(input.OrderNo);
                            if (query.Code == AlipayResultCode.Success && query.RefundStatus == WxPayRefundStatus.退款成功)
                            if (query.Status == WxPayRefundStatus.退款成功)
                            {
                                data.ExtraProperties = JsonConvert.SerializeObject(query);
                                data.FinishTime = Convert.ToDateTime(query.SuccessTime);
                                await _lifePayExpensesReceiptsRepository.InsertAsync(data);
                            }
                        }
                        break;
                    default: break;
                }
            }
        }
        public async Task GetAllLifePayExpensesReceipts()
        {
            var orderlist = await (from a in _lifePayOrderRepository.Where(x => x.PayStatus >= LifePayStatusEnum.已支付)
                                   join b in _lifePayExpensesReceiptsRepository on a.OrderNo equals b.OrderNo into temp
                                   from b in temp.DefaultIfEmpty()
                                   select new LifePayExpensesReceiptsTemp()
                                   {
                                       OrderNo = a.OrderNo,
                                       OutOrderNo = a.OutOrderNo,
                                       RefundOrderNo = a.RefundOrderNo,
                                       LifePayType = a.LifePayType.Value,
                                       Amount = a.PayAmount.Value,
                                       ExpensesReceiptsType = b.ExpensesReceiptsType
                                   }).ToListAsync();
            foreach (var item in orderlist)
            {
                if (!item.ExpensesReceiptsType.HasValue)
                {
                    /// 入账
                    AddLifePayExpensesReceiptsInput input = new AddLifePayExpensesReceiptsInput()
                    {
                        OrderNo = item.OrderNo,
                        OutOrderNo = item.OutOrderNo,
                        LifePayType = item.LifePayType,
                        Amount = item.Amount,
                        ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses
                    };
                    await AddLifePayExpensesReceipts(input);
                    /// 出账
                    if (item.RefundOrderNo.IsNotNullOrEmpty())
                    {
                        if (input.LifePayType == LifePayTypeEnum.WxPay)
                        {
                            input.OrderNo = item.RefundOrderNo;
                        }
                        input.ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts;
                        await AddLifePayExpensesReceipts(input);
                    }
                }
            }
        }
    }
}