13 Commits

Author SHA1 Message Date
evo
827ac48826 Merge pull request #200 from 20suiWXJB/fix/在-ruoyi-extend-中添加缺失的-ruoyi-ai-copilot-模块
fix(pom): 在 ruoyi-extend 中添加缺失的 ruoyi-ai-copilot 模块
2025-09-27 19:11:32 +08:00
evo
f906645708 Merge pull request #198 from wenxwang/fix/admin-knowledge-remove-error
fix(Knowledge): 知识库删除失败
2025-09-27 19:08:17 +08:00
evo
c17e16dd0f Merge pull request #181 from LM20230311/feat-model-priority
解决问答实现类中重新查询模型逻辑可能导致自动选择的模型被重置问题
2025-09-27 19:07:34 +08:00
evo
837236f1cc Merge pull request #180 from LM20230311/fix-upload-bucket
Fix upload bucket: 修复问答页面文件上传问题;
2025-09-27 19:07:15 +08:00
evo
60793b957a Merge pull request #179 from violateer/featur/remove_limit1_compat
feature: 移除limit 1写法,兼容不同数据库
2025-09-27 19:06:48 +08:00
evo
fa4dc87e76 Merge pull request #212 from MuSan-Li/feature_20250927_fix_oss_logic
feat: 删除oss创建桶配置
2025-09-27 19:06:14 +08:00
evo
4ac63c3268 feat: 删除oss创建桶配置 2025-09-27 19:05:27 +08:00
马宏跃
c22b9fdb9c fix(pom): 在 ruoyi-extend 中添加缺失的 ruoyi-ai-copilot 模块 2025-09-18 09:03:07 +08:00
w
ff0a3d1016 fix(Knowledge): 知识库删除失败 2025-09-17 12:00:27 +08:00
likunlong
67303cf5be feat: 上传已经确定模型的选择,这里只需要根据名字获取模型直接使用就好; 2025-08-26 09:54:08 +08:00
likunlong
5bd95b496a feat: 默认上传服务修改为本地minio;添加部署时自启动minio服务;添加minio的服务启动docker-compose脚本; 2025-08-25 11:04:52 +08:00
likunlong
8fcaa7c90c feat: 默认上传服务修改为本地minio;添加部署时自启动minio服务;添加minio的服务启动docker-compose脚本; 2025-08-25 10:53:48 +08:00
violateer
27398c1000 feature: 移除limit 1写法,兼容不同数据库 2025-08-23 19:02:51 +08:00
14 changed files with 104 additions and 34 deletions

View File

@@ -240,9 +240,9 @@ springdoc:
# persistAuthorization: true
info:
# 标题
title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档'
title: '标题:ruoyi-ai 接口文档'
# 描述
description: ' 用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
description: ''
# 版本
version: '版本号: ${ruoyi.version}'
# 作者信息

View File

@@ -68,7 +68,7 @@ public class OssClient {
}
this.client = build.build();
createBucket();
// createBucket();
} catch (Exception e) {
if (e instanceof OssException) {
throw e;

View File

@@ -36,7 +36,7 @@ public class ChatModelServiceImpl implements IChatModelService {
* 查询聊天模型
*/
@Override
public ChatModelVo queryById(Long id){
public ChatModelVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -103,7 +103,7 @@ public class ChatModelServiceImpl implements IChatModelService {
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatModel entity){
private void validEntityBeforeSave(ChatModel entity) {
// 判断是否包含*号
if (entity.getApiKey().contains("*")) {
// 重新设置key信息
@@ -116,7 +116,7 @@ public class ChatModelServiceImpl implements IChatModelService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
@@ -129,24 +129,25 @@ public class ChatModelServiceImpl implements IChatModelService {
public ChatModelVo selectModelByName(String modelName) {
return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getModelName, modelName));
}
/**
* 通过模型分类获取模型信息
*/
@Override
public ChatModelVo selectModelByCategory(String category) {
public ChatModelVo selectModelByCategory(String category) {
return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getCategory, category));
}
/**
* 通过模型分类获取优先级最高的模型信息
*/
@Override
public ChatModelVo selectModelByCategoryWithHighestPriority(String category) {
return baseMapper.selectVoOne(
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.orderByDesc(ChatModel::getPriority)
.last("LIMIT 1")
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.orderByDesc(ChatModel::getPriority),
false
);
}
@@ -156,11 +157,11 @@ public class ChatModelServiceImpl implements IChatModelService {
@Override
public ChatModelVo selectFallbackModelByCategoryAndLessPriority(String category, Integer currentPriority) {
return baseMapper.selectVoOne(
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.lt(ChatModel::getPriority, currentPriority)
.orderByDesc(ChatModel::getPriority)
.last("LIMIT 1")
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.lt(ChatModel::getPriority, currentPriority)
.orderByDesc(ChatModel::getPriority),
false
);
}

View File

@@ -23,10 +23,10 @@ public class ChatTokenServiceImpl implements IChatTokenService {
@Override
public ChatUsageToken queryByUserId(Long userId, String modelName) {
return baseMapper.selectOne(
new LambdaQueryWrapper<ChatUsageToken>()
.eq(ChatUsageToken::getUserId, userId)
.eq(ChatUsageToken::getModelName, modelName)
.last("limit 1")
new LambdaQueryWrapper<ChatUsageToken>()
.eq(ChatUsageToken::getUserId, userId)
.eq(ChatUsageToken::getModelName, modelName),
false
);
}
@@ -35,7 +35,7 @@ public class ChatTokenServiceImpl implements IChatTokenService {
*
*/
@Override
public void resetToken(Long userId,String modelName) {
public void resetToken(Long userId, String modelName) {
ChatUsageToken chatToken = queryByUserId(userId, modelName);
chatToken.setToken(0);
baseMapper.updateById(chatToken);
@@ -47,9 +47,9 @@ public class ChatTokenServiceImpl implements IChatTokenService {
*/
@Override
public void editToken(ChatUsageToken chatToken) {
if(chatToken.getId() == null){
if (chatToken.getId() == null) {
baseMapper.insert(chatToken);
}else {
} else {
baseMapper.updateById(chatToken);
}
}

View File

@@ -115,7 +115,6 @@ public class PromptTemplateServiceImpl implements IPromptTemplateService {
LambdaQueryWrapper<PromptTemplate> queryWrapper = Wrappers.lambdaQuery(PromptTemplate.class);
queryWrapper.eq(PromptTemplate::getCategory, category);
queryWrapper.orderByDesc(PromptTemplate::getUpdateTime);
queryWrapper.last("limit 1");
return baseMapper.selectVoOne(queryWrapper);
return baseMapper.selectVoOne(queryWrapper, false);
}
}

View File

@@ -2,6 +2,7 @@ package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.KnowledgeInfo;
import org.ruoyi.domain.vo.KnowledgeInfoVo;
@@ -15,4 +16,10 @@ import org.ruoyi.domain.vo.KnowledgeInfoVo;
@Mapper
public interface KnowledgeInfoMapper extends BaseMapperPlus<KnowledgeInfo, KnowledgeInfoVo> {
/**
* 根据kid查询知识库
* @param kid 知识库id
* @return KnowledgeInfo
*/
KnowledgeInfo selectByKid(@Param("kid") String kid);
}

View File

@@ -61,7 +61,7 @@ public interface IKnowledgeInfoService {
/**
* 删除知识库
*/
void removeKnowledge(String id);
void removeKnowledge(String kid);
/**
* 上传附件

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.ruoyi.mapper.KnowledgeInfoMapper">
<select id="selectByKid" resultType="org.ruoyi.domain.KnowledgeInfo">
SELECT * FROM knowledge_info WHERE kid = #{kid}
</select>
</mapper>

View File

@@ -102,9 +102,9 @@ public class KnowledgeController extends BaseController {
/**
* 删除知识库
*/
@PostMapping("/remove/{id}")
public R<String> remove(@PathVariable String id) {
knowledgeInfoService.removeKnowledge(id);
@PostMapping("/remove/{kid}")
public R<String> remove(@PathVariable String kid) {
knowledgeInfoService.removeKnowledge(kid);
return R.ok("删除知识库成功!");
}

View File

@@ -118,7 +118,7 @@ public class ImageServiceImpl implements IChatService {
@Override
public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) {
// 从数据库获取 image 类型的模型配置
ChatModelVo chatModelVo = chatModelService.selectModelByCategory(ChatModeType.IMAGE.getCode());
ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
if (chatModelVo == null) {
log.error("未找到 image 类型的模型配置");
emitter.completeWithError(new IllegalStateException("未找到 image 类型的模型配置"));

View File

@@ -226,11 +226,12 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
@Override
@Transactional(rollbackFor = Exception.class)
public void removeKnowledge(String id) {
public void removeKnowledge(String kid) {
Map<String, Object> map = new HashMap<>();
KnowledgeInfo knowledgeInfo = baseMapper.selectById(id);
KnowledgeInfo knowledgeInfo = baseMapper.selectByKid(kid);
check(knowledgeInfo);
map.put("kid", knowledgeInfo.getId());
map.put("kid", knowledgeInfo.getKid());
// 删除向量数据
vectorStoreService.removeById(String.valueOf(knowledgeInfo.getId()), knowledgeInfo.getVectorModelName());
// 删除附件和知识片段

View File

@@ -60,6 +60,23 @@ services:
networks:
- ruoyi-net
minio:
image: minio/minio
container_name: ruoyi-ai-minio
ports:
- "9000:9000"
- "9090:9090"
environment:
- MINIO_ACCESS_KEY=ruoyi
- MINIO_SECRET_KEY=ruoyi123
volumes:
- ./data/minio:/data
- ./data/minio-config:/root/.minio
command: server /data --console-address ":9090"
restart: always
networks:
- ruoyi-net
ruoyi-backend:
image: ruoyi-ai-backend:v2.0.5
container_name: ruoyi-ai-backend

View File

@@ -0,0 +1,28 @@
---
version: '3.8'
services:
minio:
image: minio/minio
container_name: minio
ports:
- "9000:9000"
- "9090:9090"
environment:
- MINIO_ACCESS_KEY=ruoyi
- MINIO_SECRET_KEY=ruoyi123
volumes:
- minio_data:/data
- minio_config:/root/.minio
command: server /data --console-address ":9090"
restart: always
networks:
- minio-net
networks:
minio-net:
driver: bridge
volumes:
minio_data:
minio_config:

View File

@@ -0,0 +1,8 @@
-- 默认开启本地minio
UPDATE `ruoyi-ai`.sys_oss_config t
SET t.status = '1'
WHERE t.oss_config_id = 4;
UPDATE `ruoyi-ai`.sys_oss_config t
SET t.status = '0'
WHERE t.oss_config_id = 1;