package cn.chenhaoxiang.service.impl;
import cn.chenhaoxiang.converter.OrderMaster2OrderDTOConverter;
import cn.chenhaoxiang.dao.OrderDetailDao;
import cn.chenhaoxiang.dao.OrderMasterDao;
import cn.chenhaoxiang.dataObject.OrderDetail;
import cn.chenhaoxiang.dataObject.OrderMaster;
import cn.chenhaoxiang.dataObject.ProductInfo;
import cn.chenhaoxiang.dto.CartDTO;
import cn.chenhaoxiang.dto.OrderDTO;
import cn.chenhaoxiang.enums.OrderStausEnum;
import cn.chenhaoxiang.enums.PayStatusEnum;
import cn.chenhaoxiang.enums.ResultEnum;
import cn.chenhaoxiang.exception.ResponseBankException;
import cn.chenhaoxiang.exception.SellException;
import cn.chenhaoxiang.service.*;
import cn.chenhaoxiang.utils.KeyUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created with IntelliJ IDEA.
* User: 陈浩翔.
* Date: 2018/1/14.
* Time: 下午 10:39.
* Explain:
*/
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private ProductInfoService productInfoService;
@Autowired
private OrderDetailDao orderDetailDao;
@Autowired
private OrderMasterDao orderMasterDao;
@Autowired
private PayService payService;
@Autowired
private PushMessageService pushMessageService;
@Autowired
private WebSocket webSocket;
@Override
@Transactional
public OrderDTO create(OrderDTO orderDTO) {
String orderId = KeyUtil.getUniqueKey();
BigDecimal orderAmount = new BigDecimal(BigInteger.ZERO);
// List<CartDTO> cartDTOList = new ArrayList<>();//方式一
//1.查询商品(数量,价格,库存等)
for(OrderDetail orderDetail:orderDTO.getOrderDetailList()){
ProductInfo productInfo = productInfoService.findOne(orderDetail.getProductId());
if(productInfo==null){//商品不存在
throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
// throw new ResponseBankException(ResultEnum.PRODUCT_NOT_EXIST);//修改状态码返回
}
//2.计算总价
orderAmount=productInfo.getProductPrice()
.multiply(new BigDecimal(orderDetail.getProductQuantity()))//相乘- 计算出一种商品的总价
.add(orderAmount);
//订单详情入库
orderDetail.setDetailId(KeyUtil.getUniqueKey());
orderDetail.setOrderId(orderId);
//商品图片,名字等
// orderDetail.setProductName(productInfo.getProductName());//不要这样写,要写很多
BeanUtils.copyProperties(productInfo,orderDetail);//拷贝对应的属性值,将productInfo的属性值拷贝到orderDetail ,所以如果有不为null的属性值,记得写在前面
orderDetailDao.save(orderDetail);
// CartDTO cartDTO = new CartDTO(orderDetail.getProductId(),orderDetail.getProductQuantity());//方式一
// cartDTOList.add(cartDTO);//方式一
//扣库存放在下面了,不污染这里的代码,请见方式二
}
//3.写入订单数据库(orderMaster和orderDetail)
OrderMaster orderMaster = new OrderMaster();
orderDTO.setOrderId(orderId);
//Spring的对象拷贝函数 - 属性值是null的也会被拷贝进去,所以如果有不为null的属性值,记得写在前面。但是注意,有点默认值也会被写回去
BeanUtils.copyProperties(orderDTO,orderMaster);//将orderDTO拷贝到orderMaster
orderMaster.setOrderAmount(orderAmount);
//这两个状态值被覆盖为null了,记得写回去
orderMaster.setOrderStatus(OrderStausEnum.NEW.getCode());
orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode());
orderMasterDao.save(orderMaster);
//4.扣库存
//方式二
//TODO 在这里,产生高并发的情况下,会出现超卖的情况 - 也就是会出现把库存扣到负数的情况
List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream().map(e->
new CartDTO(e.getProductId(),e.getProductQuantity()))
.collect(Collectors.toList());//Java8新特性 (java8 lambda) 推荐
productInfoService.decreaseStock(cartDTOList);//判断数量是否够
//发送websocket消息
webSocket.sendMessage(orderDTO.getOrderId());
return orderDTO;
}
@Override
public OrderDTO findOne(String orderId) {
OrderMaster orderMaster = orderMasterDao.findOne(orderId);
if(orderMaster == null){
throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
}
List<OrderDetail> orderDetailList= orderDetailDao.findByOrderId(orderId);
if(CollectionUtils.isEmpty(orderDetailList)){//判断orderDetailList为空
throw new SellException(ResultEnum.ORDERDETAIL_NOT_EXIST);
}
OrderDTO orderDTO = new OrderDTO();
BeanUtils.copyProperties(orderMaster,orderDTO);//拷贝
orderDTO.setOrderDetailList(orderDetailList);
return orderDTO;
}
@Override
public Page<OrderDTO> findList(String buyerOpenid, Pageable pageable) {
Page<OrderMaster> orderMasterPage = orderMasterDao.findByBuyerOpenid(buyerOpenid,pageable);//这里不需要去查询订单详情
List<OrderDTO> orderDTOList = OrderMaster2OrderDTOConverter.convert(orderMasterPage.getContent());
return new PageImpl<OrderDTO>(orderDTOList,pageable,orderMasterPage.getTotalElements());
}
@Override
public Page<OrderDTO> findList(Pageable pageable) {
Page<OrderMaster> orderMasterPage =orderMasterDao.findAll(pageable);//分页查询
List<OrderDTO> orderDTOList = OrderMaster2OrderDTOConverter.convert(orderMasterPage.getContent());
return new PageImpl<>(orderDTOList,pageable,orderMasterPage.getTotalElements());
}
/**
* 取消订单
* @param orderDTO
* @return
*/
@Override
@Transactional
public OrderDTO cancel(OrderDTO orderDTO) {
OrderMaster orderMaster = new OrderMaster();
//先判断订单状态 - 只有指定状态下的订单才能取消
if(!orderDTO.getOrderStatus().equals(OrderStausEnum.NEW.getCode())){//不是新下单的订单
log.error("[取消订单] 订单状态不正确,orderId={},orderStatus={}",orderDTO.getOrderId(),orderDTO.getOrderStatus());
throw new SellException(ResultEnum.ORDER_STATUS_ERROR);
}
//修改订单状态
orderDTO.setOrderStatus(OrderStausEnum.CANCEL.getCode());
//状态修改完再拷贝,否则orderMaster的状态还是没变的
BeanUtils.copyProperties(orderDTO,orderMaster);
OrderMaster updateResult = orderMasterDao.save(orderMaster);//进行修改订单状态
if(updateResult == null){
log.error("[取消订单] 更新失败,orderMaster={}",orderMaster);
throw new SellException(ResultEnum.ORDER_UPDATE_FAIL);
}
//返还库存
//先判断有没有商品
if(CollectionUtils.isEmpty(orderDTO.getOrderDetailList())){
log.error("[取消订单] 订单中无商品,orderDTO={}",orderDTO);
throw new SellException(ResultEnum.ORDER_DETAIL_EMPTY);
}
//lambda表达式
List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream()
.map(e->new CartDTO(e.getProductId(),e.getProductQuantity()))
没有合适的资源?快使用搜索试试~ 我知道了~
微信点餐系统-SpringBoot开发WeChatOrderSystem.zip
共375个文件
html:246个
java:92个
ftl:12个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2024-05-14
22:26:18
上传
评论
收藏 827KB ZIP 举报
温馨提示
该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
资源推荐
资源详情
资源评论
收起资源包目录
微信点餐系统-SpringBoot开发WeChatOrderSystem.zip (375个子文件)
javadoc.bat 77B
stylesheet.css 13KB
style.css 6KB
list.ftl 7KB
list.ftl 5KB
index.ftl 3KB
detail.ftl 3KB
list.ftl 2KB
create.ftl 2KB
nav.ftl 1KB
index.ftl 1KB
success.ftl 830B
error.ftl 735B
header.ftl 232B
success.ftl 107B
.gitignore 65B
index-all.html 114KB
overview-tree.html 35KB
OrderDTO.html 33KB
ProductCategory.html 26KB
ResultEnum.html 26KB
ProductInfoServiceImpl.html 25KB
WebSocket.html 24KB
OrderServiceImpl.html 22KB
SellerProductController.html 22KB
SellerOrderController.html 20KB
ProductInfo.html 19KB
ProductCategoryMapper.html 19KB
ProductCategoryServiceImpl.html 19KB
BuyerOrderController.html 18KB
PayController.html 18KB
OrderStausEnum.html 18KB
WechatController.html 17KB
HandshakeInterceptor.html 17KB
ProductStatusEnum.html 17KB
PayStatusEnum.html 17KB
SellerCategoryController.html 17KB
ProductInfoService.html 16KB
PayServiceImpl.html 15KB
SellerUserController.html 15KB
ResultVO.html 15KB
SeckillServiceImpl.html 15KB
SeckullController.html 14KB
SellExceptionHandler.html 14KB
ResponseBankException.html 14KB
OrderService.html 14KB
BuyerServiceImpl.html 14KB
CookieUtil.html 14KB
SellException.html 14KB
Date2LongSerializer.html 14KB
serialized-form.html 13KB
SellAuthorizeException.html 13KB
RedisLock.html 13KB
ResultVOUtil.html 13KB
WebSocketConfig.html 13KB
ProductCategoryMyBatisDao.html 13KB
ProductCategoryService.html 13KB
PushMessageServiceImpl.html 13KB
SellerServiceImpl.html 13KB
ProjectUrlConfig.html 13KB
OrderMaster2OrderDTOConverter.html 12KB
allclasses-frame.html 12KB
EnumUtil.html 12KB
ProductCategoryDao.html 12KB
JsonUtil.html 12KB
MathUtil.html 12KB
ProductInfo.html 12KB
OrderMasterDao.html 12KB
package-use.html 12KB
ProductInfoDao.html 12KB
WechatOpenConfig.html 12KB
WechatMpConfig.html 12KB
OrderDTO.html 12KB
BuyerProductController.html 12KB
OrderForm2OrderDTOConverter.html 12KB
OrderDetailDao.html 11KB
WechatPayConfig.html 11KB
KeyUtil.html 11KB
WeixinController.html 11KB
SellerAuthorizeAspect.html 11KB
SellerInfoDao.html 11KB
allclasses-noframe.html 11KB
ProductCategory.html 11KB
SellApplication.html 11KB
CartDTO.html 10KB
PayService.html 10KB
package-use.html 10KB
ProductVO.html 10KB
SellerInfo.html 10KB
ProductInfoVO.html 10KB
WechatAccountConfig.html 10KB
ResultVO.html 10KB
ProductCategoryForm.html 10KB
BuyerService.html 10KB
SeckillService.html 10KB
OrderMaster.html 10KB
OrderDetail.html 9KB
ProductForm.html 9KB
SellerInfo.html 9KB
OrderForm.html 9KB
共 375 条
- 1
- 2
- 3
- 4
资源评论
枫蜜柚子茶
- 粉丝: 9019
- 资源: 5350
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2011-2024年各省数字普惠金融指数数据.zip
- 数据结构排序算法:插入排序、希尔排序、冒泡排序及快速排序算法
- Nosql期末复习资料
- Python新年庆典倒计时与节日活动智能管理助手
- 塑料、玻璃、金属、纸张、木材检测36-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 系统DLL文件修复工具
- 数据结构之哈希查找方法
- Python圣诞节倒计时与节日活动管理系统
- 塑料检测23-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- PPT模板WHUT-博学之光-PPT模板
- C#上位机开发与工控通讯实战课程
- HCIA-Datacom教师笔记-数据通信基础知识及网络模型详解
- MobileNet V2 网络实现的计算机视觉大项目:8种常见茶叶病害种类识别
- 文件格式是一种撒很快的哈的东西
- Python之正则表达式基础知识
- JLINK-OB下载器的原理图和HEX文件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功