diff --git a/CoreCms.Net.Model/ViewModels/DTO/CartDto.cs b/CoreCms.Net.Model/ViewModels/DTO/CartDto.cs index 85c5ce88..3e35c152 100644 --- a/CoreCms.Net.Model/ViewModels/DTO/CartDto.cs +++ b/CoreCms.Net.Model/ViewModels/DTO/CartDto.cs @@ -83,7 +83,7 @@ namespace CoreCms.Net.Model.ViewModels.DTO /// /// 积分可以抵扣多少金额 /// - public int pointExchangeMoney { get; set; } = 0; + public decimal pointExchangeMoney { get; set; } = 0; public List list { get; set; } = new(); diff --git a/CoreCms.Net.Model/ViewModels/DTO/UserDto.cs b/CoreCms.Net.Model/ViewModels/DTO/UserDto.cs index a0e14a53..62a59b2a 100644 --- a/CoreCms.Net.Model/ViewModels/DTO/UserDto.cs +++ b/CoreCms.Net.Model/ViewModels/DTO/UserDto.cs @@ -20,8 +20,8 @@ namespace CoreCms.Net.Model.ViewModels.DTO public class GetUserPointResult { 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 point { get; set; } = 0; diff --git a/CoreCms.Net.RedisMQ/AfterSalesReviewForPointSubscribe.cs b/CoreCms.Net.RedisMQ/AfterSalesReviewForPointSubscribe.cs index a9a41d0a..9dab1e11 100644 --- a/CoreCms.Net.RedisMQ/AfterSalesReviewForPointSubscribe.cs +++ b/CoreCms.Net.RedisMQ/AfterSalesReviewForPointSubscribe.cs @@ -46,6 +46,7 @@ namespace CoreCms.Net.RedisMQ using var container = _serviceProvider.CreateScope(); var _aftersalesServices = container.ServiceProvider.GetService(); var _orderServices = container.ServiceProvider.GetService(); + var _orderItemServices = container.ServiceProvider.GetService(); var _aftersalesItemServices = container.ServiceProvider.GetService(); var _productsServices = container.ServiceProvider.GetService(); var _settingServices = container.ServiceProvider.GetService(); @@ -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) diff --git a/CoreCms.Net.Services/Cart/CoreCmsCartServices.cs b/CoreCms.Net.Services/Cart/CoreCmsCartServices.cs index 4ef96a0d..2921f469 100644 --- a/CoreCms.Net.Services/Cart/CoreCmsCartServices.cs +++ b/CoreCms.Net.Services/Cart/CoreCmsCartServices.cs @@ -798,13 +798,20 @@ namespace CoreCms.Net.Services //计算可用积分 var allConfigs = await _settingServices.GetConfigDictionaries(); - var pointExchangeModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel).ObjectToInt(); //判断是全局模式还是单品模式 + //判断是全局模式还是单品模式 + var pointExchangeModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel).ObjectToInt(); if (pointExchangeModel == 1) { - var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToInt(10);//订单积分使用比例 - var maxPointDeductedMoney = Math.Round(cartDto.amount * ordersPointProportion / 100, 2); //最大积分抵扣的钱 - var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(100); //积分兑换比例 - var pointDeductedMoney = point / pointDiscountedProportion; //积分可以抵扣的钱 + //计算可用积分//订单积分使用比例 + var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToDecimal(10); + var proportion = Math.Round(ordersPointProportion / 100, 4); + + //最多可以抵扣的金额 + 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) { @@ -832,8 +839,8 @@ namespace CoreCms.Net.Services var needsPoint = money * pointDiscountedProportion; cartDto.point = point; - cartDto.pointExchangeMoney = Convert.ToInt32(money); - cartDto.amount -= Convert.ToInt32(money); + cartDto.pointExchangeMoney = money; + cartDto.amount -= money; } } jm.data = cartDto; diff --git a/CoreCms.Net.Services/User/CoreCmsUserServices.cs b/CoreCms.Net.Services/User/CoreCmsUserServices.cs index 2a00030e..79cbbc73 100644 --- a/CoreCms.Net.Services/User/CoreCmsUserServices.cs +++ b/CoreCms.Net.Services/User/CoreCmsUserServices.cs @@ -195,17 +195,20 @@ namespace CoreCms.Net.Services 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块钱) - var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(100); + var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToDecimal(100); //计算需要多少积分 var needsPoint = maxPointDeductedMoney * pointDiscountedProportion; //确定是否有那么多积分去抵扣比例计算出的能抵扣的钱 - dto.availablePoint = Convert.ToInt32(needsPoint > user.point ? user.point : needsPoint); - dto.pointExchangeMoney = dto.availablePoint / pointDiscountedProportion; + var availablePoint = needsPoint > user.point ? user.point : needsPoint; + dto.availablePoint = Convert.ToInt32(availablePoint); + dto.pointExchangeMoney = Math.Round(availablePoint / pointDiscountedProportion, 4); + //dto.pointExchangeMoney = dto.availablePoint / pointDiscountedProportion; } } else if (pointExchangeModel == 2) @@ -243,9 +246,10 @@ namespace CoreCms.Net.Services 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; } }