diff --git a/ARW.Model/Dto/Api/Carts/CartApiDto.cs b/ARW.Model/Dto/Api/Carts/CartApiDto.cs index 0ae0620..3ab6fc2 100644 --- a/ARW.Model/Dto/Api/Carts/CartApiDto.cs +++ b/ARW.Model/Dto/Api/Carts/CartApiDto.cs @@ -12,10 +12,9 @@ namespace ARW.Model.Dto.Api.Carts /// @author lwh /// @date 2023-07-20 /// - public class CartQueryDtoApi : PagerInfo + public class CartQueryDtoApi : PagerInfo { [Required(ErrorMessage = "客户Guid不能为空")] public long CustomerGuid { get; set; } } - } diff --git a/ARW.Model/Dto/Api/Carts/CartGoodsNumDto.cs b/ARW.Model/Dto/Api/Carts/CartGoodsNumDto.cs new file mode 100644 index 0000000..a54f54e --- /dev/null +++ b/ARW.Model/Dto/Api/Carts/CartGoodsNumDto.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using ARW.Model.Models.Business.Carts; + +namespace ARW.Model.Dto.Api.Carts +{ + + /// + /// 修改购物车商品选中状态Dto + /// + /// @author lwh + /// @date 2023-08-05 + /// + public class CartGoodsNumDto + { + public int CartId { get; set; } + public int CartGoodsNum { get; set; } + } + + +} diff --git a/ARW.Model/Dto/Api/Carts/CartGoodsSelectDto.cs b/ARW.Model/Dto/Api/Carts/CartGoodsSelectDto.cs new file mode 100644 index 0000000..e4ff715 --- /dev/null +++ b/ARW.Model/Dto/Api/Carts/CartGoodsSelectDto.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using ARW.Model.Models.Business.Carts; + +namespace ARW.Model.Dto.Api.Carts +{ + + /// + /// 修改购物车商品选中状态Dto + /// + /// @author lwh + /// @date 2023-08-05 + /// + public class CartGoodsSelectDto + { + public long CustomerGuid { get; set; } + public int CartId { get; set; } + public bool IsSelected { get; set; } + } + + +} diff --git a/ARW.Model/Dto/Business/Carts/CartDto.cs b/ARW.Model/Dto/Business/Carts/CartDto.cs index 6f3eb00..1396086 100644 --- a/ARW.Model/Dto/Business/Carts/CartDto.cs +++ b/ARW.Model/Dto/Business/Carts/CartDto.cs @@ -18,13 +18,10 @@ namespace ARW.Model.Dto.Business.Carts public long CartGuid { get; set; } - [Required(ErrorMessage = "店铺Guid不能为空")] public long ShopGuid { get; set; } - [Required(ErrorMessage = "商品Guid不能为空")] - public long GoodsGud { get; set; } + public long GoodsGuid { get; set; } - [Required(ErrorMessage = "商品sku唯一标识不能为空")] public int GoodsSkuId { get; set; } [Required(ErrorMessage = "商品数量不能为空")] diff --git a/ARW.Model/Models/Business/Carts/Cart.cs b/ARW.Model/Models/Business/Carts/Cart.cs index 10b9611..3d9a60b 100644 --- a/ARW.Model/Models/Business/Carts/Cart.cs +++ b/ARW.Model/Models/Business/Carts/Cart.cs @@ -76,7 +76,12 @@ namespace ARW.Model.Models.Business.Carts - + /// + /// 描述 :是否选中 + /// 空值 : false + /// + [SugarColumn(ColumnName = "is_selected")] + public bool IsSelected { get; set; } } diff --git a/ARW.Model/Vo/Api/Carts/CartApiVo.cs b/ARW.Model/Vo/Api/Carts/CartApiVo.cs index 5f8f0ec..2c627d6 100644 --- a/ARW.Model/Vo/Api/Carts/CartApiVo.cs +++ b/ARW.Model/Vo/Api/Carts/CartApiVo.cs @@ -73,6 +73,11 @@ namespace ARW.Model.Vo.Api.Carts public class GoodsPromotion { + /// + /// 购物车商品Guid + /// + public int CartId { get; set; } + /// /// 店铺Id /// diff --git a/ARW.Model/Vo/Api/Carts/CartListApiVo.cs b/ARW.Model/Vo/Api/Carts/CartListApiVo.cs index 8b960c2..7f13607 100644 --- a/ARW.Model/Vo/Api/Carts/CartListApiVo.cs +++ b/ARW.Model/Vo/Api/Carts/CartListApiVo.cs @@ -21,6 +21,29 @@ namespace ARW.Model.Vo.Api.Carts public bool IsNotEmpty { get; set; } + /// + /// 描述 : 是否全选 + /// + public bool IsAllSelected { get; set; } + + + /// + /// 描述 : 总计 + /// + public decimal TotalAmount { get; set; } + + + /// + /// 描述 : 选中的商品总数 + /// + public int SelectedGoodsCount { get; set; } + + + /// + /// 描述 : 折扣总计 + /// + public decimal TotalDiscountAmount { get; set; } + /// /// 购物车信息 /// diff --git a/ARW.Service/Api/BusinessService/Carts/CartServiceApi.cs b/ARW.Service/Api/BusinessService/Carts/CartServiceApi.cs index a61a06d..b77a6d9 100644 --- a/ARW.Service/Api/BusinessService/Carts/CartServiceApi.cs +++ b/ARW.Service/Api/BusinessService/Carts/CartServiceApi.cs @@ -64,6 +64,7 @@ namespace ARW.Service.Api.BusinessService.Carts #region Api接口代码 + #region 查询 /// /// 查询购物车记录列表(Api) @@ -73,12 +74,21 @@ namespace ARW.Service.Api.BusinessService.Carts public async Task GetCartListApi(CartQueryDtoApi parm) { // 找到当前客户的所有购物车列表 - var customerCartList = await _CartRepository.GetListAsync(s => s.CustomerGuid == parm.CustomerGuid); + var customerCartList = await _CartRepository.Queryable() + .Where(s => s.CustomerGuid == parm.CustomerGuid) + .OrderBy(s => s.Create_time, OrderByType.Desc) + .ToListAsync(); // 找到店铺的Guids - var sameShopGuids = customerCartList.Select(item => item.ShopGuid).Distinct().ToList(); + var sameShopGuids = customerCartList + .OrderByDescending(s => s.Create_time) + .Select(item => item.ShopGuid) + .Distinct() + .ToList(); + var res = new List(); + // 循环每个店铺中的购物车记录 foreach (var item in sameShopGuids) { @@ -89,77 +99,87 @@ namespace ARW.Service.Api.BusinessService.Carts var promotionGoodsList = new List(); // 查找当前客户可使用的优惠券 - var couponList = await _CustomerCouponRepository.GetListAsync(s => s.CustomerGuid == parm.CustomerGuid && s.CustomerCouponIsUsed == 1 && s.CustomerCouponIsExpired == 1); + //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; + //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) - { - // 根据优惠券指定的商品查找购物车中是否有对应的商品 - if (string.IsNullOrEmpty(coupon.CouponGoodsIds)) throw new CustomException("该优惠券还未指定商品"); - var goodsIds = coupon.CouponGoodsIds.Split(','); - var hasCouponGoodsList = new List(); - var notHasCouponGoodsList = new List(); - foreach (var id in goodsIds) - { - var couponGoods = await _GoodsRepository.GetFirstAsync(s => s.GoodsId == Convert.ToInt32(id)); - foreach (var cart in customerCartList) - { - if (cart.GoodsGuid == couponGoods.GoodsGuid) - { - hasCouponGoodsList.Add(cart); - } - else - { - notHasCouponGoodsList.Add(cart); - } - } - } - var goodsPromotionList = await GetGoodsPromotionList(hasCouponGoodsList, shop.ShopGuid); - promotionGoods.GoodsPromotionList = goodsPromotionList; - if(promotionGoods.GoodsPromotionList.Count() > 0) - { - promotionGoodsList.Add(promotionGoods); - } + // // 情况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 NotCouponPromotionGoods = new PromotionGoods(); - NotCouponPromotionGoods.GoodsPromotionList = await GetGoodsPromotionList(notHasCouponGoodsList, shop.ShopGuid); ; - promotionGoodsList.Add(NotCouponPromotionGoods); - } - } - } - else // 如果没有优惠券 - { - var promotionGoods = new PromotionGoods(); + // 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 goodsPromotionList = await GetGoodsPromotionList(customerCartList, shop.ShopGuid); + // var hasCouponGoodsList = new List(); + // var notHasCouponGoodsList = new List(); - promotionGoods.GoodsPromotionList = goodsPromotionList; - promotionGoodsList.Add(promotionGoods); - } + // // 根据优惠券指定的商品分组购物车中的商品 + // 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 // 如果没有优惠券 + //{ + var promotionGoods = new PromotionGoods(); + + var goodsPromotionList = await GetGoodsPromotionList(customerCartList, shop.ShopGuid); + + promotionGoods.GoodsPromotionList = goodsPromotionList; + promotionGoodsList.Add(promotionGoods); + //} shopCart.PromotionGoodsList = promotionGoodsList; res.Add(shopCart); @@ -168,8 +188,24 @@ namespace ARW.Service.Api.BusinessService.Carts var cartList = new CartListVoApi(); - if(res.Count() > 0) + 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; } @@ -179,17 +215,6 @@ namespace ARW.Service.Api.BusinessService.Carts } - 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; - } - - /// /// 获取购物车商品信息 /// @@ -208,14 +233,14 @@ namespace ARW.Service.Api.BusinessService.Carts { 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; goodsPromotion.SpuId = goods.GoodsGuid; goodsPromotion.SkuId = _item.GoodsSkuId; @@ -226,30 +251,38 @@ namespace ARW.Service.Api.BusinessService.Carts goodsPromotion.StockQuantity = goods.GoodsTotalInventory; // 查找当前规格的价格 - var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == _item.GoodsSkuId); - if (sku == null) throw new CustomException("所选规格不存在,请重新挑选"); - goodsPromotion.Price = sku.GoodsSkuPrice; - goodsPromotion.OriginPrice = sku.GoodsSkuLinePrice; - - // 查找当前规格的详细信息 - var specInfoList = new List(); - - if (sku.SpecValueId != 0) + if (_item.GoodsSkuId != 0) { - var specInfo = await GetSpecInfo(sku.SpecValueId); - specInfoList.Add(specInfo); - if (sku.SpecSecondValueId != 0) + var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == _item.GoodsSkuId); + if (sku == null) throw new CustomException("所选规格不存在,请重新挑选"); + goodsPromotion.Price = sku.GoodsSkuPrice; + goodsPromotion.OriginPrice = sku.GoodsSkuLinePrice; + + // 查找当前规格的详细信息 + var specInfoList = new List(); + + if (sku.SpecValueId != 0) { - var specInfo2 = await GetSpecInfo(sku.SpecSecondValueId); - specInfoList.Add(specInfo2); - } - if (sku.SpecThirdValueId != 0) - { - var specInfo3 = await GetSpecInfo(sku.SpecThirdValueId); - specInfoList.Add(specInfo3); + 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; + } + else + { + goodsPromotion.Price = goods.GoodsPriceHighest; + goodsPromotion.OriginPrice = goods.GoodsDashedPriceHighest; } - goodsPromotion.SpecInfo = specInfoList; goodsPromotion.JoinCartTime = _item.Create_time; goodsPromotionList.Add(goodsPromotion); @@ -260,6 +293,57 @@ namespace ARW.Service.Api.BusinessService.Carts 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 = parm.IsSelected + }, s => s.CartId == parm.CartId); + return "修改成功!"; + } + + + /// + /// 全选购物车商品 + /// + public async Task SelectAllCartGoods(CartGoodsSelectDto parm) + { + var response = await _CartRepository.UpdateAsync(f => new Cart + { + IsSelected = parm.IsSelected + }, s => s.CustomerGuid == parm.CustomerGuid && s.IsDelete == false); + return "修改成功!"; + } + #endregion diff --git a/ARW.Service/Api/IBusinessService/Carts/ICartServiceApi.cs b/ARW.Service/Api/IBusinessService/Carts/ICartServiceApi.cs index 492985c..5a466a2 100644 --- a/ARW.Service/Api/IBusinessService/Carts/ICartServiceApi.cs +++ b/ARW.Service/Api/IBusinessService/Carts/ICartServiceApi.cs @@ -25,6 +25,28 @@ namespace ARW.Service.Api.IBusinessService.Carts /// Task GetCartListApi(CartQueryDtoApi parm); + /// + /// 修改购物车商品数量 + /// + /// + /// + Task UpdateCartGoodsNum(CartGoodsNumDto parm); + + + /// + /// 修改购物车商品选中状态 + /// + /// + /// + Task UpdateCartGoodsSelect(CartGoodsSelectDto parm); + + + /// + /// 全选购物车商品 + /// + /// + /// + Task SelectAllCartGoods(CartGoodsSelectDto parm); } } diff --git a/ARW.Service/Business/BusinessService/Carts/CartService.cs b/ARW.Service/Business/BusinessService/Carts/CartService.cs index 06d9186..f56bec5 100644 --- a/ARW.Service/Business/BusinessService/Carts/CartService.cs +++ b/ARW.Service/Business/BusinessService/Carts/CartService.cs @@ -14,6 +14,7 @@ using ARW.Service.Business.IBusinessService.Carts; using ARW.Model.Dto.Business.Carts; using ARW.Model.Models.Business.Carts; using ARW.Model.Vo.Business.Carts; +using ARW.Model.Dto.Api.Carts; namespace ARW.Service.Business.BusinessService.Carts { diff --git a/ARW.Service/Business/IBusinessService/Carts/ICartService.cs b/ARW.Service/Business/IBusinessService/Carts/ICartService.cs index a66bd5f..75641be 100644 --- a/ARW.Service/Business/IBusinessService/Carts/ICartService.cs +++ b/ARW.Service/Business/IBusinessService/Carts/ICartService.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using ARW.Model; +using ARW.Model.Dto.Api.Carts; using ARW.Model.Dto.Business.Carts; using ARW.Model.Models.Business.Carts; using ARW.Model.Vo.Business.Carts; @@ -36,6 +37,5 @@ namespace ARW.Service.Business.IBusinessService.Carts - } } diff --git a/ARW.WebApi/Controllers/Api/Carts/CartApiController.cs b/ARW.WebApi/Controllers/Api/Carts/CartApiController.cs index cbdb09a..03c5c19 100644 --- a/ARW.WebApi/Controllers/Api/Carts/CartApiController.cs +++ b/ARW.WebApi/Controllers/Api/Carts/CartApiController.cs @@ -84,5 +84,72 @@ namespace ARW.WebApi.Controllers.Api.Carts } + /// + /// 修改购物车商品数量 + /// + /// + /// + [HttpPost("updateCartGoodsNum")] + [Log(Title = "修改购物车商品数量", BusinessType = BusinessType.UPDATE)] + public async Task UpdateCartGoodsNum([FromBody] CartGoodsNumDto parm) + { + if (parm == null) { throw new CustomException("请求参数错误"); } + + var res = await _CartServiceApi.UpdateCartGoodsNum(parm); + return SUCCESS(res); + } + + + /// + /// 修改购物车商品选中状态 + /// + /// + /// + [HttpPost("updateCartGoodsSelect")] + [Log(Title = "修改购物车选中状态", BusinessType = BusinessType.UPDATE)] + public async Task UpdateCartGoodsSelect([FromBody] CartGoodsSelectDto parm) + { + if (parm == null) { throw new CustomException("请求参数错误"); } + + var res = await _CartServiceApi.UpdateCartGoodsSelect(parm); + return SUCCESS(res); + } + + + /// + /// 全选购物车商品 + /// + /// + /// + [HttpPost("selectAllCartGoods")] + [Log(Title = "全选购物车商品", BusinessType = BusinessType.UPDATE)] + public async Task SelectAllCartGoods([FromBody] CartGoodsSelectDto parm) + { + if (parm == null) { throw new CustomException("请求参数错误"); } + + var user = JwtUtil.GetLoginUser(App.HttpContext); + parm.CustomerGuid = user.UserId; + var res = await _CartServiceApi.SelectAllCartGoods(parm); + return SUCCESS(res); + } + + + /// + /// 删除购物车记录 + /// + /// + [HttpDelete("{ids}")] + [Log(Title = "购物车记录删除", BusinessType = BusinessType.DELETE)] + public async Task Delete(string ids) + { + long[] idsArr = Tools.SpitLongArrary(ids); + if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } + foreach (var item in idsArr) + { + await _CartService.DeleteAsync(s => s.CartId == item); + } + return SUCCESS("删除成功!"); + } + } }