音频分析和音频处理逻辑
This commit is contained in:
@@ -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.*;
|
||||
|
||||
/**
|
||||
* 音频文件访问控制器
|
||||
@@ -76,6 +73,9 @@ public class AudioFileController {
|
||||
@Autowired
|
||||
private IYhyDatatypeLogService yhyDatatypeLogService;
|
||||
|
||||
@Autowired
|
||||
private com.rj.common.ServiceManager serviceManager;
|
||||
|
||||
|
||||
/**
|
||||
* v1 推送回调接口
|
||||
@@ -298,12 +298,13 @@ 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) request;
|
||||
java.util.Iterator<String> fileNames = multipartRequest.getFileNames();
|
||||
if (fileNames.hasNext()) {
|
||||
String paramName = fileNames.next();
|
||||
@@ -314,11 +315,89 @@ public class AudioFileController {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 关联上传的文件到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);
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user