Commit 838f7175 by patrick

feat: message page search include roleName

parent bd8a139e
...@@ -19,6 +19,9 @@ public class AiChatConversationPageReqVO extends PageParam { ...@@ -19,6 +19,9 @@ public class AiChatConversationPageReqVO extends PageParam {
@Schema(description = "对话标题", example = "你好") @Schema(description = "对话标题", example = "你好")
private String title; private String title;
@Schema(description = "角色名字", example = "小黄")
private String roleName;
@Schema(description = "创建时间") @Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
......
...@@ -22,6 +22,9 @@ public class AiChatMessagePageReqVO extends PageParam { ...@@ -22,6 +22,9 @@ public class AiChatMessagePageReqVO extends PageParam {
@Schema(description = "消息内容", example = "你好") @Schema(description = "消息内容", example = "你好")
private String content; private String content;
@Schema(description = "角色", example = "合同生成")
private String roleName;
@Schema(description = "创建时间") @Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
......
...@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; ...@@ -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.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO; 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.chat.AiChatConversationDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
...@@ -30,10 +31,11 @@ public interface AiChatConversationMapper extends BaseMapperX<AiChatConversation ...@@ -30,10 +31,11 @@ public interface AiChatConversationMapper extends BaseMapperX<AiChatConversation
.eq(AiChatConversationDO::getPinned, pinned)); .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>() return selectPage(pageReqVO, new LambdaQueryWrapperX<AiChatConversationDO>()
.eqIfPresent(AiChatConversationDO::getUserId, pageReqVO.getUserId()) .eqIfPresent(AiChatConversationDO::getUserId, pageReqVO.getUserId())
.likeIfPresent(AiChatConversationDO::getTitle, pageReqVO.getTitle()) .likeIfPresent(AiChatConversationDO::getTitle, pageReqVO.getTitle())
.inIfPresent(AiChatConversationDO::getRoleId, roleIds)
.betweenIfPresent(AiChatConversationDO::getCreateTime, pageReqVO.getCreateTime()) .betweenIfPresent(AiChatConversationDO::getCreateTime, pageReqVO.getCreateTime())
.orderByDesc(AiChatConversationDO::getId)); .orderByDesc(AiChatConversationDO::getId));
} }
......
...@@ -60,19 +60,41 @@ public interface AiChatMessageMapper extends BaseMapperX<AiChatMessageDO> { ...@@ -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({ @Select({
"<script>", "<script>",
"SELECT * FROM ai_chat_message", "SELECT m.* FROM ai_chat_message m",
"<where>", "<where>",
" <if test='req.conversationId != null'> AND conversation_id = #{req.conversationId} </if>", " <if test='req.conversationId != null'> AND m.conversation_id = #{req.conversationId} </if>",
" <if test='req.userId != null'> AND user_id = #{req.userId} </if>", " <if test='req.userId != null'> AND m.user_id = #{req.userId} </if>",
" <if test='req.content != null'> AND content LIKE CONCAT('%', #{req.content}, '%') </if>", " <if test='req.content != null'> AND m.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.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>", "</where>",
"ORDER BY id DESC", "ORDER BY m.id DESC",
"</script>" "</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){ default Long selectCounts(Long conId){
return selectCount(new LambdaQueryWrapperX<AiChatMessageDO>() return selectCount(new LambdaQueryWrapperX<AiChatMessageDO>()
......
...@@ -19,10 +19,12 @@ import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService; ...@@ -19,10 +19,12 @@ import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; 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.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
...@@ -161,7 +163,19 @@ public class AiChatConversationServiceImpl implements AiChatConversationService ...@@ -161,7 +163,19 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
@Override @Override
public PageResult<AiChatConversationDO> getChatConversationPage(AiChatConversationPageReqVO pageReqVO) { 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 @Override
......
...@@ -17,10 +17,12 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessage ...@@ -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.AiChatConversationDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; 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.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.dal.mysql.chat.AiChatMessageMapper;
import cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants; 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.AiApiKeyService;
import cn.iocoder.yudao.module.ai.service.model.AiChatModelService; 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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
...@@ -34,12 +36,14 @@ import org.springframework.ai.chat.prompt.Prompt; ...@@ -34,12 +36,14 @@ import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MimeTypeUtils; import org.springframework.util.MimeTypeUtils;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; 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.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
...@@ -67,6 +71,9 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { ...@@ -67,6 +71,9 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
@Resource @Resource
private AiApiKeyService apiKeyService; private AiApiKeyService apiKeyService;
@Resource
private AiChatRoleService chatRoleService;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public AiChatMessageSendRespVO sendMessage(AiChatMessageSendReqVO sendReqVO, Long userId) throws MalformedURLException { public AiChatMessageSendRespVO sendMessage(AiChatMessageSendReqVO sendReqVO, Long userId) throws MalformedURLException {
// 1.1 校验对话存在 // 1.1 校验对话存在
...@@ -311,11 +318,24 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { ...@@ -311,11 +318,24 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
@Override @Override
public PageResult<AiChatMessageDO> getChatMessagePage(AiChatMessagePageReqVO pageReqVO) { 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()); IPage<AiChatMessageDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
// 调用 Mapper 方法 // 调用 Mapper 方法
IPage<AiChatMessageDO> resultPage = chatMessageMapper.selectPage(page, pageReqVO); IPage<AiChatMessageDO> resultPage = chatMessageMapper.selectPage(page, pageReqVO, roleIds);
// 转换为 PageResult // 转换为 PageResult
return new PageResult<>(resultPage.getRecords(), resultPage.getTotal()); return new PageResult<>(resultPage.getRecords(), resultPage.getTotal());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment