From 0cd334cac0c673923029e17000392e47403cb8ff Mon Sep 17 00:00:00 2001 From: DB <2502523450@qq.com> Date: Wed, 1 Nov 2023 20:56:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BC=82=E6=AD=A5=E6=96=B9?= =?UTF-8?q?=E6=B3=95;=E6=B7=BB=E5=8A=A0=E5=BC=82=E6=AD=A5=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/config/AsyncScheduledTaskConfig.java | 2 + .../cpop/mall/web/CpopMallWebApplication.java | 2 - .../src/main/resources/application.yml | 2 +- .../service/impl/OrderRefundServiceImpl.java | 2 +- .../service/impl/OrderServiceImpl.java | 46 ++----------------- .../task/ProductRecordSyncStockTask.java | 43 +++++++++++++++++ 6 files changed, 50 insertions(+), 47 deletions(-) diff --git a/Cpop-Core/src/main/java/com/cpop/core/config/AsyncScheduledTaskConfig.java b/Cpop-Core/src/main/java/com/cpop/core/config/AsyncScheduledTaskConfig.java index 0484218..5836703 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/config/AsyncScheduledTaskConfig.java +++ b/Cpop-Core/src/main/java/com/cpop/core/config/AsyncScheduledTaskConfig.java @@ -3,6 +3,7 @@ package com.cpop.core.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; @@ -14,6 +15,7 @@ import java.util.concurrent.ThreadPoolExecutor; * @Description: */ @Configuration +@EnableAsync public class AsyncScheduledTaskConfig { @Autowired diff --git a/Cpop-Mall/Cpop-Mall-Web/src/main/java/com/cpop/mall/web/CpopMallWebApplication.java b/Cpop-Mall/Cpop-Mall-Web/src/main/java/com/cpop/mall/web/CpopMallWebApplication.java index ba6c8c7..3f55add 100644 --- a/Cpop-Mall/Cpop-Mall-Web/src/main/java/com/cpop/mall/web/CpopMallWebApplication.java +++ b/Cpop-Mall/Cpop-Mall-Web/src/main/java/com/cpop/mall/web/CpopMallWebApplication.java @@ -3,7 +3,6 @@ package com.cpop.mall.web; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; /** @@ -11,7 +10,6 @@ import org.springframework.scheduling.annotation.EnableScheduling; */ @SpringBootApplication(scanBasePackages = {"com.cpop.**"}) @MapperScan("com.cpop.**.mapper") -@EnableAsync @EnableScheduling public class CpopMallWebApplication { diff --git a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application.yml b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application.yml index 6e00e49..fd7e98e 100644 --- a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application.yml +++ b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application.yml @@ -31,7 +31,7 @@ spring: max-file-size: 1024MB max-request-size: 300MB profiles: - active: dev,core,mall,system + active: local,core,mall,system datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderRefundServiceImpl.java b/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderRefundServiceImpl.java index 341580b..8d1d499 100644 --- a/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderRefundServiceImpl.java +++ b/Cpop-Mall/src/main/java/com/cpop/mall/business/service/impl/OrderRefundServiceImpl.java @@ -26,7 +26,6 @@ import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import static com.cpop.core.base.table.table.SysUserTableDef.SYS_USER; @@ -162,6 +161,7 @@ public class OrderRefundServiceImpl extends ServiceImpl implements productRecords.forEach(item -> { item.setRecordNum(item.getRecordNum() - orderNumMap.get(item.getId())); }); - //异步更新 - asyncUpdateRecords(productRecords, orderNumMap); //TODO:分账先注释 ProfitSharing profitSharing = new ProfitSharing(); profitSharing.setOrderId(orderId) @@ -353,50 +350,13 @@ public class OrderServiceImpl extends ServiceImpl implements profitSharingService.updateChain().set(PROFIT_SHARING.OUT_PROFIT_SHARING_ID,profitSharingResult.getOrderId()) .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); } catch (WxPayException e) { throw new ServiceException(e.getMessage()); } } - /** - * @Description: 异步更新数据库 - * @param productRecords 产品记录 - * @Author DB - * @Date: 2023/11/1 0:09 - */ - @Async("customAsyncThreadPool") - public void asyncUpdateRecords(List productRecords,Map orderNumMap) { - loopUpdateStock(productRecords, orderNumMap); - } - - /** - * @descriptions 循环插入库存修改记录 - * @author DB - * @date 2023/11/01 17:01 - * @param productRecords 库存修改记录 - * @return: void - */ - private void loopUpdateStock(List productRecords,Map orderNumMap) { - ProductRecordService productRecordService = SpringUtils.getBean(ProductRecordService.class); - //用迭代器 - Iterator iterator = productRecords.iterator(); - while (iterator.hasNext()) { - ProductRecord next = iterator.next(); - next.setRecordNum(next.getRecordNum() - orderNumMap.get(next.getId())); - boolean update = productRecordService.updateById(next); - //如果更新成功,移除 - if (update) { - iterator.remove(); - } - } - //存在更新失败,需要重新更新,直到全部成功 - if (!productRecords.isEmpty()){ - //获取最新数据进行下一次循环 - loopUpdateStock(productRecordService.listByIds(productRecords.stream().map(ProductRecord::getId).collect(Collectors.toSet())), - orderNumMap); - } - } - /** * @descriptions 取消订单 * @author DB 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 b427206..59068da 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 @@ -6,10 +6,14 @@ import com.cpop.mall.business.entity.ProductRecord; import com.cpop.mall.business.service.ProductRecordService; import com.cpop.mall.framework.constant.MallRedisConstant; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author DB @@ -38,4 +42,43 @@ public class ProductRecordSyncStockTask { }); log.info("===============================结束<--库存信息结束-->结束==============================="); } + + /** + * @Description: 异步更新数据库 + * @param productRecords 产品记录 + * @Author DB + * @Date: 2023/11/1 0:09 + */ + @Async("customAsyncThreadPool") + public void asyncUpdateRecords(List productRecords, Map orderNumMap) { + loopUpdateStock(productRecords, orderNumMap); + } + + /** + * @descriptions 循环插入库存修改记录 + * @author DB + * @date 2023/11/01 17:01 + * @param productRecords 库存修改记录 + * @return: void + */ + private void loopUpdateStock(List productRecords,Map orderNumMap) { + ProductRecordService productRecordService = SpringUtils.getBean(ProductRecordService.class); + //用迭代器 + Iterator iterator = productRecords.iterator(); + while (iterator.hasNext()) { + ProductRecord next = iterator.next(); + next.setRecordNum(next.getRecordNum() - orderNumMap.get(next.getId())); + boolean update = productRecordService.updateById(next); + //如果更新成功,移除 + if (update) { + iterator.remove(); + } + } + //存在更新失败(乐观锁),需要重新更新,直到全部成功 + if (!productRecords.isEmpty()){ + //获取最新数据进行下一次循环 + loopUpdateStock(productRecordService.listByIds(productRecords.stream().map(ProductRecord::getId).collect(Collectors.toSet())), + orderNumMap); + } + } }