package com.imooc.cloud.mall.practice.cartorder.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.zxing.WriterException;
import com.imooc.cloud.mall.practice.cartorder.feign.ProductFeignClient;
import com.imooc.cloud.mall.practice.cartorder.filter.UserInfoFilter;
import com.imooc.cloud.mall.practice.cartorder.model.dao.CartMapper;
import com.imooc.cloud.mall.practice.cartorder.model.dao.OrderItemMapper;
import com.imooc.cloud.mall.practice.cartorder.model.dao.OrderMapper;
import com.imooc.cloud.mall.practice.cartorder.model.pojo.Order;
import com.imooc.cloud.mall.practice.cartorder.model.pojo.OrderItem;
import com.imooc.cloud.mall.practice.cartorder.model.pojo.Product;
import com.imooc.cloud.mall.practice.cartorder.model.request.CreateOrderReq;
import com.imooc.cloud.mall.practice.cartorder.model.vo.CartVO;
import com.imooc.cloud.mall.practice.cartorder.model.vo.OrderItemVO;
import com.imooc.cloud.mall.practice.cartorder.model.vo.OrderVO;
import com.imooc.cloud.mall.practice.cartorder.mq.MsgSender;
import com.imooc.cloud.mall.practice.cartorder.service.CartService;
import com.imooc.cloud.mall.practice.cartorder.service.OrderService;
import com.imooc.cloud.mall.practice.cartorder.util.OrderCodeFactory;
import com.imooc.cloud.mall.practice.common.common.Constant.Cart;
import com.imooc.cloud.mall.practice.common.common.Constant.OrderStatusEnum;
import com.imooc.cloud.mall.practice.common.common.Constant.SaleStatus;
import com.imooc.cloud.mall.practice.common.exception.ImoocMallException;
import com.imooc.cloud.mall.practice.common.exception.ImoocMallExceptionEnum;
import com.imooc.cloud.mall.practice.common.util.QRCodeGenerator;
import io.seata.spring.annotation.GlobalTransactional;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* 描述: 订单Service实现类
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
CartService cartService;
@Autowired
ProductFeignClient productFeignClient;
@Autowired
CartMapper cartMapper;
@Autowired
OrderMapper orderMapper;
@Autowired
OrderItemMapper orderItemMapper;
@Value("${file.upload.ip}")
String ip;
@Value("${file.upload.port}")
String port;
@Value("${file.upload.dir}")
String FILE_UPLOAD_DIR;
@Autowired
MsgSender msgSender;
//数据库事务
/**
* CREATE TABLE `undo_log` (
* `id` bigint(20) NOT NULL AUTO_INCREMENT,
* `branch_id` bigint(20) NOT NULL,
* `xid` varchar(100) NOT NULL,
* `context` varchar(128) NOT NULL,
* `rollback_info` longblob NOT NULL,
* `log_status` int(11) NOT NULL,
* `log_created` datetime NOT NULL,
* `log_modified` datetime NOT NULL,
* `ext` varchar(100) DEFAULT NULL,
* PRIMARY KEY (`id`),
* UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
* ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
*/
// @Transactional(rollbackFor = Exception.class)
@GlobalTransactional
@Override
public String create(CreateOrderReq createOrderReq) {
//拿到用户ID
Integer userId = UserInfoFilter.userThreadLocal.get().getId();
//从购物车查找已经勾选的商品
List<CartVO> cartVOList = cartService.list(userId);
ArrayList<CartVO> cartVOListTemp = new ArrayList<>();
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
if (cartVO.getSelected().equals(Cart.SELECTED)) {
cartVOListTemp.add(cartVO);
}
}
cartVOList = cartVOListTemp;
//如果购物车已勾选的为空,报错
if (CollectionUtils.isEmpty(cartVOList)) {
throw new ImoocMallException(ImoocMallExceptionEnum.CART_EMPTY);
}
//判断商品是否存在、上下架状态、库存
validSaleStatusAndStock(cartVOList);
//把购物车对象转为订单item对象
List<OrderItem> orderItemList = cartVOListToOrderItemList(cartVOList);
//扣库存
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
Product product = productFeignClient.detailForFeign(orderItem.getProductId());
int stock = product.getStock() - orderItem.getQuantity();
if (stock < 0) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_ENOUGH);
}
productFeignClient.updateStock(product.getId(), stock);
}
//把购物车中的已勾选商品删除
cleanCart(cartVOList);
//生成订单
Order order = new Order();
//生成订单号,有独立的规则
String orderNo = OrderCodeFactory.getOrderCode(Long.valueOf(userId));
order.setOrderNo(orderNo);
order.setUserId(userId);
order.setTotalPrice(totalPrice(orderItemList));
order.setReceiverName(createOrderReq.getReceiverName());
order.setReceiverMobile(createOrderReq.getReceiverMobile());
order.setReceiverAddress(createOrderReq.getReceiverAddress());
order.setOrderStatus(OrderStatusEnum.NOT_PAID.getCode());
order.setPostage(0);
order.setPaymentType(1);
//插入到Order表
orderMapper.insertSelective(order);
//循环保存每个商品到order_item表
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
orderItem.setOrderNo(order.getOrderNo());
orderItemMapper.insertSelective(orderItem);
}
//把结果返回
return orderNo;
}
private Integer totalPrice(List<OrderItem> orderItemList) {
Integer totalPrice = 0;
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
private void cleanCart(List<CartVO> cartVOList) {
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
cartMapper.deleteByPrimaryKey(cartVO.getId());
}
}
private List<OrderItem> cartVOListToOrderItemList(List<CartVO> cartVOList) {
List<OrderItem> orderItemList = new ArrayList<>();
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
OrderItem orderItem = new OrderItem();
orderItem.setProductId(cartVO.getProductId());
//记录商品快照信息
orderItem.setProductName(cartVO.getProductName());
orderItem.setProductImg(cartVO.getProductImage());
orderItem.setUnitPrice(cartVO.getPrice());
orderItem.setQuantity(cartVO.getQuantity());
orderItem.setTotalPrice(cartVO.getTotalPrice());
orderItemList.add(orderItem);
}
return orderItemList;
}
private void validSaleStatusAndStock(List<CartVO> cartVOList) {
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
Product product = productFeignClient.detailForFeign(cartVO.getProductId());
//判断商品是否存在,商品是否上架
if (product == null || product.getStatus().equals(SaleStatus.NOT_SALE)) {
没有合适的资源?快使用搜索试试~ 我知道了~
24.2 SpringCloud电商进阶开发
共104个文件
java:83个
xml:14个
properties:6个
0 下载量 138 浏览量
2024-03-18
19:43:02
上传
评论
收藏 1.35MB ZIP 举报
温馨提示
24.2 SpringCloud电商进阶开发
资源推荐
资源详情
资源评论
收起资源包目录
24.2 SpringCloud电商进阶开发 (104个子文件)
anti-piracy.jar 1.37MB
OrderServiceImpl.java 16KB
ProductServiceImpl.java 6KB
AuthorizationFilter.java 6KB
CartServiceImpl.java 5KB
UserController.java 5KB
ProductAdminController.java 5KB
CategoryServiceImpl.java 4KB
OrderVO.java 3KB
CartController.java 3KB
Order.java 3KB
CategoryController.java 3KB
UserInfoFilter.java 3KB
UserInfoFilter.java 3KB
UserInfoFilter.java 3KB
UserTest.java 3KB
AdminFilter.java 3KB
UserServiceImpl.java 3KB
OrderController.java 2KB
OrderServiceImplTest.java 2KB
GlobalExceptionHandler.java 2KB
AddProductReq.java 2KB
Constant.java 2KB
UpdateProductReq.java 2KB
OrderItem.java 2KB
ApiRestResponse.java 2KB
UserFilter.java 2KB
Product.java 2KB
Product.java 2KB
OrderAdminController.java 2KB
CartVO.java 2KB
ProductController.java 2KB
CategoryVO.java 2KB
CreateOrderReq.java 2KB
User.java 2KB
User.java 2KB
User.java 2KB
ImoocMallExceptionEnum.java 2KB
JobConfiguration.java 2KB
FeignRequestInterceptor.java 2KB
UpdateCategoryReq.java 1KB
AddCategoryReq.java 1KB
OrderItemVO.java 1KB
Category.java 1KB
Cart.java 1KB
ProductListReq.java 1KB
MyBlockingQueue.java 1KB
QRCodeGenerator.java 1KB
CachingConfig.java 1KB
UserServiceImplTest.java 1KB
MsgSender.java 1KB
LockController.java 1006B
Receiver.java 998B
UserFilterConfig.java 971B
ImoocMallWebMvcConfig.java 970B
UserFilterConfig.java 965B
UserFilterConfig.java 960B
OrderCodeFactory.java 955B
CartMapper.java 930B
CategoryProductApplication.java 928B
OrderService.java 905B
ProductMapper.java 901B
TopicRabbitConfig.java 811B
ProductService.java 805B
CartOrderApplication.java 803B
OrderMapper.java 795B
UserApplication.java 759B
ProductFeignClient.java 746B
ImoocMallWebMvcConfig.java 715B
CategoryService.java 688B
ZuulGatewayApplication.java 669B
CategoryMapper.java 668B
UserMapper.java 634B
ImoocMallException.java 627B
CartService.java 623B
RedissonConfig.java 599B
ProductListQuery.java 581B
OrderItemMapper.java 575B
UserFeignClient.java 562B
EurekaServerApplication.java 528B
UserService.java 522B
UserFeignClient.java 492B
ProductConstant.java 438B
CloudMallSpringCloudGatewayPracticeApplication.java 408B
application.properties 1KB
application.properties 1KB
application.properties 1KB
application.properties 1KB
application.properties 894B
application.properties 261B
OrderMapper.xml 9KB
ProductMapper.xml 7KB
OrderItemMapper.xml 6KB
CartMapper.xml 5KB
CategoryMapper.xml 5KB
UserMapper.xml 5KB
pom.xml 3KB
pom.xml 3KB
pom.xml 2KB
pom.xml 2KB
共 104 条
- 1
- 2
资源评论
与海boy
- 粉丝: 336
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功