diff --git a/sql/mysql/ai-manage.sql b/sql/mysql/ai-manage.sql index b160e05..ebf0d63 100644 --- a/sql/mysql/ai-manage.sql +++ b/sql/mysql/ai-manage.sql @@ -70,3 +70,34 @@ CREATE TABLE `tz_ai_sample_tag_group_relate` `sample_tag_group_id` bigint NOT NULL COMMENT '样本标签分组id', PRIMARY KEY (`id`) USING BTREE ) 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 '文本类型(1text,2image,3file,4audio)', + `message_order` int(8) NULL COMMENT '对话中的顺序', + `message_status` int(8) NULL COMMENT '消息状态 1正常 0删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB COMMENT = 'ai-对话消息表'; + + diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java index d16b70c..467e677 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java @@ -68,11 +68,21 @@ public class AiSampleController { @Parameter(name = "id", description = "编号", required = true) // @PreAuthorize("@ss.hasPermission('ai:sample:delete')") @PermitAll - public CommonResult deleteAiSample(@RequestParam("id") Long id) { - aiSampleService.deleteAiSample(id); + public CommonResult deleteAiSample(@RequestParam("id") String ids) { + aiSampleService.deleteAiSample(ids); return success(true); } + @GetMapping("/get") + @Operation(summary = "获得样本库") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('ai:sample:query')") + @PermitAll + public CommonResult getAiSample(@RequestParam("id") Long id) { + AiSampleDO aiSample = aiSampleService.getAiSample(id); + return success(BeanUtils.toBean(aiSample, AiSampleRespVO.class)); + } + @GetMapping("/page") @Operation(summary = "获得样本库分页") // @PreAuthorize("@ss.hasPermission('ai:sample:query')") diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java index 13fa8c0..1902063 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java @@ -5,7 +5,7 @@ import lombok.Data; import java.util.List; -@Schema(description = "管理后台 - 样本库新增/修改 Request VO") +@Schema(description = "管理后台 - 关联 Request VO") @Data public class AiSampleRelateTagVO { diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java new file mode 100644 index 0000000..43f1d47 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java @@ -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 message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭"); + + @Resource + private AiDialogService aiDialogService; + @Resource + private AiDialogMessageService messageService; + + /** + * 获取对话消息列表 + */ + @PostMapping("/getDialog") + @PermitAll + public CommonResult msList() { + //获取当前登录用户 + Long userId = 1l; + return success(aiDialogService.getDialog(userId)); + } + + + /** + * 翻译 + */ + @PostMapping("/translate") + @PermitAll + public CommonResult translate(@Validated TranslateReqVo fileReqVo) { + return success(aiDialogService.translate(fileReqVo)); + } +} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java new file mode 100644 index 0000000..a0f6efb --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java @@ -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 messages; +} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/Pets.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/Pets.java new file mode 100644 index 0000000..890d70d --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/Pets.java @@ -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; +} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java new file mode 100644 index 0000000..8305a55 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java @@ -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; + + +} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java new file mode 100644 index 0000000..c5cd398 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java @@ -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; + //消息类型(1text,2file) + 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; + +} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/translate/TranslateController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/translate/TranslateController.java deleted file mode 100644 index 36c1da7..0000000 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/translate/TranslateController.java +++ /dev/null @@ -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 message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭"); - - /** - * 翻译 - */ - @PostMapping("/translate") - @PermitAll - public CommonResult translate(MultipartFile file) { - // log.info("file:{}",file.getName()); - return success(message.get(RandomUtil.randomInt(0, message.size()))); - } -} diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogDO.java new file mode 100644 index 0000000..e923fef --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogDO.java @@ -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; + +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java new file mode 100644 index 0000000..7a6225b --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java @@ -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; + /** + * 文本类型(1text,2image,3file,4audio) + */ + 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; + +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMapper.java new file mode 100644 index 0000000..22c0cc2 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMapper.java @@ -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 { + +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMessageMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMessageMapper.java new file mode 100644 index 0000000..590ec3c --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMessageMapper.java @@ -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 { + + +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java index 1cad1eb..8e9d3c3 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java @@ -45,7 +45,7 @@ public interface AiSampleService { * * @param id 编号 */ - void deleteAiSample(Long id); + void deleteAiSample(String id); /** * 删除样本库 diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java index 1c336dd..39aa0b0 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java @@ -2,6 +2,7 @@ package com.tashow.cloud.ai.service.aisample; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tashow.cloud.ai.controller.admin.aisample.vo.*; 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 jakarta.annotation.Resource; import lombok.SneakyThrows; +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.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -39,6 +42,8 @@ public class AiSampleServiceImpl implements AiSampleService { private AiSampleTagRelateMapper aiSampleTagRelateMapper; @Resource private FileApi fileApi; + @Value("file-server") + private String fileServer; @Override @SneakyThrows @@ -48,7 +53,7 @@ public class AiSampleServiceImpl implements AiSampleService { /* 调用文件上传服务*/ 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.setSampleFilePath(file1); @@ -73,7 +78,7 @@ public class AiSampleServiceImpl implements AiSampleService { @Override public void updateAiSamples(List updateReqVO) { - aiSampleMapper.updateBatch( BeanUtils.toBean(updateReqVO, AiSampleDO.class)); + aiSampleMapper.updateBatch(BeanUtils.toBean(updateReqVO, AiSampleDO.class)); } @Override @@ -81,37 +86,48 @@ public class AiSampleServiceImpl implements AiSampleService { List tagRelateDOS = new ArrayList<>(); for (Long sampleId : relateTagVO.getSampleIds()) { for (Long tagId : relateTagVO.getTagId()) { - AiSampleTagRelateDO relateDO = new AiSampleTagRelateDO(); - relateDO.setSampleId(sampleId); - relateDO.setSampleTagId(tagId); - tagRelateDOS.add(relateDO); + AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne( + new LambdaQueryWrapper() + .eq(AiSampleTagRelateDO::getSampleId, sampleId) + .eq(AiSampleTagRelateDO::getSampleTagId, tagId) ); + if (relateDO== null){ + relateDO = new AiSampleTagRelateDO(); + relateDO.setSampleId(sampleId); + relateDO.setSampleTagId(tagId); + tagRelateDOS.add(relateDO); + } } } - aiSampleTagRelateMapper.insertBatch(tagRelateDOS); + if (!tagRelateDOS.isEmpty()){ + aiSampleTagRelateMapper.insertBatch(tagRelateDOS); + } } @Override public void deleteRelate(AiSampleRelateTagVO relateTagVO) { List tagRelateIds = new ArrayList<>(); for (Long sampleId : relateTagVO.getSampleIds()) { - for (Long l : relateTagVO.getTagId()) { + for (Long tagId : relateTagVO.getTagId()) { AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne( new LambdaQueryWrapper() .eq(AiSampleTagRelateDO::getSampleId, sampleId) - .eq(AiSampleTagRelateDO::getSampleTagId, l) + .eq(AiSampleTagRelateDO::getSampleTagId, tagId) ); - tagRelateIds.add(relateDO.getId()); + if (relateDO != null) { + tagRelateIds.add(relateDO.getId()); + } } + + } + if (!tagRelateIds.isEmpty()) { + aiSampleTagRelateMapper.deleteBatchIds(tagRelateIds); } - aiSampleTagRelateMapper.deleteBatchIds(tagRelateIds); } @Override - public void deleteAiSample(Long id) { - // 校验存在 - validateAiSampleExists(id); + public void deleteAiSample(String ids) { // 删除 - aiSampleMapper.deleteById(id); + aiSampleMapper.deleteByIds(Arrays.asList(ids.split(StrUtil.COMMA))); } private void validateAiSampleExists(Long id) { @@ -123,11 +139,11 @@ public class AiSampleServiceImpl implements AiSampleService { @Override public AiSampleDO getAiSample(Long id) { AiSampleDO aiSampleDO = aiSampleMapper.selectById(id); - aiSampleDO.setSampleFilePath("http://192.168.1.231:48080"+aiSampleDO.getSampleFilePath()); + aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath()); //先获取关联的标签id List tagRelateDOS = aiSampleTagRelateMapper.selectList(new LambdaQueryWrapper().eq(AiSampleTagRelateDO::getSampleId, id)); List tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList(); - aiSampleDO.setTags(aiSampleTagMapper.selectList(new LambdaQueryWrapper().in(AiSampleTagDO::getId,tagIds))); + aiSampleDO.setTags(aiSampleTagMapper.selectList(new LambdaQueryWrapper().in(AiSampleTagDO::getId, tagIds))); return aiSampleDO; } @@ -137,13 +153,13 @@ public class AiSampleServiceImpl implements AiSampleService { //根据样本id获取关联的标签id List sampleIds = aiSampleDOPageResult.getList().stream().map(AiSampleDO::getId).toList(); List tagRelateDOS = aiSampleTagRelateMapper.selectList( - new LambdaQueryWrapper() - .in(!sampleIds.isEmpty(),AiSampleTagRelateDO::getSampleId, sampleIds)); + new LambdaQueryWrapper() + .in(!sampleIds.isEmpty(), AiSampleTagRelateDO::getSampleId, sampleIds)); List tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList(); //获取标签信息 List aiSampleTagDOS = aiSampleTagMapper.selectList( new LambdaQueryWrapper() - .in(!tagIds.isEmpty(),AiSampleTagDO::getId, tagIds)); + .in(!tagIds.isEmpty(), AiSampleTagDO::getId, tagIds)); //封装标签信息 for (AiSampleDO aiSampleDO : aiSampleDOPageResult.getList()) { @@ -153,7 +169,7 @@ public class AiSampleServiceImpl implements AiSampleService { Object[] tagsId = list.stream().map(AiSampleTagRelateDO::getSampleTagId).toArray(); List list1 = aiSampleTagDOS.stream().filter(a -> ArrayUtil.containsAny(tagsId, a.getId())).toList(); aiSampleDO.setTags(list1); - aiSampleDO.setSampleFilePath("http://192.168.1.231:48080"+aiSampleDO.getSampleFilePath()); + aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath()); } return aiSampleDOPageResult; } diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageService.java new file mode 100644 index 0000000..d190880 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageService.java @@ -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 { + + +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageServiceImpl.java new file mode 100644 index 0000000..77d9a95 --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageServiceImpl.java @@ -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 implements AiDialogMessageService { + + +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java new file mode 100644 index 0000000..05b2a9b --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java @@ -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 { + + + DialogResp getDialog(Long userId); + + TranslateRespVo translate(TranslateReqVo fileReqVo); +} \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java new file mode 100644 index 0000000..c60b65d --- /dev/null +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java @@ -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 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().eq(AiDialogDO::getUserId, userId)); + if (aiDialogDO == null) { + aiDialogDO = new AiDialogDO(); + aiDialogDO.setDialogStatus(1); + aiDialogDO.setTitle("xxx"); + aiDialogDO.setUserId(userId); + this.save(aiDialogDO); + } + List messageDOS = aiDialogMessageMapper.selectList(new LambdaQueryWrapper().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() + .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; + } +} \ No newline at end of file