168 lines
5.8 KiB
Java
168 lines
5.8 KiB
Java
package com.sky.service.impl;
|
||
|
||
import com.alibaba.fastjson.JSONObject;
|
||
import com.sky.constant.MessageConstant;
|
||
import com.sky.context.BaseContext;
|
||
import com.sky.dto.OrdersPaymentDTO;
|
||
import com.sky.dto.OrdersSubmitDTO;
|
||
import com.sky.entity.*;
|
||
import com.sky.exception.AddressBookBusinessException;
|
||
import com.sky.exception.OrderBusinessException;
|
||
import com.sky.exception.ShoppingCartBusinessException;
|
||
import com.sky.mapper.*;
|
||
import com.sky.service.OrderService;
|
||
import com.sky.utils.WeChatPayUtil;
|
||
import com.sky.vo.OrderPaymentVO;
|
||
import com.sky.vo.OrderSubmitVO;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.BeanUtils;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
import org.springframework.transaction.annotation.Transactional;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.time.LocalDateTime;
|
||
import java.util.ArrayList;
|
||
import java.util.List;
|
||
|
||
@Service
|
||
@Slf4j
|
||
public class OrderServiceImpl implements OrderService {
|
||
|
||
@Autowired
|
||
private OrderMapper orderMapper;
|
||
@Autowired
|
||
private AddressBookMapper addressBookMapper;
|
||
@Autowired
|
||
private ShoppingCartMapper shoppingCartMapper;
|
||
@Autowired
|
||
private OrderDetailMapper orderDetailMapper;
|
||
@Autowired
|
||
private UserMapper userMapper;
|
||
@Autowired
|
||
private WeChatPayUtil weChatPayUtil;
|
||
|
||
@Override
|
||
@Transactional
|
||
public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {
|
||
//handle exception situation(address book is empty, shopping cart is empty)
|
||
AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId());
|
||
if (addressBook == null) {
|
||
throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);
|
||
}
|
||
|
||
Long userId = BaseContext.getCurrentId();
|
||
ShoppingCart shoppingCart = new ShoppingCart();
|
||
shoppingCart.setUserId(userId);
|
||
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
|
||
if (list == null || list.isEmpty()) {
|
||
throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);
|
||
}
|
||
|
||
//insert data into orders table
|
||
Orders orders = new Orders();
|
||
BeanUtils.copyProperties(ordersSubmitDTO, orders);
|
||
orders.setUserId(userId);
|
||
orders.setOrderTime(LocalDateTime.now());
|
||
orders.setPayStatus(Orders.UN_PAID);
|
||
orders.setStatus(Orders.PENDING_PAYMENT);
|
||
orders.setNumber(userId + "-" + System.currentTimeMillis());
|
||
orders.setPhone(addressBook.getPhone());
|
||
orders.setUserName(addressBook.getConsignee());
|
||
orders.setAddress(addressBook.getDetail());
|
||
|
||
orderMapper.insert(orders);
|
||
|
||
//insert data into data_detail table
|
||
List<OrderDetail> orderDetails = new ArrayList<>();
|
||
for (ShoppingCart cart : list) {
|
||
OrderDetail orderDetail = new OrderDetail();
|
||
BeanUtils.copyProperties(cart, orderDetail);
|
||
orderDetail.setOrderId(orders.getId());
|
||
orderDetails.add(orderDetail);
|
||
}
|
||
orderDetailMapper.insertBatch(orderDetails);
|
||
|
||
//clear the shopping cart of current user
|
||
shoppingCartMapper.deleteByUserId(userId);
|
||
|
||
//construct OrderSubmitVO
|
||
return OrderSubmitVO.builder()
|
||
.id(orders.getId())
|
||
.orderTime(orders.getOrderTime())
|
||
.orderNumber(orders.getNumber())
|
||
.orderAmount(orders.getAmount())
|
||
.build();
|
||
}
|
||
|
||
/**
|
||
* 订单支付
|
||
*
|
||
* @param ordersPaymentDTO
|
||
* @return
|
||
*/
|
||
public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
|
||
// 当前登录用户id
|
||
|
||
/*Long userId = BaseContext.getCurrentId();
|
||
User user = userMapper.getById(userId);
|
||
|
||
//调用微信支付接口,生成预支付交易单
|
||
JSONObject jsonObject = weChatPayUtil.pay(
|
||
ordersPaymentDTO.getOrderNumber(), //商户订单号
|
||
new BigDecimal(0.01), //支付金额,单位 元
|
||
"苍穹外卖订单", //商品描述
|
||
user.getOpenid() //微信用户的openid
|
||
);
|
||
|
||
if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
|
||
throw new OrderBusinessException("该订单已支付");
|
||
}*/
|
||
|
||
JSONObject jsonObject = new JSONObject();
|
||
jsonObject.put("code","ORDERPAID");
|
||
|
||
OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
|
||
vo.setPackageStr(jsonObject.getString("package"));
|
||
|
||
//为替代微信支付成功后的数据库订单状态更新,多定义一个方法进行修改
|
||
|
||
Integer OrderPaidStatus = Orders.PAID; //支付状态,已支付
|
||
|
||
Integer OrderStatus = Orders.TO_BE_CONFIRMED; //订单状态,待接单
|
||
|
||
|
||
//发现没有将支付时间 check_out属性赋值,所以在这里更新
|
||
|
||
LocalDateTime check_out_time = LocalDateTime.now();
|
||
|
||
|
||
Long orderId = orderMapper.getByNumber(ordersPaymentDTO.getOrderNumber()).getId();
|
||
orderMapper.updateStatus(OrderStatus, OrderPaidStatus, check_out_time, orderId);
|
||
|
||
return new OrderPaymentVO();
|
||
}
|
||
|
||
/**
|
||
* 支付成功,修改订单状态
|
||
*
|
||
* @param outTradeNo
|
||
*/
|
||
public void paySuccess(String outTradeNo) {
|
||
|
||
// 根据订单号查询订单
|
||
Orders ordersDB = orderMapper.getByNumber(outTradeNo);
|
||
|
||
// 根据订单id更新订单的状态、支付方式、支付状态、结账时间
|
||
Orders orders = Orders.builder()
|
||
.id(ordersDB.getId())
|
||
.status(Orders.TO_BE_CONFIRMED)
|
||
.payStatus(Orders.PAID)
|
||
.checkoutTime(LocalDateTime.now())
|
||
.build();
|
||
|
||
orderMapper.update(orders);
|
||
}
|
||
|
||
}
|