diff --git a/src/main/java/com/threecloud/dataserviceyy/mapper/MidVoiceCallRecordMapper.java b/src/main/java/com/threecloud/dataserviceyy/mapper/MidVoiceCallRecordMapper.java index 9b29032..ac68277 100644 --- a/src/main/java/com/threecloud/dataserviceyy/mapper/MidVoiceCallRecordMapper.java +++ b/src/main/java/com/threecloud/dataserviceyy/mapper/MidVoiceCallRecordMapper.java @@ -26,6 +26,14 @@ public interface MidVoiceCallRecordMapper { * 根据通话记录ID查询(防止重复插入) */ MidVoiceCallRecord selectByCallRecordId(@Param("callRecordId") String callRecordId); + + /** + * 批量查询某设备在时间范围内的已存在call_record_id + * 用于防重复:一次查询代替N次单条查询 + */ + List selectExistingCallRecordIds(@Param("deviceNo") String deviceNo, + @Param("startTime") String startTime, + @Param("endTime") String endTime); /** * 根据设备编码查询 diff --git a/src/main/java/com/threecloud/dataserviceyy/service/VaaSyncService.java b/src/main/java/com/threecloud/dataserviceyy/service/VaaSyncService.java index 737e7f0..7559f9e 100644 --- a/src/main/java/com/threecloud/dataserviceyy/service/VaaSyncService.java +++ b/src/main/java/com/threecloud/dataserviceyy/service/VaaSyncService.java @@ -175,6 +175,13 @@ public class VaaSyncService { } logger.info("【设备】获取到 {} 条录音记录", records.size()); + // 批量查询已存在的call_record_id(一次查询代替N次,防重复性能优化) + String startTimeStr = DateUtil.formatDate(lastSyncTime, "yyyy-MM-dd HH:mm:ss"); + String endTimeStr = DateUtil.formatDate(now, "yyyy-MM-dd HH:mm:ss"); + Set existingIds = new HashSet<>(callRecordMapper.selectExistingCallRecordIds( + deviceNo, startTimeStr, endTimeStr)); + logger.debug("【设备】已存在 {} 条通话记录,将跳过", existingIds.size()); + // 步骤5:逐条处理录音 int successCount = 0; int failCount = 0; @@ -184,7 +191,7 @@ public class VaaSyncService { JSONObject rec = records.getJSONObject(i); try { Date callTime = processSingleRecord(rec, deviceNo, cityName, cityCode, orgCode, - deviceHost, authToken, extNumbers); + deviceHost, authToken, extNumbers, existingIds); if (callTime != null) { successCount++; if (latestCallTime == null || callTime.after(latestCallTime)) { @@ -212,7 +219,8 @@ public class VaaSyncService { */ private Date processSingleRecord(JSONObject rec, String deviceNo, String cityName, String cityCode, String orgCode, String deviceHost, - String authToken, Map extNumbers) throws Exception { + String authToken, Map extNumbers, + Set existingIds) throws Exception { // 解析录音信息 String recordId = RecordParser.parseRecordId(rec); String filePath = RecordParser.parseFilePath(rec); @@ -231,9 +239,9 @@ public class VaaSyncService { return null; } - // 防重复:根据 device_no + record_id 判断 + // 防重复:内存中比对已存在的call_record_id(一次查询代替N次) String callRecordId = deviceNo + "_" + recordId; - if (callRecordMapper.selectByCallRecordId(callRecordId) != null) { + if (existingIds.contains(callRecordId)) { logger.debug("【录音】已存在,跳过: {}", callRecordId); return null; } diff --git a/src/main/resources/mapper/MidVoiceCallRecordMapper.xml b/src/main/resources/mapper/MidVoiceCallRecordMapper.xml index 6be0d39..0032322 100644 --- a/src/main/resources/mapper/MidVoiceCallRecordMapper.xml +++ b/src/main/resources/mapper/MidVoiceCallRecordMapper.xml @@ -48,11 +48,19 @@ + + +