@PutMapping public Result<?> update(@RequestBody Order order) { orderService.updateById(order); return Result.success(); }续写优化之后,取消订单,商品数量恢复,个人余额恢复 /** * 付款 * @param id * @return */ @Transactional @PutMapping("/pay/{id}") public Result<?> pay(@PathVariable Long id) { Order order = orderService.getById(id); BigDecimal totalPrice = order.getTotalPrice(); Long userId = getUser().getId(); User user = userService.findById(userId); if (user.getAccount().compareTo(totalPrice) <= 0) { throw new CustomException("-1", "余额不足"); } user.setAccount(user.getAccount().subtract(totalPrice)); // 设置用户余额 order.setFreeze(order.getTotalPrice()); userService.updateById(user); order.setState("待发货"); orderService.updateById(order); return Result.success(); }
时间: 2023-06-07 08:10:53 浏览: 59
对于这段代码,我会建议在取消订单时,再次检查订单状态是否为待支付状态,如果不是,则不允许取消订单。在商品数量恢复和个人余额恢复时,建议使用事务来完成操作,避免出现数据不一致的情况。同时,在更新用户余额时,建议使用数据库的原子性操作,如update ... set account = account - totalPrice where user_id = userId,避免并发操作导致的数据不一致问题。
相关问题
@Service @Transactional public class OrderServiceImpl implements OrderService { @Autowired private OrderDao orderDao; @Override public boolean saveOrder(Order order) { return orderDao.insert(order)>0; } @Override public List<Order> getByUserId(Long userId) { return orderDao.selectUserId(userId); } }
这是一个订单服务的实现类,实现了订单相关的业务方法。具体来说,该类使用了 @Service 注解将它标识为一个 Spring 服务,使用了 @Transactional 注解开启了事务管理。
在类中,使用了 @Autowired 注解自动注入了 OrderDao 对象,用于操作订单表。该注解可以帮助开发者简化对象的创建和管理,提高了代码的可维护性。
同时,该类实现了 OrderService 接口中定义的两个方法,包括:
- saveOrder(Order order):保存订单信息,返回一个 boolean 类型的结果,表示操作是否成功。在方法中,调用了 OrderDao 对象的 insert 方法,插入订单信息到数据库中。
- getByUserId(Long userId):根据用户 ID 查询订单信息,返回一个 Order 对象的列表。在方法中,调用了 OrderDao 对象的 selectUserId 方法,查询指定用户 ID 的所有订单信息。
通过这些方法,可以很方便地实现订单的保存和查询等操作,同时使用了事务管理来保证数据的一致性。
public Result<?> save(@RequestBody Order order) { // order.setFlow(order.getFlow()); order.setUserId(getUser().getId()); order.setOrderNo(DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomNumbers(6)); order.setCreateTime(DateUtil.now()); String cartsStr = order.getCarts(); List<Cart> carts = JSONUtil.toBean(cartsStr, new TypeReference<List<Cart>>() { }, true); orderService.save(order); for (Cart cart : carts) { Integer count = cart.getCount(); Long goodsId = cart.getGoodsId(); // 扣库存 Goods goods = goodsService.getById(goodsId); if(goods.getStore() - cart.getCount() < 0) { throw new CustomException("-1", "库存不足"); } goods.setStore(goods.getStore() - cart.getCount()); goods.setSales(goods.getSales() + cart.getCount()); goodsService.updateById(goods); OrderGoods orderGoods = new OrderGoods(); orderGoods.setOrderId(order.getId()); orderGoods.setGoodsId(goodsId); orderGoods.setCount(count); orderGoodsService.save(orderGoods); } if (order.getType() == 1) { // 1表示购物车,0表示直接购买 // 提交订单时清空个人的购物车商品 cartService.remove(Wrappers.<Cart>lambdaUpdate().eq(Cart::getUserId, getUser().getId())); } return Result.success(order); // return Result.success(orderService.save(order)); }
这段代码看起来像是一个在后端处理用户订单的方法,其中对应着的请求体就是包含着商品信息的订单对象。这个方法接收这个订单对象之后,处理了其中一些信息,比如设置了用户id、订单编号、创建时间等等。然后这个方法又把这个订单对象保存到数据库中,之后又遍历了一下其中的商品信息,通过商品id来寻找对应的商品,然后扣除相应的库存和增加相应的销量。最后还会把这些订单中的商品信息保存到数据库中,之后,如果这个订单是属于购物车类型的话,就会清空当前用户的购物车里面的商品。最后这个方法会通过返回一个包含订单信息的Result对象来告诉调用者这个方法是否执行成功。