Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
shun peng
/
lufa-ai
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
838f7175
authored
Jul 11, 2025
by
patrick
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: message page search include roleName
parent
bd8a139e
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
75 additions
and
11 deletions
+75
-11
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationPageReqVO.java
+3
-0
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessagePageReqVO.java
+3
-0
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatConversationMapper.java
+3
-1
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatMessageMapper.java
+29
-7
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatConversationServiceImpl.java
+15
-1
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java
+22
-2
ruoyi-vue-pro-master-jdk17/yudao-server/.DS_Store
+0
-0
No files found.
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationPageReqVO.java
View file @
838f7175
...
...
@@ -19,6 +19,9 @@ public class AiChatConversationPageReqVO extends PageParam {
@Schema
(
description
=
"对话标题"
,
example
=
"你好"
)
private
String
title
;
@Schema
(
description
=
"角色名字"
,
example
=
"小黄"
)
private
String
roleName
;
@Schema
(
description
=
"创建时间"
)
@DateTimeFormat
(
pattern
=
FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND
)
private
LocalDateTime
[]
createTime
;
...
...
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessagePageReqVO.java
View file @
838f7175
...
...
@@ -22,6 +22,9 @@ public class AiChatMessagePageReqVO extends PageParam {
@Schema
(
description
=
"消息内容"
,
example
=
"你好"
)
private
String
content
;
@Schema
(
description
=
"角色"
,
example
=
"合同生成"
)
private
String
roleName
;
@Schema
(
description
=
"创建时间"
)
@DateTimeFormat
(
pattern
=
FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND
)
private
LocalDateTime
[]
createTime
;
...
...
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatConversationMapper.java
View file @
838f7175
...
...
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import
cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX
;
import
cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO
;
import
cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO
;
import
cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO
;
import
org.apache.ibatis.annotations.Mapper
;
import
java.util.List
;
...
...
@@ -30,10 +31,11 @@ public interface AiChatConversationMapper extends BaseMapperX<AiChatConversation
.
eq
(
AiChatConversationDO:
:
getPinned
,
pinned
));
}
default
PageResult
<
AiChatConversationDO
>
selectChatConversationPage
(
AiChatConversationPageReqVO
pageReqVO
)
{
default
PageResult
<
AiChatConversationDO
>
selectChatConversationPage
(
AiChatConversationPageReqVO
pageReqVO
,
List
<
Long
>
roleIds
)
{
return
selectPage
(
pageReqVO
,
new
LambdaQueryWrapperX
<
AiChatConversationDO
>()
.
eqIfPresent
(
AiChatConversationDO:
:
getUserId
,
pageReqVO
.
getUserId
())
.
likeIfPresent
(
AiChatConversationDO:
:
getTitle
,
pageReqVO
.
getTitle
())
.
inIfPresent
(
AiChatConversationDO:
:
getRoleId
,
roleIds
)
.
betweenIfPresent
(
AiChatConversationDO:
:
getCreateTime
,
pageReqVO
.
getCreateTime
())
.
orderByDesc
(
AiChatConversationDO:
:
getId
));
}
...
...
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatMessageMapper.java
View file @
838f7175
...
...
@@ -60,19 +60,41 @@ public interface AiChatMessageMapper extends BaseMapperX<AiChatMessageDO> {
/**
* 分页查询,忽略逻辑删除的过滤条件
*/
// @Select({
// "<script>",
// "SELECT * FROM ai_chat_message",
// "<where>",
// " <if test='req.conversationId != null'> AND conversation_id = #{req.conversationId} </if>",
// " <if test='req.userId != null'> AND user_id = #{req.userId} </if>",
// " <if test='req.content != null'> AND content LIKE CONCAT('%', #{req.content}, '%') </if>",
// " <if test='req.createTime != null'> AND create_time BETWEEN #{req.createTime[0]} AND #{req.createTime[1]} </if>",
// "</where>",
// "ORDER BY id DESC",
// "</script>"
// })
// IPage<AiChatMessageDO> selectPage(@Param("page") IPage<AiChatMessageDO> page, @Param("req") AiChatMessagePageReqVO pageReqVO);
@Select
({
"<script>"
,
"SELECT
* FROM ai_chat_message
"
,
"SELECT
m.* FROM ai_chat_message m
"
,
"<where>"
,
" <if test='req.conversationId != null'> AND conversation_id = #{req.conversationId} </if>"
,
" <if test='req.userId != null'> AND user_id = #{req.userId} </if>"
,
" <if test='req.content != null'> AND content LIKE CONCAT('%', #{req.content}, '%') </if>"
,
" <if test='req.createTime != null'> AND create_time BETWEEN #{req.createTime[0]} AND #{req.createTime[1]} </if>"
,
" <if test='req.conversationId != null'> AND m.conversation_id = #{req.conversationId} </if>"
,
" <if test='req.userId != null'> AND m.user_id = #{req.userId} </if>"
,
" <if test='req.content != null'> AND m.content LIKE CONCAT('%', #{req.content}, '%') </if>"
,
" <if test='req.createTime != null'> AND m.create_time BETWEEN #{req.createTime[0]} AND #{req.createTime[1]} </if>"
,
// 角色ID过滤条件
" <if test='roleIds != null'>"
,
" AND m.role_id IN"
,
" <foreach item='id' collection='roleIds' open='(' separator=',' close=')'>"
,
" #{id}"
,
" </foreach>"
,
" </if>"
,
"</where>"
,
"ORDER BY id DESC"
,
"ORDER BY
m.
id DESC"
,
"</script>"
})
IPage
<
AiChatMessageDO
>
selectPage
(
@Param
(
"page"
)
IPage
<
AiChatMessageDO
>
page
,
@Param
(
"req"
)
AiChatMessagePageReqVO
pageReqVO
);
IPage
<
AiChatMessageDO
>
selectPage
(
@Param
(
"page"
)
IPage
<
AiChatMessageDO
>
page
,
@Param
(
"req"
)
AiChatMessagePageReqVO
pageReqVO
,
@Param
(
"roleIds"
)
List
<
Long
>
roleIds
);
default
Long
selectCounts
(
Long
conId
){
return
selectCount
(
new
LambdaQueryWrapperX
<
AiChatMessageDO
>()
...
...
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatConversationServiceImpl.java
View file @
838f7175
...
...
@@ -19,10 +19,12 @@ import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
import
jakarta.annotation.Resource
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
org.springframework.validation.annotation.Validated
;
import
java.time.LocalDateTime
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
exception
.
util
.
ServiceExceptionUtil
.
exception
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
util
.
collection
.
CollectionUtils
.
convertList
;
...
...
@@ -161,7 +163,19 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
@Override
public
PageResult
<
AiChatConversationDO
>
getChatConversationPage
(
AiChatConversationPageReqVO
pageReqVO
)
{
return
chatConversationMapper
.
selectChatConversationPage
(
pageReqVO
);
// 初始化roleIds为null(表示不按角色过滤)
List
<
Long
>
roleIds
=
null
;
// 只有当角色名称不为空时才查询角色ID列表
if
(
StringUtils
.
hasText
(
pageReqVO
.
getRoleName
()))
{
// 根据角色名称查询角色列表
List
<
AiChatRoleDO
>
roleList
=
chatRoleService
.
getChatRoleListByName
(
pageReqVO
.
getRoleName
());
// 提取角色ID集合(使用Java 8 Stream API)
roleIds
=
roleList
.
stream
()
.
map
(
AiChatRoleDO:
:
getId
)
.
collect
(
Collectors
.
toList
());
}
return
chatConversationMapper
.
selectChatConversationPage
(
pageReqVO
,
roleIds
);
}
@Override
...
...
ruoyi-vue-pro-master-jdk17/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java
View file @
838f7175
...
...
@@ -17,10 +17,12 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessage
import
cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO
;
import
cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO
;
import
cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO
;
import
cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO
;
import
cn.iocoder.yudao.module.ai.dal.mysql.chat.AiChatMessageMapper
;
import
cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants
;
import
cn.iocoder.yudao.module.ai.service.model.AiApiKeyService
;
import
cn.iocoder.yudao.module.ai.service.model.AiChatModelService
;
import
cn.iocoder.yudao.module.ai.service.model.AiChatRoleService
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
jakarta.annotation.Resource
;
...
...
@@ -34,12 +36,14 @@ import org.springframework.ai.chat.prompt.Prompt;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.MimeTypeUtils
;
import
org.springframework.util.StringUtils
;
import
reactor.core.publisher.Flux
;
import
java.net.MalformedURLException
;
import
java.net.URL
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
exception
.
util
.
ServiceExceptionUtil
.
exception
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
pojo
.
CommonResult
.
error
;
...
...
@@ -67,6 +71,9 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
@Resource
private
AiApiKeyService
apiKeyService
;
@Resource
private
AiChatRoleService
chatRoleService
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
AiChatMessageSendRespVO
sendMessage
(
AiChatMessageSendReqVO
sendReqVO
,
Long
userId
)
throws
MalformedURLException
{
// 1.1 校验对话存在
...
...
@@ -311,11 +318,24 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
@Override
public
PageResult
<
AiChatMessageDO
>
getChatMessagePage
(
AiChatMessagePageReqVO
pageReqVO
)
{
// return chatMessageMapper.selectPage(pageReqVO);
// 处理角色名称过滤
List
<
Long
>
roleIds
=
null
;
if
(
StringUtils
.
hasText
(
pageReqVO
.
getRoleName
()))
{
// 根据角色名称模糊查询角色
List
<
AiChatRoleDO
>
roles
=
chatRoleService
.
getChatRoleListByName
(
pageReqVO
.
getRoleName
());
roleIds
=
roles
.
stream
()
.
map
(
AiChatRoleDO:
:
getId
)
.
collect
(
Collectors
.
toList
());
// 如果没有匹配角色,直接返回空分页
if
(
roleIds
.
isEmpty
())
{
return
new
PageResult
<>(
Collections
.
emptyList
(),
0L
);
}
}
// 创建分页对象
IPage
<
AiChatMessageDO
>
page
=
new
Page
<>(
pageReqVO
.
getPageNo
(),
pageReqVO
.
getPageSize
());
// 调用 Mapper 方法
IPage
<
AiChatMessageDO
>
resultPage
=
chatMessageMapper
.
selectPage
(
page
,
pageReqVO
);
IPage
<
AiChatMessageDO
>
resultPage
=
chatMessageMapper
.
selectPage
(
page
,
pageReqVO
,
roleIds
);
// 转换为 PageResult
return
new
PageResult
<>(
resultPage
.
getRecords
(),
resultPage
.
getTotal
());
}
...
...
ruoyi-vue-pro-master-jdk17/yudao-server/.DS_Store
View file @
838f7175
No preview for this file type
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment