【优化】优化使用部分积分加金额购买,申请售后回退积分的处理,增加精度到4位,减少误差。

This commit is contained in:
大灰灰
2022-09-28 23:59:55 +08:00
parent 5efd1dea26
commit c514bef193
5 changed files with 57 additions and 36 deletions

View File

@@ -46,6 +46,7 @@ namespace CoreCms.Net.RedisMQ
using var container = _serviceProvider.CreateScope();
var _aftersalesServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesServices>();
var _orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
var _orderItemServices = container.ServiceProvider.GetService<ICoreCmsOrderItemServices>();
var _aftersalesItemServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesItemServices>();
var _productsServices = container.ServiceProvider.GetService<ICoreCmsProductsServices>();
var _settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
@@ -82,17 +83,26 @@ namespace CoreCms.Net.RedisMQ
}
//获取售后货品信息
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 allConfigs = await _settingServices.GetConfigDictionaries();
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(); //积分使用比例 全局模式下一个订单最多可以使用多少比例的积分
decimal point = 0;
foreach (var p in aftersalesItems)
{
var aftersalesProduct = products.Find(x => x.id == p.productId);
if (aftersalesProduct == null)
var orderProduct = orderItem.Find(x => x.productId == p.productId);
if (orderProduct == null)
{
continue;
};
var product = products.Find(x => x.id == p.productId);
if (product == null)
{
continue;
};
@@ -101,19 +111,18 @@ namespace CoreCms.Net.RedisMQ
{
//可能存在就是根本不是全积分抵扣,而是订单实际在不够积分的情况下,抵扣了多少金额。那么统一就根据订单的比例来计算,更加精准,(这里的总金额是实际支付金额,去掉了优惠)
//如果订单实际支付金额是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 ||
order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.PartialYes) &&
if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.No or (int)GlobalEnumVars.OrderShipStatus.PartialYes &&
info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && p.nums == 0)
{
point += aftersalesProduct.price * practicalProportion * pointDiscountedProportion;
point += orderProduct.price * practicalProportion * orderProduct.nums * pointDiscountedProportion;
}
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)
{
//未发货的商品库存调整,如果订单未发货或者部分发货,并且用户未收到商品的情况下
if ((order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.No ||
order.shipStatus == (int)GlobalEnumVars.OrderShipStatus.PartialYes) &&
if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.No or (int)GlobalEnumVars.OrderShipStatus.PartialYes &&
info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && p.nums == 0)
{
point += aftersalesProduct.pointsDeduction * pointDiscountedProportion;
point += product.pointsDeduction * orderProduct.nums * pointDiscountedProportion;
}
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 pointLog = new CoreCmsUserPointLog();
pointLog.userId = userModel.id;
pointLog.type = (int)GlobalEnumVars.UserPointSourceTypes.PointRefundReturn;
pointLog.num = practicalPoint;
pointLog.balance = newPoint;
pointLog.remarks = "售后单:" + info.aftersalesId + "退还积分";
pointLog.createTime = DateTime.Now;
var pointLog = new CoreCmsUserPointLog
{
userId = userModel.id,
type = (int)GlobalEnumVars.UserPointSourceTypes.PointRefundReturn,
num = practicalPoint,
balance = newPoint,
remarks = "售后单:" + info.aftersalesId + "退还积分",
createTime = DateTime.Now
};
var id = await _userPointLogServices.InsertAsync(pointLog);
if (id > 0)