package cn.iocoder.yudao.module.ai.controller.admin.chat; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO; import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO; import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO; import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateMyReqVO; import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService; import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - AI 聊天对话") @RestController @RequestMapping("/ai/chat/conversation") @Validated public class AiChatConversationController { @Resource private AiChatConversationService chatConversationService; @Resource private AiChatMessageService chatMessageService; @PostMapping("/create-my") @Operation(summary = "创建【我的】聊天对话") public CommonResult createChatConversationMy(@RequestBody @Valid AiChatConversationCreateMyReqVO createReqVO) { return success(chatConversationService.createChatConversationMy(createReqVO, getLoginUserId())); } @PutMapping("/update-my") @Operation(summary = "更新【我的】聊天对话") public CommonResult updateChatConversationMy(@RequestBody @Valid AiChatConversationUpdateMyReqVO updateReqVO) { chatConversationService.updateChatConversationMy(updateReqVO, getLoginUserId()); return success(true); } @GetMapping("/my-list") @Operation(summary = "获得【我的】聊天对话列表") public CommonResult> getChatConversationMyList() { List list = chatConversationService.getChatConversationListByUserId(getLoginUserId()); return success(BeanUtils.toBean(list, AiChatConversationRespVO.class)); } @GetMapping("/get-my") @Operation(summary = "获得【我的】聊天对话") @Parameter(name = "id", required = true, description = "对话编号", example = "1024") public CommonResult getChatConversationMy(@RequestParam("id") Long id) { AiChatConversationDO conversation = chatConversationService.getChatConversation(id); if (conversation != null && ObjUtil.notEqual(conversation.getUserId(), getLoginUserId())) { conversation = null; } return success(BeanUtils.toBean(conversation, AiChatConversationRespVO.class)); } @DeleteMapping("/delete-my") @Operation(summary = "删除聊天对话") @Parameter(name = "id", required = true, description = "对话编号", example = "1024") public CommonResult deleteChatConversationMy(@RequestParam("id") Long id) { chatConversationService.deleteChatConversationMy(id, getLoginUserId()); return success(true); } @DeleteMapping("/delete-by-unpinned") @Operation(summary = "删除未置顶的聊天对话") public CommonResult deleteChatConversationMyByUnpinned() { chatConversationService.deleteChatConversationMyByUnpinned(getLoginUserId()); return success(true); } // ========== 对话管理 ========== @GetMapping("/page") @Operation(summary = "获得对话分页", description = "用于【对话管理】菜单") @PreAuthorize("@ss.hasPermission('ai:chat-conversation:query')") public CommonResult> getChatConversationPage(AiChatConversationPageReqVO pageReqVO) { PageResult pageResult = chatConversationService.getChatConversationPage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty()); } // 拼接关联数据 Map messageCountMap = chatMessageService.getChatMessageCountMap( convertList(pageResult.getList(), AiChatConversationDO::getId)); return success(BeanUtils.toBean(pageResult, AiChatConversationRespVO.class, conversation -> conversation.setMessageCount(messageCountMap.getOrDefault(conversation.getId(), 0)))); } @Operation(summary = "管理员删除对话") @DeleteMapping("/delete-by-admin") @Parameter(name = "id", required = true, description = "对话编号", example = "1024") @PreAuthorize("@ss.hasPermission('ai:chat-conversation:delete')") public CommonResult deleteChatConversationByAdmin(@RequestParam("id") Long id) { chatConversationService.deleteChatConversationByAdmin(id); return success(true); } }