调整异步更新库存

This commit is contained in:
DB 2023-11-01 22:32:55 +08:00
parent 0cd334cac0
commit 068b90ed89
2 changed files with 19 additions and 20 deletions

View File

@ -317,11 +317,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
.where(ORDER_DETAIL.ORDER_ID.eq(orderId)).list();
//订单数量集合
Map<String, Integer> orderNumMap = orderDetails.stream().collect(Collectors.toMap(OrderDetail::getProductRecordId, OrderDetail::getNumber));
ProductRecordService productRecordService = SpringUtils.getBean(ProductRecordService.class);
List<ProductRecord> productRecords = productRecordService.listByIds(orderDetails.stream().map(OrderDetail::getProductRecordId).collect(Collectors.toSet()));
productRecords.forEach(item -> {
item.setRecordNum(item.getRecordNum() - orderNumMap.get(item.getId()));
});
//TODO:分账先注释
ProfitSharing profitSharing = new ProfitSharing();
profitSharing.setOrderId(orderId)
@ -351,7 +346,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
.set(PROFIT_SHARING.AMOUNT, ceil.longValue()).set(PROFIT_SHARING.PROFIT_SHARING_STATUS, 1).set(PROFIT_SHARING.PAY_ACCOUNT, wxPayProperties.getSharingAccount())
.where(PROFIT_SHARING.ID.eq(profitSharing.getId())).update();
//异步更新
SpringUtils.getBean(ProductRecordSyncStockTask.class).asyncUpdateRecords(productRecords, orderNumMap);
SpringUtils.getBean(ProductRecordSyncStockTask.class).asyncUpdateRecords(orderNumMap);
} catch (WxPayException e) {
throw new ServiceException(e.getMessage());
}

View File

@ -9,11 +9,14 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.cpop.mall.business.entity.table.ProductRecordTableDef.PRODUCT_RECORD;
/**
* @author DB
@ -45,40 +48,41 @@ public class ProductRecordSyncStockTask {
/**
* @Description: 异步更新数据库
* @param productRecords 产品记录
* @param orderNumMap 产品记录库存
* @Author DB
* @Date: 2023/11/1 0:09
*/
@Async("customAsyncThreadPool")
public void asyncUpdateRecords(List<ProductRecord> productRecords, Map<String, Integer> orderNumMap) {
loopUpdateStock(productRecords, orderNumMap);
public void asyncUpdateRecords(Map<String, Integer> orderNumMap) {
loopUpdateStock(orderNumMap);
}
/**
* @param orderNumMap 库存修改记录
* @descriptions 循环插入库存修改记录
* @author DB
* @date 2023/11/01 17:01
* @param productRecords 库存修改记录
* @return: void
*/
private void loopUpdateStock(List<ProductRecord> productRecords,Map<String, Integer> orderNumMap) {
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
protected void loopUpdateStock(Map<String, Integer> orderNumMap) {
ProductRecordService productRecordService = SpringUtils.getBean(ProductRecordService.class);
//用迭代器
Iterator<ProductRecord> iterator = productRecords.iterator();
Iterator<Map.Entry<String, Integer>> iterator = orderNumMap.entrySet().iterator();
while (iterator.hasNext()) {
ProductRecord next = iterator.next();
next.setRecordNum(next.getRecordNum() - orderNumMap.get(next.getId()));
boolean update = productRecordService.updateById(next);
Map.Entry<String, Integer> next = iterator.next();
boolean update = productRecordService.updateChain()
.setRaw(PRODUCT_RECORD.RECORD_NUM, "record_num +" + next.getValue())
.where(PRODUCT_RECORD.ID.eq(next.getKey())).update();
//如果更新成功移除
if (update) {
iterator.remove();
}
}
//存在更新失败(乐观锁),需要重新更新,直到全部成功
if (!productRecords.isEmpty()){
if (!orderNumMap.isEmpty()) {
//获取最新数据进行下一次循环
loopUpdateStock(productRecordService.listByIds(productRecords.stream().map(ProductRecord::getId).collect(Collectors.toSet())),
orderNumMap);
loopUpdateStock(orderNumMap);
}
}
}