diff --git a/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java b/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java index aec0895..18eebdb 100644 --- a/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDailyUserTradeServiceImpl.java @@ -43,6 +43,8 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -70,6 +72,8 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl TENANT_LB_DAILY_TRADE_IMPORT_LOCKS = new ConcurrentHashMap<>(); @Autowired private ILbDailyUserTradeReportService lbDailyUserTradeReportService; @@ -197,6 +201,13 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl new ReentrantLock()); + if (!tenantImportLock.tryLock()) { + result.put("success", false); + result.put("message", "该租户已有导入任务正在执行,请等待完成后再试,避免重复写入数据"); + return result; + } String previousTenantId = TenantContextHolder.getTenantId(); TenantContextHolder.setTenantId(normalizedTenantId); try { @@ -223,6 +234,8 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl importList = new ArrayList<>(); List skippedRows = new ArrayList<>(); int skippedHiddenRows = 0; + /** 表头以下:非空行且非隐藏行,即参与解析的 Excel 行数(含解析失败/跳过的行) */ + int excelTableRowCount = 0; DataFormatter dataFormatter = new DataFormatter(); log.info("开始导入Excel,fileName={}, size={} bytes, defaultReportDate={}", originalFilename, file.getSize(), defaultReportDate); @@ -247,12 +260,12 @@ public class LbDailyUserTradeServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(LbDailyUserTrade::getTenantId, tenantId) - .eq(LbDailyUserTrade::getNickname, nickname.trim()) - .orderByDesc(LbDailyUserTrade::getUpdatedAt) - .last("limit 1"); - return this.getOne(wrapper, false); - } - private boolean isEmptyRow(Row row, DataFormatter formatter) { if (row == null) { return true;