From 068b90ed89a642b9e22640c50521fa1ca19f3db3 Mon Sep 17 00:00:00 2001 From: DB <2502523450@qq.com> Date: Wed, 1 Nov 2023 22:32:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BC=82=E6=AD=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OrderServiceImpl.java | 9 ++---- .../task/ProductRecordSyncStockTask.java | 30 +++++++++++-------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderServiceImpl.java b/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderServiceImpl.java index eccf63c..c6aff6e 100644 --- a/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderServiceImpl.java +++ b/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderServiceImpl.java @@ -222,7 +222,7 @@ public class OrderServiceImpl extends ServiceImpl implements item.setRecordNum(item.getRecordNum() - recordNumIsEnough.get(item.getId())); }); productRecordService.updateBatch(productRecords); - //TODO:通知到云? + //TODO: 通知到云? //修改订单状态 return this.updateChain().set(ORDER.ORDER_STATUS, 3).where(ORDER.ID.eq(orderId)).update(); @@ -317,11 +317,6 @@ public class OrderServiceImpl extends ServiceImpl implements .where(ORDER_DETAIL.ORDER_ID.eq(orderId)).list(); //订单数量集合 Map orderNumMap = orderDetails.stream().collect(Collectors.toMap(OrderDetail::getProductRecordId, OrderDetail::getNumber)); - ProductRecordService productRecordService = SpringUtils.getBean(ProductRecordService.class); - List 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 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()); } diff --git a/Cpop-Mall/src/main/java/com/cpop/mall/business/task/ProductRecordSyncStockTask.java b/Cpop-Mall/src/main/java/com/cpop/mall/business/task/ProductRecordSyncStockTask.java index 59068da..34695b5 100644 --- a/Cpop-Mall/src/main/java/com/cpop/mall/business/task/ProductRecordSyncStockTask.java +++ b/Cpop-Mall/src/main/java/com/cpop/mall/business/task/ProductRecordSyncStockTask.java @@ -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 productRecords, Map orderNumMap) { - loopUpdateStock(productRecords, orderNumMap); + public void asyncUpdateRecords(Map orderNumMap) { + loopUpdateStock(orderNumMap); } /** + * @param orderNumMap 库存修改记录 * @descriptions 循环插入库存修改记录 * @author DB * @date 2023/11/01 17:01 - * @param productRecords 库存修改记录 * @return: void */ - private void loopUpdateStock(List productRecords,Map orderNumMap) { + @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED) + protected void loopUpdateStock(Map orderNumMap) { ProductRecordService productRecordService = SpringUtils.getBean(ProductRecordService.class); //用迭代器 - Iterator iterator = productRecords.iterator(); + Iterator> 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 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); } } }