根据优惠劵后的实际金额退款
This commit is contained in:
parent
2e615d43c6
commit
67c52979ce
@ -2765,10 +2765,14 @@ public class UnifiedRegistrationService : ITransient
|
||||
// 获取尚未被软删除的报名项
|
||||
var remainingItems = items.Where(x => !x.DeleteMark).ToList();
|
||||
|
||||
// 计算剩余可退款金额
|
||||
decimal refundableAmount = 0;
|
||||
// 查询订单获取实际支付金额(考虑优惠券抵扣) - 先获取,因为后面需要用来计算
|
||||
var order = await _orderRepository.GetFirstAsync(x => x.RegistrationId == registrationId && x.OrderType == 1 && !x.DeleteMark);
|
||||
var actualPaidAmount = order?.ActualAmount ?? registration.TotalAmount;
|
||||
var originalAmount = registration.TotalAmount;
|
||||
|
||||
// 区分不同的收费模式来计算(基于原价)
|
||||
decimal originalRefundableAmount = 0;
|
||||
|
||||
// 区分不同的收费模式来计算
|
||||
if (eventInfo.ChargeMode == ChargeMode.UnitPriceProject)
|
||||
{
|
||||
// 单价(项目)模式:每个未删除的项目独立计算退款
|
||||
@ -2777,7 +2781,7 @@ public class UnifiedRegistrationService : ITransient
|
||||
var itemPersons = persons.Where(p => p.RegistrationItemId == item.Id && !p.DeleteMark).ToList();
|
||||
var itemOriginalAmount = item.UnitPrice * itemPersons.Count;
|
||||
var itemRefund = await CalculateRefundAmountAsync(itemOriginalAmount, eventInfo.MatchStartTime);
|
||||
refundableAmount += itemRefund;
|
||||
originalRefundableAmount += itemRefund;
|
||||
}
|
||||
}
|
||||
else if (eventInfo.ChargeMode == ChargeMode.UnitPriceEvent)
|
||||
@ -2798,20 +2802,25 @@ public class UnifiedRegistrationService : ITransient
|
||||
// 剩余可退款的人数
|
||||
var remainingPersonCount = personGroups.Count;
|
||||
var remainingOriginalAmount = eventUnitPrice * remainingPersonCount;
|
||||
refundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
originalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 定价(赛事)模式:使用传统方式计算
|
||||
var remainingOriginalAmount = registration.TotalAmount - refundedAmount;
|
||||
refundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
originalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
}
|
||||
|
||||
// 确保可退款金额不小于0
|
||||
refundableAmount = Math.Max(0, refundableAmount);
|
||||
originalRefundableAmount = Math.Max(0, originalRefundableAmount);
|
||||
|
||||
_logger.LogInformation("统一取消报名预览:报名ID={RegistrationId}, 赛事名称={EventName}, 实际支付={ActualAmount}, 已退款={RefundedAmount}, 剩余可退款={RefundAmount}, 支付方式={PaymentMethod}",
|
||||
registrationId, eventInfo?.EventName, registration.TotalAmount, refundedAmount, refundableAmount, registration.PaymentMethod);
|
||||
// 按比例转换为基于实际支付的可退款金额
|
||||
decimal refundableAmount = originalAmount > 0 ? originalRefundableAmount * (actualPaidAmount / originalAmount) : 0;
|
||||
refundableAmount = RoundUpToTwoDecimalPlaces(refundableAmount);
|
||||
refundableAmount = Math.Min(refundableAmount, actualPaidAmount - refundedAmount);
|
||||
|
||||
_logger.LogInformation("统一取消报名预览:报名ID={RegistrationId}, 赛事名称={EventName}, 原价={OriginalAmount}, 实际支付={ActualAmount}, 已退款={RefundedAmount}, 原价可退款={OriginalRefundableAmount}, 实际可退款={RefundableAmount}, 支付方式={PaymentMethod}",
|
||||
registrationId, eventInfo?.EventName, originalAmount, actualPaidAmount, refundedAmount, originalRefundableAmount, refundableAmount, registration.PaymentMethod);
|
||||
|
||||
// 获取组别信息(年龄和性别限制)
|
||||
var groupIds = items.Where(x => x.EventProjectGroupId.HasValue).Select(x => x.EventProjectGroupId.Value).Distinct().ToList();
|
||||
@ -2833,10 +2842,6 @@ public class UnifiedRegistrationService : ITransient
|
||||
projects = projectList.ToDictionary(x => x.Id);
|
||||
}
|
||||
|
||||
// 查询订单获取实际支付金额(考虑优惠券抵扣)
|
||||
var order = await _orderRepository.GetFirstAsync(x => x.RegistrationId == registrationId && x.OrderType == 1 && !x.DeleteMark);
|
||||
var actualPaidAmount = order?.ActualAmount ?? registration.TotalAmount;
|
||||
|
||||
var output = new CancelPreviewOutput
|
||||
{
|
||||
RegistrationId = registration.Id,
|
||||
@ -3011,6 +3016,11 @@ public class UnifiedRegistrationService : ITransient
|
||||
var items = await _db.Queryable<EventRegistrationItem>().Where(x => x.RegistrationId == input.RegistrationId).ToListAsync();
|
||||
var persons = await _registrationPersonRepository.GetListAsync(x => x.RegistrationId == input.RegistrationId);
|
||||
|
||||
// 查询订单获取实际支付金额(考虑优惠券抵扣)
|
||||
var order = await _orderRepository.GetFirstAsync(x => x.RegistrationId == input.RegistrationId && x.OrderType == 1 && !x.DeleteMark);
|
||||
var actualPaidAmount = order?.ActualAmount ?? registration.TotalAmount;
|
||||
var originalAmount = registration.TotalAmount;
|
||||
|
||||
// 构建一个临时的CancelExecuteInput来复用计算逻辑
|
||||
var tempInput = new CancelExecuteInput
|
||||
{
|
||||
@ -3020,16 +3030,21 @@ public class UnifiedRegistrationService : ITransient
|
||||
CancelTeams = input.CancelTeams
|
||||
};
|
||||
|
||||
// 计算退款金额
|
||||
var refundAmount = await CalculateActualRefundAmountAsync(tempInput, registration, eventInfo, items, persons);
|
||||
// 先计算按原价应该退多少
|
||||
decimal originalRefundAmount = await CalculateActualRefundAmountAsync(tempInput, registration, eventInfo, items, persons);
|
||||
|
||||
// 按比例计算实际退款金额(基于实际支付金额)
|
||||
decimal actualRefundAmount = originalAmount > 0 ? originalRefundAmount * (actualPaidAmount / originalAmount) : 0;
|
||||
actualRefundAmount = RoundUpToTwoDecimalPlaces(actualRefundAmount);
|
||||
actualRefundAmount = Math.Min(actualRefundAmount, actualPaidAmount);
|
||||
|
||||
// 查询历史已退款金额
|
||||
var historyRefunds = await _refundRecordRepository.GetListAsync(x => x.RegistrationId == registration.Id && x.RefundStatus == 1);
|
||||
var refundedAmount = historyRefunds.Sum(x => x.RefundAmount);
|
||||
|
||||
// 计算剩余可退款金额
|
||||
// 计算剩余可退款金额(基于实际支付金额)
|
||||
var remainingItems = items.Where(x => !x.DeleteMark).ToList();
|
||||
decimal remainingRefundableAmount = 0;
|
||||
decimal remainingOriginalRefundableAmount = 0;
|
||||
|
||||
// 区分不同的收费模式来计算
|
||||
if (eventInfo.ChargeMode == ChargeMode.UnitPriceProject)
|
||||
@ -3040,7 +3055,7 @@ public class UnifiedRegistrationService : ITransient
|
||||
var itemPersons = persons.Where(p => p.RegistrationItemId == item.Id && !p.DeleteMark).ToList();
|
||||
var itemOriginalAmount = item.UnitPrice * itemPersons.Count;
|
||||
var itemRefund = await CalculateRefundAmountAsync(itemOriginalAmount, eventInfo.MatchStartTime);
|
||||
remainingRefundableAmount += itemRefund;
|
||||
remainingOriginalRefundableAmount += itemRefund;
|
||||
}
|
||||
}
|
||||
else if (eventInfo.ChargeMode == ChargeMode.UnitPriceEvent)
|
||||
@ -3061,23 +3076,27 @@ public class UnifiedRegistrationService : ITransient
|
||||
// 剩余可退款的人数
|
||||
var remainingPersonCount = personGroups.Count;
|
||||
var remainingOriginalAmount = eventUnitPrice * remainingPersonCount;
|
||||
remainingRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
remainingOriginalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 定价(赛事)模式:使用传统方式计算
|
||||
var remainingOriginalAmount = registration.TotalAmount - refundedAmount;
|
||||
remainingRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
remainingOriginalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||
}
|
||||
|
||||
// 查询订单获取实际支付金额(考虑优惠券抵扣)
|
||||
var order = await _orderRepository.GetFirstAsync(x => x.RegistrationId == input.RegistrationId && x.OrderType == 1 && !x.DeleteMark);
|
||||
var actualPaidAmount = order?.ActualAmount ?? registration.TotalAmount;
|
||||
// 按比例计算剩余可退款金额(基于实际支付金额)
|
||||
decimal remainingActualRefundableAmount = originalAmount > 0 ? remainingOriginalRefundableAmount * (actualPaidAmount / originalAmount) : 0;
|
||||
remainingActualRefundableAmount = RoundUpToTwoDecimalPlaces(remainingActualRefundableAmount);
|
||||
remainingActualRefundableAmount = Math.Min(remainingActualRefundableAmount, actualPaidAmount - refundedAmount);
|
||||
|
||||
_logger.LogInformation("计算退款金额:报名ID={RegistrationId}, 原价={OriginalAmount}, 实付={ActualPaidAmount}, 按原价应退={OriginalRefundAmount}, 实际退款={ActualRefundAmount}, 剩余原价可退={RemainingOriginalRefundableAmount}, 剩余实际可退={RemainingActualRefundableAmount}, 已退={RefundedAmount}",
|
||||
registration.Id, originalAmount, actualPaidAmount, originalRefundAmount, actualRefundAmount, remainingOriginalRefundableAmount, remainingActualRefundableAmount, refundedAmount);
|
||||
|
||||
return new CalculateRefundAmountOutput
|
||||
{
|
||||
refundAmount = refundAmount,
|
||||
refundableAmount = remainingRefundableAmount,
|
||||
refundAmount = actualRefundAmount,
|
||||
refundableAmount = remainingActualRefundableAmount,
|
||||
refundedAmount = refundedAmount,
|
||||
actualPaidAmount = actualPaidAmount
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user