Java代码优化:重复支付订单处理
Java代码优化:重复支付订单处理
优化建议:
- 使用早期退出的方式,将判断条件为false的情况提前,减少嵌套层数。
- 将重复的代码提取为方法,避免冗余代码。
- 将多个if条件判断语句合并为一个,提高代码可读性。
- 将局部变量提前声明,增加代码可读性。
- 增加注释,方便他人理解代码逻辑。
优化后的代码:
// 参数校验
if (StringUtils.isBlank(param.getKey())) {
throw new YshopException('参数不能为空');
}
// 获取旧订单详情
String batchIdKey = redisUtils.getY(PAY_TMPLID + param.getKey());
List<OrdersDetail> oldOrderDetailList = findDetailById(batchIdKey);
// 判断旧订单是否存在
if (CollectionUtil.isNotEmpty(oldOrderDetailList)) {
OrdersDetail ordersDetail = oldOrderDetailList.get(0);
Integer payStatus = ordersDetail.getPayStatus();
Integer status = ordersDetail.getStatus();
// 校验当前订单是否支付
if (YxOrderEnum.PAY_STATUS1.getStatus().equals(payStatus)) {
throw new YshopException('订单已支付');
}
// 只有未支付、关闭订单才可以在原有订单继续支付
if (!status.equals(YxOrderEnum.status0.getStatus()) && !status.equals(YxOrderEnum.status50.getStatus())) {
oldOrderDetailList = null;
}
}
// 处理商品库存
List<YxOrderProductDto> productStockList = new ArrayList<>();
Map<Integer, YxOrderAndItemIdDto> idMap = new HashMap<>();
// 第一次支付或者重复支付key过期
if (CollectionUtil.isEmpty(oldOrderDetailList)) {
for (YxOrderProductDto yxOrderProductDto : param.getOrderProductList()) {
if (yxOrderProductDto.getQuantity() > 0) {
productStockList.add(yxOrderProductDto);
}
}
} else {
// 订单未支付处理,重复支付时修改了商品数量
for (OrdersDetail ordersDetail : oldOrderDetailList) {
YxOrderItem yxOrderItem = ordersDetail.getOrderItem();
// 旧订单商品对应的订单id和订单itemId
idMap.put(yxOrderItem.getProductId(), new YxOrderAndItemIdDto(ordersDetail.getId(), yxOrderItem.getId(), yxOrderItem.getBatchId()));
// 原来订单item的商品和传参的商品数量进行比较
for (YxOrderProductDto yxOrderProductDto : param.getOrderProductList()) {
if (yxOrderItem.getProductId().equals(yxOrderProductDto.getProductId())) {
int quantity = yxOrderProductDto.getQuantity() - yxOrderItem.getProductQuantity();
// 商品修改数量的则进行库存扣减
if (quantity != 0) {
YxOrderProductDto orderProduct = new YxOrderProductDto();
orderProduct.setProductId(yxOrderItem.getProductId());
orderProduct.setSkuId(yxOrderItem.getProductSkuId());
orderProduct.setQuantity(quantity);
productStockList.add(orderProduct);
}
break;
}
}
}
}
代码说明:
- 代码开头添加参数校验,确保传入的参数有效。
- 使用早期退出方式,将判断条件为false的情况提前,减少嵌套层数。
- 将重复的代码提取为方法,避免冗余代码。
- 将多个if条件判断语句合并为一个,提高代码可读性。
- 将局部变量提前声明,增加代码可读性。
- 增加注释,方便他人理解代码逻辑。
优化后的代码更加简洁、清晰、易于理解,并提高了代码效率。
原文地址: https://www.cveoy.top/t/topic/otpg 著作权归作者所有。请勿转载和采集!