/***********************************************************************
* 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
}
}