生成订单和订单快照必须同时执行,或者同时失败
Posted SmallCuteMonkey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成订单和订单快照必须同时执行,或者同时失败相关的知识,希望对你有一定的参考价值。
生成订单的相关操作
-
保存订单的步骤
-
查询选中购买的购物车详情
-
校验库存
-
保存订单
-
保存订单快照
-
购买成功需要删除购物车记录
-
可以知道这四个步骤需要同时成功或者同时失败,符合一个事务的操作(ACID)
加上这个Transactional注解用在方法上面可以使用这个操作具有事务的特征,同时成功,同时失败,
@Transactional
public ResultVO addOrder(List<Integer> cids, Orders orders) {
// 根据cids查询购物车的详情记录(包括库存)
List<ShoppingCartVO> shoppingCartVOList = shoppingCartMapper.selectShoppingcartByids(cids);
// 校验库存
boolean f=true;
String untitled="";
for (ShoppingCartVO sc :shoppingCartVOList
) {
if(Integer.valueOf(sc.getCartNum())>sc.getStock()){
f=false;
}
// 获取所有的商品名称,以,分割拼接成字符串
untitled=untitled+sc.getProductName()+",";
}
if(f){
// 表示库存充足进行保存
// 1.userId 2 untitled名称 3 收件人地址,姓名,电话,地址
// 4. 总价格 5.支付方式
// 6.创建 订单的时间
// 7.订单初始状态 1 待支付
orders.setStatus(1);
orders.setUntitled(untitled);
orders.setCreateTime(new Date());
orders.setCancelTime(new Date());
orders.setDeliveryTime(new Date());
// 生成订单编号
String orderId = UUID.randomUUID().toString().replace("-", "");
orders.setOrderId(orderId);
// 保存订单
int i=ordersMapper.insert(orders);
if(i>0){
// ordersItem 生成商品快照
// List<OrdersItem> ordersItemList=new ArrayList<>();
for (ShoppingCartVO sc :shoppingCartVOList) {
// 生成订单的编号
int cnum=Integer.valueOf(sc.getCartNum());
String itemid=System.currentTimeMillis()+(new Random().nextInt(9999)+100)+"";
String itemid1 = itemid.substring(1, 10);
// 注意一下double需要转换为Bigdecimal类型
// public OrdersItem(Integer orderId, Integer productId,
// String productName,
// String productImg, Integer skuId, String skuName,
// BigDecimal productPrice, Integer buyCounts,
// BigDecimal totalAmount, Date basketDate, Date buyTime,
// Integer isComment)
int itemid2=Integer.parseInt(itemid1);
OrdersItem ordersItem= new OrdersItem();
ordersItem.setOrderId(itemid2);
ordersItem.setProductId(Integer.valueOf(sc.getProductId()));
ordersItem.setProductName(sc.getProductName());
ordersItem.setProductImg(sc.getProductImg());
ordersItem.setSkuId(Integer.valueOf(sc.getSkuId()));
ordersItem.setSkuName(sc.getSkuName());
System.out.println(sc.getSellPrice());
ordersItem.setProductPrice(new BigDecimal(String.valueOf(sc.getProductPrice())));
ordersItem.setBuyCounts(cnum);
ordersItem.setTotalAmount(sc.getProductPrice());
ordersItem.setBasketDate(new Date());
ordersItem.setBuyTime(new Date());
ordersItem.setIsComment(0);
// ordersItemList.add(ordersItem);
int m=ordersItemMapper.insert(ordersItem);
}
// int j = ordersItemMapper.insertList(ordersItemList);
// 扣减库存???
// 根据套餐Id修改库存量
for (ShoppingCartVO sc :shoppingCartVOList
) {
String skuId = sc.getSkuId();
int newStock=sc.getStock()-Integer.valueOf(sc.getCartNum());
// Example example = new Example(ProductSku.class);
// Example.Criteria criteria = example.createCriteria();
// criteria.andEqualTo("skuId",skuId);
// ProductSku productSku = productSkuMapper.selectByPrimaryKey(skuId);
ProductSku productSku=new ProductSku();
productSku.setSkuId(skuId);
productSku.setStock(String.valueOf(newStock));
// productSku.setSkuImg(null);
productSkuMapper.updateByPrimaryKeySelective(productSku);
}
return new ResultVO(ResultStatus.NO,"下单成功",orderId);
}
}else{
// 不足
return new ResultVO(ResultStatus.NO,"库存不足下单失败",null);
}
return null;
}
以上是关于生成订单和订单快照必须同时执行,或者同时失败的主要内容,如果未能解决你的问题,请参考以下文章