/***********************************************************************
* 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.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CoreCms.Net.Services
{
///
/// 促销条件表 接口实现
///
public class CoreCmsPromotionConditionServices : BaseServices, ICoreCmsPromotionConditionServices
{
private readonly ICoreCmsPromotionConditionRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices;
private readonly IServiceProvider _serviceProvider;
public CoreCmsPromotionConditionServices(IUnitOfWork unitOfWork
, ICoreCmsPromotionConditionRepository dal
, ICoreCmsGoodsCategoryServices goodsCategoryServices
, IServiceProvider serviceProvider
)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_goodsCategoryServices = goodsCategoryServices;
_serviceProvider = serviceProvider;
}
///
/// 检查是否满足条件
///
///
///
///
///
public async Task check(CoreCmsPromotionCondition conditionInfo, CartDto cart,
CoreCmsPromotion promotionInfo)
{
if (string.IsNullOrEmpty(conditionInfo.parameters)) return false;
var getPromotionConditionType = SystemSettingDictionary.GetPromotionConditionType();
var codeModel = getPromotionConditionType.Find(p => p.sKey == conditionInfo.code);
if (codeModel != null)
{
//如果是订单促销就直接去判断促销条件,如果是商品促销,就循环订单明细
JObject parameters = (JObject)JsonConvert.DeserializeObject(conditionInfo.parameters);
if (codeModel.sValue == "goods")
{
var key = false;
foreach (var item in cart.list)
{
var type = 0;
//判断是哪个规则,并且确认是否符合
switch (conditionInfo.code)
{
case "GOODS_ALL":
type = condition_GOODS_ALL(parameters,
(int)item.products.goodsId, item.nums);
break;
case "GOODS_IDS":
type = condition_GoodsIdS(parameters,
(int)item.products.goodsId, item.nums);
break;
case "GOODS_CATS":
type = await condition_GOODS_CATS(parameters, (int)item.products.goodsId, item.nums);
break;
case "GOODS_BRANDS":
type = await condition_GOODS_BRANDS(parameters,
(int)item.products.goodsId, item.nums);
break;
default:
type = 0;
break;
}
if (type > 0)
{
if (item.products.promotionList.ContainsKey(promotionInfo.id))
{
item.products.promotionList[promotionInfo.id].name = promotionInfo.name;
item.products.promotionList[promotionInfo.id].type = type;
}
else
{
item.products.promotionList.Add(promotionInfo.id, new WxNameTypeDto()
{
name = promotionInfo.name,
type = type
});
}
}
//只有选中的商品才算促销
if (item.isSelect)
{
if (!key)
{
if (type == 2)
{
key = true;//针对某一条商品促销条件,循环购物车的所有商品,只要有一条满足要求就,算,就返回true
}
}
}
}
return key;
}
else if (codeModel.sValue == "order")
{
var type = condition_ORDER_FULL(parameters, cart);
if (type > 0)
{
if (cart.promotionList.ContainsKey(promotionInfo.id))
{
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
cart.promotionList[promotionInfo.id].type = type;
}
//else
//{
// cart.promotionList.Add(type, new WxNameTypeDto()
// {
// name = promotionInfo.name,
// type = type
// });
//}
}
if (type == 2)
{
return true;
}
else
{
return false;
}
}
else if (codeModel.sValue == "user")
{
var type = await condition_USER_GRADE(parameters, cart.userId);
if (type == 2)
{
return true;
}
else
{
return false;
}
}
}
return false;
}
///
/// 在促销结果中,如果是商品促销结果,调用此方法,判断商品是否符合需求
///
///
///
///
///
public async Task goods_check(int promotionId, int goodsId, int nums = 1)
{
var conditionInfos = await _dal.QueryListByClauseAsync(p => p.promotionId == promotionId);
var getPromotionConditionType = SystemSettingDictionary.GetPromotionConditionType();
foreach (var item in conditionInfos)
{
var codeModel = getPromotionConditionType.Find(p => p.sKey == item.code);
if (codeModel != null && codeModel.sValue == "goods")
{
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
var type = 0;
//判断是哪个规则,并且确认是否符合
switch (item.code)
{
case "GOODS_ALL":
type = condition_GOODS_ALL(parameters, goodsId, nums);
break;
case "GOODS_IDS":
type = condition_GoodsIdS(parameters, goodsId, nums);
break;
case "GOODS_CATS":
type = await condition_GOODS_CATS(parameters, goodsId, nums);
break;
case "GOODS_BRANDS":
type = await condition_GOODS_BRANDS(parameters, goodsId, nums);
break;
default:
type = 0;
break;
}
if (type != 2)
{
return type;
}
}
}
return 2;
}
///
/// 因为计算过促销条件后啊,前面有些是满足条件的,所以,他们的type是2,后面有不满足条件的时候呢,要把前面满足条件的回滚成不满足条件的
///
///
///
///
public CartDto PromotionFalse(CartDto cart, CoreCmsPromotion promotionInfo)
{
switch (promotionInfo.type)
{
case (int)GlobalEnumVars.PromotionType.Promotion:
//订单促销回滚
if (cart.promotionList.ContainsKey(promotionInfo.id))
{
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
cart.promotionList[promotionInfo.id].type = 1;
}
//商品回滚
foreach (var item in cart.list.Where(item => item.products.promotionList.ContainsKey(promotionInfo.id)))
{
item.products.promotionList[promotionInfo.id].name = promotionInfo.name;
item.products.promotionList[promotionInfo.id].type = 1;
}
break;
}
return cart;
}
///
/// 订单满XX金额时满足条件
///
/// 参数对象
///
///
public int condition_ORDER_FULL(JObject parameters, CartDto cart)
{
if (!parameters.ContainsKey("money")) return 1;
var objMoney = Convert.ToDecimal(parameters["money"]);
return cart.amount >= objMoney ? 2 : 1;
}
///
/// 所有商品满足条件
///
/// 参数对象
/// 商品序列
/// 数量
///
public int condition_GOODS_ALL(JObject parameters, int goodsId, int nums)
{
return 2;
}
///
/// 指定某些商品满足条件
///
/// 参数对象
/// 商品序列
/// 数量
///
public int condition_GoodsIdS(JObject parameters, int goodsId, int nums)
{
if (!parameters.ContainsKey("goodsId") || !parameters.ContainsKey("nums")) return 0;
var objNums = Convert.ToInt32(parameters["nums"]);
var goodsIds = CommonHelper.StringToIntArray(parameters["goodsId"].ObjectToString());
return goodsIds.Any() && goodsIds.Contains(goodsId) ? nums >= objNums ? 2 : 1 : 0;
}
///
/// 指定商品分类满足条件
///
/// 参数对象
/// 商品序列
/// 数量
///
public async Task condition_GOODS_CATS(JObject parameters, int goodsId, int nums)
{
using (var container = _serviceProvider.CreateScope())
{
var goodsServices = container.ServiceProvider.GetService();
if (!parameters.ContainsKey("catId") || !parameters.ContainsKey("nums")) return 0;
var objCatId = parameters["catId"].ObjectToInt();
var objNums = parameters["nums"].ObjectToInt();
var goodsModel = await goodsServices.QueryByIdAsync(goodsId);
if (goodsModel == null)
{
return 0;
}
return await _goodsCategoryServices.IsChild(objCatId, goodsModel.goodsCategoryId)
? nums >= objNums ? 2 : 1
: 0;
}
}
///
/// 指定商品品牌满足条件
///
/// 参数对象
/// 商品序列
/// 数量
///
public async Task condition_GOODS_BRANDS(JObject parameters, int goodsId, int nums)
{
using (var container = _serviceProvider.CreateScope())
{
var goodsServices = container.ServiceProvider.GetService();
if (!parameters.ContainsKey("brandId") || !parameters.ContainsKey("nums")) return 0;
var objBrandId = parameters["brandId"].ObjectToInt(0);
var objNums = parameters["nums"].ObjectToInt(0);
var goodsModel = await goodsServices.QueryByIdAsync(goodsId);
if (goodsModel == null)
{
return 0;
}
return goodsModel.brandId == objBrandId ? nums >= objNums ? 2 : 1 : 0;
}
}
///
/// 指定用户等级满足条件
///
/// 参数对象
/// 用户序列
///
public async Task condition_USER_GRADE(JObject parameters, int userId)
{
using (var container = _serviceProvider.CreateScope())
{
var userServices = container.ServiceProvider.GetService();
if (!parameters.ContainsKey("grades")) return 0;
var userInfo = await userServices.QueryByIdAsync(userId);
if (userInfo == null)
{
return 0;
}
var arr = CommonHelper.StringToIntArray(parameters["grades"].ObjectToString());
if (arr.Contains(userInfo.grade))
{
return 2;
}
return 0;
}
}
}
}