库存递减&下单操作

215 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

每日英语:

Honest disagreement is often a good sign of progress.

翻译:坦诚的分歧往往是进步的好迹象。 ——甘地

库存递减

库存递减,我们需要根据用户选择的购物车集合对象实现库存递减操作,所以mall-goods-api工程需要引入mall-cart-api依赖:

<dependencies>
    <dependency>
        <groupId>com.xz</groupId>
        <artifactId>mall-cart-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

修改mall-goods-service添加库存递减方法

1)Dao

修改com.xz.mall.goods.mapper.SkuMapper添加库存递减方法,这里使用语句级操作数据库,不可使用内存判断,操作时为了防止超卖现象, 需要判断库存数量是否足够。

public interface SkuMapper extends BaseMapper<Sku> {
​
    //库存递减
    @Update("UPDATE sku SET num=num-#{num} WHERE id=#{id} AND num>=#{num}")
    int decount(@Param("id") String skuId,@Param("num") Integer num);
}

2)Service

修改com.xz.mall.goods.service.SkuService添加库存递减接口方法

/***
 * 库存递减
 * @param carts
 */
void decount(List<Cart> carts);

修改com.xz.mall.goods.service.impl.SkuServiceImpl添加库存递减实现方法

/***
 * 库存递减
 * @param carts
 */
@Override
public void decount(List<Cart> carts) {
    for (Cart cart : carts) {
        //语句级控制,防止超卖
        int count = skuMapper.decount(cart.getSkuId(),cart.getNum());
        if(count<=0){
            throw new RuntimeException("库存不足!");
        }
    }
}

3)Controller

修改com.xz.mall.goods.controller.SkuController添加库存递减方法调用

/***
 * 库存递减
 * @param carts
 * @return
 */
@PostMapping(value = "/dcount")
public RespResult decount(@RequestBody List<Cart> carts){
    skuService.decount(carts);
    return RespResult.ok();
}

4)Feign接口创建

修改goods-apicom.xz.mall.goods.feign.SkuFeign添加接口方法

/***
 * 库存递减
 * @param carts
 * @return
 */
@PostMapping(value = "/sku/dcount")
RespResult decount(List<Cart> carts);

下单操作

下单流程比较复杂,我们需要做很多个步骤,步骤如下:

1、根据用户勾选的购物车ID查询购物车记录
2、实现库存递减
3、库存递减成功后,将购物车商品存入到订单明细中
4、添加订单
5、删除当前操作的购物车数据

1)Dao

创建com.xz.mall.order.mapper.OrderMapper

public interface OrderMapper extends BaseMapper<Order> {
}

创建com.xz.mall.order.mapper.OrderSkuMapper

public interface OrderSkuMapper extends BaseMapper<OrderSku> {
}

2)Service

接口:创建com.xz.mall.order.service.OrderService并创建下单方法

public interface OrderService extends IService<Order> {
    //添加订单
    Boolean add(Order order);
}

实现类:创建com.xz.mall.order.service.impl.OrderServiceImpl,并创建下单方法实现过程

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper,Order> implements OrderService {
​
    @Autowired
    private OrderSkuMapper orderSkuMapper;
​
    @Autowired
    private OrderMapper orderMapper;
​
    @Autowired
    private SkuFeign skuFeign;
​
    @Autowired
    private CartFeign cartFeign;
​
    /***
     * 添加订单
     */
    @Override
    public Boolean add(Order order) {
        //1.查询购物车记录
        RespResult<List<Cart>> cartResp = cartFeign.list(order.getCartIds());
        List<Cart> carts = IterableConverter.toList(cartResp.getData());
        if(carts.size()==0){
            return false;
        }
        //2.库存递减   20000  成功
        skuFeign.decount(carts);
​
        //3.增加订单明细
        int totlNum = 0;    //商品个数
        int payMoney = 0;   //支付总金额
        for (Cart cart : carts) {
            //类型转换
            OrderSku orderSku = JSON.parseObject(JSON.toJSONString(cart), OrderSku.class);
            orderSku.setId(IdWorker.getIdStr());
            orderSku.setMoney(orderSku.getPrice()*orderSku.getNum());
            orderSku.setSkuId(cart.getSkuId());
            orderSku.setOrderId(order.getId());
            orderSkuMapper.insert(orderSku);
​
            //统计数据
            totlNum+=cart.getNum();
            payMoney+=orderSku.getMoney();
        }
        //4.增加订单
        order.setTotalNum(totlNum);
        order.setMoneys(payMoney);
        orderMapper.insert(order);
​
        //5.删除购物车记录
        cartFeign.delete(order.getCartIds());
        return true;
    }
}

3)Controller

创建com.xz.mall.order.controller.OrderController,添加下单方法,并完善订单数据

@RestController
@RequestMapping(value = "/order")
public class OrderController {
​
    @Autowired
    private OrderService orderService;
​
    /***
     * 添加订单
     */
    @PostMapping
    public RespResult add(@RequestBody Order order){
        String userName = "xz";
        order.setUsername(userName);
        order.setCreateTime(new Date());
        order.setUpdateTime(order.getCreateTime());
        order.setId(IdWorker.getIdStr());
        order.setOrderStatus(0);
        order.setPayStatus(0);
        order.setIsDelete(0);
​
        //添加订单
        Boolean bo = orderService.add(order);
        return bo? RespResult.ok():RespResult.error(RespCode.SYSTEM_ERROR);
    }
}

总结

本篇主要介绍了一下库存递减逻辑实现,还有下单操作后续步骤的实现。