From 83b72e32a89988dd721ef7bc8ea673751092fb4a Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期三, 10 十二月 2025 16:11:13 +0800
Subject: [PATCH] fix: bug

---
 LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs |  222 +++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 141 insertions(+), 81 deletions(-)

diff --git a/LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs b/LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs
index 9c2ae4c..da0c289 100644
--- a/LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs
+++ b/LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs
@@ -1,7 +1,10 @@
 锘縰sing LifePayment.Application.Contracts;
+using LifePayment.Domain;
 using LifePayment.Domain.LifePay;
 using LifePayment.Domain.Models;
 using LifePayment.Domain.Shared;
+using Microsoft.EntityFrameworkCore;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -9,11 +12,9 @@
 using System.Threading.Tasks;
 using Volo.Abp.Application.Services;
 using Volo.Abp.Domain.Repositories;
-using Microsoft.EntityFrameworkCore;
 using ZeroD.Util;
-using LifePayment.Domain;
+using ZeroD.Util.Fadd;
 using static LifePayment.Domain.Shared.LifePaymentConstant;
-using Newtonsoft.Json;
 
 namespace LifePayment.Application.LifePay
 {
@@ -74,15 +75,15 @@
                     FrozenStatus = x.FrozenStatus,
                     Flow = x.Flow,
                     DeductionAmount = x.DeductionAmount,
-                    FrozenAmount = x.FrozenAmount.Value
+                    FrozenAmount = x.FrozenAmount ?? 0
                 })
                 .GetPageResult(input.PageModel);
 
-            var totalDeductionAmount = await _lifePayConsumption.SumAsync(x => x.DeductionAmount);
-            var totalFrozenAmount = await _lifePayConsumption.SumAsync(x => x.FrozenAmount);
+            var totalDeductionAmount = await _lifePayConsumption.Where(it => it.ACOOLYStatus == ACOOLYStatusEnum.宸插畬鎴� || it.ACOOLYStatus == ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�).SumAsync(x => x.DeductionAmount);
+            var totalFrozenAmount = await _lifePayConsumption.Where(it => it.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�间腑 || it.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�煎け璐�).SumAsync(x => x.FrozenAmount);
             LifePayConsumptionStatistics objectData = new LifePayConsumptionStatistics();
             objectData.TotalDeductionAmount = totalDeductionAmount;
-            objectData.TotalFrozenAmount = totalFrozenAmount.Value;
+            objectData.TotalFrozenAmount = totalFrozenAmount ?? 0;
             list.ObjectData = objectData;
             return list;
         }
@@ -136,7 +137,7 @@
                     OrderNo = x.OrderNo,
                     OutOrderNo = x.OutOrderNo,
                     LifePayType = x.LifePayType,
-                    ExpensesReceiptsType = x.ExpensesReceiptsType.Value,
+                    ExpensesReceiptsType = x.ExpensesReceiptsType ?? 0,
                     Amount = x.Amount,
                     FinishTime = x.FinishTime
                 })
@@ -213,8 +214,9 @@
                 s.PayAmountStr = s.PayAmount.ToString("F2");
                 s.ChannlesRakeRateStr = s.ChannlesRakeRate.ToString("F0") + "%";
                 s.ChannlesRakePriceStr = s.ChannlesRakePrice.ToString("F2");
-                s.FinishTimeStr = s.FinishTime.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmmss);
+                s.FinishTimeStr = s.FinishTime.HasValue ? s.FinishTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmmss) : "";
             });
+            CheckExtensions.IfTrueThrowUserFriendlyException(result.IsNullOrEmpty(), "鏆傛棤鏁版嵁瀵煎嚭");
             return result;
         }
 
@@ -232,8 +234,8 @@
             CheckExtensions.IfTrueThrowUserFriendlyException(input.OrderNo == null, "璇疯緭鍏ヤ笟鍔¤鍗曞彿");
             CheckExtensions.IfTrueThrowUserFriendlyException(input.RechargeAmount <= 0, "鍏呭�奸噾棰濆簲澶т簬0");
             CheckExtensions.IfTrueThrowUserFriendlyException(input.Voucher == null, "璇锋彁浜ゅ厖鍊煎嚟璇�");
-            var repeat = await _lifePayRechargeReceiptsRepository.Where(x => x.OrderNo == input.OrderNo).FirstOrDefaultAsync();
-            CheckExtensions.IfTrueThrowUserFriendlyException(repeat != null && repeat.Id != input.Id, "涓氬姟璁㈠崟鍙烽噸澶�");
+            var repeat = await _lifePayRechargeReceiptsRepository.Where(x => x.OrderNo == input.OrderNo && x.Id != input.Id).AnyAsync();
+            CheckExtensions.IfTrueThrowUserFriendlyException(repeat, "涓氬姟璁㈠崟鍙烽噸澶�");
             if (input.Id.HasValue)
             {
                 var payRechargeReceipts = await _lifePayRechargeReceiptsRepository.Where(x => x.Id == input.Id.Value).FirstOrDefaultAsync();
@@ -264,8 +266,8 @@
         public async Task AddLifePayExpensesReceipts(AddLifePayExpensesReceiptsInput input)
         {
             var repeat = await _lifePayExpensesReceiptsRepository.Where(x => x.ExpensesReceiptsType == input.ExpensesReceiptsType
-            && x.OrderNo == input.OrderNo).FirstOrDefaultAsync();
-            if (repeat == null)
+            && x.OrderNo == input.OrderNo).AnyAsync();
+            if (!repeat)
             {
                 var data = new LifePayExpensesReceipts()
                 {
@@ -296,7 +298,7 @@
                             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.OrderNo = input.OrderNo;
                                 data.ExtraProperties = JsonConvert.SerializeObject(query);
                                 data.FinishTime = Convert.ToDateTime(query.GmtRefundPay);
                                 data.Amount = Convert.ToDecimal(query.RefundAmount);
@@ -322,7 +324,7 @@
                             var query = await _wxPayApi.WxPayDomesticRefundsQuery(input.OutRefundNo);
                             if (query.Status == WxPayRefundStatus.閫�娆炬垚鍔�)
                             {
-                                data.OrderNo = input.OutRefundNo;
+                                data.OrderNo = input.OrderNo;
                                 data.ExtraProperties = JsonConvert.SerializeObject(query);
                                 data.FinishTime = Convert.ToDateTime(query.SuccessTime);
                                 data.Amount = Convert.ToDecimal(query.Amount.Total) / 100;
@@ -335,8 +337,74 @@
             }
         }
 
+        /// <summary>
+        /// 鑾峰彇閫�娆惧钩鍙版祦姘磋鎯�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<GetRefundPlatformTradeDetailOutput> GetRefundPlatformTradeDetail(string orderNo)
+        {
+            var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync();
+            CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�");
+            CheckExtensions.IfTrueThrowUserFriendlyException(order.LifePayRefundStatus != LifePayRefundStatusEnum.寰呴��娆� && order.LifePayRefundStatus != LifePayRefundStatusEnum.閫�娆句腑, "褰撳墠璁㈠崟鐘舵�佹棤娉曟煡鐪嬮��娆炬祦姘�");
+            CheckExtensions.IfTrueThrowUserFriendlyException(order.RefundOrderNo.IsNullOrEmpty(), "涓嶅瓨鍦ㄩ��娆炬祦姘磋鍗�");
 
-        
+            var result = new GetRefundPlatformTradeDetailOutput();
+
+            if (order.LifePayType == LifePayTypeEnum.AliPay)
+            {
+                var query = await _aliPayApi.QueryAlipayTradeRefund(new OrderInQuiryInput() { OutTradeNo = order.OrderNo, OutRefundNo = order.RefundOrderNo });
+                result.OrderNo = order.OrderNo;
+                result.RefundOrderNo = order.RefundOrderNo;
+                result.OutOrderNo = query.TradeNo;
+                result.LifePayType = LifePayTypeEnum.AliPay;
+                result.RefundTime = order.RefundTime;
+                result.RefundSuccessTime = query.GmtRefundPay.IsNullOrEmpty() ? null : Convert.ToDateTime(query.GmtRefundPay);
+                result.RefundPlatformStatus = MapAlipayRefundStatusToPlatformEnum(query.RefundStatus);
+            }
+            else if (order.LifePayType == LifePayTypeEnum.WxPay)
+            {
+                var query = await _wxPayApi.WxPayDomesticRefundsQuery(order.RefundOrderNo);
+                result.OrderNo = order.OrderNo;
+                result.RefundOrderNo = order.RefundOrderNo;
+                result.OutOrderNo = query.TransactionId;
+                result.LifePayType = LifePayTypeEnum.WxPay;
+                result.RefundTime = query.CreateTime.IsNullOrEmpty() ? null : Convert.ToDateTime(query.CreateTime);
+                result.RefundSuccessTime = query.SuccessTime.IsNullOrEmpty() ? null : Convert.ToDateTime(query.SuccessTime);
+                result.RefundPlatformStatus = MapWxpayRefundStatusToPlatformEnum(query.Status);
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 鏀粯瀹濋��娆剧姸鎬佹槧灏勫埌閫氱敤閫�娆惧钩鍙扮姸鎬侊紙Switch 鐗堟湰锛�
+        /// </summary>
+        /// <param name="alipayStatus">鏀粯瀹濋��娆剧姸鎬�</param>
+        /// <returns>閫氱敤閫�娆惧钩鍙扮姸鎬�</returns>
+        public static RefundPlatformStatusEnum MapAlipayRefundStatusToPlatformEnum(string alipayRefundStatus)
+        {
+            return alipayRefundStatus switch
+            {
+                AlipayRefundStatus.Success => RefundPlatformStatusEnum.SUCCESS,
+                _ => RefundPlatformStatusEnum.PROCESSING
+            };
+        }
+
+        /// <summary>
+        /// 寰俊閫�娆剧姸鎬佹槧灏勫埌閫氱敤閫�娆惧钩鍙扮姸鎬侊紙Switch 鐗堟湰锛�
+        /// </summary>
+        /// <param name="wxPayRefundStatus">寰俊閫�娆剧姸鎬�</param>
+        /// <returns>閫氱敤閫�娆惧钩鍙扮姸鎬�</returns>
+        public static RefundPlatformStatusEnum MapWxpayRefundStatusToPlatformEnum(string wxPayRefundStatus)
+        {
+            return wxPayRefundStatus switch
+            {
+                WxPayRefundStatus.閫�娆炬垚鍔� => RefundPlatformStatusEnum.SUCCESS,
+                WxPayRefundStatus.閫�娆惧叧闂� => RefundPlatformStatusEnum.CLOSED,
+                WxPayRefundStatus.閫�娆惧鐞嗕腑 => RefundPlatformStatusEnum.PROCESSING,
+                _ => RefundPlatformStatusEnum.ABNORMAL
+            };
+        }
 
         /// <summary>
         /// 缁熻鎵�鏈夋秷璐规祦姘�
@@ -347,7 +415,7 @@
             var orderList = await _lifePayOrderRepository.Where(x => x.PayStatus == LifePayStatusEnum.宸叉敮浠�).ToListAsync();
             foreach (var item in orderList)
             {
-                
+
                 if (item.ACOOLYStatus != null)
                 {
                     switch (item.ACOOLYStatus)
@@ -394,8 +462,8 @@
                                        OrderNo = a.OrderNo,
                                        OutOrderNo = a.OutOrderNo,
                                        RefundOrderNo = a.RefundOrderNo,
-                                       LifePayType = a.LifePayType.Value,
-                                       Amount = a.PayAmount.Value,
+                                       LifePayType = a.LifePayType ?? 0,
+                                       Amount = a.PayAmount ?? 0,
                                        ExpensesReceiptsType = b.ExpensesReceiptsType
                                    }).ToListAsync();
             foreach (var item in orderlist)
@@ -415,15 +483,19 @@
                     await AddLifePayExpensesReceipts(input);
 
                     /// 鍑鸿处
+                    AddLifePayExpensesReceiptsInput receipts = new AddLifePayExpensesReceiptsInput()
+                    {
+                        OrderNo = item.OrderNo,
+                        OutOrderNo = item.OutOrderNo,
+                        LifePayType = item.LifePayType,
+                        Amount = item.Amount,
+                        ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses
+                    };
                     if (item.RefundOrderNo.IsNotNullOrEmpty())
                     {
-                        input.OutRefundNo = item.OrderNo;
-                        input.ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts;
-                        await AddLifePayExpensesReceipts(input);
-
-                        input.OutRefundNo = item.RefundOrderNo;
-                        input.ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts;
-                        await AddLifePayExpensesReceipts(input);
+                        receipts.OutRefundNo = item.RefundOrderNo;
+                        receipts.ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts;
+                        await AddLifePayExpensesReceipts(receipts);
                     }
                 }
             }
@@ -451,11 +523,15 @@
                         PayAmount = item.RechargeAmount ?? 0,
                         ChannlesRakeRate = item.ChannlesRakeRate ?? 0,
                         ChannlesRakePrice = channlesRakePrice ?? 0,
-                        FinishTime = item.FinishTime.Value,
                         ChannelId = item.ChannelId,
                     };
-                    var repeat = _lifePayChannlesRakeRepository.Where(x => x.OrderNo == item.OrderNo).FirstOrDefaultAsync();
-                    if (repeat != null)
+                    if (item.FinishTime.HasValue)
+                    {
+                        lifePayChannlesRake.FinishTime = item.FinishTime.Value;
+                    }
+
+                    var repeat = await _lifePayChannlesRakeRepository.Where(x => x.OrderNo == item.OrderNo).AnyAsync();
+                    if (!repeat)
                     {
                         await _lifePayChannlesRakeRepository.InsertAsync(lifePayChannlesRake);
                     }
@@ -466,7 +542,7 @@
 
         #region 鏂规硶
         public async Task CreatLifePayConsumption(ACOOLYStatusEnum status, string orderNo, string aCOOLYOrderNo,
-            decimal platformDeductionAmount, string channelId, DateTime orderCreationTime, DateTime? orderFinishTime)
+            decimal platformDeductionAmount, string channelId, DateTime orderCreationTime, DateTime? orderFinishTime, decimal? channelRate = 0, decimal? parValue = 0, decimal? actualParValue = 0)
         {
             LifePayConsumption lifePayConsumption = new LifePayConsumption()
             {
@@ -475,7 +551,6 @@
                 Amount = platformDeductionAmount,
                 ChannelId = channelId,
             };
-            LifePayConsumption repeat = new LifePayConsumption();
             switch (status)
             {
                 case ACOOLYStatusEnum.鍏呭�间腑:
@@ -485,14 +560,6 @@
                     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.宸插畬鎴�:
                     if (orderFinishTime.HasValue)
@@ -505,14 +572,6 @@
                     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 = orderCreationTime;
@@ -521,49 +580,53 @@
                     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 = orderFinishTime.Value;
+                    if (orderFinishTime.HasValue)
+                    {
+                        lifePayConsumption.FinishTime = orderFinishTime.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)
+                    break;
+                case ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�:
+                    lifePayConsumption.FinishTime = orderCreationTime;
+                    lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�;
+                    lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Thaw;
+                    lifePayConsumption.Flow = ConsumptionFlowEnum.Out;
+                    lifePayConsumption.DeductionAmount = lifePayConsumption.Amount;
+                    lifePayConsumption.FrozenAmount = 0;
+                    if ((parValue ?? 0) != 0 && (parValue ?? 0) != actualParValue)
                     {
-                        await _lifePayConsumption.InsertAsync(lifePayConsumption);
+                        LifePayConsumption lifePayConsumptionOther = new LifePayConsumption()
+                        {
+                            OrderNo = orderNo,
+                            AcoolyOrderNo = aCOOLYOrderNo,
+                            Amount = ((parValue ?? 0) - (actualParValue ?? 0)) * (channelRate ?? 0),
+                            ChannelId = channelId,
+                            FinishTime = orderCreationTime,
+                            ACOOLYStatus = ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�,
+                            FrozenStatus = ConsumptionFrozenStatusEnum.Thaw,
+                            Flow = ConsumptionFlowEnum.Unchanged,
+                            DeductionAmount = 0,
+                            FrozenAmount = 0
+                        };
+                        await _lifePayConsumption.InsertAsync(lifePayConsumptionOther);
                     }
 
                     break;
-
-                //case ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�:
-                //    lifePayConsumption.FinishTime = orderCreationTime;
-                //    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;
+            }
+
+            var repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo
+                   && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).AnyAsync();
+            if (!repeat)
+            {
+                await _lifePayConsumption.InsertAsync(lifePayConsumption);
             }
         }
 
@@ -587,12 +650,9 @@
                     FinishTime = x.FinishTime,
                     CreationTime = x.CreationTime,
                 });
-
-
             return list;
         }
 
         #endregion
-
     }
 }

--
Gitblit v1.9.1