81,092
社区成员
发帖
与我相关
我的任务
分享
@Override
public ResponseContent orderProview(String userId, List<IdAndNum> list) {
Integer itemsSum = 0; // 商品总数
if (CollectionUtils.isEmpty(list)) {
throw new ErrorOperationException("订单生成失败!请确认商品:["+list+"] 是否存在!");
}
List<String> ids = new ArrayList<>(); // 用于存储请求购买的商品编号集合
Map<String, Integer> map = new HashMap<>(); // 使用Map来储存商品编号、购买数量
for (IdAndNum idAndNum : list) {
itemsSum += idAndNum.getNum(); // 记录商品总数
ids.add(idAndNum.getId()); // 记录用户购买的商品编号
map.put(idAndNum.getId(), idAndNum.getNum());// key=商品编号, value=购买数量
}
System.out.println("ids : " + ids);
// 2.创建Example查询
Example example = new Example(ShopItems.class); // ShopItems.java : 商品类
example.createCriteria().andIn("itemId", ids); // 查询自定商品编号范围内的商品数据
// 3.通过商品编号集合查询所有的商品数据
List<ShopItems> items = itemsMapper.selectByExample(example);
if (CollectionUtils.isEmpty(items)) {
return null;
}
// 4.遍历查询到的商品数据
for (int i = 0; i < items.size(); i++) {
String itemId = items.get(i).getItemId(); // 拿到商品编号
// 当库存为0 或 库存小于购买量时,抛出异常
if (items.get(i).getNum() <= 0 || map.get(itemId) > items.get(i).getNum()) {
throw new DataBaseException("订单生成失败,因为编号为 [" + itemId +
"] 的商品仅剩库存为" + items.get(i).getNum()+"件了");
}
list.remove(itemId); // 将商品
}
if (list == null || list.size() <= 0) { // 未删除的 商品即为查询不出来的商品
// 如果list集合中还有数据,抛出异常信息
throw new ErrorOperationException("商品 : " + list + "不能购买,请确认这些商品是否已经下架!");
}
BigDecimal totalMoney = new BigDecimal("0"); // 计算商品的总价
// 销量++,库存--
for (ShopItems item : items) {
Integer num = map.get(item.getItemId());
Example e2 = new Example(ShopItems.class);
e2.createCriteria().andEqualTo("itemId", item.getItemId());
// 销量++
item.setVolume(item.getVolume() + num);
// 库存--
item.setNum(item.getNum() - num);
// item.setVersion(item.getVersion()+1); // 版本号++...
itemsMapper.updateByExampleSelective(item,e2);
totalMoney.add(item.getCurrPrice());
}
// 往订单表中插入数据
ShopOrders orders = new ShopOrders();
orders.setCreateTime(new Date());
orders.setStatus((byte) 1); // 1:待付款
orders.setuId(userId);
orders.setPayment(totalMoney);
String orderId = UUIDUtils.getUUID();
orders.setOrderId(orderId);
int i = ordersMapper.insertSelective(orders);
if (i <= 0) throw new DataBaseException("订单数据生存失败!");
// 往订单商品中间表中插入数据
for (int j = 0; j < items.size(); j++) {
ShopOrdersItemsMid orderItems = new ShopOrdersItemsMid();
orderItems.setOrdersItemMinId(UUIDUtils.getUUID()); // 编号
orderItems.setItemId(items.get(j).getItemId()); // 商品编号
orderItems.setNum(map.get(items.get(j).getItemId())); // 商品数量
orderItems.setOrderId(orderId); // 订单号
orderItems.setItemName(items.get(j).getName()); // 商品名
orderItems.setPrice(items.get(j).getCurrPrice()); // 商品单价
orderItems.setuId(userId);
// 执行插入操作
midMapper.insertSelective(orderItems);
}
// 返回数据封装
PreSettlement settlement = new PreSettlement(); // PreSettlement.java : 封装了商品总数,订单总价,商品集合等等数据。。。
// 商品总个数
settlement.setItemsSum(itemsSum);
// 订单号
settlement.setOrderId(orderId);
// 商品总价
settlement.setTotalMoney(totalMoney);
// 商品集合
settlement.setItemsList(items);
return ResponseUtil.okContent(settlement, null);
}