/*********************************************************************** * Project: CoreCms * ProjectName: 核心内容管理系统 * Web: https://www.corecms.net * Author: 大灰灰 * Email: jianweie@163.com * CreateTime: 2021/1/31 21:45:10 * Description: 暂无 ***********************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Configuration; using CoreCms.Net.IRepository; using CoreCms.Net.IRepository.UnitOfWork; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.Entities.Expression; using CoreCms.Net.Model.ViewModels.Basics; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Model.ViewModels.DTO; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; namespace CoreCms.Net.Services { /// /// 促销表 接口实现 /// public class CoreCmsPromotionServices : BaseServices, ICoreCmsPromotionServices { private readonly ICoreCmsPromotionRepository _dal; private readonly IUnitOfWork _unitOfWork; private readonly ICoreCmsPromotionConditionServices _promotionConditionServices; private readonly ICoreCmsPromotionResultServices _promotionResultServices; private readonly IServiceProvider _serviceProvider; private readonly ICoreCmsCouponServices _couponServices; public CoreCmsPromotionServices(IUnitOfWork unitOfWork , ICoreCmsPromotionRepository dal , ICoreCmsPromotionConditionServices promotionConditionServices , ICoreCmsPromotionResultServices promotionResultServices , IServiceProvider serviceProvider, ICoreCmsCouponServices couponServices) { this._dal = dal; base.BaseDal = dal; _unitOfWork = unitOfWork; _promotionConditionServices = promotionConditionServices; _promotionResultServices = promotionResultServices; _serviceProvider = serviceProvider; _couponServices = couponServices; } #region 购物车的数据传过来,然后去算促销================ /// /// 购物车的数据传过来,然后去算促销 /// /// /// /// public async Task ToPromotion(CartDto cart, int type = (int)GlobalEnumVars.PromotionType.Promotion) { //团购秒杀不会走到这里,团购秒杀直接调用setPromotion方法 if (type == (int)GlobalEnumVars.PromotionType.Group || type == (int)GlobalEnumVars.PromotionType.Seckill) { return cart; } //按照权重取所有已生效的促销列表 var dt = DateTime.Now; var promotions = await _dal.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); foreach (var item in promotions) { await SetPromotion(item, cart); if (item.isExclusive == true) break; } return cart; } #endregion #region 购物车的数据传过来,然后去算优惠券 /// /// 购物车的数据传过来,然后去算优惠券 /// /// /// /// public async Task ToCoupon(CartDto cart, List promotions) { var jm = new WebApiCallBack(); foreach (var item in promotions) { if (item == null) { jm.data = 15014; jm.msg = GlobalErrorCodeVars.Code15014; return jm; } var bl = await SetPromotion(item, cart); if (bl) { cart.coupon.Add(item.name); } else { jm.data = 15014; jm.msg = GlobalErrorCodeVars.Code15014; return jm; } } jm.status = true; jm.data = cart; return jm; } #endregion #region 根据促销信息,去计算购物车的促销情况 /// /// 根据促销信息,去计算购物车的促销情况 /// /// /// /// public async Task SetPromotion(CoreCmsPromotion promotion, CartDto cartModel) { var promotionConditions = await _promotionConditionServices.QueryListByClauseAsync(p => p.promotionId == promotion.id); //循环取出所有的促销条件,有一条不满足,就不行,就返回false var key = true; foreach (var item in promotionConditions) { var res = await _promotionConditionServices.check(item, cartModel, promotion); if (!key) continue; if (!res) { //多个促销条件中,如果有一个不满足,整体就不满足,但是为了显示完整的促销标签,还是要运算完所有的促销条件 key = false; } } if (key) { //走到这一步就说明所有的促销条件都符合,那么就去计算结果 var promotionResults = await _promotionResultServices.QueryListByClauseAsync(p => p.promotionId == promotion.id); foreach (var item in promotionResults) { await _promotionResultServices.toResult(item, cartModel, promotion); } } else { //如果不满足需求,就要统一标准,把有些满足条件的(2),变成1 _promotionConditionServices.PromotionFalse(cartModel, promotion); } return key; } #endregion #region 获取团购列表数据 /// /// 获取团购列表数据 /// /// public async Task GetGroupList(int type, int userId, int status, int pageIndex, int pageSize) { var jm = new WebApiCallBack { status = true }; var where = PredicateBuilder.True(); where = where.And(p => p.isEnable == true && p.isDel == false); if (type == (int)GlobalEnumVars.PromotionType.Group) { where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Group); } else if (type == (int)GlobalEnumVars.PromotionType.Seckill) { where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Seckill); } var dt = DateTime.Now; if (status == (int)GlobalEnumVars.GroupSeckillStatus.Upcoming) { where = where.And(p => p.startTime > dt); } else if (status == (int)GlobalEnumVars.GroupSeckillStatus.InProgress) { where = where.And(p => p.startTime < dt && dt < p.endTime); } else if (status == (int)GlobalEnumVars.GroupSeckillStatus.Finished) { where = where.And(p => p.endTime < dt); } var goods = new List(); var list = await _dal.QueryPageAsync(where, p => p.endTime, OrderByType.Desc, pageIndex, pageSize); if (list != null && list.Any()) { foreach (var item in list) { var promotionId = item.id; var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionId); if (condition != null && condition.parameters.Contains("goodsId")) { JObject parameters = (JObject)JsonConvert.DeserializeObject(condition.parameters); var res = await GetGroupDetail(parameters["goodsId"].ObjectToInt(0), userId, "group", item.id); if (res.status) { var good = res.data as CoreCmsGoods; good.groupId = item.id; good.groupType = item.type; good.groupStatus = item.isEnable; good.groupTime = DateTime.Now; good.groupStartTime = item.startTime; good.groupEndTime = item.endTime; TimeSpan ts = item.endTime.Subtract(dt); good.groupTimestamp = (int)ts.TotalSeconds; goods.Add(good); } else { item.expression1 = res.msg; } } } } jm.data = new { goods, list.TotalCount, list.TotalPages, list, pageIndex, pageSize }; return jm; } #endregion #region 获取团购/秒杀商品详情 /// /// 获取团购/秒杀商品详情 /// /// public async Task GetGroupDetail(int goodId = 0, int userId = 0, string type = "group", int groupId = 0) { using var container = _serviceProvider.CreateScope(); var goodsServices = container.ServiceProvider.GetService(); var orderServices = container.ServiceProvider.GetService(); var jm = new WebApiCallBack() { msg = "关键参数丢失" }; if (goodId == 0) { return jm; } //判断商品是否参加团购 var isInGroup = _dal.IsInGroup(goodId, out var promotionId); if (!isInGroup) { jm.msg = "商品未参加团购"; return jm; } var promotion = await _dal.QueryByClauseAsync(p => p.isDel == false && p.isEnable == true && p.id == promotionId); if (promotion == null) { jm.msg = "无此活动"; jm.otherData = promotionId; return jm; } var goods = new CoreCmsGoods(); goods = await goodsServices.GetGoodsDetial(goodId, userId, true, type, groupId); if (goods == null) { jm.msg = "商品不存在"; return jm; } if (goods.isMarketable == false) { jm.msg = "商品已下架"; return jm; } //调整前台显示数量 if (!string.IsNullOrEmpty(promotion.parameters)) { var extendParams = (JObject)JsonConvert.DeserializeObject(promotion.parameters); var checkOrder = orderServices.FindLimitOrder(goods.product.id, userId, promotion.startTime, promotion.endTime); if (extendParams != null && extendParams.ContainsKey("max_goods_nums") && extendParams["max_goods_nums"].ObjectToInt(0) != 0) { var maxGoodsNums = extendParams["max_goods_nums"].ObjectToInt(0); goods.stock = maxGoodsNums; //活动销售件数 goods.product.stock = maxGoodsNums - checkOrder.TotalOrders; goods.buyPromotionCount = checkOrder.TotalOrders; } else { goods.buyPromotionCount = checkOrder.TotalOrders; } } var dt = DateTime.Now; goods.groupId = promotion.id; goods.groupType = promotion.type; goods.groupStatus = promotion.isEnable; goods.groupTime = dt; goods.groupStartTime = promotion.startTime; goods.groupEndTime = promotion.endTime; TimeSpan ts = promotion.endTime.Subtract(dt); goods.groupTimestamp = (int)ts.TotalSeconds; //进行促销后要更换原销售价替换原市场价 var originPrice = Math.Round(goods.product.price + goods.product.promotionAmount, 2); goods.product.mktprice = originPrice; jm.status = true; jm.msg = "数据获取成功"; jm.data = goods; return jm; } #endregion #region 获取可领取的优惠券(不分页) /// /// 获取可领取的优惠券(不分页) /// /// 数量 /// public async Task> ReceiveCouponList(int limit = 3) { var where = PredicateBuilder.True(); where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取 where = where.And(p => p.isEnable == true); //启用状态 where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型 where = where.And(p => p.isAutoReceive == true); //自动领取状态 where = where.And(p => p.isDel == false); //是否被删除 var data = await _dal.QueryPageAndChildsAsync(where, p => p.id, OrderByType.Desc, false, 0, limit); if (data != null && data.Any()) { foreach (var item in data) { var expression1 = ""; var expression2 = ""; foreach (var condition in item.promotionCondition) { var str = PromotionHelper.GetConditionMsg(condition.code, condition.parameters); expression1 += str; item.conditions.Add(str); } foreach (var result in item.promotionResult) { var str = PromotionHelper.GetResultMsg(result.code, result.parameters); expression2 += str; item.results.Add(str); } item.expression1 = expression1; item.expression2 = expression2; } } return data.ToList(); } #endregion #region 获取可领取的优惠券(分页) /// /// 获取可领取的优惠券(分页) /// /// 页码 /// 数量 /// public async Task> GetReceiveCouponList(int page = 1, int limit = 10) { var where = PredicateBuilder.True(); where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取 where = where.And(p => p.isEnable == true); //启用状态 where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型 where = where.And(p => p.isAutoReceive == true); //自动领取状态 where = where.And(p => p.isDel == false); //是否被删除 var data = await _dal.QueryPageAndChildsAsync(where, p => p.id, OrderByType.Desc, true, page, limit); if (data != null && data.Any()) { foreach (var item in data) { var expression1 = ""; var expression2 = ""; foreach (var condition in item.promotionCondition) { var str = PromotionHelper.GetConditionMsg(condition.code, condition.parameters); expression1 += str; item.conditions.Add(str); } foreach (var result in item.promotionResult) { var str = PromotionHelper.GetResultMsg(result.code, result.parameters); expression2 += str; item.results.Add(str); } item.expression1 = expression1; item.expression2 = expression2; } } return data; } #endregion #region 获取指定id 的优惠券是否可以领取 /// /// 获取指定id 的优惠券是否可以领取 /// /// /// public async Task ReceiveCoupon(int promotionId) { var jm = new WebApiCallBack(); var where = PredicateBuilder.True(); where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取 where = where.And(p => p.isEnable == true); //启用状态 where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型 where = where.And(p => p.isAutoReceive == true); //自动领取状态 where = where.And(p => p.id == promotionId); where = where.And(p => p.isDel == false); //是否被删除 var info = await _dal.QueryByClauseAsync(where,false,true); if (info != null) { jm.data = info; //判断最大领取数量 if (info.maxRecevieNums == 0) { jm.status = false; return jm; } var receiveCount = await _couponServices.GetCountAsync(p => p.promotionId == promotionId); if (receiveCount >= info.maxRecevieNums) { jm.status = false; jm.msg = "该优惠券已被领完,请下次再来!"; return jm; } else { jm.status = true; jm.code = receiveCount; } } else { jm.msg = GlobalErrorCodeVars.Code15007; } return jm; } #endregion } }