diff --git a/pom.xml b/pom.xml index f7df21d..26ec708 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.cst Langchain4j-rj - 1.1.5-SNAPSHOT + 1.1.7-SNAPSHOT Langchain4j-rj Langchain4j-rj20250803 diff --git a/src/main/java/com/rj/common/AudioManagementConstants.java b/src/main/java/com/rj/common/AudioManagementConstants.java new file mode 100644 index 0000000..9da97d1 --- /dev/null +++ b/src/main/java/com/rj/common/AudioManagementConstants.java @@ -0,0 +1,33 @@ +package com.rj.common; + +/** + * 录音管理相关常量 + * + * @author 系统生成 + * @since 2025-01-03 + */ +public class AudioManagementConstants { + + /** + * 同步状态 - 服务中(默认值) + */ + public static final String SYNC_STATUS_IN_SERVICE = "服务中"; + + /** + * 同步状态 - 未同步 + */ + public static final String SYNC_STATUS_NOT_SYNCED = "未同步"; + + /** + * 同步状态 - 已同步 + */ + public static final String SYNC_STATUS_SYNCED = "已同步"; + + /** + * 私有构造函数,防止实例化 + */ + private AudioManagementConstants() { + throw new UnsupportedOperationException("常量类不能被实例化"); + } +} + diff --git a/src/main/java/com/rj/controller/AudioManagementController.java b/src/main/java/com/rj/controller/AudioManagementController.java index 2a9d1ad..4df6588 100644 --- a/src/main/java/com/rj/controller/AudioManagementController.java +++ b/src/main/java/com/rj/controller/AudioManagementController.java @@ -2,6 +2,7 @@ package com.rj.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.common.AudioManagementConstants; import com.rj.common.DataEnrichmentUtil; import com.rj.entity.AudioManagement; import com.rj.service.IAudioManagementService; @@ -176,6 +177,11 @@ public class AudioManagementController { audioManagement.setUpdateTime(LocalDateTime.now()); audioManagement.setUploadTime(LocalDateTime.now()); + // 设置同步状态默认值 + if (audioManagement.getSyncStatus() == null || audioManagement.getSyncStatus().trim().isEmpty()) { + audioManagement.setSyncStatus(AudioManagementConstants.SYNC_STATUS_IN_SERVICE); + } + // 保存录音记录到数据库 boolean success = audioManagementService.save(audioManagement); if (success) { diff --git a/src/main/java/com/rj/controller/AudioTextAnalysisSopController.java b/src/main/java/com/rj/controller/AudioTextAnalysisSopController.java new file mode 100644 index 0000000..aca475c --- /dev/null +++ b/src/main/java/com/rj/controller/AudioTextAnalysisSopController.java @@ -0,0 +1,222 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.AudioTextAnalysisSop; +import com.rj.service.IAudioTextAnalysisSopService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 音频文本分析SOP评分 控制器 + */ +@RestController +@RequestMapping("/api/audioTextAnalysisSop") +@Tag(name = "语音分析-SOP评分", description = "音频文本分析SOP评分接口") +@Slf4j +public class AudioTextAnalysisSopController { + + @Autowired + private IAudioTextAnalysisSopService sopService; + + @PostMapping("/add") + @Operation(summary = "新增记录", description = "新增一条SOP评分记录") + public ResponseEntity> add(@RequestBody AudioTextAnalysisSop sop) { + Map result = new HashMap<>(); + try { + if (sop.getId() == null || sop.getId().trim().isEmpty()) { + sop.setId(UUID.randomUUID().toString()); + } + LocalDateTime now = LocalDateTime.now(); + sop.setCreatedAt(now); + sop.setUpdatedAt(now); + boolean success = sopService.save(sop); + result.put("success", success); + result.put("data", sop); + result.put("message", success ? "新增成功" : "新增失败"); + return success ? ResponseEntity.ok(result) : ResponseEntity.badRequest().body(result); + } catch (Exception e) { + log.error("新增SOP评分失败", e); + result.put("success", false); + result.put("message", "新增异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + @PutMapping("/update") + @Operation(summary = "修改记录", description = "更新一条SOP评分记录") + public ResponseEntity> update(@RequestBody AudioTextAnalysisSop sop) { + Map result = new HashMap<>(); + try { + if (sop.getId() == null || sop.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + sop.setUpdatedAt(LocalDateTime.now()); + boolean success = sopService.updateById(sop); + result.put("success", success); + result.put("message", success ? "更新成功" : "更新失败"); + result.put("data", sop); + return success ? ResponseEntity.ok(result) : ResponseEntity.badRequest().body(result); + } catch (Exception e) { + log.error("更新SOP评分失败", e); + result.put("success", false); + result.put("message", "更新异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + @DeleteMapping("/delete/{id}") + @Operation(summary = "删除记录", description = "根据ID删除SOP评分记录") + public ResponseEntity> delete(@PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = sopService.removeById(id); + result.put("success", success); + result.put("message", success ? "删除成功" : "删除失败"); + return success ? ResponseEntity.ok(result) : ResponseEntity.badRequest().body(result); + } catch (Exception e) { + log.error("删除SOP评分失败", e); + result.put("success", false); + result.put("message", "删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + @GetMapping("/get/{id}") + @Operation(summary = "根据ID查询", description = "根据ID查询SOP评分记录") + public ResponseEntity> getById(@PathVariable String id) { + Map result = new HashMap<>(); + try { + AudioTextAnalysisSop sop = sopService.getById(id); + if (sop != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", sop); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "记录不存在"); + return ResponseEntity.notFound().build(); + } + } catch (Exception e) { + log.error("查询SOP评分失败", e); + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "根据条件分页查询SOP评分记录,支持根据父ID查询") + public ResponseEntity> page( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "父ID,UUID,用于树状结构关联") + @RequestParam(required = false) String parentId, + @Parameter(description = "行业类型") + @RequestParam(required = false) String industryType, + @Parameter(description = "所属人姓名") + @RequestParam(required = false) String ownerName, + @Parameter(description = "所属人电话") + @RequestParam(required = false) String ownerPhone, + @Parameter(description = "客户姓名") + @RequestParam(required = false) String customerName, + @Parameter(description = "客户电话") + @RequestParam(required = false) String customerPhone, + @Parameter(description = "创建开始时间", example = "2025-01-01 00:00:00") + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createdStart, + @Parameter(description = "创建结束时间", example = "2025-12-31 23:59:59") + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createdEnd) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + // 根据父ID查询(必选条件之一,但这里设为可选) + if (parentId != null && !parentId.trim().isEmpty()) { + wrapper.eq(AudioTextAnalysisSop::getParentId, parentId); + } + + // 其他可选查询条件 + if (industryType != null && !industryType.trim().isEmpty()) { + wrapper.eq(AudioTextAnalysisSop::getIndustryType, industryType); + } + if (ownerName != null && !ownerName.trim().isEmpty()) { + wrapper.like(AudioTextAnalysisSop::getOwnerName, ownerName); + } + if (ownerPhone != null && !ownerPhone.trim().isEmpty()) { + wrapper.like(AudioTextAnalysisSop::getOwnerPhone, ownerPhone); + } + if (customerName != null && !customerName.trim().isEmpty()) { + wrapper.like(AudioTextAnalysisSop::getCustomerName, customerName); + } + if (customerPhone != null && !customerPhone.trim().isEmpty()) { + wrapper.like(AudioTextAnalysisSop::getCustomerPhone, customerPhone); + } + if (createdStart != null) { + wrapper.ge(AudioTextAnalysisSop::getCreatedAt, createdStart); + } + if (createdEnd != null) { + wrapper.le(AudioTextAnalysisSop::getCreatedAt, createdEnd); + } + + // 按更新时间倒序排列 + wrapper.orderByDesc(AudioTextAnalysisSop::getUpdatedAt); + + Page dataPage = sopService.page(page, wrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", dataPage.getRecords()); + result.put("total", dataPage.getTotal()); + result.put("current", dataPage.getCurrent()); + result.put("size", dataPage.getSize()); + result.put("pages", dataPage.getPages()); + return ResponseEntity.ok(result); + } catch (Exception e) { + log.error("分页查询SOP评分失败", e); + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + @GetMapping("/listByParentId") + @Operation(summary = "根据父ID查询列表", description = "根据父ID查询所有SOP评分记录(不分页)") + public ResponseEntity> listByParentId( + @Parameter(description = "父ID,UUID,用于树状结构关联") + @RequestParam String parentId) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AudioTextAnalysisSop::getParentId, parentId); + wrapper.orderByDesc(AudioTextAnalysisSop::getUpdatedAt); + + AudioTextAnalysisSop one = sopService.getOne(wrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", one); + return ResponseEntity.ok(result); + } catch (Exception e) { + log.error("根据父ID查询SOP评分失败", e); + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } +} + diff --git a/src/main/java/com/rj/embedding/EnbedingModelConfig.java b/src/main/java/com/rj/embedding/EnbedingModelConfig.java index 0cefb52..c169296 100644 --- a/src/main/java/com/rj/embedding/EnbedingModelConfig.java +++ b/src/main/java/com/rj/embedding/EnbedingModelConfig.java @@ -1,10 +1,8 @@ package com.rj.embedding; -import dev.langchain4j.community.store.embedding.redis.RedisEmbeddingStore; import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.DocumentSplitter; import dev.langchain4j.data.document.loader.ClassPathDocumentLoader; -import dev.langchain4j.data.document.loader.FileSystemDocumentLoader; import dev.langchain4j.data.document.parser.apache.pdfbox.ApachePdfBoxDocumentParser; import dev.langchain4j.data.document.splitter.DocumentSplitters; import dev.langchain4j.data.segment.TextSegment; @@ -19,16 +17,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; -import org.springframework.context.annotation.Primary; - -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - import java.util.List; /** @@ -43,16 +32,18 @@ public class EnbedingModelConfig { @Lazy private EmbeddingModel embeddingModel; - @Autowired - @Lazy - RedisEmbeddingStore redisEmbeddingStore; + // 注释掉 RedisEmbeddingStore 的自动注入,避免启动时连接外部网络 + // 如果需要使用 Redis 向量数据库,请在需要时手动创建 Bean,而不是通过 @Autowired 注入 + // @Autowired + // @Lazy + // RedisEmbeddingStore redisEmbeddingStore; /** * 创建向量数据库操作对象 * @return */ @Bean("myEmbeddingStoreInMemory") // @Primary - public EmbeddingStore embeddingStoreInMemory() { + public EmbeddingStore embeddingStoreInMemory() { //1 , 加载知识库文档进 内存 List documents =ClassPathDocumentLoader.loadDocuments("knowledge"); //暂时去掉 2025-09-20 //2 , 构建向量数据库操作对象 @@ -67,7 +58,7 @@ public class EnbedingModelConfig { // @Bean("myEmbeddingStoreInMemory2") // @Primary - public EmbeddingStore embeddingStoreInMemory2() throws IOException { + public EmbeddingStore embeddingStoreInMemory2() throws IOException { //1 , 加载知识库文档进 内存 List documents1 = ClassPathDocumentLoader.loadDocuments("knowledge\\pdf",new ApachePdfBoxDocumentParser()); // List documents2 = ClassPathDocumentLoader.loadDocuments("knowledge"); @@ -91,7 +82,7 @@ public class EnbedingModelConfig { // @Bean("myEmbeddingStoreInRedis") 不要打开,否则每次都会调用 阿里云的向量化模型 ,消耗token // @Primary - public EmbeddingStore embeddingStoreInRedis(EmbeddingStore redisEmbeddingStore) throws IOException { + public EmbeddingStore embeddingStoreInRedis(EmbeddingStore redisEmbeddingStore) throws IOException { //1 , 加载知识库文档进 内存 List documents1 = ClassPathDocumentLoader.loadDocuments("knowledge\\pdf",new ApachePdfBoxDocumentParser()); // List documents2 = ClassPathDocumentLoader.loadDocuments("knowledge"); @@ -111,7 +102,7 @@ public class EnbedingModelConfig { @Bean @Lazy - public ContentRetriever contentRetriever(@Qualifier("myEmbeddingStoreInMemory")EmbeddingStore store){ + public ContentRetriever contentRetriever(@Qualifier("myEmbeddingStoreInMemory") EmbeddingStore store){ // 使用 @Lazy 注解延迟初始化,避免启动时连接阿里云 // embeddingModel 也是 @Lazy 的,只有在实际使用 RAG 功能时才会初始化并连接 EmbeddingStoreContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder() diff --git a/src/main/java/com/rj/entity/AudioTextAnalysisSop.java b/src/main/java/com/rj/entity/AudioTextAnalysisSop.java new file mode 100644 index 0000000..ab5f169 --- /dev/null +++ b/src/main/java/com/rj/entity/AudioTextAnalysisSop.java @@ -0,0 +1,119 @@ +package com.rj.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 音频文本分析SOP评分表实体 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("audio_text_analysis_sop") +@Schema(description = "音频文本分析SOP评分结果") +public class AudioTextAnalysisSop implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "记录唯一标识,存放UUID字符") + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + @Schema(description = "父ID,UUID,用于树状结构关联") + @TableField("parent_id") + private String parentId; + + @Schema(description = "行业类型") + @TableField("industry_type") + private String industryType; + + @Schema(description = "综合得分") + @TableField("comprehensive_score") + private Integer comprehensiveScore; + + @Schema(description = "总结综合得分的原因") + @TableField("score_summary_reason") + private String scoreSummaryReason; + + @Schema(description = "所属人姓名") + @TableField("owner_name") + private String ownerName; + + @Schema(description = "所属人电话") + @TableField("owner_phone") + private String ownerPhone; + + @Schema(description = "客户姓名") + @TableField("customer_name") + private String customerName; + + @Schema(description = "客户电话") + @TableField("customer_phone") + private String customerPhone; + + @Schema(description = "迎宾破冰得分") + @TableField("greeting_ice_breaking") + private Integer greetingIceBreaking; + + @Schema(description = "品牌介绍得分") + @TableField("brand_introduction") + private Integer brandIntroduction; + + @Schema(description = "黄金三问得分") + @TableField("golden_three_questions") + private Integer goldenThreeQuestions; + + @Schema(description = "需求引导得分") + @TableField("needs_guidance") + private Integer needsGuidance; + + @Schema(description = "服务递进得分") + @TableField("service_progression") + private Integer serviceProgression; + + @Schema(description = "放心手册得分") + @TableField("reassurance_handbook") + private Integer reassuranceHandbook; + + @Schema(description = "三级报价得分") + @TableField("three_level_pricing") + private Integer threeLevelPricing; + + @Schema(description = "解答异议得分") + @TableField("objection_handling") + private Integer objectionHandling; + + @Schema(description = "活动植入得分") + @TableField("activity_implantation") + private Integer activityImplantation; + + @Schema(description = "压单配合得分") + @TableField("closing_cooperation") + private Integer closingCooperation; + + @Schema(description = "主动添加微信得分") + @TableField("proactive_wechat_add") + private Integer proactiveWechatAdd; + + @Schema(description = "礼貌道别得分") + @TableField("polite_farewell") + private Integer politeFarewell; + + @Schema(description = "修改时间") + @TableField("updated_at") + private LocalDateTime updatedAt; + + @Schema(description = "创建时间") + @TableField("created_at") + private LocalDateTime createdAt; +} + diff --git a/src/main/java/com/rj/example/AudioFileUploadExample.java b/src/main/java/com/rj/example/AudioFileUploadExample.java index ddd627d..7cae1a2 100644 --- a/src/main/java/com/rj/example/AudioFileUploadExample.java +++ b/src/main/java/com/rj/example/AudioFileUploadExample.java @@ -1,5 +1,6 @@ package com.rj.example; +import com.rj.common.AudioManagementConstants; import com.rj.entity.AudioManagement; import com.rj.service.IAudioManagementService; import com.rj.service.IFileUploadService; @@ -50,6 +51,7 @@ public class AudioFileUploadExample { audio.setProjectName("汽车销售项目"); audio.setDuration(new java.math.BigDecimal("5.5")); audio.setIntentionLevel("高意向"); + audio.setSyncStatus(AudioManagementConstants.SYNC_STATUS_IN_SERVICE); audio.setCreateTime(LocalDateTime.now()); audio.setUpdateTime(LocalDateTime.now()); diff --git a/src/main/java/com/rj/mapper/AudioTextAnalysisSopMapper.java b/src/main/java/com/rj/mapper/AudioTextAnalysisSopMapper.java new file mode 100644 index 0000000..bf8ac4d --- /dev/null +++ b/src/main/java/com/rj/mapper/AudioTextAnalysisSopMapper.java @@ -0,0 +1,12 @@ +package com.rj.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.rj.entity.AudioTextAnalysisSop; + +/** + * 音频文本分析SOP评分 Mapper 接口 + */ +public interface AudioTextAnalysisSopMapper extends BaseMapper { + +} + diff --git a/src/main/java/com/rj/scheduler/AudioMockInsertDataScheduler.java b/src/main/java/com/rj/scheduler/AudioMockInsertDataScheduler.java index c231235..9a24c7d 100644 --- a/src/main/java/com/rj/scheduler/AudioMockInsertDataScheduler.java +++ b/src/main/java/com/rj/scheduler/AudioMockInsertDataScheduler.java @@ -1,5 +1,6 @@ package com.rj.scheduler; +import com.rj.common.AudioManagementConstants; import com.rj.controller.AudioManagementController; import com.rj.entity.AudioManagement; import lombok.extern.slf4j.Slf4j; @@ -64,7 +65,6 @@ public class AudioMockInsertDataScheduler { private static final String[] PHONE_PREFIXES = {"138", "139", "150", "151", "152", "158", "159", "188", "189"}; private static final String[] SCRIPT_MODELS = {"标准话术", "节日促销话术", "金融政策话术"}; private static final String[] UPLOAD_STATUS = {"已上传", "待上传"}; - private static final String[] SYNC_STATUS = {"未同步", "已同步"}; private static final String[] COMPANY_TYPES = {"直营", "经销"}; private static final String[] EDIT_STATUS = {"未编辑", "已编辑"}; @@ -193,7 +193,7 @@ public class AudioMockInsertDataScheduler { audio.setProjectName(project[1]); audio.setScriptModel(pick(SCRIPT_MODELS)); audio.setUploadStatus(pick(UPLOAD_STATUS)); - audio.setSyncStatus(pick(SYNC_STATUS)); + audio.setSyncStatus(AudioManagementConstants.SYNC_STATUS_IN_SERVICE); audio.setIsMerged(random.nextBoolean()); audio.setRemarks(buildRemarks(project[1], dealer[1], audio.getCustomerName())); audio.setCompanyType(pick(COMPANY_TYPES)); diff --git a/src/main/java/com/rj/service/IAudioTextAnalysisSopService.java b/src/main/java/com/rj/service/IAudioTextAnalysisSopService.java new file mode 100644 index 0000000..efcca98 --- /dev/null +++ b/src/main/java/com/rj/service/IAudioTextAnalysisSopService.java @@ -0,0 +1,12 @@ +package com.rj.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.rj.entity.AudioTextAnalysisSop; + +/** + * 音频文本分析SOP评分 服务接口 + */ +public interface IAudioTextAnalysisSopService extends IService { + +} + diff --git a/src/main/java/com/rj/service/impl/AudioTextAnalysisSopServiceImpl.java b/src/main/java/com/rj/service/impl/AudioTextAnalysisSopServiceImpl.java new file mode 100644 index 0000000..d093636 --- /dev/null +++ b/src/main/java/com/rj/service/impl/AudioTextAnalysisSopServiceImpl.java @@ -0,0 +1,17 @@ +package com.rj.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.rj.entity.AudioTextAnalysisSop; +import com.rj.mapper.AudioTextAnalysisSopMapper; +import com.rj.service.IAudioTextAnalysisSopService; +import org.springframework.stereotype.Service; + +/** + * 音频文本分析SOP评分 服务实现 + */ +@Service +public class AudioTextAnalysisSopServiceImpl extends ServiceImpl + implements IAudioTextAnalysisSopService { + +} + diff --git a/src/main/java/com/rj/service/impl/SoundRecordingUploadServiceImpl.java b/src/main/java/com/rj/service/impl/SoundRecordingUploadServiceImpl.java index 4a13633..7b8108f 100644 --- a/src/main/java/com/rj/service/impl/SoundRecordingUploadServiceImpl.java +++ b/src/main/java/com/rj/service/impl/SoundRecordingUploadServiceImpl.java @@ -1,5 +1,6 @@ package com.rj.service.impl; +import com.rj.common.AudioManagementConstants; import com.rj.entity.AudioManagement; import com.rj.service.IAudioManagementService; import com.rj.service.ISoundRecordingUploadService; @@ -117,7 +118,7 @@ public class SoundRecordingUploadServiceImpl implements ISoundRecordingUploadSer audioManagement.setAudioFileExtension(fileExtension); audioManagement.setUploadTime(LocalDateTime.now()); audioManagement.setUploadStatus("已上传"); - audioManagement.setSyncStatus("未同步"); + audioManagement.setSyncStatus(AudioManagementConstants.SYNC_STATUS_IN_SERVICE); audioManagement.setIsMerged(chunkInfo.isLastChunk && chunkInfo.totalChunks > 1); // 如果有自定义编号,可以存储到备注中 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index eb9fa0f..8311c63 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -27,7 +27,7 @@ langchain4j: max-segments-per-batch: 10 # 禁用启动时的连接测试 enabled: true -# redis 向量数据库 + # redis 向量数据库 community: redis: host: 101.43.230.106 @@ -53,6 +53,9 @@ logging: spring: + autoconfigure: + exclude: + - dev.langchain4j.community.store.embedding.redis.spring.RedisEmbeddingStoreAutoConfiguration data: redis: port: 6389 @@ -61,11 +64,11 @@ spring: database: 0 datasource: driver-class-name: com.mysql.cj.jdbc.Driver -# url: jdbc:mysql://124.221.59.58:3309/ai_smart_badge?useUnicode=true&characterEncoding=utf8 - url: jdbc:mysql://101.35.52.237:13307/ai_smart_badge?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&maxReconnects=3&initialTimeout=2&connectTimeout=30000&socketTimeout=60000 + url: jdbc:mysql://124.221.59.58:3309/ai_smart_badge?useUnicode=true&characterEncoding=utf8 +# url: jdbc:mysql://101.35.52.237:13307/ai_smart_badge?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&maxReconnects=3&initialTimeout=2&connectTimeout=30000&socketTimeout=60000 username: root - password: cstcom.123! -# password: ChangAndb.123! +# password: cstcom.123! + password: ChangAndb.123! hikari: # 连接池大小配置 maximumPoolSize: 10 @@ -197,10 +200,10 @@ springdoc: swagger: api: - base-url: http://localhost:9060 + base-url: http://localhost:8090 # http://localhost:9060/swagger-ui/index.html?urls.primaryName=public-api server: - port: 9060 + port: 8090 # Dify API 配置 dify: diff --git a/src/main/resources/mapper/AudioTextAnalysisSopMapper.xml b/src/main/resources/mapper/AudioTextAnalysisSopMapper.xml new file mode 100644 index 0000000..a12ae74 --- /dev/null +++ b/src/main/resources/mapper/AudioTextAnalysisSopMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, parent_id, industry_type, comprehensive_score, score_summary_reason, + owner_name, owner_phone, customer_name, customer_phone, + greeting_ice_breaking, brand_introduction, golden_three_questions, + needs_guidance, service_progression, reassurance_handbook, + three_level_pricing, objection_handling, activity_implantation, + closing_cooperation, proactive_wechat_add, polite_farewell, + updated_at, created_at + + + diff --git a/src/main/sql/audio_text_analysis_sop.sql b/src/main/sql/audio_text_analysis_sop.sql new file mode 100644 index 0000000..a21b968 --- /dev/null +++ b/src/main/sql/audio_text_analysis_sop.sql @@ -0,0 +1,32 @@ +CREATE TABLE audio_text_analysis_sop ( + id CHAR(36) NOT NULL COMMENT '记录唯一标识,存放UUID字符', + parent_id CHAR(36) NOT NULL COMMENT '父ID,UUID,用于树状结构关联', + industry_type VARCHAR(50) NULL COMMENT '行业类型', + comprehensive_score INT NULL DEFAULT 0 COMMENT '综合得分', + score_summary_reason TEXT NULL COMMENT '总结综合得分的原因', + owner_name VARCHAR(100) NULL COMMENT '所属人姓名', + owner_phone VARCHAR(50) NULL COMMENT '所属人电话', + customer_name VARCHAR(100) NULL COMMENT '客户姓名', + customer_phone VARCHAR(50) NULL COMMENT '客户电话', + greeting_ice_breaking INT NULL DEFAULT 0 COMMENT '迎宾破冰得分', + brand_introduction INT NULL DEFAULT 0 COMMENT '品牌介绍得分', + golden_three_questions INT NULL DEFAULT 0 COMMENT '黄金三问得分', + needs_guidance INT NULL DEFAULT 0 COMMENT '需求引导得分', + service_progression INT NULL DEFAULT 0 COMMENT '服务递进得分', + reassurance_handbook INT NULL DEFAULT 0 COMMENT '放心手册得分', + three_level_pricing INT NULL DEFAULT 0 COMMENT '三级报价得分', + objection_handling INT NULL DEFAULT 0 COMMENT '解答异议得分', + activity_implantation INT NULL DEFAULT 0 COMMENT '活动植入得分', + closing_cooperation INT NULL DEFAULT 0 COMMENT '压单配合得分', + proactive_wechat_add INT NULL DEFAULT 0 COMMENT '主动添加微信得分', + polite_farewell INT NULL DEFAULT 0 COMMENT '礼貌道别得分', + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (id), + KEY idx_audio_text_analysis_sop_parent_id (parent_id), + KEY idx_audio_text_analysis_sop_industry_type (industry_type), + KEY idx_audio_text_analysis_sop_comprehensive_score (comprehensive_score), + KEY idx_audio_text_analysis_sop_owner_phone (owner_phone), + KEY idx_audio_text_analysis_sop_updated_at (updated_at) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '音频文本分析SOP评分表'; +