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开发的微信点餐系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 在这里使用了微信公众平台的账号和微信开放平台的账号。 需要自己去申请一些权限。 目前用到的权限有: 微信公众号的登录支付权限,消息推送权限。登录和消息推送可以在开发文档中使用测试账号。 linux服务器启动jar包项目 centos7提倡的用法 cd /ets/systemd/system 到这个目录下,新建一个 AAA.service,可以把AAA设置为项目名的 vim AAA.service 文件内容Start: [Unit] Description=AAA #描述 After=syslog.target network.target #依赖 [Service] Type=simple ExecStart=/usr/bin/java -jar /opt/javaapps/AAA.jar #前面是java命令的绝对路径 后面是jar包的绝对路径 ExecStop=/bin/kill -15 $MAINPID User=root Gr
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot开发的微信点餐系统 (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
资源评论
白话机器学习
- 粉丝: 8185
- 资源: 7687
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功