using Infrastructure.Attribute; using Microsoft.AspNetCore.Http; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ARW.Model; using ARW.Repository; using ARW.Repository.Business.Carts; using ARW.Service.Api.IBusinessService.Carts; using ARW.Model.Dto.Api.Carts; using ARW.Model.Models.Business.Carts; using ARW.Model.Vo.Api.Carts; using ARW.Model.Models.Business.Custom.Customers; using ARW.Model.Models.Business.GoodsManager.Goodss; using ARW.Model.Models.Business.ShopManager.Shops; using Org.BouncyCastle.Crypto.Prng; using ARW.Repository.Business.ShopManager.Shops; using ARW.Repository.Business.Marketing.CouponManage.Coupons; using ARW.Repository.Business.Marketing.CouponManage.CustomerCoupons; using ARW.Repository.Business.GoodsManager.Goodss; using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSkus; using ARW.Repository.Business.GoodsManager.GoodsSpecs.Specs; using ARW.Repository.Business.GoodsManager.GoodsSpecs.SpecValues; using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSpecRels; using Senparc.Weixin.MP.AdvancedAPIs.MerChant; using Infrastructure; using ARW.Model.Models.Business.Marketing.CouponManage.CustomerCoupons; using ARW.Model.Models.Business.Marketing.CouponManage.Coupons; using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp.WxAppJson; namespace ARW.Service.Api.BusinessService.Carts { /// /// 购物车记录接口实现类Api /// /// @author lwh /// @date 2023-07-20 /// [AppService(ServiceType = typeof(ICartServiceApi), ServiceLifetime = LifeTime.Transient)] public class CartServiceImplApi : BaseService, ICartServiceApi { private readonly CartRepository _CartRepository; private readonly ShopRepository _ShopRepository; private readonly CouponRepository _CouponRepository; private readonly CustomerCouponRepository _CustomerCouponRepository; private readonly GoodsRepository _GoodsRepository; private readonly GoodsSkuRepository _GoodsSkuRepository; private readonly SpecRepository _SpecRepository; private readonly SpecValueRepository _SpecValueRepository; public CartServiceImplApi(CartRepository CartRepository, ShopRepository shopRepository, CustomerCouponRepository customerCouponRepository, CouponRepository couponRepository, GoodsRepository goodsRepository, GoodsSkuRepository goodsSkuRepository, SpecRepository specRepository, SpecValueRepository specValueRepository) { this._CartRepository = CartRepository; _ShopRepository = shopRepository; _CustomerCouponRepository = customerCouponRepository; _CouponRepository = couponRepository; _GoodsRepository = goodsRepository; _GoodsSkuRepository = goodsSkuRepository; _SpecRepository = specRepository; _SpecValueRepository = specValueRepository; } #region Api接口代码 #region 查询 /// /// 查询购物车记录列表(Api) /// /// /// public async Task GetCartListApi(CartQueryDtoApi parm) { // 找到当前客户的所有购物车列表 var customerCartList = await _CartRepository.Queryable() .Where(s => s.CustomerGuid == parm.CustomerGuid) .OrderBy(s => s.Create_time, OrderByType.Desc) .ToListAsync(); // 找到店铺的Guids var sameShopGuids = customerCartList .OrderByDescending(s => s.Create_time) .Select(item => item.ShopGuid) .Distinct() .ToList(); var res = new List(); // 循环每个店铺中的购物车记录 foreach (var item in sameShopGuids) { var shop = await _ShopRepository.GetFirstAsync(s => s.ShopGuid == item); var shopCart = new CartVoApi(); shopCart.StoreId = shop.ShopGuid; shopCart.StoreName = shop.ShopName; var promotionGoodsList = new List(); #region 购物车优惠券算法 // 查找当前客户可使用的优惠券 //var couponList = await _CustomerCouponRepository.GetListAsync(s => s.CustomerGuid == parm.CustomerGuid && s.CustomerCouponIsUsed == 1 && s.CustomerCouponIsExpired == 1); // 如果有优惠券 //if (couponList.Count() > 0) //{ // foreach (var customerCoupon in couponList) // { // var promotionGoods = new PromotionGoods(); // var coupon = await _CouponRepository.GetFirstAsync(s => s.CouponGuid == customerCoupon.CouponGuid); // promotionGoods.PromotionId = coupon.CouponId; // promotionGoods.Title = coupon.CouponName; // promotionGoods.PromotionCode = "MERCHANT"; // if (coupon.CouponType == 1) // promotionGoods.Tag = "满减"; // else // promotionGoods.Tag = "折扣"; // promotionGoods.Description = coupon.CouponDesc; // // 情况1:全部商品的通用券 // if (coupon.CouponApplicableScope == 1) // { // var goodsPromotionList = await GetGoodsPromotionList(customerCartList, shop.ShopGuid); // promotionGoods.GoodsPromotionList = goodsPromotionList; // promotionGoodsList.Add(promotionGoods); // } // // // 情况2:指定商品的券 // if (coupon.CouponApplicableScope == 2) // { // // 从优惠券中获取指定的商品ID列表 // if (string.IsNullOrEmpty(coupon.CouponGoodsIds)) // { // throw new CustomException("该优惠券还未指定商品"); // } // var goodsGuids = coupon.CouponGoodsIds.Split(',') // .Select(id => Convert.ToInt32(id)) // .Select(goodsId => _GoodsRepository.GetFirstAsync(s => s.GoodsId == goodsId)) // .Select(task => task.Result.GoodsGuid) // .ToList(); // var hasCouponGoodsList = new List(); // var notHasCouponGoodsList = new List(); // // 根据优惠券指定的商品分组购物车中的商品 // foreach (var cart in customerCartList) // { // foreach (var goodsGuid in goodsGuids) // { // if (cart.GoodsGuid == goodsGuid) // { // hasCouponGoodsList.Add(cart); // } // } // } // promotionGoods.GoodsPromotionList = await GetGoodsPromotionList(hasCouponGoodsList, shop.ShopGuid); // if (promotionGoods.GoodsPromotionList.Count() > 0) // { // promotionGoodsList.Add(promotionGoods); // } // notHasCouponGoodsList = customerCartList.Except(hasCouponGoodsList).ToList(); // // 处理未包含在优惠券指定商品列表中的商品 // var NotCouponPromotionGoods = new PromotionGoods(); // NotCouponPromotionGoods.GoodsPromotionList = await GetGoodsPromotionList(notHasCouponGoodsList, shop.ShopGuid); // if (NotCouponPromotionGoods.GoodsPromotionList.Count() > 0) // { // promotionGoodsList.Add(NotCouponPromotionGoods); // } // } // } //} //else // 如果没有优惠券 //{ #endregion var promotionGoods = new PromotionGoods(); var goodsPromotionList = await GetGoodsPromotionList(customerCartList, shop.ShopGuid); promotionGoods.GoodsPromotionList = goodsPromotionList; promotionGoodsList.Add(promotionGoods); //} shopCart.PromotionGoodsList = promotionGoodsList; res.Add(shopCart); } var cartList = new CartListVoApi(); decimal totalAmount = res .SelectMany(item => item.PromotionGoodsList) .SelectMany(item1 => item1.GoodsPromotionList) .Where(item2 => item2.IsSelected) .Sum(item2 => item2.Price * item2.Quantity); int selectedGoodsCount = res .SelectMany(item => item.PromotionGoodsList) .SelectMany(item1 => item1.GoodsPromotionList) .Count(item2 => item2.IsSelected); cartList.TotalAmount = totalAmount; cartList.SelectedGoodsCount = selectedGoodsCount; if (res.Count() > 0) { // 判断是否全选购物车 cartList.IsAllSelected = customerCartList.All(cart => cart.IsSelected); cartList.IsNotEmpty = true; cartList.StoreGoods = res; } return cartList; } /// /// 获取购物车商品信息 /// /// 当前客户的购物车列表 /// 店铺guid /// 购物车类型 /// /// private async Task> GetGoodsPromotionList(List customerCartList, long shopGuid) { var goodsPromotionList = new List(); foreach (var _item in customerCartList) { var goodsPromotion = new GoodsPromotion(); if (_item.ShopGuid == shopGuid) { var goods = new Goods(); goods = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == _item.GoodsGuid); if (goods == null) throw new CustomException("所选商品不存在,请重新挑选"); if (goods.GoodsId != 0) { goodsPromotion.CartId = _item.CartId; goodsPromotion.IsSelected = _item.IsSelected; goodsPromotion.StoreId = goods.ShopGuid; var shop = await _ShopRepository.GetFirstAsync(s => s.ShopGuid == goods.ShopGuid); goodsPromotion.StoreName = shop.ShopName; goodsPromotion.SpuId = goods.GoodsGuid; goodsPromotion.SkuId = _item.GoodsSkuId; goodsPromotion.Thumb = goods.GoodsPicture.Split(',').First(); goodsPromotion.Title = goods.GoodsName; goodsPromotion.Quantity = _item.CartGoodsNum; goodsPromotion.StockStatus = goods.GoodsTotalInventory > _item.CartGoodsNum; goodsPromotion.StockQuantity = goods.GoodsTotalInventory; // 查找当前规格的价格 if (_item.GoodsSkuId != 0) { var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == _item.GoodsSkuId); if (sku != null) { goodsPromotion.Price = sku.GoodsSkuPrice; goodsPromotion.OriginPrice = sku.GoodsSkuLinePrice; if (!string.IsNullOrEmpty(sku.GoodsSkuImg)) goodsPromotion.Thumb = sku.GoodsSkuImg; // 查找当前规格的详细信息 var specInfoList = new List(); if (sku.SpecValueId != 0) { var specInfo = await GetSpecInfo(sku.SpecValueId); specInfoList.Add(specInfo); if (sku.SpecSecondValueId != 0) { var specInfo2 = await GetSpecInfo(sku.SpecSecondValueId); specInfoList.Add(specInfo2); } if (sku.SpecThirdValueId != 0) { var specInfo3 = await GetSpecInfo(sku.SpecThirdValueId); specInfoList.Add(specInfo3); } } goodsPromotion.SpecInfo = specInfoList; } //throw new CustomException("所选规格不存在,请重新挑选"); } else { goodsPromotion.Price = goods.GoodsPriceHighest; goodsPromotion.OriginPrice = goods.GoodsDashedPriceHighest; } goodsPromotion.JoinCartTime = _item.Create_time; goodsPromotionList.Add(goodsPromotion); } } } return goodsPromotionList; } private async Task GetSpecInfo(int value) { var specInfo = new SpecInfo(); var sepcValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == value); var sepc = await _SpecRepository.GetFirstAsync(s => s.SpecId == sepcValue.SpecId); specInfo.SpecTitle = sepc.SpecName; specInfo.SpecValue = sepcValue.SpecValueName; return specInfo; } #endregion /// /// 修改购物车商品数量 /// public async Task UpdateCartGoodsNum(CartGoodsNumDto parm) { var response = await _CartRepository.UpdateAsync(f => new Cart { CartGoodsNum = parm.CartGoodsNum }, s => s.CartId == parm.CartId); return "修改成功!"; } /// /// 修改购物车商品选中状态 /// public async Task UpdateCartGoodsSelect(CartGoodsSelectDto parm) { var response = await _CartRepository.UpdateAsync(f => new Cart { IsSelected = !f.IsSelected }, s => s.CartId == parm.CartId); return "修改成功!"; } /// /// 全选购物车商品 /// public async Task SelectAllCartGoods(CartGoodsSelectDto parm) { var response = await _CartRepository.UpdateAsync(f => new Cart { IsSelected = !f.IsSelected }, s => s.CustomerGuid == parm.CustomerGuid && s.IsDelete == false); return "修改成功!"; } #endregion } }