订单模块

This commit is contained in:
2023-10-13 10:24:32 +08:00
parent 2a39b11337
commit 1d6ed7f564
90 changed files with 2862 additions and 65 deletions

View File

@@ -29,6 +29,18 @@
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>service-activity-client</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>rabbit_util</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@@ -1,8 +1,11 @@
package com.atguigu.ssyx.cart.controller;
import com.atguigu.ssyx.cart.service.CartInfoService;
import com.atguigu.ssyx.client.activity.ActivityFeignClient;
import com.atguigu.ssyx.common.auth.AuthContextHolder;
import com.atguigu.ssyx.common.result.Result;
import com.atguigu.ssyx.model.order.CartInfo;
import com.atguigu.ssyx.vo.order.OrderConfirmVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -23,6 +26,9 @@ public class CartApiController {
@Autowired
private CartInfoService cartInfoService;
@Autowired
private ActivityFeignClient activityFeignClient;
//添加内容当前登录用户idskuId商品数量
@ApiOperation(value = "添加商品到购物车")
@GetMapping("addToCart/{skuId}/{skuNum}")
@@ -56,4 +62,56 @@ public class CartApiController {
cartInfoService.batchDeleteCart(skuIdList, userId);
return Result.ok(null);
}
@ApiOperation(value = "购物车列表")
@GetMapping("cartList")
public Result cartList() {
//获取userId
Long userId = AuthContextHolder.getUserId();
List<CartInfo> cartInfoList = cartInfoService.getCartList(userId);
return Result.ok(cartInfoList);
}
@ApiOperation(value = "查询带优惠卷的购物车")
@GetMapping("activityCartList")
public Result activityCartList() {
// 获取用户Id
Long userId = AuthContextHolder.getUserId();
List<CartInfo> cartInfoList = cartInfoService.getCartList(userId);
OrderConfirmVo orderTradeVo = activityFeignClient.findCartActivityAndCoupon(cartInfoList, userId);
return Result.ok(orderTradeVo);
}
@ApiOperation("根据skuId选中")
@GetMapping("checkCart/{skuId}/{isChecked}")
public Result checkCart(@PathVariable("skuId") Long skuId, @PathVariable("isChecked") Integer isChecked) {
//获取userId
Long userId = AuthContextHolder.getUserId();
//调用方法
cartInfoService.checkCart(userId, skuId, isChecked);
return Result.ok(null);
}
@ApiOperation("全选")
@GetMapping("checkAllCart/{isChecked}")
public Result checkAllCart(@PathVariable("isChecked") Integer isChecked) {
Long userId = AuthContextHolder.getUserId();
cartInfoService.checkAllCart(userId, isChecked);
return Result.ok(null);
}
@ApiOperation("批量选中")
@PostMapping("batchCheckCart/{isChecked}")
public Result batchCheckCart(@RequestBody List<Long> skuIdList, @PathVariable("isChecked") Integer isChecked) {
Long userId = AuthContextHolder.getUserId();
cartInfoService.batchCheckCart(skuIdList, userId, isChecked);
return Result.ok(null);
}
@ApiOperation(value = "根据用户Id查询购物车列表")
@PostMapping("inner/getCartCheckedList/{userId}")
public List<CartInfo> getCartCheckedList(@PathVariable("userId") Long userId) {
return cartInfoService.getCartCheckedList(userId);
}
}

View File

@@ -0,0 +1,40 @@
package com.atguigu.ssyx.cart.receiver;
import com.atguigu.ssyx.cart.service.CartInfoService;
import com.atguigu.ssyx.mq.constant.MqConst;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* ClassName: CartReceiver
* Package: com.atguigu.ssyx.cart.receiver
*
* @author yovinchen
* @Create 2023/10/13 08:56
*/
@Component
public class CartReceiver {
@Autowired
private CartInfoService cartInfoService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = MqConst.QUEUE_DELETE_CART, durable = "true"),
exchange = @Exchange(value = MqConst.EXCHANGE_ORDER_DIRECT),
key = {MqConst.ROUTING_DELETE_CART}
))
public void deleteCart(Long userId, Message message, Channel channel) throws IOException {
if (userId != null) {
cartInfoService.deleteCartChecked(userId);
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}

View File

@@ -1,5 +1,7 @@
package com.atguigu.ssyx.cart.service;
import com.atguigu.ssyx.model.order.CartInfo;
import java.util.List;
/**
@@ -41,4 +43,48 @@ public interface CartInfoService {
* @param userId
*/
void batchDeleteCart(List<Long> skuIdList, Long userId);
/**
* 购物车列表
*
* @param userId
* @return
*/
List<CartInfo> getCartList(Long userId);
/**
* 根据skuId选中
*
* @param userId
* @param skuId
* @param isChecked
*/
void checkCart(Long userId, Long skuId, Integer isChecked);
/**
* 全选
*
* @param userId
* @param isChecked
*/
void checkAllCart(Long userId, Integer isChecked);
/**
* 批量选中
*
* @param skuIdList
* @param userId
* @param isChecked
*/
void batchCheckCart(List<Long> skuIdList, Long userId, Integer isChecked);
/**
* 根据用户Id查询购物车列表
*
* @param userId
* @return
*/
List<CartInfo> getCartCheckedList(Long userId);
void deleteCartChecked(Long userId);
}

View File

@@ -12,10 +12,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* ClassName: CartInfoServiceImpl
@@ -53,7 +57,7 @@ public class CartInfoServiceImpl implements CartInfoService {
*/
@Override
public void addToCart(Long userId, Long skuId, Integer skuNum) {
//1 因为购物车数据存储到redis里面
//1 因为购物车数据存储到redis里面
// 从redis里面根据key获取数据这个key包含userId
String cartKey = this.getCartKey(userId);
BoundHashOperations<String, String, CartInfo> hashOperations = redisTemplate.boundHashOps(cartKey);
@@ -149,8 +153,7 @@ public class CartInfoServiceImpl implements CartInfoService {
BoundHashOperations<String, String, CartInfo> hashOperations = redisTemplate.boundHashOps(cartKey);
List<CartInfo> cartInfoList = hashOperations.values();
for (CartInfo cartInfo : cartInfoList) {
hashOperations.delete(cartInfo.getSkuId()
.toString());
hashOperations.delete(cartInfo.getSkuId().toString());
}
}
@@ -168,4 +171,133 @@ public class CartInfoServiceImpl implements CartInfoService {
hashOperations.delete(skuId.toString());
});
}
/**
* 购物车列表
*
* @param userId
* @return
*/
//购物车列表
@Override
public List<CartInfo> getCartList(Long userId) {
//判断userId
List<CartInfo> cartInfoList = new ArrayList<>();
if (StringUtils.isEmpty(userId)) {
return cartInfoList;
}
//从redis获取购物车数据
String cartKey = this.getCartKey(userId);
BoundHashOperations<String, String, CartInfo> boundHashOperations = redisTemplate.boundHashOps(cartKey);
cartInfoList = boundHashOperations.values();
if (!CollectionUtils.isEmpty(cartInfoList)) {
//根据商品添加时间,降序
cartInfoList.sort((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()));
}
return cartInfoList;
}
/**
* 根据skuId选中
*
* @param userId
* @param skuId
* @param isChecked
*/
@Override
public void checkCart(Long userId, Long skuId, Integer isChecked) {
//获取redis的key
String cartKey = this.getCartKey(userId);
//cartKey获取field-value
BoundHashOperations<String, String, CartInfo> boundHashOperations = redisTemplate.boundHashOps(cartKey);
//根据fieldskuId获取valueCartInfo
CartInfo cartInfo = boundHashOperations.get(skuId.toString());
if (cartInfo != null) {
cartInfo.setIsChecked(isChecked);
//更新
boundHashOperations.put(skuId.toString(), cartInfo);
//设置key过期时间
this.setCartKeyExpire(cartKey);
}
}
/**
* 全选
*
* @param userId
* @param isChecked
*/
@Override
public void checkAllCart(Long userId, Integer isChecked) {
String cartKey = this.getCartKey(userId);
BoundHashOperations<String, String, CartInfo> boundHashOperations = redisTemplate.boundHashOps(cartKey);
List<CartInfo> cartInfoList = boundHashOperations.values();
cartInfoList.forEach(cartInfo -> {
cartInfo.setIsChecked(isChecked);
boundHashOperations.put(cartInfo.getSkuId().toString(), cartInfo);
});
this.setCartKeyExpire(cartKey);
}
/**
* 批量选中
*
* @param skuIdList
* @param userId
* @param isChecked
*/
@Override
public void batchCheckCart(List<Long> skuIdList, Long userId, Integer isChecked) {
String cartKey = this.getCartKey(userId);
BoundHashOperations<String, String, CartInfo> boundHashOperations = redisTemplate.boundHashOps(cartKey);
skuIdList.forEach(skuId -> {
CartInfo cartInfo = boundHashOperations.get(skuId.toString());
cartInfo.setIsChecked(isChecked);
boundHashOperations.put(cartInfo.getSkuId().toString(), cartInfo);
});
this.setCartKeyExpire(cartKey);
}
/**
* 根据用户Id查询购物车列表
*
* @param userId
* @return
*/
@Override
public List<CartInfo> getCartCheckedList(Long userId) {
String cartKey = this.getCartKey(userId);
BoundHashOperations<String, String, CartInfo> boundHashOperations = redisTemplate.boundHashOps(cartKey);
List<CartInfo> cartInfoList = boundHashOperations.values();
//isChecked = 1购物项选中
return cartInfoList.stream().filter(cartInfo -> {
return cartInfo.getIsChecked().intValue() == 1;
}).collect(Collectors.toList());
}
/**
* 根据userId删除选中购物车记录
*
* @param userId
*/
@Override
public void deleteCartChecked(Long userId) {
//根据userid查询选中购物车记录
List<CartInfo> cartInfoList = this.getCartCheckedList(userId);
//查询list数据处理得到skuId集合
List<Long> skuIdList = cartInfoList.stream().map(item -> item.getSkuId()).collect(Collectors.toList());
//构建redis的key值
// hash类型 key filed-value
String cartKey = this.getCartKey(userId);
//根据key查询filed-value结构
BoundHashOperations<String, String, CartInfo> hashOperations = redisTemplate.boundHashOps(cartKey);
//根据filedskuId删除redis数据
skuIdList.forEach(skuId -> {
hashOperations.delete(skuId.toString());
});
}
}