持续创作,加速成长!这是我参与「掘金日新计划 · 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-api的com.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);
}
}
总结
本篇主要介绍了一下库存递减逻辑实现,还有下单操作后续步骤的实现。