diff --git a/src/main/java/com/rj/controller/AudioFileController.java b/src/main/java/com/rj/controller/AudioFileController.java index 0f5f030..9305849 100644 --- a/src/main/java/com/rj/controller/AudioFileController.java +++ b/src/main/java/com/rj/controller/AudioFileController.java @@ -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 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 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 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 audioQuery = new LambdaQueryWrapper<>(); + audioQuery.eq(AudioManagement::getSalesPhone, salesPhone) + .eq(AudioManagement::getSyncStatus, "服务中") + .orderByDesc(AudioManagement::getCreateTime); // 按创建时间倒序 + + List 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 handleUploadLogDataType(Map requestBody, MultipartFile file) { Map 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); diff --git a/src/main/java/com/rj/entity/DeviceManagement.java b/src/main/java/com/rj/entity/DeviceManagement.java index 6113ad7..2ed40d5 100644 --- a/src/main/java/com/rj/entity/DeviceManagement.java +++ b/src/main/java/com/rj/entity/DeviceManagement.java @@ -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; diff --git a/src/main/java/com/rj/entity/YhyAudioUploadLog.java b/src/main/java/com/rj/entity/YhyAudioUploadLog.java index 85f5f67..bd94857 100644 --- a/src/main/java/com/rj/entity/YhyAudioUploadLog.java +++ b/src/main/java/com/rj/entity/YhyAudioUploadLog.java @@ -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; diff --git a/src/main/resources/mapper/DeviceManagementMapper.xml b/src/main/resources/mapper/DeviceManagementMapper.xml index ecec4af..23e3cd1 100644 --- a/src/main/resources/mapper/DeviceManagementMapper.xml +++ b/src/main/resources/mapper/DeviceManagementMapper.xml @@ -21,6 +21,8 @@ + + @@ -28,7 +30,7 @@ - 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 diff --git a/src/main/resources/mapper/YhyAudioUploadLogMapper.xml b/src/main/resources/mapper/YhyAudioUploadLogMapper.xml index 0d7ac1a..a2fec13 100644 --- a/src/main/resources/mapper/YhyAudioUploadLogMapper.xml +++ b/src/main/resources/mapper/YhyAudioUploadLogMapper.xml @@ -24,6 +24,7 @@ + @@ -32,7 +33,7 @@ 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