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