【修复】修复首页【秒杀】【团购】优惠后价格计算显示异常的问题。修复【秒杀】【团购】列表页面优惠后价格计算显示异常的问。

【优化】取消首页【秒杀】【团购】【服务商品】自定义倒计时组件,使用组件原生数字倒计时,减少监听事件,去除内存可能泄露的风险。
This commit is contained in:
大灰灰
2022-11-04 04:54:30 +08:00
parent 9c96fb0538
commit 18acbe2bc0
6 changed files with 360 additions and 230 deletions

View File

@@ -30,6 +30,7 @@ using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ScanProductV2AddRequest.Types.Product.Types;
namespace CoreCms.Net.Services
@@ -176,10 +177,143 @@ namespace CoreCms.Net.Services
}
#endregion
#region
#region
/// <summary>
/// 获取团购列表数据
/// 获取团购列表数据(根据营销序列)
/// </summary>
/// <returns></returns>
public async Task<List<GroupPurchaseSeckillDTO>> GetGroupListForPages(int[] promotionIds)
{
using var container = _serviceProvider.CreateScope();
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
var dtoData = new List<GroupPurchaseSeckillDTO>();
var promotions = await _dal.QueryListByClauseAsync(p => p.isEnable == true && p.isDel == false && promotionIds.Contains(p.id), promotionIds.Length, "", true, true);
if (promotions != null && promotions.Any())
{
//获取团购序列
var pIds = promotions.Select(p => p.id).ToList();
//获取规则参数
var conditions = await _promotionConditionServices.QueryListByClauseAsync(p => pIds.Contains(p.promotionId), p => p.id, OrderByType.Asc, true, true);
//获取规则结果集
var results = await _promotionResultServices.QueryListByClauseAsync(p => pIds.Contains(p.promotionId), p => p.id, OrderByType.Asc, true, true);
var goodIds = (from condition in conditions where condition != null && condition.parameters.Contains("goodsId") select (JObject)JsonConvert.DeserializeObject(condition.parameters) into parameters select parameters["goodsId"].ObjectToInt(0)).ToList();
var goodData = await goodsServices.QueryGoodWithDefaultProductAsync(p => goodIds.Contains(p.id), p => p.id, OrderByType.Asc, true);
foreach (var item in promotions)
{
var dtNow = DateTime.Now;
var dto = new GroupPurchaseSeckillDTO();
//事物处理过程开始
dto.id = item.id;
dto.name = item.name;
dto.type = item.type;
dto.sort = item.sort;
dto.maxNums = item.maxNums;
dto.maxGoodsNums = item.maxGoodsNums;
dto.maxRecevieNums = item.maxRecevieNums;
dto.startTime = item.startTime;
dto.endTime = item.endTime;
dto.isEnable = item.isEnable;
dto.isExclusive = item.isExclusive;
dto.isAutoReceive = item.isAutoReceive;
dto.effectiveDays = item.effectiveDays;
dto.effectiveHours = item.effectiveHours;
var dt = DateTime.Now;
if (item.startTime > dt)
{
dto.startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Upcoming;
}
else if (item.startTime < dt && dt < item.endTime)
{
dto.startStatus = (int)GlobalEnumVars.GroupSeckillStatus.InProgress;
}
else if (item.endTime < dt)
{
dto.startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Finished;
}
var condition = conditions.Find(p => p.promotionId == item.id);
if (condition != null && condition.parameters.Contains("goodsId"))
{
var parameters = (JObject)JsonConvert.DeserializeObject(condition.parameters);
var goodId = parameters["goodsId"].ObjectToInt(0);
var good = goodData.Find(p => p.id == goodId);
if (good != null)
{
dto.goodBrief = good.brief;
dto.goodName = good.name;
dto.goodThumbnail = good.image;
dto.goodImages = good.images;
dto.goodStock = good.stock;
dto.goodViewCount = good.viewCount;
dto.goodUnit = good.unit;
dto.mktPrice = good.mktprice;
dto.price = good.price;
var ts = item.endTime.Subtract(dtNow);
dto.timestamp = (int)ts.TotalSeconds;
}
}
var result = results.Find(p => p.promotionId == item.id);
if (result != null)
{
var resultParameters = (JObject)JsonConvert.DeserializeObject(result.parameters);
decimal promotionAmount = 0;
{
var cartProducts = new CartProducts()
{
nums = 1,
products = new CoreCmsProducts()
{
price = dto.price,
amount = dto.price,
}
};
switch (result.code)
{
//指定商品减固定金额
case "GOODS_REDUCE":
promotionAmount = _promotionResultServices.result_GOODS_REDUCE(resultParameters, cartProducts, item);
break;
//指定商品打X折
case "GOODS_DISCOUNT":
promotionAmount = _promotionResultServices.result_GOODS_DISCOUNT(resultParameters, cartProducts, item);
break;
//指定商品一口价
case "GOODS_ONE_PRICE":
promotionAmount = _promotionResultServices.result_GOODS_ONE_PRICE(resultParameters, cartProducts, item);
break;
//指定商品每第几件减指定金额
case "GOODS_HALF_PRICE":
//这个条件不在列表做处理
promotionAmount = 0;
break;
}
}
if (promotionAmount > 0)
{
dto.price = Math.Round(dto.price - promotionAmount, 2);
}
}
dtoData.Add(dto);
}
}
return dtoData;
}
#endregion
#region
/// <summary>
/// 获取团购列表数据(根据类型获取当前可用)
/// </summary>
/// <returns></returns>
public async Task<WebApiCallBack> GetGroupList(int type, int status, int pageIndex, int pageSize)
@@ -270,6 +404,52 @@ namespace CoreCms.Net.Services
dto.timestamp = (int)ts.TotalSeconds;
}
}
var result = results.Find(p => p.promotionId == item.id);
if (result != null)
{
JObject resultParameters = (JObject)JsonConvert.DeserializeObject(result.parameters);
decimal promotionAmount = 0;
{
var cartProducts = new CartProducts()
{
nums = 1,
products = new CoreCmsProducts()
{
price = dto.price,
amount = dto.price,
}
};
switch (result.code)
{
//指定商品减固定金额
case "GOODS_REDUCE":
promotionAmount = _promotionResultServices.result_GOODS_REDUCE(resultParameters, cartProducts, item);
break;
//指定商品打X折
case "GOODS_DISCOUNT":
promotionAmount = _promotionResultServices.result_GOODS_DISCOUNT(resultParameters, cartProducts, item);
break;
//指定商品一口价
case "GOODS_ONE_PRICE":
promotionAmount = _promotionResultServices.result_GOODS_ONE_PRICE(resultParameters, cartProducts, item);
break;
//指定商品每第几件减指定金额
case "GOODS_HALF_PRICE":
//这个条件不在列表做处理
promotionAmount = 0;
break;
}
}
if (promotionAmount > 0)
{
dto.price = Math.Round(dto.price - promotionAmount, 2);
}
}
dtoData.Add(dto);
}
}

View File

@@ -498,7 +498,7 @@ namespace CoreCms.Net.Services
if (parameters != null && parameters.ContainsKey("list"))
{
var result = JArray.Parse(parameters["list"].ToString());
var newReslut = new JArray();
var ids = new List<int>();
foreach (var jToken in result)
{
var ss = (JObject)jToken;
@@ -509,47 +509,17 @@ namespace CoreCms.Net.Services
var promotionId = ss["id"].ObjectToInt(0);
if (promotionId > 0)
{
var promotionModel = await _promotionServices.QueryByClauseAsync(p => p.id == promotionId && p.isEnable == true && p.startTime <= dt && p.endTime > dt, true, true);
if (promotionModel != null)
{
var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionId, true, true);
if (condition != null)
{
var goods = await _promotionServices.GetGroupDetail(promotionId, 0, (int)GlobalEnumVars.PromotionType.Group, false);
if (goods.status)
{
var goodJson = JsonConvert.SerializeObject(goods.data);
ss.Add("goods", JToken.Parse(goodJson));
}
}
int startStatus;
var lastTime = 0;
if (promotionModel.startTime > dt)
{
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Upcoming;
var ts = promotionModel.startTime.Subtract(dt);
lastTime = (int)ts.TotalSeconds;
}
else if (promotionModel.startTime <= dt && promotionModel.endTime > dt)
{
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.InProgress;
var ts = promotionModel.endTime.Subtract(dt);
lastTime = (int)ts.TotalSeconds;
}
else
{
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Finished;
}
ss.Add("startStatus", startStatus);
ss.Add("lastTime", lastTime);
newReslut.Add(ss);
}
ids.Add(promotionId);
}
}
}
parameters.Remove("list");
parameters.Add("list", newReslut);
if (ids.Any())
{
var list = await _promotionServices.GetGroupListForPages(ids.ToArray());
parameters.Remove("list");
parameters.Add("list", JArray.FromObject(list));
}
}
dto.parameters = parameters;
@@ -561,7 +531,7 @@ namespace CoreCms.Net.Services
if (parameters != null && parameters.ContainsKey("list"))
{
var result = JArray.Parse(parameters["list"].ToString());
var newReslut = new JArray();
var ids = new List<int>();
foreach (var jToken in result)
{
var ss = (JObject)jToken;
@@ -572,53 +542,18 @@ namespace CoreCms.Net.Services
var promotionId = ss["id"].ObjectToInt(0);
if (promotionId > 0)
{
var promotionModel = await _promotionServices.QueryByClauseAsync(p => p.id == promotionId && p.isEnable == true && p.startTime <= dt && p.endTime > dt, true, true);
if (promotionModel != null)
{
var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionId, true, true);
if (condition != null)
{
var goods = await _promotionServices.GetGroupDetail(promotionId, 0, (int)GlobalEnumVars.PromotionType.Seckill, false);
if (goods.status)
{
var goodJson = JsonConvert.SerializeObject(goods.data);
ss.Add("goods", JToken.Parse(goodJson));
}
}
int startStatus;
int lastTime = 0;
if (promotionModel.startTime > dt)
{
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Upcoming;
var ts = promotionModel.startTime.Subtract(dt);
lastTime = (int)ts.TotalSeconds;
}
else if (promotionModel.startTime <= dt && promotionModel.endTime > dt)
{
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.InProgress;
var ts = promotionModel.endTime.Subtract(dt);
lastTime = (int)ts.TotalSeconds;
}
else
{
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Finished;
}
ss.Add("startStatus", startStatus);
ss.Add("lastTime", lastTime);
newReslut.Add(ss);
}
ids.Add(promotionId);
}
}
}
parameters.Remove("list");
parameters.Add("list", newReslut);
}
if (ids.Any())
{
var list = await _promotionServices.GetGroupListForPages(ids.ToArray());
parameters.Remove("list");
parameters.Add("list", JArray.FromObject(list));
}
}
dto.parameters = parameters;
break;
}