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 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 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); } }