音频分析和音频处理逻辑

This commit is contained in:
ZLI263
2025-12-02 08:05:07 +08:00
parent 153c8bfaf1
commit b9c278f529
5 changed files with 130 additions and 21 deletions

View File

@@ -1,14 +1,14 @@
package com.rj.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rj.entity.*;
import com.rj.service.IFileUploadService;
import com.rj.service.MinIOService;
import com.rj.service.IYhyAudioUploadLogService;
import com.rj.service.IYhyHeartbeatLogService;
import com.rj.service.IYhyDatatypeLogService;
import com.rj.entity.YhyAudioUploadLog;
import com.rj.entity.YhyDatatypeLog;
import com.rj.common.TimeZoneUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -32,10 +32,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.UUID;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/**
* 音频文件访问控制器
@@ -75,6 +72,9 @@ public class AudioFileController {
@Autowired
private IYhyDatatypeLogService yhyDatatypeLogService;
@Autowired
private com.rj.common.ServiceManager serviceManager;
/**
@@ -298,27 +298,106 @@ public class AudioFileController {
case "Audio":
// 录音推送保存文件到本地写入yhy_audio_upload_log表
// 在处理Audio类型之前再次检查文件如果之前没有获取到
log.info("检测到数据类型Audio----------开始处理--------------------: {}", dataType);
MultipartFile audioFile = file;
if (audioFile == null || audioFile.isEmpty()) {
log.warn("处理Audio类型时文件为空尝试重新获取");
if (request instanceof org.springframework.web.multipart.MultipartHttpServletRequest) {
org.springframework.web.multipart.MultipartHttpServletRequest multipartRequest =
(org.springframework.web.multipart.MultipartHttpServletRequest) request;
org.springframework.web.multipart.MultipartHttpServletRequest multipartRequest =
(org.springframework.web.multipart.MultipartHttpServletRequest) request;
java.util.Iterator<String> fileNames = multipartRequest.getFileNames();
if (fileNames.hasNext()) {
String paramName = fileNames.next();
audioFile = multipartRequest.getFile(paramName);
log.info("重新获取到文件,参数名: {}, 文件名: {}, 大小: {} bytes",
paramName, audioFile != null ? audioFile.getOriginalFilename() : "null",
log.info("重新获取到文件,参数名: {}, 文件名: {}, 大小: {} bytes",
paramName, audioFile != null ? audioFile.getOriginalFilename() : "null",
audioFile != null ? audioFile.getSize() : 0);
}
}
}
// 关联上传的文件到audio_management表
try {
String deviceNoForAudio = (String) requestBody.get("deviceNo");
if (deviceNoForAudio != null && !deviceNoForAudio.trim().isEmpty()) {
// 1. 根据device_no去device_management表查找device_code相同的记录
LambdaQueryWrapper<DeviceManagement> deviceQuery =
new LambdaQueryWrapper<>();
deviceQuery.eq(DeviceManagement::getDeviceCode, deviceNoForAudio);
DeviceManagement deviceManagement =
serviceManager.getDeviceManagementService().getOne(deviceQuery);
if (deviceManagement != null && deviceManagement.getBindUserId() != null) {
// 2. 通过bind_user_id去SalesManagement表查询sales_name和login_account作为sales_phone
LambdaQueryWrapper<SalesManagement> salesQuery =
new LambdaQueryWrapper<>();
salesQuery.eq(SalesManagement::getLoginAccount, deviceManagement.getSalesPhone());
SalesManagement salesManagement =
serviceManager.getSalesManagementService().getOne(salesQuery);
if (salesManagement != null) {
String salesName = salesManagement.getSalesName();
String salesPhone = salesManagement.getLoginAccount(); // login_account作为sales_phone
// 3. 根据sales_name和sales_phone去audio_management表查找sync_status='服务中'的记录
LambdaQueryWrapper<AudioManagement> audioQuery = new LambdaQueryWrapper<>();
audioQuery.eq(AudioManagement::getSalesPhone, salesPhone)
.eq(AudioManagement::getSyncStatus, "服务中")
.orderByDesc(AudioManagement::getCreateTime); // 按创建时间倒序
List<AudioManagement> audioList =
serviceManager.getAudioManagementService().list(audioQuery);
String audioManagementId = null;
if (audioList == null || audioList.isEmpty()) {
// 2.1 如果没找到,插入一条新记录
com.rj.entity.AudioManagement newAudio = new com.rj.entity.AudioManagement();
newAudio.setId(UUID.randomUUID().toString());
newAudio.setRecordingName("服务中录音"); // 设置默认录音名称
newAudio.setSalesName(salesName);
newAudio.setSalesPhone(salesPhone);
newAudio.setSyncStatus("服务中");
newAudio.setCreateTime(TimeZoneUtils.now());
newAudio.setUpdateTime(TimeZoneUtils.now());
serviceManager.getAudioManagementService().save(newAudio);
audioManagementId = newAudio.getId();
log.info("创建新的audio_management记录ID: {}, sales_name: {}, sales_phone: {}",
audioManagementId, salesName, salesPhone);
} else {
// 2.2 如果找到(一条或多条),取最新的一条记录
audioManagementId = audioList.get(0).getId();
log.info("找到audio_management记录ID: {}, sales_name: {}, sales_phone: {}, 共{}条记录",
audioManagementId, salesName, salesPhone, audioList.size());
}
// 将id设置到requestBody
if (audioManagementId != null) {
requestBody.put("audioManagementId", audioManagementId);
log.info("设置audioManagementId到requestBody: {}", audioManagementId);
}
} else {
log.warn("未找到对应的销售人员getSalesPhone: {}", deviceManagement.getSalesPhone());
}
} else {
log.warn("未找到对应的设备信息device_no: {}", deviceNoForAudio);
}
} else {
log.warn("deviceNo为空无法关联audio_management表");
}
} catch (Exception e) {
log.error("关联audio_management表失败", e);
// 即使关联失败,也不影响后续处理,只记录日志
}
processResult = handleAudioDataType(requestBody, audioFile);
if (processResult != null && processResult.get("localFilePath") != null) {
localFilePath = (String) processResult.get("localFilePath");
}
log.info("检测到数据类型Audio------------------------------: {}", dataType);
log.info("检测到数据类型Audio-----------处理结束-------------------: {}", dataType);
break;
case "HeartbeatLog":
@@ -778,7 +857,7 @@ public class AudioFileController {
// 检查目录是否存在
if (!Files.exists(uploadDir)) {
try {
Files.createDirectories(uploadDir);
Files.createDirectories(uploadDir);
log.info("创建上传目录成功: {}", uploadDir.toAbsolutePath());
} catch (Exception e) {
log.error("创建上传目录失败: {}", uploadDir.toAbsolutePath(), e);
@@ -928,15 +1007,23 @@ public class AudioFileController {
// 设置同步阶段(初始状态)
audioUploadLog.setSyncStage("已上传");
// 设置创建和更新时间
LocalDateTime now = LocalDateTime.now();
// 设置关联的录音管理ID如果存在
Object audioManagementIdObj = requestBody.get("audioManagementId");
if (audioManagementIdObj != null) {
audioUploadLog.setAudioManagementId(audioManagementIdObj.toString());
log.info("设置audioManagementId到音频上传日志: {}", audioManagementIdObj);
}
// 设置创建和更新时间(使用配置的时区)
LocalDateTime now = TimeZoneUtils.now();
audioUploadLog.setCreateTime(now);
audioUploadLog.setUpdateTime(now);
// 保存到数据库
yhyAudioUploadLogService.save(audioUploadLog);
log.info("音频上传日志保存成功ID: {}, 设备号: {}, 文件名: {}",
audioUploadLog.getId(), audioUploadLog.getDeviceNo(), audioUploadLog.getFileName());
log.info("音频上传日志保存成功ID: {}, 设备号: {}, 文件名: {}, audioManagementId: {}",
audioUploadLog.getId(), audioUploadLog.getDeviceNo(), audioUploadLog.getFileName(),
audioUploadLog.getAudioManagementId());
} catch (Exception e) {
log.error("保存音频上传日志到数据库失败", e);
@@ -1085,7 +1172,7 @@ public class AudioFileController {
*/
private Map<String, Object> handleUploadLogDataType(Map<String, Object> requestBody, MultipartFile file) {
Map<String, Object> result = new HashMap<>();
log.info("处理UploadLog数据类型上传日志");
return result;
}
@@ -1178,8 +1265,15 @@ public class AudioFileController {
// 设置同步阶段(初始状态)
audioUploadLog.setSyncStage("已上传");
// 设置创建和更新时间
LocalDateTime now = LocalDateTime.now();
// 设置关联的录音管理ID如果存在
Object audioManagementIdObj = requestBody.get("audioManagementId");
if (audioManagementIdObj != null) {
audioUploadLog.setAudioManagementId(audioManagementIdObj.toString());
log.info("设置audioManagementId到音频上传日志: {}", audioManagementIdObj);
}
// 设置创建和更新时间(使用配置的时区)
LocalDateTime now = TimeZoneUtils.now();
audioUploadLog.setCreateTime(now);
audioUploadLog.setUpdateTime(now);

View File

@@ -98,6 +98,14 @@ public class DeviceManagement implements Serializable {
@TableField("bind_status")
private Boolean bindStatus;
@Schema(description = "销售人员姓名")
@TableField("sales_name")
private String salesName;
@Schema(description = "销售人员电话")
@TableField("sales_phone")
private String salesPhone;
@Schema(description = "创建时间")
@TableField("create_time")
private LocalDateTime createTime;

View File

@@ -105,6 +105,10 @@ public class YhyAudioUploadLog implements Serializable {
@TableField("sync_stage")
private String syncStage;
@Schema(description = "关联的录音管理ID")
@TableField("audio_management_id")
private String audioManagementId;
@Schema(description = "系统创建时间")
@TableField("create_time")
private LocalDateTime createTime;

View File

@@ -21,6 +21,8 @@
<result column="bind_user_name" property="bindUserName" />
<result column="project_id" property="projectId" />
<result column="project_name" property="projectName" />
<result column="sales_name" property="salesName" />
<result column="sales_phone" property="salesPhone" />
<result column="bind_status" property="bindStatus" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
@@ -28,7 +30,7 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, device_code, dealership_id, dealership_name, last_online_time, last_power_on_time, last_power_off_time, wifi_name, unuploaded_count, storage_size, storage_used, remaining_battery, charging_status, bind_user_id, bind_user_name, project_id, project_name, bind_status, create_time, update_time
id, device_code, dealership_id, dealership_name, last_online_time, last_power_on_time, last_power_off_time, wifi_name, unuploaded_count, storage_size, storage_used, remaining_battery, charging_status, bind_user_id, bind_user_name, project_id, project_name, sales_name, sales_phone, bind_status, create_time, update_time
</sql>
</mapper>

View File

@@ -24,6 +24,7 @@
<result column="user_phone" property="userPhone" />
<result column="user_dept" property="userDept" />
<result column="sync_stage" property="syncStage" />
<result column="audio_management_id" property="audioManagementId" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
</resultMap>
@@ -32,7 +33,7 @@
<sql id="Base_Column_List">
id, file_path, content_type, device_no, server_url, push_data_type, file_name,
save_path, chunk_index, start_time, end_time, usr_no, device_type, has_body,
extended, user_id, user_name, user_phone, user_dept, sync_stage, create_time, update_time
extended, user_id, user_name, user_phone, user_dept, sync_stage, audio_management_id, create_time, update_time
</sql>
</mapper>