mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 17:13:26 +08:00
【优化】优化使用部分积分加金额购买,申请售后回退积分的处理,增加精度到4位,减少误差。
This commit is contained in:
@@ -83,7 +83,7 @@ namespace CoreCms.Net.Model.ViewModels.DTO
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 积分可以抵扣多少金额
|
/// 积分可以抵扣多少金额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int pointExchangeMoney { get; set; } = 0;
|
public decimal pointExchangeMoney { get; set; } = 0;
|
||||||
|
|
||||||
public List<CartProducts> list { get; set; } = new();
|
public List<CartProducts> list { get; set; } = new();
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ namespace CoreCms.Net.Model.ViewModels.DTO
|
|||||||
public class GetUserPointResult
|
public class GetUserPointResult
|
||||||
{
|
{
|
||||||
public int availablePoint { get; set; } = 0;
|
public int availablePoint { get; set; } = 0;
|
||||||
public int pointExchangeMoney { get; set; } = 0;
|
public decimal pointExchangeMoney { get; set; } = 0;
|
||||||
|
|
||||||
public int @switch { get; set; } = 1;
|
public int @switch { get; set; } = 1;
|
||||||
|
|
||||||
public int point { get; set; } = 0;
|
public int point { get; set; } = 0;
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ namespace CoreCms.Net.RedisMQ
|
|||||||
using var container = _serviceProvider.CreateScope();
|
using var container = _serviceProvider.CreateScope();
|
||||||
var _aftersalesServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesServices>();
|
var _aftersalesServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesServices>();
|
||||||
var _orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
var _orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||||
|
var _orderItemServices = container.ServiceProvider.GetService<ICoreCmsOrderItemServices>();
|
||||||
var _aftersalesItemServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesItemServices>();
|
var _aftersalesItemServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesItemServices>();
|
||||||
var _productsServices = container.ServiceProvider.GetService<ICoreCmsProductsServices>();
|
var _productsServices = container.ServiceProvider.GetService<ICoreCmsProductsServices>();
|
||||||
var _settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
|
var _settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
|
||||||
@@ -82,17 +83,26 @@ namespace CoreCms.Net.RedisMQ
|
|||||||
}
|
}
|
||||||
//获取售后货品信息
|
//获取售后货品信息
|
||||||
var productIds = aftersalesItems.Select(p => p.productId).ToList();
|
var productIds = aftersalesItems.Select(p => p.productId).ToList();
|
||||||
|
var orderItem = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == order.orderId, p => p.id, OrderByType.Asc, true);
|
||||||
var products = await _productsServices.QueryListByClauseAsync(p => productIds.Contains(p.id), p => p.id, OrderByType.Asc, true);
|
var products = await _productsServices.QueryListByClauseAsync(p => productIds.Contains(p.id), p => p.id, OrderByType.Asc, true);
|
||||||
|
|
||||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||||
var pointExchangeModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel).ObjectToInt(); //积分模式 1全局2单品
|
var pointExchangeModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel).ObjectToInt(); //积分模式 1全局2单品
|
||||||
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(); //积分折现比例 多少积分等于1元钱。
|
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(); //多少积分等于1元钱。
|
||||||
|
|
||||||
|
//var pointDiscounted = Math.Round(pointDiscountedProportion / 100, 4);
|
||||||
|
|
||||||
//var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToInt(); //积分使用比例 全局模式下一个订单最多可以使用多少比例的积分
|
//var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToInt(); //积分使用比例 全局模式下一个订单最多可以使用多少比例的积分
|
||||||
decimal point = 0;
|
decimal point = 0;
|
||||||
foreach (var p in aftersalesItems)
|
foreach (var p in aftersalesItems)
|
||||||
{
|
{
|
||||||
var aftersalesProduct = products.Find(x => x.id == p.productId);
|
var orderProduct = orderItem.Find(x => x.productId == p.productId);
|
||||||
if (aftersalesProduct == null)
|
if (orderProduct == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
var product = products.Find(x => x.id == p.productId);
|
||||||
|
if (product == null)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
@@ -101,19 +111,18 @@ namespace CoreCms.Net.RedisMQ
|
|||||||
{
|
{
|
||||||
//可能存在就是根本不是全积分抵扣,而是订单实际在不够积分的情况下,抵扣了多少金额。那么统一就根据订单的比例来计算,更加精准,(这里的总金额是实际支付金额,去掉了优惠)
|
//可能存在就是根本不是全积分抵扣,而是订单实际在不够积分的情况下,抵扣了多少金额。那么统一就根据订单的比例来计算,更加精准,(这里的总金额是实际支付金额,去掉了优惠)
|
||||||
//如果订单实际支付金额是0的话,那就是全积分。
|
//如果订单实际支付金额是0的话,那就是全积分。
|
||||||
var practicalProportion = order.orderAmount <= 0 ? 1 : Math.Round(order.pointMoney / order.orderAmount, 4);
|
var practicalProportion = order.orderAmount <= 0 ? 1 : Math.Round(order.pointMoney / order.goodsAmount, 4);
|
||||||
|
|
||||||
//未发货的商品库存调整,如果订单未发货或者部分发货,并且用户未收到商品的情况下
|
//未发货的商品库存调整,如果订单未发货或者部分发货,并且用户未收到商品的情况下
|
||||||
if ((order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.No ||
|
if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.No or (int)GlobalEnumVars.OrderShipStatus.PartialYes &&
|
||||||
order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.PartialYes) &&
|
|
||||||
info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && p.nums == 0)
|
info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && p.nums == 0)
|
||||||
{
|
{
|
||||||
point += aftersalesProduct.price * practicalProportion * pointDiscountedProportion;
|
point += orderProduct.price * practicalProportion * orderProduct.nums * pointDiscountedProportion;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//获取货品金额*积分使用比例*数量*积分折现比例=积分抵扣的金额应该可以兑换的积分。
|
//获取货品金额*积分使用比例*数量*积分折现比例=积分抵扣的金额应该可以兑换的积分。
|
||||||
point += aftersalesProduct.price * practicalProportion * p.nums * pointDiscountedProportion;
|
point += orderProduct.price * practicalProportion * p.nums * pointDiscountedProportion;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -121,16 +130,15 @@ namespace CoreCms.Net.RedisMQ
|
|||||||
else if (pointExchangeModel == 2)
|
else if (pointExchangeModel == 2)
|
||||||
{
|
{
|
||||||
//未发货的商品库存调整,如果订单未发货或者部分发货,并且用户未收到商品的情况下
|
//未发货的商品库存调整,如果订单未发货或者部分发货,并且用户未收到商品的情况下
|
||||||
if ((order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.No ||
|
if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.No or (int)GlobalEnumVars.OrderShipStatus.PartialYes &&
|
||||||
order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.PartialYes) &&
|
|
||||||
info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && p.nums == 0)
|
info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && p.nums == 0)
|
||||||
{
|
{
|
||||||
point += aftersalesProduct.pointsDeduction * pointDiscountedProportion;
|
point += product.pointsDeduction * orderProduct.nums * pointDiscountedProportion;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//单品模式只能是全积分抵扣或者全金额支付。所以直接按照扣掉的金额还原积分即可。
|
//单品模式只能是全积分抵扣或者全金额支付。所以直接按照扣掉的金额还原积分即可。
|
||||||
point += aftersalesProduct.pointsDeduction * p.nums * pointDiscountedProportion;
|
point += product.pointsDeduction * p.nums * pointDiscountedProportion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,13 +148,15 @@ namespace CoreCms.Net.RedisMQ
|
|||||||
|
|
||||||
var newPoint = practicalPoint + userModel.point;
|
var newPoint = practicalPoint + userModel.point;
|
||||||
|
|
||||||
var pointLog = new CoreCmsUserPointLog();
|
var pointLog = new CoreCmsUserPointLog
|
||||||
pointLog.userId = userModel.id;
|
{
|
||||||
pointLog.type = (int)GlobalEnumVars.UserPointSourceTypes.PointRefundReturn;
|
userId = userModel.id,
|
||||||
pointLog.num = practicalPoint;
|
type = (int)GlobalEnumVars.UserPointSourceTypes.PointRefundReturn,
|
||||||
pointLog.balance = newPoint;
|
num = practicalPoint,
|
||||||
pointLog.remarks = "售后单:" + info.aftersalesId + "退还积分";
|
balance = newPoint,
|
||||||
pointLog.createTime = DateTime.Now;
|
remarks = "售后单:" + info.aftersalesId + "退还积分",
|
||||||
|
createTime = DateTime.Now
|
||||||
|
};
|
||||||
|
|
||||||
var id = await _userPointLogServices.InsertAsync(pointLog);
|
var id = await _userPointLogServices.InsertAsync(pointLog);
|
||||||
if (id > 0)
|
if (id > 0)
|
||||||
|
|||||||
@@ -798,13 +798,20 @@ namespace CoreCms.Net.Services
|
|||||||
//计算可用积分
|
//计算可用积分
|
||||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||||
|
|
||||||
var pointExchangeModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel).ObjectToInt(); //判断是全局模式还是单品模式
|
//判断是全局模式还是单品模式
|
||||||
|
var pointExchangeModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel).ObjectToInt();
|
||||||
if (pointExchangeModel == 1)
|
if (pointExchangeModel == 1)
|
||||||
{
|
{
|
||||||
var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToInt(10);//订单积分使用比例
|
//计算可用积分//订单积分使用比例
|
||||||
var maxPointDeductedMoney = Math.Round(cartDto.amount * ordersPointProportion / 100, 2); //最大积分抵扣的钱
|
var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToDecimal(10);
|
||||||
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(100); //积分兑换比例
|
var proportion = Math.Round(ordersPointProportion / 100, 4);
|
||||||
var pointDeductedMoney = point / pointDiscountedProportion; //积分可以抵扣的钱
|
|
||||||
|
//最多可以抵扣的金额
|
||||||
|
var maxPointDeductedMoney = Math.Round(cartDto.amount * proportion, 4);
|
||||||
|
|
||||||
|
//订单积分折现比例(多少积分可以折现1块钱)
|
||||||
|
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToDecimal(100); //积分兑换比例
|
||||||
|
var pointDeductedMoney = Math.Round(Convert.ToDecimal(point) / pointDiscountedProportion, 4); ; //积分可以抵扣的钱
|
||||||
|
|
||||||
if (maxPointDeductedMoney < pointDeductedMoney)
|
if (maxPointDeductedMoney < pointDeductedMoney)
|
||||||
{
|
{
|
||||||
@@ -832,8 +839,8 @@ namespace CoreCms.Net.Services
|
|||||||
var needsPoint = money * pointDiscountedProportion;
|
var needsPoint = money * pointDiscountedProportion;
|
||||||
|
|
||||||
cartDto.point = point;
|
cartDto.point = point;
|
||||||
cartDto.pointExchangeMoney = Convert.ToInt32(money);
|
cartDto.pointExchangeMoney = money;
|
||||||
cartDto.amount -= Convert.ToInt32(money);
|
cartDto.amount -= money;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
jm.data = cartDto;
|
jm.data = cartDto;
|
||||||
|
|||||||
@@ -195,17 +195,20 @@ namespace CoreCms.Net.Services
|
|||||||
if (orderMoney != 0)
|
if (orderMoney != 0)
|
||||||
{
|
{
|
||||||
//计算可用积分//订单积分使用比例
|
//计算可用积分//订单积分使用比例
|
||||||
var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToInt(10);
|
var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToDecimal(10);
|
||||||
|
var proportion = Math.Round(ordersPointProportion / 100, 4);
|
||||||
//最多可以抵扣的金额
|
//最多可以抵扣的金额
|
||||||
var maxPointDeductedMoney = Math.Round((orderMoney * ordersPointProportion) / 100, 2);
|
var maxPointDeductedMoney = Math.Round(orderMoney * proportion, 4);
|
||||||
|
|
||||||
//订单积分折现比例(多少积分可以折现1块钱)
|
//订单积分折现比例(多少积分可以折现1块钱)
|
||||||
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(100);
|
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToDecimal(100);
|
||||||
//计算需要多少积分
|
//计算需要多少积分
|
||||||
var needsPoint = maxPointDeductedMoney * pointDiscountedProportion;
|
var needsPoint = maxPointDeductedMoney * pointDiscountedProportion;
|
||||||
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
|
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
|
||||||
dto.availablePoint = Convert.ToInt32(needsPoint > user.point ? user.point : needsPoint);
|
var availablePoint = needsPoint > user.point ? user.point : needsPoint;
|
||||||
dto.pointExchangeMoney = dto.availablePoint / pointDiscountedProportion;
|
dto.availablePoint = Convert.ToInt32(availablePoint);
|
||||||
|
dto.pointExchangeMoney = Math.Round(availablePoint / pointDiscountedProportion, 4);
|
||||||
|
//dto.pointExchangeMoney = dto.availablePoint / pointDiscountedProportion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pointExchangeModel == 2)
|
else if (pointExchangeModel == 2)
|
||||||
@@ -243,9 +246,10 @@ namespace CoreCms.Net.Services
|
|||||||
var needsPoint = money * pointDiscountedProportion;
|
var needsPoint = money * pointDiscountedProportion;
|
||||||
|
|
||||||
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
|
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
|
||||||
dto.availablePoint = Convert.ToInt32(needsPoint > user.point ? 0 : needsPoint);
|
var availablePoint = needsPoint > user.point ? 0 : needsPoint;
|
||||||
|
dto.availablePoint = Convert.ToInt32(availablePoint);
|
||||||
|
|
||||||
dto.pointExchangeMoney = Convert.ToInt32(user.point > needsPoint ? money : 0);
|
dto.pointExchangeMoney = user.point > needsPoint ? money : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user