Jelajahi Sumber

历史数据导入并发问题处理

Zhangbw 1 bulan lalu
induk
melakukan
c260a93961

+ 9 - 0
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/controller/StockPoolHistoryController.java

@@ -103,6 +103,15 @@ public class StockPoolHistoryController extends BaseController {
         return R.ok(message);
     }
 
+    /**
+     * 检查异步任务处理状态
+     */
+    @GetMapping("/checkProcessing")
+    public R<Boolean> checkProcessing() {
+        boolean isProcessing = com.yingpai.stock.service.impl.StockPoolAsyncServiceImpl.isProcessing();
+        return R.ok(isProcessing);
+    }
+
     /**
      * 下载导入模版
      * 格式:第一行为时间信息,第二行为标题,第三行开始为数据

+ 16 - 0
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/service/impl/StockPoolAsyncServiceImpl.java

@@ -27,9 +27,22 @@ public class StockPoolAsyncServiceImpl implements IStockPoolAsyncService {
     private final StockPoolHistoryMapper stockPoolHistoryMapper;
     private final IStockPoolService stockPoolService;
 
+    // 异步任务执行标志(静态变量,全局共享)
+    private static volatile boolean isProcessing = false;
+
+    /**
+     * 检查是否有异步任务正在执行
+     */
+    public static boolean isProcessing() {
+        return isProcessing;
+    }
+
     @Override
     @Async
     public void asyncProcessAfterImport(LocalDate importDate) {
+        // 设置处理标志
+        isProcessing = true;
+
         log.info("[异步处理] 开始执行导入后的耗时操作,导入日期: {}, 线程: {}",
             importDate, Thread.currentThread().getName());
 
@@ -62,6 +75,9 @@ public class StockPoolAsyncServiceImpl implements IStockPoolAsyncService {
 
         log.info("[异步处理] 导入后的耗时操作全部完成,导入日期: {}, 线程: {}",
             importDate, Thread.currentThread().getName());
+
+        // 重置处理标志
+        isProcessing = false;
     }
 
     /**

+ 5 - 0
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/service/impl/StockPoolHistoryServiceImpl.java

@@ -93,6 +93,11 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String importData(MultipartFile file, String recordDate, Boolean updateSupport) throws Exception {
+        // 检查是否有异步任务正在执行
+        if (StockPoolAsyncServiceImpl.isProcessing()) {
+            throw new RuntimeException("上一次导入的数据处理尚未完成,请稍后再试");
+        }
+
         // 解析记录日期
         LocalDate parsedRecordDate;
         try {