根据优惠劵后的实际金额退款
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();
|
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)
|
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 itemPersons = persons.Where(p => p.RegistrationItemId == item.Id && !p.DeleteMark).ToList();
|
||||||
var itemOriginalAmount = item.UnitPrice * itemPersons.Count;
|
var itemOriginalAmount = item.UnitPrice * itemPersons.Count;
|
||||||
var itemRefund = await CalculateRefundAmountAsync(itemOriginalAmount, eventInfo.MatchStartTime);
|
var itemRefund = await CalculateRefundAmountAsync(itemOriginalAmount, eventInfo.MatchStartTime);
|
||||||
refundableAmount += itemRefund;
|
originalRefundableAmount += itemRefund;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (eventInfo.ChargeMode == ChargeMode.UnitPriceEvent)
|
else if (eventInfo.ChargeMode == ChargeMode.UnitPriceEvent)
|
||||||
@ -2798,20 +2802,25 @@ public class UnifiedRegistrationService : ITransient
|
|||||||
// 剩余可退款的人数
|
// 剩余可退款的人数
|
||||||
var remainingPersonCount = personGroups.Count;
|
var remainingPersonCount = personGroups.Count;
|
||||||
var remainingOriginalAmount = eventUnitPrice * remainingPersonCount;
|
var remainingOriginalAmount = eventUnitPrice * remainingPersonCount;
|
||||||
refundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
originalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 定价(赛事)模式:使用传统方式计算
|
// 定价(赛事)模式:使用传统方式计算
|
||||||
var remainingOriginalAmount = registration.TotalAmount - refundedAmount;
|
var remainingOriginalAmount = registration.TotalAmount - refundedAmount;
|
||||||
refundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
originalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 确保可退款金额不小于0
|
// 确保可退款金额不小于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();
|
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);
|
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
|
var output = new CancelPreviewOutput
|
||||||
{
|
{
|
||||||
RegistrationId = registration.Id,
|
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 items = await _db.Queryable<EventRegistrationItem>().Where(x => x.RegistrationId == input.RegistrationId).ToListAsync();
|
||||||
var persons = await _registrationPersonRepository.GetListAsync(x => x.RegistrationId == input.RegistrationId);
|
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来复用计算逻辑
|
// 构建一个临时的CancelExecuteInput来复用计算逻辑
|
||||||
var tempInput = new CancelExecuteInput
|
var tempInput = new CancelExecuteInput
|
||||||
{
|
{
|
||||||
@ -3020,16 +3030,21 @@ public class UnifiedRegistrationService : ITransient
|
|||||||
CancelTeams = input.CancelTeams
|
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 historyRefunds = await _refundRecordRepository.GetListAsync(x => x.RegistrationId == registration.Id && x.RefundStatus == 1);
|
||||||
var refundedAmount = historyRefunds.Sum(x => x.RefundAmount);
|
var refundedAmount = historyRefunds.Sum(x => x.RefundAmount);
|
||||||
|
|
||||||
// 计算剩余可退款金额
|
// 计算剩余可退款金额(基于实际支付金额)
|
||||||
var remainingItems = items.Where(x => !x.DeleteMark).ToList();
|
var remainingItems = items.Where(x => !x.DeleteMark).ToList();
|
||||||
decimal remainingRefundableAmount = 0;
|
decimal remainingOriginalRefundableAmount = 0;
|
||||||
|
|
||||||
// 区分不同的收费模式来计算
|
// 区分不同的收费模式来计算
|
||||||
if (eventInfo.ChargeMode == ChargeMode.UnitPriceProject)
|
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 itemPersons = persons.Where(p => p.RegistrationItemId == item.Id && !p.DeleteMark).ToList();
|
||||||
var itemOriginalAmount = item.UnitPrice * itemPersons.Count;
|
var itemOriginalAmount = item.UnitPrice * itemPersons.Count;
|
||||||
var itemRefund = await CalculateRefundAmountAsync(itemOriginalAmount, eventInfo.MatchStartTime);
|
var itemRefund = await CalculateRefundAmountAsync(itemOriginalAmount, eventInfo.MatchStartTime);
|
||||||
remainingRefundableAmount += itemRefund;
|
remainingOriginalRefundableAmount += itemRefund;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (eventInfo.ChargeMode == ChargeMode.UnitPriceEvent)
|
else if (eventInfo.ChargeMode == ChargeMode.UnitPriceEvent)
|
||||||
@ -3061,23 +3076,27 @@ public class UnifiedRegistrationService : ITransient
|
|||||||
// 剩余可退款的人数
|
// 剩余可退款的人数
|
||||||
var remainingPersonCount = personGroups.Count;
|
var remainingPersonCount = personGroups.Count;
|
||||||
var remainingOriginalAmount = eventUnitPrice * remainingPersonCount;
|
var remainingOriginalAmount = eventUnitPrice * remainingPersonCount;
|
||||||
remainingRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
remainingOriginalRefundableAmount = await CalculateRefundAmountAsync(remainingOriginalAmount, eventInfo.MatchStartTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 定价(赛事)模式:使用传统方式计算
|
// 定价(赛事)模式:使用传统方式计算
|
||||||
var remainingOriginalAmount = registration.TotalAmount - refundedAmount;
|
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);
|
decimal remainingActualRefundableAmount = originalAmount > 0 ? remainingOriginalRefundableAmount * (actualPaidAmount / originalAmount) : 0;
|
||||||
var actualPaidAmount = order?.ActualAmount ?? registration.TotalAmount;
|
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
|
return new CalculateRefundAmountOutput
|
||||||
{
|
{
|
||||||
refundAmount = refundAmount,
|
refundAmount = actualRefundAmount,
|
||||||
refundableAmount = remainingRefundableAmount,
|
refundableAmount = remainingActualRefundableAmount,
|
||||||
refundedAmount = refundedAmount,
|
refundedAmount = refundedAmount,
|
||||||
actualPaidAmount = actualPaidAmount
|
actualPaidAmount = actualPaidAmount
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user