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