目录
- 苍穹外卖day08
- 一:导入地址簿代码
- 二:用户下单
- 三:微信支付
苍穹外卖day08
一:导入地址簿代码
很简单就是单表的增删改查,这里不做过多的赘述了;
二:用户下单
这里用户下单所涉及到的参数比较多啊,看起来比较复杂,但也就只是复杂点而已,理清楚了写起来不是很难:
controller:
@PostMapping("/submit")
public Result submit(@RequestBody OrdersSubmitDTO ordersSubmitDTO){OrderSubmitVO submitVO= orderService.submit(ordersSubmitDTO);return Result.success(submitVO);
}
这里接收了一个dto对象,然后返回一个vo对象;
service:
我们用户下单,首先是要将下单的数据插入到订单表,其次还要把菜品的数据插入到订单详细表,涉及到两个表,我们要使用事务:
@Override
@Transactional
public OrderSubmitVO submit(OrdersSubmitDTO ordersSubmitDTO) {//处理异常情况://1:地址簿为空:Long addressBookId = ordersSubmitDTO.getAddressBookId();AddressBook addressBook = addressBookMapper.getById(addressBookId);if (addressBook == null) {throw new OrderBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);}//2:用户提交的订单数据为空:Long id = BaseContext.getCurrentId();List<ShoppingCart> shoppingCarts = shopCartMapper.selectById(id);if (shoppingCarts == null && shoppingCarts.size() == 0) {throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);}//---------------------------------------------------------------------------Orders orders = new Orders();//拷贝信息BeanUtils.copyProperties(ordersSubmitDTO, orders);orders.setUserId(id);orders.setStatus(Orders.PENDING_PAYMENT);orders.setPayStatus(Orders.UN_PAID);orders.setOrderTime(LocalDateTime.now());//获取地址簿信息orders.setAddress(addressBook.getProvinceName() + addressBook.getCityName() +addressBook.getDistrictName() + addressBook.getDetail());orders.setPhone(addressBook.getPhone());orders.setConsignee(addressBook.getConsignee());// 获取订单号orders.setNumber(String.valueOf(System.currentTimeMillis()));// 获取用户名orderMapper.insert(orders);//获取订单细节信息//1:查询购物车:List<OrderDetail> orderDetails = new ArrayList<>();for (ShoppingCart shoppingCart : shoppingCarts) {OrderDetail orderDetail = new OrderDetail();orderDetail.setOrderId(orders.getId());BeanUtils.copyProperties(shoppingCart, orderDetail);orderDetails.add(orderDetail);}ordeiDetailMapper.insert(orderDetails);//清空购物车:shopCartMapper.clean(id);//封装OrderSubmitVO对象OrderSubmitVO submitVO = new OrderSubmitVO();submitVO.setId(orders.getId());submitVO.setOrderAmount(orders.getAmount());submitVO.setOrderTime(orders.getOrderTime());submitVO.setOrderNumber(orders.getNumber());return submitVO;
}
首先我们要进行业务异常的处理。一个是地址簿为空,一个是购物车为空,地址簿通过传入的addressid来关联地址簿表,然后购物车通过线程存储的用户id来查询,判断为空就抛出异常,然后就对订单数据进行赋值,首先从传入的对象直接进行拷贝,然后就是订单号是我们的当前时间的毫秒数,然后从之前查询出的地址簿中获取用户其他信息,然后对信息进行赋值,最后插入到订单表中:
这里还要注意一点,就是订单表的id值我们要进行回显,因为下面封装vo对象和插入订单细节时要适用:
@Options(useGeneratedKeys = true,keyProperty = "id") @Insert("insert into sky_take_out.orders (number, status, user_id, address_book_id, order_time, " +"checkout_time, pay_method, pay_status, amount, remark, phone, address, user_name, consignee," +" cancel_reason, rejection_reason, cancel_time, estimated_delivery_time, " +"delivery_status, delivery_time, pack_amount, tableware_number, tableware_status) VALUES " +"(#{number}, #{status}, #{userId}, #{addressBookId}, #{orderTime}," +" #{checkoutTime}, #{payMethod}, #{payStatus}, #{amount}, #{remark}, #{phone}, " +"#{address}, #{userName}, #{consignee}, #{cancelReason}, #{rejectionReason}, " +"#{cancelTime}, #{estimatedDeliveryTime}, #{deliveryStatus}, #{deliveryTime}, " +"#{packAmount}, #{tablewareNumber}, #{tablewareStatus})") void insert(Orders orders);
然后就是插入细节数据,细节数据中,其实和购物车中的属性一样,我们直接对购物车数据进行拷贝,外加上对订单id进行赋值,这是一个逻辑外键嘛,然后因为购物车是一个集合,一个购物车对应一个详细信息,所以我们使用集合来存储订单详细数据,最后将集合进行插入,使用动态sql-foreach:
<insert id="insert">insert into sky_take_out.order_detail (name, image, order_id, dish_id, setmeal_id, dish_flavor, amount)VALUES<foreach collection="orderDetails" item="orderDetail" separator=",">(#{orderDetail.name}, #{orderDetail.image}, #{orderDetail.orderId}, #{orderDetail.dishId}, #{orderDetail.setmealId}, #{orderDetail.dishFlavor}, #{orderDetail.amount})</foreach> </insert>
然后在对vo对象封装返回;
mapper:
见上;
三:微信支付
这里因为没有营业执照,我选择跳过支付选项,直接修改数据库数据:
具体参考:
三:微信支付
这里因为没有营业执照,我选择跳过支付选项,直接修改数据库数据:
具体参考:
苍穹外卖解决无法微信支付问题(超简单!)-CSDN博客