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开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot开发.zip微信点餐系统-SpringBoot
资源推荐
资源详情
资源评论
收起资源包目录
微信点餐系统-SpringBoot开发.zip (372个子文件)
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
共 372 条
- 1
- 2
- 3
- 4
资源评论
白如意i
- 粉丝: 1w+
- 资源: 3209
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MATLAB仿真bp神经网络预测电力负荷 形式:程序 实现功能:使用前几日负荷数据预测未来负荷数据 使用bp神经网络 得到误差分析图
- MATLAB仿真QPSK调制信号通过AWGN信道的误符号率和误比特率分析 形式:程序 程序实现功能: 仿真正交相移键控QPSK信号调制的基带数字通信系统通过AWGN信道的误符号率(SER)和误比特率(
- VMware-workstation-17.5.2下载
- (2025)高级电工证考试题及答案.doc
- (2025)工会知识竞赛题库(含参考答案.pptx
- (2025)工业机器人考试题库及答案.doc
- (2025)公务员考试必考知识点总结.doc
- (2025)公务员考试常识必考知识点总结.doc
- (2025)公共卫生基本知识考试题库及答案.doc
- (2025)公务员廉政知识考试题库及答案.doc
- (2025)公务员面试万能模板(完美版).doc
- (2025)管理人员安全质量培训考试题库及答案.doc
- (2025)焊工理论知识考试题及答案.doc
- (2025)护理三基考试题库(含答案).doc
- (2025)计算机网络技术考试题(含答案).doc
- (2025)基本公共卫生服务项目考试题库(含答案).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功