移除与AI相关的接口、服务、实体类及Mapper文件,新增官网模块的相关实体类、控制器和服务接口。此次重构旨在清理不再使用的AI代码,并为官网模块提供基础支持。master
| @ -1,13 +0,0 @@ | |||
| package org.dromara.ai.constant; | |||
| public interface AiMessageRoleConstant { | |||
| // 系统 | |||
| static final String SYSTEM = "system"; | |||
| // 用户 | |||
| static final String USER = "user"; | |||
| // 智能体 | |||
| static final String ASSISTANT = "assistant"; | |||
| } | |||
| @ -1,5 +0,0 @@ | |||
| package org.dromara.ai.constant; | |||
| public interface AiModelTypeConstant { | |||
| String OPENAI = "openai"; | |||
| } | |||
| @ -1,105 +0,0 @@ | |||
| package org.dromara.ai.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.ai.domain.bo.AiAgentChatBo; | |||
| import org.dromara.ai.service.IAiAgentChatService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * 智能体的对话 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/ai/agentChat") | |||
| public class AiAgentChatController extends BaseController { | |||
| private final IAiAgentChatService aiAgentChatService; | |||
| /** | |||
| * 查询智能体的对话列表 | |||
| */ | |||
| @SaCheckPermission("ai:agentChat:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<AiAgentChatVo> list(AiAgentChatBo bo, PageQuery pageQuery) { | |||
| return aiAgentChatService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出智能体的对话列表 | |||
| */ | |||
| @SaCheckPermission("ai:agentChat:export") | |||
| @Log(title = "智能体的对话", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(AiAgentChatBo bo, HttpServletResponse response) { | |||
| List<AiAgentChatVo> list = aiAgentChatService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "智能体的对话", AiAgentChatVo.class, response); | |||
| } | |||
| /** | |||
| * 获取智能体的对话详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("ai:agentChat:query") | |||
| @GetMapping("/{id}") | |||
| public R<AiAgentChatVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(aiAgentChatService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增智能体的对话 | |||
| */ | |||
| @SaCheckPermission("ai:agentChat:add") | |||
| @Log(title = "智能体的对话", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody AiAgentChatBo bo) { | |||
| return toAjax(aiAgentChatService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改智能体的对话 | |||
| */ | |||
| @SaCheckPermission("ai:agentChat:edit") | |||
| @Log(title = "智能体的对话", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody AiAgentChatBo bo) { | |||
| return toAjax(aiAgentChatService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除智能体的对话 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("ai:agentChat:remove") | |||
| @Log(title = "智能体的对话", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(aiAgentChatService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -1,105 +0,0 @@ | |||
| package org.dromara.ai.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.ai.domain.bo.AiAgentChatHistoryBo; | |||
| import org.dromara.ai.service.IAiAgentChatHistoryService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * 聊天记录 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/ai/agentChatHistory") | |||
| public class AiAgentChatHistoryController extends BaseController { | |||
| private final IAiAgentChatHistoryService aiAgentChatHistoryService; | |||
| /** | |||
| * 查询聊天记录列表 | |||
| */ | |||
| @SaCheckPermission("ai:agentChatHistory:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<AiAgentChatHistoryVo> list(AiAgentChatHistoryBo bo, PageQuery pageQuery) { | |||
| return aiAgentChatHistoryService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出聊天记录列表 | |||
| */ | |||
| @SaCheckPermission("ai:agentChatHistory:export") | |||
| @Log(title = "聊天记录", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(AiAgentChatHistoryBo bo, HttpServletResponse response) { | |||
| List<AiAgentChatHistoryVo> list = aiAgentChatHistoryService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "聊天记录", AiAgentChatHistoryVo.class, response); | |||
| } | |||
| /** | |||
| * 获取聊天记录详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("ai:agentChatHistory:query") | |||
| @GetMapping("/{id}") | |||
| public R<AiAgentChatHistoryVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(aiAgentChatHistoryService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增聊天记录 | |||
| */ | |||
| @SaCheckPermission("ai:agentChatHistory:add") | |||
| @Log(title = "聊天记录", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody AiAgentChatHistoryBo bo) { | |||
| return toAjax(aiAgentChatHistoryService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改聊天记录 | |||
| */ | |||
| @SaCheckPermission("ai:agentChatHistory:edit") | |||
| @Log(title = "聊天记录", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody AiAgentChatHistoryBo bo) { | |||
| return toAjax(aiAgentChatHistoryService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除聊天记录 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("ai:agentChatHistory:remove") | |||
| @Log(title = "聊天记录", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(aiAgentChatHistoryService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -1,105 +0,0 @@ | |||
| package org.dromara.ai.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.ai.domain.vo.AiAgentVo; | |||
| import org.dromara.ai.domain.bo.AiAgentBo; | |||
| import org.dromara.ai.service.IAiAgentService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * 智能体 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/ai/agent") | |||
| public class AiAgentController extends BaseController { | |||
| private final IAiAgentService aiAgentService; | |||
| /** | |||
| * 查询智能体列表 | |||
| */ | |||
| @SaCheckPermission("ai:agent:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<AiAgentVo> list(AiAgentBo bo, PageQuery pageQuery) { | |||
| return aiAgentService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出智能体列表 | |||
| */ | |||
| @SaCheckPermission("ai:agent:export") | |||
| @Log(title = "智能体", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(AiAgentBo bo, HttpServletResponse response) { | |||
| List<AiAgentVo> list = aiAgentService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "智能体", AiAgentVo.class, response); | |||
| } | |||
| /** | |||
| * 获取智能体详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("ai:agent:query") | |||
| @GetMapping("/{id}") | |||
| public R<AiAgentVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(aiAgentService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增智能体 | |||
| */ | |||
| @SaCheckPermission("ai:agent:add") | |||
| @Log(title = "智能体", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody AiAgentBo bo) { | |||
| return toAjax(aiAgentService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改智能体 | |||
| */ | |||
| @SaCheckPermission("ai:agent:edit") | |||
| @Log(title = "智能体", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody AiAgentBo bo) { | |||
| return toAjax(aiAgentService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除智能体 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("ai:agent:remove") | |||
| @Log(title = "智能体", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(aiAgentService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -1,69 +0,0 @@ | |||
| package org.dromara.ai.controller; | |||
| import cn.dev33.satoken.annotation.SaIgnore; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.dromara.ai.domain.bo.AiAgentChatBo; | |||
| import org.dromara.ai.domain.bo.AiChatMessageBo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.ai.service.IChatService; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import reactor.core.publisher.Flux; | |||
| /*** | |||
| * 聊天接口 | |||
| */ | |||
| @SaIgnore | |||
| @RestController | |||
| @RequestMapping("/api/ai/chat") | |||
| @RequiredArgsConstructor | |||
| public class ChatController { | |||
| private final IChatService chatService; | |||
| /** | |||
| * 获取我的对话 | |||
| */ | |||
| @GetMapping("/listMyChats") | |||
| public R<TableDataInfo<AiAgentChatVo>> queryPageList(AiAgentChatBo bo, PageQuery pageQuery){ | |||
| return R.ok(chatService.listMyChats(bo, pageQuery)); | |||
| } | |||
| /** | |||
| * 获取我的聊天记录 | |||
| */ | |||
| @GetMapping("/getMyChatMessages/{chatId}") | |||
| public R<TableDataInfo<AiAgentChatHistoryVo>> getMyChatMessages(@PathVariable("chatId") Long chatId, PageQuery pageQuery){ | |||
| return R.ok(chatService.getMyChatMessages(chatId, pageQuery)); | |||
| } | |||
| /*** | |||
| * 聊天,流式数据 | |||
| * @param message 用户发给ai的消息 | |||
| * @return Flux | |||
| */ | |||
| @GetMapping(value = "/sendMessageFlux",produces = "text/event-stream;charset=utf-8") | |||
| public Flux sendMessageFlux(@Validated(AddGroup.class) AiChatMessageBo message){ | |||
| return chatService.sendMessageFlux(message); | |||
| } | |||
| /*** | |||
| * 聊天 | |||
| * @param message 用户发给ai的消息 | |||
| * @return R<String> | |||
| */ | |||
| @GetMapping(value = "/sendMessage") | |||
| public R<String> sendMessage(@Validated(AddGroup.class) AiChatMessageBo message){ | |||
| return R.ok(chatService.sendMessage(message)); | |||
| } | |||
| } | |||
| @ -1,53 +0,0 @@ | |||
| package org.dromara.ai.domain.bo; | |||
| import org.dromara.ai.domain.AiAgent; | |||
| import org.dromara.common.mybatis.core.domain.BaseEntity; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import io.github.linpeilie.annotations.AutoMapper; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import jakarta.validation.constraints.*; | |||
| /** | |||
| * 智能体业务对象 ai_agent | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @AutoMapper(target = AiAgent.class, reverseConvertGenerate = false) | |||
| public class AiAgentBo extends BaseEntity { | |||
| /** | |||
| * 编号 | |||
| */ | |||
| @NotNull(message = "编号不能为空", groups = { EditGroup.class }) | |||
| private Long id; | |||
| /** | |||
| * 智能体名称 | |||
| */ | |||
| @NotBlank(message = "智能体名称不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private String name; | |||
| /** | |||
| * 状态 | |||
| */ | |||
| @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private Long status; | |||
| /** | |||
| * 备注 | |||
| */ | |||
| private String remark; | |||
| /** | |||
| * 排序 | |||
| */ | |||
| @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private Long aiSort; | |||
| } | |||
| @ -1,56 +0,0 @@ | |||
| package org.dromara.ai.domain.bo; | |||
| import lombok.*; | |||
| import org.dromara.ai.domain.AiAgentChat; | |||
| import org.dromara.common.mybatis.core.domain.BaseEntity; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import io.github.linpeilie.annotations.AutoMapper; | |||
| import jakarta.validation.constraints.*; | |||
| /** | |||
| * 智能体的对话业务对象 ai_agent_chat | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @AutoMapper(target = AiAgentChat.class, reverseConvertGenerate = false) | |||
| @Builder | |||
| @AllArgsConstructor | |||
| @NoArgsConstructor | |||
| public class AiAgentChatBo extends BaseEntity { | |||
| /** | |||
| * 编号 | |||
| */ | |||
| @NotNull(message = "编号不能为空", groups = { EditGroup.class }) | |||
| private Long id; | |||
| /** | |||
| * 智能体id | |||
| */ | |||
| @NotNull(message = "智能体id不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private Long agentId; | |||
| /** | |||
| * 用户id | |||
| */ | |||
| @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private Long uid; | |||
| /** | |||
| * 对话名称 | |||
| */ | |||
| @NotBlank(message = "对话名称不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private String chatName; | |||
| /** | |||
| * 排序 | |||
| */ | |||
| @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private Long aiSort; | |||
| } | |||
| @ -1,60 +0,0 @@ | |||
| package org.dromara.ai.domain.bo; | |||
| import lombok.*; | |||
| import org.dromara.ai.domain.AiAgentChatHistory; | |||
| import org.dromara.common.mybatis.core.domain.BaseEntity; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import io.github.linpeilie.annotations.AutoMapper; | |||
| import jakarta.validation.constraints.*; | |||
| /** | |||
| * 聊天记录业务对象 ai_agent_chat_history | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @AutoMapper(target = AiAgentChatHistory.class, reverseConvertGenerate = false) | |||
| @Builder | |||
| @AllArgsConstructor | |||
| @NoArgsConstructor | |||
| public class AiAgentChatHistoryBo extends BaseEntity { | |||
| /** | |||
| * 编号 | |||
| */ | |||
| @NotNull(message = "编号不能为空", groups = { EditGroup.class }) | |||
| private Long id; | |||
| /** | |||
| * 对话id | |||
| */ | |||
| private Long agentChatId; | |||
| /** | |||
| * 智能体id | |||
| */ | |||
| private Long agentId; | |||
| /** | |||
| * 对话身份 | |||
| */ | |||
| @NotBlank(message = "对话身份不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private String role; | |||
| /** | |||
| * 对话内容 | |||
| */ | |||
| @NotBlank(message = "对话内容不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private String message; | |||
| /** | |||
| * 排序 | |||
| */ | |||
| @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) | |||
| private Long aiSort; | |||
| } | |||
| @ -1,32 +0,0 @@ | |||
| package org.dromara.ai.domain.bo; | |||
| import jakarta.validation.constraints.NotNull; | |||
| import lombok.*; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| @Data | |||
| @Builder | |||
| @AllArgsConstructor | |||
| @NoArgsConstructor | |||
| public class AiChatMessageBo { | |||
| // 模型类型 | |||
| private String modelType; | |||
| // 模型 | |||
| private String model; | |||
| // 智能体id | |||
| @NotNull(message = "智能体id不能为空", groups = AddGroup.class) | |||
| private Long agentId; | |||
| // 消息 | |||
| @NotNull(message = "消息不能为空", groups = AddGroup.class) | |||
| private String message; | |||
| // 对话id | |||
| @NotNull(message = "对话id不能为空", groups = AddGroup.class) | |||
| private Long chatId; | |||
| } | |||
| @ -1,69 +0,0 @@ | |||
| package org.dromara.ai.domain.vo; | |||
| import org.dromara.ai.domain.AiAgentChatHistory; | |||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | |||
| import com.alibaba.excel.annotation.ExcelProperty; | |||
| import org.dromara.common.excel.annotation.ExcelDictFormat; | |||
| import org.dromara.common.excel.convert.ExcelDictConvert; | |||
| import io.github.linpeilie.annotations.AutoMapper; | |||
| import lombok.Data; | |||
| import java.io.Serial; | |||
| import java.io.Serializable; | |||
| import java.util.Date; | |||
| /** | |||
| * 聊天记录视图对象 ai_agent_chat_history | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Data | |||
| @ExcelIgnoreUnannotated | |||
| @AutoMapper(target = AiAgentChatHistory.class) | |||
| public class AiAgentChatHistoryVo implements Serializable { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| /** | |||
| * 编号 | |||
| */ | |||
| @ExcelProperty(value = "编号") | |||
| private Long id; | |||
| /** | |||
| * 对话id | |||
| */ | |||
| @ExcelProperty(value = "对话id") | |||
| private Long agentChatId; | |||
| /** | |||
| * 智能体id | |||
| */ | |||
| @ExcelProperty(value = "智能体id") | |||
| private Long agentId; | |||
| /** | |||
| * 对话身份 | |||
| */ | |||
| @ExcelProperty(value = "对话身份", converter = ExcelDictConvert.class) | |||
| @ExcelDictFormat(dictType = "ai_agent_chat_history_role") | |||
| private String role; | |||
| /** | |||
| * 对话内容 | |||
| */ | |||
| @ExcelProperty(value = "对话内容") | |||
| private String message; | |||
| /** | |||
| * 排序 | |||
| */ | |||
| @ExcelProperty(value = "排序") | |||
| private Long aiSort; | |||
| } | |||
| @ -1,74 +0,0 @@ | |||
| package org.dromara.ai.domain.vo; | |||
| import org.dromara.ai.domain.AiAgentChat; | |||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | |||
| import com.alibaba.excel.annotation.ExcelProperty; | |||
| import org.dromara.common.excel.annotation.ExcelDictFormat; | |||
| import org.dromara.common.excel.convert.ExcelDictConvert; | |||
| import io.github.linpeilie.annotations.AutoMapper; | |||
| import lombok.Data; | |||
| import java.io.Serial; | |||
| import java.io.Serializable; | |||
| import java.util.Date; | |||
| /** | |||
| * 智能体的对话视图对象 ai_agent_chat | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @Data | |||
| @ExcelIgnoreUnannotated | |||
| @AutoMapper(target = AiAgentChat.class) | |||
| public class AiAgentChatVo implements Serializable { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| /** | |||
| * 编号 | |||
| */ | |||
| @ExcelProperty(value = "编号") | |||
| private Long id; | |||
| /** | |||
| * 智能体id | |||
| */ | |||
| @ExcelProperty(value = "智能体id") | |||
| private Long agentId; | |||
| /** | |||
| * 智能体名称 | |||
| */ | |||
| @ExcelProperty(value = "智能体名称") | |||
| private String agentName; | |||
| /** | |||
| * 用户id | |||
| */ | |||
| @ExcelProperty(value = "用户id") | |||
| private Long uid; | |||
| /** | |||
| * 用户名称 | |||
| */ | |||
| @ExcelProperty(value = "用户名称") | |||
| private String nickName; | |||
| /** | |||
| * 对话名称 | |||
| */ | |||
| @ExcelProperty(value = "对话名称") | |||
| private String chatName; | |||
| /** | |||
| * 排序 | |||
| */ | |||
| @ExcelProperty(value = "排序") | |||
| private Long aiSort; | |||
| } | |||
| @ -1,15 +0,0 @@ | |||
| package org.dromara.ai.mapper; | |||
| import org.dromara.ai.domain.AiAgentChatHistory; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | |||
| /** | |||
| * 聊天记录Mapper接口 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| public interface AiAgentChatHistoryMapper extends BaseMapperPlus<AiAgentChatHistory, AiAgentChatHistoryVo> { | |||
| } | |||
| @ -1,15 +0,0 @@ | |||
| package org.dromara.ai.mapper; | |||
| import org.dromara.ai.domain.AiAgentChat; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | |||
| /** | |||
| * 智能体的对话Mapper接口 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| public interface AiAgentChatMapper extends BaseMapperPlus<AiAgentChat, AiAgentChatVo> { | |||
| } | |||
| @ -1,15 +0,0 @@ | |||
| package org.dromara.ai.mapper; | |||
| import org.dromara.ai.domain.AiAgent; | |||
| import org.dromara.ai.domain.vo.AiAgentVo; | |||
| import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | |||
| /** | |||
| * 智能体Mapper接口 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| public interface AiAgentMapper extends BaseMapperPlus<AiAgent, AiAgentVo> { | |||
| } | |||
| @ -1,76 +0,0 @@ | |||
| package org.dromara.ai.service; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.ai.domain.bo.AiAgentChatHistoryBo; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import java.util.Collection; | |||
| import java.util.List; | |||
| /** | |||
| * 聊天记录Service接口 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| public interface IAiAgentChatHistoryService { | |||
| /** | |||
| * 查询聊天记录 | |||
| * | |||
| * @param id 主键 | |||
| * @return 聊天记录 | |||
| */ | |||
| AiAgentChatHistoryVo queryById(Long id); | |||
| /** | |||
| * 分页查询聊天记录列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @param pageQuery 分页参数 | |||
| * @return 聊天记录分页列表 | |||
| */ | |||
| TableDataInfo<AiAgentChatHistoryVo> queryPageList(AiAgentChatHistoryBo bo, PageQuery pageQuery); | |||
| /** | |||
| * 查询符合条件的聊天记录列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @return 聊天记录列表 | |||
| */ | |||
| List<AiAgentChatHistoryVo> queryList(AiAgentChatHistoryBo bo); | |||
| /** | |||
| * 根据智能体id查询系统消息列表 | |||
| * | |||
| * @param agentId 智能体ID | |||
| * @return 聊天记录列表 | |||
| */ | |||
| List<AiAgentChatHistoryVo> querySystemOverallList(Long agentId); | |||
| /** | |||
| * 新增聊天记录 | |||
| * | |||
| * @param bo 聊天记录 | |||
| * @return 是否新增成功 | |||
| */ | |||
| Boolean insertByBo(AiAgentChatHistoryBo bo); | |||
| /** | |||
| * 修改聊天记录 | |||
| * | |||
| * @param bo 聊天记录 | |||
| * @return 是否修改成功 | |||
| */ | |||
| Boolean updateByBo(AiAgentChatHistoryBo bo); | |||
| /** | |||
| * 校验并批量删除聊天记录信息 | |||
| * | |||
| * @param ids 待删除的主键集合 | |||
| * @param isValid 是否进行有效性校验 | |||
| * @return 是否删除成功 | |||
| */ | |||
| Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | |||
| } | |||
| @ -1,68 +0,0 @@ | |||
| package org.dromara.ai.service; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.ai.domain.bo.AiAgentChatBo; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import java.util.Collection; | |||
| import java.util.List; | |||
| /** | |||
| * 智能体的对话Service接口 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| public interface IAiAgentChatService { | |||
| /** | |||
| * 查询智能体的对话 | |||
| * | |||
| * @param id 主键 | |||
| * @return 智能体的对话 | |||
| */ | |||
| AiAgentChatVo queryById(Long id); | |||
| /** | |||
| * 分页查询智能体的对话列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @param pageQuery 分页参数 | |||
| * @return 智能体的对话分页列表 | |||
| */ | |||
| TableDataInfo<AiAgentChatVo> queryPageList(AiAgentChatBo bo, PageQuery pageQuery); | |||
| /** | |||
| * 查询符合条件的智能体的对话列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @return 智能体的对话列表 | |||
| */ | |||
| List<AiAgentChatVo> queryList(AiAgentChatBo bo); | |||
| /** | |||
| * 新增智能体的对话 | |||
| * | |||
| * @param bo 智能体的对话 | |||
| * @return 是否新增成功 | |||
| */ | |||
| Boolean insertByBo(AiAgentChatBo bo); | |||
| /** | |||
| * 修改智能体的对话 | |||
| * | |||
| * @param bo 智能体的对话 | |||
| * @return 是否修改成功 | |||
| */ | |||
| Boolean updateByBo(AiAgentChatBo bo); | |||
| /** | |||
| * 校验并批量删除智能体的对话信息 | |||
| * | |||
| * @param ids 待删除的主键集合 | |||
| * @param isValid 是否进行有效性校验 | |||
| * @return 是否删除成功 | |||
| */ | |||
| Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | |||
| } | |||
| @ -1,68 +0,0 @@ | |||
| package org.dromara.ai.service; | |||
| import org.dromara.ai.domain.vo.AiAgentVo; | |||
| import org.dromara.ai.domain.bo.AiAgentBo; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import java.util.Collection; | |||
| import java.util.List; | |||
| /** | |||
| * 智能体Service接口 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| public interface IAiAgentService { | |||
| /** | |||
| * 查询智能体 | |||
| * | |||
| * @param id 主键 | |||
| * @return 智能体 | |||
| */ | |||
| AiAgentVo queryById(Long id); | |||
| /** | |||
| * 分页查询智能体列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @param pageQuery 分页参数 | |||
| * @return 智能体分页列表 | |||
| */ | |||
| TableDataInfo<AiAgentVo> queryPageList(AiAgentBo bo, PageQuery pageQuery); | |||
| /** | |||
| * 查询符合条件的智能体列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @return 智能体列表 | |||
| */ | |||
| List<AiAgentVo> queryList(AiAgentBo bo); | |||
| /** | |||
| * 新增智能体 | |||
| * | |||
| * @param bo 智能体 | |||
| * @return 是否新增成功 | |||
| */ | |||
| Boolean insertByBo(AiAgentBo bo); | |||
| /** | |||
| * 修改智能体 | |||
| * | |||
| * @param bo 智能体 | |||
| * @return 是否修改成功 | |||
| */ | |||
| Boolean updateByBo(AiAgentBo bo); | |||
| /** | |||
| * 校验并批量删除智能体信息 | |||
| * | |||
| * @param ids 待删除的主键集合 | |||
| * @param isValid 是否进行有效性校验 | |||
| * @return 是否删除成功 | |||
| */ | |||
| Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | |||
| } | |||
| @ -1,34 +0,0 @@ | |||
| package org.dromara.ai.service; | |||
| import org.dromara.ai.domain.bo.AiAgentChatBo; | |||
| import org.dromara.ai.domain.bo.AiChatMessageBo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import reactor.core.publisher.Flux; | |||
| import java.util.List; | |||
| public interface IChatService { | |||
| /** | |||
| * 查询我的对话列表 | |||
| */ | |||
| TableDataInfo<AiAgentChatVo> listMyChats(AiAgentChatBo bo, PageQuery pageQuery); | |||
| /** | |||
| * 获取我的聊天记录 | |||
| */ | |||
| TableDataInfo<AiAgentChatHistoryVo> getMyChatMessages(Long chatId, PageQuery pageQuery); | |||
| /*** | |||
| * 发送消息给AI | |||
| */ | |||
| String sendMessage(AiChatMessageBo message); | |||
| /*** | |||
| * 发送消息给AI,流式返回数据 | |||
| */ | |||
| Flux sendMessageFlux(AiChatMessageBo message); | |||
| } | |||
| @ -1,4 +0,0 @@ | |||
| package org.dromara.ai.service; | |||
| public interface IChatServiceNew { | |||
| } | |||
| @ -1,148 +0,0 @@ | |||
| package org.dromara.ai.service.impl; | |||
| import org.dromara.ai.constant.AiMessageRoleConstant; | |||
| import org.dromara.common.core.utils.MapstructUtils; | |||
| import org.dromara.common.core.utils.StringUtils; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.springframework.stereotype.Service; | |||
| import org.dromara.ai.domain.bo.AiAgentChatHistoryBo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.ai.domain.AiAgentChatHistory; | |||
| import org.dromara.ai.mapper.AiAgentChatHistoryMapper; | |||
| import org.dromara.ai.service.IAiAgentChatHistoryService; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Collection; | |||
| /** | |||
| * 聊天记录Service业务层处理 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @RequiredArgsConstructor | |||
| @Service | |||
| public class AiAgentChatHistoryServiceImpl implements IAiAgentChatHistoryService { | |||
| private final AiAgentChatHistoryMapper baseMapper; | |||
| /** | |||
| * 查询聊天记录 | |||
| * | |||
| * @param id 主键 | |||
| * @return 聊天记录 | |||
| */ | |||
| @Override | |||
| public AiAgentChatHistoryVo queryById(Long id){ | |||
| return baseMapper.selectVoById(id); | |||
| } | |||
| /** | |||
| * 分页查询聊天记录列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @param pageQuery 分页参数 | |||
| * @return 聊天记录分页列表 | |||
| */ | |||
| @Override | |||
| public TableDataInfo<AiAgentChatHistoryVo> queryPageList(AiAgentChatHistoryBo bo, PageQuery pageQuery) { | |||
| LambdaQueryWrapper<AiAgentChatHistory> lqw = buildQueryWrapper(bo); | |||
| Page<AiAgentChatHistoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | |||
| return TableDataInfo.build(result); | |||
| } | |||
| /** | |||
| * 查询符合条件的聊天记录列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @return 聊天记录列表 | |||
| */ | |||
| @Override | |||
| public List<AiAgentChatHistoryVo> queryList(AiAgentChatHistoryBo bo) { | |||
| LambdaQueryWrapper<AiAgentChatHistory> lqw = buildQueryWrapper(bo); | |||
| return baseMapper.selectVoList(lqw); | |||
| } | |||
| @Override | |||
| public List<AiAgentChatHistoryVo> querySystemOverallList(Long agentId) { | |||
| LambdaQueryWrapper<AiAgentChatHistory> lqw = Wrappers.<AiAgentChatHistory>lambdaQuery() | |||
| .eq(AiAgentChatHistory::getRole, AiMessageRoleConstant.SYSTEM) | |||
| .and(n -> { | |||
| n.isNull(AiAgentChatHistory::getAgentChatId) | |||
| .eq(AiAgentChatHistory::getAgentId, agentId) | |||
| .or() | |||
| .isNull(AiAgentChatHistory::getAgentId); | |||
| }); | |||
| return baseMapper.selectVoList(lqw); | |||
| } | |||
| private LambdaQueryWrapper<AiAgentChatHistory> buildQueryWrapper(AiAgentChatHistoryBo bo) { | |||
| Map<String, Object> params = bo.getParams(); | |||
| LambdaQueryWrapper<AiAgentChatHistory> lqw = Wrappers.lambdaQuery(); | |||
| lqw.eq(bo.getAgentChatId() != null, AiAgentChatHistory::getAgentChatId, bo.getAgentChatId()); | |||
| lqw.eq(StringUtils.isNotBlank(bo.getRole()), AiAgentChatHistory::getRole, bo.getRole()); | |||
| lqw.eq(StringUtils.isNotBlank(bo.getMessage()), AiAgentChatHistory::getMessage, bo.getMessage()); | |||
| lqw.eq(bo.getAiSort() != null, AiAgentChatHistory::getAiSort, bo.getAiSort()); | |||
| return lqw; | |||
| } | |||
| /** | |||
| * 新增聊天记录 | |||
| * | |||
| * @param bo 聊天记录 | |||
| * @return 是否新增成功 | |||
| */ | |||
| @Override | |||
| public Boolean insertByBo(AiAgentChatHistoryBo bo) { | |||
| AiAgentChatHistory add = MapstructUtils.convert(bo, AiAgentChatHistory.class); | |||
| validEntityBeforeSave(add); | |||
| boolean flag = baseMapper.insert(add) > 0; | |||
| if (flag) { | |||
| bo.setId(add.getId()); | |||
| } | |||
| return flag; | |||
| } | |||
| /** | |||
| * 修改聊天记录 | |||
| * | |||
| * @param bo 聊天记录 | |||
| * @return 是否修改成功 | |||
| */ | |||
| @Override | |||
| public Boolean updateByBo(AiAgentChatHistoryBo bo) { | |||
| AiAgentChatHistory update = MapstructUtils.convert(bo, AiAgentChatHistory.class); | |||
| validEntityBeforeSave(update); | |||
| return baseMapper.updateById(update) > 0; | |||
| } | |||
| /** | |||
| * 保存前的数据校验 | |||
| */ | |||
| private void validEntityBeforeSave(AiAgentChatHistory entity){ | |||
| //TODO 做一些数据校验,如唯一约束 | |||
| } | |||
| /** | |||
| * 校验并批量删除聊天记录信息 | |||
| * | |||
| * @param ids 待删除的主键集合 | |||
| * @param isValid 是否进行有效性校验 | |||
| * @return 是否删除成功 | |||
| */ | |||
| @Override | |||
| public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | |||
| if(isValid){ | |||
| //TODO 做一些业务上的校验,判断是否需要校验 | |||
| } | |||
| return baseMapper.deleteByIds(ids) > 0; | |||
| } | |||
| } | |||
| @ -1,168 +0,0 @@ | |||
| package org.dromara.ai.service.impl; | |||
| import org.dromara.ai.domain.AiAgent; | |||
| import org.dromara.ai.mapper.AiAgentMapper; | |||
| import org.dromara.common.core.domain.dto.UserDTO; | |||
| import org.dromara.common.core.service.UserService; | |||
| import org.dromara.common.core.utils.MapstructUtils; | |||
| import org.dromara.common.core.utils.StringUtils; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.dromara.system.mapper.SysUserMapper; | |||
| import org.springframework.stereotype.Service; | |||
| import org.dromara.ai.domain.bo.AiAgentChatBo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.ai.domain.AiAgentChat; | |||
| import org.dromara.ai.mapper.AiAgentChatMapper; | |||
| import org.dromara.ai.service.IAiAgentChatService; | |||
| import java.util.*; | |||
| import java.util.function.Function; | |||
| import java.util.stream.Collectors; | |||
| /** | |||
| * 智能体的对话Service业务层处理 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @RequiredArgsConstructor | |||
| @Service | |||
| public class AiAgentChatServiceImpl implements IAiAgentChatService { | |||
| private final AiAgentChatMapper baseMapper; | |||
| private final AiAgentMapper aiAgentMapper; | |||
| private final UserService userService; | |||
| // private final SysUserMapper userMapper; | |||
| /** | |||
| * 查询智能体的对话 | |||
| * | |||
| * @param id 主键 | |||
| * @return 智能体的对话 | |||
| */ | |||
| @Override | |||
| public AiAgentChatVo queryById(Long id){ | |||
| return baseMapper.selectVoById(id); | |||
| } | |||
| /** | |||
| * 分页查询智能体的对话列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @param pageQuery 分页参数 | |||
| * @return 智能体的对话分页列表 | |||
| */ | |||
| @Override | |||
| public TableDataInfo<AiAgentChatVo> queryPageList(AiAgentChatBo bo, PageQuery pageQuery) { | |||
| LambdaQueryWrapper<AiAgentChat> lqw = buildQueryWrapper(bo); | |||
| Page<AiAgentChatVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | |||
| if(bo.getParams().containsKey("extend")){ | |||
| setExtendInfo(result.getRecords()); | |||
| } | |||
| return TableDataInfo.build(result); | |||
| } | |||
| /** | |||
| * 查询符合条件的智能体的对话列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @return 智能体的对话列表 | |||
| */ | |||
| @Override | |||
| public List<AiAgentChatVo> queryList(AiAgentChatBo bo) { | |||
| LambdaQueryWrapper<AiAgentChat> lqw = buildQueryWrapper(bo); | |||
| return baseMapper.selectVoList(lqw); | |||
| } | |||
| private LambdaQueryWrapper<AiAgentChat> buildQueryWrapper(AiAgentChatBo bo) { | |||
| Map<String, Object> params = bo.getParams(); | |||
| LambdaQueryWrapper<AiAgentChat> lqw = Wrappers.lambdaQuery(); | |||
| lqw.eq(bo.getAgentId() != null, AiAgentChat::getAgentId, bo.getAgentId()); | |||
| lqw.eq(bo.getUid() != null, AiAgentChat::getUid, bo.getUid()); | |||
| lqw.like(StringUtils.isNotBlank(bo.getChatName()), AiAgentChat::getChatName, bo.getChatName()); | |||
| lqw.eq(bo.getAiSort() != null, AiAgentChat::getAiSort, bo.getAiSort()); | |||
| return lqw; | |||
| } | |||
| /** | |||
| * 新增智能体的对话 | |||
| * | |||
| * @param bo 智能体的对话 | |||
| * @return 是否新增成功 | |||
| */ | |||
| @Override | |||
| public Boolean insertByBo(AiAgentChatBo bo) { | |||
| AiAgentChat add = MapstructUtils.convert(bo, AiAgentChat.class); | |||
| validEntityBeforeSave(add); | |||
| boolean flag = baseMapper.insert(add) > 0; | |||
| if (flag) { | |||
| bo.setId(add.getId()); | |||
| } | |||
| return flag; | |||
| } | |||
| /** | |||
| * 修改智能体的对话 | |||
| * | |||
| * @param bo 智能体的对话 | |||
| * @return 是否修改成功 | |||
| */ | |||
| @Override | |||
| public Boolean updateByBo(AiAgentChatBo bo) { | |||
| AiAgentChat update = MapstructUtils.convert(bo, AiAgentChat.class); | |||
| validEntityBeforeSave(update); | |||
| return baseMapper.updateById(update) > 0; | |||
| } | |||
| /** | |||
| * 保存前的数据校验 | |||
| */ | |||
| private void validEntityBeforeSave(AiAgentChat entity){ | |||
| //TODO 做一些数据校验,如唯一约束 | |||
| } | |||
| /** | |||
| * 校验并批量删除智能体的对话信息 | |||
| * | |||
| * @param ids 待删除的主键集合 | |||
| * @param isValid 是否进行有效性校验 | |||
| * @return 是否删除成功 | |||
| */ | |||
| @Override | |||
| public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | |||
| if(isValid){ | |||
| //TODO 做一些业务上的校验,判断是否需要校验 | |||
| } | |||
| return baseMapper.deleteByIds(ids) > 0; | |||
| } | |||
| public void setExtendInfo(List<AiAgentChatVo> list){ | |||
| List<Long> uidList = list.stream().map(item -> item.getUid()).collect(Collectors.toList()); | |||
| List<Long> agentIdList = list.stream().map(item -> item.getAgentId()).collect(Collectors.toList()); | |||
| HashMap<Long, UserDTO> userDTOS = userService | |||
| .selectListByIds(uidList).stream() | |||
| .collect(Collectors.toMap(UserDTO::getUserId, | |||
| Function.identity(), (k1, k2) -> k1, HashMap::new)); | |||
| HashMap<Long, AiAgent> aiAgents = aiAgentMapper | |||
| .selectList(Wrappers.<AiAgent>lambdaQuery() | |||
| .in(AiAgent::getId, agentIdList) | |||
| .select(AiAgent::getId, AiAgent::getName)) | |||
| .stream() | |||
| .collect(Collectors.toMap(AiAgent::getId, | |||
| Function.identity(), (k1, k2) -> k1, HashMap::new)); | |||
| list.forEach(item->{ | |||
| item.setAgentName(aiAgents.get(item.getAgentId()).getName()); | |||
| item.setNickName(userDTOS.get(item.getUid()).getNickName()); | |||
| }); | |||
| } | |||
| } | |||
| @ -1,131 +0,0 @@ | |||
| package org.dromara.ai.service.impl; | |||
| import org.dromara.common.core.utils.MapstructUtils; | |||
| import org.dromara.common.core.utils.StringUtils; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.springframework.stereotype.Service; | |||
| import org.dromara.ai.domain.bo.AiAgentBo; | |||
| import org.dromara.ai.domain.vo.AiAgentVo; | |||
| import org.dromara.ai.domain.AiAgent; | |||
| import org.dromara.ai.mapper.AiAgentMapper; | |||
| import org.dromara.ai.service.IAiAgentService; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Collection; | |||
| /** | |||
| * 智能体Service业务层处理 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2024-11-07 | |||
| */ | |||
| @RequiredArgsConstructor | |||
| @Service | |||
| public class AiAgentServiceImpl implements IAiAgentService { | |||
| private final AiAgentMapper baseMapper; | |||
| /** | |||
| * 查询智能体 | |||
| * | |||
| * @param id 主键 | |||
| * @return 智能体 | |||
| */ | |||
| @Override | |||
| public AiAgentVo queryById(Long id){ | |||
| return baseMapper.selectVoById(id); | |||
| } | |||
| /** | |||
| * 分页查询智能体列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @param pageQuery 分页参数 | |||
| * @return 智能体分页列表 | |||
| */ | |||
| @Override | |||
| public TableDataInfo<AiAgentVo> queryPageList(AiAgentBo bo, PageQuery pageQuery) { | |||
| LambdaQueryWrapper<AiAgent> lqw = buildQueryWrapper(bo); | |||
| Page<AiAgentVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | |||
| return TableDataInfo.build(result); | |||
| } | |||
| /** | |||
| * 查询符合条件的智能体列表 | |||
| * | |||
| * @param bo 查询条件 | |||
| * @return 智能体列表 | |||
| */ | |||
| @Override | |||
| public List<AiAgentVo> queryList(AiAgentBo bo) { | |||
| LambdaQueryWrapper<AiAgent> lqw = buildQueryWrapper(bo); | |||
| return baseMapper.selectVoList(lqw); | |||
| } | |||
| private LambdaQueryWrapper<AiAgent> buildQueryWrapper(AiAgentBo bo) { | |||
| Map<String, Object> params = bo.getParams(); | |||
| LambdaQueryWrapper<AiAgent> lqw = Wrappers.lambdaQuery(); | |||
| lqw.like(StringUtils.isNotBlank(bo.getName()), AiAgent::getName, bo.getName()); | |||
| lqw.eq(bo.getStatus() != null, AiAgent::getStatus, bo.getStatus()); | |||
| lqw.eq(bo.getAiSort() != null, AiAgent::getAiSort, bo.getAiSort()); | |||
| return lqw; | |||
| } | |||
| /** | |||
| * 新增智能体 | |||
| * | |||
| * @param bo 智能体 | |||
| * @return 是否新增成功 | |||
| */ | |||
| @Override | |||
| public Boolean insertByBo(AiAgentBo bo) { | |||
| AiAgent add = MapstructUtils.convert(bo, AiAgent.class); | |||
| validEntityBeforeSave(add); | |||
| boolean flag = baseMapper.insert(add) > 0; | |||
| if (flag) { | |||
| bo.setId(add.getId()); | |||
| } | |||
| return flag; | |||
| } | |||
| /** | |||
| * 修改智能体 | |||
| * | |||
| * @param bo 智能体 | |||
| * @return 是否修改成功 | |||
| */ | |||
| @Override | |||
| public Boolean updateByBo(AiAgentBo bo) { | |||
| AiAgent update = MapstructUtils.convert(bo, AiAgent.class); | |||
| validEntityBeforeSave(update); | |||
| return baseMapper.updateById(update) > 0; | |||
| } | |||
| /** | |||
| * 保存前的数据校验 | |||
| */ | |||
| private void validEntityBeforeSave(AiAgent entity){ | |||
| //TODO 做一些数据校验,如唯一约束 | |||
| } | |||
| /** | |||
| * 校验并批量删除智能体信息 | |||
| * | |||
| * @param ids 待删除的主键集合 | |||
| * @param isValid 是否进行有效性校验 | |||
| * @return 是否删除成功 | |||
| */ | |||
| @Override | |||
| public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | |||
| if(isValid){ | |||
| //TODO 做一些业务上的校验,判断是否需要校验 | |||
| } | |||
| return baseMapper.deleteByIds(ids) > 0; | |||
| } | |||
| } | |||
| @ -1,145 +0,0 @@ | |||
| package org.dromara.ai.service.impl; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.dromara.ai.constant.AiMessageRoleConstant; | |||
| import org.dromara.ai.constant.AiModelTypeConstant; | |||
| import org.dromara.ai.domain.bo.AiAgentChatBo; | |||
| import org.dromara.ai.domain.bo.AiAgentChatHistoryBo; | |||
| import org.dromara.ai.domain.bo.AiChatMessageBo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatHistoryVo; | |||
| import org.dromara.ai.domain.vo.AiAgentChatVo; | |||
| import org.dromara.ai.domain.vo.AiAgentVo; | |||
| import org.dromara.ai.mapper.AiAgentChatHistoryMapper; | |||
| import org.dromara.ai.service.IAiAgentChatHistoryService; | |||
| import org.dromara.ai.service.IAiAgentChatService; | |||
| import org.dromara.ai.service.IAiAgentService; | |||
| import org.dromara.ai.service.IChatService; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.springframework.ai.chat.messages.AssistantMessage; | |||
| import org.springframework.ai.chat.messages.Message; | |||
| import org.springframework.ai.chat.messages.SystemMessage; | |||
| import org.springframework.ai.chat.messages.UserMessage; | |||
| import org.springframework.ai.chat.prompt.ChatOptions; | |||
| import org.springframework.ai.chat.prompt.Prompt; | |||
| import org.springframework.ai.ollama.OllamaChatClient; | |||
| import org.springframework.ai.ollama.api.OllamaOptions; | |||
| import org.springframework.ai.openai.OpenAiChatClient; | |||
| import org.springframework.ai.openai.OpenAiChatOptions; | |||
| import org.springframework.stereotype.Service; | |||
| import reactor.core.publisher.Flux; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| @Service | |||
| @RequiredArgsConstructor | |||
| public class ChatServiceImpl implements IChatService { | |||
| private final OpenAiChatClient openAiChatClient; | |||
| private final OllamaChatClient ollamaChatClient; | |||
| private final IAiAgentService aiAgentService; | |||
| private final IAiAgentChatService aiAgentChatService; | |||
| private final IAiAgentChatHistoryService aiAgentChatHistoryService; | |||
| @Override | |||
| public TableDataInfo<AiAgentChatVo> listMyChats(AiAgentChatBo bo, PageQuery pageQuery) { | |||
| return aiAgentChatService.queryPageList(bo, pageQuery); | |||
| } | |||
| @Override | |||
| public TableDataInfo<AiAgentChatHistoryVo> getMyChatMessages(Long chatId, PageQuery pageQuery) { | |||
| return aiAgentChatHistoryService | |||
| .queryPageList(AiAgentChatHistoryBo.builder() | |||
| .agentChatId(chatId) | |||
| .build(), pageQuery); | |||
| } | |||
| @Override | |||
| public String sendMessage(AiChatMessageBo message) { | |||
| String content = ollamaChatClient.call(buildPrompt(message)).getResult().getOutput().getContent(); | |||
| //插入对话智能体的历史记录 | |||
| aiAgentChatHistoryService.insertByBo(AiAgentChatHistoryBo.builder() | |||
| .agentChatId(message.getChatId()) | |||
| .message(content) | |||
| .agentId(message.getAgentId()) | |||
| .role(AiMessageRoleConstant.ASSISTANT) | |||
| .build()); | |||
| return content; | |||
| } | |||
| @Override | |||
| public Flux sendMessageFlux(AiChatMessageBo message) { | |||
| return ollamaChatClient.stream(buildPrompt(message)) | |||
| .map((response -> response.getResult().getOutput().getContent())); | |||
| } | |||
| /** | |||
| * 构建提示 | |||
| * @param message | |||
| * @return | |||
| */ | |||
| private Prompt buildPrompt(AiChatMessageBo message) { | |||
| //查询智能体 | |||
| // AiAgentVo aiAgentVo = aiAgentService.queryById(message.getAgentId()); | |||
| //插入对话用户的历史记录 | |||
| aiAgentChatHistoryService.insertByBo(AiAgentChatHistoryBo.builder() | |||
| .agentChatId(message.getChatId()) | |||
| .message(message.getMessage()) | |||
| .agentId(message.getAgentId()) | |||
| .role(AiMessageRoleConstant.USER) | |||
| .build()); | |||
| ChatOptions chatOptions = null; | |||
| if (AiModelTypeConstant.OPENAI.equals(message.getModelType())) { | |||
| chatOptions = OpenAiChatOptions.builder().build(); | |||
| }else{ | |||
| chatOptions = OllamaOptions.create(); | |||
| } | |||
| return new Prompt(buildMessage(message), chatOptions); | |||
| } | |||
| /** | |||
| * 构建消息 | |||
| * @param message | |||
| * @return | |||
| */ | |||
| private List<Message> buildMessage(AiChatMessageBo message) { | |||
| // 根据智能体id查询智能体全局system消息 | |||
| List<AiAgentChatHistoryVo> listSystem = aiAgentChatHistoryService.querySystemOverallList(message.getAgentId()); | |||
| // 根据id查询对话历史记录 | |||
| List<AiAgentChatHistoryVo> list = aiAgentChatHistoryService | |||
| .queryList(AiAgentChatHistoryBo.builder() | |||
| .agentChatId(message.getChatId()) | |||
| .build()); | |||
| // list.addAll(list2); | |||
| ArrayList<Message> messages = new ArrayList<>(); | |||
| // 根据角色添加消息 | |||
| for (AiAgentChatHistoryVo vo : list) { | |||
| if (AiMessageRoleConstant.ASSISTANT.equals(vo.getRole())) { | |||
| messages.add(new AssistantMessage(vo.getMessage())); | |||
| }else if (AiMessageRoleConstant.USER.equals(vo.getRole())){ | |||
| messages.add(new UserMessage(vo.getMessage())); | |||
| }else{ | |||
| messages.add(new SystemMessage(vo.getMessage())); | |||
| } | |||
| } | |||
| return messages; | |||
| } | |||
| } | |||
| @ -1,10 +0,0 @@ | |||
| package org.dromara.ai.service.impl; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.dromara.ai.service.IChatServiceNew; | |||
| import org.springframework.stereotype.Service; | |||
| @Service | |||
| @RequiredArgsConstructor | |||
| public class IChatServiceNewImpl implements IChatServiceNew { | |||
| } | |||
| @ -0,0 +1,93 @@ | |||
| package org.dromara.officialWebsite.domain; | |||
| import org.dromara.common.mybatis.core.domain.BaseEntity; | |||
| import com.baomidou.mybatisplus.annotation.*; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import org.dromara.common.translation.annotation.Translation; | |||
| import org.dromara.common.translation.constant.TransConstant; | |||
| import java.io.Serial; | |||
| /** | |||
| * 项目案例对象 ow_cases | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-13 | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @TableName("ow_cases") | |||
| public class OwCases extends BaseEntity { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| /** | |||
| * 编号 | |||
| */ | |||
| @TableId(value = "id") | |||
| private Long id; | |||
| /** | |||
| * 标题 | |||
| */ | |||
| private String title; | |||
| /** | |||
| * 简介 | |||
| */ | |||
| private String description; | |||
| /** | |||
| * 主图 | |||
| */ | |||
| private String image; | |||
| /** | |||
| * 分类 | |||
| */ | |||
| private Long categoryId; | |||
| /** | |||
| * 客户名称 | |||
| */ | |||
| private String client; | |||
| /** | |||
| * 完成日期 | |||
| */ | |||
| private String completionDate; | |||
| /** | |||
| * 客户面临的挑战 | |||
| */ | |||
| private String challenge; | |||
| /** | |||
| * 提供的解决方案 | |||
| */ | |||
| private String solution; | |||
| /** | |||
| * 项目成果 | |||
| */ | |||
| private String results; | |||
| /** | |||
| * 详情 | |||
| */ | |||
| private String content; | |||
| /** | |||
| * 客户评价 | |||
| */ | |||
| private String testimonial; | |||
| /** | |||
| * 评价人及职位 | |||
| */ | |||
| private String testimonialAuthor; | |||
| } | |||
| @ -0,0 +1,34 @@ | |||
| package org.dromara.officialWebsite.front.controller; | |||
| import cn.dev33.satoken.annotation.SaIgnore; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.officialWebsite.domain.bo.OwCaseCategoryBo; | |||
| import org.dromara.officialWebsite.domain.vo.OwCaseCategoryVo; | |||
| import org.dromara.officialWebsite.service.IOwCaseCategoryService; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import java.util.List; | |||
| /** | |||
| * 案例分类 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-13 | |||
| */ | |||
| @SaIgnore | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/api/officialWebsite/caseCategory") | |||
| public class OwCaseCategoryController extends BaseController { | |||
| private final IOwCaseCategoryService owCaseCategoryService; | |||
| /** | |||
| * 查询案例分类列表 | |||
| */ | |||
| @GetMapping("/list") | |||
| public List<OwCaseCategoryVo> list() { | |||
| return owCaseCategoryService.queryList(OwCaseCategoryBo.builder().build()); | |||
| } | |||
| } | |||
| @ -0,0 +1,105 @@ | |||
| package org.dromara.officialWebsite.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.officialWebsite.domain.vo.OwCasesVo; | |||
| import org.dromara.officialWebsite.domain.bo.OwCasesBo; | |||
| import org.dromara.officialWebsite.service.IOwCasesService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * 项目案例 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-13 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/officialWebsite/cases") | |||
| public class OwCasesController extends BaseController { | |||
| private final IOwCasesService owCasesService; | |||
| /** | |||
| * 查询项目案例列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:cases:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<OwCasesVo> list(OwCasesBo bo, PageQuery pageQuery) { | |||
| return owCasesService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出项目案例列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:cases:export") | |||
| @Log(title = "项目案例", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(OwCasesBo bo, HttpServletResponse response) { | |||
| List<OwCasesVo> list = owCasesService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "项目案例", OwCasesVo.class, response); | |||
| } | |||
| /** | |||
| * 获取项目案例详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:cases:query") | |||
| @GetMapping("/{id}") | |||
| public R<OwCasesVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(owCasesService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增项目案例 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:cases:add") | |||
| @Log(title = "项目案例", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody OwCasesBo bo) { | |||
| return toAjax(owCasesService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改项目案例 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:cases:edit") | |||
| @Log(title = "项目案例", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody OwCasesBo bo) { | |||
| return toAjax(owCasesService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除项目案例 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:cases:remove") | |||
| @Log(title = "项目案例", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(owCasesService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -0,0 +1,49 @@ | |||
| package org.dromara.officialWebsite.front.controller; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import cn.dev33.satoken.annotation.SaIgnore; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.NotEmpty; | |||
| import jakarta.validation.constraints.NotNull; | |||
| import lombok.RequiredArgsConstructor; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.officialWebsite.domain.bo.OwConfigParamsBo; | |||
| import org.dromara.officialWebsite.domain.vo.OwConfigParamsVo; | |||
| import org.dromara.officialWebsite.service.IOwConfigParamsService; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import java.util.List; | |||
| /** | |||
| * 配置参数 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-13 | |||
| */ | |||
| @SaIgnore | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/api/officialWebsite/configParams") | |||
| public class OwConfigParamsController extends BaseController { | |||
| private final IOwConfigParamsService owConfigParamsService; | |||
| /** | |||
| * 查询配置参数列表 | |||
| */ | |||
| @GetMapping("/list") | |||
| public List<OwConfigParamsVo> list() { | |||
| return owConfigParamsService.queryList(OwConfigParamsBo.builder().build()); | |||
| } | |||
| } | |||
| @ -0,0 +1,105 @@ | |||
| package org.dromara.officialWebsite.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.officialWebsite.domain.vo.OwDevelopmentHistoryVo; | |||
| import org.dromara.officialWebsite.domain.bo.OwDevelopmentHistoryBo; | |||
| import org.dromara.officialWebsite.service.IOwDevelopmentHistoryService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * OW发展历程 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-15 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/officialWebsite/developmentHistory") | |||
| public class OwDevelopmentHistoryController extends BaseController { | |||
| private final IOwDevelopmentHistoryService owDevelopmentHistoryService; | |||
| /** | |||
| * 查询OW发展历程列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:developmentHistory:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<OwDevelopmentHistoryVo> list(OwDevelopmentHistoryBo bo, PageQuery pageQuery) { | |||
| return owDevelopmentHistoryService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出OW发展历程列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:developmentHistory:export") | |||
| @Log(title = "OW发展历程", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(OwDevelopmentHistoryBo bo, HttpServletResponse response) { | |||
| List<OwDevelopmentHistoryVo> list = owDevelopmentHistoryService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "OW发展历程", OwDevelopmentHistoryVo.class, response); | |||
| } | |||
| /** | |||
| * 获取OW发展历程详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:developmentHistory:query") | |||
| @GetMapping("/{id}") | |||
| public R<OwDevelopmentHistoryVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(owDevelopmentHistoryService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增OW发展历程 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:developmentHistory:add") | |||
| @Log(title = "OW发展历程", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody OwDevelopmentHistoryBo bo) { | |||
| return toAjax(owDevelopmentHistoryService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改OW发展历程 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:developmentHistory:edit") | |||
| @Log(title = "OW发展历程", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody OwDevelopmentHistoryBo bo) { | |||
| return toAjax(owDevelopmentHistoryService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除OW发展历程 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:developmentHistory:remove") | |||
| @Log(title = "OW发展历程", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(owDevelopmentHistoryService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -0,0 +1,105 @@ | |||
| package org.dromara.officialWebsite.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.officialWebsite.domain.vo.OwLeaveMessageVo; | |||
| import org.dromara.officialWebsite.domain.bo.OwLeaveMessageBo; | |||
| import org.dromara.officialWebsite.service.IOwLeaveMessageService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * 留言 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-15 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/officialWebsite/leaveMessage") | |||
| public class OwLeaveMessageController extends BaseController { | |||
| private final IOwLeaveMessageService owLeaveMessageService; | |||
| /** | |||
| * 查询留言列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:leaveMessage:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<OwLeaveMessageVo> list(OwLeaveMessageBo bo, PageQuery pageQuery) { | |||
| return owLeaveMessageService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出留言列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:leaveMessage:export") | |||
| @Log(title = "留言", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(OwLeaveMessageBo bo, HttpServletResponse response) { | |||
| List<OwLeaveMessageVo> list = owLeaveMessageService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "留言", OwLeaveMessageVo.class, response); | |||
| } | |||
| /** | |||
| * 获取留言详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:leaveMessage:query") | |||
| @GetMapping("/{id}") | |||
| public R<OwLeaveMessageVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(owLeaveMessageService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增留言 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:leaveMessage:add") | |||
| @Log(title = "留言", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody OwLeaveMessageBo bo) { | |||
| return toAjax(owLeaveMessageService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改留言 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:leaveMessage:edit") | |||
| @Log(title = "留言", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody OwLeaveMessageBo bo) { | |||
| return toAjax(owLeaveMessageService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除留言 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:leaveMessage:remove") | |||
| @Log(title = "留言", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(owLeaveMessageService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -0,0 +1,105 @@ | |||
| package org.dromara.officialWebsite.controller; | |||
| import java.util.List; | |||
| import lombok.RequiredArgsConstructor; | |||
| import jakarta.servlet.http.HttpServletResponse; | |||
| import jakarta.validation.constraints.*; | |||
| import cn.dev33.satoken.annotation.SaCheckPermission; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | |||
| import org.dromara.common.log.annotation.Log; | |||
| import org.dromara.common.web.core.BaseController; | |||
| import org.dromara.common.mybatis.core.page.PageQuery; | |||
| import org.dromara.common.core.domain.R; | |||
| import org.dromara.common.core.validate.AddGroup; | |||
| import org.dromara.common.core.validate.EditGroup; | |||
| import org.dromara.common.log.enums.BusinessType; | |||
| import org.dromara.common.excel.utils.ExcelUtil; | |||
| import org.dromara.officialWebsite.domain.vo.OwServiceProcessVo; | |||
| import org.dromara.officialWebsite.domain.bo.OwServiceProcessBo; | |||
| import org.dromara.officialWebsite.service.IOwServiceProcessService; | |||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | |||
| /** | |||
| * 服务流程 | |||
| * | |||
| * @author Lion Li | |||
| * @date 2025-05-15 | |||
| */ | |||
| @Validated | |||
| @RequiredArgsConstructor | |||
| @RestController | |||
| @RequestMapping("/officialWebsite/serviceProcess") | |||
| public class OwServiceProcessController extends BaseController { | |||
| private final IOwServiceProcessService owServiceProcessService; | |||
| /** | |||
| * 查询服务流程列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:serviceProcess:list") | |||
| @GetMapping("/list") | |||
| public TableDataInfo<OwServiceProcessVo> list(OwServiceProcessBo bo, PageQuery pageQuery) { | |||
| return owServiceProcessService.queryPageList(bo, pageQuery); | |||
| } | |||
| /** | |||
| * 导出服务流程列表 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:serviceProcess:export") | |||
| @Log(title = "服务流程", businessType = BusinessType.EXPORT) | |||
| @PostMapping("/export") | |||
| public void export(OwServiceProcessBo bo, HttpServletResponse response) { | |||
| List<OwServiceProcessVo> list = owServiceProcessService.queryList(bo); | |||
| ExcelUtil.exportExcel(list, "服务流程", OwServiceProcessVo.class, response); | |||
| } | |||
| /** | |||
| * 获取服务流程详细信息 | |||
| * | |||
| * @param id 主键 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:serviceProcess:query") | |||
| @GetMapping("/{id}") | |||
| public R<OwServiceProcessVo> getInfo(@NotNull(message = "主键不能为空") | |||
| @PathVariable Long id) { | |||
| return R.ok(owServiceProcessService.queryById(id)); | |||
| } | |||
| /** | |||
| * 新增服务流程 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:serviceProcess:add") | |||
| @Log(title = "服务流程", businessType = BusinessType.INSERT) | |||
| @RepeatSubmit() | |||
| @PostMapping() | |||
| public R<Void> add(@Validated(AddGroup.class) @RequestBody OwServiceProcessBo bo) { | |||
| return toAjax(owServiceProcessService.insertByBo(bo)); | |||
| } | |||
| /** | |||
| * 修改服务流程 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:serviceProcess:edit") | |||
| @Log(title = "服务流程", businessType = BusinessType.UPDATE) | |||
| @RepeatSubmit() | |||
| @PutMapping() | |||
| public R<Void> edit(@Validated(EditGroup.class) @RequestBody OwServiceProcessBo bo) { | |||
| return toAjax(owServiceProcessService.updateByBo(bo)); | |||
| } | |||
| /** | |||
| * 删除服务流程 | |||
| * | |||
| * @param ids 主键串 | |||
| */ | |||
| @SaCheckPermission("officialWebsite:serviceProcess:remove") | |||
| @Log(title = "服务流程", businessType = BusinessType.DELETE) | |||
| @DeleteMapping("/{ids}") | |||
| public R<Void> remove(@NotEmpty(message = "主键不能为空") | |||
| @PathVariable Long[] ids) { | |||
| return toAjax(owServiceProcessService.deleteWithValidByIds(List.of(ids), true)); | |||
| } | |||
| } | |||
| @ -1,7 +0,0 @@ | |||
| <?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.dromara.ai.mapper.AiAgentChatHistoryMapper"> | |||
| </mapper> | |||
| @ -1,7 +0,0 @@ | |||
| <?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.dromara.ai.mapper.AiAgentChatMapper"> | |||
| </mapper> | |||
| @ -1,7 +0,0 @@ | |||
| <?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.dromara.ai.mapper.AiAgentMapper"> | |||
| </mapper> | |||
| @ -1,7 +0,0 @@ | |||
| <?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.dromara.project.mapper.PmAmountRecordMapper"> | |||
| </mapper> | |||
| @ -1,7 +0,0 @@ | |||
| <?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.dromara.project.mapper.PmProjectMapper"> | |||
| </mapper> | |||
| @ -1,7 +0,0 @@ | |||
| <?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.dromara.project.mapper.PmProjectMemberMapper"> | |||
| </mapper> | |||