调整 ai模块

This commit is contained in:
2025-10-13 15:09:27 +08:00
parent a1c4ae3564
commit 077fb92772
19 changed files with 575 additions and 63 deletions

View File

@@ -70,3 +70,34 @@ CREATE TABLE `tz_ai_sample_tag_group_relate`
`sample_tag_group_id` bigint NOT NULL COMMENT '样本标签分组id', `sample_tag_group_id` bigint NOT NULL COMMENT '样本标签分组id',
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB COMMENT = '样本标签-分组关联表'; ) ENGINE = InnoDB COMMENT = '样本标签-分组关联表';
DROP TABLE IF EXISTS `tz_ai_dialog`;
CREATE TABLE `tz_ai_dialog`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(128) NULL DEFAULT '' COMMENT '对话标题',
`user_id` bigint NOT NULL COMMENT '用户id',
`dialog_status` int(8) NULL COMMENT '对话状态1active, 2archived, 3deleted',
`creator` varchar(64) NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB COMMENT = 'ai-对话表';
DROP TABLE IF EXISTS `tz_ai_dialog_message`;
CREATE TABLE `tz_ai_dialog_message`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`dialog_id` bigint NOT NULL COMMENT '对话id',
`content_text` varchar(64) NULL DEFAULT '' COMMENT '内容',
`content_type` int(8) NULL COMMENT '文本类型1text2image3file4audio',
`message_order` int(8) NULL COMMENT '对话中的顺序',
`message_status` int(8) NULL COMMENT '消息状态 1正常 0删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB COMMENT = 'ai-对话消息表';

View File

@@ -68,11 +68,21 @@ public class AiSampleController {
@Parameter(name = "id", description = "编号", required = true) @Parameter(name = "id", description = "编号", required = true)
// @PreAuthorize("@ss.hasPermission('ai:sample:delete')") // @PreAuthorize("@ss.hasPermission('ai:sample:delete')")
@PermitAll @PermitAll
public CommonResult<Boolean> deleteAiSample(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteAiSample(@RequestParam("id") String ids) {
aiSampleService.deleteAiSample(id); aiSampleService.deleteAiSample(ids);
return success(true); return success(true);
} }
@GetMapping("/get")
@Operation(summary = "获得样本库")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// @PreAuthorize("@ss.hasPermission('ai:sample:query')")
@PermitAll
public CommonResult<AiSampleRespVO> getAiSample(@RequestParam("id") Long id) {
AiSampleDO aiSample = aiSampleService.getAiSample(id);
return success(BeanUtils.toBean(aiSample, AiSampleRespVO.class));
}
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得样本库分页") @Operation(summary = "获得样本库分页")
// @PreAuthorize("@ss.hasPermission('ai:sample:query')") // @PreAuthorize("@ss.hasPermission('ai:sample:query')")

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import java.util.List; import java.util.List;
@Schema(description = "管理后台 - 样本库新增/修改 Request VO") @Schema(description = "管理后台 - 关联 Request VO")
@Data @Data
public class AiSampleRelateTagVO { public class AiSampleRelateTagVO {

View File

@@ -0,0 +1,58 @@
package com.tashow.cloud.ai.controller.app.dialog;
import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
import com.tashow.cloud.ai.service.dialog.AiDialogMessageService;
import com.tashow.cloud.ai.service.dialog.AiDialogService;
import com.tashow.cloud.common.pojo.CommonResult;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
/**
* 翻译
*/
@RestController
@RequestMapping("/ai/dialog")
@Validated
@Slf4j
public class DialogController {
List<String> message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭");
@Resource
private AiDialogService aiDialogService;
@Resource
private AiDialogMessageService messageService;
/**
* 获取对话消息列表
*/
@PostMapping("/getDialog")
@PermitAll
public CommonResult<DialogResp> msList() {
//获取当前登录用户
Long userId = 1l;
return success(aiDialogService.getDialog(userId));
}
/**
* 翻译
*/
@PostMapping("/translate")
@PermitAll
public CommonResult<TranslateRespVo> translate(@Validated TranslateReqVo fileReqVo) {
return success(aiDialogService.translate(fileReqVo));
}
}

View File

@@ -0,0 +1,22 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "api - 对话 Response VO")
@Data
public class DialogResp {
@Schema(description = "对话id")
private Long dialogId;
@Schema(description = "对话标题")
private String title;
@Schema(description = "对话状态")
private String dialogStatus;
@Schema(description = "对话消息内容")
private List<AiDialogMessageDO> messages;
}

View File

@@ -0,0 +1,9 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
public class Pets {
private Long petId;
private String petName;
private String petAvatar;
private String petType;
}

View File

@@ -0,0 +1,22 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
/**
* 翻译接口请求vo
*/
@Data
public class TranslateReqVo {
//对话id
private Long dialogId;
/** 文件附件 */
private MultipartFile file;
//文件时长
private Integer filePlayTime;
}

View File

@@ -0,0 +1,39 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import lombok.Data;
/**
* 翻译接口结果vo
*/
@Data
public class TranslateRespVo {
//消息id
private Long msgId;
//对话id
private Long dialogId;
//消息顺序
private Integer messageOrder;
//消息类型1text2file
private Integer contentType;
//消息内容 若消息类型是file 则为文件地址
private String contentText;
//文件时长
private Integer filePlayTime;
//宠物类型
private String petType;
//宠物名称
private String petName;
//宠物头像
private String petAvatar;
//宠物id
private Long petId;
//翻译状态
private Integer translateStatus;
//翻译结果
private String translateResult;
//发送时间
private String createTime;
}

View File

@@ -1,38 +0,0 @@
package com.tashow.cloud.ai.controller.app.translate;
import cn.hutool.core.util.RandomUtil;
import com.tashow.cloud.common.pojo.CommonResult;
import jakarta.annotation.security.PermitAll;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
/**
* 翻译
*/
@RestController
@RequestMapping("/ai/sample")
@Validated
@Slf4j
public class TranslateController {
List<String> message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭");
/**
* 翻译
*/
@PostMapping("/translate")
@PermitAll
public CommonResult<String> translate(MultipartFile file) {
// log.info("file:{}",file.getName());
return success(message.get(RandomUtil.randomInt(0, message.size())));
}
}

View File

@@ -0,0 +1,40 @@
package com.tashow.cloud.ai.dal.dataobject.dialog;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
/**
* ai-对话 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_dialog")
@KeySequence("tz_ai_dialog_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiDialogDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 对话标题
*/
private String title;
/**
* 用户id
*/
private Long userId;
/**
* 对话状态1active, 2archived, 3deleted
*/
private Integer dialogStatus;
}

View File

@@ -0,0 +1,72 @@
package com.tashow.cloud.ai.dal.dataobject.dialog;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.time.LocalDateTime;
/**
* ai-对话消息 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_dialog_message")
@KeySequence("tz_ai_dialog_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiDialogMessageDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 对话id
*/
private Long dialogId;
/**
* 内容
*/
private String contentText;
/**
* 文本类型1text2image3file4audio
*/
private Integer contentType;
/**
* 对话中的顺序
*/
private Integer messageOrder;
/**
* 消息状态 1正常 0删除
*/
private Integer messageStatus;
/**
* 宠物id
*/
private Long petId;
/**
* 宠物名称
*/
private String petName;
/**
* 宠物头像
*/
private String petAvatar;
/**
* 翻译结果
*/
private String transResult;
/**
* 创建时间
*/
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,15 @@
package com.tashow.cloud.ai.dal.mysql.dialog;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* ai-对话 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiDialogMapper extends BaseMapperX<AiDialogDO> {
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.dal.mysql.dialog;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* ai-对话消息 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiDialogMessageMapper extends BaseMapperX<AiDialogMessageDO> {
}

View File

@@ -45,7 +45,7 @@ public interface AiSampleService {
* *
* @param id 编号 * @param id 编号
*/ */
void deleteAiSample(Long id); void deleteAiSample(String id);
/** /**
* 删除样本库 * 删除样本库

View File

@@ -2,6 +2,7 @@ package com.tashow.cloud.ai.service.aisample;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tashow.cloud.ai.controller.admin.aisample.vo.*; import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO; import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
@@ -15,11 +16,13 @@ import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.infraapi.api.file.FileApi; import com.tashow.cloud.infraapi.api.file.FileApi;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@@ -39,6 +42,8 @@ public class AiSampleServiceImpl implements AiSampleService {
private AiSampleTagRelateMapper aiSampleTagRelateMapper; private AiSampleTagRelateMapper aiSampleTagRelateMapper;
@Resource @Resource
private FileApi fileApi; private FileApi fileApi;
@Value("file-server")
private String fileServer;
@Override @Override
@SneakyThrows @SneakyThrows
@@ -48,7 +53,7 @@ public class AiSampleServiceImpl implements AiSampleService {
/* 调用文件上传服务*/ /* 调用文件上传服务*/
for (MultipartFile file : uploadReqVO.getFiles()) { for (MultipartFile file : uploadReqVO.getFiles()) {
//返回上传结果 //返回上传结果
String file1 ="http://192.168.1.231:48080"+ fileApi.createFile(file.getBytes()); String file1 = fileServer + fileApi.createFile(file.getBytes());
//保存样本信息 //保存样本信息
AiSampleDO aiSampleDO = new AiSampleDO(); AiSampleDO aiSampleDO = new AiSampleDO();
aiSampleDO.setSampleFilePath(file1); aiSampleDO.setSampleFilePath(file1);
@@ -81,37 +86,48 @@ public class AiSampleServiceImpl implements AiSampleService {
List<AiSampleTagRelateDO> tagRelateDOS = new ArrayList<>(); List<AiSampleTagRelateDO> tagRelateDOS = new ArrayList<>();
for (Long sampleId : relateTagVO.getSampleIds()) { for (Long sampleId : relateTagVO.getSampleIds()) {
for (Long tagId : relateTagVO.getTagId()) { for (Long tagId : relateTagVO.getTagId()) {
AiSampleTagRelateDO relateDO = new AiSampleTagRelateDO(); AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne(
new LambdaQueryWrapper<AiSampleTagRelateDO>()
.eq(AiSampleTagRelateDO::getSampleId, sampleId)
.eq(AiSampleTagRelateDO::getSampleTagId, tagId) );
if (relateDO== null){
relateDO = new AiSampleTagRelateDO();
relateDO.setSampleId(sampleId); relateDO.setSampleId(sampleId);
relateDO.setSampleTagId(tagId); relateDO.setSampleTagId(tagId);
tagRelateDOS.add(relateDO); tagRelateDOS.add(relateDO);
} }
} }
}
if (!tagRelateDOS.isEmpty()){
aiSampleTagRelateMapper.insertBatch(tagRelateDOS); aiSampleTagRelateMapper.insertBatch(tagRelateDOS);
} }
}
@Override @Override
public void deleteRelate(AiSampleRelateTagVO relateTagVO) { public void deleteRelate(AiSampleRelateTagVO relateTagVO) {
List<Long> tagRelateIds = new ArrayList<>(); List<Long> tagRelateIds = new ArrayList<>();
for (Long sampleId : relateTagVO.getSampleIds()) { for (Long sampleId : relateTagVO.getSampleIds()) {
for (Long l : relateTagVO.getTagId()) { for (Long tagId : relateTagVO.getTagId()) {
AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne( AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne(
new LambdaQueryWrapper<AiSampleTagRelateDO>() new LambdaQueryWrapper<AiSampleTagRelateDO>()
.eq(AiSampleTagRelateDO::getSampleId, sampleId) .eq(AiSampleTagRelateDO::getSampleId, sampleId)
.eq(AiSampleTagRelateDO::getSampleTagId, l) .eq(AiSampleTagRelateDO::getSampleTagId, tagId)
); );
if (relateDO != null) {
tagRelateIds.add(relateDO.getId()); tagRelateIds.add(relateDO.getId());
} }
} }
}
if (!tagRelateIds.isEmpty()) {
aiSampleTagRelateMapper.deleteBatchIds(tagRelateIds); aiSampleTagRelateMapper.deleteBatchIds(tagRelateIds);
} }
}
@Override @Override
public void deleteAiSample(Long id) { public void deleteAiSample(String ids) {
// 校验存在
validateAiSampleExists(id);
// 删除 // 删除
aiSampleMapper.deleteById(id); aiSampleMapper.deleteByIds(Arrays.asList(ids.split(StrUtil.COMMA)));
} }
private void validateAiSampleExists(Long id) { private void validateAiSampleExists(Long id) {
@@ -123,7 +139,7 @@ public class AiSampleServiceImpl implements AiSampleService {
@Override @Override
public AiSampleDO getAiSample(Long id) { public AiSampleDO getAiSample(Long id) {
AiSampleDO aiSampleDO = aiSampleMapper.selectById(id); AiSampleDO aiSampleDO = aiSampleMapper.selectById(id);
aiSampleDO.setSampleFilePath("http://192.168.1.231:48080"+aiSampleDO.getSampleFilePath()); aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath());
//先获取关联的标签id //先获取关联的标签id
List<AiSampleTagRelateDO> tagRelateDOS = aiSampleTagRelateMapper.selectList(new LambdaQueryWrapper<AiSampleTagRelateDO>().eq(AiSampleTagRelateDO::getSampleId, id)); List<AiSampleTagRelateDO> tagRelateDOS = aiSampleTagRelateMapper.selectList(new LambdaQueryWrapper<AiSampleTagRelateDO>().eq(AiSampleTagRelateDO::getSampleId, id));
List<Long> tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList(); List<Long> tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList();
@@ -153,7 +169,7 @@ public class AiSampleServiceImpl implements AiSampleService {
Object[] tagsId = list.stream().map(AiSampleTagRelateDO::getSampleTagId).toArray(); Object[] tagsId = list.stream().map(AiSampleTagRelateDO::getSampleTagId).toArray();
List<AiSampleTagDO> list1 = aiSampleTagDOS.stream().filter(a -> ArrayUtil.containsAny(tagsId, a.getId())).toList(); List<AiSampleTagDO> list1 = aiSampleTagDOS.stream().filter(a -> ArrayUtil.containsAny(tagsId, a.getId())).toList();
aiSampleDO.setTags(list1); aiSampleDO.setTags(list1);
aiSampleDO.setSampleFilePath("http://192.168.1.231:48080"+aiSampleDO.getSampleFilePath()); aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath());
} }
return aiSampleDOPageResult; return aiSampleDOPageResult;
} }

View File

@@ -0,0 +1,14 @@
package com.tashow.cloud.ai.service.dialog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
/**
* ai-对话消息 Service 接口
*
* @author lwq
*/
public interface AiDialogMessageService extends IService<AiDialogMessageDO> {
}

View File

@@ -0,0 +1,20 @@
package com.tashow.cloud.ai.service.dialog;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* ai-对话消息 Service 实现类
*
* @author lwq
*/
@Service
@Validated
public class AiDialogMessageServiceImpl extends ServiceImpl<AiDialogMessageMapper, AiDialogMessageDO> implements AiDialogMessageService {
}

View File

@@ -0,0 +1,20 @@
package com.tashow.cloud.ai.service.dialog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
/**
* ai-对话 Service 接口
*
* @author lwq
*/
public interface AiDialogService extends IService<AiDialogDO> {
DialogResp getDialog(Long userId);
TranslateRespVo translate(TranslateReqVo fileReqVo);
}

View File

@@ -0,0 +1,146 @@
package com.tashow.cloud.ai.service.dialog;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMapper;
import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.infraapi.api.file.FileApi;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
/**
* ai-对话 Service 实现类
*
* @author lwq
*/
@Service
@Validated
@Slf4j
public class AiDialogServiceImpl extends ServiceImpl<AiDialogMapper, AiDialogDO> implements AiDialogService {
@Resource
private AiDialogMessageMapper aiDialogMessageMapper;
@Value("translate-server")
private String translateServer;
@Value("file-server")
private String fileServer;
@Resource
private FileApi fileApi;
@Override
public DialogResp getDialog(Long userId) {
AiDialogDO aiDialogDO = this.getOne(new LambdaQueryWrapper<AiDialogDO>().eq(AiDialogDO::getUserId, userId));
if (aiDialogDO == null) {
aiDialogDO = new AiDialogDO();
aiDialogDO.setDialogStatus(1);
aiDialogDO.setTitle("xxx");
aiDialogDO.setUserId(userId);
this.save(aiDialogDO);
}
List<AiDialogMessageDO> messageDOS = aiDialogMessageMapper.selectList(new LambdaQueryWrapper<AiDialogMessageDO>().eq(AiDialogMessageDO::getDialogId, aiDialogDO.getId()));
DialogResp resp = new DialogResp();
resp.setDialogId(aiDialogDO.getId());
resp.setTitle(aiDialogDO.getTitle());
resp.setMessages(messageDOS);
return resp;
}
@Override
@SneakyThrows
public TranslateRespVo translate(TranslateReqVo fileReqVo) {
//翻译结果
TranslateRespVo result = translate(fileReqVo.getFile());
//创建消息 持久化消息
result.setDialogId( fileReqVo.getDialogId());
result.setFilePlayTime( fileReqVo.getFilePlayTime());
//上传文件获取文件地址
String fileUrl = fileServer + fileApi.createFile(fileReqVo.getFile().getBytes());
result.setContentText(fileUrl);
result.setContentType(2);
//宠物档案 todo
result.setPetId(1l);
result.setPetName("猫猫翻译");
result.setPetAvatar("https://img1.baidu.com/it/u=1224902049,3440357835&fm=253&app=138&f=JPEG?w=801&h=800");
//获取当前最后的排序
AiDialogMessageDO aiDialogMessageDO = aiDialogMessageMapper.selectOne(new LambdaQueryWrapper<AiDialogMessageDO>()
.eq(AiDialogMessageDO::getDialogId, fileReqVo.getDialogId())
.orderByDesc(AiDialogMessageDO::getMessageOrder)
.last("limit 1")
);
result.setMessageOrder(aiDialogMessageDO.getMessageOrder()+1);
AiDialogMessageDO dialogMessageDO = BeanUtils.toBean(result, AiDialogMessageDO.class);
aiDialogMessageMapper.insert(dialogMessageDO);
return result;
}
private TranslateRespVo translate(MultipartFile file) {
//调用大模型接口
String result = "";
try {
result = HttpRequest.post(translateServer).form("audio_data", file).timeout(20000) //20秒超时时间
.execute().body();
} catch (Exception e) {
log.error("调用大模型翻译出错", e);
}
//
// {
// "species_labels": "cat",
// "is_species_sound": true,
// "confidence": 0.77200821734893,
// "intent_result": {
// "winner": "cat_舒服",
// "confidence": 69.55630087055536,
// "probabilities": {
// "cat_等待喂食": 0.0,
// "cat_舒服": 1.0
// }
// }
// }
//数据解析
JSONObject translateResult = JSON.parseObject(result);
//标签 如 cat dog
String speciesLabels = translateResult.getString("species_labels");
//解析翻译结果
JSONObject probabilities = translateResult.getJSONObject("intent_result")
.getJSONObject("probabilities");
String resultKey = probabilities.entrySet().stream()
.filter(entry -> entry.getValue() instanceof Number)
.max(Comparator.comparingDouble(entry -> ((Number) entry.getValue()).doubleValue()))
.map(Map.Entry::getKey)
.orElse(null);
String sourceResult = probabilities.getString(resultKey);
String lastResult = sourceResult.split(StrUtil.UNDERLINE)[1];
//返回结果
TranslateRespVo translateRespVo = new TranslateRespVo();
translateRespVo.setPetType(speciesLabels);
translateRespVo.setTranslateStatus(1);
translateRespVo.setTranslateResult(lastResult);
return translateRespVo;
}
}