/*********************************************************************** * Project: baifenBinfa * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * Description: 暂无 ***********************************************************************/ using CoreCms.Net.IRepository; using CoreCms.Net.IRepository.UnitOfWork; using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.FromBody; using CoreCms.Net.Model.ViewModels.DTO; using CoreCms.Net.Utility.Helper; using Microsoft.Extensions.DependencyInjection; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using CoreCms.Net.Configuration; using CoreCms.Net.Model.ViewModels.Basics; using CoreCms.Net.Model.ViewModels.UI; namespace CoreCms.Net.Services { /// /// 货品表 接口实现 /// public class CoreCmsProductsServices : BaseServices, ICoreCmsProductsServices { private readonly ICoreCmsProductsRepository _dal; private readonly IUnitOfWork _unitOfWork; private readonly IServiceProvider _serviceProvider; public CoreCmsProductsServices(IUnitOfWork unitOfWork, ICoreCmsProductsRepository dal, IServiceProvider serviceProvider ) { this._dal = dal; base.BaseDal = dal; _unitOfWork = unitOfWork; _serviceProvider = serviceProvider; } /// /// 根据货品ID获取货品信息 /// /// 货品序列 /// 是否计算促销 /// 用户序列 /// 类型 /// /// public async Task GetProductInfo(int id, bool isPromotion, int userId, string type = "goods", int groupId = 0) { using var container = _serviceProvider.CreateScope(); var userGradeServices = container.ServiceProvider.GetService(); var promotionServices = container.ServiceProvider.GetService(); var orderServices = container.ServiceProvider.GetService(); var goodsServices = container.ServiceProvider.GetService(); var userServices = container.ServiceProvider.GetService(); var goodsGradeServices = container.ServiceProvider.GetService(); var pinTuanRuleServices = container.ServiceProvider.GetService(); //获取货品 var productModel = await _dal.QueryByClauseAsync(p => p.id == id); if (productModel == null) return null; //获取商品信息 var goods = await goodsServices.QueryByClauseAsync(p => p.id == productModel.goodsId && p.isDel == false && p.isMarketable == true); if (goods == null) return null; //DTO映射 productModel.bn = goods.bn; productModel.images = !string.IsNullOrEmpty(productModel.images) ? GoodsHelper.GetOneImage(productModel.images) : GoodsHelper.GetOneImage(goods.images); productModel.totalStock = Convert.ToInt32(productModel.stock); productModel.stock = GoodsHelper.GetStock(productModel.stock, productModel.freezeStock); productModel.name = goods.name; var price = productModel.price; var gradePrice = new List(); //获取价格体系 if (userId > 0) { //获取用户信息 var userInfo = await userServices.QueryByIdAsync(userId); if (userInfo != null) { var gradeInfo = await userGradeServices.QueryByIdAsync(userInfo.grade); if (gradeInfo != null) { productModel.gradeInfo = gradeInfo; } var goodsGrades = await goodsGradeServices.QueryListByClauseAsync(p => p.goodsId == goods.id); if (goodsGrades != null && goodsGrades.Count > 0) { var userGradeList = await userGradeServices.QueryAsync(); goodsGrades.ForEach(p => { var userGrades = userGradeList.Find(o => o.id == p.gradeId); p.gradeName = userGrades != null ? userGrades.title : ""; if (gradeInfo != null && gradeInfo.id == p.gradeId) { price = (productModel.price - p.gradePrice) > 0 ? productModel.price - p.gradePrice : 0; } p.gradePrice = (productModel.price - p.gradePrice) > 0 ? productModel.price - p.gradePrice : 0; }); } gradePrice = goodsGrades; } } productModel.gradePrice = gradePrice; productModel.price = price; //如果是多规格商品,算多规格 if (goods.openSpec == 1 && !string.IsNullOrEmpty(goods.spesDesc)) { var defaultSpec = new Dictionary>(); //一级拆分 var spesDescArr = goods.spesDesc.Split("|"); var productSpecDescArr = productModel.spesDesc.Split(","); foreach (var item in spesDescArr) { //小类拆分 var itemArr = item.Split("&&"); //键值对处理 var keyValue = itemArr[1].Split(":"); var defaultSpesDesc = new DefaultSpesDesc(); defaultSpesDesc.name = keyValue[1]; foreach (var childItem in productSpecDescArr) { if (childItem == itemArr[1]) { defaultSpesDesc.isDefault = true; } } if (defaultSpec.ContainsKey(keyValue[0])) { defaultSpec[keyValue[0]].Add(keyValue[1], defaultSpesDesc); } else { var a = new Dictionary { { keyValue[1], defaultSpesDesc } }; defaultSpec.Add(keyValue[0], a); } } //取其他货品信息 var otherProduts = await _dal.QueryListByClauseAsync(t => t.goodsId == goods.id && t.isDel == false && t.id != productModel.id); if (otherProduts.Any()) { foreach (var item in defaultSpec) { foreach (var childItem in item.Value) { //如果是默认选中的,跳出本次 if (childItem.Value.isDefault) continue; //当前主货品sku var tempProductSpesDesc = productSpecDescArr; //替换当前sku的当前值为当前遍历的值 for (var i = 0; i < tempProductSpesDesc.Length; i++) { if (tempProductSpesDesc[i].Contains(item.Key)) tempProductSpesDesc[i] = item.Key + ":" + childItem.Key; } //循环所有货品,找到对应的多规格 foreach (var o in otherProduts) { var otherProductSpesDesc = o.spesDesc.Split(","); if (!tempProductSpesDesc.Except(otherProductSpesDesc).Any()) { childItem.Value.productId = o.id; break; } } } } } productModel.defaultSpecificationDescription = defaultSpec; } productModel.amount = productModel.price; productModel.promotionList = new Dictionary(); productModel.promotionAmount = 0; //开启计算促销 if (isPromotion) { //模拟购物车数据库结构,去取促销信息 var miniCart = new CartDto(); miniCart.userId = userId; miniCart.goodsAmount = productModel.amount; miniCart.amount = productModel.amount; var listOne = new CartProducts() { id = 0, isSelect = true, userId = userId, productId = productModel.id, nums = 1, products = productModel }; miniCart.list.Add(listOne); var cartModel = new CartDto(); if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant()) { //团购秒杀默认时间过期后,不可以下单 var dt = DateTime.Now; var promotionInfo = await promotionServices.QueryByClauseAsync(p => p.startTime < dt && p.endTime > dt && p.id == groupId); if (promotionInfo != null) { await promotionServices.SetPromotion(promotionInfo, miniCart); } cartModel = miniCart; } else { cartModel = await promotionServices.ToPromotion(miniCart); } //把促销信息和新的价格等,覆盖到这里 var promotionList = cartModel.promotionList; if (cartModel.list[0].products.promotionList.Count > 0) { //把订单促销和商品促销合并,都让他显示 foreach (KeyValuePair kvp in cartModel.list[0].products.promotionList) { if (promotionList.ContainsKey(kvp.Key)) { promotionList[kvp.Key] = kvp.Value; } else { promotionList.Add(kvp.Key, kvp.Value); } } } productModel.price = cartModel.list[0].products.price; //新的商品单价 productModel.amount = cartModel.list[0].products.amount; //商品总价格 productModel.promotionList = promotionList; //促销列表 productModel.promotionAmount = cartModel.list[0].products.promotionAmount; //如果商品促销应用了,那么促销的金额 } //获取活动数量 if (type == GlobalEnumVars.OrderType.PinTuan.ToString().ToLowerInvariant()) { //把拼团的一些属性等加上 var pinTuanRule = pinTuanRuleServices.QueryMuchFirst( (role, pinTuanGoods) => new object[] { JoinType.Inner, role.id == pinTuanGoods.ruleId } , (role, pinTuanGoods) => role , (role, pinTuanGoods) => pinTuanGoods.goodsId == productModel.goodsId); //var pinTuanRule = dbClient.Queryable( // ).Where((role, pinTuanGoods) => pinTuanGoods.goodsId == productModel.goodsId) // .Select((role, pinTuanGoods) => role).First(); //调整前台显示数量 var checkOrder = orderServices.FindLimitOrder(productModel.id, userId, pinTuanRule.startTime, pinTuanRule.endTime); if (pinTuanRule.maxGoodsNums != 0) { //活动销售件数 productModel.stock = pinTuanRule.maxGoodsNums - checkOrder.TotalOrders; productModel.buyPinTuanCount = checkOrder.TotalOrders; } else { productModel.buyPinTuanCount = checkOrder.TotalOrders; } } if (type == GlobalEnumVars.OrderType.Group.ToString().ToLowerInvariant() || type == GlobalEnumVars.OrderType.Seckill.ToString().ToLowerInvariant()) { if (!goodsServices.IsInGroup(productModel.goodsId, out var groupModel, groupId)) { return null; } //调整前台显示数量 var checkOrder = orderServices.FindLimitOrder(productModel.id, userId, groupModel.startTime, groupModel.endTime); if (groupModel.maxGoodsNums != 0) { //活动销售件数 productModel.stock = groupModel.maxGoodsNums - checkOrder.TotalOrders; productModel.buyPromotionCount = checkOrder.TotalOrders; } else { productModel.buyPromotionCount = checkOrder.TotalOrders; } } return productModel; } /// /// 判断货品上下架状态 /// /// 货品序列 /// public async Task GetShelfStatus(int productsId) { return await _dal.GetShelfStatus(productsId); } /// /// 获取库存报警数量 /// /// /// public async Task GoodsStaticsTotalWarn(int goodsStocksWarn) { return await _dal.GoodsStaticsTotalWarn(goodsStocksWarn); } #region 获取关联商品的货品列表数据 /// /// 获取关联商品的货品列表数据 /// /// 判断集合 /// 排序方式 /// 当前页面索引 /// 分布大小 /// /// 是否使用WITH(NOLOCK) /// public async Task> QueryDetailPageAsync(Expression> predicate, Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false) { return await _dal.QueryDetailPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock); } #endregion /// /// 修改单个货品库存并记入库存管理日志内 /// /// /// /// public async Task EditStock(int productId, int stock) { return await _dal.EditStock(productId, stock); } /// /// 获取所有货品数据 /// /// public async Task> GetProducts(int goodId = 0) { return await _dal.GetProducts(goodId); } } }