mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2026-02-04 22:49:49 +08:00
### 0.6.0 专业版(大版本升级,破坏性升级,请酌情处理):
【新增】弃用现在sku前端,启用全新sku组件,更加灵活,体验更好。 【新增】新增通过商品序列获取sku全新列表功能。 【新增】仓储层底层增加二级缓存功能,后面将逐步完善底层缓存中心模块。 【新增】0元购,积分兑换模式下,也去计算用户是否科技升级。 【新增】数据及业务仓储增加二级缓存功能。curd可自主控制是否缓存和清除。 【新增】订单导出excel数据增加商品名称+货品sku组合展示的方式。 【新增】自定义交易组件增加【获取商家信息】【更新商家信息】两个接口处理。 【新增】增加公告列表及公告详情页面,首页组件公告点击跳转列表展示。 【新增】个人中心增加【公告中心】入口。 【新增】后台余额变动增加说明录入。 【调整】将前端能进行分包的文件夹都进行分包,减少主包占用,方便进行二开。 【调整】因ckeditor5存在图片不可设置宽度,上传不支持mp4,排版不畅等情况,降级使用ckeditor4版本。 【修复】修复0.5.5版本售后积分返还机制积分模式判断异常的问题。 【修复】修复使用积分全额抵扣,或其他优惠政策导致的0元购,未进行短信提醒及小票打印机未打印的问题。 【修复】修复更换ckeditor4编辑器后接龙添加编辑调用失败的问题。 【修复】修复积分全额抵扣,金额0元购的情况下,进行售后执行完毕,订单未完结的情况。 【优化】去除分销申请面板按钮无用并失效报错的customStyle属性。 【优化】优化部分方法中使用手写字符串的遗留问题,统一采用enum方式。 【优化】优化前端及接口部分命名错误的问题。错将skill误写成seckill。 【优化】去除uniapp端多个客服代码。 【优化】商品详情底部完善购物车数量显示的问题。 【优化】优化团购列表,拼团列表,秒杀页面页面样式布局差异问题。 【优化】调整支付结果界面样式效果,仿微信支付结果界面。更加清晰明朗。 【优化】优化售后提交页面json计算,开放当用户下单后但未发货情况下,可以申请直接售后的操作需求。 【优化】后台商家手机号码支持设置多个,使用小写逗号分隔,方便多个商家管理员接收下单提醒。 【优化】后台售后单审核,调整售后商品为必选项。
This commit is contained in:
@@ -15,7 +15,6 @@ using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
|
||||
@@ -17,7 +17,6 @@ using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsGoodsCategory entity)
|
||||
public async Task<AdminUiCallBack> InsertAsync(CoreCmsGoodsCategory entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
@@ -54,17 +54,7 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsGoodsCategory entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsGoodsCategory> entity)
|
||||
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsGoodsCategory entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
@@ -74,21 +64,11 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
@@ -20,13 +20,12 @@ using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Loging;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
using ToolGood.Words;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
@@ -40,6 +39,8 @@ namespace CoreCms.Net.Services
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IToolsServices _toolsServices;
|
||||
|
||||
|
||||
public CoreCmsGoodsCommentServices(IUnitOfWork unitOfWork, ICoreCmsGoodsCommentRepository dal,
|
||||
IServiceProvider serviceProvider, IToolsServices toolsServices)
|
||||
{
|
||||
@@ -74,12 +75,10 @@ namespace CoreCms.Net.Services
|
||||
//已经评价或者存在问题
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
var goodComments = new List<CoreCmsGoodsComment>();
|
||||
var gid = new List<int>();
|
||||
|
||||
|
||||
|
||||
|
||||
foreach (var item in items)
|
||||
{
|
||||
//判断此条记录是否是此订单下面的
|
||||
@@ -136,32 +135,12 @@ namespace CoreCms.Net.Services
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsGoodsComment entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsGoodsComment entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsGoodsComment> entity)
|
||||
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsGoodsComment entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
@@ -171,21 +150,11 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@@ -212,9 +181,6 @@ namespace CoreCms.Net.Services
|
||||
return await _dal.DetailsByIdAsync(predicate, orderByExpression, orderByType);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
@@ -226,7 +192,7 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsGoodsComment>> QueryPageAsync(Expression<Func<CoreCmsGoodsComment, bool>> predicate,
|
||||
public async Task<IPageList<CoreCmsGoodsComment>> QueryPageAsync(Expression<Func<CoreCmsGoodsComment, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoodsComment, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
|
||||
@@ -15,7 +15,6 @@ using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
|
||||
@@ -15,7 +15,6 @@ using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
|
||||
@@ -23,11 +23,15 @@ using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.Entities.Expression;
|
||||
using CoreCms.Net.Model.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinUserInfoBatchGetRequest.Types;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
@@ -46,6 +50,11 @@ namespace CoreCms.Net.Services
|
||||
private readonly ICoreCmsGoodsCollectionServices _goodsCollectionServices;
|
||||
private readonly ICoreCmsBrandServices _brandServices;
|
||||
private readonly ICoreCmsOrderItemServices _orderItemServices;
|
||||
private readonly ICoreCmsUserServices _userServices;
|
||||
private readonly ICoreCmsUserGradeServices _userGradeServices;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
|
||||
public CoreCmsGoodsServices(IUnitOfWork unitOfWork, ICoreCmsGoodsRepository dal
|
||||
, ICoreCmsProductsServices productsServices
|
||||
@@ -54,8 +63,7 @@ namespace CoreCms.Net.Services
|
||||
, ICoreCmsPromotionServices promotionServices
|
||||
, ICoreCmsGoodsCollectionServices goodsCollectionServices
|
||||
, ICoreCmsBrandServices brandServices
|
||||
, ICoreCmsOrderItemServices orderItemServices
|
||||
)
|
||||
, ICoreCmsOrderItemServices orderItemServices, ICoreCmsUserServices userServices, ICoreCmsUserGradeServices userGradeServices, IServiceProvider serviceProvider)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
@@ -67,6 +75,9 @@ namespace CoreCms.Net.Services
|
||||
_goodsCollectionServices = goodsCollectionServices;
|
||||
_brandServices = brandServices;
|
||||
_orderItemServices = orderItemServices;
|
||||
_userServices = userServices;
|
||||
_userGradeServices = userGradeServices;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +107,7 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
@@ -308,7 +319,7 @@ namespace CoreCms.Net.Services
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var bl = await base.BaseDal.UpdateAsync(p => new CoreCmsGoods() { isMarketable = false }, p => ids.Contains(p.id));
|
||||
var bl = await _dal.UpdateAsync(p => new CoreCmsGoods() { isMarketable = false }, p => ids.Contains(p.id));
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "下架成功" : "下架失败";
|
||||
|
||||
@@ -497,6 +508,7 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取商品详情
|
||||
|
||||
/// <summary>
|
||||
@@ -507,57 +519,379 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="isPromotion">是否涉及优惠</param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="groupId"></param>
|
||||
/// <param name="needSku">是否需要sku</param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsGoods> GetGoodsDetial(int id, int userId = 0, bool isPromotion = false, string type = "goods", int groupId = 0)
|
||||
public async Task<CoreCmsGoods> GetGoodsDetail(int id, int userId = 0, bool isPromotion = false, string type = "goods", int groupId = 0, bool needSku = false)
|
||||
{
|
||||
var model = await _dal.QueryByIdAsync(id);
|
||||
if (model == null) return null;
|
||||
var good = await _dal.QueryByClauseAsync(p => p.id == id, true);
|
||||
if (good == null) return null;
|
||||
//取图片集
|
||||
var album = model.images.Split(",");
|
||||
model.image = !string.IsNullOrEmpty(model.image) ? model.image : "/static/images/common/empty-banner.png";
|
||||
model.album = album;
|
||||
//label_ids
|
||||
good.album = good.images.Split(",");
|
||||
//获取主图
|
||||
good.image = !string.IsNullOrEmpty(good.image) ? good.image : "/static/images/common/empty-banner.png";
|
||||
//获取用户信息
|
||||
if (userId > 0)
|
||||
{
|
||||
model.isFav = await _goodsCollectionServices.ExistsAsync(p => p.goodsId == model.id && p.userId == userId);
|
||||
good.isFav = await _goodsCollectionServices.ExistsAsync(p => p.goodsId == good.id && p.userId == userId, true);
|
||||
}
|
||||
//取默认货品
|
||||
model.sku = await _productsServices.QueryListByClauseAsync(p => p.goodsId == model.id && p.isDel == false);
|
||||
if (!model.sku.Any()) return null;
|
||||
var products = model.sku.Find(p => p.isDefalut);
|
||||
if (products == null) return null;
|
||||
var getProductInfo = await _productsServices.GetProductInfo(products.id, isPromotion, userId, type, groupId);
|
||||
if (getProductInfo == null) return null;
|
||||
|
||||
model.product = getProductInfo;
|
||||
model.sn = getProductInfo.sn;
|
||||
model.price = getProductInfo.price;
|
||||
model.costprice = getProductInfo.costprice;
|
||||
model.mktprice = getProductInfo.mktprice;
|
||||
model.stock = getProductInfo.stock;
|
||||
model.freezeStock = getProductInfo.freezeStock;
|
||||
model.weight = getProductInfo.weight;
|
||||
var product = new CoreCmsProducts();
|
||||
var products = new List<CoreCmsProducts>();
|
||||
if (needSku == true)
|
||||
{
|
||||
//取所有货品
|
||||
products = await _productsServices.QueryListByClauseAsync(p => p.goodsId == good.id && p.isDel == false, p => p.id, OrderByType.Asc, true);
|
||||
if (products == null) return null;
|
||||
//获取默认货品
|
||||
product = products.FirstOrDefault(p => p.isDefalut);
|
||||
if (product == null) return null;
|
||||
|
||||
var minProduct = await _productsServices.QueryByClauseAsync(p => p.isDel == false && p.goodsId == id,
|
||||
p => p.price, OrderByType.Asc);
|
||||
good.skuList = await GetCoreCmsProductsView(good, products, userId, isPromotion, type, groupId);
|
||||
}
|
||||
else
|
||||
{
|
||||
product = await _productsServices.QueryByClauseAsync(p => p.goodsId == good.id && p.isDel == false && p.isDefalut == true, true);
|
||||
}
|
||||
|
||||
var maxProduct = await _productsServices.QueryByClauseAsync(p => p.isDel == false && p.goodsId == id,
|
||||
p => p.price, OrderByType.Desc);
|
||||
|
||||
model.minPrice = minProduct.price;
|
||||
model.maxPrice = maxProduct.price;
|
||||
//商品基础赋值===================================================================================================
|
||||
good.product = product;
|
||||
good.sn = product.sn;
|
||||
good.price = product.price;
|
||||
good.costprice = product.costprice;
|
||||
good.mktprice = product.mktprice;
|
||||
good.stock = product.stock;
|
||||
good.freezeStock = product.freezeStock;
|
||||
good.weight = product.weight;
|
||||
good.buyPinTuanCount = product.buyPinTuanCount;
|
||||
good.buyPromotionCount = product.buyPromotionCount;
|
||||
//获取商品最小价格
|
||||
good.minPrice = products.Any() ? products.OrderBy(p => p.price).First().price : product.price;
|
||||
//获取商品最大价格
|
||||
good.maxPrice = products.Any() ? products.OrderByDescending(p => p.price).First().price : product.price;
|
||||
|
||||
//获取品牌
|
||||
var brand = await _brandServices.QueryByIdAsync(model.brandId);
|
||||
model.brand = brand;
|
||||
good.brand = await _brandServices.QueryByIdAsync(good.brandId, true, true);
|
||||
|
||||
//取出销量
|
||||
model.buyCount = model.initialSales + await _orderItemServices.GetSumAsync(p => p.goodsId == model.id, o => o.nums, true);
|
||||
return model;
|
||||
good.buyCount = good.initialSales + await _orderItemServices.GetSumAsync(p => p.goodsId == good.id, o => o.nums, true);
|
||||
return good;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 通过商品序列获取sku列表
|
||||
/// <summary>
|
||||
/// 通过商品序列获取sku列表
|
||||
/// </summary>
|
||||
/// <param name="good"></param>
|
||||
/// <param name="products"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="isPromotion"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="groupId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsProductsView> GetCoreCmsProductsView(CoreCmsGoods good, List<CoreCmsProducts> products, int userId = 0, bool isPromotion = false, string type = "goods", int groupId = 0)
|
||||
{
|
||||
//获取默认货品
|
||||
var product = products.FirstOrDefault(p => p.isDefalut);
|
||||
if (product == null) return null;
|
||||
|
||||
|
||||
//获取会员级别优惠价
|
||||
//获取会员等级优惠价格体系
|
||||
decimal gradePrice = 0;
|
||||
if (userId > 0 && type == "goods")
|
||||
{
|
||||
//获取用户信息
|
||||
var userInfo = await _userServices.QueryByIdAsync(userId);
|
||||
if (userInfo != null)
|
||||
{
|
||||
var goodsGrades = await _goodsGradeServices.QueryByClauseAsync(p => p.goodsId == good.id && p.gradeId == userInfo.grade);
|
||||
if (goodsGrades != null)
|
||||
{
|
||||
gradePrice = goodsGrades.gradePrice;
|
||||
}
|
||||
}
|
||||
}
|
||||
//sku优惠计算===================================================================================
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
|
||||
var promotionServices = container.ServiceProvider.GetService<ICoreCmsPromotionServices>();
|
||||
var promotionConditionServices = container.ServiceProvider.GetService<ICoreCmsPromotionConditionServices>();
|
||||
var promotionResultServices = container.ServiceProvider.GetService<ICoreCmsPromotionResultServices>();
|
||||
|
||||
if (isPromotion)
|
||||
{
|
||||
var dt = DateTime.Now;
|
||||
if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant())
|
||||
{
|
||||
//团购秒杀默认时间过期后,不可以下单
|
||||
var key = false;
|
||||
var promotionInfo = await promotionServices.QueryByClauseAsync(p => p.startTime < dt && p.endTime > dt && p.id == groupId, true);
|
||||
if (promotionInfo != null)
|
||||
{
|
||||
//去除所有的条件
|
||||
var promotionCondition = await promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionInfo.id);
|
||||
if (!string.IsNullOrEmpty(promotionCondition.parameters))
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(promotionCondition.parameters);
|
||||
if (parameters.ContainsKey("goodsId") && parameters.ContainsKey("nums"))
|
||||
{
|
||||
var objNums = Convert.ToInt32(parameters["nums"]);
|
||||
var goodsIds = CommonHelper.StringToIntArray(parameters["goodsId"].ObjectToString());
|
||||
key = goodsIds.Any() && goodsIds.Contains(good.id);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (key)
|
||||
{
|
||||
//走到这一步就说明所有的促销条件都符合,那么就去计算结果
|
||||
var promotionResult = await promotionResultServices.QueryByClauseAsync(p => p.promotionId == promotionInfo.id);
|
||||
if (!string.IsNullOrEmpty(promotionResult.parameters))
|
||||
{
|
||||
foreach (var productModel in products)
|
||||
{
|
||||
var item = new CartProducts()
|
||||
{
|
||||
id = 0,
|
||||
isSelect = true,
|
||||
userId = userId,
|
||||
productId = productModel.id,
|
||||
nums = 1,
|
||||
products = productModel
|
||||
};
|
||||
decimal promotionMoney;
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(promotionResult.parameters);
|
||||
switch (promotionResult.code)
|
||||
{
|
||||
//指定商品减固定金额
|
||||
case "GOODS_REDUCE":
|
||||
promotionMoney = promotionResultServices.result_GOODS_REDUCE(parameters, item, promotionInfo);
|
||||
break;
|
||||
//指定商品打X折
|
||||
case "GOODS_DISCOUNT":
|
||||
promotionMoney = promotionResultServices.result_GOODS_DISCOUNT(parameters, item, promotionInfo);
|
||||
break;
|
||||
//指定商品一口价
|
||||
case "GOODS_ONE_PRICE":
|
||||
promotionMoney = promotionResultServices.result_GOODS_ONE_PRICE(parameters, item, promotionInfo);
|
||||
break;
|
||||
//指定商品每第几件减指定金额
|
||||
case "GOODS_HALF_PRICE": //todo 指定商品每第几件减指定金额
|
||||
promotionMoney = promotionResultServices.result_GOODS_HALF_PRICE(parameters, item, promotionInfo);
|
||||
break;
|
||||
default:
|
||||
promotionMoney = 0;
|
||||
break;
|
||||
}
|
||||
//productModel.price = Math.Round(productModel.price - promotionMoney, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//走全局优惠模式
|
||||
var promotions = await promotionServices.QueryListByClauseAsync(p => p.isEnable == true && p.startTime < dt && p.endTime > dt && p.type == (int)GlobalEnumVars.PromotionType.Promotion && p.isDel == false, p => p.sort, OrderByType.Asc, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//获取活动数量===================================================================================
|
||||
var stock = 0;
|
||||
var isMaxPinTuanGoodsNums = false;
|
||||
var buyPinTuanCount = 0;
|
||||
var isMaxGroupOrSeckillGoodsNums = false;
|
||||
var buyPromotionCount = 0;
|
||||
if (type == "pinTuan")
|
||||
{
|
||||
//把拼团的一些属性等加上
|
||||
var pinTuanRule = pinTuanRuleServices.QueryMuchFirst<CoreCmsPinTuanRule, CoreCmsPinTuanGoods, CoreCmsPinTuanRule>(
|
||||
(role, pinTuanGoods) => new object[] { JoinType.Inner, role.id == pinTuanGoods.ruleId }
|
||||
, (role, pinTuanGoods) => role
|
||||
, (role, pinTuanGoods) => pinTuanGoods.goodsId == good.id);
|
||||
//调整前台显示数量
|
||||
var checkOrder = orderServices.FindLimitOrderByGoodId(good.id, userId, pinTuanRule.startTime, pinTuanRule.endTime, (int)GlobalEnumVars.OrderType.PinTuan);
|
||||
if (pinTuanRule.maxGoodsNums != 0 && pinTuanRule.maxNums != 0)
|
||||
{
|
||||
isMaxPinTuanGoodsNums = true;
|
||||
//总剩余可购买总数量
|
||||
var residue = pinTuanRule.maxGoodsNums - checkOrder.TotalOrders;
|
||||
//用户剩余可购买数量
|
||||
var userResidue = pinTuanRule.maxGoodsNums - checkOrder.TotalUserOrders;
|
||||
//求最小匹配
|
||||
stock = userResidue > residue ? residue : userResidue;
|
||||
}
|
||||
else if (pinTuanRule.maxNums != 0 && pinTuanRule.maxNums == 0)
|
||||
{
|
||||
//限制个人最多购买数量
|
||||
stock = pinTuanRule.maxNums - checkOrder.TotalUserOrders == 0 ? 0 : pinTuanRule.maxNums - checkOrder.TotalUserOrders;
|
||||
}
|
||||
else if (pinTuanRule.maxNums == 0 && pinTuanRule.maxNums != 0)
|
||||
{
|
||||
//限制最大购买总数
|
||||
stock = pinTuanRule.maxGoodsNums - checkOrder.TotalOrders == 0 ? 0 : pinTuanRule.maxGoodsNums - checkOrder.TotalOrders;
|
||||
}
|
||||
buyPinTuanCount = checkOrder.TotalOrders;
|
||||
}
|
||||
else if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant())
|
||||
{
|
||||
if (!IsInGroup(good.id, out var groupModel, groupId))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var orderType = type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant()
|
||||
? (int)GlobalEnumVars.OrderType.Group
|
||||
: (int)GlobalEnumVars.OrderType.Seckill;
|
||||
|
||||
//调整前台显示数量
|
||||
var checkOrder = orderServices.FindLimitOrderByGoodId(good.id, userId, groupModel.startTime, groupModel.endTime, orderType);
|
||||
if (groupModel.maxGoodsNums != 0 && groupModel.maxNums != 0)
|
||||
{
|
||||
isMaxGroupOrSeckillGoodsNums = true;
|
||||
//总剩余可购买总数量
|
||||
var residue = groupModel.maxGoodsNums - checkOrder.TotalOrders;
|
||||
//用户剩余可购买数量
|
||||
var userResidue = groupModel.maxGoodsNums - checkOrder.TotalUserOrders;
|
||||
//求最小匹配
|
||||
stock = userResidue > residue ? residue : userResidue;
|
||||
}
|
||||
else if (groupModel.maxNums != 0 && groupModel.maxNums == 0)
|
||||
{
|
||||
isMaxGroupOrSeckillGoodsNums = true;
|
||||
//限制个人最多购买数量
|
||||
stock = groupModel.maxNums - checkOrder.TotalUserOrders;
|
||||
}
|
||||
else if (groupModel.maxNums == 0 && groupModel.maxNums != 0)
|
||||
{
|
||||
isMaxGroupOrSeckillGoodsNums = true;
|
||||
//限制最大购买总数
|
||||
stock = groupModel.maxGoodsNums - checkOrder.TotalOrders;
|
||||
}
|
||||
buyPromotionCount = checkOrder.TotalOrders;
|
||||
}
|
||||
|
||||
|
||||
//sku前端json组合实体===================================================================================
|
||||
CoreCmsProductsView result;
|
||||
//如果是多规格商品,算多规格
|
||||
if (good.openSpec == 1 && !string.IsNullOrEmpty(good.spesDesc))
|
||||
{
|
||||
// 1910&&电线型号:1.5mm²|1911&&电线型号:2.5mm²|1912&&电线型号:4mm²|1913&&电线型号:6mm²|1901&&电线颜色:红色|1902&&电线颜色:蓝色|1903&&电线颜色:黄色|1904&&电线颜色:绿色|1905&&电线颜色:双色
|
||||
// 电线型号:1.5mm²,电线颜色:蓝色
|
||||
var defaultSpec = new Dictionary<string, List<string>>();
|
||||
foreach (var item in good.spesDesc.Split("|"))
|
||||
{
|
||||
//1911&&电线型号:2.5mm²
|
||||
var temp = item.Split(".")[1].Split(":");
|
||||
var name = temp[0];
|
||||
var value = temp[1];
|
||||
if (!defaultSpec.ContainsKey(name))
|
||||
{
|
||||
defaultSpec.Add(name, new List<string>());
|
||||
}
|
||||
defaultSpec[name].Add(value);
|
||||
}
|
||||
result = new CoreCmsProductsView();
|
||||
result._id = product.id.ToString();
|
||||
result.name = product.name;
|
||||
result.goods_thumb = product.images;
|
||||
result.buyPinTuanCount = buyPinTuanCount;
|
||||
result.buyPromotionCount = buyPromotionCount;
|
||||
|
||||
var skuList = new List<Product_Sku_listItem>();
|
||||
products.ForEach(o =>
|
||||
{
|
||||
var item = new Product_Sku_listItem();
|
||||
item._id = o.id.ToString();
|
||||
item.goods_id = good.id.ToString();
|
||||
item.goods_name = good.name;
|
||||
item.image = o.images;
|
||||
item.price = o.price - gradePrice; //减去会员等级价格
|
||||
item.sku_name_arr = o.spesDesc.Split(",").Select(s => s.Split(":")[1]).ToList();
|
||||
item.stock = o.stock;
|
||||
if (type == GlobalEnumVars.OrderType.PinTuan.ToString().ToLowerInvariant())
|
||||
{
|
||||
if (isMaxPinTuanGoodsNums)
|
||||
{
|
||||
item.stock = stock;
|
||||
}
|
||||
}
|
||||
else if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant())
|
||||
{
|
||||
if (isMaxGroupOrSeckillGoodsNums)
|
||||
{
|
||||
item.stock = stock;
|
||||
}
|
||||
}
|
||||
skuList.Add(item);
|
||||
});
|
||||
|
||||
result.sku_list = skuList;
|
||||
|
||||
result.spec_list = defaultSpec.Select(d => new Product_Spec_listItem()
|
||||
{
|
||||
name = d.Key,
|
||||
list = d.Value.Select(s => new Product_Sku_list
|
||||
{
|
||||
name = s
|
||||
}).ToList(),
|
||||
}).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
result = new CoreCmsProductsView();
|
||||
result._id = product.id.ToString();
|
||||
result.name = product.name;
|
||||
result.goods_thumb = product.images;
|
||||
result.buyPinTuanCount = buyPinTuanCount;
|
||||
result.buyPromotionCount = buyPromotionCount;
|
||||
|
||||
var skuList = new List<Product_Sku_listItem>();
|
||||
products.ForEach(o =>
|
||||
{
|
||||
var item = new Product_Sku_listItem();
|
||||
item._id = o.id.ToString();
|
||||
item.goods_id = good.id.ToString();
|
||||
item.goods_name = good.name;
|
||||
item.image = o.images;
|
||||
item.price = o.price - gradePrice; //减去会员等级价格
|
||||
item.sku_name_arr = new List<string> { "商品信息", product.name };
|
||||
item.stock = o.stock;
|
||||
if (type == GlobalEnumVars.OrderType.PinTuan.ToString().ToLowerInvariant())
|
||||
{
|
||||
if (isMaxPinTuanGoodsNums)
|
||||
{
|
||||
item.stock = stock;
|
||||
}
|
||||
}
|
||||
else if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant())
|
||||
{
|
||||
if (isMaxGroupOrSeckillGoodsNums)
|
||||
{
|
||||
item.stock = stock;
|
||||
}
|
||||
}
|
||||
|
||||
skuList.Add(item);
|
||||
});
|
||||
result.sku_list = skuList;
|
||||
result.spec_list = new List<Product_Spec_listItem>() {
|
||||
new Product_Spec_listItem(){
|
||||
list = new List<Product_Sku_list>{
|
||||
new Product_Sku_list{
|
||||
name = product.name
|
||||
}
|
||||
},
|
||||
name = "商品信息"
|
||||
}
|
||||
};
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取随机推荐数据
|
||||
|
||||
@@ -573,7 +907,6 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取数据总数
|
||||
/// <summary>
|
||||
/// 获取数据总数
|
||||
@@ -599,7 +932,7 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsGoods>> QueryPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate,
|
||||
public async Task<IPageList<CoreCmsGoods>> QueryPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoods, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
@@ -607,7 +940,6 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 重写根据条件查询一定数量数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询一定数量数据
|
||||
@@ -618,14 +950,13 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="orderByType">排序顺序</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<List<CoreCmsGoods>> QueryListByClauseAsync(Expression<Func<CoreCmsGoods, bool>> predicate, int take,
|
||||
public async Task<List<CoreCmsGoods>> QueryListByClauseAsync(Expression<Func<CoreCmsGoods, bool>> predicate, int take,
|
||||
Expression<Func<CoreCmsGoods, object>> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryListByClauseAsync(predicate, take, orderByPredicate, orderByType, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 重写根据条件查询数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询数据
|
||||
@@ -634,7 +965,7 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="orderBy">排序字段,如name asc,age desc</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns>泛型实体集合</returns>
|
||||
public new async Task<List<CoreCmsGoods>> QueryListByClauseAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
public async Task<List<CoreCmsGoods>> QueryListByClauseAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryListByClauseAsync(predicate, orderBy, blUseNoLock);
|
||||
@@ -651,7 +982,7 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsGoods>> QueryPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
public async Task<IPageList<CoreCmsGoods>> QueryPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
|
||||
|
||||
@@ -64,11 +64,11 @@ namespace CoreCms.Net.Services
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
|
||||
@@ -16,7 +16,6 @@ using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
|
||||
@@ -208,7 +208,7 @@ namespace CoreCms.Net.Services
|
||||
|
||||
var cartModel = new CartDto();
|
||||
|
||||
if (type == "group" || type == "skill")
|
||||
if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant())
|
||||
{
|
||||
//团购秒杀默认时间过期后,不可以下单
|
||||
var dt = DateTime.Now;
|
||||
@@ -249,7 +249,7 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
|
||||
//获取活动数量
|
||||
if (type == "pinTuan")
|
||||
if (type == GlobalEnumVars.OrderType.PinTuan.ToString().ToLowerInvariant())
|
||||
{
|
||||
//把拼团的一些属性等加上
|
||||
var pinTuanRule = pinTuanRuleServices.QueryMuchFirst<CoreCmsPinTuanRule, CoreCmsPinTuanGoods, CoreCmsPinTuanRule>(
|
||||
@@ -274,7 +274,7 @@ namespace CoreCms.Net.Services
|
||||
productModel.buyPinTuanCount = checkOrder.TotalOrders;
|
||||
}
|
||||
}
|
||||
else if (type == "group" || type == "skill")
|
||||
if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant())
|
||||
{
|
||||
if (!goodsServices.IsInGroup(productModel.goodsId, out var groupModel, groupId))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user