diff --git a/ai-analytic-center-api/pom.xml b/ai-analytic-center-api/pom.xml
index 9288351..6ac34ab 100644
--- a/ai-analytic-center-api/pom.xml
+++ b/ai-analytic-center-api/pom.xml
@@ -38,6 +38,12 @@
1.0.1
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.3.0
+
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/DifyRunDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/DifyRunDTO.java
new file mode 100644
index 0000000..429a7d9
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/DifyRunDTO.java
@@ -0,0 +1,17 @@
+package com.volvo.ai.analytic.center.dto;
+
+
+import lombok.Data;
+
+@Data
+public class DifyRunDTO {
+
+ private String authorization;
+ private String reqData;
+
+
+
+
+
+
+}
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/AicorpusTelephoneDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/AicorpusTelephoneDTO.java
new file mode 100644
index 0000000..73a5560
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/AicorpusTelephoneDTO.java
@@ -0,0 +1,127 @@
+package com.volvo.ai.analytic.center.dto.corpus;
+
+
+import com.fasterxml.jackson.annotation.JsonRawValue;
+
+public class AicorpusTelephoneDTO {
+ private String appid;
+ private String audioUrl;
+ private String audioFileId;
+ private String sourceId;
+ private String categoryCode;
+ private String transcribeTime;
+ private String callDirect;
+ private String status;
+ @JsonRawValue
+ private String display;
+ private int platformType;
+ private String displayUrl;
+
+ // Getters and Setters
+ public String getAppid() {
+ return appid;
+ }
+
+ public void setAppid(String appid) {
+ this.appid = appid;
+ }
+
+ public String getAudioUrl() {
+ return audioUrl;
+ }
+
+ public void setAudioUrl(String audioUrl) {
+ this.audioUrl = audioUrl;
+ }
+
+ public String getAudioFileId() {
+ return audioFileId;
+ }
+
+ public void setAudioFileId(String audioFileId) {
+ this.audioFileId = audioFileId;
+ }
+
+ public String getSourceId() {
+ return sourceId;
+ }
+
+ public void setSourceId(String sourceId) {
+ this.sourceId = sourceId;
+ }
+
+ public String getCategoryCode() {
+ return categoryCode;
+ }
+
+ public void setCategoryCode(String categoryCode) {
+ this.categoryCode = categoryCode;
+ }
+
+ public String getTranscribeTime() {
+ return transcribeTime;
+ }
+
+ public void setTranscribeTime(String transcribeTime) {
+ this.transcribeTime = transcribeTime;
+ }
+
+ public String getCallDirect() {
+ return callDirect;
+ }
+
+ public void setCallDirect(String callDirect) {
+ this.callDirect = callDirect;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getDisplay() {
+ return display;
+ }
+
+ public void setDisplay(String display) {
+ this.display = display;
+ }
+
+ public int getPlatformType() {
+ return platformType;
+ }
+
+ public void setPlatformType(int platformType) {
+ this.platformType = platformType;
+ }
+
+ public String getDisplayUrl() {
+ return displayUrl;
+ }
+
+ public void setDisplayUrl(String displayUrl) {
+ this.displayUrl = displayUrl;
+ }
+
+ @Override
+ public String toString() {
+ return "AicorpusTelephone{" +
+ "appid='" + appid + '\'' +
+ ", audioUrl='" + audioUrl + '\'' +
+ ", audioFileId='" + audioFileId + '\'' +
+ ", sourceId='" + sourceId + '\'' +
+ ", categoryCode='" + categoryCode + '\'' +
+ ", transcribeTime='" + transcribeTime + '\'' +
+ ", callDirect='" + callDirect + '\'' +
+ ", status='" + status + '\'' +
+ ", display=" + display +
+ ", platformType=" + platformType +
+ ", displayUrl='" + displayUrl + '\'' +
+ '}';
+ }
+
+
+}
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/AnalysisInfoDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/AnalysisInfoDTO.java
new file mode 100644
index 0000000..e4dd311
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/AnalysisInfoDTO.java
@@ -0,0 +1,41 @@
+package com.volvo.ai.analytic.center.dto.corpus;
+
+public class AnalysisInfoDTO {
+ private String role;
+ private String emotion;
+ private double speed;
+
+ // Getters and Setters
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public String getEmotion() {
+ return emotion;
+ }
+
+ public void setEmotion(String emotion) {
+ this.emotion = emotion;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+
+ @Override
+ public String toString() {
+ return "AnalysisInfo{" +
+ "role='" + role + '\'' +
+ ", emotion='" + emotion + '\'' +
+ ", speed=" + speed +
+ '}';
+ }
+ }
\ No newline at end of file
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/DisplayDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/DisplayDTO.java
new file mode 100644
index 0000000..6b445cc
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/DisplayDTO.java
@@ -0,0 +1,71 @@
+package com.volvo.ai.analytic.center.dto.corpus;
+
+public class DisplayDTO {
+ private String status;
+ private String create_time;
+ private String start_time;
+ private String finish_time;
+ private SegmentDTO[] segments;
+ private int audio_duration;
+
+ // Getters and Setters
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getCreate_time() {
+ return create_time;
+ }
+
+ public void setCreate_time(String create_time) {
+ this.create_time = create_time;
+ }
+
+ public String getStart_time() {
+ return start_time;
+ }
+
+ public void setStart_time(String start_time) {
+ this.start_time = start_time;
+ }
+
+ public String getFinish_time() {
+ return finish_time;
+ }
+
+ public void setFinish_time(String finish_time) {
+ this.finish_time = finish_time;
+ }
+
+ public SegmentDTO[] getSegments() {
+ return segments;
+ }
+
+ public void setSegments(SegmentDTO[] segments) {
+ this.segments = segments;
+ }
+
+ public int getAudio_duration() {
+ return audio_duration;
+ }
+
+ public void setAudio_duration(int audio_duration) {
+ this.audio_duration = audio_duration;
+ }
+
+ @Override
+ public String toString() {
+ return "Display{" +
+ "status='" + status + '\'' +
+ ", create_time='" + create_time + '\'' +
+ ", start_time='" + start_time + '\'' +
+ ", finish_time='" + finish_time + '\'' +
+ ", segments=" + java.util.Arrays.toString(segments) +
+ ", audio_duration=" + audio_duration +
+ '}';
+ }
+ }
\ No newline at end of file
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/SegmentDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/SegmentDTO.java
new file mode 100644
index 0000000..1e5b877
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/SegmentDTO.java
@@ -0,0 +1,41 @@
+package com.volvo.ai.analytic.center.dto.corpus;
+
+public class SegmentDTO {
+ private int start_time;
+ private int end_time;
+ private SegmentsResultDTO result;
+
+ // Getters and Setters
+ public int getStart_time() {
+ return start_time;
+ }
+
+ public void setStart_time(int start_time) {
+ this.start_time = start_time;
+ }
+
+ public int getEnd_time() {
+ return end_time;
+ }
+
+ public void setEnd_time(int end_time) {
+ this.end_time = end_time;
+ }
+
+ public SegmentsResultDTO getResult() {
+ return result;
+ }
+
+ public void setResult(SegmentsResultDTO result) {
+ this.result = result;
+ }
+
+ @Override
+ public String toString() {
+ return "Segment{" +
+ "start_time=" + start_time +
+ ", end_time=" + end_time +
+ ", result=" + result +
+ '}';
+ }
+ }
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/SegmentsResultDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/SegmentsResultDTO.java
new file mode 100644
index 0000000..c913e93
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/SegmentsResultDTO.java
@@ -0,0 +1,31 @@
+package com.volvo.ai.analytic.center.dto.corpus;
+
+public class SegmentsResultDTO {
+ private String text;
+ private AnalysisInfoDTO analysis_info;
+
+ // Getters and Setters
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public AnalysisInfoDTO getAnalysis_info() {
+ return analysis_info;
+ }
+
+ public void setAnalysis_info(AnalysisInfoDTO analysis_info) {
+ this.analysis_info = analysis_info;
+ }
+
+ @Override
+ public String toString() {
+ return "Result{" +
+ "text='" + text + '\'' +
+ ", analysis_info=" + analysis_info +
+ '}';
+ }
+ }
\ No newline at end of file
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmTelephoneCorpus.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmTelephoneCorpus.java
new file mode 100644
index 0000000..9e79b28
--- /dev/null
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmTelephoneCorpus.java
@@ -0,0 +1,111 @@
+package com.volvo.ai.analytic.center.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.volvo.common.core.base.BaseEntity;
+import lombok.Data;
+
+/**
+ * @description 电话语料表-同步表
+ * @author BEJSON
+ * @date 2025-03-04
+ */
+@Data
+@TableName("tm_telephone_corpus")
+public class TmTelephoneCorpus extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ //@Entity.Column(id = true)
+ /**
+ * 主键id
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+
+
+ /**
+ * appid
+ */
+ @TableField("appid")
+ private String appid;
+
+ /**
+ * audioUrl
+ */
+ @TableField("audio_url")
+ private String audioUrl;
+
+ /**
+ * audio_file_id
+ */
+ @TableField("audio_file_id")
+ private String audioFileId;
+
+ /**
+ * source_id
+ */
+ @TableField("source_id")
+ private String sourceId;
+
+ /**
+ * category_code
+ */
+ @TableField("category_code")
+ private String categoryCode;
+
+ /**
+ * 通话时间
+ */
+ @TableField("transcribe_time")
+ private String transcribeTime;
+
+ /**
+ * 标记左声道还是右声道【in,out,0,1】
+ */
+ @TableField("call_direct")
+ private String callDirect;
+
+ /**
+ * 源音频文件是否转录成功
+ */
+ @TableField("status")
+ private String status;
+
+ /**
+ * 识别的文本显示,包括添加的标点和大小写
+ */
+ @TableField("display")
+ private String display;
+
+ /**
+ * 外呼标志:0联通AI外呼,1阿里云AI外呼,2联通云呼
+ */
+ @TableField("platform_type")
+ private int platformType;
+
+ /**
+ * obs地址
+ */
+ @TableField("display_url")
+ private String displayUrl;
+
+ /**
+ * 删除标识(0-未删除,1-已删除)
+ */
+ @TableField("is_deleted")
+ private Integer isDeleted;
+
+ /**
+ * 记录版本号,即乐观锁
+ */
+ @TableField("version")
+ private Integer version;
+
+ public TmTelephoneCorpus() {
+ }
+
+}
\ No newline at end of file
diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java
index f849b76..80a8209 100644
--- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java
+++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java
@@ -4,10 +4,12 @@ import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
import java.util.Map;
-@FeignClient(name = "difyClient", url = "${service.dify.url}")
+@FeignClient(name = "difyClient", url = "${dify.baseUrl}")
public interface DiFyFeign {
@PostMapping(value = "v1/workflows/run"
@@ -15,4 +17,8 @@ public interface DiFyFeign {
, produces = MediaType.APPLICATION_JSON_VALUE)
JSONObject runWorkflows(@RequestHeader(value = "Authorization") String authorization, @RequestBody Map map);
+
+
+ @PostMapping(value = "/v1/files/upload" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ JSONObject fileUpload(@RequestHeader(value = "Authorization") String authorization, @RequestPart("file") MultipartFile file);
}
diff --git a/ai-analytic-center-biz/pom.xml b/ai-analytic-center-biz/pom.xml
index 9cd1040..79353d4 100644
--- a/ai-analytic-center-biz/pom.xml
+++ b/ai-analytic-center-biz/pom.xml
@@ -14,6 +14,8 @@
1.8
UTF-8
+ UTF-8
+ UTF-8
@@ -27,7 +29,7 @@
com.volvo.aicenter
ai-analytic-center-api
- ${ai-analytic-center-api}
+ 1.0.0-SNAPSHOT
@@ -49,11 +51,17 @@
mysql
mysql-connector-java
+
+
+ com.alibaba
+ druid-spring-boot-starter
+
io.springfox
springfox-swagger2
2.9.2
+
com.baomidou
mybatis-plus-boot-starter
@@ -64,10 +72,10 @@
org.springframework.boot
spring-boot-starter-actuator
-
- org.springframework.cloud
- spring-cloud-starter-openfeign
-
+
+
+
+
org.mockito
@@ -133,11 +141,6 @@
xxl-job-core
2.3.0
-
ru.yandex.clickhouse
clickhouse-jdbc
@@ -187,6 +190,25 @@
rocketmq-client
5.0.0
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+ com.huaweicloud
+ esdk-obs-java
+ 3.22.3.1
+
+
+
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ClickHouseConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ClickHouseConfig.java
index 251deee..b8393f5 100644
--- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ClickHouseConfig.java
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ClickHouseConfig.java
@@ -1,40 +1,40 @@
-package com.volvo.ai.analytic.center.config;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.jdbc.DataSourceBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-import javax.sql.DataSource;
-
-@Configuration
-public class ClickHouseConfig {
-
- @Primary
- @Bean(name = "dataSource")
- @ConfigurationProperties(prefix="spring.datasource")
- public DataSource dataSource() {
- DataSource dataSource = DataSourceBuilder.create().build();
- return dataSource;
- }
-
- @Bean(name = "clickHouseDataSource")
- @ConfigurationProperties(prefix="spring.clickhouse-ads-ai")
- public DataSource clickHouseDataSource(){
- DataSource dataSource = DataSourceBuilder.create().build();
- return dataSource;
- }
-
- @Bean(name = "jdbcTemplate")
- public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource) {
- return new JdbcTemplate(dataSource);
- }
-
- @Bean(name = "clickhouseJdbcTemplate")
- public JdbcTemplate clickhouseJdbcTemplate(@Qualifier("clickHouseDataSource") DataSource clickhouseJdbcTemplate) {
- return new JdbcTemplate(clickhouseJdbcTemplate);
- }
-}
+//package com.volvo.ai.analytic.center.config;
+//
+//import org.springframework.beans.factory.annotation.Qualifier;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//import org.springframework.boot.jdbc.DataSourceBuilder;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Primary;
+//import org.springframework.jdbc.core.JdbcTemplate;
+//
+//import javax.sql.DataSource;
+//
+//@Configuration
+//public class ClickHouseConfig {
+//
+// @Primary
+// @Bean(name = "dataSource")
+// @ConfigurationProperties(prefix="spring.datasource")
+// public DataSource dataSource() {
+// DataSource dataSource = DataSourceBuilder.create().build();
+// return dataSource;
+// }
+//
+// @Bean(name = "clickHouseDataSource")
+// @ConfigurationProperties(prefix="spring.clickhouse-ads-ai")
+// public DataSource clickHouseDataSource(){
+// DataSource dataSource = DataSourceBuilder.create().build();
+// return dataSource;
+// }
+//
+// @Bean(name = "jdbcTemplate")
+// public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource) {
+// return new JdbcTemplate(dataSource);
+// }
+//
+// @Bean(name = "clickhouseJdbcTemplate")
+// public JdbcTemplate clickhouseJdbcTemplate(@Qualifier("clickHouseDataSource") DataSource clickhouseJdbcTemplate) {
+// return new JdbcTemplate(clickhouseJdbcTemplate);
+// }
+//}
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/MyBatisPlusConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/MyBatisPlusConfig.java
new file mode 100644
index 0000000..305810f
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/MyBatisPlusConfig.java
@@ -0,0 +1,30 @@
+package com.volvo.ai.analytic.center.config;
+
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+@Slf4j
+@Configuration
+@MapperScan("com.volvo.ai.analytic.center.mapper") // 指定 Mapper 接口的包路径
+public class MyBatisPlusConfig {
+
+ @Bean
+ public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
+
+ log.info("DataSource: {}", dataSource);
+ MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
+ sessionFactory.setDataSource(dataSource); // 设置数据源
+ sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
+ .getResources("classpath*:mapper/*.xml")); // 设置 Mapper XML 文件路径
+ sessionFactory.setTypeAliasesPackage("com.volvo.ai.analytic.center.entity"); // 设置实体类包路径
+ return sessionFactory.getObject();
+ }
+}
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ObsConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ObsConfig.java
new file mode 100644
index 0000000..186df0f
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/ObsConfig.java
@@ -0,0 +1,38 @@
+package com.volvo.ai.analytic.center.config;
+
+import com.obs.services.ObsClient;
+import com.obs.services.ObsConfiguration;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author CYI5
+ */
+@Configuration
+public class ObsConfig {
+
+ @Value("${huawei.cloud.obs.ak}")
+ private String accessKey;
+
+ @Value("${huawei.cloud.obs.sk}")
+ private String secretKey;
+
+ @Value("${huawei.cloud.obs.endpoint}")
+ private String endpoint;
+
+ @Value("${huawei.cloud.obs.socket-timeout}")
+ private int socketTimeOut;
+
+ @Value("${huawei.cloud.obs.connect-timeout}")
+ private int connectTimeOut;
+
+ @Bean
+ public ObsClient obsClient() {
+ ObsConfiguration obsConfiguration = new ObsConfiguration();
+ obsConfiguration.setSocketTimeout(socketTimeOut);
+ obsConfiguration.setConnectionTimeout(connectTimeOut);
+ obsConfiguration.setEndPoint(endpoint);
+ return new ObsClient(accessKey, secretKey, obsConfiguration);
+ }
+}
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiImageCompareController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiImageCompareController.java
new file mode 100644
index 0000000..2cbd2d8
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiImageCompareController.java
@@ -0,0 +1,63 @@
+package com.volvo.ai.analytic.center.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.obs.services.model.ObsObject;
+import com.volvo.ai.analytic.center.feign.DiFyFeign;
+import com.volvo.ai.analytic.center.utils.ObsUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/dms/run")
+public class AiImageCompareController {
+
+ @Autowired
+ private DiFyFeign diFyFeign;
+
+ @PostMapping("/fileUpload")
+ public String fileUpload(@RequestHeader(value = "Authorization") String authorization, @RequestBody String filePath) throws IOException {
+
+ JSONObject jsonObjectResult;
+ try {
+ ObsObject obsObject = ObsUtil.downloadFile(filePath);
+ InputStream inputStream = obsObject.getObjectContent();
+ MultipartFile file = ObsUtil.getMultipartFile(inputStream, ObsUtil.getFilenameByUrl(filePath));
+ JSONObject jsonObjectResult1 = diFyFeign.fileUpload(authorization,file);
+ ObsObject obsObjectDoc = ObsUtil.downloadFile("file_test/business.docx");
+ InputStream inputStreamDoc = obsObjectDoc.getObjectContent();
+ MultipartFile fileDoc = ObsUtil.getMultipartFile(inputStreamDoc, ObsUtil.getFilenameByUrl("file_test/business.docx"));
+ JSONObject jsonObjectResult2 = diFyFeign.fileUpload(authorization,fileDoc);
+ JSONObject tpJSon = new JSONObject();
+ tpJSon.put("type","image");
+ tpJSon.put("transfer_method","local_file");
+ tpJSon.put("upload_file_id",jsonObjectResult1.get("id"));
+ JSONObject mbJsonp = new JSONObject();
+ mbJsonp.put("type","document");
+ mbJsonp.put("transfer_method","local_file");
+ mbJsonp.put("upload_file_id",jsonObjectResult2.get("id"));
+ Map tpMpMap = new HashMap<>();
+ tpMpMap.put("tp",tpJSon);
+ tpMpMap.put("mb",mbJsonp);
+ Map reqMap = new HashMap<>();
+ reqMap.put("inputs",tpMpMap);
+ reqMap.put("response_mode","blocking");
+ reqMap.put("user","streaming232");
+ JSONObject runResultJson = diFyFeign.runWorkflows(authorization,reqMap);
+ System.out.println("runResultJson:"+runResultJson);
+ return runResultJson.toJSONString();
+ } catch (Exception e) {
+ log.error("error:{}",e);
+ }
+
+ return "";
+ }
+
+
+}
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java
index 6c25497..1294dfd 100644
--- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java
@@ -41,10 +41,10 @@ public class TestController {
@Autowired
private MqMessageRecordService mqMessageRecordService;
- @Value("${service.dify.user}")
+ @Value("${dify.user}")
private String user;
- @Value("${service.dify.flowId}")
+ @Value("${dify.flowId}")
private String flowId;
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmTelephoneCorpusMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmTelephoneCorpusMapper.java
new file mode 100644
index 0000000..0a46ece
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmTelephoneCorpusMapper.java
@@ -0,0 +1,20 @@
+package com.volvo.ai.analytic.center.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.volvo.ai.analytic.center.entity.TmTelephoneCorpus;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.*;
+
+/**
+ * @description 电话语料表-同步表
+ * @author BEJSON
+ * @date 2025-03-04
+ */
+@Mapper
+@Repository
+public interface TmTelephoneCorpusMapper extends BaseMapper {
+
+
+}
\ No newline at end of file
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaConsumer.java
new file mode 100644
index 0000000..1f086ef
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaConsumer.java
@@ -0,0 +1,58 @@
+package com.volvo.ai.analytic.center.mq;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO;
+import com.volvo.ai.analytic.center.dto.corpus.DisplayDTO;
+import com.volvo.ai.analytic.center.entity.TmTelephoneCorpus;
+import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @ClassName CorpusProcessKafkaConsumer
+ * @Description
+ * @Author renzhen
+ * @Date 2025-03-04 10:18
+ * @Version 1.0
+ **/
+@Slf4j
+@Component
+@RestController
+public class CorpusProcessKafkaConsumer {
+
+ @Autowired
+ private TmTelephoneCorpusService tmTelephoneCorpusService;
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ @GetMapping("corpusProcessKafkaConsumer")
+// @KafkaListener(topics = "aicorpus-telephone", groupId = "test-group")
+ public void listen(@RequestBody String message) {
+ try {
+ log.info("Received message: {}" , message);
+
+ AicorpusTelephoneDTO aicorpusTelephone = objectMapper.readValue(message, AicorpusTelephoneDTO.class);
+ log.info("aicorpusTelephone categoryCode:{}, display: {}" ,aicorpusTelephone.getCategoryCode(), aicorpusTelephone.getDisplay());
+ DisplayDTO display = objectMapper.readValue(aicorpusTelephone.getDisplay(), DisplayDTO.class);
+ log.info("aicorpusTelephone display getSegments: {}" , display.getSegments());
+ TmTelephoneCorpus tmTelephoneCorpus = new TmTelephoneCorpus();
+ BeanUtils.copyProperties(aicorpusTelephone, tmTelephoneCorpus);
+ tmTelephoneCorpus.setCreateBy("kafka");
+ tmTelephoneCorpus.setCreateTime(LocalDateTime.now());
+ tmTelephoneCorpusService.saveTelephoneCorpus(tmTelephoneCorpus);
+
+ // 在这里可以添加对解析后的对象的进一步处理逻辑
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java
new file mode 100644
index 0000000..2e2b879
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java
@@ -0,0 +1,17 @@
+package com.volvo.ai.analytic.center.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.volvo.ai.analytic.center.entity.TmTelephoneCorpus;
+
+import java.util.Map;
+
+/**
+ * @description 电话语料表-同步表
+ * @author BEJSON
+ * @date 2025-03-04
+ */
+public interface TmTelephoneCorpusService extends IService {
+
+
+ void saveTelephoneCorpus(TmTelephoneCorpus tmTelephoneCorpus);
+}
\ No newline at end of file
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java
index c2d1162..fafd592 100644
--- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java
@@ -59,10 +59,10 @@ public class MqMessageRecordServiceImpl extends ServiceImpl implements TmTelephoneCorpusService {
+
+
+ @Override
+ @Transactional
+ public void saveTelephoneCorpus(TmTelephoneCorpus tmTelephoneCorpus) {
+ this.save(tmTelephoneCorpus);
+ }
+}
\ No newline at end of file
diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ObsUtil.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ObsUtil.java
new file mode 100644
index 0000000..b82abb6
--- /dev/null
+++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ObsUtil.java
@@ -0,0 +1,246 @@
+package com.volvo.ai.analytic.center.utils;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONUtil;
+import com.obs.services.ObsClient;
+import com.obs.services.model.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import java.io.*;
+import java.net.URLDecoder;
+import java.util.*;
+
+@Component
+@Slf4j
+public class ObsUtil {
+
+ private static ObsClient obsClient;
+
+ private static String bucketName;
+
+ private static Long expireSeconds;
+
+ private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+ private static String userDomainName;
+ private static String userName;
+ private static String userPassWord;
+ private static String iamTokenUrl;
+
+ private static String securityTokenUrl;
+
+ private static String huaWeiCdn;
+
+ private static long durationSeconds;
+
+ @Autowired
+ public void setObsClient(ObsClient obsClient) {
+ ObsUtil.obsClient = obsClient;
+ }
+
+ @Value("${huawei.cloud.obs.bucketName}")
+ public void setBucketName(String bucketName) {
+ ObsUtil.bucketName = bucketName;
+ }
+
+ /**
+ * 文件下载
+ *
+ * @param objectKey 文件相对路径
+ * @return ObsObject
+ */
+ public static ObsObject downloadFile(String objectKey) {
+ return obsClient.getObject(bucketName, objectKey);
+ }
+
+ /**
+ * 文件下载
+ *
+ * @param bucketName 桶
+ * @param objectKey 文件名
+ * @return ObsObject
+ */
+ public static ObsObject downloadFile(String bucketName, String objectKey) {
+ return obsClient.getObject(bucketName, objectKey);
+ }
+
+ /**
+ * 根据下载地址url获取文件名称
+ *
+ * @param url 文件url
+ */
+ public static String getFilenameByUrl(String url) {
+ String fileName = null;
+ try {
+ // url编码处理,中文名称会变成百分号编码
+ String decode = URLDecoder.decode(url, "utf-8");
+ fileName = decode.substring(decode.lastIndexOf("/") + 1);
+ log.info("fileName :" + fileName);
+ } catch (UnsupportedEncodingException e) {
+ log.error("getFilenameByUrl() called with exception => 【url = {}】", url, e);
+ }
+ return fileName;
+ }
+
+
+
+
+ /**
+ * 获取临时访问url并重命名
+ *
+ * @param objectKey 文件相对路径
+ * @param fileName 需要返回下载的文件名称
+ * @return 临时文件url
+ */
+ public static String getSingedUrlAndRename(String objectKey, String fileName) {
+ // 过期时间
+ TemporarySignatureRequest temporarySignatureRequest = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);
+ // 桶名称
+ temporarySignatureRequest.setBucketName(bucketName);
+ // 对象名
+ temporarySignatureRequest.setObjectKey(objectKey);
+ Map queryParams = new HashMap<>(8);
+ if (StringUtils.isNotBlank(fileName)) {
+ String prefix = objectKey.substring(objectKey.lastIndexOf('.'));
+ queryParams.put("response-content-disposition", String.format("attachment;filename=%s", fileName + prefix));
+ }
+ temporarySignatureRequest.setQueryParams(queryParams);
+ TemporarySignatureResponse temporarySignature = obsClient.createTemporarySignature(temporarySignatureRequest);
+ return temporarySignature.getSignedUrl();
+ }
+
+
+ /**
+ * 获取临时访问url
+ *
+ * @param objectKey 文件相对路径
+ * @return 临时文件url
+ */
+ public static String getSingedPictureUrl(String objectKey) {
+ return getSingedUrlAndRename(objectKey, Strings.EMPTY);
+ }
+
+ public static String getSingedUrl(String objectKey) {
+ String previewUrl = "";
+ if (!StringUtils.isEmpty(objectKey) && (objectKey.toLowerCase().endsWith(".tif") || objectKey.toLowerCase().endsWith(".tiff") || objectKey.toLowerCase().endsWith(".jpg") || objectKey.toLowerCase().endsWith(".jpeg") || objectKey.toLowerCase().endsWith(".png") || objectKey.toLowerCase().endsWith(".bmp"))) {
+ return getSingedPictureUrl(objectKey);
+ } else {
+ previewUrl = huaWeiCdn + objectKey;
+ }
+ return previewUrl;
+ }
+
+
+ public static String getToken() {
+// String userDomainName,String userName, String userPassWord, String iamTokenUrl
+ //组装获取token的参数
+ HashMap domainName = new HashMap<>();
+ domainName.put("name", userDomainName);
+ HashMap user = new HashMap<>();
+ user.put("domain", domainName);
+ user.put("name", userName);
+ user.put("password", userPassWord);
+ HashMap password = new HashMap<>();
+ password.put("user", user);
+ ArrayList methodsList = new ArrayList<>();
+ methodsList.add("password");
+ HashMap identity = new HashMap<>();
+ identity.put("methods", methodsList);
+ identity.put("password", password);
+ HashMap auth = new HashMap<>();
+ HashMap projectName = new HashMap<>();
+ projectName.put("name", "cn-east-3");
+ HashMap project = new HashMap<>();
+ project.put("scope", projectName);
+ HashMap scope = new HashMap<>();
+ scope.put("scope", project);
+ auth.put("identity", identity);
+ auth.put("scope", scope);
+ HashMap bodyMap = new HashMap<>();
+ bodyMap.put("auth", auth);
+ String body = JSONUtil.toJsonStr(bodyMap);
+ HttpResponse response = HttpRequest.post(iamTokenUrl).body(body).execute();
+ return response.header("X-Subject-Token");
+ }
+
+ /**
+ * 获取ak,sk,key,securityToken
+ *
+ * @param token
+ * @return
+ */
+ public static String getSecurityTokenAkSk(String token) {
+ //组装获取临时ak/sk参数
+ ArrayList tokenList = new ArrayList<>();
+ tokenList.add("token");
+ HashMap tokenItemMap = new HashMap<>();
+ tokenItemMap.put("id", token);
+ tokenItemMap.put("duration_seconds", durationSeconds);
+ HashMap tokenMethodsMap = new HashMap<>();
+ tokenMethodsMap.put("methods", tokenList);
+ tokenMethodsMap.put("token", tokenItemMap);
+ HashMap tokenIdentityMap = new HashMap<>();
+ tokenIdentityMap.put("identity", tokenMethodsMap);
+ HashMap tokenAuthMap = new HashMap<>();
+ tokenAuthMap.put("auth", tokenIdentityMap);
+ String bodyStr = JSONUtil.toJsonStr(tokenAuthMap);
+ HttpResponse response = HttpRequest.post(securityTokenUrl).body(bodyStr).execute();
+ return response.body();
+ }
+
+ public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
+ FileItem fileItem = createFileItem(inputStream, fileName);
+ // CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
+ return new CommonsMultipartFile(fileItem);
+ }
+ public static FileItem createFileItem(InputStream inputStream, String fileName) {
+ FileItemFactory factory = new DiskFileItemFactory(16, null);
+ String textFieldName = "file";
+ FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName);
+ int bytesRead = 0;
+ byte[] buffer = new byte[10 * 1024 * 1024];
+ OutputStream os = null;
+ // 使用输出流输出输入流的字节
+ try {
+ os = item.getOutputStream();
+ while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ inputStream.close();
+ } catch (IOException e) {
+ log.error("Stream copy exception", e);
+ throw new IllegalArgumentException("文件上传失败");
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ log.error("Stream close exception", e);
+ }
+ }
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ log.error("Stream close exception", e);
+ }
+ }
+ }
+ return item;
+ }
+
+
+}
diff --git a/ai-analytic-center-biz/src/main/resources/bootstrap.yml b/ai-analytic-center-biz/src/main/resources/bootstrap.yml
index 1021a0c..7888f34 100644
--- a/ai-analytic-center-biz/src/main/resources/bootstrap.yml
+++ b/ai-analytic-center-biz/src/main/resources/bootstrap.yml
@@ -1,6 +1,17 @@
server:
- port: 8080
-
+ port: 8082
spring:
+ profiles:
+ active: local
application:
- name: ai-analytic-center
\ No newline at end of file
+ name: ai-analytic-center-dev
+ cloud:
+ nacos:
+ config:
+ enable: true
+ namespace: a3f090cd-9c78-4580-a47a-a4b29278cec9
+ group: dev
+ server-addr: 10.37.44.229:8848
+ file-extension: yaml
+ refresh-enabled: true
+ enable-remote-sync-config: true
\ No newline at end of file