fixed 完善购物车接口

This commit is contained in:
lwh 2023-08-06 16:18:42 +08:00
parent 33942e2a60
commit c296eca347
12 changed files with 357 additions and 109 deletions

View File

@ -17,5 +17,4 @@ namespace ARW.Model.Dto.Api.Carts
[Required(ErrorMessage = "客户Guid不能为空")]
public long CustomerGuid { get; set; }
}
}

View File

@ -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
{
/// <summary>
/// 修改购物车商品选中状态Dto
///
/// @author lwh
/// @date 2023-08-05
/// </summary>
public class CartGoodsNumDto
{
public int CartId { get; set; }
public int CartGoodsNum { get; set; }
}
}

View File

@ -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
{
/// <summary>
/// 修改购物车商品选中状态Dto
///
/// @author lwh
/// @date 2023-08-05
/// </summary>
public class CartGoodsSelectDto
{
public long CustomerGuid { get; set; }
public int CartId { get; set; }
public bool IsSelected { get; set; }
}
}

View File

@ -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 = "商品数量不能为空")]

View File

@ -76,7 +76,12 @@ namespace ARW.Model.Models.Business.Carts
/// <summary>
/// 描述 :是否选中
/// 空值 : false
/// </summary>
[SugarColumn(ColumnName = "is_selected")]
public bool IsSelected { get; set; }
}

View File

@ -73,6 +73,11 @@ namespace ARW.Model.Vo.Api.Carts
public class GoodsPromotion
{
/// <summary>
/// 购物车商品Guid
/// </summary>
public int CartId { get; set; }
/// <summary>
/// 店铺Id
/// </summary>

View File

@ -21,6 +21,29 @@ namespace ARW.Model.Vo.Api.Carts
public bool IsNotEmpty { get; set; }
/// <summary>
/// 描述 : 是否全选
/// </summary>
public bool IsAllSelected { get; set; }
/// <summary>
/// 描述 : 总计
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 描述 : 选中的商品总数
/// </summary>
public int SelectedGoodsCount { get; set; }
/// <summary>
/// 描述 : 折扣总计
/// </summary>
public decimal TotalDiscountAmount { get; set; }
/// <summary>
/// 购物车信息
/// </summary>

View File

@ -64,6 +64,7 @@ namespace ARW.Service.Api.BusinessService.Carts
#region Api接口代码
#region
/// <summary>
/// 查询购物车记录列表(Api)
@ -73,12 +74,21 @@ namespace ARW.Service.Api.BusinessService.Carts
public async Task<CartListVoApi> 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<CartVoApi>();
// 循环每个店铺中的购物车记录
foreach (var item in sameShopGuids)
{
@ -89,77 +99,87 @@ namespace ARW.Service.Api.BusinessService.Carts
var promotionGoodsList = new List<PromotionGoods>();
// 查找当前客户可使用的优惠券
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<Cart>();
var notHasCouponGoodsList = new List<Cart>();
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 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<Cart>();
// var notHasCouponGoodsList = new List<Cart>();
// // 根据优惠券指定的商品分组购物车中的商品
// 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<SpecInfo> 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;
}
/// <summary>
/// 获取购物车商品信息
/// </summary>
@ -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,6 +251,8 @@ namespace ARW.Service.Api.BusinessService.Carts
goodsPromotion.StockQuantity = goods.GoodsTotalInventory;
// 查找当前规格的价格
if (_item.GoodsSkuId != 0)
{
var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == _item.GoodsSkuId);
if (sku == null) throw new CustomException("所选规格不存在,请重新挑选");
goodsPromotion.Price = sku.GoodsSkuPrice;
@ -250,6 +277,12 @@ namespace ARW.Service.Api.BusinessService.Carts
}
}
goodsPromotion.SpecInfo = specInfoList;
}
else
{
goodsPromotion.Price = goods.GoodsPriceHighest;
goodsPromotion.OriginPrice = goods.GoodsDashedPriceHighest;
}
goodsPromotion.JoinCartTime = _item.Create_time;
goodsPromotionList.Add(goodsPromotion);
@ -260,6 +293,57 @@ namespace ARW.Service.Api.BusinessService.Carts
return goodsPromotionList;
}
private async Task<SpecInfo> 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
/// <summary>
/// 修改购物车商品数量
/// </summary>
public async Task<string> UpdateCartGoodsNum(CartGoodsNumDto parm)
{
var response = await _CartRepository.UpdateAsync(f => new Cart
{
CartGoodsNum = parm.CartGoodsNum
}, s => s.CartId == parm.CartId);
return "修改成功!";
}
/// <summary>
/// 修改购物车商品选中状态
/// </summary>
public async Task<string> UpdateCartGoodsSelect(CartGoodsSelectDto parm)
{
var response = await _CartRepository.UpdateAsync(f => new Cart
{
IsSelected = parm.IsSelected
}, s => s.CartId == parm.CartId);
return "修改成功!";
}
/// <summary>
/// 全选购物车商品
/// </summary>
public async Task<string> SelectAllCartGoods(CartGoodsSelectDto parm)
{
var response = await _CartRepository.UpdateAsync(f => new Cart
{
IsSelected = parm.IsSelected
}, s => s.CustomerGuid == parm.CustomerGuid && s.IsDelete == false);
return "修改成功!";
}
#endregion

View File

@ -25,6 +25,28 @@ namespace ARW.Service.Api.IBusinessService.Carts
/// <returns></returns>
Task<CartListVoApi> GetCartListApi(CartQueryDtoApi parm);
/// <summary>
/// 修改购物车商品数量
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
Task<string> UpdateCartGoodsNum(CartGoodsNumDto parm);
/// <summary>
/// 修改购物车商品选中状态
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
Task<string> UpdateCartGoodsSelect(CartGoodsSelectDto parm);
/// <summary>
/// 全选购物车商品
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
Task<string> SelectAllCartGoods(CartGoodsSelectDto parm);
}
}

View File

@ -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
{

View File

@ -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
}
}

View File

@ -84,5 +84,72 @@ namespace ARW.WebApi.Controllers.Api.Carts
}
/// <summary>
/// 修改购物车商品数量
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpPost("updateCartGoodsNum")]
[Log(Title = "修改购物车商品数量", BusinessType = BusinessType.UPDATE)]
public async Task<IActionResult> UpdateCartGoodsNum([FromBody] CartGoodsNumDto parm)
{
if (parm == null) { throw new CustomException("请求参数错误"); }
var res = await _CartServiceApi.UpdateCartGoodsNum(parm);
return SUCCESS(res);
}
/// <summary>
/// 修改购物车商品选中状态
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpPost("updateCartGoodsSelect")]
[Log(Title = "修改购物车选中状态", BusinessType = BusinessType.UPDATE)]
public async Task<IActionResult> UpdateCartGoodsSelect([FromBody] CartGoodsSelectDto parm)
{
if (parm == null) { throw new CustomException("请求参数错误"); }
var res = await _CartServiceApi.UpdateCartGoodsSelect(parm);
return SUCCESS(res);
}
/// <summary>
/// 全选购物车商品
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpPost("selectAllCartGoods")]
[Log(Title = "全选购物车商品", BusinessType = BusinessType.UPDATE)]
public async Task<IActionResult> 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);
}
/// <summary>
/// 删除购物车记录
/// </summary>
/// <returns></returns>
[HttpDelete("{ids}")]
[Log(Title = "购物车记录删除", BusinessType = BusinessType.DELETE)]
public async Task<IActionResult> 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("删除成功!");
}
}
}