/*********************************************************************** * Project: baifenBinfa * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * Description: 暂无 ***********************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Configuration; using CoreCms.Net.DTO; 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.DTO; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using NetTaste; 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) { //如果当前这个条件满足,并且它排他(意思就是它可以了,别的就不要来了。) var isSatisfy = await SetPromotion(item, cart); if (item.isExclusive == true && isSatisfy) 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, p => p.id, OrderByType.Asc, true, true); 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> GetGroupListForPages(int[] promotionIds) { using var container = _serviceProvider.CreateScope(); var goodsServices = container.ServiceProvider.GetService(); var dtoData = new List(); var promotions = await _dal.QueryListByClauseAsync(p => p.isEnable == true && p.isDel == false && promotionIds.Contains(p.id), promotionIds.Length, p => p.id, OrderByType.Desc, 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; if (dto.startStatus == (int)GlobalEnumVars.GroupSeckillStatus.Upcoming) { var ts = item.startTime.Subtract(dtNow); dto.timestamp = (int)ts.TotalSeconds; } else if (dto.startStatus == (int)GlobalEnumVars.GroupSeckillStatus.InProgress) { var ts = item.endTime.Subtract(dtNow); dto.timestamp = (int)ts.TotalSeconds; } else if (dto.startStatus == (int)GlobalEnumVars.GroupSeckillStatus.Finished) { dto.timestamp = 0; } } } 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 获取团购列表数据(根据类型获取当前可用) /// /// 获取团购列表数据(根据类型获取当前可用) /// /// public async Task GetGroupList(int type, int status, int pageIndex, int pageSize) { using var container = _serviceProvider.CreateScope(); var goodsServices = container.ServiceProvider.GetService(); var orderServices = container.ServiceProvider.GetService(); var jm = new WebApiCallBack { status = true }; var where = PredicateBuilder.True(); where = where.And(p => p.isEnable == true && p.isDel == false && p.type == type); 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 promotions = await _dal.QueryPageAsync(where, p => p.endTime, OrderByType.Desc, pageIndex, pageSize, true, true, 60); var dtoData = new List(); 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; dto.startStatus = status; 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; TimeSpan ts = item.endTime.Subtract(dtNow); 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); } } jm.data = new { promotions.TotalCount, promotions.TotalPages, list = dtoData, pageIndex, pageSize }; return jm; } #endregion #region 获取团购/秒杀商品详情 /// /// 获取团购/秒杀商品详情 /// /// public async Task GetGroupDetail(int groupId, int userId, int type, bool needSku) { using var container = _serviceProvider.CreateScope(); var goodsServices = container.ServiceProvider.GetService(); var orderServices = container.ServiceProvider.GetService(); var jm = new WebApiCallBack() { msg = "关键参数丢失" }; if (groupId == 0) { return jm; } var promotion = await _dal.QueryByClauseAsync(p => p.isDel == false && p.isEnable == true && p.id == groupId, true, true); if (promotion == null) { jm.msg = "无此活动"; jm.otherData = groupId; return jm; } var goodId = 0; var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == groupId, true, true); if (condition != null) { var obj = (JObject)JsonConvert.DeserializeObject(condition.parameters); if (obj.ContainsKey("goodsId") && obj["goodsId"].ObjectToInt(0) > 0) { goodId = obj["goodsId"].ObjectToInt(0); } } if (goodId == 0) { jm.msg = "未提交商品信息"; jm.otherData = groupId; return jm; } string typeStr = type == (int)GlobalEnumVars.PromotionType.Group ? GlobalEnumVars.PromotionType.Group.ToString().ToLowerInvariant() : GlobalEnumVars.PromotionType.Seckill.ToString().ToLowerInvariant(); var goods = await goodsServices.GetGoodsDetail(goodId, userId, true, typeStr, groupId, needSku); if (goods == null) { jm.msg = "商品不存在"; return jm; } if (goods.isMarketable == false) { jm.msg = "商品已下架"; return jm; } //调整前台显示数量 var checkOrder = orderServices.FindLimitOrder(goods.product.id, userId, promotion.startTime, promotion.endTime, promotion.type); //如果最大为设置值 if (promotion.maxGoodsNums > 0) { //最多只能买这么多 goods.stock = promotion.maxGoodsNums; //然后实际能买的要减去以前买的 goods.product.stock = checkOrder.TotalOrders - promotion.maxGoodsNums >= 0 ? 0 : promotion.maxGoodsNums - checkOrder.TotalOrders; } //如果设置了限购数量 if (promotion.maxNums > 0) { //最多只能买这么多 goods.stock = promotion.maxNums; //实际可购买数量为:实际消费数量-最大可消费数量,如果大于或者等于,就不能买了。库存为0,或最大购买数减去已经购买数 goods.product.stock = checkOrder.TotalOrders - promotion.maxNums >= 0 ? 0 : promotion.maxNums - checkOrder.TotalOrders; } 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; //获取规则结果集 decimal promotionAmount = 0; var result = await _promotionResultServices.QueryByClauseAsync(p => p.promotionId == promotion.id); if (result != null) { JObject resultParameters = (JObject)JsonConvert.DeserializeObject(result.parameters); var cartProducts = new CartProducts() { nums = 1, products = new CoreCmsProducts() { price = goods.product.price, amount = goods.product.price, } }; switch (result.code) { //指定商品减固定金额 case "GOODS_REDUCE": promotionAmount = _promotionResultServices.result_GOODS_REDUCE(resultParameters, cartProducts, promotion); goods.groupPromotionResult = "指定商品减少固定金额:减" + resultParameters["money"].ObjectToString() + "元 "; break; //指定商品打X折 case "GOODS_DISCOUNT": promotionAmount = _promotionResultServices.result_GOODS_DISCOUNT(resultParameters, cartProducts, promotion); goods.groupPromotionResult = "指定商品打折:打" + resultParameters["discount"].ObjectToString() + "折 "; break; //指定商品一口价 case "GOODS_ONE_PRICE": promotionAmount = _promotionResultServices.result_GOODS_ONE_PRICE(resultParameters, cartProducts, promotion); goods.groupPromotionResult = "指定商品一口价:" + resultParameters["money"].ObjectToString() + "元 "; break; //指定商品每第几件减指定金额 case "GOODS_HALF_PRICE": //这个条件不在列表做处理 promotionAmount = 0; goods.groupPromotionResult = "指定商品每第" + resultParameters["num"].ObjectToString() + "件减少" + resultParameters["money"].ObjectToString() + "元"; break; case "ORDER_REDUCE": goods.groupPromotionResult = "订单减" + resultParameters["money"].ObjectToString() + "元 "; break; case "ORDER_DISCOUNT": goods.groupPromotionResult = "订单打" + resultParameters["discount"].ObjectToString() + "折 "; break; } foreach (var item in goods.skuList.sku_list) { switch (result.code) { //指定商品减固定金额 case "GOODS_REDUCE": var reoucePrice = resultParameters["money"].ObjectToDecimal(0); item.price = Math.Round(item.price - reoucePrice, 2); break; //指定商品打X折 case "GOODS_DISCOUNT": var objDiscount = resultParameters["discount"].ObjectToDecimal(0); item.price = Math.Round(Math.Round(Math.Round(item.price * objDiscount, 3) * 10, 2) / 100, 2); break; //指定商品一口价 case "GOODS_ONE_PRICE": var newPrice = resultParameters["money"].ObjectToDecimal(0); item.price = Math.Round(newPrice, 2); break; default: item.price = Math.Round(item.price - promotionAmount, 2); break; } } } if (promotionAmount > 0) { goods.product.price = Math.Round(goods.product.price - promotionAmount, 2); } //进行促销后要更换原销售价替换原市场价 //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.sort, OrderByType.Asc, 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.sort, OrderByType.Asc, 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 dt = DateTime.Now; var where = PredicateBuilder.True(); where = where.And(p => p.endTime > dt); //判断优惠券失效时间 是否可领取 //where = where.And(p => p.startTime < dt); 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.endTime < dt || info.startTime > dt) { jm.status = false; jm.msg = "请在领取时间范围内领取"; return jm; } if (info.maxRecevieNums == 0) { jm.status = true; 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 #region 获取全局促销列表 /// /// 获取全局促销列表 /// /// public async Task> GetPromotionList(int type = (int)GlobalEnumVars.PromotionType.Promotion) { var where = PredicateBuilder.True(); var dt = DateTime.Now; where = where.And(p => p.startTime < dt); //判断优惠券失效时间 是否可领取 where = where.And(p => p.endTime > dt); //判断优惠券失效时间 是否可领取 where = where.And(p => p.isEnable); //启用状态 where = where.And(p => p.type == type); //促销类型 where = where.And(p => !p.isDel); //是否被删除 var data = await _dal.QueryPageAndChildsAsync(where, p => p.sort, OrderByType.Asc, true, 1, 1000); if (data != null && data.Any()) { var goodsServices = _serviceProvider.GetService(); var goodsCategoryServices = _serviceProvider.GetService(); var brandServices = _serviceProvider.GetService(); var userGradeServices = _serviceProvider.GetService(); foreach (var item in data) { foreach (var condition in item.promotionCondition) { var obj = (JObject)JsonConvert.DeserializeObject(condition.parameters); var str = string.Empty; if (condition.code == "GOODS_ALL") { str = "购买任意商品:只要购买任意产品即可;"; } //购买指定商品 else if (condition.code == "GOODS_IDS") { var goodsId = obj["goodsId"].ObjectToString(); if (!string.IsNullOrEmpty(goodsId)) { str = "购买指定商品:"; var ids = goodsId.Split(",").Select(p => p.ObjectToInt()).ToList(); var goods = await goodsServices.QueryListByClauseAsync(p => ids.Contains(p.id), p => p.id, OrderByType.Asc, true); if (goods.Any()) { var goodsName = goods.Select(p => p.name = "【" + p.name + "】").ToList(); str += string.Join(",", goodsName); } str += ";购买数量:" + obj["nums"].ObjectToString(); } } //购买指定商品分类 else if (condition.code == "GOODS_CATS") { var id = obj["catId"].ObjectToInt(0); if (id > 0) { str = "购买指定分类商品:"; var goodCache = await goodsCategoryServices.GetCaChe(); var goodsCategory = goodCache.FirstOrDefault(p => p.id == id); str += goodsCategory != null ? "【" + goodsCategory.name + "】" : ""; str += ";购买数量:" + obj["nums"].ObjectToString(); } } //购买指定品牌商品 else if (condition.code == "GOODS_BRANDS") { var id = obj["brandId"].ObjectToInt(0); if (id > 0) { str = "购买指定品牌商品:"; var brandCache = await brandServices.QueryAsync(true, true); var brand = brandCache.FirstOrDefault(p => p.id == id); str += brand != null ? "【" + brand.name + "】" : ""; str += ";购买数量:" + obj["nums"].ObjectToString(); } } //用户符合指定等级 else if (condition.code == "USER_GRADE") { var gradesId = obj["grades"].ObjectToString(); if (!string.IsNullOrEmpty(gradesId)) { str = "用户符合指定等级:"; var ids = gradesId.Split(",").Select(p => p.ObjectToInt()).ToList(); var userGradesCache = await userGradeServices.QueryAsync(true, true); var userGrades = userGradesCache.Where(p => ids.Contains(p.id)); if (userGrades.Any()) { var goodsName = userGrades.Select(p => p.title = "【" + p.title + "】").ToList(); str += string.Join(",", goodsName); } } } else if (condition.code == "ORDER_FULL") { str = obj != null ? "购买订单满" + obj["money"].ObjectToString() + "元 " : ""; } if (!string.IsNullOrEmpty(str)) { item.conditions.Add(str); } } foreach (var result in item.promotionResult) { //var str = PromotionHelper.GetResultMsg(result.code, result.parameters); var msg = string.Empty; var obj = (JObject)JsonConvert.DeserializeObject(result.parameters); switch (result.code) { case "GOODS_REDUCE": msg = "指定商品减少固定金额:减" + obj["money"].ObjectToString() + "元 "; break; case "GOODS_DISCOUNT": msg = "指定商品打折:打" + obj["discount"].ObjectToString() + "折 "; break; case "GOODS_ONE_PRICE": msg = "指定商品一口价:" + obj["money"].ObjectToString() + "元 "; break; case "ORDER_REDUCE": msg = "订单减" + obj["money"].ObjectToString() + "元 "; break; case "ORDER_DISCOUNT": msg = "订单打" + obj["discount"].ObjectToString() + "折 "; break; case "GOODS_HALF_PRICE": msg = "指定商品每第" + obj["num"].ObjectToString() + "件减少" + obj["money"].ObjectToString() + "元"; break; } item.results.Add(msg); } } } var list = new List(); if (data.Any()) { foreach (var item in data) { var dto = new GetPromotionResult(); 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; dto.conditions = item.conditions; dto.results = item.results; list.Add(dto); } } return list; } #endregion } }