Browse Source

优化 查询

main
wang 2 months ago
parent
commit
47e3013818
  1. 8
      src/main/java/com/threecloud/dataserviceyy/mapper/MidVoiceCallRecordMapper.java
  2. 16
      src/main/java/com/threecloud/dataserviceyy/service/VaaSyncService.java
  3. 10
      src/main/resources/mapper/MidVoiceCallRecordMapper.xml

8
src/main/java/com/threecloud/dataserviceyy/mapper/MidVoiceCallRecordMapper.java

@ -26,6 +26,14 @@ public interface MidVoiceCallRecordMapper {
* 根据通话记录ID查询防止重复插入 * 根据通话记录ID查询防止重复插入
*/ */
MidVoiceCallRecord selectByCallRecordId(@Param("callRecordId") String callRecordId); MidVoiceCallRecord selectByCallRecordId(@Param("callRecordId") String callRecordId);
/**
* 批量查询某设备在时间范围内的已存在call_record_id
* 用于防重复一次查询代替N次单条查询
*/
List<String> selectExistingCallRecordIds(@Param("deviceNo") String deviceNo,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
/** /**
* 根据设备编码查询 * 根据设备编码查询

16
src/main/java/com/threecloud/dataserviceyy/service/VaaSyncService.java

@ -175,6 +175,13 @@ public class VaaSyncService {
} }
logger.info("【设备】获取到 {} 条录音记录", records.size()); 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<String> existingIds = new HashSet<>(callRecordMapper.selectExistingCallRecordIds(
deviceNo, startTimeStr, endTimeStr));
logger.debug("【设备】已存在 {} 条通话记录,将跳过", existingIds.size());
// 步骤5:逐条处理录音 // 步骤5:逐条处理录音
int successCount = 0; int successCount = 0;
int failCount = 0; int failCount = 0;
@ -184,7 +191,7 @@ public class VaaSyncService {
JSONObject rec = records.getJSONObject(i); JSONObject rec = records.getJSONObject(i);
try { try {
Date callTime = processSingleRecord(rec, deviceNo, cityName, cityCode, orgCode, Date callTime = processSingleRecord(rec, deviceNo, cityName, cityCode, orgCode,
deviceHost, authToken, extNumbers); deviceHost, authToken, extNumbers, existingIds);
if (callTime != null) { if (callTime != null) {
successCount++; successCount++;
if (latestCallTime == null || callTime.after(latestCallTime)) { if (latestCallTime == null || callTime.after(latestCallTime)) {
@ -212,7 +219,8 @@ public class VaaSyncService {
*/ */
private Date processSingleRecord(JSONObject rec, String deviceNo, String cityName, private Date processSingleRecord(JSONObject rec, String deviceNo, String cityName,
String cityCode, String orgCode, String deviceHost, String cityCode, String orgCode, String deviceHost,
String authToken, Map<String, String> extNumbers) throws Exception { String authToken, Map<String, String> extNumbers,
Set<String> existingIds) throws Exception {
// 解析录音信息 // 解析录音信息
String recordId = RecordParser.parseRecordId(rec); String recordId = RecordParser.parseRecordId(rec);
String filePath = RecordParser.parseFilePath(rec); String filePath = RecordParser.parseFilePath(rec);
@ -231,9 +239,9 @@ public class VaaSyncService {
return null; return null;
} }
// 防重复:根据 device_no + record_id 判断 // 防重复:内存中比对已存在的call_record_id(一次查询代替N次)
String callRecordId = deviceNo + "_" + recordId; String callRecordId = deviceNo + "_" + recordId;
if (callRecordMapper.selectByCallRecordId(callRecordId) != null) { if (existingIds.contains(callRecordId)) {
logger.debug("【录音】已存在,跳过: {}", callRecordId); logger.debug("【录音】已存在,跳过: {}", callRecordId);
return null; return null;
} }

10
src/main/resources/mapper/MidVoiceCallRecordMapper.xml

@ -48,11 +48,19 @@
<!-- 根据通话记录ID查询(防止重复) --> <!-- 根据通话记录ID查询(防止重复) -->
<select id="selectByCallRecordId" resultMap="BaseResultMap"> <select id="selectByCallRecordId" resultMap="BaseResultMap">
SELECT * FROM mid_voice_call_record SELECT * FROM mid_voice_call_record
WHERE call_record_id = #{callRecordId} WHERE call_record_id = #{callRecordId}
LIMIT 1 LIMIT 1
</select> </select>
<!-- 批量查询某设备在时间范围内已存在的call_record_id(防重复,一次查询代替N次) -->
<select id="selectExistingCallRecordIds" resultType="java.lang.String">
SELECT call_record_id FROM mid_voice_call_record
WHERE device_no = #{deviceNo}
AND call_start_time >= TO_TIMESTAMP(#{startTime}, 'YYYY-MM-DD HH24:MI:SS')
AND call_start_time &lt;= TO_TIMESTAMP(#{endTime}, 'YYYY-MM-DD HH24:MI:SS')
</select>
<!-- 根据设备编码查询 --> <!-- 根据设备编码查询 -->
<select id="selectByDeviceNo" resultMap="BaseResultMap"> <select id="selectByDeviceNo" resultMap="BaseResultMap">
SELECT * FROM mid_voice_call_record SELECT * FROM mid_voice_call_record

Loading…
Cancel
Save