package com.imooc.mall.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.encoder.QRCode;
import com.imooc.mall.common.Constant;
import com.imooc.mall.exception.ImoocMallException;
import com.imooc.mall.exception.ImoocMallExceptionEnum;
import com.imooc.mall.filter.UserFilter;
import com.imooc.mall.model.dao.CartMapper;
import com.imooc.mall.model.dao.OrderItemMapper;
import com.imooc.mall.model.dao.OrderMapper;
import com.imooc.mall.model.dao.ProductMapper;
import com.imooc.mall.model.pojo.Order;
import com.imooc.mall.model.pojo.OrderItem;
import com.imooc.mall.model.pojo.Product;
import com.imooc.mall.model.requests.CreateOrderReq;
import com.imooc.mall.model.vo.CartVO;
import com.imooc.mall.model.vo.OrderItemVO;
import com.imooc.mall.model.vo.OrderVO;
import com.imooc.mall.service.CartService;
import com.imooc.mall.service.OrderService;
import com.imooc.mall.service.ProductService;
import com.imooc.mall.service.UserService;
import com.imooc.mall.util.OrderCodeFactory;
import com.imooc.mall.util.QRCodeGenerate;
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.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 订单Service实现类
* @author Rex
* @create 2021-02-17 10:14
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private CartService cartService;
@Autowired
private ProductMapper productMapper;
@Autowired
private CartMapper cartMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private UserService userService;
@Value("${file.upload.ip}")
private String ip;
//数据库事物
@Transactional(rollbackFor = {Exception.class})
@Override
public String create(CreateOrderReq createOrderReq){
//拿到用户ID
Integer userId = UserFilter.currentUser.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(Constant.Cart.CHECKED)){
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 = productMapper.selectByPrimaryKey(orderItem.getProductId());
Integer stock = product.getStock() - orderItem.getQuantity();
if (stock < 0) {
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_ENOUGH );
}
product.setStock(stock);
productMapper.updateByPrimaryKeySelective(product);
}
//把购物车中的商品已勾选商品删除
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.setReceiverAddress(createOrderReq.getReceiverAddress());
order.setReceiverMobile(createOrderReq.getReceiverMobile());
order.setOrderStatus(Constant.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);
Integer productId = cartVO.getProductId();
Integer count = cartVO.getQuantity();
Product product = productMapper.selectByPrimaryKey(productId);
//判断商品是否存在,商品是否上架
if (product == null || !product.getStatus().equals(Constant.SaleStatus.SALE)){
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_SALE);
}
//判断商品库存
if (count > product.getStock()){
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_ENOUGH);
}
}
}
@Override
public OrderVO detail(String orderNo){
Order order = orderMapper.selectByOrderNo(orderNo);
//订单不存在,则报错
if (order == null){
throw new ImoocMallException(ImoocMallExceptionEnum.NO_ORDER);
}
//订单存在,需要判断所属
Integer userId = UserFilter.currentUser.getId();
if (!order.getUserId().equals(userId)){
throw new ImoocMallException(ImoocMallExceptionEnum.NOT_YOUR_ORDER);
}
OrderVO orderVO = getOrderVO(order);
return orderVO;
}
private OrderVO getOrderVO(Order order) {
OrderVO orderVO = new OrderVO();
没有合适的资源?快使用搜索试试~ 我知道了~
java生鲜后台系统.rar
共77个文件
java:59个
xml:9个
properties:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 22 浏览量
2024-02-21
15:06:35
上传
评论
收藏 2.2MB RAR 举报
温馨提示
java源码 仅供学习和参考,禁止一切商业行为
资源推荐
资源详情
资源评论
收起资源包目录
java生鲜后台系统.rar (77个子文件)
java生鲜后台系统
imooc-mall-main
imooc-mall-main
mvnw.cmd 6KB
pom.xml 4KB
src
test
java
com
imooc
mall
MallApplicationTests.java 213B
main
resources
mysql-connector-java-8.0.18.jar 2.22MB
imooc_mall_local.sql 17KB
generatorConfig.xml 4KB
application.properties 737B
application-prod.properties 657B
log4j2.xml 3KB
imooc_mall_online.sql 17KB
mappers
OrderItemMapper.xml 6KB
ProductMapper.xml 6KB
UserMapper.xml 5KB
OrderMapper.xml 8KB
CategoryMapper.xml 5KB
CartMapper.xml 5KB
java
com
imooc
mall
controller
OrderAdminController.java 2KB
ProductController.java 1KB
CategoryController.java 4KB
UserController.java 5KB
OrderController.java 2KB
CartController.java 3KB
ProductAdminController.java 4KB
service
CartService.java 694B
OrderService.java 718B
UserService.java 557B
CategoryService.java 604B
ProductService.java 815B
impl
CartServiceImpl.java 5KB
UserServiceImpl.java 2KB
ProductServiceImpl.java 5KB
CategoryServiceImpl.java 4KB
OrderServiceImpl.java 14KB
filter
WebLogAspect.java 2KB
UserFilter.java 1KB
AdminFilter.java 2KB
common
ApiRestResponse.java 2KB
Constant.java 2KB
model
dao
OrderMapper.java 578B
UserMapper.java 592B
ProductMapper.java 808B
OrderItemMapper.java 566B
CartMapper.java 814B
CategoryMapper.java 605B
pojo
Cart.java 1KB
Product.java 2KB
Order.java 3KB
Category.java 1KB
User.java 1KB
OrderItem.java 2KB
requests
AddProductReq.java 2KB
UpdateProductReq.java 2KB
UpdateCategoryReq.java 1KB
CreateOrderReq.java 2KB
ProductListReq.java 1KB
AddCategoryReq.java 1KB
query
ProductListQuery.java 579B
vo
OrderItemVO.java 1KB
CartVO.java 2KB
CategoryVO.java 2KB
OrderVO.java 3KB
exception
GlobalExceptionHandler.java 2KB
ImoocMallException.java 614B
ImoocMallExceptionEnum.java 2KB
MallApplication.java 667B
util
QRCodeGenerate.java 1KB
OrderCodeFactory.java 2KB
MD5Utils.java 886B
config
CachingConfig.java 1KB
AdminFilterConfig.java 1KB
SpringFoxConfig.java 1KB
UserFilterConfig.java 1KB
ImoocMallWebMvcConfig.java 1KB
.mvn
wrapper
maven-wrapper.properties 218B
maven-wrapper.jar 50KB
MavenWrapperDownloader.java 5KB
mvnw 10KB
共 77 条
- 1
资源评论
GeekyGuru
- 粉丝: 1616
- 资源: 1099
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- unity开发教程.docx
- 代码使用Pygame库实现了一个简单的烟花模拟 核心逻辑包括烟花和粒子类的定义,处理位置、爆炸、尾迹和绘制等操作
- Matlab Simulink 电力电子仿真-Flyback(反激电路)电路分析
- tudou-android-release.apk
- 数据分析教程.docx
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功