【调整】重写拼团前端列表,拼团详情,拼团首页组件,拼团海报等数据获取规则,减少不必要的数据查询,增加redis缓存,提升访问速度,调整拼团海报为新海报模式。

【优化】优化分享识别跳转页面【jump】代码。
This commit is contained in:
大灰灰
2022-10-21 05:41:25 +08:00
parent 91e6cb2432
commit adfbbc783e
21 changed files with 485 additions and 329 deletions

View File

@@ -48,78 +48,83 @@ namespace CoreCms.Net.Services
/// <summary>
/// 取拼团的商品信息,增加拼团的一些属性,会显示优惠价
/// </summary>
/// <param name="pinTuanRuleInfo">拼团规则</param>
/// <param name="goodsId">商品id</param>
/// <param name="userId">用户序列</param>
/// <param name="needRecord">获取拼团记录</param>
/// <param name="needCheckStock">校验库存</param>
/// <param name="needGoodSku">获取商品sku</param>
/// <returns></returns>
public async Task<CoreCmsGoods> GetGoodsInfo(int id, int userId, int pinTuanStatus = 0)
public async Task<CoreCmsGoods> GetGoodsInfo(CoreCmsPinTuanRule pinTuanRuleInfo, int goodsId, int userId, bool needRecord, bool needCheckStock, bool needGoodSku)
{
using (var container = _serviceProvider.CreateScope())
if (pinTuanRuleInfo == null) return null;
if (goodsId == 0) return null;
using var container = _serviceProvider.CreateScope();
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
var pinTuanRecordServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRecordServices>();
var pinTuanGoodsServices = container.ServiceProvider.GetService<ICoreCmsPinTuanGoodsServices>();
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
var goodsInfo = await goodsServices.GetGoodsDetail(goodsId, userId, false, "goods", 0, needGoodSku);
if (goodsInfo == null) return null;
goodsInfo.pinTuanRule = pinTuanRuleInfo;
goodsInfo.pinTuanPrice = goodsInfo.price - pinTuanRuleInfo.discountAmount;
if (goodsInfo.pinTuanPrice < 0) goodsInfo.pinTuanPrice = 0;
//取拼团记录
goodsInfo.pinTuanRecordNums = await pinTuanRecordServices.GetCountAsync(p => p.ruleId == pinTuanRuleInfo.id && p.goodsId == goodsInfo.id, true);
//判断拼团状态
var dt = DateTime.Now;
if (goodsInfo.pinTuanRule.startTime > dt)
{
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
var pinTuanRecordServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRecordServices>();
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun;
var goodsInfo = await goodsServices.GetGoodsDetail(id, userId, false, "goods", 0, true);
if (goodsInfo == null) return null;
//把拼团的一些属性等加上
var info =
await pinTuanRuleServices
.QueryMuchFirstAsync<CoreCmsPinTuanRule, CoreCmsPinTuanGoods, CoreCmsPinTuanRule>(
(join1, join2) => new object[] { JoinType.Left, join1.id == join2.ruleId },
(join1, join2) => join1, (join1, join2) => join2.goodsId == id && join1.isStatusOpen == true);
TimeSpan ts = goodsInfo.pinTuanRule.startTime.Subtract(dt);
goodsInfo.pinTuanRule.lastTime = (int)ts.TotalSeconds;
}
else if (goodsInfo.pinTuanRule.startTime <= dt && goodsInfo.pinTuanRule.endTime > dt)
{
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin;
if (info == null) return null;
goodsInfo.pinTuanRule = info;
goodsInfo.pinTuanPrice = goodsInfo.price - info.discountAmount;
if (goodsInfo.pinTuanPrice < 0) goodsInfo.pinTuanPrice = 0;
//取拼团记录
goodsInfo.pinTuanRecordNums = await pinTuanRecordServices.GetCountAsync(p => p.ruleId == info.id && p.goodsId == id && p.status == pinTuanStatus);
//判断拼团状态
var dt = DateTime.Now;
if (goodsInfo.pinTuanRule.startTime > dt)
{
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun;
TimeSpan ts = goodsInfo.pinTuanRule.startTime.Subtract(dt);
goodsInfo.pinTuanRule.lastTime = (int)ts.TotalSeconds;
}
else if (goodsInfo.pinTuanRule.startTime <= dt && goodsInfo.pinTuanRule.endTime > dt)
{
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin;
TimeSpan ts = goodsInfo.pinTuanRule.endTime.Subtract(dt);
goodsInfo.pinTuanRule.lastTime = (int)ts.TotalSeconds;
}
else
{
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired;
}
//拼团记录
//var re = await pinTuanRecordServices.GetRecord(info.id, goodsInfo.product.goodsId);
var re = await pinTuanRecordServices.GetRecord(info.id, goodsInfo.id, pinTuanStatus);
TimeSpan ts = goodsInfo.pinTuanRule.endTime.Subtract(dt);
goodsInfo.pinTuanRule.lastTime = (int)ts.TotalSeconds;
}
else
{
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired;
}
//拼团记录
if (needRecord)
{
var re = await pinTuanRecordServices.GetRecord(pinTuanRuleInfo.id, goodsInfo.id, (int)GlobalEnumVars.PinTuanRecordStatus.InProgress);
if (re.status)
{
goodsInfo.pinTuanRecord = re.data as List<CoreCmsPinTuanRecord>;
}
var checkOrder = orderServices.FindLimitOrder(goodsInfo.product.id, userId, info.startTime, info.endTime, 0);
if (info.maxGoodsNums > 0)
}
//判断是否需要检测库存
if (needCheckStock)
{
var checkOrder = orderServices.FindLimitOrder(goodsInfo.product.id, userId, pinTuanRuleInfo.startTime, pinTuanRuleInfo.endTime, 0);
if (pinTuanRuleInfo.maxGoodsNums > 0)
{
goodsInfo.stock = info.maxGoodsNums;
goodsInfo.stock = pinTuanRuleInfo.maxGoodsNums;
//活动销售件数
goodsInfo.product.stock = info.maxGoodsNums - checkOrder.TotalOrders;
goodsInfo.product.stock = pinTuanRuleInfo.maxGoodsNums - checkOrder.TotalOrders;
//goodsInfo.buyCount = info.maxGoodsNums - checkOrder.TotalOrders;
goodsInfo.buyPinTuanCount = checkOrder.TotalOrders;
}
else
{
//goodsInfo.buyCount = info.maxGoodsNums - checkOrder.TotalOrders;
goodsInfo.buyPinTuanCount = checkOrder.TotalOrders;
}
return goodsInfo;
}
return goodsInfo;
}

View File

@@ -65,7 +65,7 @@ namespace CoreCms.Net.Services
/// 接口上获取拼团所有商品
/// </summary>
/// <returns></returns>
public async Task<WebApiCallBack> GetPinTuanList(int id = 0, int userId = 0)
public async Task<WebApiCallBack> GetPinTuanList(int userId = 0)
{
var jm = new WebApiCallBack();
@@ -73,35 +73,32 @@ namespace CoreCms.Net.Services
var pinTuanGoodsServices = container.ServiceProvider.GetService<ICoreCmsPinTuanGoodsServices>();
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
var pinTuanRules = await pinTuanRuleServices.QueryListByClauseAsync(p => p.isStatusOpen == true, p => p.sort, OrderByType.Asc, true, true, 24 * 60);
if (pinTuanRules == null && !pinTuanRules.Any())
{
jm.status = true;
jm.data = null;
return jm;
}
//获取开启的规则集序列
var pinTuanRuleIds = pinTuanRules.Select(p => p.id).ToList();
//获取下级商品数据
var pinTuanGoods = await pinTuanGoodsServices.QueryListByClauseAsync(p => pinTuanRuleIds.Contains(p.ruleId), p => p.ruleId, OrderByType.Asc, true, true);
//从缓存中获取有效的数据
var dt = DateTime.Now;
var where = PredicateBuilder.True<CoreCmsPinTuanRule>();
@where = @where.And(p => p.startTime < dt);
@where = @where.And(p => p.endTime > dt);
if (id != 0)
{
@where = @where.And(p => p.id == id);
}
var list = pinTuanRules.Where(p => p.startTime < dt && p.endTime > dt).OrderBy(p => p.sort).ToList();
var list = await pinTuanRuleServices.QueryListByClauseAsync(@where, p => p.sort, OrderByType.Asc);
var goodIds = new List<int>();
if (list != null && list.Any())
{
var ruleIds = list.Select(p => p.id).ToList();
var goods = await pinTuanGoodsServices.QueryListByClauseAsync(p => ruleIds.Contains(p.ruleId));
if (goods != null && goods.Any())
{
goodIds = goods.Select(p => p.goodsId).ToList();
}
}
if (goodIds.Any())
if (list.Any())
{
var goods = new List<CoreCmsGoods>();
foreach (var goodId in goodIds)
foreach (var item in list)
{
var g = await pinTuanGoodsServices.GetGoodsInfo(goodId, userId);
if (g != null)
var pinTuanGood = pinTuanGoods.Find(p => p.ruleId == item.id);
if (pinTuanGood != null)
{
var g = await pinTuanGoodsServices.GetGoodsInfo(item, pinTuanGood.goodsId, userId, false,
false, false);
if (g == null) continue;
goods.Add(g);
}
}
@@ -112,7 +109,6 @@ namespace CoreCms.Net.Services
return jm;
}
/// <summary>
/// 根据条件查询分页数据
/// </summary>
@@ -131,14 +127,14 @@ namespace CoreCms.Net.Services
/// <summary>
/// 根据商品id获取拼团规则信息
/// 根据规则Id获取拼团相关信息
/// </summary>
/// <param name="goodId"></param>
/// <param name="ruleId">规则序列</param>
/// <returns></returns>
public async Task<TagPinTuanResult> GetPinTuanInfo(int goodId)
public async Task<TagPinTuanResult> GetPinTuanInfo(int ruleId)
{
return await _dal.GetPinTuanInfo(goodId);
return await _dal.GetPinTuanInfo(ruleId);
}
}
}

View File

@@ -532,13 +532,13 @@ namespace CoreCms.Net.Services
}
break;
case (int)GlobalEnumVars.UrlSharePageType.PinTuan:
if (parameter.ContainsKey("goodsId") || parameter.ContainsKey("teamId"))
if (parameter.ContainsKey("goodsId") && parameter.ContainsKey("teamId") && parameter.ContainsKey("groupId"))
{
str = parameter["goodsId"] + "_" + parameter["teamId"];
str = parameter["goodsId"] + "_" + parameter["groupId"] + "_" + parameter["teamId"];
}
else
{
jm.msg = "参数必须传goodsId,teamId";
jm.msg = "参数必须传goodsId,teamId,groupId";
return jm;
}
break;
@@ -565,7 +565,7 @@ namespace CoreCms.Net.Services
}
break;
case (int)GlobalEnumVars.UrlSharePageType.AddPinTuan:
if (parameter.ContainsKey("goodsId") || parameter.ContainsKey("groupId") || parameter.ContainsKey("teamId"))
if (parameter.ContainsKey("goodsId") && parameter.ContainsKey("groupId") && parameter.ContainsKey("teamId"))
{
str = parameter["goodsId"] + "_" + parameter["groupId"] + "_" + parameter["teamId"];
}
@@ -678,27 +678,16 @@ namespace CoreCms.Net.Services
}
break;
case (int)GlobalEnumVars.UrlSharePageType.PinTuan:
//if (arr.Length == 3)
//{
// jm.data = new
// {
// goodsId = arr[0],
// groupId = arr[1],
// teamId = arr[2]
// };
// jm.status = true;
//}
if (arr.Length == 2)
if (arr.Length == 3)
{
jm.data = new
{
goodsId = arr[0],
teamId = arr[1]
groupId = arr[1],
teamId = arr[2]
};
jm.status = true;
}
break;
case (int)GlobalEnumVars.UrlSharePageType.Inv:
if (arr.Length == 1)

View File

@@ -560,7 +560,7 @@ namespace CoreCms.Net.Services
if (promotionModel.startTime > dt)
{
startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun;
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Upcoming;
TimeSpan ts = promotionModel.startTime.Subtract(dt);
lastTime = (int)ts.TotalSeconds;
@@ -568,7 +568,7 @@ namespace CoreCms.Net.Services
}
else if (promotionModel.startTime <= dt && promotionModel.endTime > dt)
{
startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin;
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.InProgress;
TimeSpan ts = promotionModel.endTime.Subtract(dt);
lastTime = (int)ts.TotalSeconds;
@@ -576,7 +576,7 @@ namespace CoreCms.Net.Services
}
else
{
startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired;
startStatus = (int)GlobalEnumVars.GroupSeckillStatus.Finished;
}
((JObject)ss).Add("startStatus", startStatus);
@@ -610,10 +610,10 @@ namespace CoreCms.Net.Services
{
if (ss.ContainsKey("goodsId"))
{
var goodsId = ((JObject)ss)["goodsId"].ObjectToInt(0);
if (goodsId > 0)
var ruleId = ((JObject)ss)["id"].ObjectToInt(0);
if (ruleId > 0)
{
var goodsInfo = await _pinTuanRuleServices.GetPinTuanInfo(goodsId);
var goodsInfo = await _pinTuanRuleServices.GetPinTuanInfo(ruleId);
if (goodsInfo != null)
{
var pinTuanStartStatus = 1;
@@ -646,8 +646,6 @@ namespace CoreCms.Net.Services
decimal pinTuanPrice = goodsInfo.goodsPrice - goodsInfo.discountAmount;
if (pinTuanPrice < 0) pinTuanPrice = 0;
var obj = new JObject();
((JObject)obj).Add("pinTuanStartStatus", pinTuanStartStatus);
((JObject)obj).Add("lastTime", lastTime);
@@ -733,8 +731,6 @@ namespace CoreCms.Net.Services
}
}
}
}
parameters.Remove("list");
parameters.Add("list", result);